Conduit API

Version 1.0.0

Conduit bridges inbound SMTP to outbound HTTP webhooks. This REST API manages accounts, sessions, webhooks, and domain ownership.

/api/v1
POST /api/v1/accounts

Sign up

Operation ID: createAccount

accounts

Request Body

Content-TypeSchema
application/jsonCreateAccountRequest
{
  "email": "string",
  "password": "string"
}

Responses

StatusDescriptionContent-TypeSchema
201Account createdapplication/json
409Email already registeredapplication/json
422Validation errorapplication/json
201 application/json AccountResponse
{
  "created_at": "2026-04-02T12:00:00Z",
  "email": "string",
  "id": "string",
  "timezone": "string",
  "updated_at": "2026-04-02T12:00:00Z"
}
409 application/json Error
{
  "code": "string",
  "error": "string"
}
422 application/json Error
{
  "code": "string",
  "error": "string"
}
GET /api/v1/accounts/me

Get current account

Operation ID: getAccount

accounts

Responses

StatusDescriptionContent-TypeSchema
200Account detailsapplication/json
401Unauthorizedapplication/json
200 application/json AccountResponse
{
  "created_at": "2026-04-02T12:00:00Z",
  "email": "string",
  "id": "string",
  "timezone": "string",
  "updated_at": "2026-04-02T12:00:00Z"
}
401 application/json Error
{
  "code": "string",
  "error": "string"
}
DELETE /api/v1/accounts/me

Delete account

Operation ID: deleteAccount

accounts

Request Body

Content-TypeSchema
application/jsonDeleteAccountRequest
{
  "password": "string"
}

Responses

StatusDescriptionContent-TypeSchema
204Account deleted
401Unauthorizedapplication/json
401 application/json Error
{
  "code": "string",
  "error": "string"
}
DELETE /api/v1/accounts/me/2fa

Disable TOTP two-factor authentication

Operation ID: disableTOTP

2fa

Request Body

Content-TypeSchema
application/jsonTOTPCodeRequest
{
  "code": "string"
}

Responses

StatusDescriptionContent-TypeSchema
204TOTP disabled
401Invalid TOTP codeapplication/json
422TOTP not enabledapplication/json
401 application/json Error
{
  "code": "string",
  "error": "string"
}
422 application/json Error
{
  "code": "string",
  "error": "string"
}
POST /api/v1/accounts/me/2fa/backup-codes

Regenerate TOTP backup codes

Operation ID: regenerateBackupCodes

2fa

Request Body

Content-TypeSchema
application/jsonTOTPCodeRequest
{
  "code": "string"
}

Responses

StatusDescriptionContent-TypeSchema
200New backup codesapplication/json
401Invalid TOTP codeapplication/json
422TOTP not enabledapplication/json
200 application/json BackupCodesResponse
{
  "backup_codes": [
    "string"
  ]
}
401 application/json Error
{
  "code": "string",
  "error": "string"
}
422 application/json Error
{
  "code": "string",
  "error": "string"
}
POST /api/v1/accounts/me/2fa/enable

Enable TOTP two-factor authentication

Operation ID: enableTOTP

2fa

Request Body

Content-TypeSchema
application/jsonEnableTOTPRequest
{
  "code": "string"
}

Responses

StatusDescriptionContent-TypeSchema
200TOTP enabled; backup codes returnedapplication/json
401Invalid TOTP codeapplication/json
409TOTP already enabledapplication/json
422TOTP not set up yetapplication/json
200 application/json BackupCodesResponse
{
  "backup_codes": [
    "string"
  ]
}
401 application/json Error
{
  "code": "string",
  "error": "string"
}
409 application/json Error
{
  "code": "string",
  "error": "string"
}
422 application/json Error
{
  "code": "string",
  "error": "string"
}
POST /api/v1/accounts/me/2fa/setup

Set up TOTP two-factor authentication

Operation ID: setupTOTP

2fa

Responses

