API reference

Schemas

Every object the Dairo API sends and receives, with its fields.

The objects of the API, generated from the published OpenAPI document at docs.dairo.app/openapi.json. Fields marked as required are always present in responses and must be sent in requests.

ActiveOrganization

The resolved ACTIVE organization for the request and the caller's role in it.

FieldTypeRequiredDescription
idstring or nullyes
rolestring or nullyes

AgentBindRequest

Provide an apiKeyId and/or inboxId to bind to this agent.

FieldTypeRequiredDescription
apiKeyIdstring or nullno
inboxIdstring or nullno

AgentBindResponse

FieldTypeRequiredDescription
agentIdstringyes
apiKeyIdstring or nullno
inboxIdstring or nullno
boundbooleanyes

AgentCreateRequest

FieldTypeRequiredDescription
displaystringyesHuman-readable agent name. (max length 120)
descriptionstring or nullno

AgentListResponse

FieldTypeRequiredDescription
agentsarray of AgentPassportyes

AgentPassport

FieldTypeRequiredDescription
idstring (uuid)yes
agentIdstringyesPortable, durable public identifier (agt_...).
displaystringyes
descriptionstring or nullno
status"active", "suspended", "revoked"yes
createdAtstring (date-time)yes
updatedAtstring (date-time)yes

AgentReputation

An agent's rolling reputation and circuit-breaker state.

FieldTypeRequiredDescription
agentIdstringyes
state"healthy", "throttled", "quarantined", "review"yesCircuit-breaker state. healthy sends freely; throttled sends under a reduced per-agent rate; quarantined is fail-closed (no send) until cleared; review is an operator-pinned hold.
verdict"allow", "throttle", "block", "review"yes
shouldSendbooleanyesfalse only when the agent is quarantined. Poll before a batch.
windowobjectyes
ratesobjectyes
thresholdsobjectyes
lastReasonstring or nullno
lastTrippedAtstring or nullno
lastEvaluatedAtstring or nullno
overrideLockedbooleanno

AgentReputationClearResponse

FieldTypeRequiredDescription
agentIdstringyes
statestringyes
overrideLockedbooleanno
shouldSendbooleanyes
reputationobject or nullno

AgentReputationListResponse

FieldTypeRequiredDescription
windowobjectno
thresholdsobjectno
agentsarray of objectyes

AgentResponse

FieldTypeRequiredDescription
agentAgentPassportyes

ApiKey

FieldTypeRequiredDescription
object"api_key"yes
idstring (uuid)yes
namestringyes
prefixstringyes
scopesarray of stringyes
status"active", "revoked"yes
createdAtstring (date-time)yes
lastUsedAtstring (date-time) or nullno
allowedIpsarray of string or nullnoThe key's IP allowlist (IPv4/IPv6 addresses or CIDR ranges), or null when the key authenticates from any IP.
inboxIdsarray of string (uuid) or nullnoThe inbox ids (inboxes.id) this key may send as. Empty or null means the key is unrestricted and may send as any inbox in the project — the default, and what every key minted before this field existed has.
environment"live", "test"no

ApiKeyListResponse

FieldTypeRequiredDescription
apiKeysarray of ApiKeyyes

AttachmentDownloadUrlResponse

FieldTypeRequiredDescription
attachmentMessageAttachmentyes
downloadUrlstring (uri)yes
expiresInSecondsintegeryes(minimum 1, maximum 604800)
shareUrlstring (uri)yesHuman branded Dairo share page URL for the attachment.

Audience

FieldTypeRequiredDescription
idstring (uuid)yes
namestringyes
descriptionstring or nullno
statusstringyes
memberCountinteger or nullno
createdAtstring (date-time)yes
updatedAtstring (date-time)yes

AudienceCreateRequest

FieldTypeRequiredDescription
namestringyes(min length 1)
descriptionstringno

AudienceDeleteResponse

FieldTypeRequiredDescription
deletedbooleanyes
idstring (uuid)yes

AudienceDetailResponse

FieldTypeRequiredDescription
listAudienceyes
membersarray of AudienceMemberyes

AudienceListResponse

FieldTypeRequiredDescription
audiencesarray of Audienceyes

AudienceMember

FieldTypeRequiredDescription
idstring (uuid)yes
audienceIdstring (uuid)yes
emailstring (email)yes
contactIdstring (uuid) or nullnoSet when this member was added as a contact (§12); the email is derived from the contact's primary email handle. Null for a raw-email member.
namestring or nullno
metadataobjectyes
statusstringyes
sourcestringyes
createdAtstring (date-time)yes
updatedAtstring (date-time)yes

AudienceMembersRequest

FieldTypeRequiredDescription
membersarray of objectyes(min items 1, max items 2000)

AudienceMembersResponse

FieldTypeRequiredDescription
audienceIdstring (uuid)yes
importedintegeryes

AudienceResponse

FieldTypeRequiredDescription
listAudienceyes

AuditExportManifest

Signed manifest committing to the export window bounds, rowCount, and chain head.

Type: SignedArtifact and object.

AuditExportResponse

A hash-chained audit-ledger export plus its signed verification manifest.

FieldTypeRequiredDescription
rowsarray of AuditExportRowyes
manifestAuditExportManifestyes
paginationobjectnoKeyset pagination for draining history past the 5000-row page cap.

AuditExportRow

One hash-chained audit row in an export.

FieldTypeRequiredDescription
idstring (uuid)yes
userIdstring (uuid)yes
actionstringyes
resourceTypestring or nullno
resourceIdstring or nullno
metadataobjectno
actorstring or nullno
ipstring or nullno
agentIdstring or nullno
chainSeqinteger or nullyes1-based contiguous per-user sequence; a gap means a deleted row.
prevHashstring or nullyeshex sha256 of the predecessor rowHash ('' for the genesis row).
rowHashstring or nullyeshex sha256(prevHash || canonical(row)).
createdAtstring (date-time)yes

AuditLogEvent

FieldTypeRequiredDescription
idstring (uuid)yes
actionstringyesThe audited action, e.g. api_key.created, domain.deleted, webhook.created.
resourceTypestring or nullnoThe kind of resource the action targeted, e.g. api_key, domain, inbox, webhook.
resourceIdstring or nullnoIdentifier of the affected resource, when one applies.
actorstring or nullnoWho performed the action: an API key id/prefix, a user id, or a system actor.
ipstring or nullnoSource IP address the action originated from, when captured.
metadataobject or nullnoFree-form, action-specific context captured with the event. Null when no metadata was recorded.
createdAtstring (date-time)yesWhen the event was recorded (UTC).

AuditLogListResponse

FieldTypeRequiredDescription
logsarray of AuditLogEventyes
paginationPaginationyes

AvailablePhoneNumber

FieldTypeRequiredDescription
object"phone_number.available"yes
phoneNumberstringyesE.164. Partially masked (e.g. +16313------) when purchasable is false.
countryCodestringyes
numberTypestringyes
localitystring or nullno
regionstring or nullno
capabilitiesarray of stringno
monthlyCostUsdnumber or nullno
setupCostUsdnumber or nullno
purchasablebooleanyesFalse when the provider account has not completed identity verification; the number is masked and cannot be bought yet.

AvailablePhoneNumberListResponse

FieldTypeRequiredDescription
object"list"yes
dataarray of AvailablePhoneNumberyes

BatchDeleteBucketObjectsRequest

FieldTypeRequiredDescription
objectIdsarray of string (uuid)yesThe storage object ids to delete (1-1000). (min items 1, max items 1000)

BatchDeleteMessagesRequest

FieldTypeRequiredDescription
messageIdsarray of string (uuid)yesThe message ids to delete (1-1000). (min items 1, max items 1000)

BatchDeleteResult

FieldTypeRequiredDescription
object"batch_delete_result"yes
deletedarray of stringyesThe ids that were successfully deleted.
failedarray of objectyesPer-id failures; never aborts the rest of the batch.

BatchRecipient

FieldTypeRequiredDescription
toPostalAddressyes
templateDataobjectnoPer-recipient values that fill the template's {{placeholders}} for this letter.

Broadcast

The 202 accept envelope for a list broadcast enqueued for asynchronous fan-out.

FieldTypeRequiredDescription
object"broadcast"yes
idstringyesThe server-minted broadcast id (bcast_...).
audienceIdstring (uuid)yes
status"queued"yes

BroadcastRequest

The body of an audience broadcast. Every active member of the audience receives its own email from inboxId, which must be an email inbox. Per-recipient fields (to, cc, bcc, contactId, channel, sendAt, inReplyTo, references, replyToMessageId, dryRun) and the Telegram-only buttons and telegram are rejected with 400: members are the recipients, one message each, so none of them can apply.

FieldTypeRequiredDescription
inboxIdstringyes
subjectstringno(default "")
textstringno
htmlstringno
reactReactRenderInputno
templateMessageTemplateRefno
attachmentsarray of SendMessageAttachmentnoOutbound send attachments. 'attachment' and safe 'auto' sends are inline; current inline API limit is 10 files, 8 MiB per file, 8 MiB total decoded bytes. 'link' is explicit and must be backed by a pre-created Dairo share link placed deliberately in text/html by the caller. (max items 10)
idempotencyKeystringnoPer-broadcast idempotency base: each member's message is keyed {idempotencyKey}:{address}, so re-posting the same broadcast never re-sends to a member already accepted. Omitted, the base is derived from the org, the audience and the body. (max length 128)
replyTostring (email)noOptional single Reply-To address, set verbatim as the MIME Reply-To header.
headersmap of stringnoOptional custom MIME headers ({name: value}). Spoofable/provenance headers are dropped server-side; malformed names or CR/LF are rejected.
tagsmap of stringnoOptional SES message tags ({name: value}), validated against SES tag constraints.
ignoreComplaintsbooleannoOverride complaint and hard-bounce suppression for every member that previously complained or bounced. (default false)

Bucket

FieldTypeRequiredDescription
object"bucket"yes
idstringyesBucket identifier (buk_*).
namestringyes
displayNamestring or nullno
descriptionstring or nullno
isDefaultbooleanyes
status"active", "archived"yes
usedBytesintegeryes(minimum 0)
objectCountintegeryes(minimum 0)
metadataobject or nullno
createdAtstring (date-time)yes
updatedAtstring (date-time)yes

BucketListResponse

FieldTypeRequiredDescription
object"list"yes
dataarray of Bucketyes
paginationPaginationyes

BucketObject

FieldTypeRequiredDescription
object"bucket_object"yes
idstring (uuid)yes
filenamestringyes
contentTypestring or nullno
bytesintegeryes(minimum 0)
scanStatus"pending", "clean", "infected", "failed", "skipped"yesAsync malware-scan verdict (W2.2). Objects start 'pending' (owner-only, not publicly served) and become 'clean' or 'infected'/'failed' once the scanner runs. Public links (/d/, /s/) and native attach require 'clean' (or trusted 'skipped').
createdAtstring (date-time)yes

BucketObjectListResponse

FieldTypeRequiredDescription
object"list"yes
dataarray of BucketObjectyes
paginationPaginationyes

Budget

A fail-closed spend/send budget for an account, key, or agent scope.

