{"openapi":"3.1.0","info":{"title":"Unitpost API","version":"v1","description":"Public, versioned API for sending email and managing contacts, segments, campaigns, templates, domains, and webhooks. Authenticate every request with an API key: `Authorization: Bearer <key>`. A `User-Agent` header is required. Requests are scoped to the workspace that owns the key and are rate-limited per workspace. List endpoints are cursor-paginated via `limit`/`after`/`before` and return a `{ object: \"list\", has_more, data }` envelope. Register webhook endpoints to receive events: each create returns a `signing_secret` (`whsec_…`) exactly once. Every delivery is **svix-compatible**: it carries `svix-id`, `svix-timestamp`, and `svix-signature` (`v1,<base64 HMAC-SHA256>`) headers computed over `<id>.<timestamp>.<raw-body>` with your secret — verify them and reject deliveries whose signature doesn't match (any Svix-compatible library works). Inbound email that lands on a receiving-enabled domain is readable under `/emails/received`."},"servers":[{"url":"https://www.unitpost.com/api/v1","description":"Base URL"}],"security":[{"apiKey":[]}],"tags":[{"name":"Emails","description":"Send, schedule, retrieve, and cancel transactional email. Send one email or a batch of up to 100, track each message's delivery lifecycle, and pull aggregate deliverability stats for your workspace."},{"name":"Inbound emails","description":"Read email your receiving-enabled domains have received — list messages, retrieve full bodies, and download attachments via short-lived signed URLs."},{"name":"Contacts","description":"Manage the people you email. Create and update contacts one at a time or import thousands in the background, with standard and custom field values that templates can reference as variables."},{"name":"Contact fields","description":"Define the typed custom attributes (text, number, date, …) your contacts carry — usable in templates as per-recipient variables."},{"name":"Segments","description":"Named groups of contacts used to target campaigns. Segments decide who a campaign goes to; topics (below) decide what recipients can opt out of."},{"name":"Topics","description":"Subscription categories (e.g. Promotions) recipients can opt out of without leaving your list, independent of segment membership. Scope a campaign to a topic and opted-out contacts are skipped automatically."},{"name":"Campaigns","description":"One-to-many sends to a segment or an inline recipient list. Draft, validate, schedule, send, pause, resume, and cancel — with a pre-send report that catches problems before anything goes out."},{"name":"Templates","description":"Reusable email designs in the canonical block-based JSON format the dashboard editor produces, with per-recipient `{{variables}}` filled at send time."},{"name":"Brand kits","description":"Read-only Brand Kit profiles (voice, labeled colors, pinned library graphics, core pages) for on-brand template authoring. Writes and URL import stay in the dashboard (Settings → Brand)."},{"name":"Domains","description":"The domains you send from. Add a domain, publish its DNS records, verify it, and manage its tracking and TLS defaults — sending is blocked until the domain verifies."},{"name":"Webhooks","description":"Register HTTPS endpoints that receive signed event deliveries (delivered, bounced, opened, clicked, …). The signing secret is returned once on create; verify the signature on every delivery."},{"name":"API keys","description":"Create and revoke the API keys your integrations authenticate with. These endpoints are session-gated (dashboard cookie + `apikeys:manage`) and NOT usable with a Bearer API key."},{"name":"Suppressions","description":"Address-level send blocks — the hard \"never email this address\" list. Combines engine-written bounce/complaint entries, your own additions, and read-only Unitpost-wide blocks."},{"name":"Usage","description":"Your workspace's current billing-period usage: emails sent, and on paid plans the dollar sending wallet (monthly allowance, spend, purchased credit, overage) in integer USD cents."}],"paths":{"/emails":{"get":{"tags":["Emails"],"summary":"List sent emails","description":"Retrieve a list of emails your workspace has sent or scheduled. Results are newest-first and cursor-paginated, and each row is a reference to a single email (status and lifecycle timestamps, not the rendered body). Narrow the list with the `status`, `campaign_id`, `batch_id`, and `created_after`/`created_before` filters. Use an email's `id` with [Retrieve an email](#get-emails-id) to read its full record, or [Cancel or reschedule an email](#patch-emails-id) to change a scheduled send. For aggregate deliverability numbers over a window, see [Email deliverability stats](#get-emails-stats). Requires the `emails:read` capability.","parameters":[{"name":"limit","in":"query","required":false,"description":"Max rows to return (default 20, max 100).","schema":{"type":"integer","minimum":1,"maximum":100}},{"name":"after","in":"query","required":false,"description":"Return rows after this id (forward paging).","schema":{"type":"string"}},{"name":"before","in":"query","required":false,"description":"Return rows before this id (backward paging).","schema":{"type":"string"}},{"name":"status","in":"query","required":false,"description":"Filter by send status.","schema":{"type":"string","enum":["scheduled","queued","sent","delivered","bounced","complained","canceled","failed"]}},{"name":"campaign_id","in":"query","required":false,"description":"Only emails produced by this campaign's fan-out.","schema":{"type":"string"}},{"name":"batch_id","in":"query","required":false,"description":"Only emails sent as part of this batch.","schema":{"type":"string"}},{"name":"created_after","in":"query","required":false,"description":"Only emails created at/after this ISO 8601 time.","schema":{"type":"string"}},{"name":"created_before","in":"query","required":false,"description":"Only emails created at/before this ISO 8601 time.","schema":{"type":"string"}}],"responses":{"200":{"description":"A page of emails.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["list"]},"has_more":{"type":"boolean"},"data":{"type":"array","items":{"$ref":"#/components/schemas/Email"}}},"required":["object","has_more","data"]}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Insufficient scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Invalid pagination or filter params.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"tags":["Emails"],"summary":"Send or schedule an email","description":"Send a single transactional email — now, or at a future time by passing `scheduled_at`. Provide the content inline as `html`/`text`, or reference a saved template with `template` (create one with [Create a template](#post-templates)). Pass an `Idempotency-Key` header to make retries safe: the same key replays the original result instead of sending twice. The response returns the new email's `id` — read its delivery status back with [Retrieve an email](#get-emails-id), change a scheduled send with [Cancel or reschedule an email](#patch-emails-id), or send many at once with [Send a batch of emails](#post-emails-batch). Requires the `emails:send` capability.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SendEmail"}}}},"responses":{"200":{"description":"Accepted for delivery or scheduled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SendResult"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Insufficient scope, or sending domain not found / not verified.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Template not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Idempotency conflict (same key, different body / in-flight).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests, or sending is paused: `rate_limit_exceeded` (request rate), `quota_exceeded` (free-tier daily/monthly cap, or the plan's monthly sending allowance and any purchased credit are spent), or `overage_cap_exceeded` (a paid plan reached its overage cap — sending resumes when the allowance refreshes, or buy a credit top-up). Includes a `Retry-After` header with the seconds until the window resets (the billing period end for quota/overage blocks).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/emails/batch":{"post":{"tags":["Emails"],"summary":"Send a batch of emails","description":"Send up to 100 transactional emails in a single request. Validation is all-or-nothing: if any item is invalid the whole batch is rejected and nothing is queued, so you never end up with a partial send. Pass an `Idempotency-Key` header to make retries safe — the same key replays the original result instead of re-sending. The response returns a `batch_id`; track the batch's per-status rollup with [Retrieve a batch](#get-emails-batches-id) and stop the rest of it with [Cancel a batch](#post-emails-batches-id-cancel). To send one email, use [Send or schedule an email](#post-emails). Requires the `emails:send` capability.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchSend"}}}},"responses":{"200":{"description":"Batch accepted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchSendResult"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Insufficient scope, or sending domain not found / not verified.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Idempotency conflict (same key, different body / in-flight).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Validation error (the whole batch was rejected).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests, or sending is paused: `rate_limit_exceeded` (request rate), `quota_exceeded` (free-tier daily/monthly cap, or the plan's monthly sending allowance and any purchased credit are spent), or `overage_cap_exceeded` (a paid plan reached its overage cap — sending resumes when the allowance refreshes, or buy a credit top-up). The whole batch is gated at the door — nothing is queued. Includes a `Retry-After` header with the seconds until the window resets (the billing period end for quota/overage blocks).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/emails/batches/{id}":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"get":{"tags":["Emails"],"summary":"Retrieve a batch","description":"Retrieve a batch and its live, per-status rollup (how many of its messages are queued, sent, delivered, bounced, and so on). The counts update as the batch progresses. Create a batch with [Send a batch of emails](#post-emails-batch), or stop its remaining messages with [Cancel a batch](#post-emails-batches-id-cancel). Requires the `emails:read` capability.","responses":{"200":{"description":"The batch.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Batch"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Insufficient scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Batch not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/emails/batches/{id}/cancel":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"post":{"tags":["Emails"],"summary":"Cancel a batch","description":"Cancel every still-cancelable message in a batch in one call. Messages that have already been sent are left untouched — only queued or scheduled ones are stopped. Check what remains cancelable first with [Retrieve a batch](#get-emails-batches-id). Requires the `emails:send` capability.","responses":{"200":{"description":"The updated batch.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Batch"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Insufficient scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Batch not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Nothing left to cancel in this batch.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/emails/{id}":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"get":{"tags":["Emails"],"summary":"Retrieve an email","description":"Retrieve a single email by `id`, including its current send status and lifecycle timestamps (created, scheduled, sent, delivered, and so on). Find an `id` by browsing [List sent emails](#get-emails). To change a scheduled or queued email, use [Cancel or reschedule an email](#patch-emails-id). Requires the `emails:read` capability.","responses":{"200":{"description":"The email.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Email"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Insufficient scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Email not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"patch":{"tags":["Emails"],"summary":"Cancel or reschedule an email","description":"Cancel a scheduled or queued email, or move it to a new send time. Only emails that haven't been handed off for delivery yet can be changed — once an email is sent this returns `409`. Look up the email's current state first with [Retrieve an email](#get-emails-id). Requires the `emails:send` capability.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailPatch"}}}},"responses":{"200":{"description":"The updated email.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Email"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Insufficient scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Email not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Email is not in a cancelable / reschedulable state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/emails/stats":{"get":{"tags":["Emails"],"summary":"Email deliverability stats","description":"Retrieve aggregate deliverability and engagement metrics for your workspace over a rolling window. You get totals (sent, delivered, opened, clicked, bounced, complained, failed) alongside the rates that matter — delivery, open, click, bounce, and complaint. Open and click rates count only emails where that tracking was enabled, so turning tracking off for transactional mail won't skew them. Control the window with the `days` parameter (1–365, default 30). For the individual emails behind these numbers, see [List sent emails](#get-emails). Requires the `emails:read` capability.","parameters":[{"name":"days","in":"query","required":false,"description":"Window size in days (1–365). Defaults to 30; values above 365 are rejected.","schema":{"type":"integer","minimum":1,"maximum":365,"default":30}}],"responses":{"200":{"description":"The stats for the window.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailStats"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Insufficient scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Invalid `days` parameter.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/emails/received":{"get":{"tags":["Inbound emails"],"summary":"List received emails","description":"Retrieve a list of inbound emails received on your receiving-enabled domains, newest-first and cursor-paginated. Rows are summaries (sender, subject, timestamps) without bodies — use a message's `id` with [Retrieve a received email](#get-emails-received-id) to read the full content and attachment metadata. Requires the `emails:read` capability.","parameters":[{"name":"limit","in":"query","required":false,"description":"Max rows to return (default 20, max 100).","schema":{"type":"integer","minimum":1,"maximum":100}},{"name":"after","in":"query","required":false,"description":"Return rows after this id (forward paging).","schema":{"type":"string"}},{"name":"before","in":"query","required":false,"description":"Return rows before this id (backward paging).","schema":{"type":"string"}}],"responses":{"200":{"description":"A page of received emails.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["list"]},"has_more":{"type":"boolean"},"data":{"type":"array","items":{"$ref":"#/components/schemas/ReceivedEmailSummary"}}},"required":["object","has_more","data"]}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Insufficient scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Invalid pagination params.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/emails/received/{id}":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"get":{"tags":["Inbound emails"],"summary":"Retrieve a received email","description":"Retrieve a full inbound message by `id`, including its HTML and text bodies plus metadata for every attachment. Attachment bytes aren't inlined — download each one via [Get an attachment download URL](#get-emails-received-id-attachments-attachmentid). Browse your inbound mail with [List received emails](#get-emails-received). Requires the `emails:read` capability.","responses":{"200":{"description":"The received email.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReceivedEmail"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Insufficient scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Received email not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/emails/received/{id}/attachments/{attachmentId}":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"attachmentId","in":"path","required":true,"schema":{"type":"string"}}],"get":{"tags":["Inbound emails"],"summary":"Get an attachment download URL","description":"Get a short-lived, signed URL for downloading one inbound attachment's bytes. Fetch the URL and download promptly — it expires quickly (the expiry is included in the response). Find attachment ids on the message via [Retrieve a received email](#get-emails-received-id). Requires the `emails:read` capability.","responses":{"200":{"description":"A signed download URL.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReceivedAttachmentUrl"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Insufficient scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Attachment not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Attachment storage is not configured / unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/contacts":{"get":{"tags":["Contacts"],"summary":"List contacts","description":"Retrieve a list of the contacts in your workspace, newest-first and cursor-paginated. Each row includes the contact's core fields and any custom field values. Use a contact's `id` (or email) with [Retrieve a contact](#get-contacts-id) for the full record, add contacts with [Create a contact](#post-contacts), or bring a list in bulk with [Start an async contact import](#post-contacts-imports). Requires the `contacts:read` capability.","parameters":[{"name":"limit","in":"query","required":false,"description":"Max rows to return (default 20, max 100).","schema":{"type":"integer","minimum":1,"maximum":100}},{"name":"after","in":"query","required":false,"description":"Return rows after this id (forward paging).","schema":{"type":"string"}},{"name":"before","in":"query","required":false,"description":"Return rows before this id (backward paging).","schema":{"type":"string"}}],"responses":{"200":{"description":"A page of contacts.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["list"]},"has_more":{"type":"boolean"},"data":{"type":"array","items":{"$ref":"#/components/schemas/Contact"}}},"required":["object","has_more","data"]}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Invalid pagination params.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"tags":["Contacts"],"summary":"Create a contact","description":"Add a single contact to your workspace. Set an `email` plus any standard or custom field values; custom fields must already exist (define them with [Create a custom contact field](#post-contact-fields)). Emails are unique per workspace, so creating one that already exists returns `409` — use [Update a contact](#patch-contacts-id) to change an existing contact, or [Start an async contact import](#post-contacts-imports) to add many at once. Requires the `contacts:write` capability.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactCreate"}}}},"responses":{"201":{"description":"Created.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Contact"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"A contact with that email already exists.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/contacts/{id}":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"get":{"tags":["Contacts"],"summary":"Retrieve a contact","description":"Retrieve a single contact and all of its field values. The `{id}` path segment accepts either the contact's id or its email address, so you can look a contact up without storing our id. Change it with [Update a contact](#patch-contacts-id), or see which subscription topics it's opted into with [List a contact's topic subscriptions](#get-contacts-id-topics). Requires the `contacts:read` capability.","responses":{"200":{"description":"The contact.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Contact"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Contact not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"patch":{"tags":["Contacts"],"summary":"Update a contact","description":"Update a contact's standard or custom field values. Only the fields you send are changed; omitted fields are left as-is. The `{id}` accepts a contact id or email. To manage a contact's subscription preferences instead, use [Set a contact's topic preference](#post-contacts-id-topics). Requires the `contacts:write` capability.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactUpdate"}}}},"responses":{"200":{"description":"The updated contact.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Contact"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Contact not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"tags":["Contacts"],"summary":"Delete a contact","description":"Permanently delete a contact and its field values. This also removes the contact from every segment it belonged to. To stop mailing someone without deleting them, unsubscribe them from a topic with [Set a contact's topic preference](#post-contacts-id-topics) or add them to your [suppression list](#post-suppressions) instead. Requires the `contacts:write` capability.","responses":{"204":{"description":"Deleted."},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Contact not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/contacts/imports":{"get":{"tags":["Contacts"],"summary":"List contact imports","description":"Retrieve a list of your bulk contact-import jobs, newest-first and cursor-paginated. Each row is a reference to one import and its current progress. Start a new one with [Start an async contact import](#post-contacts-imports), or drill into a single job with [Retrieve a contact import](#get-contacts-imports-id). Requires the `contacts:read` capability.","parameters":[{"name":"limit","in":"query","required":false,"description":"Max rows to return (default 20, max 100).","schema":{"type":"integer","minimum":1,"maximum":100}},{"name":"after","in":"query","required":false,"description":"Return rows after this id (forward paging).","schema":{"type":"string"}},{"name":"before","in":"query","required":false,"description":"Return rows before this id (backward paging).","schema":{"type":"string"}}],"responses":{"200":{"description":"A page of import jobs.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["list"]},"has_more":{"type":"boolean"},"data":{"type":"array","items":{"$ref":"#/components/schemas/ContactImport"}}},"required":["object","has_more","data"]}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Invalid pagination params.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"tags":["Contacts"],"summary":"Start an async contact import","description":"Import a batch of contacts (up to 5,000 per request) in the background. The call returns immediately with an import job you poll for progress and per-row results — new contacts are created and existing ones (matched by email) are updated. Track it with [Retrieve a contact import](#get-contacts-imports-id), or see all your imports via [List contact imports](#get-contacts-imports). To add a single contact synchronously, use [Create a contact](#post-contacts). Requires the `contacts:write` capability.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactImportCreate"}}}},"responses":{"202":{"description":"Accepted; the import job was enqueued.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactImport"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/contacts/imports/{id}":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"get":{"tags":["Contacts"],"summary":"Retrieve a contact import","description":"Retrieve a bulk import job by `id` to check its status and per-row results — how many contacts were created, updated, or skipped, and why any rows failed. Poll this while an import runs. Start one with [Start an async contact import](#post-contacts-imports). Requires the `contacts:read` capability.","responses":{"200":{"description":"The import job.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactImport"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Import job not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/contact-fields":{"get":{"tags":["Contact fields"],"summary":"List custom contact fields","description":"Retrieve a list of the custom contact fields defined in your workspace, cursor-paginated. These are the typed attributes (text, number, date, boolean, and so on) you can set on any contact and reference as template variables. Define a new one with [Create a custom contact field](#post-contact-fields). Requires the `contacts:read` capability.","parameters":[{"name":"limit","in":"query","required":false,"description":"Max rows to return (default 20, max 100).","schema":{"type":"integer","minimum":1,"maximum":100}},{"name":"after","in":"query","required":false,"description":"Return rows after this id (forward paging).","schema":{"type":"string"}},{"name":"before","in":"query","required":false,"description":"Return rows before this id (backward paging).","schema":{"type":"string"}}],"responses":{"200":{"description":"A page of contact fields.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["list"]},"has_more":{"type":"boolean"},"data":{"type":"array","items":{"$ref":"#/components/schemas/ContactField"}}},"required":["object","has_more","data"]}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Invalid pagination params.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"tags":["Contact fields"],"summary":"Create a custom contact field","description":"Define a new typed custom field that can then be set on any contact and used as a template variable (e.g. `plan`, `signup_date`). The `key` and `type` are fixed once created — rename the key later with [Rename a custom field's key](#post-contact-fields-id-rename), or change the label with [Update a custom contact field](#patch-contact-fields-id). See existing fields via [List custom contact fields](#get-contact-fields). Requires the `contacts:write` capability.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactFieldCreate"}}}},"responses":{"201":{"description":"Created.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactField"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"A field with that key already exists.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/contact-fields/{id}":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"get":{"tags":["Contact fields"],"summary":"Retrieve a custom contact field","description":"Retrieve a single custom contact field by `id`, including its key, type, and label. Update its label with [Update a custom contact field](#patch-contact-fields-id), or rename the key with [Rename a custom field's key](#post-contact-fields-id-rename). Requires the `contacts:read` capability.","responses":{"200":{"description":"The contact field.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactField"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Contact field not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"patch":{"tags":["Contact fields"],"summary":"Update a custom contact field","description":"Update a custom field's editable metadata, such as its display label. The `key` and `type` are immutable here — to change the key (and migrate every contact's stored value) use [Rename a custom field's key](#post-contact-fields-id-rename) instead. Requires the `contacts:write` capability.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactFieldUpdate"}}}},"responses":{"200":{"description":"The updated contact field.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactField"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Contact field not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"tags":["Contact fields"],"summary":"Delete a custom contact field","description":"Permanently delete a custom field definition and strip its stored value from every contact. Any template variable that referenced it will resolve to empty. This can't be undone — recreate the field with [Create a custom contact field](#post-contact-fields) if you need it back. Requires the `contacts:write` capability.","responses":{"204":{"description":"Deleted."},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Contact field not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/contact-fields/{id}/rename":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"post":{"tags":["Contact fields"],"summary":"Rename a custom field's key","description":"Change a custom field's `key`, migrating the stored value on every contact so no data is lost. Because the key is how templates and the API reference the field, update any template variables that used the old key. To change only the display label, use [Update a custom contact field](#patch-contact-fields-id). Requires the `contacts:write` capability.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactFieldRename"}}}},"responses":{"200":{"description":"The renamed contact field.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactField"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Contact field not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"A field with the new key already exists.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/segments":{"get":{"tags":["Segments"],"summary":"List segments","description":"Retrieve a list of the segments in your workspace, cursor-paginated. A segment is a saved group of contacts you can target when sending a campaign. Create one with [Create a segment](#post-segments), or list a segment's members with [List segment members](#get-segments-id-contacts). Requires the `segments:read` capability.","parameters":[{"name":"limit","in":"query","required":false,"description":"Max rows to return (default 20, max 100).","schema":{"type":"integer","minimum":1,"maximum":100}},{"name":"after","in":"query","required":false,"description":"Return rows after this id (forward paging).","schema":{"type":"string"}},{"name":"before","in":"query","required":false,"description":"Return rows before this id (backward paging).","schema":{"type":"string"}}],"responses":{"200":{"description":"A page of segments.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["list"]},"has_more":{"type":"boolean"},"data":{"type":"array","items":{"$ref":"#/components/schemas/Segment"}}},"required":["object","has_more","data"]}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Invalid pagination params.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"tags":["Segments"],"summary":"Create a segment","description":"Create a segment — a named group of contacts you can target when sending a campaign. Once created, add contacts with [Add a member](#post-segments-id-contacts) and target it from [Create a campaign](#post-campaigns). To let recipients opt out of a category of mail instead, see [Create a topic](#post-topics). Requires the `segments:write` capability.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SegmentCreate"}}}},"responses":{"201":{"description":"Created.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Segment"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/segments/{id}":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"get":{"tags":["Segments"],"summary":"Retrieve a segment","description":"Retrieve a single segment by `id`, including its name and member count. To page through the contacts inside it, use [List segment members](#get-segments-id-contacts). Requires the `segments:read` capability.","responses":{"200":{"description":"The segment.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Segment"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Segment not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"patch":{"tags":["Segments"],"summary":"Update a segment","description":"Update a segment's editable metadata, such as its name. To change who's in the segment, add or remove members with [Add a member](#post-segments-id-contacts) and [Remove a member](#delete-segments-id-contacts-contact). Requires the `segments:write` capability.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SegmentUpdate"}}}},"responses":{"200":{"description":"The updated segment.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Segment"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Segment not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"tags":["Segments"],"summary":"Delete a segment","description":"Delete a segment. The contacts themselves are untouched — only the grouping is removed. This is blocked with `409` while an active campaign still targets the segment; cancel or finish that campaign first (see [List campaigns](#get-campaigns)). Requires the `segments:write` capability.","responses":{"204":{"description":"Deleted."},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Segment not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Segment is referenced by an active campaign.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/segments/{id}/contacts":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"get":{"tags":["Segments"],"summary":"List segment members","description":"Retrieve the contacts in a segment, cursor-paginated. Add a contact with [Add a member](#post-segments-id-contacts) or take one out with [Remove a member](#delete-segments-id-contacts-contact). Requires the `segments:read` capability.","parameters":[{"name":"limit","in":"query","required":false,"description":"Max rows to return (default 20, max 100).","schema":{"type":"integer","minimum":1,"maximum":100}},{"name":"after","in":"query","required":false,"description":"Return rows after this id (forward paging).","schema":{"type":"string"}},{"name":"before","in":"query","required":false,"description":"Return rows before this id (backward paging).","schema":{"type":"string"}}],"responses":{"200":{"description":"A page of segment members.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["list"]},"has_more":{"type":"boolean"},"data":{"type":"array","items":{"$ref":"#/components/schemas/SegmentMember"}}},"required":["object","has_more","data"]}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Segment not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Invalid pagination params.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"tags":["Segments"],"summary":"Add a member","description":"Add a contact to a segment, referenced by contact id or email. The operation is idempotent — adding a contact that's already a member is a no-op and still succeeds. See the current members with [List segment members](#get-segments-id-contacts). Requires the `segments:write` capability.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SegmentMemberAdd"}}}},"responses":{"201":{"description":"The membership.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SegmentMember"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Segment or contact not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/segments/{id}/contacts/{contact}":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"contact","in":"path","required":true,"description":"A contact id or email.","schema":{"type":"string"}}],"delete":{"tags":["Segments"],"summary":"Remove a member","description":"Remove a contact from a segment, referenced by contact id or email. The contact itself is not deleted — only its membership. Add it back any time with [Add a member](#post-segments-id-contacts). Requires the `segments:write` capability.","responses":{"204":{"description":"Removed."},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Segment, contact, or membership not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/topics":{"get":{"tags":["Topics"],"summary":"List topics","description":"Retrieve a list of your subscription topics, cursor-paginated. A topic is a category of email (e.g. Product updates, Promotions) that recipients can opt out of without leaving your list entirely. Pass `?archived=true` to list archived topics instead. Create one with [Create a topic](#post-topics), or check a contact's preferences with [List a contact's topic subscriptions](#get-contacts-id-topics). Requires the `topics:read` capability.","parameters":[{"name":"limit","in":"query","required":false,"description":"Max rows to return (default 20, max 100).","schema":{"type":"integer","minimum":1,"maximum":100}},{"name":"after","in":"query","required":false,"description":"Return rows after this id (forward paging).","schema":{"type":"string"}},{"name":"before","in":"query","required":false,"description":"Return rows before this id (backward paging).","schema":{"type":"string"}}],"responses":{"200":{"description":"A page of topics.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["list"]},"has_more":{"type":"boolean"},"data":{"type":"array","items":{"$ref":"#/components/schemas/Topic"}}},"required":["object","has_more","data"]}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Invalid pagination params.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"tags":["Topics"],"summary":"Create a topic","description":"Create a subscription topic — a category recipients can opt out of on their own (e.g. Promotions) while staying on your list. `default_opt_in` decides whether contacts with no explicit preference are treated as subscribed. Scope a campaign to a topic so opted-out contacts are skipped automatically via [Create a campaign](#post-campaigns), and set an individual contact's preference with [Set a contact's topic preference](#post-contacts-id-topics). Topics differ from segments: a [segment](#post-segments) decides who a campaign targets, a topic lets recipients opt out. Requires the `topics:write` capability.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TopicCreate"}}}},"responses":{"201":{"description":"Created.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Topic"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"A topic with that name already exists.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/topics/{id}":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"get":{"tags":["Topics"],"summary":"Retrieve a topic","description":"Retrieve a single topic by `id`, including its name and `default_opt_in` setting. Change it with [Update a topic](#patch-topics-id), or list every topic with [List topics](#get-topics). Requires the `topics:read` capability.","responses":{"200":{"description":"The topic.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Topic"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Topic not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"patch":{"tags":["Topics"],"summary":"Update a topic","description":"Update a topic's name or `default_opt_in` behavior, or pass `{ \"archived\": true | false }` to archive or restore it. Archiving a topic hides it and stops it from being targeted, but is blocked with `409` while an active campaign still targets it. To manage a single contact's preference, use [Set a contact's topic preference](#post-contacts-id-topics). Requires the `topics:write` capability.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TopicUpdate"}}}},"responses":{"200":{"description":"The updated topic.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Topic"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Topic not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"A topic with that name already exists, or it's referenced by an active campaign.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"tags":["Topics"],"summary":"Delete a topic","description":"Archive a topic (a soft delete — existing subscription records are preserved so you can restore it later). It's blocked with `409` while an active campaign still targets it. Restore an archived topic by sending `{ \"archived\": false }` to [Update a topic](#patch-topics-id). Requires the `topics:write` capability.","responses":{"204":{"description":"Archived."},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Topic not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Topic is referenced by an active campaign.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/contacts/{id}/topics":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"get":{"tags":["Topics"],"summary":"List a contact's topic subscriptions","description":"Retrieve a contact's effective subscription state for every active topic, cursor-paginated. Each row resolves the contact's explicit preference against the topic's `default_opt_in`, so `subscribed` is always the answer to \"would this contact receive a campaign scoped to this topic?\". Change a preference with [Set a contact's topic preference](#post-contacts-id-topics). Requires the `topics:read` capability.","parameters":[{"name":"limit","in":"query","required":false,"description":"Max rows to return (default 20, max 100).","schema":{"type":"integer","minimum":1,"maximum":100}},{"name":"after","in":"query","required":false,"description":"Return rows after this id (forward paging).","schema":{"type":"string"}},{"name":"before","in":"query","required":false,"description":"Return rows before this id (backward paging).","schema":{"type":"string"}}],"responses":{"200":{"description":"A page of the contact's topic subscriptions.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["list"]},"has_more":{"type":"boolean"},"data":{"type":"array","items":{"$ref":"#/components/schemas/ContactTopic"}}},"required":["object","has_more","data"]}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Contact not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Invalid pagination params.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"tags":["Topics"],"summary":"Set a contact's topic preference","description":"Subscribe or unsubscribe a contact for one topic. This records an explicit preference that overrides the topic's `default_opt_in`, and it's idempotent — setting the same preference twice succeeds. `PUT` behaves identically. Read the contact's current state with [List a contact's topic subscriptions](#get-contacts-id-topics). Requires the `topics:write` capability.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactTopicSet"}}}},"responses":{"201":{"description":"The resolved subscription.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactTopic"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Contact or topic not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"put":{"tags":["Topics"],"summary":"Set a contact's topic preference (alias of POST)","description":"Identical to [Set a contact's topic preference](#post-contacts-id-topics) — provided so clients that prefer `PUT` semantics for an upsert can use it interchangeably. Requires the `topics:write` capability.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactTopicSet"}}}},"responses":{"201":{"description":"The resolved subscription.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactTopic"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Contact or topic not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/campaigns":{"get":{"tags":["Campaigns"],"summary":"List campaigns","description":"Retrieve a list of your campaigns, cursor-paginated. Each row is a reference to one campaign and its current status (`draft`, `scheduled`, `sending`, `sent`, …). Use a campaign's `id` with [Retrieve a campaign](#get-campaigns-id) for the full record, or with [List sent emails](#get-emails) (`?campaign_id=`) to see the individual emails it produced. Requires the `campaigns:read` capability.","parameters":[{"name":"limit","in":"query","required":false,"description":"Max rows to return (default 20, max 100).","schema":{"type":"integer","minimum":1,"maximum":100}},{"name":"after","in":"query","required":false,"description":"Return rows after this id (forward paging).","schema":{"type":"string"}},{"name":"before","in":"query","required":false,"description":"Return rows before this id (backward paging).","schema":{"type":"string"}}],"responses":{"200":{"description":"A page of campaigns.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["list"]},"has_more":{"type":"boolean"},"data":{"type":"array","items":{"$ref":"#/components/schemas/Campaign"}}},"required":["object","has_more","data"]}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Invalid pagination params.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"tags":["Campaigns"],"summary":"Create a campaign","description":"Create a campaign in `draft`. Target either a saved segment (`segment_id`, see [Create a segment](#post-segments)) or an inline `recipients` list, and optionally scope it to a subscription topic (`topic_id`) so contacts who opted out of that topic are skipped automatically. Content comes from a `template_id` or inline `html`/`text`. Nothing is sent yet — edit the draft with [Update a campaign](#patch-campaigns-id), check it with [Validate a campaign](#get-campaigns-id-validate), then launch it with [Send a campaign](#post-campaigns-id-send). Requires the `campaigns:write` capability.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CampaignCreate"}}}},"responses":{"201":{"description":"Created.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Campaign"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/campaigns/{id}":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"get":{"tags":["Campaigns"],"summary":"Retrieve a campaign","description":"Retrieve a single campaign by `id`, including its status, targeting, content references, and schedule. To see the individual emails a sent campaign produced, filter [List sent emails](#get-emails) by `campaign_id`; for a pre-send readiness report, use [Validate a campaign](#get-campaigns-id-validate). Requires the `campaigns:read` capability.","responses":{"200":{"description":"The campaign.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Campaign"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Campaign not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"patch":{"tags":["Campaigns"],"summary":"Update a campaign","description":"Edit a campaign while it's still in `draft` (content edits after that return `409`). Beyond content and targeting, you can: send `archived` to archive/restore it; set `variable_fallbacks` (fill-only per-variable defaults) and/or `excluded_contact_ids` to resolve a send blocked by missing variables — the API equivalent of the dashboard's pre-send fix; set `topic_id` to scope it to a subscription topic (or `null` to clear); and set `open_tracking`/`click_tracking` (tri-state; `null` inherits the template/domain default). See what's blocking a send with [Validate a campaign](#get-campaigns-id-validate). Requires the `campaigns:write` capability.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CampaignUpdate"}}}},"responses":{"200":{"description":"The updated campaign.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Campaign"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Campaign not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only `draft` campaigns can be edited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"tags":["Campaigns"],"summary":"Delete a campaign","description":"Permanently delete a campaign that's in `draft` or a terminal state (sent, canceled, failed). A campaign that's mid-flight can't be deleted — stop it first with [Cancel a campaign](#post-campaigns-id-cancel). Requires the `campaigns:write` capability.","responses":{"204":{"description":"Deleted."},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Campaign not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Campaign is not in a deletable state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/campaigns/{id}/send":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"post":{"tags":["Campaigns"],"summary":"Send a campaign","description":"Validate a campaign and then send it — immediately, or at its `scheduled_at` if one is set. If anything blocks the send (unverified domain, missing template variables, empty audience, …) you get a `409` with each blocking reason itemized in `error.details[]`. To see the full pre-send report without attempting a send, use [Validate a campaign](#get-campaigns-id-validate); fix variable issues via [Update a campaign](#patch-campaigns-id). A launched campaign can be [paused](#post-campaigns-id-pause) or [canceled](#post-campaigns-id-cancel). Requires the `campaigns:send` capability.","responses":{"200":{"description":"The campaign (now `scheduled`/`sending`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Campaign"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Campaign not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Send blocked — blocking reasons are in `error.details[]`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/campaigns/{id}/cancel":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"post":{"tags":["Campaigns"],"summary":"Cancel a campaign","description":"Cancel a `draft`, `scheduled`, or `sending` campaign. Cancelation is terminal — the campaign can't be restarted afterwards. Messages already sent to recipients are not recalled. If you only want to stop temporarily, use [Pause a campaign](#post-campaigns-id-pause) instead. Requires the `campaigns:send` capability.","responses":{"200":{"description":"The canceled campaign.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Campaign"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Campaign not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Campaign is not in a cancelable state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/campaigns/{id}/pause":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"post":{"tags":["Campaigns"],"summary":"Pause a campaign","description":"Pause a `scheduled` or `sending` campaign. A paused send stops cleanly between recipients — already-sent messages are untouched, and no partial email is ever produced. Continue where it left off with [Resume a campaign](#post-campaigns-id-resume), or stop it for good with [Cancel a campaign](#post-campaigns-id-cancel). Requires the `campaigns:send` capability.","responses":{"200":{"description":"The paused campaign.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Campaign"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Campaign not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Campaign is not in a pausable state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/campaigns/{id}/resume":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"post":{"tags":["Campaigns"],"summary":"Resume a campaign","description":"Resume a `paused` campaign. Sending continues with the recipients that hadn't been reached yet; anyone already delivered to is skipped idempotently, so nobody receives the campaign twice. Pause a send with [Pause a campaign](#post-campaigns-id-pause). Requires the `campaigns:send` capability.","responses":{"200":{"description":"The resumed campaign.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Campaign"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Campaign not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Campaign is not in a resumable (paused) state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/campaigns/{id}/reschedule":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"post":{"tags":["Campaigns"],"summary":"Reschedule a campaign","description":"Move a `scheduled` campaign to a new send time. Only campaigns that haven't started sending can be rescheduled — once a send is in flight, [pause](#post-campaigns-id-pause) or [cancel](#post-campaigns-id-cancel) it instead. Requires the `campaigns:send` capability.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CampaignReschedule"}}}},"responses":{"200":{"description":"The rescheduled campaign.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Campaign"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Campaign not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only SCHEDULED campaigns can be rescheduled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/campaigns/{id}/validate":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"get":{"tags":["Campaigns"],"summary":"Validate a campaign","description":"Run a non-mutating pre-send check and get the full readiness report: how many contacts will receive the campaign, how many are suppressed or excluded, which contacts are missing template variables, and a final `can_send` verdict. Nothing is sent or changed. Fix reported variable gaps with [Update a campaign](#patch-campaigns-id) (`variable_fallbacks` / `excluded_contact_ids`), then launch with [Send a campaign](#post-campaigns-id-send). Requires the `campaigns:read` capability.","responses":{"200":{"description":"The validation report.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["campaign_validation"]},"total_members":{"type":"integer"},"sendable":{"type":"integer"},"suppressed":{"type":"integer"},"excluded":{"type":"integer"},"missing_data":{"type":"array","items":{"type":"object","properties":{"contact_id":{"type":"string"},"email":{"type":"string"},"missing":{"type":"array","items":{"type":"string"}}},"required":["contact_id","email","missing"]}},"unresolved_variables":{"type":"array","items":{"type":"string"}},"can_send":{"type":"boolean"}},"required":["object","total_members","sendable","suppressed","excluded","missing_data","unresolved_variables","can_send"]}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Campaign not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/templates":{"get":{"tags":["Templates"],"summary":"List templates","description":"Retrieve a list of your email templates, cursor-paginated. List rows omit the full `design` document to keep responses small — fetch a single template with [Retrieve a template](#get-templates-id) to get it. Reference a template's `id` when sending with [Send or schedule an email](#post-emails) or when creating a campaign. Requires the `templates:read` capability.","parameters":[{"name":"limit","in":"query","required":false,"description":"Max rows to return (default 20, max 100).","schema":{"type":"integer","minimum":1,"maximum":100}},{"name":"after","in":"query","required":false,"description":"Return rows after this id (forward paging).","schema":{"type":"string"}},{"name":"before","in":"query","required":false,"description":"Return rows before this id (backward paging).","schema":{"type":"string"}}],"responses":{"200":{"description":"A page of templates.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["list"]},"has_more":{"type":"boolean"},"data":{"type":"array","items":{"$ref":"#/components/schemas/Template"}}},"required":["object","has_more","data"]}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Invalid pagination params.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"tags":["Templates"],"summary":"Create a template","description":"Create a reusable email template from a canonical `design` document — the same block-based format the dashboard editor produces. Templates support `{{variables}}` that are filled per-recipient at send time. Once created, preview it in the dashboard, send with it via [Send or schedule an email](#post-emails), and iterate with [Update a template](#patch-templates-id). Requires the `templates:write` capability.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TemplateCreate"}}}},"responses":{"201":{"description":"Created.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Template"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/templates/{id}":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"get":{"tags":["Templates"],"summary":"Retrieve a template","description":"Retrieve a single template by `id`, including the full canonical `design` document (which [List templates](#get-templates) omits). Use this to read a design for editing, then save changes with [Update a template](#patch-templates-id). Requires the `templates:read` capability.","responses":{"200":{"description":"The template.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Template"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Template not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"patch":{"tags":["Templates"],"summary":"Update a template","description":"Update a template's metadata and/or its `design` document. Changes take effect for future sends only — emails already sent or queued keep the design they were rendered with. Preview the result in the dashboard before sending; read the current design first with [Retrieve a template](#get-templates-id). Requires the `templates:write` capability.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TemplateUpdate"}}}},"responses":{"200":{"description":"The updated template.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Template"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Template not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"tags":["Templates"],"summary":"Delete a template","description":"Permanently delete a template. Emails already sent with it are unaffected, but future sends that reference its id will fail — update any code or campaigns that still point at it first (see [List campaigns](#get-campaigns)). Requires the `templates:write` capability.","responses":{"204":{"description":"Deleted."},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Template not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/brand-kits":{"get":{"tags":["Brand kits"],"summary":"List brand kits","description":"Retrieve every Brand Kit profile in the workspace (up to five named profiles). Each profile holds tone, about, voice notes, labeled colors, pinned logo/background library images, and core pages — the primary brand context for on-brand template authoring. Pass `?name=` to filter to one profile by display name (case-insensitive). The response includes `default_id` for the Default profile. Fetch one by id with [Retrieve a brand kit](#get-brand-kits-id). Writes and URL import stay in the dashboard (Settings → Brand). Requires the `templates:read` capability.","parameters":[{"name":"name","in":"query","required":false,"schema":{"type":"string"},"description":"Filter to a single profile by display name (case-insensitive)."}],"responses":{"200":{"description":"Brand kit profiles plus `default_id`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrandKitList"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Insufficient scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/brand-kits/{id}":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"get":{"tags":["Brand kits"],"summary":"Retrieve a brand kit","description":"Retrieve one Brand Kit profile by `id` (`bk_…`), including voice, labeled colors, pinned graphics (`library_image_id` for `/img/{id}` in design TSX), and core pages. List every profile with [List brand kits](#get-brand-kits). Requires the `templates:read` capability.","responses":{"200":{"description":"The brand kit.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrandKit"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Insufficient scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Brand kit not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/domains":{"get":{"tags":["Domains"],"summary":"List domains","description":"Retrieve a list of your sending domains, cursor-paginated, with each domain's verification status. Add a new one with [Add a domain](#post-domains), or fetch a single domain (including its DNS records) with [Retrieve a domain](#get-domains-id). Requires the `domains:read` capability.","parameters":[{"name":"limit","in":"query","required":false,"description":"Max rows to return (default 20, max 100).","schema":{"type":"integer","minimum":1,"maximum":100}},{"name":"after","in":"query","required":false,"description":"Return rows after this id (forward paging).","schema":{"type":"string"}},{"name":"before","in":"query","required":false,"description":"Return rows before this id (backward paging).","schema":{"type":"string"}}],"responses":{"200":{"description":"A page of domains.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["list"]},"has_more":{"type":"boolean"},"data":{"type":"array","items":{"$ref":"#/components/schemas/Domain"}}},"required":["object","has_more","data"]}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Invalid pagination params.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"tags":["Domains"],"summary":"Add a domain","description":"Add a domain you'll send email from. The response includes the DNS `records` (SPF, DKIM, and so on) to publish with your DNS provider. Once they're published, trigger a check with [Verify a domain](#post-domains-id-verify) — sending from the domain is blocked until it verifies. Requires the `domains:write` capability.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DomainCreate"}}}},"responses":{"201":{"description":"Created.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Domain"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Domain already exists.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/domains/{id}":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"get":{"tags":["Domains"],"summary":"Retrieve a domain","description":"Retrieve a single sending domain by `id`, including its current verification status and the DNS `records` you need to publish. Re-run the DNS check with [Verify a domain](#post-domains-id-verify), or change its tracking/TLS settings with [Update a domain](#patch-domains-id). Requires the `domains:read` capability.","responses":{"200":{"description":"The domain.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Domain"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Domain not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"tags":["Domains"],"summary":"Delete a domain","description":"Remove a sending domain from your workspace. Sends that reference an address on this domain will be rejected afterwards, so update your `from` addresses first. Re-add it any time with [Add a domain](#post-domains) (you'll need to verify it again). Requires the `domains:write` capability.","responses":{"204":{"description":"Deleted."},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Domain not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"patch":{"tags":["Domains"],"summary":"Update a domain","description":"Update a domain's sending options: open/click tracking defaults, TLS enforcement, and the tracking subdomain. These act as the domain-level defaults that individual emails and campaigns can override (see [Update a campaign](#patch-campaigns-id)). Requires the `domains:write` capability.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DomainUpdate"}}}},"responses":{"200":{"description":"The updated domain.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Domain"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Domain not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Invalid request body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/domains/{id}/verify":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"post":{"tags":["Domains"],"summary":"Verify a domain","description":"Run an on-demand DNS check and advance the domain's verification status. The response includes per-record `checks` so you can see exactly which DNS records are still missing or wrong. Get the records to publish from [Retrieve a domain](#get-domains-id). Verification also re-runs periodically in the background. Requires the `domains:write` capability.","responses":{"200":{"description":"The updated domain with per-record checks.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Domain"},{"type":"object","properties":{"checks":{"type":["array","null"],"items":{}}}}]}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Domain not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Domain is already verified in another workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Couldn't reach the mailing engine.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/webhooks":{"get":{"tags":["Webhooks"],"summary":"List webhook endpoints","description":"Retrieve a list of your webhook endpoints, cursor-paginated, with each endpoint's URL, subscribed events, and status. Signing secrets are never returned here — they're shown exactly once by [Create a webhook endpoint](#post-webhooks). Check an endpoint's wiring end-to-end with [Send a test event](#post-webhooks-id-test). Requires the `webhooks:read` capability.","parameters":[{"name":"limit","in":"query","required":false,"description":"Max rows to return (default 20, max 100).","schema":{"type":"integer","minimum":1,"maximum":100}},{"name":"after","in":"query","required":false,"description":"Return rows after this id (forward paging).","schema":{"type":"string"}},{"name":"before","in":"query","required":false,"description":"Return rows before this id (backward paging).","schema":{"type":"string"}}],"responses":{"200":{"description":"A page of webhook endpoints.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["list"]},"has_more":{"type":"boolean"},"data":{"type":"array","items":{"$ref":"#/components/schemas/Webhook"}}},"required":["object","has_more","data"]}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Insufficient scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Invalid pagination params.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"tags":["Webhooks"],"summary":"Create a webhook endpoint","description":"Register an `https` URL to receive event notifications (deliveries, bounces, opens, clicks, and more) and choose which events it subscribes to. The response includes the `signing_secret` exactly once — store it now, as it can never be retrieved again; use it to verify each delivery's signature. Confirm the endpoint works with [Send a test event](#post-webhooks-id-test), and adjust its URL or events later with [Update a webhook endpoint](#patch-webhooks-id). Requires the `webhooks:manage` capability.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookCreate"}}}},"responses":{"201":{"description":"Created — includes the one-time signing secret.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookCreated"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Insufficient scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"That URL or name is already used by another endpoint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Validation error (bad URL, unknown event, or limit reached).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/webhooks/{id}":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"get":{"tags":["Webhooks"],"summary":"Retrieve a webhook endpoint","description":"Retrieve a single webhook endpoint by `id` — its URL, subscribed events, and status. The signing secret is never included; it's returned exactly once when the endpoint is [created](#post-webhooks). Requires the `webhooks:read` capability.","responses":{"200":{"description":"The webhook endpoint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Webhook"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Insufficient scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Webhook not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"patch":{"tags":["Webhooks"],"summary":"Update a webhook endpoint","description":"Update a webhook endpoint's `url`, subscribed `events`, `name`, and/or `status` (use `status` to pause and re-enable deliveries without deleting the endpoint). The signing secret is never changed by an update. Verify your changes with [Send a test event](#post-webhooks-id-test). Requires the `webhooks:manage` capability.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookUpdate"}}}},"responses":{"200":{"description":"The updated endpoint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Webhook"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Insufficient scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Webhook not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"That URL or name is already used by another endpoint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"tags":["Webhooks"],"summary":"Delete a webhook endpoint","description":"Permanently delete a webhook endpoint and its delivery log. Deliveries stop immediately. The operation is idempotent — deleting an already-deleted endpoint still returns `204`. To stop deliveries temporarily instead, set `status` via [Update a webhook endpoint](#patch-webhooks-id). Requires the `webhooks:manage` capability.","responses":{"204":{"description":"Deleted."},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Insufficient scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/webhooks/{id}/test":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"post":{"tags":["Webhooks"],"summary":"Send a test event","description":"Fire a sample event at the endpoint synchronously and return the receiver's response so you can debug your handler end-to-end. The probe is signed exactly like a real delivery (verify it the same way) but is not persisted to the delivery log. Configure the endpoint itself with [Update a webhook endpoint](#patch-webhooks-id). Requires the `webhooks:manage` capability.","responses":{"200":{"description":"The probe result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookTestResult"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Insufficient scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Webhook not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api-keys":{"get":{"tags":["API keys"],"summary":"List API keys","description":"Retrieve a list of your workspace's API keys — the key prefix and metadata only, never the secret. Create a new key with [Create an API key](#post-api-keys) or revoke one with [Revoke an API key](#delete-api-keys-id). This endpoint is session-gated: it requires a dashboard session and cannot be called with a Bearer API key.","parameters":[{"name":"limit","in":"query","required":false,"description":"Max rows to return (default 20, max 100).","schema":{"type":"integer","minimum":1,"maximum":100}},{"name":"after","in":"query","required":false,"description":"Return rows after this id (forward paging).","schema":{"type":"string"}},{"name":"before","in":"query","required":false,"description":"Return rows before this id (backward paging).","schema":{"type":"string"}}],"responses":{"200":{"description":"A page of API keys.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["list"]},"has_more":{"type":"boolean"},"data":{"type":"array","items":{"$ref":"#/components/schemas/ApiKey"}}},"required":["object","has_more","data"]}}}},"401":{"description":"Not authenticated (no dashboard session).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Insufficient permission (`apikeys:manage` required).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Invalid pagination params.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"tags":["API keys"],"summary":"Create an API key","description":"Create an API key scoped to the capabilities you choose. The response includes the plaintext `key` exactly once — store it securely now, because it can never be retrieved again (only [revoked](#delete-api-keys-id)). This endpoint is session-gated: it requires a dashboard session and cannot be called with a Bearer API key.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyCreate"}}}},"responses":{"201":{"description":"Created — includes the one-time plaintext key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyCreated"}}}},"401":{"description":"Not authenticated (no dashboard session).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Insufficient permission (`apikeys:manage` required).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api-keys/{id}":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"delete":{"tags":["API keys"],"summary":"Revoke an API key","description":"Permanently revoke an API key. Requests made with it start failing with `401` immediately, and revocation cannot be undone — create a replacement first with [Create an API key](#post-api-keys) if you're rotating. This endpoint is session-gated: it requires a dashboard session and cannot be called with a Bearer API key.","responses":{"204":{"description":"Revoked."},"401":{"description":"Not authenticated (no dashboard session).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Insufficient permission (`apikeys:manage` required).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"API key not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/suppressions":{"get":{"tags":["Suppressions"],"summary":"List suppressed addresses","description":"Retrieve a list of email addresses that are blocked from receiving your mail, newest-first and cursor-paginated. The list includes your workspace's own suppressions AND the read-only Unitpost-wide (`platform`) entries that would block a send — so it's the complete answer to \"why isn't this address getting mail?\". Pass `?scope=workspace` to hide platform rows. Add an address with [Suppress an address](#post-suppressions) or lift a block with [Un-suppress an address](#delete-suppressions-id). Requires the `suppressions:read` capability.","parameters":[{"name":"limit","in":"query","required":false,"description":"Max rows to return (default 20, max 100).","schema":{"type":"integer","minimum":1,"maximum":100}},{"name":"after","in":"query","required":false,"description":"Return rows after this id (forward paging).","schema":{"type":"string"}},{"name":"before","in":"query","required":false,"description":"Return rows before this id (backward paging).","schema":{"type":"string"}},{"name":"scope","in":"query","required":false,"description":"Filter by scope. `workspace` returns only your own suppressions; omit (or any other value) to also include read-only `platform` rows.","schema":{"type":"string","enum":["workspace","platform"]}}],"responses":{"200":{"description":"A page of suppressed addresses.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["list"]},"has_more":{"type":"boolean"},"data":{"type":"array","items":{"$ref":"#/components/schemas/Suppression"}}},"required":["object","has_more","data"]}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Insufficient scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Invalid pagination params.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"tags":["Suppressions"],"summary":"Suppress an address","description":"Block one address (`{ email }`) or up to 1,000 at once (`{ emails: [...] }`) from receiving any future sends from your workspace. The operation is idempotent — re-suppressing an existing address returns `200` rather than a conflict. The bulk form returns an `{ object: \"list\", added, skipped, total }` summary. Suppression is the hard stop; to let recipients opt out of just one kind of email, use topics (see [Create a topic](#post-topics)). Undo with [Un-suppress an address](#delete-suppressions-id). Requires the `suppressions:write` capability.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuppressionCreate"}}}},"responses":{"200":{"description":"Already suppressed (single → the `Suppression`), or the bulk summary (`{ object: \"list\", added, skipped, total }`).","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/Suppression"},{"$ref":"#/components/schemas/SuppressionBulkResult"}]}}}},"201":{"description":"Newly suppressed (single).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Suppression"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Insufficient scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/suppressions/{id}":{"parameters":[{"name":"id","in":"path","required":true,"description":"A suppression id (`supp_…`) or the email address.","schema":{"type":"string"}}],"get":{"tags":["Suppressions"],"summary":"Retrieve a suppressed address","description":"Retrieve one suppression by id (`supp_…`) or by the email address itself. Returns your own workspace row, or a read-only `platform` row when the address is blocked Unitpost-wide. Lift a workspace block with [Un-suppress an address](#delete-suppressions-id). Requires the `suppressions:read` capability.","responses":{"200":{"description":"The suppression.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Suppression"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Insufficient scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Suppression not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"tags":["Suppressions"],"summary":"Un-suppress an address","description":"Remove a workspace suppression by id or email so the address can receive your mail again. The email form is idempotent — removing an address that isn't suppressed still returns `204`. Unitpost-wide (`platform`) entries can't be removed here (`403`) — contact support. Check what's blocking an address first with [Retrieve a suppressed address](#get-suppressions-id). Requires the `suppressions:write` capability.","responses":{"204":{"description":"Removed (or already absent)."},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Insufficient scope, or the address is a platform-level block.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Suppression not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/usage":{"get":{"tags":["Usage"],"summary":"Retrieve usage","description":"Retrieve your workspace's current billing-period usage snapshot: the plan, the period window, and the email counter. On paid plans the response also carries the dollar sending `wallet` — the monthly allowance included with the plan, spend so far, any upgrade carryover, the non-expiring purchased-credit balance, and billable overage — all as integer USD cents. On the free plan `wallet` is null and the `emails` object carries the monthly quota and daily cap instead. Amounts are read from the same meters that gate sending, so this matches the dashboard exactly. Requires the `emails:read` capability.","responses":{"200":{"description":"The current-period usage snapshot.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Usage"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Insufficient scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}},"components":{"securitySchemes":{"apiKey":{"type":"http","scheme":"bearer","description":"Your workspace API key."}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"Stable machine-readable error code (branch on this, not the message)."},"message":{"type":"string","description":"Human-readable summary. For validation errors it's path-prefixed (e.g. \"template.variables.first_name: …\")."},"details":{"type":"array","description":"Present on errors that carry per-field reasons: validation errors (422) and a blocked campaign send (409). One entry per offending field/blocker.","items":{"type":"object","properties":{"field":{"type":"string","description":"Dotted path to the field, e.g. \"template.variables.first_name\" (empty for a whole-body problem)."},"message":{"type":"string"}},"required":["field","message"]}}},"required":["code","message"]}},"required":["error"]},"SendEmail":{"type":"object","properties":{"from":{"description":"Sender address on one of your verified domains. Accepts a bare address (\"hi@acme.com\") or a display name (\"Acme <hi@acme.com>\") — the name is what inbox clients show next to the message.","type":"string"},"to":{"anyOf":[{"type":"string"},{"minItems":1,"maxItems":50,"type":"array","items":{"type":"string"}}]},"subject":{"type":"string","minLength":1},"cc":{"anyOf":[{"type":"string"},{"minItems":1,"maxItems":50,"type":"array","items":{"type":"string"}}]},"bcc":{"anyOf":[{"type":"string"},{"minItems":1,"maxItems":50,"type":"array","items":{"type":"string"}}]},"reply_to":{"anyOf":[{"type":"string"},{"minItems":1,"maxItems":50,"type":"array","items":{"type":"string"}}]},"in_reply_to":{"type":"string","minLength":1},"headers":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}},"tags":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","pattern":"^[A-Za-z0-9_-]{1,256}$"},"value":{"type":"string","pattern":"^[A-Za-z0-9_-]{1,256}$"}},"required":["name","value"]}},"template":{"type":"object","properties":{"id":{"type":"string","minLength":1},"variables":{"type":"object","propertyNames":{"type":"string","minLength":1,"maxLength":50,"pattern":"^[A-Za-z0-9_]+$"},"additionalProperties":{"anyOf":[{"type":"string","maxLength":2000},{"type":"number"}]}}},"required":["id"]},"html":{"type":"string"},"text":{"type":"string"},"attachments":{"maxItems":20,"type":"array","items":{"type":"object","properties":{"filename":{"type":"string","minLength":1,"maxLength":256,"pattern":"^[^/\\\\\\u0000-\\u001f]+$"},"content":{"type":"string","minLength":1},"path":{"type":"string","format":"uri"},"content_type":{"type":"string","maxLength":255},"content_id":{"type":"string","maxLength":255}},"required":["filename"]}},"open_tracking":{"type":"boolean"},"click_tracking":{"type":"boolean"},"scheduled_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"}},"required":["from","to"]},"SendResult":{"type":"object","properties":{"id":{"type":"string"},"status":{"type":"string","enum":["queued","scheduled"]},"scheduled_at":{"type":["string","null"]}},"required":["id","status","scheduled_at"]},"BatchSend":{"anyOf":[{"minItems":1,"maxItems":100,"type":"array","items":{"type":"object","properties":{"from":{"description":"Sender address on one of your verified domains. Accepts a bare address (\"hi@acme.com\") or a display name (\"Acme <hi@acme.com>\") — the name is what inbox clients show next to the message.","type":"string"},"to":{"anyOf":[{"type":"string"},{"minItems":1,"maxItems":50,"type":"array","items":{"type":"string"}}]},"subject":{"type":"string","minLength":1},"cc":{"anyOf":[{"type":"string"},{"minItems":1,"maxItems":50,"type":"array","items":{"type":"string"}}]},"bcc":{"anyOf":[{"type":"string"},{"minItems":1,"maxItems":50,"type":"array","items":{"type":"string"}}]},"reply_to":{"anyOf":[{"type":"string"},{"minItems":1,"maxItems":50,"type":"array","items":{"type":"string"}}]},"in_reply_to":{"type":"string","minLength":1},"headers":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}},"tags":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","pattern":"^[A-Za-z0-9_-]{1,256}$"},"value":{"type":"string","pattern":"^[A-Za-z0-9_-]{1,256}$"}},"required":["name","value"]}},"template":{"type":"object","properties":{"id":{"type":"string","minLength":1},"variables":{"type":"object","propertyNames":{"type":"string","minLength":1,"maxLength":50,"pattern":"^[A-Za-z0-9_]+$"},"additionalProperties":{"anyOf":[{"type":"string","maxLength":2000},{"type":"number"}]}}},"required":["id"]},"html":{"type":"string"},"text":{"type":"string"},"open_tracking":{"type":"boolean"},"click_tracking":{"type":"boolean"}},"required":["from","to"]}},{"type":"object","properties":{"emails":{"minItems":1,"maxItems":100,"type":"array","items":{"type":"object","properties":{"from":{"description":"Sender address on one of your verified domains. Accepts a bare address (\"hi@acme.com\") or a display name (\"Acme <hi@acme.com>\") — the name is what inbox clients show next to the message.","type":"string"},"to":{"anyOf":[{"type":"string"},{"minItems":1,"maxItems":50,"type":"array","items":{"type":"string"}}]},"subject":{"type":"string","minLength":1},"cc":{"anyOf":[{"type":"string"},{"minItems":1,"maxItems":50,"type":"array","items":{"type":"string"}}]},"bcc":{"anyOf":[{"type":"string"},{"minItems":1,"maxItems":50,"type":"array","items":{"type":"string"}}]},"reply_to":{"anyOf":[{"type":"string"},{"minItems":1,"maxItems":50,"type":"array","items":{"type":"string"}}]},"in_reply_to":{"type":"string","minLength":1},"headers":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}},"tags":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","pattern":"^[A-Za-z0-9_-]{1,256}$"},"value":{"type":"string","pattern":"^[A-Za-z0-9_-]{1,256}$"}},"required":["name","value"]}},"template":{"type":"object","properties":{"id":{"type":"string","minLength":1},"variables":{"type":"object","propertyNames":{"type":"string","minLength":1,"maxLength":50,"pattern":"^[A-Za-z0-9_]+$"},"additionalProperties":{"anyOf":[{"type":"string","maxLength":2000},{"type":"number"}]}}},"required":["id"]},"html":{"type":"string"},"text":{"type":"string"},"open_tracking":{"type":"boolean"},"click_tracking":{"type":"boolean"}},"required":["from","to"]}},"scheduled_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"}},"required":["emails"]}]},"BatchSendResult":{"type":"object","properties":{"object":{"type":"string","enum":["list"]},"batch_id":{"type":"string","description":"Handle for GET / cancel on /emails/batches/{id}."},"status":{"type":"string","enum":["queued","scheduled"]},"scheduled_at":{"type":["string","null"]},"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"}},"required":["id"]}},"failed":{"type":"array","items":{"type":"object","properties":{"index":{"type":"integer"},"error":{"type":"string"}},"required":["index","error"]}}},"required":["object","batch_id","status","scheduled_at","data","failed"]},"Batch":{"type":"object","properties":{"object":{"type":"string","enum":["batch"]},"id":{"type":"string"},"count":{"type":"integer"},"scheduled_at":{"type":["string","null"]},"created_at":{"type":"string"},"status_counts":{"type":"object","additionalProperties":{"type":"integer"},"description":"Live child counts keyed by status (e.g. { delivered: 98, failed: 2 })."},"cancelable":{"type":"integer"}},"required":["object","id","count","scheduled_at","created_at","status_counts","cancelable"]},"Email":{"type":"object","properties":{"object":{"type":"string","const":"email"},"id":{"type":"string"},"to":{"type":"array","items":{"type":"string"}},"from":{"type":"string"},"subject":{"type":"string"},"template_id":{"anyOf":[{"type":"string"},{"type":"null"}]},"campaign_id":{"anyOf":[{"type":"string"},{"type":"null"}]},"status":{"type":"string","enum":["scheduled","queued","sent","delivered","bounced","complained","canceled","failed"]},"last_event":{"type":"string"},"scheduled_at":{"anyOf":[{"type":"string"},{"type":"null"}]},"sent_at":{"anyOf":[{"type":"string"},{"type":"null"}]},"delivered_at":{"anyOf":[{"type":"string"},{"type":"null"}]},"opened_at":{"anyOf":[{"type":"string"},{"type":"null"}]},"clicked_at":{"anyOf":[{"type":"string"},{"type":"null"}]},"canceled_at":{"anyOf":[{"type":"string"},{"type":"null"}]},"last_error":{"anyOf":[{"type":"string"},{"type":"null"}]},"created_at":{"type":"string"}},"required":["object","id","to","from","subject","template_id","campaign_id","status","last_event","scheduled_at","sent_at","delivered_at","opened_at","clicked_at","canceled_at","last_error","created_at"]},"EmailPatch":{"type":"object","properties":{"cancel":{"type":"boolean","const":true},"scheduled_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"}}},"EmailStats":{"type":"object","properties":{"windowDays":{"type":"integer","description":"The rolling window, in days."},"clampedToRetentionDays":{"type":["integer","null"],"description":"Non-null when the requested window exceeded the plan's log retention and was clamped to this many days (data past the retention horizon is purged)."},"totals":{"type":"object","properties":{"sent":{"type":"integer"},"delivered":{"type":"integer"},"opened":{"type":"integer"},"clicked":{"type":"integer"},"bounced":{"type":"integer"},"complained":{"type":"integer"},"failed":{"type":"integer"}},"required":["sent","delivered","opened","clicked","bounced","complained","failed"]},"rates":{"type":"object","description":"Percentages (one decimal). delivery/bounce/complaint are vs sent; open/click are vs delivered.","properties":{"delivery":{"type":"number"},"open":{"type":"number"},"click":{"type":"number"},"bounce":{"type":"number"},"complaint":{"type":"number"}},"required":["delivery","open","click","bounce","complaint"]}},"required":["windowDays","totals","rates"]},"Contact":{"type":"object","properties":{"object":{"type":"string","const":"contact"},"id":{"type":"string"},"email":{"type":"string"},"first_name":{"anyOf":[{"type":"string"},{"type":"null"}]},"last_name":{"anyOf":[{"type":"string"},{"type":"null"}]},"unsubscribed":{"type":"boolean"},"unsubscribed_at":{"anyOf":[{"type":"string"},{"type":"null"}]},"unsubscribe_reason":{"anyOf":[{"type":"string","enum":["USER","MANUAL","IMPORT","BOUNCE","COMPLAINT"]},{"type":"null"}]},"custom_fields":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"}]}},"created_at":{"type":"string"},"updated_at":{"type":"string"}},"required":["object","id","email","first_name","last_name","unsubscribed","unsubscribed_at","unsubscribe_reason","custom_fields","created_at","updated_at"]},"ContactCreate":{"type":"object","properties":{"email":{"type":"string"},"first_name":{"type":"string"},"last_name":{"type":"string"},"unsubscribed":{"type":"boolean"},"custom_fields":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"}]}}},"required":["email"]},"ContactUpdate":{"type":"object","properties":{"first_name":{"anyOf":[{"type":"string"},{"type":"null"}]},"last_name":{"anyOf":[{"type":"string"},{"type":"null"}]},"unsubscribed":{"type":"boolean"},"custom_fields":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"}]}}}},"ContactField":{"type":"object","properties":{"object":{"type":"string","const":"contact_field"},"id":{"type":"string"},"key":{"type":"string"},"label":{"type":"string"},"type":{"type":"string","enum":["text","number","boolean","date"]},"default_value":{"anyOf":[{"type":"string"},{"type":"null"}]},"position":{"type":"number"},"created_at":{"type":"string"},"updated_at":{"type":"string"}},"required":["object","id","key","label","type","default_value","position","created_at","updated_at"]},"ContactFieldCreate":{"type":"object","properties":{"key":{"type":"string"},"label":{"type":"string"},"type":{"type":"string","enum":["text","number","boolean","date"]},"default_value":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["key","label"]},"ContactFieldUpdate":{"type":"object","properties":{"label":{"type":"string"},"type":{"type":"string","enum":["text","number","boolean","date"]},"position":{"type":"integer","minimum":0,"maximum":9007199254740991},"default_value":{"anyOf":[{"type":"string"},{"type":"null"}]}}},"ContactFieldRename":{"type":"object","properties":{"key":{"type":"string"}},"required":["key"]},"ContactImport":{"type":"object","properties":{"object":{"type":"string","const":"contact_import"},"id":{"type":"string"},"status":{"type":"string","enum":["pending","processing","completed","failed"]},"total":{"type":"number"},"imported":{"type":"number"},"skipped":{"type":"number"},"failed":{"type":"number"},"invalid":{"type":"array","items":{"type":"object","properties":{"row":{"type":"number"},"reason":{"type":"string"}},"required":["row","reason"]}},"error":{"anyOf":[{"type":"string"},{"type":"null"}]},"created_at":{"type":"string"},"updated_at":{"type":"string"}},"required":["object","id","status","total","imported","skipped","failed","invalid","error","created_at","updated_at"]},"ContactImportCreate":{"type":"object","properties":{"contacts":{"type":"array","minItems":1,"maxItems":5000,"items":{"type":"object","properties":{"email":{"type":"string"},"first_name":{"type":"string","maxLength":120},"last_name":{"type":"string","maxLength":120},"custom_fields":{"type":"object","propertyNames":{"type":"string","maxLength":64},"additionalProperties":{"anyOf":[{"type":"string","maxLength":1000},{"type":"number"},{"type":"boolean"},{"type":"null"}]}}},"required":["email"]}}},"required":["contacts"]},"Segment":{"type":"object","properties":{"object":{"type":"string","const":"segment"},"id":{"type":"string"},"name":{"type":"string"},"description":{"anyOf":[{"type":"string"},{"type":"null"}]},"type":{"type":"string","enum":["static","dynamic"]},"filter":{"anyOf":[{"$ref":"#/definitions/__schema0"},{"type":"null"}]},"created_at":{"type":"string"},"updated_at":{"type":"string"}},"required":["object","id","name","description","type","filter","created_at","updated_at"],"definitions":{"__schema0":{"type":"object","properties":{"match":{"default":"all","type":"string","enum":["all","any"]},"conditions":{"minItems":1,"maxItems":25,"type":"array","items":{"anyOf":[{"type":"object","properties":{"field":{"type":"string","minLength":1,"maxLength":64},"operator":{"type":"string","enum":["eq","neq","contains","not_contains","starts_with","ends_with","gt","gte","lt","lte","is_set","is_not_set"]},"value":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]}},"required":["field","operator"]},{"$ref":"#/definitions/__schema0"}]}}},"required":["conditions"]}}},"SegmentCreate":{"type":"object","properties":{"name":{"type":"string"},"description":{"type":"string"},"type":{"type":"string","enum":["static","dynamic"]},"filter":{"allOf":[{"$ref":"#/definitions/__schema0"}]}},"required":["name"],"definitions":{"__schema0":{"type":"object","properties":{"match":{"default":"all","type":"string","enum":["all","any"]},"conditions":{"minItems":1,"maxItems":25,"type":"array","items":{"anyOf":[{"type":"object","properties":{"field":{"type":"string","minLength":1,"maxLength":64},"operator":{"type":"string","enum":["eq","neq","contains","not_contains","starts_with","ends_with","gt","gte","lt","lte","is_set","is_not_set"]},"value":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]}},"required":["field","operator"]},{"$ref":"#/definitions/__schema0"}]}}},"required":["conditions"]}}},"SegmentUpdate":{"type":"object","properties":{"name":{"type":"string"},"description":{"anyOf":[{"type":"string"},{"type":"null"}]},"filter":{"allOf":[{"$ref":"#/definitions/__schema0"}]}},"definitions":{"__schema0":{"type":"object","properties":{"match":{"default":"all","type":"string","enum":["all","any"]},"conditions":{"minItems":1,"maxItems":25,"type":"array","items":{"anyOf":[{"type":"object","properties":{"field":{"type":"string","minLength":1,"maxLength":64},"operator":{"type":"string","enum":["eq","neq","contains","not_contains","starts_with","ends_with","gt","gte","lt","lte","is_set","is_not_set"]},"value":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]}},"required":["field","operator"]},{"$ref":"#/definitions/__schema0"}]}}},"required":["conditions"]}}},"SegmentMember":{"type":"object","properties":{"object":{"type":"string","const":"segment_member"},"contact_id":{"type":"string"},"subscribed":{"type":"boolean"},"unsubscribed_at":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["object","contact_id","subscribed","unsubscribed_at"]},"SegmentMemberAdd":{"type":"object","properties":{"contact":{"type":"string","minLength":1},"subscribed":{"type":"boolean"}},"required":["contact"]},"Topic":{"type":"object","properties":{"object":{"type":"string","const":"topic"},"id":{"type":"string"},"name":{"type":"string"},"description":{"anyOf":[{"type":"string"},{"type":"null"}]},"default_opt_in":{"type":"boolean"},"created_at":{"type":"string"},"updated_at":{"type":"string"}},"required":["object","id","name","description","default_opt_in","created_at","updated_at"]},"TopicCreate":{"type":"object","properties":{"name":{"type":"string"},"description":{"type":"string"},"default_opt_in":{"type":"boolean"}},"required":["name"]},"TopicUpdate":{"type":"object","properties":{"name":{"type":"string"},"description":{"anyOf":[{"type":"string"},{"type":"null"}]},"default_opt_in":{"type":"boolean"}}},"ContactTopic":{"type":"object","properties":{"object":{"type":"string","const":"contact_topic"},"topic_id":{"type":"string"},"subscribed":{"type":"boolean"},"status":{"type":"string","enum":["subscribed","unsubscribed"]},"source":{"type":"string","enum":["user","manual","import","api"]}},"required":["object","topic_id","subscribed","status","source"]},"ContactTopicSet":{"type":"object","properties":{"topic_id":{"type":"string","minLength":1},"topic":{"type":"string","minLength":1},"subscribed":{"type":"boolean"}},"required":["subscribed"]},"Campaign":{"type":"object","properties":{"object":{"type":"string","const":"campaign"},"id":{"type":"string"},"name":{"type":"string"},"template_id":{"type":"string"},"segment_id":{"type":"string"},"topic_id":{"anyOf":[{"type":"string"},{"type":"null"}]},"from":{"type":"string"},"subject":{"anyOf":[{"type":"string"},{"type":"null"}]},"preview_text":{"anyOf":[{"type":"string"},{"type":"null"}]},"open_tracking":{"anyOf":[{"type":"boolean"},{"type":"null"}]},"click_tracking":{"anyOf":[{"type":"boolean"},{"type":"null"}]},"status":{"type":"string","enum":["draft","scheduled","sending","paused","sent","canceled","failed"]},"scheduled_at":{"anyOf":[{"type":"string"},{"type":"null"}]},"variable_fallbacks":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}},"excluded_contact_ids":{"type":"array","items":{"type":"string"}},"total_recipients":{"type":"number"},"sent_count":{"type":"number"},"failed_count":{"type":"number"},"created_at":{"type":"string"},"updated_at":{"type":"string"}},"required":["object","id","name","template_id","segment_id","topic_id","from","subject","preview_text","open_tracking","click_tracking","status","scheduled_at","variable_fallbacks","excluded_contact_ids","total_recipients","sent_count","failed_count","created_at","updated_at"]},"CampaignCreate":{"type":"object","properties":{"name":{"type":"string"},"template_id":{"type":"string"},"segment_id":{"type":"string"},"recipients":{"type":"array","items":{"type":"string"}},"topic_id":{"type":"string"},"from":{"type":"string"},"subject":{"type":"string"},"preview_text":{"type":"string"},"scheduled_at":{"type":"string"},"open_tracking":{"anyOf":[{"type":"boolean"},{"type":"null"}]},"click_tracking":{"anyOf":[{"type":"boolean"},{"type":"null"}]},"variable_fallbacks":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}},"excluded_contact_ids":{"type":"array","items":{"type":"string"}}},"required":["name","template_id","from"]},"CampaignUpdate":{"type":"object","properties":{"archived":{"type":"boolean"},"topic_id":{"anyOf":[{"type":"string"},{"type":"null"}]},"open_tracking":{"anyOf":[{"type":"boolean"},{"type":"null"}]},"click_tracking":{"anyOf":[{"type":"boolean"},{"type":"null"}]},"variable_fallbacks":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}},"excluded_contact_ids":{"type":"array","items":{"type":"string"}}}},"CampaignReschedule":{"type":"object","properties":{"scheduled_at":{"type":"string","description":"New send time, ISO 8601. Only SCHEDULED campaigns can be moved."}},"required":["scheduled_at"]},"Template":{"type":"object","properties":{"object":{"type":"string","const":"template"},"id":{"type":"string"},"name":{"type":"string"},"subject":{"anyOf":[{"type":"string"},{"type":"null"}]},"mode":{"type":"string","enum":["code","visual"]},"status":{"type":"string","enum":["draft","published"]},"design":{"anyOf":[{},{"type":"null"}]},"created_at":{"type":"string"},"updated_at":{"type":"string"}},"required":["object","id","name","subject","mode","status","created_at","updated_at"]},"TemplateCreate":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":120},"subject":{"type":"string","maxLength":255},"mode":{"type":"string","enum":["code","visual"]},"category":{"type":"string","enum":["transactional","marketing"]},"design":{"type":"object","properties":{"version":{"default":5,"type":"number","const":5},"previewText":{"default":"","type":"string"},"category":{"default":"transactional","type":"string","enum":["transactional","marketing"]},"openTracking":{"type":"boolean"},"clickTracking":{"type":"boolean"},"tracking":{"type":"boolean"},"from":{"default":"","type":"string"},"theme":{"type":"object","properties":{"fontFamily":{"default":"-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif","type":"string"},"textColor":{"default":"#1a1a1a","type":"string"},"backgroundColor":{"default":"#f4f4f5","type":"string"},"bodyColor":{"default":"#ffffff","type":"string"},"linkColor":{"default":"#2563eb","type":"string"},"contentWidth":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"bodyPadding":{"type":"integer","minimum":0,"maximum":9007199254740991},"bodyPaddingSides":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"bodyRadius":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"variables":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","minLength":1,"pattern":"^[\\w.]+$"},"type":{"default":"string","type":"string","enum":["string","number"]},"source":{"default":"input","type":"string","enum":["input","contact"]},"contactField":{"type":"string"},"style":{"type":"object","properties":{"bold":{"type":"boolean"},"italic":{"type":"boolean"},"underline":{"type":"boolean"},"color":{"type":"string"},"background":{"type":"string"},"fontFamily":{"type":"string"},"fontSize":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"href":{"type":"string"}}}},"required":["name"]}},"className":{"type":"string"},"blocks":{"type":"array","items":{"anyOf":[{"$ref":"#/definitions/__schema0"},{"type":"object","properties":{"type":{"type":"string","const":"row"},"id":{"type":"string"},"backgroundColor":{"type":"string"},"border":{"type":"object","properties":{"width":{"type":"integer","minimum":0,"maximum":9007199254740991},"style":{"type":"string","enum":["solid","dashed","dotted"]},"color":{"type":"string"},"radius":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"paddingX":{"type":"integer","minimum":0,"maximum":9007199254740991},"paddingY":{"type":"integer","minimum":0,"maximum":9007199254740991},"columnGap":{"type":"integer","minimum":0,"maximum":9007199254740991},"stackOnMobile":{"default":true,"type":"boolean"},"margin":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"padding":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"customCss":{"type":"string"},"className":{"type":"string"},"componentRef":{"type":"object","properties":{"id":{"type":"string"},"name":{"default":"","type":"string"},"unlocked":{"type":"boolean"}},"required":["id"]},"columns":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string","const":"column"},"id":{"type":"string"},"width":{"type":"integer","minimum":1,"maximum":100},"backgroundColor":{"type":"string"},"border":{"type":"object","properties":{"width":{"type":"integer","minimum":0,"maximum":9007199254740991},"style":{"type":"string","enum":["solid","dashed","dotted"]},"color":{"type":"string"},"radius":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"paddingX":{"type":"integer","minimum":0,"maximum":9007199254740991},"paddingY":{"type":"integer","minimum":0,"maximum":9007199254740991},"margin":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"padding":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"customCss":{"type":"string"},"className":{"type":"string"},"componentRef":{"type":"object","properties":{"id":{"type":"string"},"name":{"default":"","type":"string"},"unlocked":{"type":"boolean"}},"required":["id"]},"children":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","const":"text"},"id":{"type":"string"},"text":{"default":"","type":"string"},"content":{"type":"array","items":{"type":"object","properties":{"text":{"default":"","type":"string"},"marks":{"type":"object","properties":{"bold":{"type":"boolean"},"italic":{"type":"boolean"},"underline":{"type":"boolean"},"link":{"type":"string"},"color":{"type":"string"},"background":{"type":"string"},"fontFamily":{"type":"string"},"fontSize":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}}},"variable":{"type":"string"}}}},"align":{"default":"left","type":"string","enum":["left","center","right"]},"color":{"type":"string"},"fontSize":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"fontFamily":{"type":"string"},"lineHeight":{"anyOf":[{"type":"number"},{"type":"string"}]},"letterSpacing":{"type":"number"},"fontWeight":{"anyOf":[{"type":"string"},{"type":"number"}]},"marginBottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"margin":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"padding":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"customCss":{"type":"string"},"className":{"type":"string"},"componentRef":{"type":"object","properties":{"id":{"type":"string"},"name":{"default":"","type":"string"},"unlocked":{"type":"boolean"}},"required":["id"]}},"required":["type","id"]},{"type":"object","properties":{"type":{"type":"string","const":"heading"},"id":{"type":"string"},"text":{"default":"","type":"string"},"content":{"type":"array","items":{"type":"object","properties":{"text":{"default":"","type":"string"},"marks":{"type":"object","properties":{"bold":{"type":"boolean"},"italic":{"type":"boolean"},"underline":{"type":"boolean"},"link":{"type":"string"},"color":{"type":"string"},"background":{"type":"string"},"fontFamily":{"type":"string"},"fontSize":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}}},"variable":{"type":"string"}}}},"level":{"anyOf":[{"type":"number","const":1},{"type":"number","const":2},{"type":"number","const":3},{"type":"number","const":4}]},"fontSize":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"align":{"default":"left","type":"string","enum":["left","center","right"]},"color":{"type":"string"},"fontFamily":{"type":"string"},"lineHeight":{"anyOf":[{"type":"number"},{"type":"string"}]},"letterSpacing":{"type":"number"},"fontWeight":{"anyOf":[{"type":"string"},{"type":"number"}]},"marginBottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"margin":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"padding":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"customCss":{"type":"string"},"className":{"type":"string"},"componentRef":{"type":"object","properties":{"id":{"type":"string"},"name":{"default":"","type":"string"},"unlocked":{"type":"boolean"}},"required":["id"]}},"required":["type","id"]},{"type":"object","properties":{"type":{"type":"string","const":"button"},"id":{"type":"string"},"text":{"default":"Click here","type":"string"},"href":{"default":"#","type":"string"},"align":{"default":"left","type":"string","enum":["left","center","right"]},"backgroundColor":{"default":"#18181b","type":"string"},"textColor":{"default":"#ffffff","type":"string"},"borderRadius":{"type":"integer","minimum":0,"maximum":9007199254740991},"innerPaddingX":{"type":"integer","minimum":0,"maximum":9007199254740991},"innerPaddingY":{"type":"integer","minimum":0,"maximum":9007199254740991},"marginBottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"margin":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"padding":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"customCss":{"type":"string"},"className":{"type":"string"},"componentRef":{"type":"object","properties":{"id":{"type":"string"},"name":{"default":"","type":"string"},"unlocked":{"type":"boolean"}},"required":["id"]}},"required":["type","id"]},{"type":"object","properties":{"type":{"type":"string","const":"image"},"id":{"type":"string"},"src":{"default":"","type":"string"},"alt":{"default":"","type":"string"},"href":{"type":"string"},"width":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"height":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"borderRadius":{"type":"integer","minimum":0,"maximum":9007199254740991},"border":{"type":"object","properties":{"width":{"type":"integer","minimum":0,"maximum":9007199254740991},"style":{"type":"string","enum":["solid","dashed","dotted"]},"color":{"type":"string"},"radius":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"objectFit":{"type":"string","enum":["cover","contain","fill"]},"backgroundColor":{"type":"string"},"align":{"default":"center","type":"string","enum":["left","center","right"]},"marginBottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"margin":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"padding":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"customCss":{"type":"string"},"className":{"type":"string"},"componentRef":{"type":"object","properties":{"id":{"type":"string"},"name":{"default":"","type":"string"},"unlocked":{"type":"boolean"}},"required":["id"]}},"required":["type","id"]},{"type":"object","properties":{"type":{"type":"string","const":"divider"},"id":{"type":"string"},"color":{"default":"#e4e4e7","type":"string"},"marginBottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"margin":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"padding":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"customCss":{"type":"string"},"className":{"type":"string"},"componentRef":{"type":"object","properties":{"id":{"type":"string"},"name":{"default":"","type":"string"},"unlocked":{"type":"boolean"}},"required":["id"]}},"required":["type","id"]},{"type":"object","properties":{"type":{"type":"string","const":"link"},"id":{"type":"string"},"text":{"default":"Link text","type":"string"},"href":{"default":"#","type":"string"},"align":{"default":"left","type":"string","enum":["left","center","right"]},"color":{"type":"string"},"fontSize":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"fontFamily":{"type":"string"},"underline":{"type":"boolean"},"marginBottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"margin":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"padding":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"customCss":{"type":"string"},"className":{"type":"string"},"componentRef":{"type":"object","properties":{"id":{"type":"string"},"name":{"default":"","type":"string"},"unlocked":{"type":"boolean"}},"required":["id"]}},"required":["type","id"]},{"type":"object","properties":{"type":{"type":"string","const":"spacer"},"id":{"type":"string"},"height":{"type":"integer","minimum":1,"maximum":9007199254740991},"margin":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"customCss":{"type":"string"},"className":{"type":"string"},"componentRef":{"type":"object","properties":{"id":{"type":"string"},"name":{"default":"","type":"string"},"unlocked":{"type":"boolean"}},"required":["id"]}},"required":["type","id"]},{"type":"object","properties":{"type":{"type":"string","const":"markdown"},"id":{"type":"string"},"markdown":{"default":"","type":"string"},"align":{"default":"left","type":"string","enum":["left","center","right"]},"color":{"type":"string"},"fontSize":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"marginBottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"margin":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"padding":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"customCss":{"type":"string"},"className":{"type":"string"},"componentRef":{"type":"object","properties":{"id":{"type":"string"},"name":{"default":"","type":"string"},"unlocked":{"type":"boolean"}},"required":["id"]}},"required":["type","id"]},{"type":"object","properties":{"type":{"type":"string","const":"code"},"id":{"type":"string"},"code":{"default":"","type":"string"},"backgroundColor":{"default":"#f4f4f5","type":"string"},"color":{"default":"#1a1a1a","type":"string"},"marginBottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"margin":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"padding":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"customCss":{"type":"string"},"className":{"type":"string"},"componentRef":{"type":"object","properties":{"id":{"type":"string"},"name":{"default":"","type":"string"},"unlocked":{"type":"boolean"}},"required":["id"]}},"required":["type","id"]},{"type":"object","properties":{"type":{"type":"string","const":"html"},"id":{"type":"string"},"html":{"default":"","type":"string"},"marginBottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"margin":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"padding":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"customCss":{"type":"string"},"className":{"type":"string"},"componentRef":{"type":"object","properties":{"id":{"type":"string"},"name":{"default":"","type":"string"},"unlocked":{"type":"boolean"}},"required":["id"]}},"required":["type","id"]}]}}},"required":["type","id"]}}},"required":["type","id"]},{"type":"object","properties":{"type":{"type":"string","const":"text"},"id":{"type":"string"},"text":{"default":"","type":"string"},"content":{"type":"array","items":{"type":"object","properties":{"text":{"default":"","type":"string"},"marks":{"type":"object","properties":{"bold":{"type":"boolean"},"italic":{"type":"boolean"},"underline":{"type":"boolean"},"link":{"type":"string"},"color":{"type":"string"},"background":{"type":"string"},"fontFamily":{"type":"string"},"fontSize":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}}},"variable":{"type":"string"}}}},"align":{"default":"left","type":"string","enum":["left","center","right"]},"color":{"type":"string"},"fontSize":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"fontFamily":{"type":"string"},"lineHeight":{"anyOf":[{"type":"number"},{"type":"string"}]},"letterSpacing":{"type":"number"},"fontWeight":{"anyOf":[{"type":"string"},{"type":"number"}]},"marginBottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"margin":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"padding":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"customCss":{"type":"string"},"className":{"type":"string"},"componentRef":{"type":"object","properties":{"id":{"type":"string"},"name":{"default":"","type":"string"},"unlocked":{"type":"boolean"}},"required":["id"]}},"required":["type","id"]},{"type":"object","properties":{"type":{"type":"string","const":"heading"},"id":{"type":"string"},"text":{"default":"","type":"string"},"content":{"type":"array","items":{"type":"object","properties":{"text":{"default":"","type":"string"},"marks":{"type":"object","properties":{"bold":{"type":"boolean"},"italic":{"type":"boolean"},"underline":{"type":"boolean"},"link":{"type":"string"},"color":{"type":"string"},"background":{"type":"string"},"fontFamily":{"type":"string"},"fontSize":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}}},"variable":{"type":"string"}}}},"level":{"anyOf":[{"type":"number","const":1},{"type":"number","const":2},{"type":"number","const":3},{"type":"number","const":4}]},"fontSize":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"align":{"default":"left","type":"string","enum":["left","center","right"]},"color":{"type":"string"},"fontFamily":{"type":"string"},"lineHeight":{"anyOf":[{"type":"number"},{"type":"string"}]},"letterSpacing":{"type":"number"},"fontWeight":{"anyOf":[{"type":"string"},{"type":"number"}]},"marginBottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"margin":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"padding":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"customCss":{"type":"string"},"className":{"type":"string"},"componentRef":{"type":"object","properties":{"id":{"type":"string"},"name":{"default":"","type":"string"},"unlocked":{"type":"boolean"}},"required":["id"]}},"required":["type","id"]},{"type":"object","properties":{"type":{"type":"string","const":"button"},"id":{"type":"string"},"text":{"default":"Click here","type":"string"},"href":{"default":"#","type":"string"},"align":{"default":"left","type":"string","enum":["left","center","right"]},"backgroundColor":{"default":"#18181b","type":"string"},"textColor":{"default":"#ffffff","type":"string"},"borderRadius":{"type":"integer","minimum":0,"maximum":9007199254740991},"innerPaddingX":{"type":"integer","minimum":0,"maximum":9007199254740991},"innerPaddingY":{"type":"integer","minimum":0,"maximum":9007199254740991},"marginBottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"margin":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"padding":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"customCss":{"type":"string"},"className":{"type":"string"},"componentRef":{"type":"object","properties":{"id":{"type":"string"},"name":{"default":"","type":"string"},"unlocked":{"type":"boolean"}},"required":["id"]}},"required":["type","id"]},{"type":"object","properties":{"type":{"type":"string","const":"image"},"id":{"type":"string"},"src":{"default":"","type":"string"},"alt":{"default":"","type":"string"},"href":{"type":"string"},"width":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"height":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"borderRadius":{"type":"integer","minimum":0,"maximum":9007199254740991},"border":{"type":"object","properties":{"width":{"type":"integer","minimum":0,"maximum":9007199254740991},"style":{"type":"string","enum":["solid","dashed","dotted"]},"color":{"type":"string"},"radius":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"objectFit":{"type":"string","enum":["cover","contain","fill"]},"backgroundColor":{"type":"string"},"align":{"default":"center","type":"string","enum":["left","center","right"]},"marginBottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"margin":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"padding":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"customCss":{"type":"string"},"className":{"type":"string"},"componentRef":{"type":"object","properties":{"id":{"type":"string"},"name":{"default":"","type":"string"},"unlocked":{"type":"boolean"}},"required":["id"]}},"required":["type","id"]},{"type":"object","properties":{"type":{"type":"string","const":"divider"},"id":{"type":"string"},"color":{"default":"#e4e4e7","type":"string"},"marginBottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"margin":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"padding":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"customCss":{"type":"string"},"className":{"type":"string"},"componentRef":{"type":"object","properties":{"id":{"type":"string"},"name":{"default":"","type":"string"},"unlocked":{"type":"boolean"}},"required":["id"]}},"required":["type","id"]},{"type":"object","properties":{"type":{"type":"string","const":"link"},"id":{"type":"string"},"text":{"default":"Link text","type":"string"},"href":{"default":"#","type":"string"},"align":{"default":"left","type":"string","enum":["left","center","right"]},"color":{"type":"string"},"fontSize":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"fontFamily":{"type":"string"},"underline":{"type":"boolean"},"marginBottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"margin":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"padding":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"customCss":{"type":"string"},"className":{"type":"string"},"componentRef":{"type":"object","properties":{"id":{"type":"string"},"name":{"default":"","type":"string"},"unlocked":{"type":"boolean"}},"required":["id"]}},"required":["type","id"]},{"type":"object","properties":{"type":{"type":"string","const":"spacer"},"id":{"type":"string"},"height":{"type":"integer","minimum":1,"maximum":9007199254740991},"margin":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"customCss":{"type":"string"},"className":{"type":"string"},"componentRef":{"type":"object","properties":{"id":{"type":"string"},"name":{"default":"","type":"string"},"unlocked":{"type":"boolean"}},"required":["id"]}},"required":["type","id"]},{"type":"object","properties":{"type":{"type":"string","const":"markdown"},"id":{"type":"string"},"markdown":{"default":"","type":"string"},"align":{"default":"left","type":"string","enum":["left","center","right"]},"color":{"type":"string"},"fontSize":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"marginBottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"margin":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"padding":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"customCss":{"type":"string"},"className":{"type":"string"},"componentRef":{"type":"object","properties":{"id":{"type":"string"},"name":{"default":"","type":"string"},"unlocked":{"type":"boolean"}},"required":["id"]}},"required":["type","id"]},{"type":"object","properties":{"type":{"type":"string","const":"code"},"id":{"type":"string"},"code":{"default":"","type":"string"},"backgroundColor":{"default":"#f4f4f5","type":"string"},"color":{"default":"#1a1a1a","type":"string"},"marginBottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"margin":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"padding":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"customCss":{"type":"string"},"className":{"type":"string"},"componentRef":{"type":"object","properties":{"id":{"type":"string"},"name":{"default":"","type":"string"},"unlocked":{"type":"boolean"}},"required":["id"]}},"required":["type","id"]},{"type":"object","properties":{"type":{"type":"string","const":"html"},"id":{"type":"string"},"html":{"default":"","type":"string"},"marginBottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"margin":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"padding":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"customCss":{"type":"string"},"className":{"type":"string"},"componentRef":{"type":"object","properties":{"id":{"type":"string"},"name":{"default":"","type":"string"},"unlocked":{"type":"boolean"}},"required":["id"]}},"required":["type","id"]}]}}}}},"required":["name"],"definitions":{"__schema0":{"type":"object","properties":{"type":{"type":"string","const":"section"},"id":{"type":"string"},"backgroundColor":{"type":"string"},"border":{"type":"object","properties":{"width":{"type":"integer","minimum":0,"maximum":9007199254740991},"style":{"type":"string","enum":["solid","dashed","dotted"]},"color":{"type":"string"},"radius":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"paddingX":{"type":"integer","minimum":0,"maximum":9007199254740991},"paddingY":{"type":"integer","minimum":0,"maximum":9007199254740991},"margin":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"padding":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"customCss":{"type":"string"},"className":{"type":"string"},"children":{"type":"array","items":{"anyOf":[{"oneOf":[{"type":"object","properties":{"type":{"type":"string","const":"text"},"id":{"type":"string"},"text":{"default":"","type":"string"},"content":{"type":"array","items":{"type":"object","properties":{"text":{"default":"","type":"string"},"marks":{"type":"object","properties":{"bold":{"type":"boolean"},"italic":{"type":"boolean"},"underline":{"type":"boolean"},"link":{"type":"string"},"color":{"type":"string"},"background":{"type":"string"},"fontFamily":{"type":"string"},"fontSize":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}}},"variable":{"type":"string"}}}},"align":{"default":"left","type":"string","enum":["left","center","right"]},"color":{"type":"string"},"fontSize":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"fontFamily":{"type":"string"},"lineHeight":{"anyOf":[{"type":"number"},{"type":"string"}]},"letterSpacing":{"type":"number"},"fontWeight":{"anyOf":[{"type":"string"},{"type":"number"}]},"marginBottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"margin":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"padding":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"customCss":{"type":"string"},"className":{"type":"string"},"componentRef":{"type":"object","properties":{"id":{"type":"string"},"name":{"default":"","type":"string"},"unlocked":{"type":"boolean"}},"required":["id"]}},"required":["type","id"]},{"type":"object","properties":{"type":{"type":"string","const":"heading"},"id":{"type":"string"},"text":{"default":"","type":"string"},"content":{"type":"array","items":{"type":"object","properties":{"text":{"default":"","type":"string"},"marks":{"type":"object","properties":{"bold":{"type":"boolean"},"italic":{"type":"boolean"},"underline":{"type":"boolean"},"link":{"type":"string"},"color":{"type":"string"},"background":{"type":"string"},"fontFamily":{"type":"string"},"fontSize":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}}},"variable":{"type":"string"}}}},"level":{"anyOf":[{"type":"number","const":1},{"type":"number","const":2},{"type":"number","const":3},{"type":"number","const":4}]},"fontSize":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"align":{"default":"left","type":"string","enum":["left","center","right"]},"color":{"type":"string"},"fontFamily":{"type":"string"},"lineHeight":{"anyOf":[{"type":"number"},{"type":"string"}]},"letterSpacing":{"type":"number"},"fontWeight":{"anyOf":[{"type":"string"},{"type":"number"}]},"marginBottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"margin":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"padding":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"customCss":{"type":"string"},"className":{"type":"string"},"componentRef":{"type":"object","properties":{"id":{"type":"string"},"name":{"default":"","type":"string"},"unlocked":{"type":"boolean"}},"required":["id"]}},"required":["type","id"]},{"type":"object","properties":{"type":{"type":"string","const":"button"},"id":{"type":"string"},"text":{"default":"Click here","type":"string"},"href":{"default":"#","type":"string"},"align":{"default":"left","type":"string","enum":["left","center","right"]},"backgroundColor":{"default":"#18181b","type":"string"},"textColor":{"default":"#ffffff","type":"string"},"borderRadius":{"type":"integer","minimum":0,"maximum":9007199254740991},"innerPaddingX":{"type":"integer","minimum":0,"maximum":9007199254740991},"innerPaddingY":{"type":"integer","minimum":0,"maximum":9007199254740991},"marginBottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"margin":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"padding":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"customCss":{"type":"string"},"className":{"type":"string"},"componentRef":{"type":"object","properties":{"id":{"type":"string"},"name":{"default":"","type":"string"},"unlocked":{"type":"boolean"}},"required":["id"]}},"required":["type","id"]},{"type":"object","properties":{"type":{"type":"string","const":"image"},"id":{"type":"string"},"src":{"default":"","type":"string"},"alt":{"default":"","type":"string"},"href":{"type":"string"},"width":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"height":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"borderRadius":{"type":"integer","minimum":0,"maximum":9007199254740991},"border":{"type":"object","properties":{"width":{"type":"integer","minimum":0,"maximum":9007199254740991},"style":{"type":"string","enum":["solid","dashed","dotted"]},"color":{"type":"string"},"radius":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"objectFit":{"type":"string","enum":["cover","contain","fill"]},"backgroundColor":{"type":"string"},"align":{"default":"center","type":"string","enum":["left","center","right"]},"marginBottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"margin":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"padding":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"customCss":{"type":"string"},"className":{"type":"string"},"componentRef":{"type":"object","properties":{"id":{"type":"string"},"name":{"default":"","type":"string"},"unlocked":{"type":"boolean"}},"required":["id"]}},"required":["type","id"]},{"type":"object","properties":{"type":{"type":"string","const":"divider"},"id":{"type":"string"},"color":{"default":"#e4e4e7","type":"string"},"marginBottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"margin":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"padding":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"customCss":{"type":"string"},"className":{"type":"string"},"componentRef":{"type":"object","properties":{"id":{"type":"string"},"name":{"default":"","type":"string"},"unlocked":{"type":"boolean"}},"required":["id"]}},"required":["type","id"]},{"type":"object","properties":{"type":{"type":"string","const":"link"},"id":{"type":"string"},"text":{"default":"Link text","type":"string"},"href":{"default":"#","type":"string"},"align":{"default":"left","type":"string","enum":["left","center","right"]},"color":{"type":"string"},"fontSize":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"fontFamily":{"type":"string"},"underline":{"type":"boolean"},"marginBottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"margin":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"padding":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"customCss":{"type":"string"},"className":{"type":"string"},"componentRef":{"type":"object","properties":{"id":{"type":"string"},"name":{"default":"","type":"string"},"unlocked":{"type":"boolean"}},"required":["id"]}},"required":["type","id"]},{"type":"object","properties":{"type":{"type":"string","const":"spacer"},"id":{"type":"string"},"height":{"type":"integer","minimum":1,"maximum":9007199254740991},"margin":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"customCss":{"type":"string"},"className":{"type":"string"},"componentRef":{"type":"object","properties":{"id":{"type":"string"},"name":{"default":"","type":"string"},"unlocked":{"type":"boolean"}},"required":["id"]}},"required":["type","id"]},{"type":"object","properties":{"type":{"type":"string","const":"markdown"},"id":{"type":"string"},"markdown":{"default":"","type":"string"},"align":{"default":"left","type":"string","enum":["left","center","right"]},"color":{"type":"string"},"fontSize":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"marginBottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"margin":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"padding":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"customCss":{"type":"string"},"className":{"type":"string"},"componentRef":{"type":"object","properties":{"id":{"type":"string"},"name":{"default":"","type":"string"},"unlocked":{"type":"boolean"}},"required":["id"]}},"required":["type","id"]},{"type":"object","properties":{"type":{"type":"string","const":"code"},"id":{"type":"string"},"code":{"default":"","type":"string"},"backgroundColor":{"default":"#f4f4f5","type":"string"},"color":{"default":"#1a1a1a","type":"string"},"marginBottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"margin":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"padding":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"customCss":{"type":"string"},"className":{"type":"string"},"componentRef":{"type":"object","properties":{"id":{"type":"string"},"name":{"default":"","type":"string"},"unlocked":{"type":"boolean"}},"required":["id"]}},"required":["type","id"]},{"type":"object","properties":{"type":{"type":"string","const":"html"},"id":{"type":"string"},"html":{"default":"","type":"string"},"marginBottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"margin":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"padding":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"customCss":{"type":"string"},"className":{"type":"string"},"componentRef":{"type":"object","properties":{"id":{"type":"string"},"name":{"default":"","type":"string"},"unlocked":{"type":"boolean"}},"required":["id"]}},"required":["type","id"]}]},{"$ref":"#/definitions/__schema0"}]}}},"required":["type","id"]}}},"TemplateUpdate":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":120},"subject":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}]},"mode":{"type":"string","enum":["code","visual"]},"status":{"type":"string","enum":["draft","published"]},"design":{"type":"object","properties":{"version":{"default":5,"type":"number","const":5},"previewText":{"default":"","type":"string"},"category":{"default":"transactional","type":"string","enum":["transactional","marketing"]},"openTracking":{"type":"boolean"},"clickTracking":{"type":"boolean"},"tracking":{"type":"boolean"},"from":{"default":"","type":"string"},"theme":{"type":"object","properties":{"fontFamily":{"default":"-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif","type":"string"},"textColor":{"default":"#1a1a1a","type":"string"},"backgroundColor":{"default":"#f4f4f5","type":"string"},"bodyColor":{"default":"#ffffff","type":"string"},"linkColor":{"default":"#2563eb","type":"string"},"contentWidth":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"bodyPadding":{"type":"integer","minimum":0,"maximum":9007199254740991},"bodyPaddingSides":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"bodyRadius":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"variables":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","minLength":1,"pattern":"^[\\w.]+$"},"type":{"default":"string","type":"string","enum":["string","number"]},"source":{"default":"input","type":"string","enum":["input","contact"]},"contactField":{"type":"string"},"style":{"type":"object","properties":{"bold":{"type":"boolean"},"italic":{"type":"boolean"},"underline":{"type":"boolean"},"color":{"type":"string"},"background":{"type":"string"},"fontFamily":{"type":"string"},"fontSize":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"href":{"type":"string"}}}},"required":["name"]}},"className":{"type":"string"},"blocks":{"type":"array","items":{"anyOf":[{"$ref":"#/definitions/__schema0"},{"type":"object","properties":{"type":{"type":"string","const":"row"},"id":{"type":"string"},"backgroundColor":{"type":"string"},"border":{"type":"object","properties":{"width":{"type":"integer","minimum":0,"maximum":9007199254740991},"style":{"type":"string","enum":["solid","dashed","dotted"]},"color":{"type":"string"},"radius":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"paddingX":{"type":"integer","minimum":0,"maximum":9007199254740991},"paddingY":{"type":"integer","minimum":0,"maximum":9007199254740991},"columnGap":{"type":"integer","minimum":0,"maximum":9007199254740991},"stackOnMobile":{"default":true,"type":"boolean"},"margin":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"padding":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"customCss":{"type":"string"},"className":{"type":"string"},"componentRef":{"type":"object","properties":{"id":{"type":"string"},"name":{"default":"","type":"string"},"unlocked":{"type":"boolean"}},"required":["id"]},"columns":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string","const":"column"},"id":{"type":"string"},"width":{"type":"integer","minimum":1,"maximum":100},"backgroundColor":{"type":"string"},"border":{"type":"object","properties":{"width":{"type":"integer","minimum":0,"maximum":9007199254740991},"style":{"type":"string","enum":["solid","dashed","dotted"]},"color":{"type":"string"},"radius":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"paddingX":{"type":"integer","minimum":0,"maximum":9007199254740991},"paddingY":{"type":"integer","minimum":0,"maximum":9007199254740991},"margin":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"padding":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"customCss":{"type":"string"},"className":{"type":"string"},"componentRef":{"type":"object","properties":{"id":{"type":"string"},"name":{"default":"","type":"string"},"unlocked":{"type":"boolean"}},"required":["id"]},"children":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","const":"text"},"id":{"type":"string"},"text":{"default":"","type":"string"},"content":{"type":"array","items":{"type":"object","properties":{"text":{"default":"","type":"string"},"marks":{"type":"object","properties":{"bold":{"type":"boolean"},"italic":{"type":"boolean"},"underline":{"type":"boolean"},"link":{"type":"string"},"color":{"type":"string"},"background":{"type":"string"},"fontFamily":{"type":"string"},"fontSize":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}}},"variable":{"type":"string"}}}},"align":{"default":"left","type":"string","enum":["left","center","right"]},"color":{"type":"string"},"fontSize":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"fontFamily":{"type":"string"},"lineHeight":{"anyOf":[{"type":"number"},{"type":"string"}]},"letterSpacing":{"type":"number"},"fontWeight":{"anyOf":[{"type":"string"},{"type":"number"}]},"marginBottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"margin":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"padding":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"customCss":{"type":"string"},"className":{"type":"string"},"componentRef":{"type":"object","properties":{"id":{"type":"string"},"name":{"default":"","type":"string"},"unlocked":{"type":"boolean"}},"required":["id"]}},"required":["type","id"]},{"type":"object","properties":{"type":{"type":"string","const":"heading"},"id":{"type":"string"},"text":{"default":"","type":"string"},"content":{"type":"array","items":{"type":"object","properties":{"text":{"default":"","type":"string"},"marks":{"type":"object","properties":{"bold":{"type":"boolean"},"italic":{"type":"boolean"},"underline":{"type":"boolean"},"link":{"type":"string"},"color":{"type":"string"},"background":{"type":"string"},"fontFamily":{"type":"string"},"fontSize":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}}},"variable":{"type":"string"}}}},"level":{"anyOf":[{"type":"number","const":1},{"type":"number","const":2},{"type":"number","const":3},{"type":"number","const":4}]},"fontSize":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"align":{"default":"left","type":"string","enum":["left","center","right"]},"color":{"type":"string"},"fontFamily":{"type":"string"},"lineHeight":{"anyOf":[{"type":"number"},{"type":"string"}]},"letterSpacing":{"type":"number"},"fontWeight":{"anyOf":[{"type":"string"},{"type":"number"}]},"marginBottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"margin":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"padding":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"customCss":{"type":"string"},"className":{"type":"string"},"componentRef":{"type":"object","properties":{"id":{"type":"string"},"name":{"default":"","type":"string"},"unlocked":{"type":"boolean"}},"required":["id"]}},"required":["type","id"]},{"type":"object","properties":{"type":{"type":"string","const":"button"},"id":{"type":"string"},"text":{"default":"Click here","type":"string"},"href":{"default":"#","type":"string"},"align":{"default":"left","type":"string","enum":["left","center","right"]},"backgroundColor":{"default":"#18181b","type":"string"},"textColor":{"default":"#ffffff","type":"string"},"borderRadius":{"type":"integer","minimum":0,"maximum":9007199254740991},"innerPaddingX":{"type":"integer","minimum":0,"maximum":9007199254740991},"innerPaddingY":{"type":"integer","minimum":0,"maximum":9007199254740991},"marginBottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"margin":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"padding":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"customCss":{"type":"string"},"className":{"type":"string"},"componentRef":{"type":"object","properties":{"id":{"type":"string"},"name":{"default":"","type":"string"},"unlocked":{"type":"boolean"}},"required":["id"]}},"required":["type","id"]},{"type":"object","properties":{"type":{"type":"string","const":"image"},"id":{"type":"string"},"src":{"default":"","type":"string"},"alt":{"default":"","type":"string"},"href":{"type":"string"},"width":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"height":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"borderRadius":{"type":"integer","minimum":0,"maximum":9007199254740991},"border":{"type":"object","properties":{"width":{"type":"integer","minimum":0,"maximum":9007199254740991},"style":{"type":"string","enum":["solid","dashed","dotted"]},"color":{"type":"string"},"radius":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"objectFit":{"type":"string","enum":["cover","contain","fill"]},"backgroundColor":{"type":"string"},"align":{"default":"center","type":"string","enum":["left","center","right"]},"marginBottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"margin":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"padding":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"customCss":{"type":"string"},"className":{"type":"string"},"componentRef":{"type":"object","properties":{"id":{"type":"string"},"name":{"default":"","type":"string"},"unlocked":{"type":"boolean"}},"required":["id"]}},"required":["type","id"]},{"type":"object","properties":{"type":{"type":"string","const":"divider"},"id":{"type":"string"},"color":{"default":"#e4e4e7","type":"string"},"marginBottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"margin":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"padding":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"customCss":{"type":"string"},"className":{"type":"string"},"componentRef":{"type":"object","properties":{"id":{"type":"string"},"name":{"default":"","type":"string"},"unlocked":{"type":"boolean"}},"required":["id"]}},"required":["type","id"]},{"type":"object","properties":{"type":{"type":"string","const":"link"},"id":{"type":"string"},"text":{"default":"Link text","type":"string"},"href":{"default":"#","type":"string"},"align":{"default":"left","type":"string","enum":["left","center","right"]},"color":{"type":"string"},"fontSize":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"fontFamily":{"type":"string"},"underline":{"type":"boolean"},"marginBottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"margin":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"padding":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"customCss":{"type":"string"},"className":{"type":"string"},"componentRef":{"type":"object","properties":{"id":{"type":"string"},"name":{"default":"","type":"string"},"unlocked":{"type":"boolean"}},"required":["id"]}},"required":["type","id"]},{"type":"object","properties":{"type":{"type":"string","const":"spacer"},"id":{"type":"string"},"height":{"type":"integer","minimum":1,"maximum":9007199254740991},"margin":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"customCss":{"type":"string"},"className":{"type":"string"},"componentRef":{"type":"object","properties":{"id":{"type":"string"},"name":{"default":"","type":"string"},"unlocked":{"type":"boolean"}},"required":["id"]}},"required":["type","id"]},{"type":"object","properties":{"type":{"type":"string","const":"markdown"},"id":{"type":"string"},"markdown":{"default":"","type":"string"},"align":{"default":"left","type":"string","enum":["left","center","right"]},"color":{"type":"string"},"fontSize":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"marginBottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"margin":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"padding":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"customCss":{"type":"string"},"className":{"type":"string"},"componentRef":{"type":"object","properties":{"id":{"type":"string"},"name":{"default":"","type":"string"},"unlocked":{"type":"boolean"}},"required":["id"]}},"required":["type","id"]},{"type":"object","properties":{"type":{"type":"string","const":"code"},"id":{"type":"string"},"code":{"default":"","type":"string"},"backgroundColor":{"default":"#f4f4f5","type":"string"},"color":{"default":"#1a1a1a","type":"string"},"marginBottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"margin":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"padding":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"customCss":{"type":"string"},"className":{"type":"string"},"componentRef":{"type":"object","properties":{"id":{"type":"string"},"name":{"default":"","type":"string"},"unlocked":{"type":"boolean"}},"required":["id"]}},"required":["type","id"]},{"type":"object","properties":{"type":{"type":"string","const":"html"},"id":{"type":"string"},"html":{"default":"","type":"string"},"marginBottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"margin":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"padding":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"customCss":{"type":"string"},"className":{"type":"string"},"componentRef":{"type":"object","properties":{"id":{"type":"string"},"name":{"default":"","type":"string"},"unlocked":{"type":"boolean"}},"required":["id"]}},"required":["type","id"]}]}}},"required":["type","id"]}}},"required":["type","id"]},{"type":"object","properties":{"type":{"type":"string","const":"text"},"id":{"type":"string"},"text":{"default":"","type":"string"},"content":{"type":"array","items":{"type":"object","properties":{"text":{"default":"","type":"string"},"marks":{"type":"object","properties":{"bold":{"type":"boolean"},"italic":{"type":"boolean"},"underline":{"type":"boolean"},"link":{"type":"string"},"color":{"type":"string"},"background":{"type":"string"},"fontFamily":{"type":"string"},"fontSize":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}}},"variable":{"type":"string"}}}},"align":{"default":"left","type":"string","enum":["left","center","right"]},"color":{"type":"string"},"fontSize":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"fontFamily":{"type":"string"},"lineHeight":{"anyOf":[{"type":"number"},{"type":"string"}]},"letterSpacing":{"type":"number"},"fontWeight":{"anyOf":[{"type":"string"},{"type":"number"}]},"marginBottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"margin":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"padding":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"customCss":{"type":"string"},"className":{"type":"string"},"componentRef":{"type":"object","properties":{"id":{"type":"string"},"name":{"default":"","type":"string"},"unlocked":{"type":"boolean"}},"required":["id"]}},"required":["type","id"]},{"type":"object","properties":{"type":{"type":"string","const":"heading"},"id":{"type":"string"},"text":{"default":"","type":"string"},"content":{"type":"array","items":{"type":"object","properties":{"text":{"default":"","type":"string"},"marks":{"type":"object","properties":{"bold":{"type":"boolean"},"italic":{"type":"boolean"},"underline":{"type":"boolean"},"link":{"type":"string"},"color":{"type":"string"},"background":{"type":"string"},"fontFamily":{"type":"string"},"fontSize":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}}},"variable":{"type":"string"}}}},"level":{"anyOf":[{"type":"number","const":1},{"type":"number","const":2},{"type":"number","const":3},{"type":"number","const":4}]},"fontSize":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"align":{"default":"left","type":"string","enum":["left","center","right"]},"color":{"type":"string"},"fontFamily":{"type":"string"},"lineHeight":{"anyOf":[{"type":"number"},{"type":"string"}]},"letterSpacing":{"type":"number"},"fontWeight":{"anyOf":[{"type":"string"},{"type":"number"}]},"marginBottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"margin":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"padding":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"customCss":{"type":"string"},"className":{"type":"string"},"componentRef":{"type":"object","properties":{"id":{"type":"string"},"name":{"default":"","type":"string"},"unlocked":{"type":"boolean"}},"required":["id"]}},"required":["type","id"]},{"type":"object","properties":{"type":{"type":"string","const":"button"},"id":{"type":"string"},"text":{"default":"Click here","type":"string"},"href":{"default":"#","type":"string"},"align":{"default":"left","type":"string","enum":["left","center","right"]},"backgroundColor":{"default":"#18181b","type":"string"},"textColor":{"default":"#ffffff","type":"string"},"borderRadius":{"type":"integer","minimum":0,"maximum":9007199254740991},"innerPaddingX":{"type":"integer","minimum":0,"maximum":9007199254740991},"innerPaddingY":{"type":"integer","minimum":0,"maximum":9007199254740991},"marginBottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"margin":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"padding":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"customCss":{"type":"string"},"className":{"type":"string"},"componentRef":{"type":"object","properties":{"id":{"type":"string"},"name":{"default":"","type":"string"},"unlocked":{"type":"boolean"}},"required":["id"]}},"required":["type","id"]},{"type":"object","properties":{"type":{"type":"string","const":"image"},"id":{"type":"string"},"src":{"default":"","type":"string"},"alt":{"default":"","type":"string"},"href":{"type":"string"},"width":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"height":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"borderRadius":{"type":"integer","minimum":0,"maximum":9007199254740991},"border":{"type":"object","properties":{"width":{"type":"integer","minimum":0,"maximum":9007199254740991},"style":{"type":"string","enum":["solid","dashed","dotted"]},"color":{"type":"string"},"radius":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"objectFit":{"type":"string","enum":["cover","contain","fill"]},"backgroundColor":{"type":"string"},"align":{"default":"center","type":"string","enum":["left","center","right"]},"marginBottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"margin":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"padding":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"customCss":{"type":"string"},"className":{"type":"string"},"componentRef":{"type":"object","properties":{"id":{"type":"string"},"name":{"default":"","type":"string"},"unlocked":{"type":"boolean"}},"required":["id"]}},"required":["type","id"]},{"type":"object","properties":{"type":{"type":"string","const":"divider"},"id":{"type":"string"},"color":{"default":"#e4e4e7","type":"string"},"marginBottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"margin":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"padding":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"customCss":{"type":"string"},"className":{"type":"string"},"componentRef":{"type":"object","properties":{"id":{"type":"string"},"name":{"default":"","type":"string"},"unlocked":{"type":"boolean"}},"required":["id"]}},"required":["type","id"]},{"type":"object","properties":{"type":{"type":"string","const":"link"},"id":{"type":"string"},"text":{"default":"Link text","type":"string"},"href":{"default":"#","type":"string"},"align":{"default":"left","type":"string","enum":["left","center","right"]},"color":{"type":"string"},"fontSize":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"fontFamily":{"type":"string"},"underline":{"type":"boolean"},"marginBottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"margin":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"padding":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"customCss":{"type":"string"},"className":{"type":"string"},"componentRef":{"type":"object","properties":{"id":{"type":"string"},"name":{"default":"","type":"string"},"unlocked":{"type":"boolean"}},"required":["id"]}},"required":["type","id"]},{"type":"object","properties":{"type":{"type":"string","const":"spacer"},"id":{"type":"string"},"height":{"type":"integer","minimum":1,"maximum":9007199254740991},"margin":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"customCss":{"type":"string"},"className":{"type":"string"},"componentRef":{"type":"object","properties":{"id":{"type":"string"},"name":{"default":"","type":"string"},"unlocked":{"type":"boolean"}},"required":["id"]}},"required":["type","id"]},{"type":"object","properties":{"type":{"type":"string","const":"markdown"},"id":{"type":"string"},"markdown":{"default":"","type":"string"},"align":{"default":"left","type":"string","enum":["left","center","right"]},"color":{"type":"string"},"fontSize":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"marginBottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"margin":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"padding":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"customCss":{"type":"string"},"className":{"type":"string"},"componentRef":{"type":"object","properties":{"id":{"type":"string"},"name":{"default":"","type":"string"},"unlocked":{"type":"boolean"}},"required":["id"]}},"required":["type","id"]},{"type":"object","properties":{"type":{"type":"string","const":"code"},"id":{"type":"string"},"code":{"default":"","type":"string"},"backgroundColor":{"default":"#f4f4f5","type":"string"},"color":{"default":"#1a1a1a","type":"string"},"marginBottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"margin":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"padding":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"customCss":{"type":"string"},"className":{"type":"string"},"componentRef":{"type":"object","properties":{"id":{"type":"string"},"name":{"default":"","type":"string"},"unlocked":{"type":"boolean"}},"required":["id"]}},"required":["type","id"]},{"type":"object","properties":{"type":{"type":"string","const":"html"},"id":{"type":"string"},"html":{"default":"","type":"string"},"marginBottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"margin":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"padding":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"customCss":{"type":"string"},"className":{"type":"string"},"componentRef":{"type":"object","properties":{"id":{"type":"string"},"name":{"default":"","type":"string"},"unlocked":{"type":"boolean"}},"required":["id"]}},"required":["type","id"]}]}}}}},"definitions":{"__schema0":{"type":"object","properties":{"type":{"type":"string","const":"section"},"id":{"type":"string"},"backgroundColor":{"type":"string"},"border":{"type":"object","properties":{"width":{"type":"integer","minimum":0,"maximum":9007199254740991},"style":{"type":"string","enum":["solid","dashed","dotted"]},"color":{"type":"string"},"radius":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"paddingX":{"type":"integer","minimum":0,"maximum":9007199254740991},"paddingY":{"type":"integer","minimum":0,"maximum":9007199254740991},"margin":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"padding":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"customCss":{"type":"string"},"className":{"type":"string"},"children":{"type":"array","items":{"anyOf":[{"oneOf":[{"type":"object","properties":{"type":{"type":"string","const":"text"},"id":{"type":"string"},"text":{"default":"","type":"string"},"content":{"type":"array","items":{"type":"object","properties":{"text":{"default":"","type":"string"},"marks":{"type":"object","properties":{"bold":{"type":"boolean"},"italic":{"type":"boolean"},"underline":{"type":"boolean"},"link":{"type":"string"},"color":{"type":"string"},"background":{"type":"string"},"fontFamily":{"type":"string"},"fontSize":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}}},"variable":{"type":"string"}}}},"align":{"default":"left","type":"string","enum":["left","center","right"]},"color":{"type":"string"},"fontSize":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"fontFamily":{"type":"string"},"lineHeight":{"anyOf":[{"type":"number"},{"type":"string"}]},"letterSpacing":{"type":"number"},"fontWeight":{"anyOf":[{"type":"string"},{"type":"number"}]},"marginBottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"margin":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"padding":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"customCss":{"type":"string"},"className":{"type":"string"},"componentRef":{"type":"object","properties":{"id":{"type":"string"},"name":{"default":"","type":"string"},"unlocked":{"type":"boolean"}},"required":["id"]}},"required":["type","id"]},{"type":"object","properties":{"type":{"type":"string","const":"heading"},"id":{"type":"string"},"text":{"default":"","type":"string"},"content":{"type":"array","items":{"type":"object","properties":{"text":{"default":"","type":"string"},"marks":{"type":"object","properties":{"bold":{"type":"boolean"},"italic":{"type":"boolean"},"underline":{"type":"boolean"},"link":{"type":"string"},"color":{"type":"string"},"background":{"type":"string"},"fontFamily":{"type":"string"},"fontSize":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}}},"variable":{"type":"string"}}}},"level":{"anyOf":[{"type":"number","const":1},{"type":"number","const":2},{"type":"number","const":3},{"type":"number","const":4}]},"fontSize":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"align":{"default":"left","type":"string","enum":["left","center","right"]},"color":{"type":"string"},"fontFamily":{"type":"string"},"lineHeight":{"anyOf":[{"type":"number"},{"type":"string"}]},"letterSpacing":{"type":"number"},"fontWeight":{"anyOf":[{"type":"string"},{"type":"number"}]},"marginBottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"margin":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"padding":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"customCss":{"type":"string"},"className":{"type":"string"},"componentRef":{"type":"object","properties":{"id":{"type":"string"},"name":{"default":"","type":"string"},"unlocked":{"type":"boolean"}},"required":["id"]}},"required":["type","id"]},{"type":"object","properties":{"type":{"type":"string","const":"button"},"id":{"type":"string"},"text":{"default":"Click here","type":"string"},"href":{"default":"#","type":"string"},"align":{"default":"left","type":"string","enum":["left","center","right"]},"backgroundColor":{"default":"#18181b","type":"string"},"textColor":{"default":"#ffffff","type":"string"},"borderRadius":{"type":"integer","minimum":0,"maximum":9007199254740991},"innerPaddingX":{"type":"integer","minimum":0,"maximum":9007199254740991},"innerPaddingY":{"type":"integer","minimum":0,"maximum":9007199254740991},"marginBottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"margin":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"padding":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"customCss":{"type":"string"},"className":{"type":"string"},"componentRef":{"type":"object","properties":{"id":{"type":"string"},"name":{"default":"","type":"string"},"unlocked":{"type":"boolean"}},"required":["id"]}},"required":["type","id"]},{"type":"object","properties":{"type":{"type":"string","const":"image"},"id":{"type":"string"},"src":{"default":"","type":"string"},"alt":{"default":"","type":"string"},"href":{"type":"string"},"width":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"height":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"borderRadius":{"type":"integer","minimum":0,"maximum":9007199254740991},"border":{"type":"object","properties":{"width":{"type":"integer","minimum":0,"maximum":9007199254740991},"style":{"type":"string","enum":["solid","dashed","dotted"]},"color":{"type":"string"},"radius":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"objectFit":{"type":"string","enum":["cover","contain","fill"]},"backgroundColor":{"type":"string"},"align":{"default":"center","type":"string","enum":["left","center","right"]},"marginBottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"margin":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"padding":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"customCss":{"type":"string"},"className":{"type":"string"},"componentRef":{"type":"object","properties":{"id":{"type":"string"},"name":{"default":"","type":"string"},"unlocked":{"type":"boolean"}},"required":["id"]}},"required":["type","id"]},{"type":"object","properties":{"type":{"type":"string","const":"divider"},"id":{"type":"string"},"color":{"default":"#e4e4e7","type":"string"},"marginBottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"margin":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"padding":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"customCss":{"type":"string"},"className":{"type":"string"},"componentRef":{"type":"object","properties":{"id":{"type":"string"},"name":{"default":"","type":"string"},"unlocked":{"type":"boolean"}},"required":["id"]}},"required":["type","id"]},{"type":"object","properties":{"type":{"type":"string","const":"link"},"id":{"type":"string"},"text":{"default":"Link text","type":"string"},"href":{"default":"#","type":"string"},"align":{"default":"left","type":"string","enum":["left","center","right"]},"color":{"type":"string"},"fontSize":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"fontFamily":{"type":"string"},"underline":{"type":"boolean"},"marginBottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"margin":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"padding":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"customCss":{"type":"string"},"className":{"type":"string"},"componentRef":{"type":"object","properties":{"id":{"type":"string"},"name":{"default":"","type":"string"},"unlocked":{"type":"boolean"}},"required":["id"]}},"required":["type","id"]},{"type":"object","properties":{"type":{"type":"string","const":"spacer"},"id":{"type":"string"},"height":{"type":"integer","minimum":1,"maximum":9007199254740991},"margin":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"customCss":{"type":"string"},"className":{"type":"string"},"componentRef":{"type":"object","properties":{"id":{"type":"string"},"name":{"default":"","type":"string"},"unlocked":{"type":"boolean"}},"required":["id"]}},"required":["type","id"]},{"type":"object","properties":{"type":{"type":"string","const":"markdown"},"id":{"type":"string"},"markdown":{"default":"","type":"string"},"align":{"default":"left","type":"string","enum":["left","center","right"]},"color":{"type":"string"},"fontSize":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"marginBottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"margin":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"padding":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"customCss":{"type":"string"},"className":{"type":"string"},"componentRef":{"type":"object","properties":{"id":{"type":"string"},"name":{"default":"","type":"string"},"unlocked":{"type":"boolean"}},"required":["id"]}},"required":["type","id"]},{"type":"object","properties":{"type":{"type":"string","const":"code"},"id":{"type":"string"},"code":{"default":"","type":"string"},"backgroundColor":{"default":"#f4f4f5","type":"string"},"color":{"default":"#1a1a1a","type":"string"},"marginBottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"margin":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"padding":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"customCss":{"type":"string"},"className":{"type":"string"},"componentRef":{"type":"object","properties":{"id":{"type":"string"},"name":{"default":"","type":"string"},"unlocked":{"type":"boolean"}},"required":["id"]}},"required":["type","id"]},{"type":"object","properties":{"type":{"type":"string","const":"html"},"id":{"type":"string"},"html":{"default":"","type":"string"},"marginBottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"margin":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"padding":{"type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991}}},"customCss":{"type":"string"},"className":{"type":"string"},"componentRef":{"type":"object","properties":{"id":{"type":"string"},"name":{"default":"","type":"string"},"unlocked":{"type":"boolean"}},"required":["id"]}},"required":["type","id"]}]},{"$ref":"#/definitions/__schema0"}]}}},"required":["type","id"]}}},"BrandKit":{"type":"object","properties":{"object":{"type":"string","const":"brand_kit"},"id":{"type":"string"},"name":{"type":"string"},"is_default":{"type":"boolean"},"website_url":{"anyOf":[{"type":"string"},{"type":"null"}]},"description":{"anyOf":[{"type":"string"},{"type":"null"}]},"tone":{"anyOf":[{"type":"string","enum":["NEUTRAL","FORMAL","FRIENDLY","PLAYFUL"]},{"type":"null"}]},"voice_notes":{"anyOf":[{"type":"string"},{"type":"null"}]},"industry":{"anyOf":[{"type":"string"},{"type":"null"}]},"core_pages":{"type":"array","items":{"type":"object","properties":{"url":{"type":"string"},"title":{"type":"string"}},"required":["url"]}},"extracted":{"type":"object","properties":{"colors":{"type":"array","items":{"type":"object","properties":{"hex":{"type":"string"},"label":{"type":"string"}},"required":["hex"]}},"logo_urls":{"type":"array","items":{"type":"string"}},"background_urls":{"type":"array","items":{"type":"string"}},"fonts":{"type":"array","items":{"type":"string"}}}},"graphics":{"type":"array","items":{"type":"object","properties":{"library_image_id":{"type":"string"},"role":{"type":"string","enum":["logo","logo_light","logo_dark","mark","background","other"]},"label":{"type":"string"}},"required":["library_image_id","role"]}},"source":{"anyOf":[{"type":"string"},{"type":"null"}]},"updated_at":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["object","id","name","is_default","website_url","description","tone","voice_notes","industry","core_pages","extracted","graphics","source","updated_at"]},"BrandKitList":{"type":"object","properties":{"object":{"type":"string","const":"list"},"data":{"type":"array","items":{"type":"object","properties":{"object":{"type":"string","const":"brand_kit"},"id":{"type":"string"},"name":{"type":"string"},"is_default":{"type":"boolean"},"website_url":{"anyOf":[{"type":"string"},{"type":"null"}]},"description":{"anyOf":[{"type":"string"},{"type":"null"}]},"tone":{"anyOf":[{"type":"string","enum":["NEUTRAL","FORMAL","FRIENDLY","PLAYFUL"]},{"type":"null"}]},"voice_notes":{"anyOf":[{"type":"string"},{"type":"null"}]},"industry":{"anyOf":[{"type":"string"},{"type":"null"}]},"core_pages":{"type":"array","items":{"type":"object","properties":{"url":{"type":"string"},"title":{"type":"string"}},"required":["url"]}},"extracted":{"type":"object","properties":{"colors":{"type":"array","items":{"type":"object","properties":{"hex":{"type":"string"},"label":{"type":"string"}},"required":["hex"]}},"logo_urls":{"type":"array","items":{"type":"string"}},"background_urls":{"type":"array","items":{"type":"string"}},"fonts":{"type":"array","items":{"type":"string"}}}},"graphics":{"type":"array","items":{"type":"object","properties":{"library_image_id":{"type":"string"},"role":{"type":"string","enum":["logo","logo_light","logo_dark","mark","background","other"]},"label":{"type":"string"}},"required":["library_image_id","role"]}},"source":{"anyOf":[{"type":"string"},{"type":"null"}]},"updated_at":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["object","id","name","is_default","website_url","description","tone","voice_notes","industry","core_pages","extracted","graphics","source","updated_at"]}},"default_id":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["object","data","default_id"]},"Domain":{"type":"object","properties":{"object":{"type":"string","const":"domain"},"id":{"type":"string"},"name":{"type":"string"},"status":{"type":"string","enum":["pending","verifying","verified","degraded","failed"]},"records":{"anyOf":[{"type":"array","items":{"type":"object","properties":{"type":{"type":"string"},"name":{"type":"string"},"value":{"type":"string"},"priority":{"type":"number"}},"required":["type","name","value"]}},{"type":"null"}]},"dkim_selector":{"anyOf":[{"type":"string"},{"type":"null"}]},"open_tracking":{"anyOf":[{"type":"boolean"},{"type":"null"}]},"click_tracking":{"anyOf":[{"type":"boolean"},{"type":"null"}]},"tls":{"type":"string","enum":["opportunistic","enforced"]},"tracking_subdomain":{"anyOf":[{"type":"string"},{"type":"null"}]},"tracking_verified_at":{"anyOf":[{"type":"string"},{"type":"null"}]},"verified_at":{"anyOf":[{"type":"string"},{"type":"null"}]},"created_at":{"type":"string"},"updated_at":{"type":"string"}},"required":["object","id","name","status","records","dkim_selector","open_tracking","click_tracking","tls","tracking_subdomain","tracking_verified_at","verified_at","created_at","updated_at"]},"DomainCreate":{"type":"object","properties":{"name":{"type":"string"}},"required":["name"]},"DomainUpdate":{"type":"object","properties":{"open_tracking":{"anyOf":[{"type":"boolean"},{"type":"null"}]},"click_tracking":{"anyOf":[{"type":"boolean"},{"type":"null"}]},"tls":{"type":"string","enum":["opportunistic","enforced"]},"tracking_subdomain":{"anyOf":[{"type":"string","maxLength":63,"pattern":"^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$"},{"type":"null"}]}}},"Webhook":{"type":"object","properties":{"object":{"type":"string","const":"webhook"},"id":{"type":"string"},"name":{"type":"string"},"url":{"type":"string"},"events":{"type":"array","items":{"type":"string"}},"status":{"type":"string","enum":["enabled","disabled","suspended"]},"created_at":{"type":"string"},"updated_at":{"type":"string"}},"required":["object","id","name","url","events","status","created_at","updated_at"]},"WebhookCreate":{"type":"object","properties":{"url":{"type":"string"},"events":{"minItems":1,"type":"array","items":{"type":"string"}},"name":{"type":"string","minLength":1,"maxLength":120}},"required":["url","events"]},"WebhookUpdate":{"type":"object","properties":{"url":{"type":"string"},"events":{"minItems":1,"type":"array","items":{"type":"string"}},"name":{"type":"string","minLength":1,"maxLength":120},"status":{"type":"string","enum":["enabled","disabled"]}}},"WebhookCreated":{"allOf":[{"$ref":"#/components/schemas/Webhook"},{"type":"object","properties":{"signing_secret":{"type":"string","description":"The HMAC signing secret. Shown exactly once — store it now; it can never be retrieved again. Use it to verify the signature on every delivery to this endpoint."}},"required":["signing_secret"]}]},"WebhookTestResult":{"type":"object","properties":{"object":{"type":"string","enum":["webhook_test"]},"delivered":{"type":"boolean","description":"Whether the endpoint accepted the probe (2xx)."},"response_status":{"type":["integer","null"],"description":"The HTTP status the endpoint returned, or null on a transport error."},"event_type":{"type":"string","description":"The sample event type that was sent."},"error":{"type":["string","null"],"description":"A transport/error message when delivery failed, else null."}},"required":["object","delivered","response_status","event_type","error"]},"ReceivedEmail":{"type":"object","properties":{"object":{"type":"string","const":"received_email"},"id":{"type":"string"},"from":{"type":"string"},"from_name":{"anyOf":[{"type":"string"},{"type":"null"}]},"to":{"type":"array","items":{"type":"string"}},"cc":{"type":"array","items":{"type":"string"}},"bcc":{"type":"array","items":{"type":"string"}},"message_id":{"anyOf":[{"type":"string"},{"type":"null"}]},"subject":{"anyOf":[{"type":"string"},{"type":"null"}]},"text":{"anyOf":[{"type":"string"},{"type":"null"}]},"html":{"anyOf":[{"type":"string"},{"type":"null"}]},"spam_verdict":{"anyOf":[{"type":"string"},{"type":"null"}]},"virus_verdict":{"anyOf":[{"type":"string"},{"type":"null"}]},"spf_verdict":{"anyOf":[{"type":"string"},{"type":"null"}]},"dkim_verdict":{"anyOf":[{"type":"string"},{"type":"null"}]},"dmarc_verdict":{"anyOf":[{"type":"string"},{"type":"null"}]},"size":{"type":"number"},"attachments":{"type":"array","items":{"type":"object","properties":{"object":{"type":"string","const":"received_attachment"},"id":{"type":"string"},"filename":{"anyOf":[{"type":"string"},{"type":"null"}]},"content_type":{"anyOf":[{"type":"string"},{"type":"null"}]},"content_disposition":{"anyOf":[{"type":"string"},{"type":"null"}]},"content_id":{"anyOf":[{"type":"string"},{"type":"null"}]},"size":{"type":"number"}},"required":["object","id","filename","content_type","content_disposition","content_id","size"]}},"received_at":{"type":"string"},"created_at":{"type":"string"}},"required":["object","id","from","from_name","to","cc","bcc","message_id","subject","text","html","spam_verdict","virus_verdict","spf_verdict","dkim_verdict","dmarc_verdict","size","attachments","received_at","created_at"]},"ReceivedEmailSummary":{"type":"object","properties":{"object":{"type":"string","const":"received_email"},"id":{"type":"string"},"from":{"type":"string"},"from_name":{"anyOf":[{"type":"string"},{"type":"null"}]},"to":{"type":"array","items":{"type":"string"}},"cc":{"type":"array","items":{"type":"string"}},"bcc":{"type":"array","items":{"type":"string"}},"message_id":{"anyOf":[{"type":"string"},{"type":"null"}]},"subject":{"anyOf":[{"type":"string"},{"type":"null"}]},"spam_verdict":{"anyOf":[{"type":"string"},{"type":"null"}]},"virus_verdict":{"anyOf":[{"type":"string"},{"type":"null"}]},"spf_verdict":{"anyOf":[{"type":"string"},{"type":"null"}]},"dkim_verdict":{"anyOf":[{"type":"string"},{"type":"null"}]},"dmarc_verdict":{"anyOf":[{"type":"string"},{"type":"null"}]},"size":{"type":"number"},"received_at":{"type":"string"},"created_at":{"type":"string"},"attachment_count":{"type":"number"}},"required":["object","id","from","from_name","to","cc","bcc","message_id","subject","spam_verdict","virus_verdict","spf_verdict","dkim_verdict","dmarc_verdict","size","received_at","created_at","attachment_count"]},"ReceivedAttachmentUrl":{"type":"object","properties":{"object":{"type":"string","enum":["received_attachment_url"]},"url":{"type":"string","description":"A signed, expiring URL to download the attachment bytes."},"expires_at":{"type":"string","description":"ISO 8601 expiry of the signed URL (~5 minutes out)."}},"required":["object","url","expires_at"]},"ApiKey":{"type":"object","properties":{"object":{"type":"string","const":"api_key"},"id":{"type":"string"},"name":{"type":"string"},"prefix":{"type":"string"},"scope":{"type":"string","enum":["full","sending","read_only"]},"capabilities":{"type":"array","items":{"type":"string"}},"last_used_at":{"anyOf":[{"type":"string"},{"type":"null"}]},"revoked_at":{"anyOf":[{"type":"string"},{"type":"null"}]},"created_at":{"type":"string"}},"required":["object","id","name","prefix","scope","capabilities","last_used_at","revoked_at","created_at"]},"ApiKeyCreate":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":120},"scope":{"default":"full","type":"string","enum":["full","sending","read_only"]},"capabilities":{"type":"array","items":{"type":"string","enum":["contacts:read","contacts:write","suppressions:read","suppressions:write","segments:read","segments:write","topics:read","topics:write","templates:read","templates:write","components:read","components:write","campaigns:read","campaigns:write","campaigns:send","domains:read","domains:write","emails:read","emails:send","apikeys:read","apikeys:manage","webhooks:read","webhooks:manage","team:read","team:invite","team:manage_members","workspace:update","workspace:delete","billing:manage"]}}},"required":["name"]},"ApiKeyCreated":{"allOf":[{"$ref":"#/components/schemas/ApiKey"},{"type":"object","properties":{"key":{"type":"string","description":"The plaintext secret. Shown exactly once — store it now; it can never be retrieved again."}},"required":["key"]}]},"Suppression":{"type":"object","properties":{"object":{"type":"string","const":"suppression"},"id":{"type":"string"},"email":{"type":"string"},"scope":{"type":"string","enum":["workspace","platform"]},"reason":{"type":"string","enum":["bounce","complaint","unsubscribe","manual","import","api"]},"detail":{"anyOf":[{"type":"string"},{"type":"null"}]},"note":{"anyOf":[{"type":"string"},{"type":"null"}]},"created_at":{"type":"string"},"updated_at":{"type":"string"}},"required":["object","id","email","scope","reason","detail","note","created_at","updated_at"]},"SuppressionCreate":{"type":"object","properties":{"email":{"type":"string"},"emails":{"maxItems":1000,"type":"array","items":{"type":"string"}},"reason":{"type":"string","enum":["manual","import","api"]},"note":{"type":"string","maxLength":500}}},"SuppressionBulkResult":{"type":"object","properties":{"object":{"type":"string","enum":["list"]},"added":{"type":"integer","description":"Addresses newly suppressed."},"skipped":{"type":"integer","description":"Addresses already suppressed (no-op)."},"total":{"type":"integer","description":"Deduplicated input count."}},"required":["object","added","skipped","total"]},"Usage":{"type":"object","properties":{"object":{"type":"string","const":"usage"},"plan":{"type":"string"},"period_start":{"type":"string"},"period_end":{"type":"string"},"emails":{"type":"object","properties":{"sent":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"included":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"daily_cap":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"sent_today":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["sent","included","daily_cap","sent_today"]},"wallet":{"anyOf":[{"type":"object","properties":{"allowance_cents":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"used_cents":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"carryover_cents":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"purchased_credit_cents":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"overage_cents":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"overage_cap_cents":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"email_rate_per_1k_cents":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]}},"required":["allowance_cents","used_cents","carryover_cents","purchased_credit_cents","overage_cents","overage_cap_cents","email_rate_per_1k_cents"]},{"type":"null"}]}},"required":["object","plan","period_start","period_end","emails","wallet"]}}}}