Create identities
Request, response and authentication details for your Mailat instance.
/api/v1/identitiesCreate adds a new identity/mailbox POST /api/v1/identities
Authentication & compatibility
Use a scoped bearer API key with identities:manage. The key is bound to its user and organization.
Owned sender identities support SES. Legacy identities with a Stalwart account can also synchronize password/deletion changes to Stalwart; SES identities do not require a separate mailbox server.
Contract 2026-10-04. Your running instance's /api/v1/openapi.json is authoritative for its deployed release.
Request
Set MAILAT_BASE_URL to your instance origin (without /api/v1) and MAILAT_TOKEN to an appropriate credential. Replace path placeholders and example data before running. These examples do not execute in this page.
curl --request POST "$MAILAT_BASE_URL/api/v1/identities" \
--header "Authorization: Bearer $MAILAT_TOKEN" \
--header 'Content-Type: application/json' \
--data '{
"displayName": "Example",
"domainId": "00000000-0000-4000-8000-000000000001",
"email": "[email protected]"
}'Request body (required)
application/json
bodyobjectrequiredFields · model.CreateIdentityRequest
displayNamestringdomainIdstring (uuid)requiredUUID of an active domain owned by the caller's organization; SES verification is required in SES mode.
emailstring (email)requiredComplete address on that domain; arbitrary external domains are rejected.
isCatchAllbooleanOnly one catch-all per domain allowed
isDefaultbooleanpasswordstringRequired with at least 8 characters for legacy non-SES identities; SES addresses do not require one.
quotaBytesinteger (int64)Responses
HTTP statuses and body shapes below come from the pinned contract. Not every shared error applies to every request. Retain the original idempotency key when retrying a send.
200 · Success
Header: X-RateLimit-RemainingintegerRemaining requests in this API key's current minute window (present for API-key authentication).
minimum: 0
application/json
responseobjectFields
codeintegerrequireddataall of · nullableVariant 1objectFields · model.Identity
canReceivebooleancanSendbooleancolorstringHex color for UI display
createdAtstring (date-time)displayNamestringdomainIdinteger (int64)emailstringidinteger (int64)isCatchAllbooleanisDefaultbooleanquotaBytesinteger (int64)stalwartAcctIdstringstatusstringupdatedAtstring (date-time)usedBytesinteger (int64)userIdinteger (int64)uuidstringmessagestringrequired400 · Invalid input
application/json
responseobjectFields
codeintegerrequiredmessagestringrequired401 · Missing, expired or revoked authentication
application/json
responseobjectFields
codeintegerrequiredmessagestringrequired403 · Insufficient permission
application/json
responseobjectFields
codeintegerrequiredmessagestringrequired404 · Resource not found
application/json
responseobjectFields
codeintegerrequiredmessagestringrequired409 · Conflict or changed idempotency payload
application/json
responseobjectFields
codeintegerrequiredmessagestringrequired410 · Recovery cursor expired; resynchronize
application/json
responseobjectFields
codeintegerrequiredmessagestringrequired429 · Rate limit exceeded; respect Retry-After
Header: Retry-AfterintegerSeconds until the next fixed-minute request window.
minimum: 1
application/json
responseobjectFields
codeintegerrequiredmessagestringrequired500 · Internal failure; retain the idempotency key
application/json
responseobjectFields
codeintegerrequiredmessagestringrequired