FieldTypeRequiredDescription
idstring (uuid)yes
scope"account", "key", "agent"yes
scopeIdstring or nullnonull for the account scope; the api_key id for key/agent scopes.
enabledbooleanyes
limitsBudgetLimitsyes
usageBudgetUsageyes
createdAtstring (date-time)yes
updatedAtstring (date-time)yes

BudgetLimits

Budget limits. At least one limit (maxSendsPerDay, maxNewRecipientsPerHour, maxSpendPerDayCents, or hardStopOnComplaint=true) is required. maxSpendPerDayCents is allowed on the account budget only.

FieldTypeRequiredDescription
maxSendsPerDayinteger or nullnoRecipient-denominated sends allowed in a rolling 24h window. (minimum 0, maximum 1000000)
maxNewRecipientsPerHourinteger or nullnoRecipients addressed in a rolling 1h window. V1 counts every recipient on each send (a conservative over-count); true distinct-recipient dedup is V2. (minimum 0, maximum 1000000)
hardStopOnComplaintboolean or nullnoWhen true, every send under this budget fails closed once the account has any recorded complaint.
maxSpendPerDayCentsinteger or nullnoAccount budgets only: the daily money cap in USD cents. A paid hold (AI generation, phone call, letter) that would take the last 24 hours of spend past it is rejected with spend_cap_reached; 0 blocks every paid hold. (minimum 0, maximum 1000000)

BudgetListResponse

FieldTypeRequiredDescription
budgetsarray of Budgetyes

BudgetResponse

FieldTypeRequiredDescription
budgetBudgetyes

BudgetSetRequest

FieldTypeRequiredDescription
scope"account", "key", "agent"yes
scopeIdstring or nullnoRequired for key/agent scopes (an api_key id you own); omit for the account scope.
enabledbooleanno(default true)
limitsBudgetLimitsyes

BudgetUsage

FieldTypeRequiredDescription
sendsLast24hintegeryesRecipient-denominated sends recorded in the last 24h for this scope.
newRecipientsLastHourintegeryesRecipients addressed in the last hour for this scope.
accountHasComplaintbooleanyesWhether the account has any recorded complaint (drives hardStopOnComplaint).

CancelOutboundMessageResponse

FieldTypeRequiredDescription
messageOutboundMessageyes

Contact

FieldTypeRequiredDescription
idstring (uuid)yes
projectIdstring (uuid)no
userIdstring (uuid)no
aliasstring or nullno@-referenceable handle, unique per project.
displayNamestringyes
kind"person", "agent", "self"yes
isSelfbooleanyesThe project self contact (the "@me" recipient).
infostring or nullnoFree-text notes.
metadataobjectno
avatarUrlstring or nullno
handlesarray of ContactHandlenoPresent on the detail view (GET /v1/contacts/{id} and /v1/contacts/me).
createdAtstring (date-time)yes
updatedAtstring (date-time)yes

ContactCreateRequest

FieldTypeRequiredDescription
displayNamestringyes(min length 1, max length 200)
aliasstringno
kind"person", "agent", "self"no
infostringno(max length 10000)
avatarUrlstringno
metadataobjectno
handlesarray of ContactHandleInputno

ContactDetailResponse

FieldTypeRequiredDescription
contactContactyes

ContactHandle

FieldTypeRequiredDescription
idstring (uuid)yes
contactIdstring (uuid)yes
projectIdstring (uuid)no
userIdstring (uuid)no
channelstringyesDelivery channel of this handle (email/a2a/telegram/postal/…).
valuestringyesThe channel address (email address, chat id, agent id, or for a postal handle the one-line formatted address).
labelstring or nullno
isPrimarybooleanyes
verifiedbooleanyes
metadataobjectnoStructured extras. For a postal handle this carries the structured address: { name, street, line2?, postalCode, city, state?, country } (see PostalAddress).
createdAtstring (date-time)yes
updatedAtstring (date-time)yes

ContactHandleInput

FieldTypeRequiredDescription
channelstringyesemail / a2a / telegram / postal / …
valuestringyesThe channel address. For a postal handle this is the one-line formatted address (for display); the structured address goes in metadata. (max length 500)
labelstringno
isPrimarybooleanno(default false)
metadataobjectnoStructured extras. REQUIRED for a postal handle: { name, street, line2?, postalCode, city, state?, country } (see PostalAddress). name/street/postalCode/city/country are required; country is an ISO-3166 alpha-2 code or a country name.

ContactHandleResponse

FieldTypeRequiredDescription
contactHandleContactHandleyes

ContactListResponse

FieldTypeRequiredDescription
object"list"yes
dataarray of Contactyes
paginationPaginationyes

ContactUpdateRequest

FieldTypeRequiredDescription
displayNamestringno(min length 1, max length 200)
aliasstring or nullno
kind"person", "agent", "self"no
infostring or nullno(max length 10000)
avatarUrlstring or nullno
metadataobjectno

CreateApiKeyRequest

FieldTypeRequiredDescription
namestringyes
scopesarray of "account:read", "account:write", "admin", "agents:read", "agents:write", "audiences:read", "audiences:write", "buckets:read", "buckets:write", "budgets:read", "budgets:write", "compliance:read", "compliance:write", "contacts:read", "contacts:write", "domains:read", "domains:write", "events:read", "events:write", "inboxes:read", "inboxes:write", "keys:read", "keys:write", "letters", "letters:read", "letters:send", "messages", "messages:read", "messages:send", "phone", "phone:call", "phone:read", "phone:write", "templates:read", "templates:write", "webhooks:read", "webhooks:write"yes(min items 1)
allowedIpsarray of string or nullnoOptional IPv4/IPv6 addresses or CIDR ranges (up to 50) the key may authenticate from. Deny-by-default: a correct secret from an unlisted IP is rejected with 403. Omit or null for any-IP.
environment"test", "live", nullnoCosmetic LABEL only; picks the secret prefix (dairo_test_…/dairo_live_…). It does NOT create a sandbox: a test key sends real mail, really delivered and really billed. Defaults to live. (default "live")
projectIdstring or nullnoOptional organization to bind the key to. Defaults to the caller's active project; you must be a member of the one you name.
inboxIdsarray of string (uuid) or nullnoOptional per-inbox restriction: the inbox ids (inboxes.id, up to 100) this key may send as. Enforced server-side on every send, so it binds a raw POST /v1/messages exactly as much as it binds the CLI. Omit, null, or [] for unrestricted (any inbox). A key that is itself restricted may only grant a subset of its own inboxes; a child that requests none inherits the parent's restriction rather than escaping it.

CreateApiKeyResponse

FieldTypeRequiredDescription
object"api_key"yes
idstring (uuid)yes
namestringyes
prefixstringyes
scopesarray of stringyes
status"active", "revoked"yes
createdAtstring (date-time)yes
lastUsedAtstring (date-time) or nullno
allowedIpsarray of string or nullnoThe key's IP allowlist (IPv4/IPv6 addresses or CIDR ranges), or null when the key authenticates from any IP.
inboxIdsarray of string (uuid) or nullnoThe inbox ids (inboxes.id) this key may send as. Empty or null means the key is unrestricted and may send as any inbox in the project — the default, and what every key minted before this field existed has.
environment"live", "test"no
secretstringyesOne-time API key secret. Store it now; it is never shown again.
secretShownOncetrueyes

CreateBucketObjectRequest

FieldTypeRequiredDescription
filenamestringyes(min length 1, max length 1024)
contentTypestringyes(min length 1, max length 256)
expectedBytesinteger or nullnoOptional client-declared size; the true size is verified on finalize. (minimum 0)
metadataobject or nullno

CreateBucketRequest

FieldTypeRequiredDescription
namestringyesUnique bucket name (case-insensitive per account). (min length 1, max length 128)
displayNamestring or nullno(max length 256)
descriptionstring or nullno(max length 1024)
metadataobject or nullno

CreateDomainRequest

FieldTypeRequiredDescription
domainstringyes

CreateInboxRequest

FieldTypeRequiredDescription
usernamestringyes
localPartstringno
domainstringyes
agentstringno(default "Inbox Agent")
mode"receive_send", "send_only", "receive_only"no(default "receive_send")

CreateLetterBatchRequest

FieldTypeRequiredDescription
templateIdstringyesThe stored letter template rendered once per recipient.
recipientsarray of BatchRecipientyes(min items 1, max items 1000)
fromPostalAddress or nullno
printLetterPrintOptionsno
deliveryLetterDeliveryno
paymentSlip"qr", "sepaDe", "sepaAt" or nullnoOptional payment-slip overlay applied to every letter.
autoSendbooleanno(default true)
notificationsbooleanno(default true)
metadataobjectno

CreateLetterRequest

Exactly one document source must be provided: pdfBase64, file, or templateId. Validate any letter first with POST /v1/letters/verify; GET /v1/letters/requirements has the full layout spec and compliant starter templates.

FieldTypeRequiredDescription
pdfBase64string or nullnoBase64-encoded PDF (alternative to file).
fileLetterFileRef or nullno
fileNamestringyes
toPostalAddressyes
fromPostalAddress or nullno
printLetterPrintOptionsno
deliveryLetterDeliveryno
autoSendbooleanno(default true)
metadataobjectno
templateIdstring or nullnoA stored letter template id. Dairo renders the template (filled with templateData) and composites the to recipient into the address window — the third document source, mutually exclusive with pdfBase64/file. Required for the structured payment object.
templateDataobject or nullnoValues for the template's {{placeholder}} variables. Ignored unless templateId is set.
dryRunbooleannoWhen true the letter is validated, rendered, and priced exactly like a real send but is NEVER created, mailed, or charged — the response is a non-persisted status:"preview" object. The per-request no-send rehearsal. (default false)
notificationsbooleannoEmail the account owner a status update at notable delivery milestones. (default true)
paymentSlip"qr", "sepaDe", "sepaAt", nullnoBring-your-own-slip flag for a pdfBase64/file letter whose PDF already contains the slip artwork: qr (Swiss QR-bill), sepaDe, or sepaAt. Omit/null for a normal letter. To have Dairo GENERATE the slip use the structured payment object (template letters only).
paymentLetterPayment or nullnoStructured payment object — Dairo GENERATES the payment slip (Swiss QR-bill / SEPA Zahlschein + GiroCode) and composites it full-width at the page bottom. Honored ONLY with templateId; pairing it with pdfBase64/file is a 400.

CreateLetterTemplateRequest

FieldTypeRequiredDescription
namestringyes
htmlstringyesThe branded letter HTML. Use {{placeholders}} where values vary per recipient and leave the recipient address window blank.
variablesarray of string or LetterTemplateVariable or objectnoDeclared template variables. Preferred: [{name, type?, example?, label?}]. Also accepted: an array of names, or an object {name: type}. Stored and returned in the preferred shape.
statusLetterTemplateStatusno

CreateShareLinkRequest

Options for a secure share link over a stored object.

FieldTypeRequiredDescription
passwordstringnoOptional password the recipient must enter on the /s/ page: 8-256 characters, used exactly as given (never trimmed) and without a NUL character. An empty string means no password. (min length 8, max length 256)
maxUsesintegernoOptional use cap. 1 = one-time (the /d/ download returns 410 Gone after the first use). (minimum 1)
expiresAtstring (date-time)noOptional absolute expiry (RFC3339). Must be in the future.