StatusDescriptionContent-TypeSchema
200TOTP setup detailsapplication/json
401Unauthorizedapplication/json
200 application/json SetupTOTPResponse
{
  "otpauth_url": "string",
  "qr_code_png": "string",
  "secret": "string"
}
401 application/json Error
{
  "code": "string",
  "error": "string"
}
PUT /api/v1/accounts/me/password

Change password

Operation ID: changePassword

accounts

Request Body

Content-TypeSchema
application/jsonChangePasswordRequest
{
  "current_password": "string",
  "new_password": "string"
}

Responses

StatusDescriptionContent-TypeSchema
204Password changed
401Unauthorizedapplication/json
422Validation errorapplication/json
401 application/json Error
{
  "code": "string",
  "error": "string"
}
422 application/json Error
{
  "code": "string",
  "error": "string"
}
PUT /api/v1/accounts/me/timezone

Update timezone

Operation ID: updateTimezone

accounts

Request Body

Content-TypeSchema
application/jsonUpdateTimezoneRequest
{
  "timezone": "string"
}

Responses

StatusDescriptionContent-TypeSchema
204Timezone updated
401Unauthorizedapplication/json
422Invalid timezoneapplication/json
401 application/json Error
{
  "code": "string",
  "error": "string"
}
422 application/json Error
{
  "code": "string",
  "error": "string"
}
POST /api/v1/accounts/password-reset

Request password reset

Operation ID: requestPasswordReset

accounts

Request Body

Content-TypeSchema
application/jsonRequestPasswordResetRequest
{
  "email": "string"
}

Responses

StatusDescriptionContent-TypeSchema
202Reset email sent (always returned; never reveals whether address exists)
PUT /api/v1/accounts/password-reset

Confirm password reset

Operation ID: confirmPasswordReset

accounts

Request Body

Content-TypeSchema
application/jsonConfirmPasswordResetRequest
{
  "new_password": "string",
  "token": "string"
}

Responses

StatusDescriptionContent-TypeSchema
204Password reset successful
401Token invalid or expiredapplication/json
422Validation errorapplication/json
401 application/json Error
{
  "code": "string",
  "error": "string"
}
422 application/json Error
{
  "code": "string",
  "error": "string"
}
GET /api/v1/domains

List domains

Operation ID: listDomains

domains

Responses

StatusDescriptionContent-TypeSchema
200List of domainsapplication/json
401Unauthorizedapplication/json
200 application/json array<DomainResponse>
[
  {
    "account_id": "string",
    "created_at": "2026-04-02T12:00:00Z",
    "id": "string",
    "is_public": true,
    "name": "string",
    "updated_at": "2026-04-02T12:00:00Z",
    "verification_token": "string",
    "verified": true
  }
]
401 application/json Error
{
  "code": "string",
  "error": "string"
}
POST /api/v1/domains

Claim a domain

Operation ID: createDomainClaim

domains

Request Body

Content-TypeSchema
application/jsonCreateDomainRequest
{
  "name": "string"
}

Responses

StatusDescriptionContent-TypeSchema
201Domain claimedapplication/json
401Unauthorizedapplication/json
409Domain already claimedapplication/json
422Invalid domain nameapplication/json
201 application/json DomainResponse
{
  "account_id": "string",
  "created_at": "2026-04-02T12:00:00Z",
  "id": "string",
  "is_public": true,
  "name": "string",
  "updated_at": "2026-04-02T12:00:00Z",
  "verification_token": "string",
  "verified": true
}
401 application/json Error
{
  "code": "string",
  "error": "string"
}
409 application/json Error
{
  "code": "string",
  "error": "string"
}
422 application/json Error
{
  "code": "string",
  "error": "string"
}
GET /api/v1/domains/{id}

Get domain

Operation ID: getDomain

domains

Parameters

InNameTypeRequiredDescription
pathidstringyesDomain ID

Responses

