> ## Documentation Index
> Fetch the complete documentation index at: https://docs.wazobiamail.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# API responses and privacy

> Customer-facing response fields, tracking receipts and safe errors.

# API responses and privacy

Customer endpoints return only information needed to use your account. These
rules apply to API-key requests and the customer dashboard. Operational details
remain in administrator diagnostics; API keys cannot access those diagnostics.

## Response envelope

```json theme={null}
{"success":true,"message":"Message accepted for delivery","data":{"result":{"status":"queued","trackingId":"YOUR_TRACKING_ID","recipients":1}}}
```

Use `success` and the HTTP status to handle the outcome. A successful send means
queued, not delivered. Save `trackingId` and use the tracking endpoints for
subsequent status, delivery, bounce, open and click counts.

The sending receipt contains only:

| Field | Meaning |
| - | - |
| `status` | `queued` after acceptance |
| `trackingId` | Public identifier for following this message |
| `recipients` | Number of accepted recipients |

Internal delivery-provider names/IDs, tenant routing, queue/job IDs, relay
assignments, worker retry policy, storage keys and raw upstream responses are
not part of the customer contract. Do not depend on undocumented fields.

## JSON field names

API-owned JSON fields use **camelCase**: `accountId`, `planId`, `createdAt`,
`invoiceId` and `verificationStatus`. This applies to successful responses and
validation field names. Status and enum values such as `pending_payment` keep
their documented spelling. HTTP header names and path parameter placeholders
are not JSON field names.

List responses that include pagination use:

```json theme={null}
{"items":[],"pagination":{"page":1,"pageSize":25,"totalItems":0,"totalPages":1,"hasNext":false,"hasPrev":false}}
```

`hasNext` and `hasPrev` are optional; some endpoints return only page and total
counts. Mailbox listing still returns an array directly in `data`. This update
changes field names, not the existing list wrappers or pagination behaviour.

Older releases returned `page_size`, `total_items`, `total_pages`, `has_next`
and `has_prev` in plan, invoice and chat pagination. Read the camelCase names
above when updating an integration. SDK models may expose language-native
properties (for example Python's `page_size`) while reading camelCase JSON.

User-defined maps, message content and fields belonging to an external protocol
retain their original keys. They are not recursively renamed.

The official SDKs apply the same rule when decoding responses: API-owned fields
are read by their camelCase names, legacy snake\_case aliases are accepted and
then removed, and camelCase wins when both spellings are present. Unknown keys,
user-defined maps and third-party payloads are preserved unchanged. The raw HTTP
response remains exactly as documented above.

## Tracking and activity

Message lists retain the tracking identifier, subject, sender address,
recipients, delivery and engagement counts, statuses and timestamps. Individual
events retain their
ID, type, recipient address, clicked URL and occurrence time. Provider event IDs,
provider message IDs, event sources and raw delivery metadata are omitted.

Customer activity pages and CSV/NDJSON exports expose the same reduced details.
Metadata is limited to customer-useful descriptions, amounts, units, domain
setup state and public tracking identifiers. Infrastructure errors and worker
state are not exported.

## Other customer endpoints

* Mailbox records contain your mailbox identity and status, without backend
  provider names or provider mailbox IDs.
* Client-connection settings still include the public SMTP/IMAP/POP3 hostnames,
  ports, security mode and username required to configure your mail app.
* Account status contains plan and sending-credit information, without database
  or Redis health diagnostics.
* Domain search returns quote identifiers, domain names, customer prices,
  currency, expiry and availability. Supplier identities, wholesale prices and
  supplier error messages are omitted. Use the quote ID when purchasing.
* Payment-method identifiers remain available because checkout needs the chosen
  payment method. DNS-provider detection describes your domain's public DNS
  provider so you can complete DNS setup; it does not identify the email backend.
* Invoice metadata retains customer billing amounts and domain-registration
  progress, without raw gateway responses or internal processing leases.
* File-upload receipts contain `fileName`, `contentType` and `sizeBytes`.
  `publicUrl` is returned only when public attachment hosting is configured;
  internal storage endpoints and object keys are not returned.

Newly issued API keys and mailbox passwords are intentional one-time outputs.
Save them securely. Contact-sync cursors remain available to the applications
that require them. Stored encrypted credentials, credential hashes and service
secrets are never returned.

## Errors

Errors use the appropriate HTTP status and a safe message:

```json theme={null}
{"success":false,"statusCode":503,"message":"This service is temporarily unavailable. Please try again shortly."}
```

A validation failure (422) also lists the field that failed and the text to
fix it. Every value is a plain string:

```json theme={null}
{"success":false,"statusCode":422,"message":"Validation failed","errors":{"email":"A valid email is required"}}
```

SDK errors expose the same details: the HTTP status, the envelope `statusCode`
(and legacy `status_code`), the `errors` validation map, the API's own `code`
when present, and the `x-request-id` header. Names are language-native, such as
`apiCode`/`api_code` and `requestId`/`request_id`.

Service failures do not expose
upstream response bodies, configuration variable names or internal URLs. If a
send outcome is uncertain, check message activity before retrying to avoid a
duplicate message. Keep the response request ID when contacting support.

## Migrating existing integrations

Replace reads of `upstream.trackingId` with `data.result.trackingId`. Remove
references to `provider`, `providerCode`, `jobId`, `queuedBy`, `routingMode`,
`maxAttempts`, raw event metadata and upload storage keys. Use documented public
IDs and status fields. Ordinary send requests can omit `envelopeSender`; the
API aligns the envelope with the selected mailbox or the route's managed bounce
address. Caller input does not override that selection. See
[Sending email](https://docs.wazobiamail.com/docs/guides/sending.md) for sender selection and fallback behavior.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.