{"openapi":"3.1.0","info":{"title":"Mailionaire API","summary":"Order, track, and manage Microsoft 365 cold-email mailboxes programmatically.","description":"\nThe Mailionaire API lets you do programmatically what the portal does: check\nprovisioning capacity, order Microsoft 365 mailboxes for your domains\n(up to 100 per domain; 50 is the\nrecommended density), track order progress, and inspect your domains,\nmailboxes, and sender-connection status.\n\n## Authentication\n\nEvery request needs an API key in the `Authorization` header:\n\n```\nAuthorization: Bearer mk_live_...\n```\n\nKeys are issued per account, can be revoked at any time, and are shown only\nonce at creation — store them securely. Requests without a valid key return\n`401 invalid_api_key`. Suspended accounts return `403 billing_suspended`.\n\n## Test mode\n\nThe key prefix chooses the environment. Same base URL, same routes, same\nrequest and response shapes:\n\n| Prefix | Environment | Provisions real mailboxes | Charged |\n| --- | --- | --- | --- |\n| `mk_live_` | live | yes | yes |\n| `mk_test_` | sandbox | no | no |\n\n`GET /me` returns `environment` so a deployment can confirm which one it is\npointed at without parsing the key itself.\n\nMint a test key with `POST /keys` and `{\"environment\": \"sandbox\"}`. Your\nsandbox account is created on first use, pre-loaded with a few `.test` domains\nto order against — a test key cannot buy domains, because buying is one of the\nthings test mode does not do.\n\nIn the sandbox:\n\n* `POST /orders` needs no Stripe Checkout and never returns `402`. There is\n  nothing to charge, so there is nothing to confirm.\n* Orders run the real state machine — `queued` → `prepared` → `running` →\n  `completed` — on a compressed clock, roughly fifteen seconds end to end.\n  Poll it exactly as you would poll a live order.\n* Webhooks fire normally, with the same event types, the same body and the same\n  `X-Mailionaire-Signature`. Verify signatures in test mode and the live path is\n  already proven.\n* No tenant is ordered, no Microsoft mailbox is created, no DNS record is\n  written, no invoice line appears. Sandbox data is a separate account: it can\n  never show up in your live domains, mailboxes, usage or invoices.\n\nA test key cannot mint a live key (`403 environment_escalation`), so a leaked\ntest credential is worth nothing against production.\n\n## Rate limits\n\n* **300 requests/minute per API key** across all endpoints (~5 req/s).\n* **`POST /orders` additionally capped at 10/minute per key.**\n\nWhen you exceed a limit the API returns `429 rate_limit_exceeded` with a\n`Retry-After` header (seconds). Limits use a rolling 60-second window.\n\n## Billing\n\nOrdering mailboxes on a paid plan requires a completed Stripe Checkout.\nWithout a valid billing confirmation, `POST /orders` returns\n**`402 payment_required`** — the API never provisions unpaid work. Call\n`POST /billing/order-confirmations` with the domain set and order idempotency\nkey first. Existing subscribers receive the `billing_confirmation_token`\ndirectly after the saved payment method or account credit is charged. A first\norder receives a hosted Stripe `checkout_url`; after a human completes it,\nexchange its session at `POST /billing/order-confirmations/confirm`. Then call\n`POST /orders` with the returned token and the same `idempotency_key`.\n\n## Errors\n\nAll errors share one envelope:\n\n```json\n{\n  \"error\": {\n    \"code\": \"machine_readable_code\",\n    \"message\": \"Human-readable explanation.\",\n    \"fix_hint\": \"What to do next (when known).\",\n    \"param\": \"offending_field (when known)\"\n  }\n}\n```\n\n| HTTP | code | Meaning |\n| --- | --- | --- |\n| 401 | `invalid_api_key` | Key missing, malformed, expired, or revoked. |\n| 402 | `payment_required` | Order needs a completed Stripe Checkout first. |\n| 403 | `billing_suspended` | Account suspended; resolve billing in the portal. |\n| 403 | `invalid_billing_confirmation` | Billing confirmation doesn't match this order/customer/domain. |\n| 404 | `order_not_found` / `job_not_found` / `asset_missing` | Resource doesn't exist for this account. |\n| 409 | `idempotency_conflict` / `tenant_order_in_progress` | Conflicting or in-flight duplicate work. |\n| 422 | `invalid_request` | Request body/params failed validation. |\n| 429 | `rate_limit_exceeded` | Slow down; honor `Retry-After`. |\n| 5xx | — | Transient server error; safe to retry with the same `idempotency_key`. |\n\n## Ordering flow (happy path)\n\n1. `GET /domains/available` — choose a registrar-owned domain that is ready to\n   order.\n2. `GET /workspaces`, then `PUT /domains/{domain}/workspace` — validate and\n   save the sequencer destination before anything is billed. Sandbox domains\n   are already assigned to the built-in `Sandbox` workspace. For native sending,\n   call `GET /workspaces?provider=mailionaire` and assign that workspace with\n   `provider=mailionaire`.\n3. `GET /capacity?domains=1` — confirm `can_start` is `true` (otherwise the\n   response carries a concrete `capacity_ready_at` ETA).\n4. `POST /billing/order-confirmations` for the domain and your idempotency key.\n5. `POST /orders` with the returned billing token, the same key, your domain,\n   `mailbox_count`, and a name mode. Set `sequencer_provider=mailionaire` for\n   native Graph sending and `warmup_provider=instantly` for separate warmup.\n6. Poll `GET /orders/{order_id}` until `status` is `completed`\n   (mailboxes provisioned and connected to your sequencer).\n7. `GET /domains/{domain}/mailboxes` — see every mailbox and its sender\n   connection status.\n8. When login credentials are needed, explicitly call\n   `POST /domains/{domain}/mailboxes/export` and protect the downloaded CSV.\n\nOrdinary mailbox and status reads never include passwords. The explicit CSV\nexport does because it is a sensitive, audited action. Connect these Microsoft\nmailboxes with **Office 365 / Outlook OAuth**. Do not use a custom IMAP/SMTP\nconnection.\n\n## Webhooks\n\nRather than polling, register an endpoint and we push lifecycle events to it.\n\n* `POST /webhooks` with a `url` and `events[]` — returns the endpoint plus a\n  signing `secret` **shown only once**.\n* Events: `order.created`, `order.completed`, `order.failed`, `domain.ready`,\n  `domain.canceled`.\n* Each delivery is a JSON `POST` — body `{id, type, created_at, data}` — with\n  `X-Mailionaire-Signature: sha256=<hmac>` (HMAC-SHA256 of\n  `\"{timestamp}.{body}\"` using your secret) and `X-Mailionaire-Timestamp`.\n  Recompute the signature and compare in constant time before trusting a payload.\n* Delivery is out-of-band and retried (3 attempts with backoff). After\n  15 consecutive failures an endpoint auto-disables.\n* `POST /webhooks/{id}/test` sends a sample `ping` to verify your wiring.\n","contact":{"name":"Mailionaire Support","email":"support@mailionaire.ch"},"version":"1.0.0"},"servers":[{"url":"/v1","description":"This deployment"},{"url":"https://api.mailionaire.ch/v1","description":"Production"}],"paths":{"/me":{"get":{"tags":["Account"],"summary":"Get your account","description":"Return the account and plan resolved from the API key.\n\nUse this to verify a key works, to read which `environment` the key\naddresses (`live` or `sandbox`), and to inspect plan limits before\nplacing orders.\n\nA deployment that is unsure whether it is pointed at test or production\nshould call this on boot rather than parsing the key prefix itself.","operationId":"public_me_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicAccountResponse"}}}},"401":{"description":"Invalid API key"}}}},"/capacity":{"get":{"tags":["Capacity"],"summary":"Check provisioning capacity","description":"Check whether we can start provisioning `domains` domains right now.\n\nWhen `can_start` is false the response includes a human-readable\n`message` and — when the warm pool can predict it — a concrete\n`capacity_ready_at` ETA. No payment is taken while capacity is not\nready, so check this before starting checkout.","operationId":"public_capacity_capacity_get","parameters":[{"name":"domains","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"description":"How many domains you plan to order for.","default":1,"title":"Domains"},"description":"How many domains you plan to order for."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicCapacityResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/domains":{"get":{"tags":["Domains"],"summary":"List your domains","description":"List every domain on your account with provisioning and sending state.\n\n`status` and `setup` say where a domain is in its lifecycle. Neither can\nsay whether mail arrives: a domain can be finished, exported and\nsending, and still publish an MX record that leads nowhere.\n`mail_reachability` is that separate fact, measured against public\nresolvers.\n\nIt has three values: `reachable` (a Microsoft MX is published and its\ntarget resolves), `unreachable` (provably not reachable — `reason` says\nwhy), and `unknown` (no verdict: not measured, not measurable, or not\nours to judge). `unknown` is **not a failure** — alert on `unreachable`\nonly, or every domain nobody has measured yet becomes an alert on your\nfirst day.\n\nWhen `unreachable`, `reason` names four causes, four different fixes:\n\n* `mx_target_unresolvable` — the MX record names a hostname that does\n  not exist in DNS, so mail is rejected outright. Ask us to re-apply the\n  Microsoft MX record.\n* `mx_missing` — the domain resolves and publishes no MX record, so\n  nothing routes mail to these mailboxes. Ask us to apply the Microsoft\n  MX record.\n* `domain_unresolvable` — the domain itself is not in DNS at all\n  (NXDOMAIN): a lapsed registration or missing nameservers. Nothing on\n  the domain works, not just mail. Check the registration and\n  nameservers with your registrar; there is no record to fix until the\n  domain resolves again.\n* `mx_foreign` — mail is routed to another provider, not to the tenant\n  we set up. Deliberate if you front the domain with a gateway;\n  otherwise ask us to re-apply the Microsoft MX record.\n\nWhen `unknown`, `reason` is `not_checked` (never measured),\n`resolver_unavailable` or `mx_target_lookup_unavailable` (the DNS lookup\nfailed, which is evidence of nothing), `setup_incomplete` (setup is\nstill running, so our MX is not published yet), or\n`mx_not_managed_by_us` (a domain you brought, routing its own mail —\nyours to decide, not ours to call broken). `checked_at` is when the\nverdict was measured, or `null` if it never was; the verdict refreshes\nin the background, so a read never waits on DNS.","operationId":"public_domains_domains_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicDomainListResponse"}}}}}},"post":{"tags":["Domains"],"summary":"Provision mailboxes for a domain","description":"Order mailboxes for one of your registrar-owned domains.\n\nA domain-centric alias of `POST /orders`: it runs the identical order\npath — same fail-closed billing gate (402 `payment_required` without a\nStripe confirmation on paid plans), same provisioning — keyed on\n`root_domain` with `mailbox_count` defaulting to the recommended 50.\nBefore billing, choose the sequencer destination with\n`PUT /domains/{domain}/workspace`. That call validates and materializes\na fresh registrar domain on the account. A domain not present at the\nconnected registrar returns `404`.","operationId":"public_domain_order_domains_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicDomainOrderRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicOrderCreateResponse"}}}},"402":{"description":"Payment required — complete Stripe Checkout first."},"404":{"description":"Domain is not approved on this account."},"409":{"description":"Idempotency conflict or an order is already in flight for this domain."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/domains/available":{"get":{"tags":["Domains"],"summary":"List domains available to order","description":"List registrar-owned domains that can be selected for a new order.\n\n`GET /domains` is the lifecycle view: it contains domains already\nmaterialized on the account. This endpoint is the order picker — the\nsame available registrar inventory the portal shows before an order.\nIt never performs a registrar sync; call\n`POST /connections/registrar/sync` explicitly when fresh remote state\nis required.","operationId":"public_available_domains_domains_available_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicAvailableDomainListResponse"}}}}}}},"/workspaces":{"get":{"tags":["Orders"],"summary":"List sequencer workspaces","description":"List workspaces for the chosen sending provider.\n\nCredentials and credential scope identifiers are never returned. In\nsandbox, domains are already assigned to the built-in `Sandbox`\nworkspace, so no assignment call is needed before a test order. Use\n`provider=mailionaire` for native sending workspaces.","operationId":"public_workspaces_workspaces_get","parameters":[{"name":"provider","in":"query","required":false,"schema":{"enum":["emailbison","mailionaire"],"type":"string","default":"emailbison","title":"Provider"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicWorkspaceListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/domains/{domain}/workspace":{"put":{"tags":["Orders"],"summary":"Assign a domain to a sequencer workspace","description":"Choose where this domain's mailboxes will be connected.\n\nDo this before the billable `POST /billing/order-confirmations` call.\nIt validates both the registrar domain and workspace first, so a typo\ncannot charge the account and only then fail provisioning. The route\naccepts the stable id from `GET /workspaces`; the exact workspace name\nis also accepted for clients whose sequencer does not expose ids. Set\n`provider=mailionaire` for native Graph sending.","operationId":"public_domain_workspace_assign_domains__domain__workspace_put","parameters":[{"name":"domain","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":255,"title":"Domain"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicDomainWorkspaceRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicDomainWorkspaceResponse"}}}},"404":{"description":"Domain is not present at the connected registrar."},"409":{"description":"Sequencer is not connected or has no visible workspaces."},"422":{"description":"Workspace is not visible to this account."}}}},"/orders":{"post":{"tags":["Orders"],"summary":"Order mailboxes for a domain","description":"Order `mailbox_count` mailboxes on `domain` and connect them to your sequencer.\n\nName modes:\n\n* **automatic** — one unique realistic person per mailbox, generated\n  deterministically from the domain (identical to the portal's\n  Automatic mode).\n* **names** — provide 1–9 people in `names`; we derive natural\n  localpart variations.\n* **csv** — provide every mailbox yourself in `mailboxes`\n  (`localpart` + display `name`), exactly `mailbox_count` rows.\n\nPass an `idempotency_key` to make retries safe. On paid plans call\n`PUT /domains/{domain}/workspace` first, then call\n`POST /billing/order-confirmations` and pass its\n`billing_confirmation_token` and the same idempotency key here —\nwithout that proof this endpoint returns `402 payment_required` and\ncreates nothing.\n\nOpt-in customer-owned Graph apps use `sequencer_provider=customer_graph`\nwith `graph_profile_id` and an explicit `graph:write` key scope. Bind\nthe profile and prepare `/domains/{domain}/graph-integration/provisioning-destination`\nbefore billing; no external sequencer connection is required. Live Graph\norders have a separate default-off flag and retain the same billing gate.\nTheir job stays blocked until app access is authorized and scope verified.","operationId":"public_order_create_orders_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicOrderCreateRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicOrderCreateResponse"}}}},"402":{"description":"Payment required — complete Stripe Checkout first.","content":{"application/json":{"example":{"error":{"code":"payment_required","message":"Active-domain mailbox provisioning requires a paid order confirmation.","param":"billing_confirmation_token","fix_hint":"Start the mailbox order from Stripe Checkout and retry with the returned billing confirmation."}}}}},"409":{"description":"Idempotency conflict or an order is already in flight for this domain."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Orders"],"summary":"List your orders","description":"List your orders, newest first.\n\nReturns a lightweight summary per order (domain, mailbox count, status,\ntimestamps). Poll `GET /orders/{order_id}` for the full pipeline steps\nof any one order. Use `limit`/`offset` to page.","operationId":"public_orders_orders_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","maximum":100000,"minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicOrderListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/orders/{order_id}":{"get":{"tags":["Orders"],"summary":"Get order status","description":"Track an order end to end.\n\n`status` progresses `queued` → `running` → `completed`.\n`waiting_for_capacity` means we are waiting on an external system\n(e.g. Microsoft tenant propagation) and will resume automatically.\nTransient failures set `auto_retry_scheduled: true` and retry on their\nown; only `blocked` or `failed` without auto-retry need attention.","operationId":"public_order_status_orders__order_id__get","parameters":[{"name":"order_id","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":128,"description":"Order id returned by `POST /orders`.","title":"Order Id"},"description":"Order id returned by `POST /orders`."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicOrderStatusResponse"}}}},"404":{"description":"Order not found for this account."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/domains/{domain}/mailboxes":{"get":{"tags":["Mailboxes"],"summary":"List mailboxes on a domain","description":"List every mailbox on a domain with its sender-connection status.\n\nThis ordinary inventory response never includes passwords. Use the\nexplicit credential CSV export only when a mailbox login is needed.","operationId":"public_domain_mailboxes_domains__domain__mailboxes_get","parameters":[{"name":"domain","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":255,"description":"Root domain, e.g. `example-outreach.com`.","title":"Domain"},"description":"Root domain, e.g. `example-outreach.com`."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","maximum":100000,"minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicMailboxListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/domains/{domain}/dns":{"get":{"tags":["Domains"],"summary":"Get a domain's mail/auth DNS status","description":"Live mail/auth DNS check. Read `basis` before reading anything else.\n\n`basis: \"target_state\"` — a domain we provisioned. We wrote the records,\nso each one (MX / SPF / autodiscover / DMARC / DKIM) carries `valid`\nagainst the expected Microsoft target, plus an overall\n`deliverability_ready`.\n\n`basis: \"observed\"` — a domain in your account that we do NOT manage\n(a registrar domain we never provisioned, or the domain behind a\nconnected BYO sender). We own nothing there, so we cannot compare\nagainst a target: each record carries `observed` + `finding`\n(`ok` / `attention` / `unknown`), there is no `valid` and no\n`deliverability_ready`, and DKIM always reports `unknown` because the\nselector name is chosen by whoever signs the mail. Three lookups only —\nMX, SPF, DMARC — and SPF `include:` chains are not followed.\n\nEither way a transient resolver error sets `resolver_available` false\nand every record state is inconclusive rather than failing.","operationId":"public_domain_dns_domains__domain__dns_get","parameters":[{"name":"domain","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":255,"description":"Root domain, e.g. `example-outreach.com`.","title":"Domain"},"description":"Root domain, e.g. `example-outreach.com`."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/PublicDnsStatusResponse"},{"$ref":"#/components/schemas/PublicForeignDnsObservationResponse"}],"discriminator":{"propertyName":"basis","mapping":{"target_state":"#/components/schemas/PublicDnsStatusResponse","observed":"#/components/schemas/PublicForeignDnsObservationResponse"}},"title":"Response Public Domain Dns Domains  Domain  Dns Get"}}}},"404":{"description":"Domain not found for this account."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/billing":{"get":{"tags":["Account"],"summary":"Get your subscription summary","description":"Return the account's plan, billing status, active-domain quantity, and\ncurrent billing period. No raw Stripe identifiers or secrets are exposed.","operationId":"public_billing_billing_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicBillingResponse"}}}}}}},"/billing/order-confirmations":{"post":{"tags":["Billing"],"summary":"Confirm billing for an order","description":"Obtain the paid-order proof required by `POST /orders`.\n\nThis is a **billable write**. On an account with an active subscription,\nit increases the active-domain quantity through the same Stripe path as\nthe portal, charges the saved payment method or applies account credit,\nand returns `billing_confirmation_token`. Pass that token and the exact\nsame `idempotency_key` to `POST /orders`.\n\nOn a first order, no card is charged here. The response has\n`confirmed: false` plus a Stripe `checkout_url`. A human completes that\nhosted page, then the client calls\n`POST /billing/order-confirmations/confirm` with the returned\n`checkout_session_id`, domain set, and idempotency key. The API never\nreceives or stores card details.\n\nRetrying the same domain set and key is safe: the portal billing core\nand Stripe update both use that order key for idempotency.","operationId":"public_billing_order_confirmation_billing_order_confirmations_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicBillingConfirmationRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicBillingConfirmationResponse"}}}},"402":{"description":"The saved payment method needs attention."},"409":{"description":"The domain or subscription state cannot be billed."},"503":{"description":"The shared portal billing service is unavailable."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/billing/order-confirmations/confirm":{"post":{"tags":["Billing"],"summary":"Confirm completed Stripe Checkout","description":"Exchange a completed first-order Stripe Checkout for an order token.\n\nUse the `checkout_session_id`, domains, and idempotency key returned by\n`POST /billing/order-confirmations`. They are checked against Stripe and\nthis account before a short-lived `billing_confirmation_token` is\nreturned. Then call `POST /orders` with that token and the same key.","operationId":"public_billing_checkout_confirmation_billing_order_confirmations_confirm_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicBillingCheckoutConfirmationRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicBillingConfirmationResponse"}}}},"402":{"description":"Stripe Checkout is not paid yet."},"403":{"description":"Checkout does not match this account, domain set, or order key."},"503":{"description":"The shared portal billing service is unavailable."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/events":{"get":{"tags":["Account"],"summary":"List recent account events","description":"Recent lifecycle events for your account, newest first.\n\nEvents cover order received, mailboxes/domain ready, provisioning\nfailures, and account invitations. Pass `since` to poll only for\nevents newer than your last seen timestamp.","operationId":"public_events_events_get","parameters":[{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"description":"Only return events after this UTC ISO 8601 timestamp (for polling).","title":"Since"},"description":"Only return events after this UTC ISO 8601 timestamp (for polling)."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicEventListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/mailboxes/{email}":{"get":{"tags":["Mailboxes"],"summary":"Get a single mailbox","description":"Return one mailbox and its sender-connection state.\n\nThe mailbox must belong to your account; otherwise this returns\n`404 mailbox_not_found`. This ordinary detail response never includes\npasswords; the explicit domain credential export is separate.","operationId":"public_mailbox_detail_mailboxes__email__get","parameters":[{"name":"email","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":320,"description":"Full mailbox address, e.g. `jordan.vega@example-outreach.com`.","title":"Email"},"description":"Full mailbox address, e.g. `jordan.vega@example-outreach.com`."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicMailboxSummary"}}}},"404":{"description":"Mailbox not found for this account."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Mailboxes"],"summary":"Rename a mailbox","description":"Change a mailbox's display name.\n\nThe name is written to the Microsoft 365 directory, not to your\nsequencer, so it is the name Outlook shows and the name anyone replying\nsees — and it survives disconnecting a sequencer or moving to another\none. The response carries the name Entra actually stored, which can\ndiffer from the one you sent: the directory trims and can truncate.\n\n`daily_limit` is accepted by the schema but rejected here on purpose.\nIt is not a mailbox attribute, it is the sending ramp: new mailboxes\nstart at one send a day and step up as warmup completes, and the\nreconnect watchdog rewrites the value on every reconnect. Accepting a\nnumber here would return 200 for a change we would undo ourselves\nwithin the hour.","operationId":"public_mailbox_update_mailboxes__email__patch","parameters":[{"name":"email","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":320,"description":"Full mailbox address.","title":"Email"},"description":"Full mailbox address."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicMailboxUpdateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicMailboxSummary"}}}},"404":{"description":"Mailbox not found for this account."},"409":{"description":"Mailbox is not on a Mailionaire-managed tenant."},"422":{"description":"display_name was empty, or no changeable field was sent."}}}},"/domains/{domain}/mailboxes/export":{"post":{"tags":["Mailboxes"],"summary":"Export a domain's mailboxes as CSV","description":"Download login credentials for every managed mailbox on a domain.\n\nThis is a sensitive, audited export. Columns: `email`, `password`,\n`display_name`, `provider`, `connection_method`, `login_url`.\n\nChoose **Office 365 / Outlook** and its OAuth sign-in flow when adding\nthese Microsoft mailboxes. **Do not use IMAP/SMTP or a Custom Provider\nconnection.** Signing in from several devices or locations can trigger\nMicrosoft security protections. A tenant or individual mailbox may be\ntemporarily locked, and mailbox performance may worsen. This is\npossible, not guaranteed. Store the file securely and delete it when it\nis no longer needed.","operationId":"public_domain_mailboxes_export_domains__domain__mailboxes_export_post","parameters":[{"name":"domain","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":255,"description":"Root domain, e.g. `example-outreach.com`.","title":"Domain"},"description":"Root domain, e.g. `example-outreach.com`."}],"responses":{"200":{"description":"CSV export.","content":{"application/json":{"schema":{}},"text/csv":{}}},"404":{"description":"Domain not found for this account."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/domains/{domain}/senders/reconnect":{"post":{"tags":["Mailboxes"],"summary":"Reconnect a domain's senders","description":"Reconnect disconnected senders on a domain and report the posture.\n\nReconnection and self-healing run automatically server-side: a watchdog\ncontinuously re-drives every disconnected sender, so there is no manual\nenqueue to trigger (and none to abuse). This endpoint therefore returns\nthe live reconnect posture — how many senders are connected vs\ndisconnected-and-recovering — reusing the same connection accounting the\nportal shows. `reconnect_mode` is always `automatic`. Ownership is\nenforced (unknown domains 404).","operationId":"public_domain_senders_reconnect_domains__domain__senders_reconnect_post","parameters":[{"name":"domain","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":255,"description":"Root domain, e.g. `example-outreach.com`.","title":"Domain"},"description":"Root domain, e.g. `example-outreach.com`."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicSenderReconnectResponse"}}}},"404":{"description":"Domain not found for this account."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/orders/bulk":{"post":{"tags":["Orders"],"summary":"Order mailboxes for multiple domains","description":"Order mailboxes for up to 25 domains in one call.\n\nEach domain is provisioned through the exact same path as\n`POST /orders`, including the fail-closed billing gate — a domain\nwithout a valid billing confirmation fails independently with\n`payment_required` while the others proceed. Results are returned\nper domain; the batch never partially charges or bypasses billing.","operationId":"public_order_create_bulk_orders_bulk_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicBulkOrderCreateRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicBulkOrderResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/domains/{domain}":{"delete":{"tags":["Domains"],"summary":"Cancel a domain's subscription","description":"Schedule a domain's cancellation at the end of its paid term.\n\n**This is not an immediate teardown.** The domain keeps sending until\n`effective_at`, a subscription renewal boundary. Every domain is paid\nfor at least one full billing month, so `effective_at` can fall a\nrenewal later than the next one — `minimum_term_applied` tells you when\nthat happened. Nothing is refunded and nothing is prorated.\n\nCalling this twice for the same domain is safe: the second call returns\nthe cancellation already on file with `already_pending: true` and sends\nnothing further to Stripe.\n\nOnly a domain with an active paid mailbox-pack order can be cancelled.\nA domain that was merely prepared or assigned to a workspace returns\n`409 domain_not_billed` and does not change the subscription quantity.\n\nThe Stripe change itself is made by the portal's billing core — the same\ncode path the Cancel button in the portal runs, not a copy of it. This\nendpoint therefore reports `503` when that service cannot be reached,\nrather than recording a cancellation the subscription knows nothing of.","operationId":"public_domain_cancel_domains__domain__delete","parameters":[{"name":"domain","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":255,"description":"Root domain, e.g. `example-outreach.com`.","title":"Domain"},"description":"Root domain, e.g. `example-outreach.com`."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicDomainCancellationResponse"}}}},"402":{"description":"Payment needs attention before a domain can be cancelled."},"404":{"description":"Domain not found for this account."},"409":{"description":"The account or subscription cannot take this cancellation."},"503":{"description":"The billing service is unavailable — retry."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Domains"],"summary":"Get one domain","description":"Return one of your domains with its provisioning and sending state.\n\nSame projection as an item in `GET /domains`, filtered to the one\ndomain. Unknown or not-owned domains return `404 domain_not_found`.","operationId":"public_domain_detail_domains__domain__get","parameters":[{"name":"domain","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":255,"description":"Root domain, e.g. `example-outreach.com`.","title":"Domain"},"description":"Root domain, e.g. `example-outreach.com`."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicDomainSummary"}}}},"404":{"description":"Domain not found for this account."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/keys":{"get":{"tags":["API keys"],"summary":"List API keys","description":"List every API key on your account. Secret values and hashes are never returned.","operationId":"public_key_list_keys_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiKeyListResponse"}}}}}},"post":{"tags":["API keys"],"summary":"Mint an API key","description":"Create a new API key for your account, authenticated by an existing key.\n\nThe secret `api_key` is returned exactly once and is never retrievable\nagain — store it securely. Multiple active keys per account are allowed\n(one per integration), up to a per-account cap.\n\nPass `environment: \"sandbox\"` to mint an `mk_test_` key. Test keys speak\nto the same base URL and the same routes, but never provision real\nmailboxes and never bill — see the Test mode section of the API\ndescription. Your sandbox account (with a few `.test` domains to order\nagainst) is created the first time you ask for a test key.","operationId":"public_key_create_keys_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiKeyCreateRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiKeyCreated"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/keys/{key_id}":{"delete":{"tags":["API keys"],"summary":"Revoke an API key","description":"Revoke an API key. Scoped to your account — a key you do not own returns 404.\n\nA revoked key stops authenticating immediately. Note that revoking the\nkey currently making the request also invalidates it.","operationId":"public_key_revoke_keys__key_id__delete","parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":128,"description":"Key id from `GET /keys` or `POST /keys`.","title":"Key Id"},"description":"Key id from `GET /keys` or `POST /keys`."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiKeyRevokeResponse"}}}},"404":{"description":"Key not found for this account or already revoked."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/team/members":{"get":{"tags":["Team"],"summary":"List workspace members","description":"Everyone with access to this workspace: the owner plus invited members.\n\nThe owner is synthesized from the account's primary email and always\ncarries the id `owner`.","operationId":"public_team_members_team_members_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicTeamMembersResponse"}}}}}},"post":{"tags":["Team"],"summary":"Invite a member","description":"Invite a colleague into this workspace and return the new roster.\n\nThe invitee receives a sign-in link. By default their email must share\nthe owner's domain; `allow_external: true` waives that for one invite.","operationId":"public_team_invite_team_members_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicTeamInviteRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicTeamMembersResponse"}}}},"409":{"description":"That email is already the owner or an existing member."},"422":{"description":"Unknown role, or an outside-domain invite without `allow_external`."}}}},"/team/members/{member_id}":{"patch":{"tags":["Team"],"summary":"Change a member's role","description":"Change a member's role between `admin` and `member`.\n\nThe owner is not a member row and cannot be demoted through this call.","operationId":"public_team_member_role_team_members__member_id__patch","parameters":[{"name":"member_id","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":64,"description":"Member id from `GET /team/members`.","title":"Member Id"},"description":"Member id from `GET /team/members`."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicTeamRoleRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicTeamMembersResponse"}}}},"404":{"description":"Member not found in this workspace."},"422":{"description":"Unknown role, or an attempt to change the owner."}}},"delete":{"tags":["Team"],"summary":"Remove a member","description":"Remove a member and invalidate their outstanding sign-in links.","operationId":"public_team_member_remove_team_members__member_id__delete","parameters":[{"name":"member_id","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":64,"description":"Member id from `GET /team/members`.","title":"Member Id"},"description":"Member id from `GET /team/members`."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicTeamMembersResponse"}}}},"404":{"description":"Member not found in this workspace."},"422":{"description":"The owner cannot be removed."}}}},"/team/audit":{"get":{"tags":["Team"],"summary":"Recent team and sign-in activity","description":"The workspace's recent team and sign-in events, newest first.\n\nThis is the same activity log the portal settings page shows. For the\nlifecycle of your infrastructure — orders, DNS, mailboxes — use\n`GET /events` or a webhook instead.","operationId":"public_team_audit_team_audit_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicTeamAuditResponse"}}}}}}},"/connections":{"get":{"tags":["Connections"],"summary":"Registrar and sequencer connection status","description":"Whether your registrar and your sequencer are connected, and when they were last verified.\n\nCredentials are never returned — only a hint of their last characters.","operationId":"public_connections_connections_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicConnectionsResponse"}}}}}}},"/connections/registrar":{"put":{"tags":["Connections"],"summary":"Connect or replace your registrar credential","description":"Store a registrar credential and verify it against the registrar.\n\nVerified before it is kept: a credential the registrar rejects is not\nstored, so a 200 here means DNS work will actually succeed later.\nSending this again replaces the stored credential.","operationId":"public_registrar_connect_connections_registrar_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicRegistrarConnectRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicRegistrarConnection"}}}},"422":{"description":"Unsupported provider, or the registrar refused the credential."}}},"delete":{"tags":["Connections"],"summary":"Disconnect your registrar","description":"Forget the stored registrar credential.\n\nDomains already provisioned keep sending; what stops is our ability to\nwrite DNS for new ones.","operationId":"public_registrar_disconnect_connections_registrar_delete","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicRegistrarConnection"}}}}}}},"/connections/registrar/sync":{"post":{"tags":["Connections"],"summary":"Re-read the domains at your registrar","description":"Pull the current domain inventory from your registrar.\n\nReturns what changed since the last sync, so a scheduled job can act on\n`added_domains` instead of diffing the full list itself.","operationId":"public_registrar_sync_connections_registrar_sync_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicRegistrarSyncResponse"}}}},"409":{"description":"No registrar is connected."}}}},"/connections/sequencer":{"put":{"tags":["Connections"],"summary":"Connect or replace your sequencer token","description":"Store a sequencer API token and verify it against the sequencer.\n\n`base_url` is only needed for a white-labelled instance. Sending this\nagain replaces the stored token.","operationId":"public_sequencer_connect_connections_sequencer_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicSequencerConnectRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicSequencerConnection"}}}},"422":{"description":"The sequencer refused the token."}}},"delete":{"tags":["Connections"],"summary":"Disconnect your sequencer","description":"Forget the stored sequencer token. Mailboxes already connected keep sending.","operationId":"public_sequencer_disconnect_connections_sequencer_delete","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicSequencerConnection"}}}}}}},"/connections/sequencer/sync":{"post":{"tags":["Connections"],"summary":"Re-read your sequencer workspaces","description":"Refresh the workspace list we hand new mailboxes to.","operationId":"public_sequencer_sync_connections_sequencer_sync_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicSequencerSyncResponse"}}}},"409":{"description":"No sequencer is connected."}}}},"/webhooks":{"get":{"tags":["Webhooks"],"summary":"List your webhook endpoints","description":"List your registered endpoints. Signing secrets are masked.","operationId":"public_webhook_list_webhooks_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicWebhookListResponse"}}}}}},"post":{"tags":["Webhooks"],"summary":"Register a webhook endpoint","description":"Register an endpoint to receive pushed lifecycle events.\n\nInstead of polling, subscribe to events and we POST each one to your\n`url`, signed with an HMAC over the raw body. The response includes the\nsigning `secret` **exactly once** — store it now; every later read masks\nit. Deliveries carry `X-Mailionaire-Signature: sha256=<hmac>` and\n`X-Mailionaire-Timestamp`; verify both before trusting a payload.\n\nSupported events: `order.created`, `order.completed`, `order.failed`,\n`domain.ready`, `domain.canceled`.","operationId":"public_webhook_create_webhooks_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicWebhookCreateRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicWebhookCreateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/webhooks/deliveries":{"get":{"tags":["Webhooks"],"summary":"List webhook deliveries","description":"Every delivery we attempted for your account, newest first.\n\nA delivery that is still retrying reads `pending` with the next attempt\ntime; one that exhausted its schedule reads `failed`. Nine attempts are\nspread over roughly 22 hours, so a `failed` here means your endpoint was\nunreachable for a day, not for a moment.","operationId":"public_webhook_deliveries_webhooks_deliveries_get","parameters":[{"name":"webhook_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Only this endpoint's deliveries.","title":"Webhook Id"},"description":"Only this endpoint's deliveries."},{"name":"event_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Only this event type.","title":"Event Type"},"description":"Only this event type."},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"`pending`, `delivering`, `delivered` or `failed`.","title":"Status"},"description":"`pending`, `delivering`, `delivered` or `failed`."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"description":"How many to return, newest first.","default":50,"title":"Limit"},"description":"How many to return, newest first."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicWebhookDeliveryListResponse"}}}},"404":{"description":"Webhook not found for this account."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/webhooks/deliveries/{delivery_id}":{"get":{"tags":["Webhooks"],"summary":"Get one webhook delivery","description":"One delivery, including the response we got back from your endpoint.","operationId":"public_webhook_delivery_detail_webhooks_deliveries__delivery_id__get","parameters":[{"name":"delivery_id","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":128,"description":"Delivery id.","title":"Delivery Id"},"description":"Delivery id."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicWebhookDelivery"}}}},"404":{"description":"Delivery not found for this account."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/webhooks/deliveries/{delivery_id}/replay":{"post":{"tags":["Webhooks"],"summary":"Replay a webhook delivery","description":"Send this delivery again.\n\nThe replay is appended as a new attempt rather than overwriting the old\none, so the log stays an honest record of what happened and when.","operationId":"public_webhook_delivery_replay_webhooks_deliveries__delivery_id__replay_post","parameters":[{"name":"delivery_id","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":128,"description":"Delivery id.","title":"Delivery Id"},"description":"Delivery id."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicWebhookDelivery"}}}},"404":{"description":"Delivery not found for this account."},"422":{"description":"This delivery cannot be replayed."}}}},"/webhooks/{webhook_id}":{"get":{"tags":["Webhooks"],"summary":"Get a webhook endpoint","description":"Inspect one endpoint (secret masked).","operationId":"public_webhook_detail_webhooks__webhook_id__get","parameters":[{"name":"webhook_id","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":128,"description":"Endpoint id.","title":"Webhook Id"},"description":"Endpoint id."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicWebhookSummary"}}}},"404":{"description":"Webhook not found for this account."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Webhooks"],"summary":"Delete a webhook endpoint","description":"Remove an endpoint. No further events are delivered to it.","operationId":"public_webhook_delete_webhooks__webhook_id__delete","parameters":[{"name":"webhook_id","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":128,"description":"Endpoint id.","title":"Webhook Id"},"description":"Endpoint id."}],"responses":{"204":{"description":"Successful Response"},"404":{"description":"Webhook not found for this account."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/webhooks/{webhook_id}/test":{"post":{"tags":["Webhooks"],"summary":"Send a test ping","description":"Send a sample `ping` event to the endpoint and report whether it was\naccepted (2xx). Use this to verify signature handling and connectivity\nright after registering an endpoint.","operationId":"public_webhook_test_webhooks__webhook_id__test_post","parameters":[{"name":"webhook_id","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":128,"description":"Endpoint id.","title":"Webhook Id"},"description":"Endpoint id."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicWebhookTestResponse"}}}},"404":{"description":"Webhook not found for this account."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/domains/{domain}/dns-drift":{"get":{"tags":["Domains"],"summary":"DNS drift for one domain","description":"Whether this domain's DNS still matches what we applied.\n\nDetects DKIM repointed at a different tenant, SPF weakened from `-all`\nto `~all`, a second SPF record appearing, DMARC reports redirected, and\nMX moved. A verdict younger than the published TTL is served as stored;\notherwise the records are re-read now.","operationId":"public_domain_dns_drift_domains__domain__dns_drift_get","parameters":[{"name":"domain","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":255,"description":"Root domain.","title":"Domain"},"description":"Root domain."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicDnsDriftVerdict"}}}},"404":{"description":"Domain not found for this account."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/domains/{domain}/dns-drift/history":{"get":{"tags":["Domains"],"summary":"DNS drift history for one domain","description":"Past drift episodes for this domain.\n\nOne entry per episode, not per check: the sweep runs four times a day\nand an unrepaired drift is one event, not four hundred a quarter.","operationId":"public_domain_dns_drift_history_domains__domain__dns_drift_history_get","parameters":[{"name":"domain","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":255,"description":"Root domain.","title":"Domain"},"description":"Root domain."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"description":"How many episodes, newest first.","default":50,"title":"Limit"},"description":"How many episodes, newest first."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicDnsDriftHistoryResponse"}}}},"404":{"description":"Domain not found for this account."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/orders/{order_id}/logs":{"get":{"tags":["Orders"],"summary":"Get an order's provisioning log","description":"Customer-visible provisioning log for an order, oldest first.\n\nSurfaces the same audited, customer-safe job-log stream the portal\nshows — internal identifiers and secrets are redacted. An order that has\nnot started a provisioning job yet returns an empty list.","operationId":"public_order_logs_orders__order_id__logs_get","parameters":[{"name":"order_id","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":128,"description":"Order id returned by `POST /orders`.","title":"Order Id"},"description":"Order id returned by `POST /orders`."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicOrderLogResponse"}}}},"404":{"description":"Order not found for this account."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/domains/dns-drift":{"get":{"tags":["Domains"],"summary":"DNS drift across your domains","description":"Every domain's last drift verdict, from stored results only.\n\nThis resolves nothing live — fifty domains times five lookups on every\npoll would make us the reason the resolver is slow. A domain we have not\nchecked yet reads `not_checked`, never `match`.","operationId":"public_dns_drift_overview_domains_dns_drift_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicDnsDriftOverview"}}}}}}},"/domains/{domain}/dns/recheck":{"post":{"tags":["Domains"],"summary":"Re-check a domain's mail/auth DNS","description":"Force a fresh validation of the domain's own mail/auth DNS now.\n\nRe-runs the authoritative MX / SPF / autodiscover / DMARC / DKIM lookup\nagainst a public resolver and returns the fresh snapshot (same shape as\n`GET /domains/{domain}/dns`). This validates OUR records against the\nexpected Microsoft targets only — it is not a third-party deliverability\nscore. Ownership is enforced (unknown domains 404).","operationId":"public_domain_dns_recheck_domains__domain__dns_recheck_post","parameters":[{"name":"domain","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":255,"description":"Root domain, e.g. `example-outreach.com`.","title":"Domain"},"description":"Root domain, e.g. `example-outreach.com`."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicDnsStatusResponse"}}}},"404":{"description":"Domain not found for this account."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/domains/{domain}/dns/delegate":{"post":{"tags":["Domains"],"summary":"Delegate a domain's DNS to Cloudflare","description":"Point a domain at ANY registrar to our Cloudflare account via NS delegation.\n\nCreates (idempotently) a Cloudflare zone we manage and returns the two\nnameservers to set at your registrar. Once you delegate, we detect the\nchange and provision the same Microsoft mail records we do for native\ndomains. Re-calling is safe and returns the existing zone's nameservers.","operationId":"public_domain_dns_delegate_domains__domain__dns_delegate_post","parameters":[{"name":"domain","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":255,"description":"Root domain at ANY registrar, e.g. `example-outreach.com`.","title":"Domain"},"description":"Root domain at ANY registrar, e.g. `example-outreach.com`."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicDnsDelegationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/domains/{domain}/dns/delegation":{"get":{"tags":["Domains"],"summary":"Get a domain's Cloudflare NS-delegation state","description":"Return the current nameserver-delegation state for a delegated domain.\n\nA Porkbun-native domain reports `dns_mode='porkbun'` with no nameservers.\nOwnership is enforced (unknown domains 404).","operationId":"public_domain_dns_delegation_domains__domain__dns_delegation_get","parameters":[{"name":"domain","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":255,"description":"Root domain, e.g. `example-outreach.com`.","title":"Domain"},"description":"Root domain, e.g. `example-outreach.com`."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicDnsDelegationResponse"}}}},"404":{"description":"Domain not found for this account."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/mailboxes/{email}/status":{"get":{"tags":["Mailboxes"],"summary":"Get a mailbox's connection status","description":"Return one mailbox's connection and warmup status.\n\nReports only our own tracked state (lifecycle status, connection,\nwarmup score, and send/reply/bounce counts) — no external check is\nperformed. Passwords are never exposed; not-owned mailboxes return\n`404 mailbox_not_found`.","operationId":"public_mailbox_status_mailboxes__email__status_get","parameters":[{"name":"email","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":320,"description":"Full mailbox address, e.g. `jordan.vega@example-outreach.com`.","title":"Email"},"description":"Full mailbox address, e.g. `jordan.vega@example-outreach.com`."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicMailboxStatusResponse"}}}},"404":{"description":"Mailbox not found for this account."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/notifications":{"get":{"tags":["Account"],"summary":"List your notifications","description":"Customer-facing notifications for your account, newest first.\n\nThese are the milestone notifications we record (and email) per order —\norder received, mailboxes ready, setup needs attention — each with its\nsubject and delivery status. Scoped to your account only.","operationId":"public_notifications_notifications_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicNotificationListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/summary":{"get":{"tags":["Account"],"summary":"Get the whole account in one call","description":"Domains, mailboxes, sending and orders for the whole account, at once.\n\nEvery number here was already reachable — by calling `GET /domains`, then\n`GET /domains/{domain}/mailboxes` once per domain, and adding the\nper-mailbox counters up yourself. For a 25-domain account that is 26\nrequests and 2 500 rows against a 300/min budget, and every integration\nwrites that loop slightly differently.\n\nRead `sending.mailboxes_reporting` before `sending.sent`. The per-mailbox\ncounters are filled from provider observations and are documented as\n\"when reported\"; `sent: 0` with `mailboxes_reporting: 0` means nobody has\ntold us yet, not that nothing was sent.\n\nRequires `account:read`, `domains:read` and `mailboxes:read` together —\nthe rollup must never reveal something the key could not already read one\nendpoint at a time.","operationId":"public_summary_summary_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicSummaryResponse"}}}}}}},"/billing/usage":{"get":{"tags":["Account"],"summary":"Get current billing-period usage","description":"Current-period order usage and quota, plus active-domain count.\n\nReuses the same plan/limit data as `GET /billing` and `GET /me` — no new\nbilling logic and no raw Stripe identifiers.","operationId":"public_billing_usage_billing_usage_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicBillingUsageResponse"}}}}}}},"/billing/invoices":{"get":{"tags":["Account"],"summary":"List billing invoices","description":"Invoice history for your account.\n\nInvoices are issued and hosted by Stripe; the API does not currently\nmirror Stripe invoice objects, so this returns an empty list with a\npointer to the billing portal rather than fabricating invoice data.\nPlan, price, and subscription status are available from `GET /billing`.","operationId":"public_billing_invoices_billing_invoices_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicBillingInvoicesResponse"}}}}}}},"/domains/{domain}/website":{"get":{"tags":["Domains"],"summary":"Read website forwarding","description":"Read opt-in website settings. `mode: redirect` forwards all visitors\ndirectly and changes the address bar to the destination. `mode: masking`\nserves the public website under the sending domain, which stays in the\naddress bar. It checks the browser first and can require CAPTCHA.\n\nIn masking mode, known crawlers receive no destination. Browser checks are a heuristic\nand cannot guarantee that all bots are excluded. A CAPTCHA provides a\nstronger check. CAPTCHA temporarily opens a central verification page,\nthen returns to the sending domain. No existing domain is enabled automatically.\n\nMasking supports public, read-only HTTPS websites and their same-origin\nimages, styles, scripts and internal links. External links keep their own\naddresses. Login, cookies from the original website, form submissions,\nWebSockets and arbitrary application behavior are not supported. A website\nthat blocks proxy access may be unavailable; masking never falls back to\nredirecting visitors to the destination.","operationId":"public_website_read_domains__domain__website_get","parameters":[{"name":"domain","in":"path","required":true,"schema":{"type":"string","title":"Domain"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebsiteForwardingSettings"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["Domains"],"summary":"Configure website forwarding","description":"Enable, change or disable forwarding on one owned domain. Read the current\n`revision` first and include it to prevent overwriting another update.\nSet `mode` to `redirect` for a direct 302 redirect, or `masking` for\nretained-domain website serving after browser checks with optional CAPTCHA.\nExisting settings default to masking. Portal sessions and API keys use\nthis same configuration and visitor behavior.\nSetup creates missing web A records through the customer's DNS adapter\nin the background. Existing websites are never replaced automatically.\nA domain remains `pending_dns` until apex and www point exclusively to\nthe service, without conflicting AAAA records. For externally managed\nDNS or an existing website, connect the returned records yourself.\nMail MX/TXT and nameservers are preserved. Disabling immediately stops\nforwarding; restoring previous website DNS is your responsibility.\n\nThe destination must be a public HTTPS website. In redirect mode every\nvisit opens the configured destination, without copying visitor paths or\nqueries. In masking mode the root opens the configured landing page;\nother paths and queries address resources on the same website origin.\nVisitor query parameters override the configured root query when present.\nHTTPS redirects are limited to the destination's apex and www hostnames.\nEach upstream resource is limited to 8 MiB and a 20-second fetch deadline.\nVisitor credentials are never forwarded. CAPTCHA requires available\nserver configuration and is validated before website access is granted.\nSandbox keys cannot activate live website forwarding (409).","operationId":"public_website_write_domains__domain__website_put","parameters":[{"name":"domain","in":"path","required":true,"schema":{"type":"string","title":"Domain"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebsiteForwardingUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebsiteForwardingSettings"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/domains/{domain}/website/check":{"post":{"tags":["Domains"],"summary":"Check forwarding DNS connection","description":"Check apex and www web records and reconcile the HTTPS edge. Returns\n`active` when DNS points to the service; otherwise `pending_dns`.\nThis does not change any DNS records. HTTPS certificates are issued\nautomatically by the edge after DNS is connected.","operationId":"public_website_check_domains__domain__website_check_post","parameters":[{"name":"domain","in":"path","required":true,"schema":{"type":"string","title":"Domain"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebsiteForwardingSettings"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/graph/profiles":{"get":{"tags":["Graph integrations"],"summary":"Public Graph Profiles","description":"List only your app profiles. This opt-in capability is disabled by default.","operationId":"public_graph_profiles_graph_profiles_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/GraphProfileView"},"type":"array","title":"Response Public Graph Profiles Graph Profiles Get"}}}}}},"post":{"tags":["Graph integrations"],"summary":"Public Graph Profile Create","description":"Register your own multitenant Entra app, without supplying a secret.\n\nOpt-in capability, disabled by default. Requires explicitly granted\n`graph:write`, outside the default key scopes. This records an immutable\npermission request; it does **not** grant Microsoft access. Supported\nscope is provisioned mailboxes only. Live consent needs a separately\nauthorized tenant/app/permission plan and verified mailbox scoping.","operationId":"public_graph_profile_create_graph_profiles_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GraphProfileCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GraphProfileView"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/graph/profiles/{profile_id}":{"get":{"tags":["Graph integrations"],"summary":"Public Graph Profile","description":"Read an owned app profile. A foreign profile returns the same 404 as a missing one.","operationId":"public_graph_profile_graph_profiles__profile_id__get","parameters":[{"name":"profile_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Profile Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GraphProfileView"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Graph integrations"],"summary":"Public Graph Profile Retire","description":"Retire an unused app profile. Revoke its domain bindings first.\n\nThis never deletes a Microsoft application, internal grant or audit history.","operationId":"public_graph_profile_retire_graph_profiles__profile_id__delete","parameters":[{"name":"profile_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Profile Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GraphProfileView"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/domains/{domain}/graph-integration":{"put":{"tags":["Graph integrations"],"summary":"Public Graph Bind","description":"Bind your app profile to an owned domain. Identical retries reuse the binding.\n\nRecording intent does not grant access, place an order or connect a\nsending destination. Tenant IDs cannot be supplied by the caller.\n`awaiting_inventory` and `awaiting_authorization` are not ready to send.","operationId":"public_graph_bind_domains__domain__graph_integration_put","parameters":[{"name":"domain","in":"path","required":true,"schema":{"type":"string","title":"Domain"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GraphBindingCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GraphBindingView"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Graph integrations"],"summary":"Public Graph Binding","description":"Read tenant identity, directory-observed UPNs and app-integration state.\n\nMissing directory evidence stays empty. `scope_verified` is false until\nlive mailbox authorization has been checked. Sandbox `simulated` uses\nsynthetic tenant/object IDs and test UPNs; it proves no Microsoft access.","operationId":"public_graph_binding_domains__domain__graph_integration_get","parameters":[{"name":"domain","in":"path","required":true,"schema":{"type":"string","title":"Domain"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GraphBindingView"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Graph integrations"],"summary":"Public Graph Revoke","description":"Request app-access revocation. Sandbox revocation is immediate and simulated.\n\nLive returns `revoking`: access is **not** claimed revoked until an\nauthorized runner verifies removal of this integration's own grants.\nOther applications and pre-existing permissions are never removed.","operationId":"public_graph_revoke_domains__domain__graph_integration_delete","parameters":[{"name":"domain","in":"path","required":true,"schema":{"type":"string","title":"Domain"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GraphBindingView"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/domains/{domain}/graph-integration/provisioning-destination":{"put":{"tags":["Graph integrations"],"summary":"Public Graph Provisioning Destination","description":"Select an app profile as the provisioning destination of an unused domain.\n\nExplicit opt-in, with live Graph orders separately disabled by default.\nNever migrates an existing domain order or sender fleet. The routing\nidentifier in this provider namespace is your app profile, not a sending\nplatform workspace. Sandbox keeps its provider-independent simulation.\nThis call neither places an order nor charges or grants Microsoft access.","operationId":"public_graph_provisioning_destination_domains__domain__graph_integration_provisioning_destination_put","parameters":[{"name":"domain","in":"path","required":true,"schema":{"type":"string","title":"Domain"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GraphBindingView"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/domains/{domain}/graph-integration/refresh":{"post":{"tags":["Graph integrations"],"summary":"Public Graph Refresh","description":"Refresh simulated inventory after a sandbox order completes.\n\nSandbox only. It reads simulated mailbox rows and never contacts\nMicrosoft. Live inventory is reconciled by an authorized operator runner.","operationId":"public_graph_refresh_domains__domain__graph_integration_refresh_post","parameters":[{"name":"domain","in":"path","required":true,"schema":{"type":"string","title":"Domain"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GraphBindingView"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"GraphBindingCreate":{"properties":{"profile_id":{"type":"string","format":"uuid","title":"Profile Id"}},"additionalProperties":false,"type":"object","required":["profile_id"],"title":"GraphBindingCreate"},"GraphBindingView":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"profile_id":{"type":"string","format":"uuid","title":"Profile Id"},"domain":{"type":"string","title":"Domain"},"environment":{"type":"string","enum":["live","sandbox"],"title":"Environment"},"state":{"type":"string","enum":["awaiting_inventory","awaiting_authorization","awaiting_propagation","simulated","applying","reconcile_required","ready","revoking","revoked","blocked"],"title":"State"},"tenant_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Tenant Id"},"mailboxes":{"items":{"$ref":"#/components/schemas/GraphMailbox"},"type":"array","title":"Mailboxes"},"scope_verified":{"type":"boolean","title":"Scope Verified","default":false},"inventory_checked_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Inventory Checked At"},"scope_verified_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Scope Verified At"},"propagation_not_before":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Propagation Not Before"},"error_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Code"}},"type":"object","required":["id","profile_id","domain","environment","state"],"title":"GraphBindingView"},"GraphMailbox":{"properties":{"object_id":{"type":"string","format":"uuid","title":"Object Id"},"upn":{"type":"string","maxLength":320,"minLength":3,"title":"Upn"}},"additionalProperties":false,"type":"object","required":["object_id","upn"],"title":"GraphMailbox"},"GraphProfileCreate":{"properties":{"app_id":{"type":"string","format":"uuid","title":"App Id"},"label":{"type":"string","maxLength":120,"minLength":1,"title":"Label"},"permissions":{"items":{"type":"string","enum":["Mail.Send","Mail.Read","Mail.ReadWrite"]},"type":"array","maxItems":3,"minItems":1,"title":"Permissions"},"scope_mode":{"type":"string","const":"provisioned_mailboxes","title":"Scope Mode","default":"provisioned_mailboxes"}},"additionalProperties":false,"type":"object","required":["app_id","label","permissions"],"title":"GraphProfileCreate"},"GraphProfileView":{"properties":{"app_id":{"type":"string","format":"uuid","title":"App Id"},"label":{"type":"string","maxLength":120,"minLength":1,"title":"Label"},"permissions":{"items":{"type":"string","enum":["Mail.Send","Mail.Read","Mail.ReadWrite"]},"type":"array","maxItems":3,"minItems":1,"title":"Permissions"},"scope_mode":{"type":"string","const":"provisioned_mailboxes","title":"Scope Mode","default":"provisioned_mailboxes"},"id":{"type":"string","format":"uuid","title":"Id"},"status":{"type":"string","enum":["active","retired"],"title":"Status"}},"additionalProperties":false,"type":"object","required":["app_id","label","permissions","id","status"],"title":"GraphProfileView"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"PublicAccountResponse":{"properties":{"account_id":{"type":"string","title":"Account Id","description":"Stable account identifier."},"account_code":{"type":"string","title":"Account Code","description":"Short human-readable account code."},"display_name":{"type":"string","title":"Display Name","description":"Account display name."},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email","description":"Primary account email."},"plan":{"$ref":"#/components/schemas/PublicPlan"},"environment":{"type":"string","enum":["live","sandbox"],"title":"Environment","description":"Which environment this key addresses. `live` provisions real mailboxes and bills; `sandbox` does neither. Determined by the key prefix (`mk_live_` / `mk_test_`), never by a request parameter.","default":"live"},"api_key_hint":{"type":"string","title":"Api Key Hint","description":"Last 4 characters of the key used for this request."},"api_key_last_used_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key Last Used At","description":"Previous use of this key (UTC ISO 8601)."}},"type":"object","required":["account_id","account_code","display_name","plan","api_key_hint"],"title":"PublicAccountResponse","description":"Your account, as resolved from the API key."},"PublicApiKeyCreateRequest":{"properties":{"label":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Label","description":"Optional human label to identify this key (e.g. an integration name)."},"scopes":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Scopes","description":"What the new key may do. Omit for the same scopes the calling key holds. A key can never grant a scope it does not itself hold."},"environment":{"anyOf":[{"type":"string","enum":["live","sandbox"]},{"type":"null"}],"title":"Environment","description":"`sandbox` mints an `mk_test_` key against your test account, creating it on first use. Omit to mint in the same environment as the calling key. A test key can only mint test keys — asking it for `live` returns 403."}},"type":"object","title":"PublicApiKeyCreateRequest","description":"Mint a new API key for the authenticated account."},"PublicApiKeyCreated":{"properties":{"key_id":{"type":"string","title":"Key Id","description":"Stable identifier for this key (used to revoke it)."},"api_key":{"type":"string","title":"Api Key","description":"The secret key value. Shown only once; never retrievable again."},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"},"scopes":{"items":{"type":"string"},"type":"array","title":"Scopes","description":"What this key may do."},"environment":{"type":"string","enum":["live","sandbox"],"title":"Environment","description":"Which environment this key addresses.","default":"live"}},"type":"object","required":["key_id","api_key"],"title":"PublicApiKeyCreated","description":"A freshly minted key. `api_key` is shown ONCE — store it securely."},"PublicApiKeyListResponse":{"properties":{"total":{"type":"integer","title":"Total"},"items":{"items":{"$ref":"#/components/schemas/PublicApiKeySummary"},"type":"array","title":"Items"}},"type":"object","required":["total"],"title":"PublicApiKeyListResponse"},"PublicApiKeyRevokeResponse":{"properties":{"key_id":{"type":"string","title":"Key Id"},"revoked":{"type":"boolean","title":"Revoked","description":"True when a live key was revoked by this call."}},"type":"object","required":["key_id","revoked"],"title":"PublicApiKeyRevokeResponse"},"PublicApiKeySummary":{"properties":{"key_id":{"type":"string","title":"Key Id"},"key_hint":{"type":"string","title":"Key Hint","description":"Prefix + last 4 characters, e.g. `mk_live_...9x2f`."},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"},"last_used_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Used At"},"expires_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expires At"},"revoked":{"type":"boolean","title":"Revoked","default":false},"scopes":{"items":{"type":"string"},"type":"array","title":"Scopes","description":"What this key may do. Shown so you can tell keys apart before revoking one."},"environment":{"type":"string","enum":["live","sandbox"],"title":"Environment","description":"`live` or `sandbox`. Also readable from the prefix in `key_hint`.","default":"live"}},"type":"object","required":["key_id","key_hint"],"title":"PublicApiKeySummary","description":"A key in the account's inventory. Never includes the secret value or hash."},"PublicAvailableDomain":{"properties":{"domain":{"type":"string","title":"Domain","description":"Root domain available to order."},"status":{"type":"string","const":"available","title":"Status","default":"available"}},"type":"object","required":["domain"],"title":"PublicAvailableDomain","description":"A registrar-owned domain that is available for a new order."},"PublicAvailableDomainListResponse":{"properties":{"total":{"type":"integer","title":"Total","description":"Number of registrar domains currently available to order."},"items":{"items":{"$ref":"#/components/schemas/PublicAvailableDomain"},"type":"array","title":"Items"}},"type":"object","required":["total"],"title":"PublicAvailableDomainListResponse"},"PublicBillingCheckoutConfirmationRequest":{"properties":{"checkout_session_id":{"type":"string","maxLength":255,"minLength":1,"title":"Checkout Session Id"},"domains":{"items":{"type":"string"},"type":"array","maxItems":1,"minItems":1,"title":"Domains"},"idempotency_key":{"type":"string","maxLength":255,"minLength":1,"title":"Idempotency Key"}},"type":"object","required":["checkout_session_id","domains","idempotency_key"],"title":"PublicBillingCheckoutConfirmationRequest","description":"A completed hosted Checkout tied to the same domain set and order key."},"PublicBillingConfirmationRequest":{"properties":{"domains":{"items":{"type":"string"},"type":"array","maxItems":1,"minItems":1,"title":"Domains","description":"Exactly one domain. The returned proof is bound to one order idempotency key; repeat the billing/order pair per domain."},"idempotency_key":{"type":"string","maxLength":255,"minLength":1,"title":"Idempotency Key"},"mailbox_count":{"type":"integer","maximum":100.0,"minimum":1.0,"title":"Mailbox Count"},"max_amount_today_cents":{"anyOf":[{"type":"integer","maximum":100000000.0,"minimum":0.0},{"type":"null"}],"title":"Max Amount Today Cents","description":"Optional hard spending ceiling. For an existing subscription the billing write fails before changing Stripe when its read-only proration preview exceeds this amount."}},"type":"object","required":["domains","idempotency_key","mailbox_count"],"title":"PublicBillingConfirmationRequest","description":"The exact domain set and order key whose paid capacity is requested."},"PublicBillingConfirmationResponse":{"properties":{"mode":{"anyOf":[{"type":"string","enum":["first_order","subsequent_order"]},{"type":"null"}],"title":"Mode"},"confirmed":{"type":"boolean","title":"Confirmed"},"billing_confirmation_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Billing Confirmation Token"},"checkout_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Checkout Url"},"checkout_session_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Checkout Session Id"},"quantity":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Quantity"},"billing_domain_set_hash":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Billing Domain Set Hash"},"order_idempotency_key":{"type":"string","title":"Order Idempotency Key"},"amount_today_cents":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Amount Today Cents"},"amount_charged_to_card_cents":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Amount Charged To Card Cents"},"account_credit_applied_cents":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Account Credit Applied Cents"},"current_period_end":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Current Period End"}},"type":"object","required":["confirmed","order_idempotency_key"],"title":"PublicBillingConfirmationResponse","description":"Paid-order proof, or the hosted Checkout URL needed to obtain it."},"PublicBillingInvoice":{"properties":{"id":{"type":"string","title":"Id"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"amount_due":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Amount Due","description":"Amount due in the smallest currency unit (e.g. cents)."},"currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Currency"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"},"hosted_invoice_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hosted Invoice Url","description":"Stripe-hosted invoice URL, when available."}},"type":"object","required":["id"],"title":"PublicBillingInvoice","description":"A single billing invoice."},"PublicBillingInvoicesResponse":{"properties":{"total":{"type":"integer","title":"Total","description":"Number of invoices returned."},"items":{"items":{"$ref":"#/components/schemas/PublicBillingInvoice"},"type":"array","title":"Items"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message","description":"Guidance when invoices are not exposed through the API."}},"type":"object","required":["total"],"title":"PublicBillingInvoicesResponse","description":"Invoice history for the account."},"PublicBillingResponse":{"properties":{"plan_code":{"type":"string","title":"Plan Code","description":"Plan identifier, e.g. `active-domain`."},"plan_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Plan Label","description":"Human-readable plan name."},"price_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Price Label","description":"Human-readable price, when known."},"billing_status":{"type":"string","title":"Billing Status","description":"`active`, `invited`, `past_due`, or `suspended`."},"subscription_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subscription Status","description":"Customer-visible Stripe subscription status."},"active_domain_quantity":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Active Domain Quantity","description":"Number of active (billed) domains on the subscription. `null` means the quantity has not been mirrored from Stripe yet — it does NOT mean zero."},"orders_included_month":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Orders Included Month","description":"Monthly order allowance."},"orders_unlimited":{"type":"boolean","title":"Orders Unlimited","default":false},"current_period_start":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Current Period Start","description":"Current billing period start (UTC ISO 8601)."},"current_period_end":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Current Period End","description":"Current billing period end (UTC ISO 8601)."},"billing_updated_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Billing Updated At","description":"Last billing state change (UTC ISO 8601)."}},"type":"object","required":["plan_code","billing_status"],"title":"PublicBillingResponse","description":"Subscription summary for the account. No raw Stripe identifiers or secrets."},"PublicBillingUsageResponse":{"properties":{"plan_code":{"type":"string","title":"Plan Code","description":"Plan identifier, e.g. `active-domain`."},"billing_status":{"type":"string","title":"Billing Status","description":"`active`, `invited`, `past_due`, or `suspended`."},"orders_used_month":{"type":"integer","title":"Orders Used Month","description":"Orders consumed in the current period.","default":0},"orders_included_month":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Orders Included Month","description":"Monthly order allowance."},"orders_unlimited":{"type":"boolean","title":"Orders Unlimited","description":"True when the plan has no monthly order cap.","default":false},"active_domain_quantity":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Active Domain Quantity","description":"Number of active (billed) domains on the subscription. `null` means the quantity has not been mirrored from Stripe yet — it does NOT mean zero."},"current_period_start":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Current Period Start","description":"Current billing period start (UTC ISO 8601)."},"current_period_end":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Current Period End","description":"Current billing period end (UTC ISO 8601)."}},"type":"object","required":["plan_code","billing_status"],"title":"PublicBillingUsageResponse","description":"Current-period order usage and quota for the account."},"PublicBulkOrderCreateRequest":{"properties":{"orders":{"items":{"$ref":"#/components/schemas/PublicOrderCreateRequest"},"type":"array","maxItems":25,"minItems":1,"title":"Orders","description":"One entry per domain (1–25). Each entry is a full order request."}},"type":"object","required":["orders"],"title":"PublicBulkOrderCreateRequest","description":"Order mailboxes for several domains in one call."},"PublicBulkOrderResponse":{"properties":{"total":{"type":"integer","title":"Total","description":"Number of domains in the request."},"accepted":{"type":"integer","title":"Accepted","description":"Domains whose orders were accepted."},"failed":{"type":"integer","title":"Failed","description":"Domains whose orders were rejected (see per-item error)."},"results":{"items":{"$ref":"#/components/schemas/PublicBulkOrderResult"},"type":"array","title":"Results"}},"type":"object","required":["total","accepted","failed"],"title":"PublicBulkOrderResponse","description":"Outcome of a bulk order. Each domain succeeds or fails independently."},"PublicBulkOrderResult":{"properties":{"domain":{"type":"string","title":"Domain"},"ok":{"type":"boolean","title":"Ok","description":"True when the order was accepted for this domain."},"order_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Order Id"},"job_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Job Id"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"reused":{"type":"boolean","title":"Reused","default":false},"error_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Code","description":"Machine-readable error code when `ok` is false."},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message","description":"Customer-safe error message when `ok` is false."}},"type":"object","required":["domain","ok"],"title":"PublicBulkOrderResult","description":"Per-domain outcome inside a bulk order response."},"PublicCapacityResponse":{"properties":{"requested_domains":{"type":"integer","title":"Requested Domains","description":"How many domains you asked about."},"ready_domain_capacity":{"type":"integer","title":"Ready Domain Capacity","description":"Domains we can start provisioning immediately."},"can_start":{"type":"boolean","title":"Can Start","description":"True when capacity covers the request — safe to order now."},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message","description":"Human-readable guidance when capacity is not ready, including a concrete ETA when known."},"capacity_ready_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Capacity Ready At","description":"UTC ISO 8601 time capacity is expected to be ready (only when `can_start` is false and an ETA is known)."},"checked_at":{"type":"string","title":"Checked At","description":"When this snapshot was taken (UTC ISO 8601)."}},"type":"object","required":["requested_domains","ready_domain_capacity","can_start","checked_at"],"title":"PublicCapacityResponse","description":"Whether provisioning capacity is ready for N domains right now."},"PublicConnectionsResponse":{"properties":{"registrar":{"$ref":"#/components/schemas/PublicRegistrarConnection"},"sequencer":{"$ref":"#/components/schemas/PublicSequencerConnection"}},"type":"object","title":"PublicConnectionsResponse"},"PublicDnsDelegationResponse":{"properties":{"domain":{"type":"string","title":"Domain"},"dns_mode":{"type":"string","enum":["porkbun","cf_delegated"],"title":"Dns Mode","description":"`porkbun` = native path; `cf_delegated` = Cloudflare NS delegation."},"status":{"type":"string","title":"Status","description":"`unset`, `ns_pending`, `ns_active`, `records_written`, `live`, or `failed`."},"nameservers":{"items":{"type":"string"},"type":"array","title":"Nameservers","description":"The two Cloudflare nameservers to set at your registrar."},"zone_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Zone Id","description":"Cloudflare zone id (internal reference)."},"ns_verified_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ns Verified At","description":"When we first confirmed the delegation (UTC ISO 8601)."},"reason_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason Code","description":"Set when status is `failed` or the CF path is unavailable."}},"type":"object","required":["domain","dns_mode","status"],"title":"PublicDnsDelegationResponse","description":"Cloudflare NS-delegation state for a domain at a foreign registrar.\n\nOnly meaningful for domains using `dns_mode='cf_delegated'`. Point your\nregistrar's nameservers at the two returned Cloudflare nameservers; once we\ndetect the delegation the status advances from `ns_pending` to `ns_active`."},"PublicDnsDriftHistoryResponse":{"properties":{"domain":{"type":"string","title":"Domain"},"total":{"type":"integer","title":"Total"},"items":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Items"}},"type":"object","required":["domain","total"],"title":"PublicDnsDriftHistoryResponse","description":"Past drift episodes. One entry per episode, not per check."},"PublicDnsDriftOverview":{"properties":{"total":{"type":"integer","title":"Total","default":0},"drifted":{"type":"integer","title":"Drifted","default":0},"items":{"items":{"$ref":"#/components/schemas/PublicDnsDriftVerdict"},"type":"array","title":"Items"}},"type":"object","title":"PublicDnsDriftOverview","description":"Last stored verdict for every domain in the account. Resolves nothing live."},"PublicDnsDriftVerdict":{"properties":{"domain":{"type":"string","title":"Domain"},"basis":{"type":"string","title":"Basis","description":"`target_state` when we provisioned this domain and can compare against the records we applied; `no_target_state` when we did not, in which case there is nothing to judge against and `status` says so rather than claiming all-clear."},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"},"status":{"type":"string","title":"Status","description":"`match`, `drift`, `not_checked`, or `unknown`."},"severity":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Severity","description":"Worst finding: `critical`, `high`, `medium`, `low`."},"resolver_available":{"type":"boolean","title":"Resolver Available","description":"False when DNS could not be read at all.","default":true},"records":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Records","description":"Per record: expected, observed, detail, severity."},"drifted":{"items":{"type":"string"},"type":"array","title":"Drifted","description":"Which record kinds drifted."},"first_seen_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First Seen At","description":"When this episode started."},"observed_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Observed At"},"episode":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Episode"},"episode_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Episode Id"}},"type":"object","required":["domain","basis","status"],"title":"PublicDnsDriftVerdict","description":"Whether one domain's DNS still matches what we applied to it."},"PublicDnsRecord":{"properties":{"name":{"type":"string","title":"Name","description":"Host the record lives on, e.g. `_dmarc.example.com`."},"type":{"type":"string","enum":["MX","SPF","AUTODISCOVER","DMARC","DKIM"],"title":"Type","description":"Record role."},"present":{"type":"boolean","title":"Present","description":"True when any record of this type is published."},"valid":{"type":"boolean","title":"Valid","description":"True when the published record matches the expected Microsoft target."},"detail":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Detail","description":"Human-readable description of what this record does."}},"type":"object","required":["name","type","present","valid"],"title":"PublicDnsRecord","description":"One authoritative mail/auth DNS record and its live state."},"PublicDnsStatusResponse":{"properties":{"domain":{"type":"string","title":"Domain"},"basis":{"type":"string","const":"target_state","title":"Basis","description":"`target_state` — we provisioned this domain, so every record is compared against the record set we applied. Contrast `observed`, returned for a domain we do not manage, which carries no `valid` flag and no `deliverability_ready`.","default":"target_state"},"deliverability_ready":{"type":"boolean","title":"Deliverability Ready","description":"True when MX, SPF, and DMARC all validate — mail flows and passes auth."},"resolver_available":{"type":"boolean","title":"Resolver Available","description":"False when our resolver hit a transient error; treat record states as inconclusive.","default":true},"records":{"items":{"$ref":"#/components/schemas/PublicDnsRecord"},"type":"array","title":"Records"},"checked_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Checked At","description":"When this snapshot was taken (UTC ISO 8601)."}},"type":"object","required":["domain","deliverability_ready"],"title":"PublicDnsStatusResponse","description":"Live deliverability/auth posture for a domain (public-resolver snapshot)."},"PublicDomainCancellationResponse":{"properties":{"domain":{"type":"string","title":"Domain","description":"Root domain the cancellation applies to."},"status":{"type":"string","title":"Status","description":"Cancellation record status, e.g. `pending`."},"cancellation_kind":{"type":"string","title":"Cancellation Kind","description":"`domain_quantity_decrease` (one domain drops off a multi-domain subscription) or `subscription_period_end_cancel` (this was the last active domain, so the whole subscription ends)."},"effective_at":{"type":"string","title":"Effective At","description":"When the cancellation takes effect (UTC ISO 8601). The domain keeps sending until this moment — it is a subscription renewal boundary, never 'now'."},"active_until":{"type":"string","title":"Active Until","description":"Same instant as `effective_at`, named for readability."},"subscription_cancel_at_period_end":{"type":"boolean","title":"Subscription Cancel At Period End","description":"True when this was the last active domain and the whole subscription ends.","default":false},"minimum_term_applied":{"type":"boolean","title":"Minimum Term Applied","description":"True when the one-full-billing-month minimum term pushed `effective_at` past the next renewal. Every domain is paid for at least one full month.","default":false},"next_renewal_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Renewal At","description":"The subscription's next renewal (UTC ISO 8601). Compare with `effective_at`."},"already_pending":{"type":"boolean","title":"Already Pending","description":"True when a cancellation for this domain was already scheduled. The call changed nothing and nothing was sent to Stripe a second time — repeat calls are safe.","default":false},"operator_task_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Operator Task Status","description":"Internal teardown task state for this cancellation."}},"type":"object","required":["domain","status","cancellation_kind","effective_at","active_until"],"title":"PublicDomainCancellationResponse","description":"A scheduled active-domain cancellation."},"PublicDomainListResponse":{"properties":{"total":{"type":"integer","title":"Total","description":"Number of domains on the account."},"items":{"items":{"$ref":"#/components/schemas/PublicDomainSummary"},"type":"array","title":"Items"}},"type":"object","required":["total"],"title":"PublicDomainListResponse"},"PublicDomainOrderRequest":{"properties":{"root_domain":{"type":"string","maxLength":255,"minLength":1,"title":"Root Domain","description":"Approved root domain to provision, e.g. `example-outreach.com`.","examples":["example-outreach.com"]},"mailbox_count":{"type":"integer","maximum":100.0,"minimum":1.0,"title":"Mailbox Count","description":"How many mailboxes to create (1-100). The portal offers four steps (25, 50, 75, 100) and recommends 50; any value in range is accepted here. Price follows the number of DOMAINS, not the density: 100 mailboxes on one domain is the cheapest order and the one with the least room to recover if that domain's sending reputation drops. The same 100 spread over four domains costs four times as much and survives one bad domain. Defaults to 50.","default":50,"examples":[50]},"name_mode":{"type":"string","enum":["automatic","names","csv"],"title":"Name Mode","description":"`automatic` (default) — one unique realistic person per mailbox. `names` — supply 1–9 people in `names`. `csv` — supply every mailbox explicitly in `mailboxes`.","default":"automatic","examples":["automatic"]},"names":{"items":{"$ref":"#/components/schemas/PublicOrderName"},"type":"array","maxItems":9,"title":"Names","description":"Required for `names` mode: 1–9 people."},"mailboxes":{"items":{"$ref":"#/components/schemas/PublicOrderMailboxRow"},"type":"array","maxItems":100,"title":"Mailboxes","description":"Required for `csv` mode: one row per mailbox."},"idempotency_key":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Idempotency Key","description":"Retry-safe order key. Reusing the same key with the same inputs returns the original order instead of creating a duplicate."},"billing_confirmation_token":{"anyOf":[{"type":"string","maxLength":8192},{"type":"null"}],"title":"Billing Confirmation Token","description":"Stripe Checkout confirmation for paid plans. Omitting it on a paid plan returns 402 `payment_required`."},"sequencer_provider":{"anyOf":[{"type":"string","enum":["emailbison","mailionaire","instantly","plusvibe","smartlead","customer_graph"]},{"type":"null"}],"title":"Sequencer Provider"},"graph_profile_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Graph Profile Id"},"warmup_provider":{"anyOf":[{"type":"string","enum":["emailbison","instantly","smartlead"]},{"type":"null"}],"title":"Warmup Provider"}},"type":"object","required":["root_domain"],"title":"PublicDomainOrderRequest","description":"Provision mailboxes for one of your approved domains.\n\nA domain-centric alias of `POST /orders`: it runs the identical order path\n(same billing gate, same provisioning), just keyed on `root_domain` with\n`mailbox_count` defaulting to the recommended density. It provisions\nmailboxes for a domain already approved on your account — it does not add or\napprove a new domain (that happens through the portal consent flow)."},"PublicDomainSetup":{"properties":{"stage":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Stage","description":"Current stage number (1-based)."},"total_stages":{"type":"integer","title":"Total Stages","description":"Total pipeline stages.","default":7},"state":{"type":"string","title":"State","description":"`available`, `active`, `complete`, `blocked`, `review`, or `action_required`."},"label":{"type":"string","title":"Label","description":"Short label for the current stage."},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message","description":"Extra customer-safe context, when available."}},"type":"object","required":["state","label"],"title":"PublicDomainSetup","description":"Provisioning pipeline position for a domain."},"PublicDomainSummary":{"properties":{"domain":{"type":"string","title":"Domain","description":"Root domain, e.g. `example-outreach.com`."},"status":{"type":"string","title":"Status","description":"Consent/approval status of the domain on your account."},"mailbox_count":{"type":"integer","title":"Mailbox Count","description":"Mailboxes provisioned on this domain.","default":0},"sender_accounts_total":{"type":"integer","title":"Sender Accounts Total","description":"Sender accounts tracked for this domain.","default":0},"senders_connected":{"type":"integer","title":"Senders Connected","description":"Sender accounts currently connected to the sequencer.","default":0},"health":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Health","description":"`healthy`, `warming`, `inactive`, or `disconnected`."},"setup":{"anyOf":[{"$ref":"#/components/schemas/PublicDomainSetup"},{"type":"null"}],"description":"Pipeline position, when a setup is in flight or done."},"workspaces":{"items":{"$ref":"#/components/schemas/PublicWorkspaceReference"},"type":"array","title":"Workspaces","description":"Sequencer workspaces this domain is assigned to."},"mail_reachability":{"$ref":"#/components/schemas/PublicMailReachability","description":"Can this domain receive mail right now? Defaults to `unknown`."}},"type":"object","required":["domain","status"],"title":"PublicDomainSummary","description":"One of your domains and its provisioning/sending posture."},"PublicDomainWorkspaceRequest":{"properties":{"provider":{"type":"string","enum":["emailbison","mailionaire"],"title":"Provider","description":"Sending provider for this workspace. Use `mailionaire` for native sending.","default":"emailbison"},"workspace_id":{"type":"string","maxLength":255,"minLength":1,"title":"Workspace Id","description":"Workspace id returned by `GET /workspaces` (the exact workspace name is also accepted)."}},"type":"object","required":["workspace_id"],"title":"PublicDomainWorkspaceRequest"},"PublicDomainWorkspaceResponse":{"properties":{"domain":{"type":"string","title":"Domain"},"workspace":{"$ref":"#/components/schemas/PublicWorkspaceReference"}},"type":"object","required":["domain","workspace"],"title":"PublicDomainWorkspaceResponse"},"PublicEvent":{"properties":{"type":{"type":"string","title":"Type","description":"Event type, e.g. `order.received`, `domain.ready`, `order.failed`."},"occurred_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Occurred At","description":"When the event happened (UTC ISO 8601)."},"domain":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Domain","description":"Domain the event concerns, when applicable."},"order_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Order Id","description":"Related order id, when applicable."},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message","description":"Human-readable summary of the event."}},"type":"object","required":["type"],"title":"PublicEvent","description":"One customer-visible lifecycle event."},"PublicEventListResponse":{"properties":{"total":{"type":"integer","title":"Total","description":"Number of events returned."},"items":{"items":{"$ref":"#/components/schemas/PublicEvent"},"type":"array","title":"Items"}},"type":"object","required":["total"],"title":"PublicEventListResponse"},"PublicForeignDnsObservationResponse":{"properties":{"domain":{"type":"string","title":"Domain"},"basis":{"type":"string","const":"observed","title":"Basis","description":"`observed` — we do not manage this domain's DNS and can only report what is published publicly. No record here is verified against a target.","default":"observed"},"resolver_available":{"type":"boolean","title":"Resolver Available","description":"False when our resolver hit a transient error; every finding is then `unknown`.","default":true},"records":{"items":{"$ref":"#/components/schemas/PublicForeignDnsRecord"},"type":"array","title":"Records"},"checked_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Checked At","description":"When this snapshot was taken (UTC ISO 8601)."}},"type":"object","required":["domain"],"title":"PublicForeignDnsObservationResponse","description":"What is published on a domain we did not provision — an observation.\n\nThere is NO ``deliverability_ready`` field, on purpose. Readiness is a claim\nabout records matching an intended configuration; on a domain we do not\nmanage we were never told the intent. Emitting the flag as ``false`` would\nread to the portal as \"mail delivery is at risk\" on a domain that is\nperfectly healthy, which is the exact inversion this split exists to stop."},"PublicForeignDnsRecord":{"properties":{"name":{"type":"string","title":"Name","description":"Host the observation was made on, e.g. `_dmarc.example.com`."},"type":{"type":"string","enum":["MX","SPF","DMARC","DKIM"],"title":"Type","description":"Record role."},"observed":{"type":"boolean","title":"Observed","description":"True when a record of this role is published and we read it."},"finding":{"type":"string","enum":["ok","attention","unknown"],"title":"Finding","description":"`ok` = published and syntactically sound — NOT verified, we never had a target to compare against. `attention` = an objective defect (nothing published, or a duplicate receivers reject). `unknown` = we could not look, or cannot look (DKIM has no discoverable selector)."},"detail":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Detail","description":"The observed fact, in plain language. Never an instruction."}},"type":"object","required":["name","type","observed","finding"],"title":"PublicForeignDnsRecord","description":"One publicly observed mail DNS record on a domain we do NOT manage.\n\nDeliberately shares NO field name with ``PublicDnsRecord`` beyond ``name`` /\n``type`` / ``detail``: ``observed``/``finding`` here versus ``present``/\n``valid`` there. A client written for the owned shape reads ``undefined``\noff this record instead of a plausible wrong boolean — the whole reason the\ntwo classes are separate models rather than one model with a flag."},"PublicMailReachability":{"properties":{"status":{"type":"string","enum":["reachable","unreachable","unknown"],"title":"Status","description":"`reachable` — a Microsoft MX is published and its target resolves. `unreachable` — provably not reachable; see `reason`. `unknown` — not measured, not measurable, or not ours to judge. Do not treat `unknown` as a failure.","default":"unknown"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason","description":"Why, when known. Unreachable: `mx_target_unresolvable` (the MX names a hostname that does not exist), `mx_missing` (the domain resolves and publishes no MX), `domain_unresolvable` (the domain itself is not in DNS at all — a lapsed registration or missing nameservers, so there is no record to fix), `mx_foreign` (mail is routed away from the tenant we set up). Unknown: `not_checked`, `resolver_unavailable`, `mx_target_lookup_unavailable`, `setup_incomplete` (setup is still running, so our MX is not published yet), `mx_not_managed_by_us` (your own tenant routes its mail elsewhere, which is yours to decide)."},"checked_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Checked At","description":"When this was last measured (UTC ISO-8601), if ever."}},"type":"object","title":"PublicMailReachability","description":"Whether this domain can actually RECEIVE mail on the tenant we set up.\n\nSeparate from `status` and `setup` on purpose: those describe where the\ndomain is in its lifecycle, and no lifecycle value can answer \"does mail\narrive\". Three domains once sat at `status: active` with an MX pointing at a\nhostname that does not exist in DNS.\n\nThree values, never two: `unknown` means we have no measurement, NOT that\nsomething is wrong. Treat only `unreachable` as a problem.\n\n`unreachable` is reserved for a domain whose setup is THROUGH and whose mail\npath we manage. While a setup is still running our MX has not been published\nyet, so the domain is `unknown` (`setup_incomplete`) rather than broken; and\non a domain you brought yourself, mail routed to your own gateway is\n`unknown` (`mx_not_managed_by_us`), not a defect of ours."},"PublicMailboxListResponse":{"properties":{"domain":{"type":"string","title":"Domain"},"total":{"type":"integer","title":"Total"},"limit":{"type":"integer","title":"Limit"},"offset":{"type":"integer","title":"Offset"},"items":{"items":{"$ref":"#/components/schemas/PublicMailboxSummary"},"type":"array","title":"Items"}},"type":"object","required":["domain","total","limit","offset"],"title":"PublicMailboxListResponse"},"PublicMailboxStatusResponse":{"properties":{"email":{"type":"string","title":"Email","description":"Full mailbox address."},"status":{"type":"string","title":"Status","description":"Lifecycle status, e.g. `planned`, `mailbox_ready`, `sender_connected`, `failed`."},"connected":{"type":"boolean","title":"Connected","description":"True when the mailbox is connected to the sequencer and ready to send."},"warmup_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Warmup Score","description":"Warmup score reported by the sequencer, when available."},"sent_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Sent Count","description":"Messages sent, when reported."},"reply_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Reply Count","description":"Replies received, when reported."},"bounce_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Bounce Count","description":"Bounces, when reported."}},"type":"object","required":["email","status","connected"],"title":"PublicMailboxStatusResponse","description":"Connection and warmup status for a single mailbox. Passwords are never exposed."},"PublicMailboxSummary":{"properties":{"email":{"type":"string","title":"Email","description":"Full mailbox address."},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name","description":"Sender display name."},"status":{"type":"string","title":"Status","description":"Lifecycle status, e.g. `planned`, `mailbox_ready`, `sender_connected`, `failed`."},"connected":{"type":"boolean","title":"Connected","description":"True when the mailbox is connected to the sequencer and ready to send."},"warmup_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Warmup Score","description":"Warmup score reported by the sequencer, when available."},"sent_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Sent Count","description":"Messages sent, when reported."},"reply_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Reply Count","description":"Replies received, when reported."},"bounce_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Bounce Count","description":"Bounces, when reported."},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"}},"type":"object","required":["email","status","connected"],"title":"PublicMailboxSummary","description":"One mailbox and its sender-connection state. Passwords are never exposed."},"PublicMailboxUpdateRequest":{"properties":{"display_name":{"anyOf":[{"type":"string","maxLength":240},{"type":"null"}],"title":"Display Name","description":"Sender display name."},"daily_limit":{"anyOf":[{"type":"integer","maximum":200.0,"minimum":1.0},{"type":"null"}],"title":"Daily Limit","description":"Daily sending/warmup limit for the mailbox (1–200)."}},"type":"object","title":"PublicMailboxUpdateRequest","description":"Fields you can change on a mailbox. Omit a field to leave it unchanged."},"PublicNotification":{"properties":{"id":{"type":"string","title":"Id","description":"Notification identifier."},"type":{"type":"string","title":"Type","description":"Notification type, e.g. `order.received`, `domain.ready`, `order.failed`."},"subject":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subject","description":"Subject line of the notification."},"status":{"type":"string","title":"Status","description":"Delivery status: `pending`, `sent`, or `failed`."},"domain":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Domain","description":"Domain the notification concerns, when applicable."},"order_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Order Id","description":"Related order id, when applicable."},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"}},"type":"object","required":["id","type","status"],"title":"PublicNotification","description":"One customer-facing notification from your account's ledger."},"PublicNotificationListResponse":{"properties":{"total":{"type":"integer","title":"Total","description":"Number of notifications returned."},"items":{"items":{"$ref":"#/components/schemas/PublicNotification"},"type":"array","title":"Items"}},"type":"object","required":["total"],"title":"PublicNotificationListResponse"},"PublicOrderCreateRequest":{"properties":{"domain":{"type":"string","maxLength":255,"minLength":1,"title":"Domain","description":"Root domain to provision, e.g. `example-outreach.com`. Assign it with `PUT /domains/{domain}/workspace` before billing.","examples":["example-outreach.com"]},"mailbox_count":{"type":"integer","maximum":100.0,"minimum":1.0,"title":"Mailbox Count","description":"How many mailboxes to create (1-100). The portal offers four steps (25, 50, 75, 100) and recommends 50; any value in range is accepted here. Price follows the number of DOMAINS, not the density: 100 mailboxes on one domain is the cheapest order and the one with the least room to recover if that domain's sending reputation drops. The same 100 spread over four domains costs four times as much and survives one bad domain.","examples":[50]},"name_mode":{"type":"string","enum":["automatic","names","csv"],"title":"Name Mode","description":"`automatic` — we generate one unique realistic person per mailbox (deterministic per domain; matches the portal's Automatic mode). `names` — you supply 1–9 people and we derive natural variations. `csv` — you supply every mailbox explicitly via `mailboxes`.","examples":["automatic"]},"names":{"items":{"$ref":"#/components/schemas/PublicOrderName"},"type":"array","maxItems":9,"title":"Names","description":"Required for `names` mode: 1–9 people."},"mailboxes":{"items":{"$ref":"#/components/schemas/PublicOrderMailboxRow"},"type":"array","maxItems":100,"title":"Mailboxes","description":"Required for `csv` mode: one row per mailbox."},"idempotency_key":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Idempotency Key","description":"Retry-safe order key. Reusing the same key with the same inputs returns the original order instead of creating a duplicate."},"billing_confirmation_token":{"anyOf":[{"type":"string","maxLength":8192},{"type":"null"}],"title":"Billing Confirmation Token","description":"Stripe Checkout confirmation for paid plans. Omitting it on a paid plan returns 402 `payment_required`."},"sequencer_provider":{"anyOf":[{"type":"string","enum":["emailbison","mailionaire","instantly","plusvibe","smartlead","customer_graph"]},{"type":"null"}],"title":"Sequencer Provider","description":"Sending provider. Required after disconnecting the legacy EmailBison connection; `mailionaire` uses native Graph sending."},"graph_profile_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Graph Profile Id","description":"Only with sequencer_provider=customer_graph: owned app profile ID. Opt-in destination, disabled by default. Requires graph:write in addition to orders:write. Live orders retain the normal billing gate and do not complete until scoped app access is verified."},"warmup_provider":{"anyOf":[{"type":"string","enum":["emailbison","instantly","smartlead"]},{"type":"null"}],"title":"Warmup Provider","description":"Optional separate warmup provider. `instantly` warms mailboxes; it does not become their sending provider."}},"type":"object","required":["domain","mailbox_count","name_mode"],"title":"PublicOrderCreateRequest","description":"Order mailboxes for one of your domains."},"PublicOrderCreateResponse":{"properties":{"order_id":{"type":"string","title":"Order Id","description":"Order identifier for status polling."},"job_id":{"type":"string","title":"Job Id","description":"Provisioning job attached to the order."},"domain":{"type":"string","title":"Domain"},"mailbox_count":{"type":"integer","title":"Mailbox Count"},"status":{"type":"string","title":"Status","description":"Initial job status, typically `queued`."},"reused":{"type":"boolean","title":"Reused","description":"True when an identical in-flight order was returned instead of creating a new one (idempotency).","default":false}},"type":"object","required":["order_id","job_id","domain","mailbox_count","status"],"title":"PublicOrderCreateResponse","description":"The accepted order. Poll `GET /orders/{order_id}` for progress."},"PublicOrderListResponse":{"properties":{"total":{"type":"integer","title":"Total","description":"Total orders on the account."},"limit":{"type":"integer","title":"Limit"},"offset":{"type":"integer","title":"Offset"},"items":{"items":{"$ref":"#/components/schemas/PublicOrderSummary"},"type":"array","title":"Items"}},"type":"object","required":["total","limit","offset"],"title":"PublicOrderListResponse"},"PublicOrderLogEntry":{"properties":{"timestamp":{"type":"string","title":"Timestamp","description":"When the log event occurred (UTC ISO 8601)."},"step":{"type":"string","title":"Step","description":"Pipeline step the event belongs to."},"state":{"type":"string","title":"State","description":"Step state, e.g. `running`, `completed`, `blocked`, `waiting`."},"summary":{"type":"string","title":"Summary","description":"Customer-safe description of what happened."},"hint":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hint","description":"What to do next, when applicable."}},"type":"object","required":["timestamp","step","state","summary"],"title":"PublicOrderLogEntry","description":"One customer-visible provisioning log line for an order."},"PublicOrderLogResponse":{"properties":{"order_id":{"type":"string","title":"Order Id"},"total":{"type":"integer","title":"Total","description":"Number of log entries returned."},"items":{"items":{"$ref":"#/components/schemas/PublicOrderLogEntry"},"type":"array","title":"Items"}},"type":"object","required":["order_id","total"],"title":"PublicOrderLogResponse"},"PublicOrderMailboxRow":{"properties":{"localpart":{"type":"string","maxLength":64,"minLength":1,"title":"Localpart","description":"Left side of the address (before the @), lowercase.","examples":["jordan.vega"]},"name":{"anyOf":[{"type":"string","maxLength":240},{"type":"null"}],"title":"Name","description":"Display name for the mailbox.","examples":["Jordan Vega"]}},"type":"object","required":["localpart"],"title":"PublicOrderMailboxRow","description":"An explicit mailbox for `csv` mode."},"PublicOrderName":{"properties":{"first_name":{"type":"string","maxLength":80,"minLength":1,"title":"First Name","description":"Given name."},"middle_name":{"anyOf":[{"type":"string","maxLength":80},{"type":"null"}],"title":"Middle Name","description":"Optional name part used only for mailbox-address variations."},"last_name":{"type":"string","maxLength":80,"minLength":1,"title":"Last Name","description":"Family name."},"display_name":{"anyOf":[{"type":"string","maxLength":240},{"type":"null"}],"title":"Display Name","description":"Public sender name. Defaults to given name plus family name."}},"type":"object","required":["first_name","last_name"],"title":"PublicOrderName","description":"A person for `names` mode (1–9 entries)."},"PublicOrderStatusResponse":{"properties":{"order_id":{"type":"string","title":"Order Id"},"domain":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Domain","description":"Domain the order provisions."},"mailbox_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Mailbox Count","description":"Mailboxes requested by the order."},"status":{"type":"string","title":"Status","description":"`queued`, `prepared`, `running`, `waiting_for_capacity`, `completed`, `blocked`, or `failed`."},"attempts":{"type":"integer","title":"Attempts","description":"Provisioning attempts so far.","default":0},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Updated At"},"completed_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Completed At","description":"Set when the order finished (UTC ISO 8601)."},"error_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Code","description":"Customer-safe error code when blocked/failed."},"error_summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Summary","description":"Customer-safe error summary when blocked/failed."},"auto_retry_scheduled":{"type":"boolean","title":"Auto Retry Scheduled","description":"True when a transient failure will retry automatically — no action needed.","default":false},"steps":{"items":{"$ref":"#/components/schemas/PublicOrderStep"},"type":"array","title":"Steps","description":"Customer-visible progress steps, in pipeline order."}},"type":"object","required":["order_id","status"],"title":"PublicOrderStatusResponse","description":"Current state of an order."},"PublicOrderStep":{"properties":{"key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Key","description":"Step identifier, e.g. `mailboxes`."},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label","description":"Human-readable step name."},"state":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State","description":"`queued`, `running`, `completed`, `blocked`, ..."},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary","description":"Customer-safe summary for the step."}},"type":"object","title":"PublicOrderStep","description":"One customer-visible step of the provisioning pipeline."},"PublicOrderSummary":{"properties":{"order_id":{"type":"string","title":"Order Id","description":"Order identifier — poll `GET /orders/{order_id}` for full status."},"domain":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Domain","description":"Domain the order provisions."},"mailbox_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Mailbox Count","description":"Mailboxes requested by the order."},"status":{"type":"string","title":"Status","description":"`queued`, `prepared`, `running`, `waiting`, `completed`, `blocked`, or `failed`."},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["order_id","status"],"title":"PublicOrderSummary","description":"One order in your account's order history."},"PublicPlan":{"properties":{"plan_code":{"type":"string","title":"Plan Code","description":"Plan identifier, e.g. `active_domain`."},"billing_status":{"type":"string","title":"Billing Status","description":"`active`, `invited`, `past_due`, or `suspended`."},"orders_limit_month":{"type":"integer","title":"Orders Limit Month","description":"Monthly order allowance (0 = none, high values = effectively unlimited)."},"orders_used_month":{"type":"integer","title":"Orders Used Month","description":"Orders consumed in the current period."},"current_period_start":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Current Period Start","description":"Current billing period start (UTC ISO 8601)."},"current_period_end":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Current Period End","description":"Current billing period end (UTC ISO 8601)."}},"type":"object","required":["plan_code","billing_status","orders_limit_month","orders_used_month"],"title":"PublicPlan","description":"The account's plan and billing posture."},"PublicRegistrarConnectRequest":{"properties":{"provider":{"type":"string","maxLength":64,"title":"Provider","description":"`porkbun`.","default":"porkbun"},"api_key":{"type":"string","maxLength":2048,"minLength":1,"title":"Api Key","description":"Registrar API key. Stored encrypted and never returned by any endpoint."},"api_secret":{"anyOf":[{"type":"string","maxLength":2048},{"type":"null"}],"title":"Api Secret","description":"Registrar API secret, where the provider uses one."}},"type":"object","required":["api_key"],"title":"PublicRegistrarConnectRequest"},"PublicRegistrarConnection":{"properties":{"connected":{"type":"boolean","title":"Connected","default":false},"provider":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Provider","description":"`porkbun` today."},"api_key_hint":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key Hint","description":"Last few characters, so you can tell two keys apart."},"verified_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Verified At"},"domain_count":{"type":"integer","title":"Domain Count","default":0},"available_domain_count":{"type":"integer","title":"Available Domain Count","description":"Domains at the registrar that are free to provision.","default":0},"last_error_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Error Code"}},"type":"object","title":"PublicRegistrarConnection","description":"Your domain registrar, as we see it. Never carries the credential back."},"PublicRegistrarSyncResponse":{"properties":{"provider":{"type":"string","title":"Provider"},"synced_at":{"type":"string","title":"Synced At"},"domain_count":{"type":"integer","title":"Domain Count","default":0},"added_domains":{"items":{"type":"string"},"type":"array","title":"Added Domains"},"removed_domains":{"items":{"type":"string"},"type":"array","title":"Removed Domains"}},"type":"object","required":["provider","synced_at"],"title":"PublicRegistrarSyncResponse"},"PublicSenderReconnectResponse":{"properties":{"domain":{"type":"string","title":"Domain","description":"Root domain the posture is reported for."},"senders_total":{"type":"integer","title":"Senders Total","description":"Sender accounts tracked on this domain.","default":0},"connected":{"type":"integer","title":"Connected","description":"Senders currently connected to the sequencer.","default":0},"disconnected":{"type":"integer","title":"Disconnected","description":"Senders currently disconnected (failed/disabled) — being re-driven automatically.","default":0},"reconnect_mode":{"type":"string","const":"automatic","title":"Reconnect Mode","description":"Always `automatic`: disconnected senders are re-driven server-side; no manual trigger is needed or accepted.","default":"automatic"},"message":{"type":"string","title":"Message","description":"Human-readable summary of the reconnect posture."},"checked_at":{"type":"string","title":"Checked At","description":"When this snapshot was taken (UTC ISO 8601)."}},"type":"object","required":["domain","message","checked_at"],"title":"PublicSenderReconnectResponse","description":"Live sender-connection posture for a domain. Reconnection is automatic —\na server-side watchdog continuously re-drives disconnected senders — so this\nreports the current state rather than enqueuing a manual reconnect."},"PublicSequencerConnectRequest":{"properties":{"api_token":{"type":"string","maxLength":4096,"minLength":1,"title":"Api Token","description":"Sequencer API token. Stored encrypted and never returned by any endpoint."},"base_url":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Base Url","description":"Your sequencer's base URL, for white-labelled instances."}},"type":"object","required":["api_token"],"title":"PublicSequencerConnectRequest"},"PublicSequencerConnection":{"properties":{"connected":{"type":"boolean","title":"Connected","default":false},"api_token_hint":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Token Hint"},"base_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Base Url"},"verified_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Verified At"},"last_synced_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Synced At"},"workspace_access":{"type":"string","title":"Workspace Access","default":"unknown"},"workspace_count":{"type":"integer","title":"Workspace Count","default":0},"last_error_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Error Code"}},"type":"object","title":"PublicSequencerConnection","description":"Your sending tool. Never carries the token back."},"PublicSequencerSyncResponse":{"properties":{"synced_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Synced At"},"workspace_count":{"type":"integer","title":"Workspace Count","default":0}},"type":"object","title":"PublicSequencerSyncResponse"},"PublicSummaryDomains":{"properties":{"total":{"type":"integer","title":"Total","description":"Domains on the account, archived ones excluded.","default":0},"by_health":{"additionalProperties":{"type":"integer"},"type":"object","title":"By Health","description":"Domain count per health verdict, e.g. `{\"healthy\": 4, \"at_risk\": 1}`."},"by_status":{"additionalProperties":{"type":"integer"},"type":"object","title":"By Status","description":"Domain count per consent/approval status."},"archived":{"type":"integer","title":"Archived","description":"Archived domains, kept resolvable but out of `total`.","default":0}},"type":"object","title":"PublicSummaryDomains","description":"Domain posture for the whole account."},"PublicSummaryMailboxes":{"properties":{"total":{"type":"integer","title":"Total","description":"Mailboxes tracked across every domain.","default":0},"connected":{"type":"integer","title":"Connected","description":"Mailboxes connected to the sequencer and able to send.","default":0},"by_status":{"additionalProperties":{"type":"integer"},"type":"object","title":"By Status","description":"Mailbox count per lifecycle status."},"last_synced_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Synced At","description":"Newest provider sync across the account (UTC ISO 8601)."}},"type":"object","title":"PublicSummaryMailboxes","description":"Mailbox posture for the whole account."},"PublicSummaryOrders":{"properties":{"used_this_period":{"type":"integer","title":"Used This Period","description":"Orders consumed in the current period.","default":0},"included_this_period":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Included This Period","description":"Monthly order allowance, when the plan has one."},"unlimited":{"type":"boolean","title":"Unlimited","description":"True when the plan has no monthly order cap.","default":false},"in_flight":{"type":"integer","title":"In Flight","description":"Recent orders that are neither completed nor failed.","default":0}},"type":"object","title":"PublicSummaryOrders","description":"Order posture for the current period."},"PublicSummaryResponse":{"properties":{"account_code":{"type":"string","title":"Account Code","description":"Short human-readable account code."},"billing_status":{"type":"string","title":"Billing Status","description":"`active`, `invited`, `past_due`, or `suspended`."},"active_domain_quantity":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Active Domain Quantity","description":"Domains currently billed on the subscription. `null` means the quantity has not been mirrored from Stripe yet — it does NOT mean zero. Compare it against `domains.total` to see whether billing and delivery agree."},"monthly_cost_cents":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Monthly Cost Cents","description":"What the active domains cost per month, in cents of the plan currency. `null` whenever `active_domain_quantity` is null — a price computed from an unknown quantity would be a made-up number."},"domains":{"$ref":"#/components/schemas/PublicSummaryDomains"},"mailboxes":{"$ref":"#/components/schemas/PublicSummaryMailboxes"},"sending":{"$ref":"#/components/schemas/PublicSummarySending"},"orders":{"$ref":"#/components/schemas/PublicSummaryOrders"},"checked_at":{"type":"string","title":"Checked At","description":"When this snapshot was taken (UTC ISO 8601)."}},"type":"object","required":["account_code","billing_status","domains","mailboxes","sending","orders","checked_at"],"title":"PublicSummaryResponse","description":"Everything an operator needs to know where the account stands, in one call.\n\nBuilt because the parts existed but the sum did not: reaching these numbers\nmeant `GET /domains`, then `GET /domains/{domain}/mailboxes` per domain, then\nadding the per-mailbox counters up by hand — 26 requests for a 25-domain\naccount against a 300/min budget, and every integration writing the same\nloop slightly differently."},"PublicSummarySending":{"properties":{"mailboxes_reporting":{"type":"integer","title":"Mailboxes Reporting","description":"Mailboxes that have reported counters at all — the denominator.","default":0},"mailboxes_total":{"type":"integer","title":"Mailboxes Total","description":"Mailboxes the counters could cover.","default":0},"sent":{"type":"integer","title":"Sent","description":"Messages sent, summed over reporting mailboxes.","default":0},"leads":{"type":"integer","title":"Leads","description":"Leads contacted, summed over reporting mailboxes.","default":0},"replies":{"type":"integer","title":"Replies","description":"Replies received, summed over reporting mailboxes.","default":0},"bounces":{"type":"integer","title":"Bounces","description":"Bounces, summed over reporting mailboxes.","default":0}},"type":"object","title":"PublicSummarySending","description":"Account-wide sending totals.\n\nRead `mailboxes_reporting` before you read the totals. These counters are\nfilled from provider observations and are documented as \"when reported\", so\non a young account most mailboxes carry none. `sent: 0` with\n`mailboxes_reporting: 0` means nobody has told us yet — it does not mean\nnothing was sent."},"PublicTeamAuditEvent":{"properties":{"at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"At"},"action":{"type":"string","title":"Action","description":"What happened, e.g. `member_invited`, `signed_in`."},"actor_type":{"type":"string","title":"Actor Type","default":""},"summary":{"type":"string","title":"Summary","default":""}},"type":"object","required":["action"],"title":"PublicTeamAuditEvent"},"PublicTeamAuditResponse":{"properties":{"total":{"type":"integer","title":"Total"},"items":{"items":{"$ref":"#/components/schemas/PublicTeamAuditEvent"},"type":"array","title":"Items"}},"type":"object","required":["total"],"title":"PublicTeamAuditResponse"},"PublicTeamInviteRequest":{"properties":{"email":{"type":"string","maxLength":254,"minLength":3,"title":"Email","description":"Who to invite."},"role":{"type":"string","title":"Role","description":"`admin` may manage the team; `member` may not. The owner role cannot be granted.","default":"member"},"allow_external":{"type":"boolean","title":"Allow External","description":"By default the invitee must share the owner's email domain. Set true to invite someone outside it, e.g. a freelancer on a personal address.","default":false}},"type":"object","required":["email"],"title":"PublicTeamInviteRequest"},"PublicTeamMember":{"properties":{"id":{"type":"string","title":"Id","description":"Member id. The owner is always `owner` and cannot be changed or removed."},"email":{"type":"string","title":"Email"},"role":{"type":"string","title":"Role","description":"`owner`, `admin` or `member`."},"status":{"type":"string","title":"Status","description":"`active` for the owner and accepted invites, `invited` until then."},"invited_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Invited At"},"accepted_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accepted At"},"is_owner":{"type":"boolean","title":"Is Owner","default":false}},"type":"object","required":["id","email","role","status"],"title":"PublicTeamMember","description":"One person with access to this workspace."},"PublicTeamMembersResponse":{"properties":{"total":{"type":"integer","title":"Total"},"items":{"items":{"$ref":"#/components/schemas/PublicTeamMember"},"type":"array","title":"Items"}},"type":"object","required":["total"],"title":"PublicTeamMembersResponse"},"PublicTeamRoleRequest":{"properties":{"role":{"type":"string","title":"Role","description":"`admin` or `member`."}},"type":"object","required":["role"],"title":"PublicTeamRoleRequest"},"PublicWebhookCreateRequest":{"properties":{"url":{"type":"string","maxLength":2048,"minLength":1,"title":"Url","description":"Absolute https(s) URL we POST events to.","examples":["https://example.com/hooks/mailionaire"]},"events":{"items":{"type":"string"},"type":"array","maxItems":11,"minItems":1,"title":"Events","description":"Event types to subscribe to. One of: order.created, order.completed, order.failed, domain.ready, domain.canceled, domain.dns_drift, email.sent, email.send_failed, email.bounced, reply.received, lead.unsubscribed.","examples":[["order.created","order.completed","order.failed","domain.ready","domain.canceled","domain.dns_drift","email.sent","email.send_failed","email.bounced","reply.received","lead.unsubscribed"]]}},"type":"object","required":["url","events"],"title":"PublicWebhookCreateRequest","description":"Register an endpoint to receive pushed lifecycle events."},"PublicWebhookCreateResponse":{"properties":{"id":{"type":"string","title":"Id","description":"Endpoint identifier."},"url":{"type":"string","title":"Url","description":"Delivery URL."},"events":{"items":{"type":"string"},"type":"array","title":"Events","description":"Subscribed event types."},"status":{"type":"string","title":"Status","description":"`active` or `disabled` (auto-disabled after repeated delivery failures)."},"secret_hint":{"type":"string","title":"Secret Hint","description":"Masked signing-secret hint (never the full secret)."},"failure_count":{"type":"integer","title":"Failure Count","description":"Consecutive delivery failures; resets to 0 on any success.","default":0},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"},"last_delivery_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Delivery At","description":"Last successful delivery (UTC ISO 8601)."},"disabled_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Disabled At","description":"When the endpoint was auto-disabled, if it was."},"secret":{"type":"string","title":"Secret","description":"HMAC signing secret. Shown only here, once. Store it securely."}},"type":"object","required":["id","url","status","secret_hint","secret"],"title":"PublicWebhookCreateResponse","description":"Creation response — carries the signing `secret` exactly once. Store it\nnow; it is never shown again."},"PublicWebhookDelivery":{"properties":{"id":{"type":"string","title":"Id","description":"Delivery id, used to fetch or replay it."},"webhook_id":{"type":"string","title":"Webhook Id","description":"The endpoint this went to."},"event_id":{"type":"string","title":"Event Id","description":"The event being delivered."},"event_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Event Type","description":"e.g. `order.completed`."},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status","description":"`pending` (still retrying), `delivering`, `delivered`, or `failed` (schedule exhausted)."},"attempt_count":{"type":"integer","title":"Attempt Count","description":"Attempts made so far."},"max_attempts":{"type":"integer","title":"Max Attempts","description":"Attempts before we give up, so you can read `3 of 9` off the row."},"response_status":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Response Status","description":"HTTP status your endpoint returned."},"response_excerpt":{"type":"string","title":"Response Excerpt","description":"First bytes of your endpoint's response body.","default":""},"error":{"type":"string","title":"Error","description":"Transport error, when there was no HTTP response at all.","default":""},"payload":{"additionalProperties":true,"type":"object","title":"Payload","description":"Exactly what we sent."},"next_retry_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Retry At"},"first_attempt_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First Attempt At"},"last_attempt_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Attempt At"},"delivered_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Delivered At"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"},"replay_of":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Replay Of","description":"Set on a replay, pointing at the delivery it was cloned from."}},"type":"object","required":["id","webhook_id","event_id","attempt_count","max_attempts"],"title":"PublicWebhookDelivery","description":"One attempt to deliver one event to one of your endpoints."},"PublicWebhookDeliveryListResponse":{"properties":{"total":{"type":"integer","title":"Total"},"items":{"items":{"$ref":"#/components/schemas/PublicWebhookDelivery"},"type":"array","title":"Items"}},"type":"object","required":["total"],"title":"PublicWebhookDeliveryListResponse"},"PublicWebhookListResponse":{"properties":{"total":{"type":"integer","title":"Total","description":"Number of registered endpoints."},"items":{"items":{"$ref":"#/components/schemas/PublicWebhookSummary"},"type":"array","title":"Items"}},"type":"object","required":["total"],"title":"PublicWebhookListResponse"},"PublicWebhookSummary":{"properties":{"id":{"type":"string","title":"Id","description":"Endpoint identifier."},"url":{"type":"string","title":"Url","description":"Delivery URL."},"events":{"items":{"type":"string"},"type":"array","title":"Events","description":"Subscribed event types."},"status":{"type":"string","title":"Status","description":"`active` or `disabled` (auto-disabled after repeated delivery failures)."},"secret_hint":{"type":"string","title":"Secret Hint","description":"Masked signing-secret hint (never the full secret)."},"failure_count":{"type":"integer","title":"Failure Count","description":"Consecutive delivery failures; resets to 0 on any success.","default":0},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"},"last_delivery_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Delivery At","description":"Last successful delivery (UTC ISO 8601)."},"disabled_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Disabled At","description":"When the endpoint was auto-disabled, if it was."}},"type":"object","required":["id","url","status","secret_hint"],"title":"PublicWebhookSummary","description":"A registered endpoint. The signing secret is masked here — the full\nsecret is returned only once, at creation."},"PublicWebhookTestResponse":{"properties":{"delivered":{"type":"boolean","title":"Delivered","description":"True when the endpoint returned a 2xx to the test event."},"event_id":{"type":"string","title":"Event Id","description":"Id of the test event."},"event_type":{"type":"string","title":"Event Type","description":"Always `ping` for a test."},"endpoint_id":{"type":"string","title":"Endpoint Id","description":"Endpoint the test was sent to."}},"type":"object","required":["delivered","event_id","event_type","endpoint_id"],"title":"PublicWebhookTestResponse","description":"Result of a synchronous `ping` test delivery."},"PublicWorkspaceListResponse":{"properties":{"total":{"type":"integer","title":"Total","description":"Number of sequencer workspaces visible to this account."},"items":{"items":{"$ref":"#/components/schemas/PublicWorkspaceSummary"},"type":"array","title":"Items"}},"type":"object","required":["total"],"title":"PublicWorkspaceListResponse"},"PublicWorkspaceReference":{"properties":{"workspace_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workspace Id"},"workspace_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workspace Name"}},"type":"object","title":"PublicWorkspaceReference","description":"Customer-safe sequencer workspace identity; never includes credentials."},"PublicWorkspaceSummary":{"properties":{"workspace_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workspace Id"},"workspace_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workspace Name"},"keywords":{"items":{"type":"string"},"type":"array","title":"Keywords","description":"Saved routing keywords for this workspace."}},"type":"object","title":"PublicWorkspaceSummary"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"WebsiteDnsRecord":{"properties":{"name":{"type":"string","title":"Name"},"type":{"type":"string","const":"A","title":"Type","default":"A"},"value":{"type":"string","title":"Value"}},"type":"object","required":["name","value"],"title":"WebsiteDnsRecord"},"WebsiteForwardingSettings":{"properties":{"domain":{"type":"string","title":"Domain"},"enabled":{"type":"boolean","title":"Enabled","default":false},"mode":{"type":"string","enum":["redirect","masking"],"title":"Mode","default":"masking"},"target_url":{"type":"string","title":"Target Url","default":""},"captcha":{"type":"boolean","title":"Captcha","default":false},"revision":{"type":"integer","title":"Revision","default":0},"status":{"type":"string","enum":["off","pending_dns","active","unavailable"],"title":"Status","default":"off"},"captcha_available":{"type":"boolean","title":"Captcha Available","default":false},"dns_records":{"items":{"$ref":"#/components/schemas/WebsiteDnsRecord"},"type":"array","title":"Dns Records"},"checked_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Checked At"}},"type":"object","required":["domain"],"title":"WebsiteForwardingSettings"},"WebsiteForwardingUpdate":{"properties":{"enabled":{"type":"boolean","title":"Enabled"},"mode":{"type":"string","enum":["redirect","masking"],"title":"Mode","default":"masking"},"target_url":{"type":"string","maxLength":2048,"title":"Target Url","default":""},"captcha":{"type":"boolean","title":"Captcha","default":false},"revision":{"type":"integer","minimum":0.0,"title":"Revision"}},"additionalProperties":false,"type":"object","required":["enabled","revision"],"title":"WebsiteForwardingUpdate"}},"securitySchemes":{"ApiKeyBearer":{"type":"http","scheme":"bearer","description":"Your API key, as `Authorization: Bearer mk_live_...`. Mint one in the portal under Settings -> API, or with POST /keys. Each key carries scopes; a call without the scope its endpoint needs returns 403 insufficient_scope. Scopes: account:read, domains:read, domains:write, mailboxes:read, mailboxes:write, orders:read, orders:write, billing:read, webhooks:read, webhooks:write, keys:read, keys:write, team:read, team:write, connections:read, connections:write, graph:read, graph:write."}}},"security":[{"ApiKeyBearer":[]}],"x-rateLimits":{"window_seconds":60,"scopes":[{"scope":"All endpoints, per key","limit":300},{"scope":"Order creation (POST /orders, POST /orders/bulk)","limit":10},{"scope":"Any write (bulk, export, reconnect, key mint/revoke)","limit":30}]}}