StatusDescriptionContent-TypeSchema
200Domain detailsapplication/json
401Unauthorizedapplication/json
404Not foundapplication/json
200 application/json DomainResponse
{
  "account_id": "string",
  "created_at": "2026-04-02T12:00:00Z",
  "id": "string",
  "is_public": true,
  "name": "string",
  "updated_at": "2026-04-02T12:00:00Z",
  "verification_token": "string",
  "verified": true
}
401 application/json Error
{
  "code": "string",
  "error": "string"
}
404 application/json Error
{
  "code": "string",
  "error": "string"
}
DELETE /api/v1/domains/{id}

Delete domain

Operation ID: deleteDomain

domains

Parameters

InNameTypeRequiredDescription
pathidstringyesDomain ID

Responses

StatusDescriptionContent-TypeSchema
204Domain deleted
401Unauthorizedapplication/json
404Not foundapplication/json
401 application/json Error
{
  "code": "string",
  "error": "string"
}
404 application/json Error
{
  "code": "string",
  "error": "string"
}
POST /api/v1/domains/{id}/verify

Trigger DNS TXT verification for a domain

Operation ID: verifyDomain

domains

Parameters

InNameTypeRequiredDescription
pathidstringyesDomain ID

Responses

StatusDescriptionContent-TypeSchema
200Domain verifiedapplication/json
401Unauthorizedapplication/json
404Not foundapplication/json
422DNS TXT record not found or does not matchapplication/json
200 application/json DomainResponse
{
  "account_id": "string",
  "created_at": "2026-04-02T12:00:00Z",
  "id": "string",
  "is_public": true,
  "name": "string",
  "updated_at": "2026-04-02T12:00:00Z",
  "verification_token": "string",
  "verified": true
}
401 application/json Error
{
  "code": "string",
  "error": "string"
}
404 application/json Error
{
  "code": "string",
  "error": "string"
}
422 application/json Error
{
  "code": "string",
  "error": "string"
}
POST /api/v1/sessions

Sign in

Operation ID: createSession

sessions

Request Body

Content-TypeSchema
application/jsonCreateSessionRequest
{
  "email": "string",
  "password": "string"
}

Responses

StatusDescriptionContent-TypeSchema
200Either a full session (access_token + refresh_token) or a TOTP challenge when 2FA is enabled on the account.application/json
401Invalid credentialsapplication/json
200 application/json any
"value"
401 application/json Error
{
  "code": "string",
  "error": "string"
}
DELETE /api/v1/sessions

Sign out

Operation ID: deleteSession

sessions

Request Body

Content-TypeSchema
application/jsonDeleteSessionRequest
{
  "refresh_token": "string"
}

Responses

StatusDescriptionContent-TypeSchema
204Signed out
401Unauthorizedapplication/json
401 application/json Error
{
  "code": "string",
  "error": "string"
}
POST /api/v1/sessions/2fa

Complete sign-in with TOTP code

Operation ID: completeTOTPSession

sessions2fa

Request Body

Content-TypeSchema
application/jsonCompleteTOTPRequest
{
  "code": "string",
  "totp_token": "string"
}

Responses

StatusDescriptionContent-TypeSchema
200Session tokensapplication/json
401Invalid TOTP code or challenge tokenapplication/json
200 application/json SessionResponse
{
  "access_token": "string",
  "expires_in": 0,
  "refresh_token": "string"
}
401 application/json Error
{
  "code": "string",
  "error": "string"
}
POST /api/v1/sessions/refresh

Refresh access token

Operation ID: refreshSession

sessions

Request Body

Content-TypeSchema
application/jsonRefreshSessionRequest
{
  "refresh_token": "string"
}

Responses

StatusDescriptionContent-TypeSchema
200New tokens issuedapplication/json
401Invalid or expired refresh tokenapplication/json
200 application/json SessionResponse
{
  "access_token": "string",
  "expires_in": 0,
  "refresh_token": "string"
}
401 application/json Error
{
  "code": "string",
  "error": "string"
}
GET /api/v1/smtp-policies