CreateWebhookRequest

FieldTypeRequiredDescription
urlstring (uri)yes
eventsarray of "message.received", "message.quarantined", "message.sent", "message.delivered", "message.bounced", "message.complained", "message.delayed", "budget.tripped", "compliance.erasure.completed", "subprocessor.changed", "object.scanned", "share_link.opened", "letter.status_changed", "call.status_changed", "domain.verified"yes(min items 1)
labelstringnoOptional human label for the endpoint. Surfaced read-only and used as the primary match field by prefix-scoped test cleanup.

CreateWebhookResponse

FieldTypeRequiredDescription
object"webhook"yes
idstring (uuid)yes
urlstring (uri)yes
eventsarray of "message.received", "message.quarantined", "message.sent", "message.delivered", "message.bounced", "message.complained", "message.delayed", "budget.tripped", "compliance.erasure.completed", "subprocessor.changed", "object.scanned", "share_link.opened", "letter.status_changed", "call.status_changed", "domain.verified"yes
labelstring or nullnoOptional human label for the endpoint, or null when unlabeled.
status"active", "paused"yes
createdAtstring (date-time)yes
lastDeliveryAtstring (date-time) or nullnoTimestamp of the most recent successful webhook delivery, or null before the first successful delivery.
secondarySecretExpiresAtstring (date-time) or nullnoEnd of the dual-secret window after a rotation, or null.
secondarySecretActivebooleannoWhether deliveries are still signed with the previous secret too.
consecutiveFailuresintegerno
pausedReasonstring or nullnoauto:delivery_failures when the circuit breaker paused the endpoint, else null.
autoPausedbooleanno
autoPausedAtstring (date-time) or nullno
signingSecretstringyesOne-time signing secret (whsec_...). Store it now; it is never shown again.
secretShownOncetrueyes

DeleteResponse

FieldTypeRequiredDescription
deletedbooleanyes

DeletionCertificate

A court-usable, Ed25519-signed receipt enumerating exactly what was destroyed.

Type: SignedArtifact and object.

DnsRecord

FieldTypeRequiredDescription
type"CNAME", "MX", "TXT"yes
hoststringyes
valuestringyes
priorityinteger or nullno
status"pending", "configured"yes

Domain

FieldTypeRequiredDescription
object"domain"yes
idstring (uuid)yes
domainstringyes
status"pending", "verified", "failed"yes
verifiedAtstring (date-time) or nullno
regionstringyes
recordsarray of DnsRecordyes
type"custom", "included", "system"no
isIncludedbooleanno
isDeletablebooleanno
isSystembooleannoOnly on the shared dairo.app system domain.
isReadOnlybooleannoOnly on the shared dairo.app system domain.
receiving"active", "pending"noOnly on the verify response: whether the domain receives mail (it does exactly when verified).

DomainListResponse

FieldTypeRequiredDescription
object"list"yes
dataarray of Domainyes
paginationPaginationyes

EditTelegramMessageRequest

Edit a Telegram message you sent: exactly one of text or html, plus an optional replacement inline keyboard.

FieldTypeRequiredDescription
textstringnoNew plain-text body. Mutually exclusive with html.
htmlstringnoNew rich-HTML body. Mutually exclusive with text.
buttonsarray of array of TelegramButtonnoOptional replacement inline keyboard (rows of buttons). Pass [] to clear the keyboard. Callback buttons show a feedback toast on tap (default: ✓ + the button label; set alert:true for a modal).

EraseRequest

FieldTypeRequiredDescription
type"subject", "inbox"yessubject: erase all stored mail to or from subjectHandle. inbox: purge everything in inboxId.
subjectHandlestring (email)noRequired for type subject: the data subject's plain email address.
inboxIdstring (uuid)noRequired for type inbox: the inbox to purge.
idempotencyKeystringnoOptional caller-supplied key; a retry with the same key returns the same job, a reuse for another target is a 409.

ErasureJob

FieldTypeRequiredDescription
idstring (uuid)yes
kind"erase_subject", "purge_inbox"yes
subjectHandlestring or nullno
inboxIdstring or nullno
status"pending", "running", "completed", "failed"yes
deletedErasureJobDeletedCountsyes
certificateDeletionCertificate or nullno
certificateSigstring or nullno
errorstring or nullno
createdAtstring (date-time)yes
startedAtstring (date-time) or nullno
completedAtstring (date-time) or nullno

ErasureJobAccepted

Acknowledgement that an erasure job was enqueued.

FieldTypeRequiredDescription
jobIdstring (uuid)yes
kind"erase_subject", "purge_inbox"yes
status"pending", "running", "completed", "failed"yes
createdAtstring (date-time)yes

ErasureJobDeletedCounts

FieldTypeRequiredDescription
messagesintegerno
threadsintegerno
attachmentsintegerno
s3Objectsintegerno
ledgerRowsRedactedintegerno

ErasureJobResponse

FieldTypeRequiredDescription
jobErasureJobyes

Error

FieldTypeRequiredDescription
messagestringyes
codestringno
typestring or nullno
paramstring or nullno

ErrorResponse

FieldTypeRequiredDescription
errorErroryes

EventLedgerPage

FieldTypeRequiredDescription
object"list"yesAlways "list" — the unified list envelope discriminator.
dataarray of LedgerEventyesThe ledger events for this page, each with seq/partitionKey join keys. (This is the array named data, not events.)
paginationPaginationyes
gapsarray of LedgerGapyesPer-partition seq gaps detected within this page's window. An empty array means no gap was detected in the returned window — detection is window-local (only the seq range present on this page), not whole-history.

EventReplayBound

FieldTypeRequiredDescription
eventIdstringyes
seqinteger (int64)yes
partitionKeystringyes
createdAtstring (date-time)yes

EventReplayRequest

Selects a ledger slice to re-deliver. Provide exactly one lower bound: since (an opaque cursor from GET /v1/events), sinceSeq (+inboxId, replay one partition from a seq), or sinceTimestamp (RFC3339).

FieldTypeRequiredDescription
sincestringnoOpaque keyset cursor (from GET /v1/events) to replay forward from.
sinceSeqinteger (int64)noReplay one partition starting at this seq (inclusive). Requires inboxId.
inboxIdstring (uuid)noScope the replay to one inbox partition (required with sinceSeq; an optional filter otherwise).
sinceTimestampstring (date-time)noReplay events created at or after this RFC3339 timestamp.
untilstring (date-time)noOptional upper bound (events created at or before this RFC3339 timestamp).
typesarray of stringnoOptional event-type filter, e.g. ["email.bounced"].
webhookIdstringnoOptional: replay only to this one webhook subscription; otherwise to every matching active subscription.
maxEventsintegernoHard cap on the slice size. A slice that exceeds the cap is rejected with 400 asking the caller to page with until/maxEvents. (minimum 1, maximum 5000, default 1000)

EventReplayResult

FieldTypeRequiredDescription
replayedintegeryesNumber of events re-delivered to at least one matching subscription.
skippedintegeryesNumber of events in the slice with no matching active subscription.
fromEventReplayBound or nullno
toEventReplayBound or nullno

Inbox

FieldTypeRequiredDescription
object"inbox"yes
idstring (uuid)yes
addressstring (email) or nullyes
localPartstring or nullyes
domainstring or nullyes
domainStatus"pending", "verified", "failed", nullno
agentstringno
mode"receive_send", "send_only", "receive_only"yes
status"active", "paused", "deleted"yes
createdAtstring (date-time) or nullno
lastMessageAtstring (date-time) or nullno
channel"email", "a2a"yesThe channel this message transited: "email" (external, over SES) or "a2a" (internal Dairo-to-Dairo, which skips SES). Reserved future values (sms, whatsapp, …) are not yet wired.

InboxListResponse

FieldTypeRequiredDescription
inboxesarray of Inboxyes

InboxSchemaContract

JSON-Schema-lite extraction contract: a flat map of field name to declaration. Identical shape to a template variables schema. '{}' (or omitted) means no contract (passthrough).

Type: map of object.

InboxSchemaDeleteResponse

FieldTypeRequiredDescription
deletedbooleanyes
inboxIdstring (uuid)yes

InboxSchemaResponse

FieldTypeRequiredDescription
inboxIdstring (uuid)yes
schemaInboxSchemaContractyes
onValidationError"quarantine", "passthrough"yes
extractionHintstring or nullno
createdAtstring (date-time)no
updatedAtstring (date-time)no

LedgerEvent

One durable, ordered row of the reliability-spine event ledger. Mirrors the webhook event for the same source event (same eventId/type/data) and adds the monotonic per-partition seq plus the loop-wide idempotencyKey.

FieldTypeRequiredDescription
eventIdstringyesThe evt_<uuid> id; identical to the X-Dairo-Event-Id of the original webhook delivery, so consumer-side dedupe is exact across live delivery and replay.
typestringyesEvent type, e.g. email.sent, email.delivered, email.bounced, email.complained, message.received.
seqinteger (int64)yesMonotonic, 1-based, contiguous sequence number within the partition. A gap in seq is a lost event (surfaced in gaps[]).
partitionKeystringyesThe ordering domain for seq, e.g. inbox:<uuid>.
inboxIdstring (uuid) or nullno
threadIdstring (uuid) or nullno
idempotencyKeystring or nullnoLoop-wide idempotency key threaded from the originating send onto every status event and the matched inbound reply. Null when the event did not originate from an idempotent send.
outboundMessageIdstring (uuid) or nullno
messageIdstring (uuid) or nullno
providerMessageIdstring or nullno
occurredAtstring (date-time) or nullno
createdAtstring (date-time)yes
dataobjectnoThe original webhook event data payload (metadata-first, body-free).

LedgerGap

FieldTypeRequiredDescription
partitionKeystringyesThe partition (ordering domain) the gap was detected in, e.g. inbox:<uuid>.
missingSeqarray of integer (int64)yesSequence numbers expected-but-absent within the returned window for this partition. A non-empty list means one or more events were lost; replay to recover.

Letter

