API Reference

Complete API reference for Auth endpoints.

Authentication

All Auth API endpoints require authentication:

Authorization: Bearer YOUR_API_KEY

Or use the X-API-Key header:

X-API-Key: YOUR_API_KEY

Base URL

https://api.usetransactional.com/auth

Users

Create User

POST /auth/users

Body:

{
  "email": "user@example.com",
  "password": "SecurePassword123!",
  "emailVerified": false,
  "profile": {
    "firstName": "John",
    "lastName": "Doe"
  },
  "metadata": {
    "plan": "pro"
  }
}

Response:

{
  "id": "user_xxx",
  "email": "user@example.com",
  "emailVerified": false,
  "status": "PENDING_VERIFICATION",
  "profile": {
    "firstName": "John",
    "lastName": "Doe"
  },
  "createdAt": "2024-01-01T00:00:00.000Z"
}

List Users

GET /auth/users

Query Parameters:

ParameterTypeDescription
countnumberResults per page (max 100)
offsetnumberPagination offset
statusstringFilter by status
searchstringSearch email, name

Get User

GET /auth/users/{userId}

Update User

PATCH /auth/users/{userId}

Body:

{
  "profile": {
    "firstName": "Jonathan"
  },
  "metadata": {
    "plan": "enterprise"
  }
}

Delete User

DELETE /auth/users/{userId}

Block User

POST /auth/users/{userId}/block

Unblock User

POST /auth/users/{userId}/unblock

Applications

Create Application

POST /auth/applications

Body:

{
  "name": "My App",
  "type": "SPA",
  "redirectUris": ["https://myapp.com/callback"],
  "allowedOrigins": ["https://myapp.com"],
  "grantTypes": ["AUTHORIZATION_CODE", "REFRESH_TOKEN"]
}

List Applications

GET /auth/applications

Get Application

GET /auth/applications/{applicationId}

Update Application

PATCH /auth/applications/{applicationId}

Delete Application

DELETE /auth/applications/{applicationId}

Rotate Secret

POST /auth/applications/{applicationId}/rotate-secret

Sessions

List User Sessions

GET /auth/users/{userId}/sessions

Revoke Session

DELETE /auth/sessions/{sessionId}

Revoke All User Sessions

DELETE /auth/users/{userId}/sessions

MFA

List Factors

GET /auth/users/{userId}/mfa/factors

Enroll TOTP

POST /auth/users/{userId}/mfa/totp/enroll

Response:

{
  "secret": "JBSWY3DPEHPK3PXP",
  "qrCodeUri": "otpauth://totp/MyApp:user@example.com?secret=..."
}

Verify TOTP

POST /auth/users/{userId}/mfa/totp/verify

Body:

{
  "code": "123456"
}

Remove Factor

DELETE /auth/users/{userId}/mfa/factors/{factorId}

Generate Recovery Codes

POST /auth/users/{userId}/mfa/recovery-codes

SSO Connections

Create Connection

POST /auth/connections

Body (OIDC):

{
  "name": "Okta SSO",
  "type": "OIDC",
  "provider": "OKTA",
  "config": {
    "issuerUrl": "https://your-domain.okta.com",
    "clientId": "xxx",
    "clientSecret": "xxx"
  },
  "domains": ["acme.com"],
  "jitProvisioning": true
}

Body (SAML):

{
  "name": "Azure AD SSO",
  "type": "SAML",
  "provider": "AZURE_AD",
  "config": {
    "idpEntityId": "https://sts.windows.net/xxx/",
    "ssoUrl": "https://login.microsoftonline.com/xxx/saml2",
    "idpCertificate": "-----BEGIN CERTIFICATE-----..."
  }
}

List Connections

GET /auth/connections

Get Connection

GET /auth/connections/{connectionId}

Update Connection

PATCH /auth/connections/{connectionId}

Delete Connection

DELETE /auth/connections/{connectionId}

Organizations

Create Organization

POST /auth/organizations

Body:

{
  "name": "Acme Corp",
  "slug": "acme",
  "displayName": "Acme Corporation"
}

List Organizations

GET /auth/organizations

Get Organization

GET /auth/organizations/{organizationId}

Update Organization

PATCH /auth/organizations/{organizationId}

Delete Organization

DELETE /auth/organizations/{organizationId}

List Members

GET /auth/organizations/{organizationId}/members

Add Member

POST /auth/organizations/{organizationId}/members

Body:

{
  "userId": "user_xxx",
  "role": "MEMBER"
}

Remove Member

DELETE /auth/organizations/{organizationId}/members/{userId}

Invite User

POST /auth/organizations/{organizationId}/invitations

Body:

{
  "email": "newuser@example.com",
  "role": "MEMBER"
}

Webhooks

Create Webhook

POST /auth/webhooks

Body:

{
  "url": "https://yourapp.com/webhooks/auth",
  "events": ["user.created", "login.success"]
}

List Webhooks

GET /auth/webhooks

Get Webhook

GET /auth/webhooks/{webhookId}

Update Webhook

PATCH /auth/webhooks/{webhookId}

Delete Webhook

DELETE /auth/webhooks/{webhookId}

List Deliveries

GET /auth/webhooks/{webhookId}/deliveries

Security

Get Password Policy

GET /auth/security/password-policy

Update Password Policy

PATCH /auth/security/password-policy

Get Session Policy

GET /auth/security/session-policy

Update Session Policy

PATCH /auth/security/session-policy

Audit Logs

Query Logs

GET /auth/logs

Query Parameters:

ParameterTypeDescription
startDatestringISO 8601 start date
endDatestringISO 8601 end date
eventTypesstring[]Filter by event type
userIdstringFilter by user
countnumberResults per page

SDK Reference

TypeScript SDK

import { Transactional } from '@usetransactional/node';
 
const client = new Transactional({
  apiKey: process.env.TRANSACTIONAL_API_KEY,
});
 
// Users
const user = await client.auth.users.create({ email, password });
const users = await client.auth.users.list({ status: 'ACTIVE' });
 
// Applications
const app = await client.auth.applications.create({ name, type });
 
// MFA
const enrollment = await client.auth.mfa.enrollTotp(userId);
await client.auth.mfa.verifyTotp(userId, { code });
 
// Organizations
const org = await client.auth.organizations.create({ name, slug });
await client.auth.organizations.addMember(orgId, { userId, role });
 
// Webhooks
const webhook = await client.auth.webhooks.create({ url, events });

Python SDK

from usetransactional import Transactional
 
client = Transactional(api_key="your_api_key")
 
# Users
user = client.auth.users.create(email=email, password=password)
users = client.auth.users.list(status="ACTIVE")
 
# Applications
app = client.auth.applications.create(name=name, type=type)
 
# MFA
enrollment = client.auth.mfa.enroll_totp(user_id)
client.auth.mfa.verify_totp(user_id, code=code)
 
# Organizations
org = client.auth.organizations.create(name=name, slug=slug)
client.auth.organizations.add_member(org_id, user_id=user_id, role=role)
 
# Webhooks
webhook = client.auth.webhooks.create(url=url, events=events)

Error Codes

HTTP StatusCodeDescription
400INVALID_REQUESTInvalid request body
401UNAUTHORIZEDInvalid or missing API key
403FORBIDDENInsufficient permissions
404NOT_FOUNDResource not found
409CONFLICTResource already exists
429RATE_LIMITEDToo many requests

Auth-Specific Errors

CodeDescription
USER_BLOCKEDUser account is blocked
EMAIL_NOT_VERIFIEDEmail verification required
PASSWORD_TOO_WEAKPassword doesn't meet policy
PASSWORD_BREACHEDPassword found in breach database
MFA_REQUIREDMulti-factor authentication required
INVALID_MFA_CODEInvalid MFA verification code
ACCOUNT_LOCKEDAccount temporarily locked