List SMTP security policies

Operation ID: listSmtpSecurityPolicies

smtp-security-policies

Responses

StatusDescriptionContent-TypeSchema
200List of SMTP security policiesapplication/json
401Unauthorizedapplication/json
200 application/json array<SmtpSecurityPolicyResponse>
[
  {
    "allowed_dkim_domains": "string",
    "allowed_source_ips": "string",
    "allowed_spf_domains": "string",
    "created_at": "2026-04-02T12:00:00Z",
    "id": "string",
    "name": "string",
    "require_dkim": true,
    "require_smtp_auth": true,
    "require_spf": true,
    "smtp_credentials": "string",
    "updated_at": "2026-04-02T12:00:00Z"
  }
]
401 application/json Error
{
  "code": "string",
  "error": "string"
}
POST /api/v1/smtp-policies

Create SMTP security policy

Operation ID: createSmtpSecurityPolicy

smtp-security-policies

Request Body

Content-TypeSchema
application/jsonCreateSmtpSecurityPolicyRequest
{
  "allowed_dkim_domains": "string",
  "allowed_source_ips": "string",
  "allowed_spf_domains": "string",
  "name": "string",
  "require_dkim": true,
  "require_smtp_auth": true,
  "require_spf": true,
  "smtp_credentials": "string"
}

Responses

StatusDescriptionContent-TypeSchema
201Policy createdapplication/json
401Unauthorizedapplication/json
422Validation errorapplication/json
201 application/json SmtpSecurityPolicyResponse
{
  "allowed_dkim_domains": "string",
  "allowed_source_ips": "string",
  "allowed_spf_domains": "string",
  "created_at": "2026-04-02T12:00:00Z",
  "id": "string",
  "name": "string",
  "require_dkim": true,
  "require_smtp_auth": true,
  "require_spf": true,
  "smtp_credentials": "string",
  "updated_at": "2026-04-02T12:00:00Z"
}
401 application/json Error
{
  "code": "string",
  "error": "string"
}
422 application/json Error
{
  "code": "string",
  "error": "string"
}
GET /api/v1/smtp-policies/{id}

Get SMTP security policy

Operation ID: getSmtpSecurityPolicy

smtp-security-policies

Parameters

InNameTypeRequiredDescription
pathidstringyesSMTP security policy ID

Responses

StatusDescriptionContent-TypeSchema
200Policy detailsapplication/json
401Unauthorizedapplication/json
404Not foundapplication/json
200 application/json SmtpSecurityPolicyResponse
{
  "allowed_dkim_domains": "string",
  "allowed_source_ips": "string",
  "allowed_spf_domains": "string",
  "created_at": "2026-04-02T12:00:00Z",
  "id": "string",
  "name": "string",
  "require_dkim": true,
  "require_smtp_auth": true,
  "require_spf": true,
  "smtp_credentials": "string",
  "updated_at": "2026-04-02T12:00:00Z"
}
401 application/json Error
{
  "code": "string",
  "error": "string"
}
404 application/json Error
{
  "code": "string",
  "error": "string"
}
PUT /api/v1/smtp-policies/{id}

Update SMTP security policy

Operation ID: updateSmtpSecurityPolicy

smtp-security-policies

Parameters

InNameTypeRequiredDescription
pathidstringyesSMTP security policy ID

Request Body

Content-TypeSchema
application/jsonUpdateSmtpSecurityPolicyRequest
{
  "allowed_dkim_domains": "string",
  "allowed_source_ips": "string",
  "allowed_spf_domains": "string",
  "name": "string",
  "require_dkim": true,
  "require_smtp_auth": true,
  "require_spf": true,
  "smtp_credentials": "string"
}

Responses