FieldTypeRequiredDescription
object"letter"yes
idstringyes
statusLetterStatusyes
fileNamestring or nullno
pageCountinteger or nullno
toPostalAddressno
fromPostalAddress or nullno
printLetterPrintOptionsno
deliveryLetterDeliveryno
paperTypesarray of LetterPaperTypeno
autoSendbooleanno
priceLetterMoney or nullno
trackingNumberstring or nullno
metadataobjectno
lastEventTypestring or nullnoThe type of the newest event on the letter's timeline (e.g. processing, canceled); null until the letter has an event.
lastEventAtstring (date-time) or nullnoWhen the newest timeline event occurred; null until the letter has an event.
submittedAtstring (date-time) or nullno
canceledAtstring (date-time) or nullno
errorstring or nullno
createdAtstring (date-time) or nullno
updatedAtstring (date-time) or nullno
eventsarray of LetterEventno
paymentSlip"qr", "sepaDe", "sepaAt", nullnoThe chosen payment-slip overlay, or null for a normal letter.
dryRunbooleannoTrue for a validate/price-only letter that is never mailed or charged.
providerMode"test", "live"notest: the letter is validated and priced but never printed, mailed, or charged (a dry run, or the account's provider mode is test). live: it will be printed and posted.
notificationsbooleannoOwner milestone-email preference for this letter.
paymentLetterPayment or nullnoThe structured payment object the slip was generated from (owner records), or null.
undeliverableReasonstring or nullnoHuman-readable reason when the letter reached undeliverable; null otherwise.
batchIdstring or nullnoThe owning batch id for a batch-member letter; null for a single send. Pairs with the ?batchId= list filter.

LetterAddressPlacement

Type: "left", "right".

LetterBatch

FieldTypeRequiredDescription
object"letter_batch"yes
idstringyes
templateIdstring or nullno
statusstringyes
totalintegeryes
completedintegernoMember letters in a terminal state (delivered, undeliverable, canceled, failed).
statusCountsmap of integernoLive count of member letters keyed by their letter status.
createdAtstring (date-time) or nullno
updatedAtstring (date-time) or nullno

LetterBatchCreateResponse

FieldTypeRequiredDescription
object"letter_batch"yes
idstringyes
totalintegeryesNumber of letters created (one per recipient).
statusstringyesThe batch status; queued on create.

LetterDelivery

Type: "economy", "priority", "registered".

LetterEvent

FieldTypeRequiredDescription
object"letter_event"yes
eventIdstringyes
letterIdstring or nullno
typestringyes
codestring or nullno
descriptionstring or nullno
producerstring or nullno
locationstring or nullno
reasonstring or nullnoHuman-readable reason, when the event carries one (an undeliverable reason, or why a created letter is held, e.g. code test_mode).
hasImagebooleanno
occurredAtstring (date-time) or nullno
recordedAtstring (date-time) or nullno

LetterEventList

FieldTypeRequiredDescription
object"list"yes
dataarray of LetterEventyes
paginationPaginationyes

LetterFileRef

Reuse a PDF already stored in Dairo as the letter — no re-upload. Provide EXACTLY ONE of attachmentId (an email attachment) or objectId (a storage object from the buckets API). Providing both, or neither, is a 400.

FieldTypeRequiredDescription
attachmentIdstringnoAn email attachment id to reuse as the letter PDF.
messageIdstring or nullnoOptional message id the attachment belongs to (informational).
objectIdstringnoA storage object id (from POST /v1/buckets/{bucketId}/objects upload + finalize) to reuse as the letter PDF. Must have passed its malware scan (clean/skipped).

LetterList

FieldTypeRequiredDescription
object"list"yes
dataarray of Letteryes
paginationPaginationyes

LetterMoney

FieldTypeRequiredDescription
currencystringyesUpper-case ISO 4217 code, e.g. EUR.
amountnumberyes
walletAmountnumbernoThe price in the credits-wallet currency, at the same conversion rate the charge uses (rounded to the cent).
walletCurrencystringnoThe credits-wallet currency (USD).
walletRatenumbernoThe conservative rate from the letter currency (EUR) to the wallet currency used for walletAmount (walletAmount = amount × walletRate, rounded to the cent).

LetterPaperType

Type: "standard", "qr", "sepa_at", "sepa_de".

LetterPayment

A generated payment slip: qr = Swiss QR-bill (CHF), sepaDe/sepaAt = SEPA Zahlschein + GiroCode (EUR). The debtor defaults to the letter recipient.

FieldTypeRequiredDescription
type"qr", "sepaDe", "sepaAt"yes
creditorobjectyesThe payee (account holder).
amountnumberyesAmount > 0, at most 2 decimals.
currency"CHF", "EUR", nullnoMust match type (qr => CHF, sepa* => EUR); omitted = inferred.
referencestring or nullnoStructured payment reference.
messagestring or nullnoUnstructured remittance info (Verwendungszweck).
debtorLetterPaymentParty or nullno

LetterPaymentParty

FieldTypeRequiredDescription
namestringno
streetstring or nullno
houseNumberstring or nullno
postalCodestring or nullno
citystring or nullno
countrystring or nullnoISO 3166-1 alpha-2.

LetterPrice

FieldTypeRequiredDescription
object"letter_price"yes
currencystringyesUpper-case ISO 4217 code, e.g. EUR.
amountnumberyes
walletAmountnumbernoThe price in the credits-wallet currency, at the same conversion rate the charge uses (rounded to the cent).
walletCurrencystringnoThe credits-wallet currency (USD).
walletRatenumbernoThe conservative rate from the letter currency (EUR) to the wallet currency used for walletAmount (walletAmount = amount × walletRate, rounded to the cent).
countrystringno
pageCountintegerno
deliveryLetterDeliveryno
printLetterPrintOptionsno
breakdownobjectno

LetterPriceRequest

Give the destination (country or to.country) and one page source: pageCount, pdfBase64, file, or templateId (rendered with templateData and to to count pages). First match wins in that order.

FieldTypeRequiredDescription
countrystringnoISO 3166-1 alpha-2 country code. Optional when to.country is given.
pageCountinteger or nullno(minimum 1)
pdfBase64string or nullno
printLetterPrintOptionsno
deliveryLetterDeliveryno
paperTypesarray of LetterPaperTypeno
fileLetterFileRefno
templateIdstring or nullnoA stored letter template; rendered to count pages.
templateDataobject or nullnoValues for the template's placeholders.
toPostalAddress or nullnoRecipient. Its country prices the letter when country is absent; a template render composites it (a sample recipient is used when absent).

LetterPrintMode

Type: "color", "grayscale".

LetterPrintOptions

FieldTypeRequiredDescription
modeLetterPrintModeno
sidesLetterSidesno
addressPlacementLetterAddressPlacementno

LetterRequirements

The machine-readable letter compliance spec: exact A4 address-window and keep-out coordinates (mm), PDF rules, the verify→price→dryRun→send workflow, and ready-made compliant starter templates (starterTemplates[].html can be POSTed to /v1/letters/templates verbatim).

FieldTypeRequiredDescription
object"letter_requirements"no
versionstringno
printMode"test", "live"noThe account's letter print mode, the same as letters.printMode on GET /v1/whoami. test letters are never printed.
printModeNotestringno
testModeobjectnoendState: what happens to a letter created in test mode (it stays processing, is never printed or charged, does not expire; cancel it to close it out).
destinationsobjectnoAccepted recipient countries: supportedCountries is "any" (every assigned ISO 3166-1 alpha-2 code) or the configured list; printCentreCountry is where letters are posted (domestic); registered states the domestic-only rule.
summarystringno
pageSetupobjectno
addressWindowobjectno
keepOutsobjectno
bodyLayoutobjectno
pdfRulesarray of stringno
workflowarray of objectno
starterTemplatesarray of objectno
endpointsobjectno
agentHintstringno
mcpToolsmap of stringnoWhich MCP tool carries each letters action (prepare_letters, list_letters, send_letters).

LetterSides

Type: "simplex", "duplex".

LetterStatus

Type: "draft", "queued", "processing", "printable", "submitted", "in_transit", "delivered", "undeliverable", "canceled", "failed".

LetterTemplate

FieldTypeRequiredDescription
object"letter_template"yes
idstringyes
namestringyes
htmlstringnoThe branded letter HTML with {{placeholders}} and a blank recipient address window. Omitted from list items.
variablesarray of LetterTemplateVariablenoDeclared template variables, always normalized to [{name, type?, example?, label?}] (legacy string[] and {name: type} rows are converted on read).
statusLetterTemplateStatusyes
createdAtstring (date-time) or nullno
updatedAtstring (date-time) or nullno

LetterTemplateList

FieldTypeRequiredDescription
object"list"yes
dataarray of LetterTemplateyes
paginationPaginationyes

LetterTemplatePreview

FieldTypeRequiredDescription
object"letter_template_preview"yes
templateIdstringyes
addressPlacementLetterAddressPlacementyes
pdfBase64stringnoThe rendered PDF, base64. Present only for output: inline.
pdfUrlstring (uri) or nullnooutput: url only: a presigned download URL for the PDF (null when storage is unavailable).
pdfUrlExpiresInSecondsinteger or nullnooutput: url only: seconds until pdfUrl expires (900).
pageCountintegernooutput: url only.
pageSizeobject or nullnooutput: url only: the rendered page size from the layout check.
validboolean or nullnooutput: url only: the layout-check verdict (null when the check was unavailable).
summaryanynooutput: url only: the layout-check summary (null when unavailable).
failedChecksarray of stringnooutput: url only: ids of the layout checks that failed (empty when none failed or the check was unavailable).
checksarray of objectnooutput: url only: every layout check as {id, status, message}, the same list POST /v1/letters/verify returns without the expected/actual detail.
sizeBytesintegernooutput: url only: PDF size in bytes.
agentHintstringnooutput: url only, when storage was unavailable.

LetterTemplateStatus

Type: "active", "archived".

LetterTemplateVariable

One declared template placeholder.

FieldTypeRequiredDescription
namestringyesThe placeholder name used as {{name}}.
typestringnoOptional value type hint, e.g. string, number, date.
examplestringnoOptional sample value (used by previews).
labelstringnoOptional human label.

LetterVerification

The structured layout verdict for a letter PDF.

FieldTypeRequiredDescription
object"letter_verification"yes
validbooleanyesTrue when NO check failed. Warnings may still be present.
pageCountintegerno
pageSizeobject or nullnoPage size in mm. A page within 1 mm of A4 is reported as exactly 210 x 297 with format A4.
measuredPageSizeobject or nullnoThe raw measured page size, present when pageSize was reported as nominal A4 (a page within 1 mm of 210 x 297 mm, e.g. Chromium's 596 pt width).
addressPlacement"left", "right", nullnoThe window where the recipient address was detected, or null when none was found.
addressLinesarray of stringnoThe text lines detected inside the address window, top to bottom.
checksarray of LetterVerificationCheckyes
summarystringno
agentHintstringnoThe recommended next step.

LetterVerificationCheck

One layout check verdict. fail blocks a compliant send; warn is a risk to review; skipped means the check was not applicable.

FieldTypeRequiredDescription
idstringyesStable check id, e.g. page_size, address_window, address_match, franking_zone, edge_clearance, fonts_embedded.
status"pass", "warn", "fail", "skipped"yes
messagestringyesAgent-readable finding, with expected geometry in mm where relevant.
expectedanynoMachine-usable expected value, when applicable.
actualanynoMachine-usable observed value, when applicable.

LetterVerifyRequest

Exactly one document source must be provided: pdfBase64, file, or templateId (with templateData + to — the render composites the recipient). Passing to is strongly recommended: it enables the printed-address match check.

FieldTypeRequiredDescription
pdfBase64string or nullnoBase64-encoded PDF to verify (max 4 MB for verification).
fileLetterFileRef or nullno
templateIdstring or nullnoVerify a stored template's render. Requires to.
templateDataobject or nullno
toPostalAddress or nullnoThe intended recipient — enables the printed-address match check. Required with templateId.
fromPostalAddress or nullnoOptional return address (template path only).
printLetterPrintOptionsno
maxPagesinteger or nullnoOptional page-count ceiling enforced as a fail check. (minimum 1)
deliveryLetterDelivery or nullnoPass the SAME delivery class you will send with. registered letters use a DIFFERENT address geometry — the carrier prints its registered-mail label into y=50–67mm, so the recipient block must sit in y=67–90mm — and are verified against it. Registered delivery is domestic only (the recipient must be in the print centre country, DE); with to in another country verify adds a failing registered_domestic check, and price/create reject it with 422, param delivery.
paymentLetterPayment or nullnoThe structured payment object the create will carry. Template letters are rendered WITH the generated slip so the verified PDF is the exact PDF the create would mail. Template-path only (mirrors the create's rule).

Message

FieldTypeRequiredDescription
idstring (uuid)yes
inboxIdstring (uuid)yes
threadIdstring (uuid) or nullyes
direction"inbound", "outbound"yes
statusstringyes
fromMessageAddressyes
toarray of stringyes
ccarray of stringyes
bccarray of stringyes
subjectstringyes
textPreviewstringyes
hasHtmlbooleanyes
hasAttachmentsbooleanyes
receivedAtstring (date-time)yes
createdAtstring (date-time)yes
textBodystring or nullno
htmlBodystring or nullno
attachmentsarray of MessageAttachmentno
structuredobject or nullnoSchema-Inbox extraction result for this message: the extracted object (validated data, or the raw candidate on passthrough/quarantine). Null when no schema was configured or extraction did not run.
extractionStatus"skipped", "validated", "quarantined", "passthrough", "error", nullnoOutcome of the Schema-Inbox extraction stage for this message. Null when extraction did not run.
channel"email", "a2a"yesThe channel this message transited: "email" (external, over SES) or "a2a" (internal Dairo-to-Dairo, which skips SES). Reserved future values (sms, whatsapp, …) are not yet wired.
channelMetadataobject or nullnoChannel-specific metadata bag (per-channel extension point). Inbound email: {sesMessageId, spfVerdict, dkimVerdict, dmarcVerdict, …}. A2A: {receiptId, provenance, provenanceVerified}. A folded outbound send: {providerMessageId, provider, lastEventType, lastEventAt, bouncedAt, complainedAt}.

MessageActionResponse

The result of a Telegram message action (edit/react/unreact).

FieldTypeRequiredDescription
objectstringno
idstringnoThe message id acted on.
channelstringno
editedbooleanno
editedAtstringno
reactedbooleanno
emojistringno
bigbooleanno

MessageAddress

FieldTypeRequiredDescription
addressstringyes
namestring or nullno

MessageAttachment

FieldTypeRequiredDescription
idstring (uuid)yes
filenamestring or nullno
contentTypestring or nullno
sizeBytesinteger or nullno(minimum 0)
contentIdstring or nullno
createdAtstring (date-time) or nullno
messageIdstring (uuid)no
disposition"attachment", "inline", nullno

MessageListResponse

FieldTypeRequiredDescription
messagesarray of Messageyes
paginationPaginationyes

MessageResponse

FieldTypeRequiredDescription
messageMessageyes

MessageTemplateRef

Send by referencing a stored template instead of an inline body. Mutually exclusive with text, html, and react: combining a template with any inline body is a 400. The referenced version is resolved and pinned at request time; supplied variables are validated against that version's variable schema (a bad variable is a synchronous 400). When the version declares a subject template it is used unless an explicit subject is provided on the request.

FieldTypeRequiredDescription
idstringyesTemplate UUID or slug, owned by the authenticated account.
versioninteger (int64)noExplicit version to pin. Omit to resolve and pin the template's current default version at request time. An archived template can only be sent with an explicit version. (minimum 1)
variablesobjectnoValues for the template's declared variables. Validated against the pinned version's variable schema (type, enum, maxLength, url/email format, required, defaults). Serialized size limit: 32 KiB.

NotificationPreference

FieldTypeRequiredDescription
category"account", "billing", "usage", "security", "product"yesThe notification category this preference applies to.
emailEnabledbooleanyesWhether the account receives email notifications in this category. Defaults to true when no preference has been set.

NotificationPreferencesResponse

FieldTypeRequiredDescription
object"notification_preferences"yes
preferencesarray of NotificationPreferenceyesOne entry per notification category, with its resolved emailEnabled flag.

NotificationPreferencesUpdateRequest

FieldTypeRequiredDescription
preferencesobjectyesA partial map of category -> emailEnabled. At least one known category is required; unknown category keys are rejected.

Organization

An organization (project) the account belongs to, with the caller's role.

FieldTypeRequiredDescription
idstring or nullyes
namestringno
slugstringno
vanitySlugstring or nullno
role"owner", "admin", "member", nullyes

OutboundEvent

FieldTypeRequiredDescription
eventIdstringyes
messageIdstring or nullno
providerMessageIdstring or nullno
typestringyesSES event type, e.g. Delivery, Bounce, Complaint.
recipientstring or nullno
occurredAtstring or nullno
subjectstring or nullno
fromstring or nullno
toarray of string or nullno
statusstring or nullno
bounceTypestring or nullno
bounceSubTypestring or nullno
bounceActionstring or nullno
bounceStatusstring or nullno
diagnosticCodestring or nullno
complaintFeedbackTypestring or nullno
complaintUserAgentstring or nullno
complaintSubTypestring or nullno
agentHintstring or nullno

OutboundEventListResponse

FieldTypeRequiredDescription
eventsarray of OutboundEventyes

OutboundMessage

FieldTypeRequiredDescription
idstringyes
fromstring or nullno
toarray of string or nullno
subjectstring or nullno
statusstring or nullno
sentAtstring or nullno
errorstring or nullno
providerMessageIdstring or nullno
lastEventTypestring or nullno
lastEventAtstring or nullno
bouncedAtstring or nullno
complainedAtstring or nullno
createdAtstring or nullno
scheduledAtstring (date-time) or nullnoWhen the email is scheduled to send, for status scheduled. Null for immediate sends.
canceledAtstring (date-time) or nullnoWhen a scheduled email was canceled, for status canceled. Null otherwise.

Pagination

FieldTypeRequiredDescription
nextCursorstring or nullyes

PatchInboxRequest

FieldTypeRequiredDescription
agentstringnoThe inbox agent's display name.
mode"receive_send", "send_only", "receive_only"no

PatchWebhookRequest

FieldTypeRequiredDescription
urlstring (uri)no
eventsarray of "message.received", "message.quarantined", "message.sent", "message.delivered", "message.bounced", "message.complained", "message.delayed", "budget.tripped", "compliance.erasure.completed", "subprocessor.changed", "object.scanned", "share_link.opened", "letter.status_changed", "call.status_changed", "domain.verified"no

PhoneCall

FieldTypeRequiredDescription
object"phone_call"yes
idstring (uuid)yes
direction"outbound", "inbound"yesoutbound for calls placed with POST /v1/phone/calls, inbound for calls answered by a number's inbound agent.
status"queued", "initiating", "ringing", "in_progress", "completed", "failed", "no_answer", "busy", "canceled"yesTerminal: completed, failed, no_answer, busy, canceled.
fromNumberstringyes
toNumberstringyes
instructionsstring or nullno
greetingstring or nullno
voicestring or nullnoThe Dairo Live voice id.
modelstring or nullnoAlways dairo-live.
languagestring or nullno
maxDurationSecondsinteger or nullno
voicemailMessagestring or nullno
queuedAtstring (date-time) or nullno
startedAtstring (date-time) or nullno
answeredAtstring (date-time) or nullno
endedAtstring (date-time) or nullno
durationSecondsinteger or nullno
hangupCausestring or nullno
answeredBystring or nullnohuman or machine, from answering-machine detection.
summarystring or nullno
notesarray of PhoneCallNote or nullnoInbound calls: the caller's structured notes (tasks, notes, reminders, messages).
costUsdnumber or nullnoBilled per started minute: the $0.09/min Dairo Live rate plus the destination's telephony rate. Calls that never connect are free.
errorstring or nullno
metadataobjectno
idempotencyKeystring or nullno
createdAtstring (date-time)yes

PhoneCallCreateRequest

Calls are always recorded. To follow a call's progress subscribe a webhook to the call.status_changed event. The agent hangs up by itself when the person says goodbye.

FieldTypeRequiredDescription
tostringyesDestination, E.164. A real phone rings here.
fromstringyesCaller id, E.164. MUST be a number this account owns with status active.
instructionsstringyesWhat the agent should accomplish. {{name}} placeholders are filled from variables when the call is created; unknown placeholders stay as written. (max length 8000)
greetingstringnoOpening line spoken when the callee answers. Supports {{name}} placeholders filled from variables.
voice"marin", "cedar", "alloy", "ash", "ballad", "coral", "echo", "sage", "shimmer", "verse", "quartz", "ripple", "vesper", "willow", "stone", "gleam", "meridian", "bossa", "tempo", "beacon", "delta", "cinder"noA Dairo Live voice id. marin (default), cedar, alloy, ash, ballad, coral, echo, sage, shimmer and verse are multilingual; quartz, ripple (Australian English), vesper (British English), willow, stone (Irish English), gleam, meridian (North American English), bossa, tempo (Brazilian Portuguese), beacon (Filipino English), delta, cinder (Southern U.S. English). Any other value is a 400. Browse them with GET /v1/phone/voices. (default "marin")
model"dairo-live"noThe call model. Phone calls run on Dairo Live; dairo-live is the only accepted value (any other value is a 400). (default "dairo-live")
languagestringnoISO language code the agent speaks (e.g. en, de).
maxDurationSecondsintegernoHard cap on call length in seconds (30-780). (minimum 30, maximum 780, default 600)
variablesobjectnoValues for {{name}} placeholders in instructions and greeting, filled in at create time. Placeholders without a value stay as written.
voicemailMessagestringnoMessage the agent leaves when the call reaches a voicemail. Without it the agent hangs up silently on a voicemail. (max length 500)
metadataobjectno
idempotencyKeystringnoA retried request returns the original call rather than dialing the human twice.

PhoneCallListResponse

FieldTypeRequiredDescription
object"list"yes
dataarray of PhoneCallyes

PhoneCallNote

FieldTypeRequiredDescription
kind"task", "note", "reminder", "message"yes
textstringyes
duestring or nullyesWhen it is due, as the caller said it (e.g. "tomorrow"), or null.

PhoneCallRecording

FieldTypeRequiredDescription
object"phone_call.recording"yes
callIdstring (uuid)yes
objectIdstring (uuid)yesA Dairo storage object; fetch it through the storage API.

PhoneCallTranscript

FieldTypeRequiredDescription
object"phone_call.transcript"yes
callIdstring (uuid)yes
turnsarray of PhoneCallTranscriptTurnyes

PhoneCallTranscriptTurn

FieldTypeRequiredDescription
role"agent", "caller", "tool"yes
contentstringyes
timestampstring (date-time) or nullno

PhoneNumber

FieldTypeRequiredDescription
object"phone_number"yes
idstring (uuid)yes
phoneNumberstringyesE.164.
countryCodestringyes
numberType"local", "toll_free", "national", "mobile"yes
capabilitiesarray of stringno
status"pending", "active", "releasing", "released", "failed"yespending means the provider reserved the number but regulatory documents are still outstanding (common for German local numbers). It is not an error.
inboxIdstring (uuid) or nullnoWhen set, every inbound call to this number (summary, the caller's notes and the transcript) lands in that inbox as a channel: "voice" message.
agentIdstring (uuid) or nullno
inboundInstructionsstring or nullnoWho the inbound agent is and what the line is for. null = the default assistant that takes messages and notes. (max length 8000)
inboundGreetingstring or nullnoOpening line for inbound calls. null = a short default greeting (by first name for a known contact). (max length 500)
inboundVoice"marin", "cedar", "alloy", "ash", "ballad", "coral", "echo", "sage", "shimmer", "verse", "quartz", "ripple", "vesper", "willow", "stone", "gleam", "meridian", "bossa", "tempo", "beacon", "delta", "cinder", nullnoDairo Live voice id for the inbound agent.
inboundLanguagestring or nullnoISO language code the inbound agent speaks.
monthlyCostUsdnumber or nullno
setupCostUsdnumber or nullno
requirementsobjectnoOutstanding regulatory requirements, when status is pending.
metadataobjectno
purchasedAtstring (date-time) or nullno
releasedAtstring (date-time) or nullno
createdAtstring (date-time)yes

PhoneNumberBuyRequest

FieldTypeRequiredDescription
phoneNumberstringyesE.164, exactly as returned by the availability search.

PhoneNumberListResponse

FieldTypeRequiredDescription
object"list"yes
dataarray of PhoneNumberyes

PhoneNumberReleaseRequest

FieldTypeRequiredDescription
confirmtrueyesReleasing is irreversible: the number returns to the public pool.

PhoneNumberUpdateRequest

At least one property is required. An explicit null unbinds (inboxId, agentId) or resets an inbound* field to its default.

FieldTypeRequiredDescription
inboxIdstring (uuid) or nullno
agentIdstring (uuid) or nullno
inboundInstructionsstring or nullnoWho the inbound agent is and what the line is for. null = the default assistant that takes messages and notes. (max length 8000)
inboundGreetingstring or nullnoOpening line for inbound calls. null = a short default greeting (by first name for a known contact). (max length 500)
inboundVoice"marin", "cedar", "alloy", "ash", "ballad", "coral", "echo", "sage", "shimmer", "verse", "quartz", "ripple", "vesper", "willow", "stone", "gleam", "meridian", "bossa", "tempo", "beacon", "delta", "cinder", nullnoDairo Live voice id for the inbound agent.
inboundLanguagestring or nullnoISO language code the inbound agent speaks.
metadataobjectno

PhoneVoice

FieldTypeRequiredDescription
voiceId"marin", "cedar", "alloy", "ash", "ballad", "coral", "echo", "sage", "shimmer", "verse", "quartz", "ripple", "vesper", "willow", "stone", "gleam", "meridian", "bossa", "tempo", "beacon", "delta", "cinder"yesPass as voice on POST /v1/phone/calls or inboundVoice on a number.
namestringyes
descriptionstring or nullno
language"multilingual", "en", "pt"yes
genderstring or nullno
accentstring or nullno

PostalAddress

A postal address (letter to / from). Requires country plus street (with houseNumber) or poBox; a violation is a 422 whose param names the path, e.g. from.street.

FieldTypeRequiredDescription
namestring or nullno
companystring or nullno
streetstring or nullnoStreet name. Required unless poBox is given.
houseNumberstring or nullnoHouse number; give it with street.
poBoxstring or nullnoPO box. Required unless street is given.
addressLine2string or nullno
postalCodestring or nullno
citystring or nullno
countrystringyesISO 3166-1 alpha-2 country code.

PresignedDownload

FieldTypeRequiredDescription
downloadUrlstring (uri)yesPresigned S3 GET URL.
expiresInSecondsintegeryes(minimum 1, maximum 604800)

PresignedUpload

FieldTypeRequiredDescription
objectIdstring (uuid)yes
uploadUrlstring (uri)yesPresigned S3 PUT URL.
method"PUT"yes
headersmap of stringyesHeaders that MUST be sent with the PUT, exactly as given: the stored Content-Type, the declared type as x-amz-meta-content-type and the filename as x-amz-meta-filename (finalize records both).
expiresInSecondsintegeryes(minimum 1, maximum 604800)

PreviewLetterTemplateRequest

All fields optional; the proof renders with a sample recipient and, by default, left address placement.

FieldTypeRequiredDescription
templateDataobjectnoValues that fill the template's {{placeholders}} for the preview.
addressPlacementLetterAddressPlacementno
output"inline", "url"noinline (default): the PDF as pdfBase64. url: the PDF is stored and a 15-minute pdfUrl is returned with pageCount, pageSize, valid, summary, failedChecks and checks from the layout check, and no base64. (default "inline")

ReactRenderInput

FieldTypeRequiredDescription
sourcestringyesReact Email TSX/JSX component source. Rendered asynchronously by Dairo in an isolated renderer with allowlisted React Email imports. (max length 65536)
propsobjectnoJSON props passed to the default exported email component. Serialized size limit: 32 KiB.

ReactTelegramMessageRequest

Set the bot's emoji reaction on a Telegram message.

FieldTypeRequiredDescription
emojistringyesA single Telegram-allowed reaction emoji (e.g. 👍 👎 ❤ 🔥).
bigbooleannoPlay the big-reaction animation. (default false)

Recipients

Type: string (email) or array of string (email).

RegisterVerificationWaitRequest

FieldTypeRequiredDescription
timeoutSecintegeryesHow long the wait stays open, 30..=1800 seconds. expiresAt = now + timeoutSec. (minimum 30, maximum 1800)
fromHintstring or nullnoOptional sender to accept, case-insensitive: a full address (matched exactly) or a domain (matches that domain and its subdomains, e.g. 'github.com' matches 'noreply@mail.github.com'). Never a substring match. Anything that is not an address or a domain is a 400. A hinted wait resolves only from an authenticated sender: an email whose From domain passed DMARC, or an A2A message from a Dairo inbox on a verified domain or a Dairo address. Null/absent accepts any sender except an email that failed its From domain's DMARC policy. (max length 255)
instructionstring or nullnoNatural-language instruction for the AI matcher: which email to wait for and what to extract (e.g. 'wait for the Telnyx password-reset email and return the reset link'). An EU-resident model evaluates each inbound email against it and, on a match, resolves the wait with the extracted value in result. Absent defaults to extracting any verification/OTP/confirmation code. (max length 2000)
idempotencyKeystring or nullnoOptional idempotency key; a retried register with the same key returns the same wait. (max length 255)

ResidencyResponse

Machine-checkable residency posture + subprocessor list.

FieldTypeRequiredDescription
typestringyes
primaryRegionstringyes
dataResidencystringyes
noUsEgressbooleanyes
controllerParentstringno
cloudActExposedbooleanno
enforcementobjectno
subprocessorsarray of Subprocessoryes
subprocessorListVersionintegeryes
subprocessorListUpdatedAtstring (date-time) or nullno
checkedAtstring (date-time)yes

SendMessageAttachment

An outbound attachment. Provide EITHER inline bytes (contentBase64) OR a storage reference (objectId) — exactly one, never both. Inline attachments require filename and are capped at 8 MiB decoded (API Gateway JSON/base64 envelope). A storage-reference attachment names a Dairo storage object you own (the objectId returned by a bucket upload's finalize, or any owned storage object); Dairo fetches its bytes server-side and native-attaches up to 24 MiB, deriving filename and contentType from the object unless you override them here. Over 24 MiB the send fails with a 413 (create a share link and place it in the body yourself; Dairo never auto-edits the body).

FieldTypeRequiredDescription
filenamestringnoRequired for an inline (contentBase64) attachment. Optional for a storage-reference (objectId) attachment, where it overrides the object's stored filename; when omitted the object's filename is used. (min length 1, max length 120)
contentTypestringnoOptional. For a storage-reference (objectId) attachment, overrides the object's stored content type; when omitted the object's content type is used. (default "application/octet-stream")
contentBase64stringnoBase64-encoded inline attachment bytes. Mutually exclusive with objectId. Dairo inline attachment delivery is capped at 8 MiB decoded total to stay below API Gateway JSON/base64 envelope limits and SES v2 40 MB message limits. For larger files, upload to a Dairo bucket and reference it via objectId (native-attached up to 24 MiB).
objectIdstringnoStorage-reference attachment: the id of a Dairo storage object you own. Mutually exclusive with contentBase64. Dairo resolves the object with an ownership check, fetches its bytes server-side, and native-attaches up to 24 MiB; over that the send fails with a 413 (no share link is auto-added). filename and contentType are derived from the object unless overridden here.
delivery"attachment", "link", "auto"noExplicit delivery mode. 'attachment' sends inline as a normal email attachment. 'auto' sends inline only when safely below inline limits; otherwise callers should use an explicit share-link flow. 'link' never mutates the email body automatically and this send endpoint does not create standalone file links; create/get a Dairo share link first and place it in text/html yourself. (default "attachment")

SendMessageRequest

FieldTypeRequiredDescription
inboxIdstringyes
toRecipientsyes
ccRecipientsno
bccRecipientsno
subjectstringno(default "")
textstringno
htmlstringno
idempotencyKeystringnoBody-level idempotency key kept for current API compatibility. Prefer Idempotency-Key header for new clients. (max length 128)
attachmentsarray of SendMessageAttachmentnoOutbound send attachments. 'attachment' and safe 'auto' sends are inline; current inline API limit is 10 files, 8 MiB per file, 8 MiB total decoded bytes. 'link' is explicit and must be backed by a pre-created Dairo share link placed deliberately in text/html by the caller. (max items 10)
reactReactRenderInputno
templateMessageTemplateRefno
sendAtstring (date-time) or nullnoRFC 3339 timestamp WITH an explicit timezone offset to schedule the send for a future time (max 30 days ahead). Omit to send immediately. A scheduled email starts with status scheduled and can be stopped via POST /v1/outbound-emails/{emailId}/cancel before it fires.
channel"email", "a2a"noOptional explicit delivery channel. "email" forces SES even when every recipient is a Dairo inbox; "a2a" requires every recipient to be a Dairo inbox (400 otherwise) and cannot combine with sendAt. Absent = auto (a2a when all recipients are internal, else email). Unknown values are a 400.
replyTostring (email)noOptional single Reply-To address, set verbatim as the MIME Reply-To header.
inReplyTostringnoOptional RFC 5322 Message-ID this message replies to, with or without angle brackets (normalized to <id@host>). Stamped as the In-Reply-To header and used to place the sent copy in the parent's thread. Takes precedence over a custom In-Reply-To in headers. (max length 250)
referencesarray of stringnoOptional References chain of RFC 5322 Message-IDs (normalized like inReplyTo, deduplicated). Defaults to [inReplyTo] when omitted and inReplyTo is set. Takes precedence over a custom References in headers. (max items 32)
replyToMessageIdstring (uuid)noOptional Dairo message id (from the messages API) to reply to. Resolved server-side into inReplyTo, references (the parent's References plus its Message-ID) and the parent thread. 404 when the message is not visible to the caller; 400 when it disagrees with an explicit inReplyTo.
headersmap of stringnoOptional custom MIME headers ({name: value}). Spoofable/provenance headers are dropped server-side; malformed names or CR/LF are rejected.
tagsmap of stringnoOptional SES message tags ({name: value}), validated against SES tag constraints.
ignoreComplaintsbooleannoOverride complaint suppression for recipients that previously complained. (default false)
contactIdstringnoOptional contact reference: the contact's PRIMARY handle for the sending inbox's channel is added to to, so a send needs no raw address. Accepts a bare contact id, or a contact:<id> / @alias / @me ref. Recipients in to/cc/bcc may ALSO be contact references (@alias, contact:<id>, @me); raw addresses pass through unchanged.
buttonsarray of array of TelegramButtonnoTelegram inline keyboard (Telegram-channel inbox only): rows of {text, url|callback} buttons. A URL button opens a link; a callback button surfaces the tap back to you as an inbound button_tap event and shows a feedback toast on tap (default: ✓ + the button label; set alert:true for a modal).
dryRunbooleannoPer-request dry run, at parity with the letters API's dryRun. When true the request is validated and the sending inbox resolved exactly as a real send would be, then a non-persisted MessagePreview (status "preview") is returned: nothing is created, queued, handed to the provider, metered, or billed. Absent or false is a normal send. Test mode is scoped to the REQUEST, not to the API key — an API key's environment label has no effect on delivery. (default false)

SendMessageResponse

FieldTypeRequiredDescription
idstring (uuid)yes
status"sent", "scheduled", "failed", "queued"yesA single immediate send (POST /v1/emails without sendAt) is performed synchronously and returns 'sent' (with providerMessageId) or 'failed' — it is never accepted as 'queued' only to fail later on something knowable at submit time (oversized attachment, unverified sender, etc.). A scheduled send (sendAt in the future) returns 'scheduled'. 'queued' is returned ONLY for a bulk list broadcast (POST /v1/audiences/{id}/send), whose batches are delivered asynchronously by the worker fleet.
providerMessageIdstring or nullno
errorstring or nullnoPublic-safe failure code/message. Provider/internal text is stored internally and never returned to API clients.
warningsarray of SendMessageWarningyesWarning-only delivery guidance. Complaint suppressions do not block sending; agents should surface these warnings before further contact.
channel"email", "a2a"noThe channel this send transited: "email" (SES) or "a2a" (internal Dairo-to-Dairo, delivered as a receipt, providerMessageId 'a2a_…').
channelMetadataobject or nullnoChannel-specific delivery metadata. For a2a: {receiptId, provenance, provenanceVerified}. For email: provider send metadata.
scheduledAtstring (date-time) or nullnoWhen a scheduled send will fire (RFC3339); present only when status is "scheduled".

SendMessageWarning

FieldTypeRequiredDescription
recipientstring (email)yes
reason"complaint"yes
messagestringyes
sourceMessageIdstring (uuid) or nullnoDairo emailId that originally produced the complaint warning, when known.
providerMessageIdstring or nullnoProvider correlation ID for the complaint event, when known.
complaintFeedbackTypestring or nullno
complaintUserAgentstring or nullno
lastEventAtstring (date-time) or nullno

SetInboxSchemaRequest

FieldTypeRequiredDescription
schemaInboxSchemaContractno
onValidationError"quarantine", "passthrough"noBehaviour when an extracted object fails validation. 'quarantine' (default) holds the message out of message.received and emits message.quarantined; 'passthrough' delivers it with the error attached. (default "quarantine")
extractionHintstring or nullnoOptional free-text hint passed to the extractor as prompt context. Never executed. (max length 1000)

A secure (stateful) share link over a stored object.

FieldTypeRequiredDescription
objectstringno
idstringnoShare-link id (shr_*).
objectIdstring (uuid)no
shareUrlstringnoBranded /s/ share page URL (returned only at create time).
downloadUrlstringnoBranded /d/ download URL (returned only at create time).
hasPasswordbooleanno
maxUsesinteger or nullno
oneTimebooleanno
usesCountintegerno
expiresAtstring (date-time) or nullno
revokedbooleanno
createdAtstring (date-time)no

ShareLinkListResponse

FieldTypeRequiredDescription
objectstringno
dataarray of ShareLinkno

ShareLinkOpensResponse

Open analytics for one secure share link.

FieldTypeRequiredDescription
objectstringno
shareLinkIdstringno
objectIdstring (uuid)no
summaryobjectno
dataarray of objectno

SignedArtifact

A JSON object signed with the org Ed25519 key. The signature commits to the canonical form of every field except alg/kid/signature; a verifier reconstructs those bytes and checks the signature with the public key from JWKS.

FieldTypeRequiredDescription
algstring or nullnoEdDSA, or null when no signing key is configured.
kidstring or nullnoKey id whose public half is published in JWKS.
signaturestring or nullnobase64url (no-pad) Ed25519 signature, or null when unsigned.

SlackApp

A tenant Slack app (managed or BYO). Secret-free - the sealed OAuth client/signing secrets are never returned.

FieldTypeRequiredDescription
idstringyesDairo record id.
appIdstringyesThe Slack app id (e.g. A012ABCD0A0).
clientIdstringyesThe OAuth client id (public; it appears in the install URL).
namestring or nullnoDisplay name the app was created with (null for a BYO import).
origin"managed", "byo"yes'managed' (Dairo minted it via the App Manifest APIs) or 'byo' (imported credentials).
contextMode"mentions", "ambient"yes'mentions' (@mentions + DMs only) or 'ambient' (also channel message events).
ambientMode"off", "store"no'off' (drop ambient chatter) or 'store' (persist it silently, no message.received). Present on list reads; absent on the create response.
statusstringno'active' | 'deleted'. Present on list reads; absent on the create response.
createdAtstringnoISO 8601 creation timestamp. Present on list reads; absent on the create response.

SlackAppAmbientResponse

A Slack app's ambient state after a patch.

FieldTypeRequiredDescription
appIdstringyes
contextMode"mentions", "ambient"yes
ambientMode"off", "store"yes

SlackAppCreateRequest

Create a managed or BYO Slack app. Provide origin='managed' with a configToken, or origin='byo' with the four credential fields.

FieldTypeRequiredDescription
origin"managed", "byo"yes
contextMode"mentions", "ambient"noDefault 'mentions'. 'ambient' also subscribes the app to channel message events.
namestringnomanaged: display name for the app/bot (optional).
configTokenstringnomanaged only: your Slack app-configuration access token (xoxe...). Used once to mint the app, then dropped - never stored.
appIdstringnobyo only: the existing Slack app id.
clientIdstringnobyo only: the OAuth client id.
clientSecretstringnobyo only: the OAuth client secret (sealed at rest).
signingSecretstringnobyo only: the signing secret (sealed at rest).

SlackAppDeleteResponse

Confirmation of a soft-deleted Slack app.

FieldTypeRequiredDescription
appIdstringyes
statusstringyes'deleted'.

SlackAppListResponse

The account's tenant Slack apps.

FieldTypeRequiredDescription
appsarray of SlackAppyes

SlackAppPatchRequest

The only mutable field on a Slack app.

FieldTypeRequiredDescription
ambientMode"off", "store"yes'store' requires a context_mode='ambient' app.

SlackManifestTemplateResponse

A pasteable Slack app manifest for the self-setup flow.

FieldTypeRequiredDescription
manifestobjectyesThe Slack app manifest JSON to paste into Slack's 'Create app from manifest' flow.

SlackOauthStartResponse

The signed Slack OAuth install URL to present as an "Add to Slack" button.

FieldTypeRequiredDescription
urlstringyeshttps://slack.com/oauth/v2/authorize URL carrying the app's bot scopes and a signed, single-use state (10-minute expiry).

Subprocessor

FieldTypeRequiredDescription
namestringyes
rolestringyes
regionstringyes
countrystring or nullno
urlstring or nullno
status"active", "removed"yes

TelegramButton

A Telegram inline-keyboard button: a text label plus exactly one of url (a http/https/tg link) or callback (an opaque action string surfaced back to you as an inbound button_tap event). A callback button shows a feedback toast on tap (default: ✓ + the button label); set alert:true for a modal. feedback/alert are ignored on a url button.

FieldTypeRequiredDescription
textstringnoButton label (1-64 chars).
urlstringnoA http://, https://, or tg:// link opened on tap. Mutually exclusive with callback.
callbackstringnoAn opaque action string. On tap it is surfaced back to you as an inbound button_tap message + a message.button.tapped event. Mutually exclusive with url.
feedbackstringnoCallback-button only: the toast text shown to the tapping user (answerCallbackQuery text, max 200 chars). Defaults to '✓ <button label>' when omitted, so every tap gives visible feedback. Ignored on a url button.
alertbooleannoCallback-button only: when true, the feedback is shown as a modal dialog (show_alert) instead of a transient toast. Ignored on a url button.

TelegramVoice

FieldTypeRequiredDescription
slugstringyesStable handle; use as telegram.voice.voiceId.
namestringyes
descriptionstring or nullno
bestLanguagestring or nullno
languagesarray of stringno
genderstring or nullno
tagsarray of stringno
featuredbooleanyes
popularityintegerno

Template

FieldTypeRequiredDescription
idstring (uuid)yes
slugstringyes
namestringyes
descriptionstring or nullno
currentVersioninteger or nullno
statusstringyes
createdAtstring (date-time)yes
updatedAtstring (date-time)yes

TemplateCreateRequest

FieldTypeRequiredDescription
slugstringyes
namestringyes(min length 1)
descriptionstringno
sourcestringyesReact Email TSX source for version 1.
subjectstringno
variablesTemplateVariableSchemano
notesstringno

TemplateDeleteResponse

FieldTypeRequiredDescription
deletedbooleanyes
idstring (uuid)yes

TemplateDetailResponse

FieldTypeRequiredDescription
templateTemplateyes
versionTemplateVersionDetailyes

TemplateListResponse

FieldTypeRequiredDescription
templatesarray of Templateyes

TemplatePatchRequest

FieldTypeRequiredDescription
namestringno(min length 1)
descriptionstring or nullno
currentVersionintegerno(minimum 1)

TemplateResponse

FieldTypeRequiredDescription
templateTemplateyes

TemplateVariableSchema

JSON-Schema-lite variable contract: a flat map of variable name to declaration.

Type: map of object.

TemplateVersion

FieldTypeRequiredDescription
versionintegeryes
subjectstring or nullno
variablesobjectyes
notesstring or nullno
createdAtstring (date-time)yes

TemplateVersionDetail

FieldTypeRequiredDescription
versionintegeryes
sourcestringyes
subjectstring or nullno
variablesobjectyes
notesstring or nullno
createdAtstring (date-time)yes

TemplateVersionDetailResponse

FieldTypeRequiredDescription
templateIdstring (uuid)yes
versionTemplateVersionDetailyes

TemplateVersionListResponse

FieldTypeRequiredDescription
templateIdstring (uuid)yes
versionsarray of TemplateVersionyes

TemplateVersionRequest

FieldTypeRequiredDescription
sourcestringyesReact Email TSX source for the new version.
subjectstringno
variablesTemplateVariableSchemano
promotebooleannoAdvance currentVersion to this version. Defaults to true.
notesstringno

TemplateVersionResponse

FieldTypeRequiredDescription
templateTemplateyes
versionTemplateVersionyes
warningsarray of stringyes

Thread

FieldTypeRequiredDescription
idstring (uuid)yes
inboxIdstring (uuid)yes
subjectstringyes
messageCountintegeryes(minimum 0)
lastMessageAtstring (date-time) or nullyes
updatedAtstring (date-time)yes
statusstringyes
lastMessagePreviewstring or nullyes
createdAtstring (date-time)yes
channel"email", "a2a"yesThe channel this message transited: "email" (external, over SES) or "a2a" (internal Dairo-to-Dairo, which skips SES). Reserved future values (sms, whatsapp, …) are not yet wired.

ThreadListResponse

FieldTypeRequiredDescription
threadsarray of Threadyes
paginationPaginationyes

ThreadResponse

FieldTypeRequiredDescription
object"thread"no
idstring (uuid)yes
inboxIdstring (uuid)yes
subjectstringyes
messageCountintegeryes(minimum 0)
lastMessageAtstring (date-time) or nullyes
updatedAtstring (date-time)yes
statusstringyes
lastMessagePreviewstring or nullyes
createdAtstring (date-time)yes
channel"email", "a2a"yesThe channel this message transited: "email" (external, over SES) or "a2a" (internal Dairo-to-Dairo, which skips SES). Reserved future values (sms, whatsapp, …) are not yet wired.
messagesarray of Messageyes

UpdateApiKeyRequest

At least one of name, allowedIps or inboxIds is required. scopes is deliberately absent: scopes are immutable after mint, and revoking is DELETE on this same path. Sending either is a 400 rather than a silently-ignored no-op.

FieldTypeRequiredDescription
namestringnoNew display name. Omit to leave it unchanged; null is rejected with 400 rather than silently ignored.
allowedIpsarray of stringnoReplaces the whole allowlist; it never merges. Omit the field to leave the current allowlist unchanged, or pass an empty array to clear it so the key may authenticate from any IP. Entries are IPv4/IPv6 addresses or CIDR ranges (up to 50); deny-by-default, so a correct secret from an unlisted IP is rejected with 403. Explicit null is rejected with 400 — unlike on create it does not mean any IP here, and it used to be a silently-ignored no-op.
inboxIdsarray of string (uuid)noReplaces the whole per-inbox restriction; it never merges. Omit to leave it unchanged, or pass an empty array to clear it so the key may send as any inbox. A restricted key may only ever narrow to a subset of its own inboxes — it cannot unpin itself or a sibling. Explicit null is rejected with 400: unlike on create it does not mean unrestricted here, it would change nothing.

UpdateBucketRequest

FieldTypeRequiredDescription
displayNamestring or nullno(max length 256)
descriptionstring or nullno(max length 1024)
metadataobject or nullno

UpdateLetterTemplateRequest

Partial update. Provide at least one of name, html, variables, or status.

FieldTypeRequiredDescription
namestringno
htmlstringno
variablesarray of string or LetterTemplateVariable or objectnoDeclared template variables. Preferred: [{name, type?, example?, label?}]. Also accepted: an array of names, or an object {name: type}. Stored and returned in the preferred shape.
statusLetterTemplateStatusno

VerificationWait

A durable await_verification wait. status is pending until it resolves (a code was extracted from an inbound message) or expires (deadline passed / canceled). Resolution outputs (result, from, messageId, resolvedAt) are present only once resolved.

FieldTypeRequiredDescription
waitIdstring (uuid)yes
inboxIdstring (uuid)yes
agentIdstring (uuid) or nullnoThe Agent Passport that registered this wait, when the API key was agent-bound.
status"pending", "resolved", "expired"yes
fromHintstring or nullno
instructionstring or nullnoThe natural-language matcher instruction this wait was registered with.
resultstring or nullnoThe value the AI matcher extracted per the instruction (present once resolved) — a code, a link, or a quoted line.
fromstring or nullnoThe From address of the message that resolved the wait.
messageIdstring (uuid) or nullnoThe inbound message that resolved the wait.
idempotencyKeystring or nullno
expiresAtstring (date-time)yes
createdAtstring (date-time)yes
resolvedAtstring (date-time) or nullno
expiredAtstring (date-time) or nullno

VerificationWaitListResponse

FieldTypeRequiredDescription
waitsarray of VerificationWaityes

Webhook

FieldTypeRequiredDescription
object"webhook"yes
idstring (uuid)yes
urlstring (uri)yes
eventsarray of "message.received", "message.quarantined", "message.sent", "message.delivered", "message.bounced", "message.complained", "message.delayed", "budget.tripped", "compliance.erasure.completed", "subprocessor.changed", "object.scanned", "share_link.opened", "letter.status_changed", "call.status_changed", "domain.verified"yes
labelstring or nullnoOptional human label for the endpoint, or null when unlabeled.
status"active", "paused"yes
createdAtstring (date-time)yes
lastDeliveryAtstring (date-time) or nullnoTimestamp of the most recent successful webhook delivery, or null before the first successful delivery.
secondarySecretExpiresAtstring (date-time) or nullnoEnd of the dual-secret window after a rotation, or null.
secondarySecretActivebooleannoWhether deliveries are still signed with the previous secret too.
consecutiveFailuresintegerno
pausedReasonstring or nullnoauto:delivery_failures when the circuit breaker paused the endpoint, else null.
autoPausedbooleanno
autoPausedAtstring (date-time) or nullno

WebhookListResponse

FieldTypeRequiredDescription
webhooksarray of Webhookyes

WhoamiApiKey

FieldTypeRequiredDescription
idstringyes
scopesarray of stringyes

WhoamiResponse

FieldTypeRequiredDescription
userIdstringyes
projectIdstring or nullno
apiKeyWhoamiApiKeyyes
planstringyes
limitsobjectyes
usageobjectyes
periodobjectyes
notesobjectyes
storageWhoamiStorageyes
organizationActiveOrganizationno
organizationsarray of OrganizationnoEvery organization the account is a member of (the org switcher list).
lettersobjectnoPhysical-mail status for this account, so you know before sending whether a letter will really be printed.

WhoamiStorage

FieldTypeRequiredDescription
usedBytesinteger (int64)yes
limitBytesinteger (int64)yes
remainingBytesinteger (int64)yes
breakdownWhoamiStorageBreakdownyes

WhoamiStorageBreakdown

FieldTypeRequiredDescription
mailBodyBytesinteger (int64)yes
attachmentBytesinteger (int64)yes
fileBytesinteger (int64)yes
expiringFileBytesinteger (int64)yes
activeFileObjectsinteger (int64)yes

On this page

ActiveOrganizationAgentBindRequestAgentBindResponseAgentCreateRequestAgentListResponseAgentPassportAgentReputationAgentReputationClearResponseAgentReputationListResponseAgentResponseApiKeyApiKeyListResponseAttachmentDownloadUrlResponseAudienceAudienceCreateRequestAudienceDeleteResponseAudienceDetailResponseAudienceListResponseAudienceMemberAudienceMembersRequestAudienceMembersResponseAudienceResponseAuditExportManifestAuditExportResponseAuditExportRowAuditLogEventAuditLogListResponseAvailablePhoneNumberAvailablePhoneNumberListResponseBatchDeleteBucketObjectsRequestBatchDeleteMessagesRequestBatchDeleteResultBatchRecipientBroadcastBroadcastRequestBucketBucketListResponseBucketObjectBucketObjectListResponseBudgetBudgetLimitsBudgetListResponseBudgetResponseBudgetSetRequestBudgetUsageCancelOutboundMessageResponseContactContactCreateRequestContactDetailResponseContactHandleContactHandleInputContactHandleResponseContactListResponseContactUpdateRequestCreateApiKeyRequestCreateApiKeyResponseCreateBucketObjectRequestCreateBucketRequestCreateDomainRequestCreateInboxRequestCreateLetterBatchRequestCreateLetterRequestCreateLetterTemplateRequestCreateShareLinkRequestCreateWebhookRequestCreateWebhookResponseDeleteResponseDeletionCertificateDnsRecordDomainDomainListResponseEditTelegramMessageRequestEraseRequestErasureJobErasureJobAcceptedErasureJobDeletedCountsErasureJobResponseErrorErrorResponseEventLedgerPageEventReplayBoundEventReplayRequestEventReplayResultInboxInboxListResponseInboxSchemaContractInboxSchemaDeleteResponseInboxSchemaResponseLedgerEventLedgerGapLetterLetterAddressPlacementLetterBatchLetterBatchCreateResponseLetterDeliveryLetterEventLetterEventListLetterFileRefLetterListLetterMoneyLetterPaperTypeLetterPaymentLetterPaymentPartyLetterPriceLetterPriceRequestLetterPrintModeLetterPrintOptionsLetterRequirementsLetterSidesLetterStatusLetterTemplateLetterTemplateListLetterTemplatePreviewLetterTemplateStatusLetterTemplateVariableLetterVerificationLetterVerificationCheckLetterVerifyRequestMessageMessageActionResponseMessageAddressMessageAttachmentMessageListResponseMessageResponseMessageTemplateRefNotificationPreferenceNotificationPreferencesResponseNotificationPreferencesUpdateRequestOrganizationOutboundEventOutboundEventListResponseOutboundMessagePaginationPatchInboxRequestPatchWebhookRequestPhoneCallPhoneCallCreateRequestPhoneCallListResponsePhoneCallNotePhoneCallRecordingPhoneCallTranscriptPhoneCallTranscriptTurnPhoneNumberPhoneNumberBuyRequestPhoneNumberListResponsePhoneNumberReleaseRequestPhoneNumberUpdateRequestPhoneVoicePostalAddressPresignedDownloadPresignedUploadPreviewLetterTemplateRequestReactRenderInputReactTelegramMessageRequestRecipientsRegisterVerificationWaitRequestResidencyResponseSendMessageAttachmentSendMessageRequestSendMessageResponseSendMessageWarningSetInboxSchemaRequestShareLinkShareLinkListResponseShareLinkOpensResponseSignedArtifactSlackAppSlackAppAmbientResponseSlackAppCreateRequestSlackAppDeleteResponseSlackAppListResponseSlackAppPatchRequestSlackManifestTemplateResponseSlackOauthStartResponseSubprocessorTelegramButtonTelegramVoiceTemplateTemplateCreateRequestTemplateDeleteResponseTemplateDetailResponseTemplateListResponseTemplatePatchRequestTemplateResponseTemplateVariableSchemaTemplateVersionTemplateVersionDetailTemplateVersionDetailResponseTemplateVersionListResponseTemplateVersionRequestTemplateVersionResponseThreadThreadListResponseThreadResponseUpdateApiKeyRequestUpdateBucketRequestUpdateLetterTemplateRequestVerificationWaitVerificationWaitListResponseWebhookWebhookListResponseWhoamiApiKeyWhoamiResponseWhoamiStorageWhoamiStorageBreakdown