StatusDescriptionContent-TypeSchema
200Updated policyapplication/json
401Unauthorizedapplication/json
404Not foundapplication/json
422Validation errorapplication/json
200 application/json SmtpSecurityPolicyResponse
{
  "allowed_dkim_domains": "string",
  "allowed_source_ips": "string",
  "allowed_spf_domains": "string",
  "created_at": "2026-04-02T12:00:00Z",
  "id": "string",
  "name": "string",
  "require_dkim": true,
  "require_smtp_auth": true,
  "require_spf": true,
  "smtp_credentials": "string",
  "updated_at": "2026-04-02T12:00:00Z"
}
401 application/json Error
{
  "code": "string",
  "error": "string"
}
404 application/json Error
{
  "code": "string",
  "error": "string"
}
422 application/json Error
{
  "code": "string",
  "error": "string"
}
DELETE /api/v1/smtp-policies/{id}

Delete SMTP security policy

Operation ID: deleteSmtpSecurityPolicy

smtp-security-policies

Parameters

InNameTypeRequiredDescription
pathidstringyesSMTP security policy ID

Responses

StatusDescriptionContent-TypeSchema
204Policy deleted
401Unauthorizedapplication/json
404Not foundapplication/json
401 application/json Error
{
  "code": "string",
  "error": "string"
}
404 application/json Error
{
  "code": "string",
  "error": "string"
}
GET /api/v1/webhooks

List webhooks

Operation ID: listWebhooks

webhooks

Responses

StatusDescriptionContent-TypeSchema
200List of webhooksapplication/json
401Unauthorizedapplication/json
200 application/json array<WebhookResponse>
[
  {
    "active": true,
    "address": "string",
    "created_at": "2026-04-02T12:00:00Z",
    "custom_headers": {
      "key": "value"
    },
    "id": "string",
    "payload_template": "string",
    "rate_limit": 0,
    "secret": "string",
    "smtp_security_policy_id": "string",
    "target_url": "string",
    "updated_at": "2026-04-02T12:00:00Z"
  }
]
401 application/json Error
{
  "code": "string",
  "error": "string"
}
POST /api/v1/webhooks

Create webhook

Operation ID: createWebhook

webhooks

Request Body

Content-TypeSchema
application/jsonCreateWebhookRequest
{
  "active": true,
  "address": "string",
  "custom_headers": {
    "key": "value"
  },
  "payload_template": "string",
  "rate_limit": 0,
  "secret": "string",
  "smtp_security_policy_id": "string",
  "target_url": "string"
}

Responses

StatusDescriptionContent-TypeSchema
201Webhook created (includes secret)application/json
401Unauthorizedapplication/json
409Address already registeredapplication/json
422Validation errorapplication/json
201 application/json WebhookResponse
{
  "active": true,
  "address": "string",
  "created_at": "2026-04-02T12:00:00Z",
  "custom_headers": {
    "key": "value"
  },
  "id": "string",
  "payload_template": "string",
  "rate_limit": 0,
  "secret": "string",
  "smtp_security_policy_id": "string",
  "target_url": "string",
  "updated_at": "2026-04-02T12:00:00Z"
}
401 application/json Error
{
  "code": "string",
  "error": "string"
}
409 application/json Error
{
  "code": "string",
  "error": "string"
}
422 application/json Error
{
  "code": "string",
  "error": "string"
}
GET /api/v1/webhooks/{id}

Get webhook

Operation ID: getWebhook

webhooks

Parameters

InNameTypeRequiredDescription
pathidstringyesWebhook ID

Responses

StatusDescriptionContent-TypeSchema
200Webhook detailsapplication/json
401Unauthorizedapplication/json
404Not foundapplication/json
200 application/json WebhookResponse
{
  "active": true,
  "address": "string",
  "created_at": "2026-04-02T12:00:00Z",
  "custom_headers": {
    "key": "value"
  },
  "id": "string",
  "payload_template": "string",
  "rate_limit": 0,
  "secret": "string",
  "smtp_security_policy_id": "string",
  "target_url": "string",
  "updated_at": "2026-04-02T12:00:00Z"
}
401 application/json Error
{
  "code": "string",
  "error": "string"
}
404 application/json Error
{
  "code": "string",
  "error": "string"
}
PUT /api/v1/webhooks/{id}

Update webhook

Operation ID: updateWebhook

webhooks

Parameters

InNameTypeRequiredDescription
pathidstringyesWebhook ID

Request Body

Content-TypeSchema
application/jsonUpdateWebhookRequest
{
  "active": true,
  "address": "string",
  "clear_security_policy": true,
  "custom_headers": {
    "key": "value"
  },
  "payload_template": "string",
  "rate_limit": 0,
  "secret": "string",
  "smtp_security_policy_id": "string",
  "target_url": "string"
}

Responses

StatusDescriptionContent-TypeSchema
200Updated webhookapplication/json
401Unauthorizedapplication/json
404Not foundapplication/json
409Address already registeredapplication/json
422Validation errorapplication/json
200 application/json WebhookResponse
{
  "active": true,
  "address": "string",
  "created_at": "2026-04-02T12:00:00Z",
  "custom_headers": {
    "key": "value"
  },
  "id": "string",
  "payload_template": "string",
  "rate_limit": 0,
  "secret": "string",
  "smtp_security_policy_id": "string",
  "target_url": "string",
  "updated_at": "2026-04-02T12:00:00Z"
}
401 application/json Error
{
  "code": "string",
  "error": "string"
}
404 application/json Error
{
  "code": "string",
  "error": "string"
}
409 application/json Error
{
  "code": "string",
  "error": "string"
}
422 application/json Error
{
  "code": "string",
  "error": "string"
}
DELETE /api/v1/webhooks/{id}

Delete webhook

Operation ID: deleteWebhook

webhooks

Parameters

InNameTypeRequiredDescription
pathidstringyesWebhook ID

Responses

StatusDescriptionContent-TypeSchema
204Webhook deleted
401Unauthorizedapplication/json
404Not foundapplication/json
401 application/json Error
{
  "code": "string",
  "error": "string"
}
404 application/json Error
{
  "code": "string",
  "error": "string"
}
GET /api/v1/webhooks/{id}/logs

List delivery logs for a webhook

Operation ID: listDeliveryLogs

webhooks

Parameters

InNameTypeRequiredDescription
pathidstringyesWebhook ID
querypageintegernoPage number (1-based)
querypage_sizeintegernoNumber of results per page

Responses

StatusDescriptionContent-TypeSchema
200List of delivery logsapplication/json
401Unauthorizedapplication/json
404Webhook not foundapplication/json
200 application/json array<DeliveryLogResponse>
[
  {
    "attempted_at": "2026-04-02T12:00:00Z",
    "duration_ms": 0,
    "error": "string",
    "http_status": 0,
    "id": "string",
    "sender": "string",
    "smtp_message_id": "string",
    "webhook_id": "string"
  }
]
401 application/json Error
{
  "code": "string",
  "error": "string"
}
404 application/json Error
{
  "code": "string",
  "error": "string"
}
GET /api/v1/webhooks/{id}/logs/{logId}

Get a single delivery log entry

Operation ID: getDeliveryLog

webhooks

Parameters

InNameTypeRequiredDescription
pathidstringyesWebhook ID
pathlogIdstringyesDelivery log entry ID

Responses

StatusDescriptionContent-TypeSchema
200Delivery log entryapplication/json
401Unauthorizedapplication/json
404Not foundapplication/json
200 application/json DeliveryLogResponse
{
  "attempted_at": "2026-04-02T12:00:00Z",
  "duration_ms": 0,
  "error": "string",
  "http_status": 0,
  "id": "string",
  "sender": "string",
  "smtp_message_id": "string",
  "webhook_id": "string"
}
401 application/json Error
{
  "code": "string",
  "error": "string"
}
404 application/json Error
{
  "code": "string",
  "error": "string"
}