{"openapi":"3.1.0","info":{"title":"Djinnletter API","version":"0.20.0","description":"Delivery infrastructure for newsletters authored by external agents. Agents: read https://app.djinnletter.com/skill.md first. It lists everything a key can do (audience and CRM sync, issues, merge tags, sequences and events, webhooks in and out, data exports, templates, domains and billing) with the rules this reference does not explain. First-time setup: https://app.djinnletter.com/setup.md. The golden path is: create a draft newsletter with a subject, preview text, body and template, approve the newsletter, then send it immediately or set scheduled_for for the delivery tick. Recipients are send_to_all (every active subscriber) or tag_ids; generation_config.targetTagIds is still read as tag_ids. Bearer keys use workspace:read for delivery reads, workspace:write for delivery mutations, and keys:read or keys:write for API-key management. Each supported agent operation declares x-required-scopes.","contact":{"name":"Djinnletter Support","email":"support@djinnletter.com"},"license":{"name":"Proprietary"}},"externalDocs":{"description":"Agent operating manual: every capability, with workflows and rules","url":"https://app.djinnletter.com/skill.md"},"servers":[{"url":"/api/v1","description":"Current origin"},{"url":"http://localhost:8787/api/v1","description":"Local dev"}],"tags":[{"name":"workspaces","description":"Publication workspaces and members"},{"name":"api-keys","description":"Agent API-key management"},{"name":"subscribers","description":"Newsletter audience"},{"name":"tags","description":"Subscriber segmentation"},{"name":"newsletters","description":"Draft, approval, scheduling, and delivery"},{"name":"sequences","description":"Emails people receive after an event: a signup, being added, or a custom event"},{"name":"events","description":"What starts a sequence: signup_confirmed, subscriber_added or a custom event fired from your server or an inbound URL"},{"name":"templates","description":"System and immutable custom email templates"},{"name":"assets","description":"Workspace image assets and active logo"},{"name":"signup-forms","description":"Embeddable subscriber acquisition form"},{"name":"metrics","description":"Delivery and engagement metrics"},{"name":"data","description":"Raw datasets and ready-made aggregates for analysis"},{"name":"alerts","description":"System and delivery alerts"},{"name":"webhooks","description":"Outgoing event notifications"},{"name":"domains","description":"Sender-domain verification"},{"name":"feedback","description":"Bugs and ideas for the Djinnletter team"},{"name":"admin","description":"Read-only platform operator views for explicitly provisioned human sessions"},{"name":"billing","description":"Prepaid email credits, which never expire, and embedded payment settings"},{"name":"health","description":"Database and email readiness"}],"components":{"securitySchemes":{"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"sk_live_*"},"SessionCookie":{"type":"apiKey","in":"cookie","name":"better-auth.session_token"}},"schemas":{"OpenApiDocument":{"type":"object","additionalProperties":true},"SuccessResponse":{"type":"object","required":["success"],"properties":{"success":{"type":"boolean","enum":[true]}},"additionalProperties":false},"Workspace":{"type":"object","required":["id","name","slug","from_email","from_name"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"slug":{"type":"string"},"description":{"type":["string","null"]},"primary_color":{"type":["string","null"]},"logo_url":{"type":["string","null"]},"from_email":{"type":"string"},"from_name":{"type":"string"},"created_at":{"type":"string","format":"date-time"}},"additionalProperties":false},"Member":{"type":"object","required":["id","workspace_id","user_id","role","created_at"],"properties":{"id":{"type":"string"},"workspace_id":{"type":"string"},"user_id":{"type":"string"},"role":{"type":"string","enum":["owner","admin","editor","viewer"]},"email":{"type":"string"},"name":{"type":["string","null"]},"created_at":{"type":"string","format":"date-time"}},"additionalProperties":false},"ApiKey":{"type":"object","required":["id","workspaceId","name","prefix","scopes","lastUsedAt","expiresAt","revokedAt","createdAt"],"properties":{"id":{"type":"string"},"workspaceId":{"type":"string"},"name":{"type":"string"},"prefix":{"type":"string"},"scopes":{"type":"array","items":{"type":"string","enum":["workspace:read","workspace:write","keys:read","keys:write"]}},"secret":{"type":"string"},"lastUsedAt":{"type":["string","null"],"format":"date-time"},"expiresAt":{"type":["string","null"],"format":"date-time"},"revokedAt":{"type":["string","null"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"}},"additionalProperties":false},"Tag":{"type":"object","required":["id","name"],"properties":{"id":{"type":"string"},"workspace_id":{"type":"string"},"name":{"type":"string"},"description":{"type":["string","null"]},"created_at":{"type":"string","format":"date-time"},"active_subscribers":{"type":"integer","description":"List only. Active subscribers with this tag."}},"additionalProperties":false},"Subscriber":{"type":"object","required":["id","workspace_id","email","language","status"],"properties":{"id":{"type":"string"},"workspace_id":{"type":"string"},"email":{"type":"string","format":"email"},"language":{"type":"string","enum":["es","en"]},"status":{"type":"string","enum":["active","unsubscribed","bounced"]},"subscribed_at":{"type":"string","format":"date-time"},"unsubscribed_at":{"type":["string","null"],"format":"date-time"},"last_open_at":{"type":["string","null"],"format":"date-time"},"last_click_at":{"type":["string","null"],"format":"date-time"},"engagement_score":{"type":"number"},"name":{"type":["string","null"],"description":"Read by the {{name}} merge tag."},"fields":{"type":"object","description":"Contact fields: an object of lowercase snake_case keys (^[a-z][a-z0-9_]{0,39}$, at most 50) whose values are text up to 500 characters, numbers or booleans. Reserved keys: email, name, status, event, id, subscriber_id, workspace_id, language, tags, fields, source, subscribed_at, unsubscribed_at, created_at, updated_at, unsubscribe_url.","additionalProperties":{"type":["string","number","boolean"]}},"source":{"type":["string","null"],"enum":["signup_form","import","api","dashboard","event",null],"description":"How the person was added; null for people added before this was recorded."},"tags":{"type":"array","items":{"$ref":"#/components/schemas/Tag"}},"emails_received":{"type":"integer","description":"List only. Newsletter and sequence emails that reached this person (delivered, opened or clicked)."},"measured_emails":{"type":"integer","description":"List only. Received emails sent with open and click tracking on."},"opened_emails":{"type":"integer","description":"List only. Measured emails this person opened (estimated: some mail apps open every email)."},"clicked_emails":{"type":"integer","description":"List only. Measured emails in which this person clicked a link."},"sequences":{"type":"array","items":{"type":"object","required":["id","name","emails_sent","emails_total"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"status":{"type":"string","description":"GET /subscribers/{id} only: active, completed or stopped."},"enrolled_at":{"type":"string","description":"GET /subscribers/{id} only."},"emails_sent":{"type":"integer"},"emails_total":{"type":"integer"}},"additionalProperties":false}},"open_rate":{"type":["number","null"],"description":"List only. opened_emails / measured_emails, from 0 to 1. Null when nothing measured reached this person: show \"Tracking off\" if emails_received > 0, otherwise no value."}},"additionalProperties":false},"Newsletter":{"type":"object","required":["id","workspace_id","language","status"],"properties":{"id":{"type":"string"},"workspace_id":{"type":"string"},"language":{"type":"string","enum":["es","en"]},"status":{"type":"string","enum":["draft","ready","sent"]},"subject":{"type":["string","null"]},"preview_text":{"type":["string","null"]},"body":{"type":"string","maxLength":50000,"description":"Plain text. Blank lines separate paragraphs; a line starting with ## is a heading, - starts a bullet, a line that is only ![alt](https://...) is an image, and bare URLs and [label](https://...) links become links. Everything else is shown as written."},"template_id":{"type":"string"},"html_content":{"type":["string","null"]},"plain_content":{"type":["string","null"]},"scheduled_for":{"type":["string","null"],"format":"date-time"},"generation_config":{"type":["object","string","null"],"deprecated":true},"send_to_all":{"type":"boolean","description":"Goes to every active subscriber."},"tag_ids":{"type":"array","items":{"type":"string"},"description":"Goes to the active subscribers in any of these tags; someone in several gets one copy."},"target_tags":{"type":["string","null"],"deprecated":true,"description":"Stored form of tag_ids."},"version":{"type":"integer"},"generated_at":{"type":["string","null"],"format":"date-time"},"approved_at":{"type":["string","null"],"format":"date-time"},"sent_at":{"type":["string","null"],"format":"date-time"},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":["string","null"],"format":"date-time"},"workspace_name":{"type":"string"},"workspace_slug":{"type":"string"},"total_sent":{"type":"integer"},"opens":{"type":"integer"},"clicks":{"type":"integer"}},"additionalProperties":false},"EmailTemplateSummary":{"type":"object","required":["id","family_id","version","name","description","status","type"],"properties":{"id":{"type":"string"},"family_id":{"type":"string"},"version":{"type":"integer"},"name":{"type":"string"},"description":{"type":["string","null"]},"status":{"type":"string","enum":["system","active","archived"]},"type":{"type":"string","enum":["system","custom"]},"hidden":{"type":"boolean","description":"Only with include_hidden=true: a starter this workspace removed from its gallery"}},"additionalProperties":false},"EmailTemplateDetail":{"type":"object","required":["id","family_id","version","name","description","status","type","html","css"],"properties":{"id":{"type":"string"},"family_id":{"type":"string"},"version":{"type":"integer"},"name":{"type":"string"},"description":{"type":["string","null"]},"status":{"type":"string","enum":["system","active","archived"]},"type":{"type":"string","enum":["system","custom"]},"html":{"type":"string"},"css":{"type":"string"}},"additionalProperties":false},"BrandAsset":{"type":"object","required":["id","workspace_id","name","mime_type","size_bytes","created_at","url"],"properties":{"id":{"type":"string"},"workspace_id":{"type":"string"},"name":{"type":"string"},"mime_type":{"type":"string","enum":["image/png","image/jpeg","image/webp"]},"size_bytes":{"type":"integer"},"created_at":{"type":"string","format":"date-time"},"url":{"type":"string","format":"uri"}},"additionalProperties":false},"Alert":{"type":"object","required":["id","workspace_id","type","message","read","created_at"],"properties":{"id":{"type":"string"},"workspace_id":{"type":"string"},"type":{"type":"string","enum":["error","warning","info","success"]},"title":{"type":["string","null"]},"message":{"type":"string"},"context":{"type":["object","null"],"additionalProperties":true},"read":{"type":"integer"},"is_read":{"type":"boolean"},"created_at":{"type":"string","format":"date-time"}},"additionalProperties":false},"WebhookEndpoint":{"type":"object","required":["id","workspaceId","url","events","description","enabled","createdAt","updatedAt"],"properties":{"id":{"type":"string"},"workspaceId":{"type":"string"},"url":{"type":"string","format":"uri"},"events":{"type":"array","items":{"type":"string","enum":["subscriber.created","subscriber.updated","subscriber.unsubscribed","subscriber.bounced","subscriber.complained","email.clicked","sequence.enrolled","sequence.completed","newsletter.sent","event.occurred","webhook.test"]}},"description":{"type":["string","null"]},"enabled":{"type":"boolean"},"signingSecret":{"type":"string"},"lastDeliveryAt":{"type":["string","null"],"format":"date-time"},"lastFailureAt":{"type":["string","null"],"format":"date-time"},"consecutiveFailures":{"type":"integer"},"createdByUserId":{"type":["string","null"]},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"additionalProperties":false},"WebhookDelivery":{"type":"object","required":["id","endpointId","event","status","responseStatus","responseBody","attempts","lastAttemptAt","nextAttemptAt","createdAt"],"properties":{"id":{"type":"string"},"endpointId":{"type":"string"},"event":{"type":"string"},"status":{"type":"string","enum":["pending","succeeded","failed"]},"responseStatus":{"type":["integer","null"]},"responseBody":{"type":["string","null"]},"attempts":{"type":"integer"},"lastAttemptAt":{"type":["string","null"],"format":"date-time"},"nextAttemptAt":{"type":["string","null"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"}},"additionalProperties":false},"WebhookEventCatalogEntry":{"type":"object","required":["type","description"],"properties":{"type":{"type":"string","enum":["subscriber.created","subscriber.updated","subscriber.unsubscribed","subscriber.bounced","subscriber.complained","email.clicked","sequence.enrolled","sequence.completed","newsletter.sent","event.occurred","webhook.test"]},"description":{"type":"string"}},"additionalProperties":false},"WebhookSubscriber":{"type":"object","required":["id","email","status","tags"],"properties":{"id":{"type":"string"},"email":{"type":"string"},"name":{"type":["string","null"]},"status":{"type":"string","enum":["active","unsubscribed","bounced"]},"language":{"type":["string","null"]},"tags":{"type":"array","items":{"type":"string"},"description":"Tag names the person has now."},"fields":{"type":"object","additionalProperties":true,"description":"The person's contact fields."},"subscribed_at":{"type":["string","null"]},"unsubscribed_at":{"type":["string","null"]}},"additionalProperties":false,"description":"The person as they are when the event is queued."},"WebhookEnvelope":{"type":"object","required":["id","type","created_at","workspace_id","data"],"properties":{"id":{"type":"string","description":"evt_ plus 32 hex characters. The same occurrence keeps its id across retries: drop ids you already processed."},"type":{"type":"string","enum":["subscriber.created","subscriber.updated","subscriber.unsubscribed","subscriber.bounced","subscriber.complained","email.clicked","sequence.enrolled","sequence.completed","newsletter.sent","event.occurred","webhook.test"]},"created_at":{"type":"string","format":"date-time"},"workspace_id":{"type":"string"},"data":{"type":"object","additionalProperties":true,"description":"Fields of the event type. Events about a person carry it in data.subscriber (WebhookSubscriber).","properties":{"subscriber":{"$ref":"#/components/schemas/WebhookSubscriber"}}}},"additionalProperties":false,"description":"The body of every outgoing webhook, signed in the Djinnletter-Signature header: t=<unix seconds>, v1=<hex HMAC-SHA256 of \"<t>.<raw body>\" with the endpoint signing secret>. Djinnletter-Event and Djinnletter-Delivery-Id headers come along."},"EventInbound":{"type":"object","required":["enabled","email_path","data_path","subscribe","received_count","last_received_at","last_payload","last_result"],"properties":{"enabled":{"type":"boolean","description":"Whether the URL works. Its address is only returned by POST /events/{key}/inbound/rotate."},"email_path":{"type":["string","null"],"description":"Dot path to the email in the incoming JSON; null tries email, customer.email, data.object.customer_email and data.object.customer_details.email."},"data_path":{"type":["string","null"],"description":"Dot path to the part of the body that becomes the event data; null keeps the whole body."},"subscribe":{"type":"boolean","description":"Add an unknown address as an active subscriber (source event, fires subscriber_added). Never reactivates an address that unsubscribed, bounced or complained."},"received_count":{"type":"integer"},"last_received_at":{"type":["string","null"]},"last_payload":{"type":["string","null"],"description":"The last body received, cut at 8 KB, for checking the mapping."},"last_result":{"type":["object","null"],"properties":{"enrolled":{"type":"integer"},"reason":{"type":["string","null"]}},"additionalProperties":false,"description":"What the last body did; reason no_email, invalid_json or invalid_data when it fired nothing."},"created_at":{"type":"string"},"updated_at":{"type":"string"}},"additionalProperties":false},"Domain":{"type":"object","required":["id","workspace_id","domain","status","region","dns_records","created_at","verified_at"],"properties":{"id":{"type":"string"},"workspace_id":{"type":"string"},"domain":{"type":"string"},"status":{"type":"string","enum":["pending","verified","failed"]},"region":{"type":"string"},"tracking_enabled":{"type":"boolean","description":"Whether opens and clicks are measured. On by default for new domains; tracking does not change the price."},"dns_records":{"type":"array","items":{"type":"object","additionalProperties":true,"description":"Each record has a purpose: sending (required), fallback or tracking (optional, never blocks sending)."}},"dns_setup":{"type":["object","null"],"additionalProperties":true,"description":"Where the DNS is hosted (provider, dashboard_url, guide_url) and a suggested DMARC record when missing. Null once verified."},"created_at":{"type":"string","format":"date-time"},"verified_at":{"type":["string","null"],"format":"date-time"}},"additionalProperties":false},"SignupForm":{"type":"object","required":["id","workspace_id","public_token","default_language","privacy_url","accent_color","heading","description","thank_you_message","created_at","updated_at"],"properties":{"id":{"type":"string"},"workspace_id":{"type":"string"},"public_token":{"type":"string"},"default_language":{"type":"string","enum":["es","en"]},"privacy_url":{"type":"string","description":"Empty when the form shows no privacy policy line."},"accent_color":{"type":["string","null"],"description":"Button color as #rrggbb; null uses the workspace brand color."},"heading":{"type":["string","null"],"description":"Null uses the default for the language (see defaults)."},"description":{"type":["string","null"]},"thank_you_message":{"type":["string","null"],"description":"Shown after someone signs up. Null uses the default."},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"}},"additionalProperties":false},"SignupFormSettings":{"type":"object","required":["sender_ready","form","defaults","embed_html","health"],"properties":{"sender_ready":{"type":"boolean","description":"False until the sending domain is verified. The form still takes signups; their confirmation emails go out once it is."},"form":{"$ref":"#/components/schemas/SignupForm"},"defaults":{"type":"object","additionalProperties":true,"description":"What a null color or text shows: accent_color, and heading, description and thank_you_message per language (es, en)."},"embed_html":{"type":"string","description":"Two lines to paste once into a website where the form should appear. They load the saved settings, so later changes need no re-paste."},"health":{"type":"object","required":["requests_last_hour","hourly_limit","capacity_reached","awaiting_sender","delivery_failures_last_24h","last_delivery_failure_at"],"properties":{"requests_last_hour":{"type":"integer"},"hourly_limit":{"type":"integer"},"capacity_reached":{"type":"boolean"},"awaiting_sender":{"type":"integer","description":"Signups waiting for the domain to be verified before their confirmation email goes out."},"delivery_failures_last_24h":{"type":"integer"},"last_delivery_failure_at":{"type":["string","null"],"format":"date-time"}},"additionalProperties":false}},"additionalProperties":false},"SignupFormSettingsResponse":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/SignupFormSettings"}},"additionalProperties":false},"Sequence":{"type":"object","required":["id","workspace_id","name","trigger","language","status","time_zone","send_time","template_id","people","dashboard_url"],"properties":{"id":{"type":"string"},"workspace_id":{"type":"string"},"name":{"type":"string"},"trigger":{"type":"string","description":"Key of the event that enrolls people (GET /events): signup_confirmed (confirming through the signup form), subscriber_added or a custom event."},"language":{"type":"string","enum":["es","en"]},"status":{"type":"string","enum":["draft","active","paused","archived"]},"time_zone":{"type":"string","description":"IANA time zone the send time and calendar days follow."},"send_time":{"type":"string","pattern":"^([01][0-9]|2[0-3]):[0-5][0-9]$","description":"Local time steps with a delay go out."},"template_id":{"type":"string"},"activated_at":{"type":["string","null"],"format":"date-time"},"activated_by":{"type":["string","null"]},"paused_at":{"type":["string","null"],"format":"date-time"},"archived_at":{"type":["string","null"],"format":"date-time"},"created_at":{"type":"string"},"updated_at":{"type":"string"},"step_count":{"type":"integer"},"steps":{"type":"array","items":{"$ref":"#/components/schemas/SequenceStep"}},"people":{"$ref":"#/components/schemas/SequencePeople"},"dashboard_url":{"type":"string","format":"uri","description":"Where a person reviews and activates the sequence."}},"additionalProperties":false},"SequenceStep":{"type":"object","required":["id","sequence_id","delay_days","subject","body","template_id"],"properties":{"id":{"type":"string"},"sequence_id":{"type":"string"},"workspace_id":{"type":"string"},"delay_days":{"type":"integer","minimum":0,"maximum":365,"description":"Days after the event that enrolled the person. 0 goes out right away; others at the send time."},"subject":{"type":"string"},"preview_text":{"type":["string","null"]},"body":{"type":"string","maxLength":50000,"description":"Plain text. Blank lines separate paragraphs; a line starting with ## is a heading, - starts a bullet, a line that is only ![alt](https://...) is an image, and bare URLs and [label](https://...) links become links. Everything else is shown as written."},"template_id":{"type":["string","null"],"description":"The step's own template; null uses the sequence's."},"created_at":{"type":"string"},"updated_at":{"type":"string"}},"additionalProperties":false},"SequencePeople":{"type":"object","required":["enrolled","active","completed","stopped"],"properties":{"enrolled":{"type":"integer"},"active":{"type":"integer"},"completed":{"type":"integer"},"stopped":{"type":"integer"}},"additionalProperties":false},"SequenceResponse":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/Sequence"}},"additionalProperties":false},"SequenceStepResponse":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/SequenceStep"}},"additionalProperties":false},"Event":{"type":"object","required":["key","name","description","built_in","sequence_count","inbound","fired_count","last_fired_at"],"properties":{"key":{"type":"string","description":"What a sequence trigger holds and the path of POST /events/{key}/occurrences. Derived from the name, unique per workspace."},"name":{"type":"string"},"description":{"type":["string","null"]},"built_in":{"type":"boolean","description":"signup_confirmed (the signup form) and subscriber_added (an import, the API, an upsert, the dashboard or an event with subscribe) are built in: they fire by themselves, have no inbound URL and cannot be fired by API or deleted."},"sequence_count":{"type":"integer","description":"Sequences, not archived, that this event starts."},"created_at":{"type":["string","null"]},"inbound":{"oneOf":[{"$ref":"#/components/schemas/EventInbound"},{"type":"null"}],"description":"The inbound URL settings; null for the built-in events and for events that never had one."},"fired_count":{"type":"integer","description":"Calls in the last 13 months (the occurrences log). Built-in events are not logged and read 0."},"last_fired_at":{"type":["string","null"],"description":"When it was last fired, or null."}},"additionalProperties":false},"EventOccurrenceResult":{"type":"object","required":["event","occurrence_id","subscriber_id","created","enrolled","sequence_ids","reason"],"properties":{"event":{"type":"string"},"occurrence_id":{"type":"string","description":"The recorded call; the events dataset lists them."},"subscriber_id":{"type":["string","null"]},"created":{"type":"boolean","description":"Whether this call added the person (subscribe: true and an unknown address)."},"enrolled":{"type":"integer","description":"Sequences the person joined now."},"sequence_ids":{"type":"array","items":{"type":"string"}},"reason":{"type":["string","null"],"enum":["not_a_subscriber","not_active","no_active_sequences","already_enrolled",null],"description":"Why nobody joined; null when someone did."}},"additionalProperties":false},"SequenceMetrics":{"type":"object","required":["sequence_id","people","steps"],"properties":{"sequence_id":{"type":"string"},"people":{"$ref":"#/components/schemas/SequencePeople"},"steps":{"type":"array","items":{"type":"object","properties":{"step_id":{"type":"string"},"delay_days":{"type":"integer"},"subject":{"type":"string"},"sent":{"type":"integer"},"tracked_sent":{"type":"integer","description":"People sent this step with open and click tracking on (or sent before tracking was recorded). 0 with sent above 0 means tracking was off: show no open or click figures."},"delivered":{"type":"integer"},"failed":{"type":"integer","description":"Emails the provider refused."},"unique_opens":{"type":"integer"},"unique_clicks":{"type":"integer"},"unsubscribed":{"type":"integer"},"bounced":{"type":"integer"},"complained":{"type":"integer"},"delivery_rate":{"type":"number"},"open_rate":{"type":"number","description":"Unique opens divided by tracked_sent."},"click_rate":{"type":"number","description":"Unique clicks divided by tracked_sent."},"click_to_open_rate":{"type":"number"},"unsubscribe_rate":{"type":"number"},"bounce_rate":{"type":"number"}},"additionalProperties":false}}},"additionalProperties":false},"ImportResult":{"type":"object","required":["imported","skipped","duplicatesInPayload"],"properties":{"imported":{"type":"integer"},"skipped":{"type":"integer"},"duplicatesInPayload":{"type":"integer"},"invalidRows":{"type":"integer"},"fields":{"type":"array","items":{"type":"string"},"description":"CSV only: the columns imported as contact fields, by key."},"ignoredColumns":{"type":"array","items":{"type":"string"},"description":"CSV only: the header columns that are not email, name, language or a valid field key."},"errors":{"type":"array","items":{"type":"string"}}},"additionalProperties":false},"HealthReport":{"type":"object","required":["ok","services","not_configured","environment"],"properties":{"ok":{"type":"boolean"},"environment":{"type":"string"},"services":{"type":"object","required":["db","email"],"properties":{"db":{"type":"boolean"},"email":{"type":"boolean"}},"additionalProperties":false},"not_configured":{"type":"array","items":{"type":"string","enum":["email"]}}},"additionalProperties":false},"HealthResponse":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/HealthReport"}},"additionalProperties":false},"NewsletterResponse":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/Newsletter"}},"additionalProperties":false},"NewsletterPageResponse":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","required":["items","total","page","pageSize","totalPages"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/Newsletter"}},"total":{"type":"integer"},"page":{"type":"integer"},"pageSize":{"type":"integer"},"totalPages":{"type":"integer"}},"additionalProperties":false}},"additionalProperties":false},"NewsletterSendResponse":{"type":"object","required":["success","data","sentTo","failed","errors"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/Newsletter"},"sentTo":{"type":"integer"},"failed":{"type":"integer"},"errors":{"type":"array","items":{"type":"string"}}},"additionalProperties":false},"NewsletterSendReconciliationResponse":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","required":["newsletterId","batchIndex","decision","resumeReady","state"],"properties":{"newsletterId":{"type":"string"},"batchIndex":{"type":"integer"},"decision":{"type":"string","enum":["accepted","rejected"]},"resumeReady":{"type":"boolean"},"state":{"type":"string","enum":["awaiting_reconciliation","completed"]}},"additionalProperties":false}},"additionalProperties":false},"NewsletterSendStatusResponse":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","required":["newsletterId","newsletterStatus","claimState","resumeReady","requiresReconciliation","batches"],"properties":{"newsletterId":{"type":"string"},"newsletterStatus":{"type":"string","enum":["draft","ready","sent"]},"claimState":{"type":["string","null"],"enum":["claimed","provider_started","completed",null]},"resumeReady":{"type":"boolean"},"requiresReconciliation":{"type":"boolean"},"batches":{"type":"array","items":{"type":"object","required":["batchIndex","status","recipientCount","providerAttemptToken","lastError"],"properties":{"batchIndex":{"type":"integer"},"status":{"type":"string","enum":["prepared","provider_started","accepted","rejected","unknown"]},"recipientCount":{"type":"integer"},"providerAttemptToken":{"type":["string","null"]},"lastError":{"type":["string","null"]}},"additionalProperties":false}}},"additionalProperties":false}},"additionalProperties":false},"BillingAccountResponse":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","required":["balance","pricing","billingDetails","paymentMethod","autoRecharge","topups","movements","permissions","configured"],"properties":{"balance":{"type":"object","required":["credits","euros"],"properties":{"credits":{"type":"integer"},"euros":{"type":"number"}},"additionalProperties":false},"pricing":{"type":"object","required":["currency","creditsPerEuro"],"properties":{"currency":{"type":"string","enum":["EUR"]},"creditsPerEuro":{"type":"integer","enum":[1000]}},"additionalProperties":false},"billingDetails":{"oneOf":[{"$ref":"#/components/schemas/BillingDetails"},{"type":"null"}]},"paymentMethod":{"oneOf":[{"type":"object","required":["brand","last4","expMonth","expYear"],"properties":{"brand":{"type":"string"},"last4":{"type":"string"},"expMonth":{"type":"integer"},"expYear":{"type":"integer"}},"additionalProperties":false},{"type":"null"}]},"autoRecharge":{"type":"object","required":["enabled","amountEur","thresholdCredits","consentAt"],"properties":{"enabled":{"type":"boolean"},"amountEur":{"type":["integer","null"],"minimum":1},"thresholdCredits":{"type":["integer","null"],"minimum":0},"consentAt":{"type":["string","null"],"format":"date-time"}},"additionalProperties":false},"topups":{"type":"array","items":{"type":"object","required":["id","source","amountEur","credits","status","createdAt","completedAt"],"properties":{"id":{"type":"string"},"source":{"type":"string","enum":["manual","auto","migration_adjustment","refund"]},"amountEur":{"type":"number"},"credits":{"type":"integer"},"status":{"type":"string","enum":["pending","succeeded","failed"]},"createdAt":{"type":"string","format":"date-time"},"completedAt":{"type":["string","null"],"format":"date-time"}},"additionalProperties":false}},"movements":{"type":"array","items":{"type":"object","required":["id","type","credits","description","createdAt"],"properties":{"id":{"type":"string"},"type":{"type":"string"},"credits":{"type":"integer"},"description":{"type":"string"},"createdAt":{"type":"string","format":"date-time"}},"additionalProperties":false}},"permissions":{"type":"object","required":["canManage"],"properties":{"canManage":{"type":"boolean"}},"additionalProperties":false},"configured":{"type":"boolean"}},"additionalProperties":false}},"additionalProperties":false},"BillingDetails":{"type":"object","required":["country","postalCode","name","vatId"],"properties":{"country":{"type":"string"},"postalCode":{"type":["string","null"]},"name":{"type":["string","null"]},"vatId":{"type":["string","null"]}},"additionalProperties":false},"BillingDetailsResponse":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/BillingDetails"}},"additionalProperties":false},"BillingTaxPreviewResponse":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","required":["netCents","taxCents","totalCents","rateDescription"],"properties":{"netCents":{"type":"integer","description":"Amount excluding VAT; credits are computed from it"},"taxCents":{"type":"integer"},"totalCents":{"type":"integer","description":"Amount charged, including VAT"},"rateDescription":{"type":"string","description":"For example \"21% VAT (ES)\" or \"EU reverse charge (0% VAT)\""}},"additionalProperties":false}},"additionalProperties":false},"BillingTopupResponse":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","required":["topupId","clientSecret","credits","netCents","taxCents","totalCents"],"properties":{"topupId":{"type":"string"},"clientSecret":{"type":"string","description":"PaymentIntent client secret for the Payment Element; credits and the invoice follow the successful payment"},"credits":{"type":"integer"},"netCents":{"type":"integer"},"taxCents":{"type":"integer"},"totalCents":{"type":"integer"}},"additionalProperties":false}},"additionalProperties":false},"BillingInvoiceListResponse":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"type":"object","required":["id","number","paidAt","netCents","taxCents","totalCents","currency","hostedInvoiceUrl","invoicePdf"],"properties":{"id":{"type":"string"},"number":{"type":["string","null"]},"paidAt":{"type":"string","format":"date-time"},"netCents":{"type":"integer"},"taxCents":{"type":"integer"},"totalCents":{"type":"integer"},"currency":{"type":"string"},"hostedInvoiceUrl":{"type":["string","null"]},"invoicePdf":{"type":["string","null"],"description":"Download link for the invoice PDF"}},"additionalProperties":false}}},"additionalProperties":false},"BillingPaymentMethodSetupResponse":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","required":["clientSecret","setupIntentId"],"properties":{"clientSecret":{"type":"string"},"setupIntentId":{"type":"string"}},"additionalProperties":false}},"additionalProperties":false},"BillingTopupConfirmResponse":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","required":["status","credits"],"properties":{"status":{"type":"string","description":"\"succeeded\" once the credits are granted; otherwise the PaymentIntent status, for example \"processing\""},"credits":{"type":"integer"}},"additionalProperties":false}},"additionalProperties":false},"BillingPaymentMethodConfirmResponse":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","required":["status"],"properties":{"status":{"type":"string","description":"\"succeeded\" once the card is saved; otherwise the SetupIntent status"},"autoRechargeEnabled":{"type":"boolean"}},"additionalProperties":false}},"additionalProperties":false},"BillingAutoRechargeResponse":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","required":["enabled","amountEur","thresholdCredits","consentAt"],"properties":{"enabled":{"type":"boolean"},"amountEur":{"type":["integer","null"],"minimum":1},"thresholdCredits":{"type":["integer","null"],"minimum":0},"consentAt":{"type":["string","null"],"format":"date-time"}},"additionalProperties":false}},"additionalProperties":false},"NewsletterMetricSummary":{"type":"object","required":["id","subject","sent_at","total_sent","total_delivered","opens","clicks","bounced","unsubscribed","complained","delivery_rate","open_rate","click_rate","delivered_open_rate","delivered_click_rate","click_to_open_rate","bounce_rate","unsubscribe_rate","complaint_rate"],"properties":{"id":{"type":"string"},"subject":{"type":"string"},"sent_at":{"type":"string","format":"date-time"},"tracking_enabled":{"type":["boolean","null"],"description":"Whether opens and clicks were measured for this send, recorded when it went out. Null for sends from before this was recorded. When false, show no open or click figures."},"total_sent":{"type":"integer"},"total_delivered":{"type":"integer"},"opens":{"type":"integer"},"clicks":{"type":"integer"},"bounced":{"type":"integer"},"unsubscribed":{"type":"integer"},"complained":{"type":"integer"},"delivery_rate":{"type":"number"},"open_rate":{"type":"number","description":"Legacy compatibility rate: unique opens divided by sent."},"click_rate":{"type":"number","description":"Legacy compatibility rate: unique clicks divided by unique opens."},"delivered_open_rate":{"type":"number","description":"Estimated unique opens divided by delivered."},"delivered_click_rate":{"type":"number","description":"Unique clicks divided by delivered (CTR)."},"click_to_open_rate":{"type":"number","description":"Unique clicks divided by unique opens (CTOR)."},"bounce_rate":{"type":"number"},"unsubscribe_rate":{"type":"number"},"complaint_rate":{"type":"number"}},"additionalProperties":false},"MetricSummary":{"type":"object","required":["total_sent","total_delivered","total_opens","total_clicks","unique_opens","unique_clicks","bounced","unsubscribed","complained","delivery_rate","open_rate","click_rate","delivered_open_rate","delivered_click_rate","click_to_open_rate","bounce_rate","unsubscribe_rate","complaint_rate","newsletters"],"properties":{"tracking_enabled":{"type":"boolean","description":"Whether a sender domain of the workspace measures opens and clicks now."},"tracked_sent":{"type":"integer","description":"Emails sent with tracking on, or before tracking was recorded. Open and click rates are over these. 0 with total_sent above 0 means tracking was off for every send."},"total_sent":{"type":"integer"},"total_delivered":{"type":"integer"},"total_opens":{"type":"integer"},"total_clicks":{"type":"integer"},"unique_opens":{"type":"integer"},"unique_clicks":{"type":"integer"},"bounced":{"type":"integer"},"unsubscribed":{"type":"integer"},"complained":{"type":"integer"},"delivery_rate":{"type":"number"},"open_rate":{"type":"number","description":"Legacy compatibility rate: unique opens divided by sent."},"click_rate":{"type":"number","description":"Legacy compatibility rate: unique clicks divided by unique opens."},"delivered_open_rate":{"type":"number","description":"Estimated unique opens divided by delivered."},"delivered_click_rate":{"type":"number","description":"Unique clicks divided by delivered (CTR)."},"click_to_open_rate":{"type":"number","description":"Unique clicks divided by unique opens (CTOR)."},"bounce_rate":{"type":"number"},"unsubscribe_rate":{"type":"number"},"complaint_rate":{"type":"number"},"newsletters":{"type":"array","items":{"$ref":"#/components/schemas/NewsletterMetricSummary"}}},"additionalProperties":false},"ClickUrlBreakdown":{"type":"object","required":["url","total_clicks","unique_clicks"],"properties":{"url":{"type":"string"},"total_clicks":{"type":"integer"},"unique_clicks":{"type":"integer"}},"additionalProperties":false},"ClickDeviceBreakdown":{"type":"object","required":["device_class","total_clicks","unique_clicks"],"properties":{"device_class":{"type":"string","enum":["mobile","tablet","desktop","bot","unknown"]},"total_clicks":{"type":"integer"},"unique_clicks":{"type":"integer"}},"additionalProperties":false},"NewsletterMetricDetail":{"type":"object","required":["id","newsletter_id","total_sent","total_delivered","total_opened","total_clicked","unique_opens","unique_clicks","bounced","unsubscribed","complained","updated_at","language","sent_at","delivery_rate","open_rate","click_rate","delivered_open_rate","delivered_click_rate","click_to_open_rate","bounce_rate","unsubscribe_rate","complaint_rate","clicksByUrl","clicksByDevice"],"properties":{"id":{"type":"string"},"newsletter_id":{"type":"string"},"total_sent":{"type":"integer"},"total_delivered":{"type":"integer"},"total_opened":{"type":"integer"},"total_clicked":{"type":"integer"},"unique_opens":{"type":"integer"},"unique_clicks":{"type":"integer"},"bounced":{"type":"integer"},"unsubscribed":{"type":"integer"},"complained":{"type":"integer"},"updated_at":{"type":"string","format":"date-time"},"language":{"type":"string","enum":["es","en"]},"sent_at":{"type":["string","null"],"format":"date-time"},"tracking_enabled":{"type":["boolean","null"],"description":"Whether opens and clicks were measured for this send, recorded when it went out. Null for sends from before this was recorded. When false, show no open or click figures."},"delivery_rate":{"type":"number"},"open_rate":{"type":"number","description":"Legacy compatibility rate: unique opens divided by sent."},"click_rate":{"type":"number","description":"Legacy compatibility rate: unique clicks divided by unique opens."},"delivered_open_rate":{"type":"number","description":"Estimated unique opens divided by delivered."},"delivered_click_rate":{"type":"number","description":"Unique clicks divided by delivered (CTR)."},"click_to_open_rate":{"type":"number","description":"Unique clicks divided by unique opens (CTOR)."},"bounce_rate":{"type":"number"},"unsubscribe_rate":{"type":"number"},"complaint_rate":{"type":"number"},"clicksByUrl":{"type":"array","items":{"$ref":"#/components/schemas/ClickUrlBreakdown"}},"clicksByDevice":{"type":"array","items":{"$ref":"#/components/schemas/ClickDeviceBreakdown"}}},"additionalProperties":false},"MetricHistoryItem":{"type":"object","required":["id","workspace_id","language","sent_at","total_sent","total_delivered","unique_opens","unique_clicks","bounced","unsubscribed","complained","delivery_rate","open_rate","click_rate","delivered_open_rate","delivered_click_rate","click_to_open_rate","bounce_rate","unsubscribe_rate","complaint_rate"],"properties":{"id":{"type":"string"},"workspace_id":{"type":"string"},"language":{"type":"string","enum":["es","en"]},"sent_at":{"type":"string","format":"date-time"},"tracking_enabled":{"type":["boolean","null"],"description":"Whether opens and clicks were measured for this send, recorded when it went out. Null for sends from before this was recorded. When false, show no open or click figures."},"total_sent":{"type":"integer"},"total_delivered":{"type":"integer"},"unique_opens":{"type":"integer"},"unique_clicks":{"type":"integer"},"bounced":{"type":"integer"},"unsubscribed":{"type":"integer"},"complained":{"type":"integer"},"delivery_rate":{"type":"number"},"open_rate":{"type":"number","description":"Legacy compatibility rate: unique opens divided by sent."},"click_rate":{"type":"number","description":"Legacy compatibility rate: unique clicks divided by unique opens."},"delivered_open_rate":{"type":"number","description":"Estimated unique opens divided by delivered."},"delivered_click_rate":{"type":"number","description":"Unique clicks divided by delivered (CTR)."},"click_to_open_rate":{"type":"number","description":"Unique clicks divided by unique opens (CTOR)."},"bounce_rate":{"type":"number"},"unsubscribe_rate":{"type":"number"},"complaint_rate":{"type":"number"}},"additionalProperties":false},"TopLink":{"type":"object","required":["url","total_clicks","unique_clicks"],"properties":{"url":{"type":"string"},"total_clicks":{"type":"integer"},"unique_clicks":{"type":"integer"}},"additionalProperties":false},"AdminTenant":{"type":"object","required":["id","name","slug","owner_email","owner_name","member_count","subscriber_count","newsletter_count","total_sent","recent_volume","last_send_at","delivery_health","configuration","status","funding_status","credit_balance","latest_payment_status","auto_recharge_enabled","last_topup_at","lifetime_credits_purchased","lifetime_credits_spent"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"slug":{"type":"string"},"owner_email":{"type":["string","null"]},"owner_name":{"type":["string","null"]},"member_count":{"type":"integer"},"subscriber_count":{"type":"integer"},"newsletter_count":{"type":"integer"},"total_sent":{"type":"integer"},"recent_volume":{"type":"integer"},"last_send_at":{"type":["string","null"],"format":"date-time"},"delivery_health":{"type":"object","required":["status","delivery_rate","bounce_rate"],"properties":{"status":{"type":"string","enum":["healthy","warning","critical","no_data"]},"delivery_rate":{"type":"number"},"bounce_rate":{"type":"number"}},"additionalProperties":false},"configuration":{"type":"object","required":["from_email","domain_verified"],"properties":{"from_email":{"type":"boolean"},"domain_verified":{"type":"boolean"}},"additionalProperties":false},"status":{"type":"string","enum":["ready","needs_setup"]},"funding_status":{"type":"string","enum":["credits_available","depleted","never_paid"]},"credit_balance":{"type":"integer"},"latest_payment_status":{"type":"string","enum":["none","pending","succeeded","failed"]},"auto_recharge_enabled":{"type":"boolean"},"last_topup_at":{"type":["string","null"],"format":"date-time"},"lifetime_credits_purchased":{"type":"integer"},"lifetime_credits_spent":{"type":"integer"}},"additionalProperties":false},"AdminTenantListResponse":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"$ref":"#/components/schemas/AdminTenant"}}},"additionalProperties":false},"AdminOverviewResponse":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","required":["range","totals","delivery","email_series","topup_series","health"],"properties":{"range":{"type":"string","enum":["7d","30d","90d","all"]},"totals":{"type":"object","required":["workspaces","paying_workspaces","subscribers","emails_sent"],"properties":{"workspaces":{"type":"integer"},"paying_workspaces":{"type":"integer"},"subscribers":{"type":"integer"},"emails_sent":{"type":"integer"}},"additionalProperties":false},"delivery":{"type":"object","required":["sent","delivered","bounced","complained","delivery_rate","bounce_rate","complaint_rate"],"properties":{"sent":{"type":"integer"},"delivered":{"type":"integer"},"bounced":{"type":"integer"},"complained":{"type":"integer"},"delivery_rate":{"type":"number"},"bounce_rate":{"type":"number"},"complaint_rate":{"type":"number"}},"additionalProperties":false},"email_series":{"type":"array","items":{"type":"object","required":["date","sent","delivered","bounced","complained"],"properties":{"date":{"type":"string","format":"date"},"sent":{"type":"integer"},"delivered":{"type":"integer"},"bounced":{"type":"integer"},"complained":{"type":"integer"}},"additionalProperties":false}},"topup_series":{"type":"array","items":{"type":"object","required":["date","first_time_paying_workspaces","cumulative_paying_workspaces","successful_topups","failed_topups","gross_topup_revenue_cents"],"properties":{"date":{"type":"string","format":"date"},"first_time_paying_workspaces":{"type":"integer"},"cumulative_paying_workspaces":{"type":"integer"},"successful_topups":{"type":"integer"},"failed_topups":{"type":"integer"},"gross_topup_revenue_cents":{"type":"integer"}},"additionalProperties":false}},"health":{"type":"object","required":["email_provider_configured","email_webhook_configured","billing_provider_configured","billing_webhook_configured","domains"],"properties":{"email_provider_configured":{"type":"boolean"},"email_webhook_configured":{"type":"boolean"},"billing_provider_configured":{"type":"boolean"},"billing_webhook_configured":{"type":"boolean"},"domains":{"type":"object","required":["verified","pending","failed"],"properties":{"verified":{"type":"integer"},"pending":{"type":"integer"},"failed":{"type":"integer"}},"additionalProperties":false}},"additionalProperties":false}},"additionalProperties":false}},"additionalProperties":false},"AdminTenantDetailResponse":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","required":["identity","owner","member_count","usage","billing","domains","last_send","unresolved_send_claims"],"properties":{"identity":{"type":"object","required":["id","name","slug","description","created_at"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"slug":{"type":"string"},"description":{"type":["string","null"]},"created_at":{"type":"string","format":"date-time"}},"additionalProperties":false},"owner":{"oneOf":[{"type":"object","required":["email","name"],"properties":{"email":{"type":"string","format":"email"},"name":{"type":["string","null"]}},"additionalProperties":false},{"type":"null"}]},"member_count":{"type":"integer"},"usage":{"type":"object","required":["emails_sent_30d","emails_sent_lifetime"],"properties":{"emails_sent_30d":{"type":"integer"},"emails_sent_lifetime":{"type":"integer"}},"additionalProperties":false},"billing":{"type":"object","required":["currency","balance","paid_ever","lifetime_paid_cents","lifetime_credits_purchased","lifetime_credits_spent","latest_topup","payment_method_configured","auto_recharge"],"properties":{"currency":{"type":"string","enum":["EUR"]},"balance":{"type":"object","required":["credits","euros"],"properties":{"credits":{"type":"integer"},"euros":{"type":"number"}},"additionalProperties":false},"paid_ever":{"type":"boolean"},"lifetime_paid_cents":{"type":"integer"},"lifetime_credits_purchased":{"type":"integer"},"lifetime_credits_spent":{"type":"integer"},"latest_topup":{"oneOf":[{"type":"object","required":["id","source","amount_cents","credits","status","created_at","completed_at"],"properties":{"id":{"type":"string"},"source":{"type":"string","enum":["manual","auto"]},"amount_cents":{"type":"integer"},"credits":{"type":"integer"},"status":{"type":"string","enum":["pending","succeeded","failed"]},"created_at":{"type":"string","format":"date-time"},"completed_at":{"type":["string","null"],"format":"date-time"}},"additionalProperties":false},{"type":"null"}]},"payment_method_configured":{"type":"boolean"},"auto_recharge":{"type":"object","required":["enabled","amount_eur","consent_at"],"properties":{"enabled":{"type":"boolean"},"amount_eur":{"type":["integer","null"],"minimum":1},"consent_at":{"type":["string","null"],"format":"date-time"}},"additionalProperties":false}},"additionalProperties":false},"domains":{"type":"array","items":{"type":"object","required":["id","domain","status","region","created_at","verified_at"],"properties":{"id":{"type":"string"},"domain":{"type":"string"},"status":{"type":"string","enum":["pending","verified","failed"]},"region":{"type":"string"},"created_at":{"type":"string","format":"date-time"},"verified_at":{"type":["string","null"],"format":"date-time"}},"additionalProperties":false}},"last_send":{"oneOf":[{"type":"object","required":["id","sent_at","sent","delivered","bounced","complained"],"properties":{"id":{"type":"string"},"sent_at":{"type":"string","format":"date-time"},"sent":{"type":"integer"},"delivered":{"type":"integer"},"bounced":{"type":"integer"},"complained":{"type":"integer"}},"additionalProperties":false},{"type":"null"}]},"unresolved_send_claims":{"type":"integer"}},"additionalProperties":false}},"additionalProperties":false},"AdminTopupListResponse":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","required":["items","total","limit","offset"],"properties":{"items":{"type":"array","items":{"type":"object","required":["id","source","amount_cents","amount_eur","credits","status","created_at","completed_at","receipt_url"],"properties":{"id":{"type":"string"},"source":{"type":"string","enum":["manual","auto","migration_adjustment","refund"]},"amount_cents":{"type":"integer"},"amount_eur":{"type":"number"},"credits":{"type":"integer"},"status":{"type":"string","enum":["pending","succeeded","failed"]},"created_at":{"type":"string","format":"date-time"},"completed_at":{"type":["string","null"],"format":"date-time"},"receipt_url":{"type":["string","null"],"format":"uri"}},"additionalProperties":false}},"total":{"type":"integer","minimum":0},"limit":{"type":"integer","minimum":1,"maximum":100},"offset":{"type":"integer","minimum":0}},"additionalProperties":false}},"additionalProperties":false}}},"security":[{"BearerAuth":[]},{"SessionCookie":[]}],"webhooks":{"subscriber.created":{"post":{"summary":"Someone became a subscriber: signup form confirmation, import, the API, the dashboard or an event. data.source says which.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEnvelope"}}}},"responses":{"200":{"description":"Delivered (any 2xx). Otherwise retried after 1 min, 5 min, 15 min and 1 h, then marked failed after the fifth attempt."}}}},"subscriber.updated":{"post":{"summary":"A subscriber's fields, name, tags or language changed, or they came back through the signup form. data.changes lists what.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEnvelope"}}}},"responses":{"200":{"description":"Delivered (any 2xx). Otherwise retried after 1 min, 5 min, 15 min and 1 h, then marked failed after the fifth attempt."}}}},"subscriber.unsubscribed":{"post":{"summary":"A subscriber left through an unsubscribe link, their mail app or the API.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEnvelope"}}}},"responses":{"200":{"description":"Delivered (any 2xx). Otherwise retried after 1 min, 5 min, 15 min and 1 h, then marked failed after the fifth attempt."}}}},"subscriber.bounced":{"post":{"summary":"An address bounced for good and gets no more email.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEnvelope"}}}},"responses":{"200":{"description":"Delivered (any 2xx). Otherwise retried after 1 min, 5 min, 15 min and 1 h, then marked failed after the fifth attempt."}}}},"subscriber.complained":{"post":{"summary":"A subscriber marked an email as spam; they are unsubscribed too.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEnvelope"}}}},"responses":{"200":{"description":"Delivered (any 2xx). Otherwise retried after 1 min, 5 min, 15 min and 1 h, then marked failed after the fifth attempt."}}}},"email.clicked":{"post":{"summary":"A subscriber clicked a link in a newsletter or sequence email, the first time for that email.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEnvelope"}}}},"responses":{"200":{"description":"Delivered (any 2xx). Otherwise retried after 1 min, 5 min, 15 min and 1 h, then marked failed after the fifth attempt."}}}},"sequence.enrolled":{"post":{"summary":"A subscriber joined a sequence.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEnvelope"}}}},"responses":{"200":{"description":"Delivered (any 2xx). Otherwise retried after 1 min, 5 min, 15 min and 1 h, then marked failed after the fifth attempt."}}}},"sequence.completed":{"post":{"summary":"A subscriber received the last email of a sequence.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEnvelope"}}}},"responses":{"200":{"description":"Delivered (any 2xx). Otherwise retried after 1 min, 5 min, 15 min and 1 h, then marked failed after the fifth attempt."}}}},"newsletter.sent":{"post":{"summary":"A newsletter finished sending.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEnvelope"}}}},"responses":{"200":{"description":"Delivered (any 2xx). Otherwise retried after 1 min, 5 min, 15 min and 1 h, then marked failed after the fifth attempt."}}}},"event.occurred":{"post":{"summary":"A custom event was fired, through the API or its inbound URL.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEnvelope"}}}},"responses":{"200":{"description":"Delivered (any 2xx). Otherwise retried after 1 min, 5 min, 15 min and 1 h, then marked failed after the fifth attempt."}}}},"webhook.test":{"post":{"summary":"A test delivery, sent on request.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEnvelope"}}}},"responses":{"200":{"description":"Delivered (any 2xx). Otherwise retried after 1 min, 5 min, 15 min and 1 h, then marked failed after the fifth attempt."}}}}},"paths":{"/openapi.json":{"get":{"tags":["health"],"summary":"Fetch this OpenAPI document","security":[],"responses":{"200":{"description":"OpenAPI document","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OpenApiDocument"}}}}}}},"/docs":{"get":{"tags":["health"],"summary":"Interactive API reference","security":[],"responses":{"200":{"description":"Interactive API reference","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/health":{"get":{"tags":["health"],"summary":"Check database and email readiness","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HealthResponse"}}}}}}},"/workspaces":{"get":{"tags":["workspaces"],"summary":"List accessible workspaces","responses":{"200":{"description":"Workspace list","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"$ref":"#/components/schemas/Workspace"}}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}}},"post":{"tags":["workspaces"],"summary":"Create a workspace","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional mutation key. All HTTP responses are replayable for 24 hours. If execution finishes ambiguously before the replay is stored, the key enters reconciliation and is never re-executed automatically. A key always identifies one immutable request; use a new key for a new action after remediation."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["name","fromEmail","fromName"],"properties":{"name":{"type":"string","minLength":1},"slug":{"type":"string","minLength":1,"pattern":"^[a-z0-9-]+$","description":"Internal handle. Omit it to derive one from the name."},"description":{"type":"string"},"primaryColor":{"type":"string","pattern":"^#[0-9A-Fa-f]{6}$"},"logoUrl":{"type":"string","format":"uri"},"fromEmail":{"type":"string","format":"email"},"fromName":{"type":"string","minLength":1}},"additionalProperties":false}}}},"responses":{"201":{"description":"Workspace created","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/Workspace"}},"additionalProperties":false}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"500":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}}}},"/workspaces/{id}":{"get":{"tags":["workspaces"],"summary":"Get a workspace","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Workspace","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/Workspace"}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}}},"patch":{"tags":["workspaces"],"summary":"Update a workspace","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional mutation key. All HTTP responses are replayable for 24 hours. If execution finishes ambiguously before the replay is stored, the key enters reconciliation and is never re-executed automatically. A key always identifies one immutable request; use a new key for a new action after remediation."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1},"description":{"type":"string"},"primaryColor":{"type":"string","pattern":"^#[0-9A-Fa-f]{6}$"},"logoUrl":{"type":"string","format":"uri"},"fromEmail":{"type":"string","format":"email"},"fromName":{"type":"string","minLength":1}},"additionalProperties":false}}}},"responses":{"200":{"description":"Workspace updated","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/Workspace"}},"additionalProperties":false}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}}}},"/workspaces/{id}/members":{"get":{"tags":["workspaces"],"summary":"List members","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Member list","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"$ref":"#/components/schemas/Member"}}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}}},"post":{"tags":["workspaces"],"summary":"Add a member","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional mutation key. All HTTP responses are replayable for 24 hours. If execution finishes ambiguously before the replay is stored, the key enters reconciliation and is never re-executed automatically. A key always identifies one immutable request; use a new key for a new action after remediation."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["email"],"properties":{"email":{"type":"string","format":"email"},"role":{"type":"string","enum":["admin","editor","viewer"],"default":"editor"}},"additionalProperties":false}}}},"responses":{"201":{"description":"Member added","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/Member"}},"additionalProperties":false}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}}}},"/workspaces/{id}/members/{userId}":{"patch":{"tags":["workspaces"],"summary":"Change a member role","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"userId","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional mutation key. All HTTP responses are replayable for 24 hours. If execution finishes ambiguously before the replay is stored, the key enters reconciliation and is never re-executed automatically. A key always identifies one immutable request; use a new key for a new action after remediation."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["role"],"properties":{"role":{"type":"string","enum":["owner","admin","editor","viewer"]}},"additionalProperties":false}}}},"responses":{"200":{"description":"Member updated","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/Member"}},"additionalProperties":false}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}}},"delete":{"tags":["workspaces"],"summary":"Remove a member","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"userId","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional mutation key. All HTTP responses are replayable for 24 hours. If execution finishes ambiguously before the replay is stored, the key enters reconciliation and is never re-executed automatically. A key always identifies one immutable request; use a new key for a new action after remediation."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}}}},"/setup":{"get":{"tags":["workspaces"],"summary":"Setup checklist: what is configured and what is missing","description":"Each item has id, title, level (required, recommended or optional), done, ask (the question to put to the person), action (the API call that completes it, or null when only a person can) and dashboard_path. ready_to_send is true once every required item is done.","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."}],"responses":{"200":{"description":"Setup checklist","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"ready_to_send":{"type":"boolean"},"done":{"type":"integer"},"total":{"type":"integer"},"next":{"type":["string","null"]},"items":{"type":"array","items":{"type":"object","additionalProperties":true}}},"additionalProperties":false}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}}}},"/agent-connect":{"post":{"tags":["api-keys"],"summary":"Start connecting an agent through browser approval","security":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"client_name":{"type":"string","minLength":1,"maxLength":60}},"additionalProperties":false}}}},"responses":{"201":{"description":"Connection code and approval link","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"device_code":{"type":"string"},"user_code":{"type":"string"},"verification_url":{"type":"string"},"expires_in":{"type":"integer"},"interval":{"type":"integer"}},"additionalProperties":false}},"additionalProperties":false}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"429":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}}}},"/agent-connect/token":{"post":{"tags":["api-keys"],"summary":"Poll for the key once the person approves","security":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["device_code"],"properties":{"device_code":{"type":"string"}},"additionalProperties":false}}}},"responses":{"200":{"description":"Approved: the API key, returned once","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"status":{"type":"string"},"api_key":{"type":"string"}},"additionalProperties":false}},"additionalProperties":false}}}},"202":{"description":"Still waiting for approval","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"status":{"type":"string"},"interval":{"type":"integer"}},"additionalProperties":false}},"additionalProperties":false}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"410":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}}}},"/agent-connect/{code}":{"get":{"tags":["api-keys"],"summary":"Read a pending connection","security":[{"SessionCookie":[]}],"parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Connection","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"user_code":{"type":"string"},"client_name":{"type":"string"},"status":{"type":"string"}},"additionalProperties":false}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["keys:read"]}},"/agent-connect/{code}/approve":{"post":{"tags":["api-keys"],"summary":"Approve a connection for a workspace","security":[{"SessionCookie":[]}],"parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["workspaceId"],"properties":{"workspaceId":{"type":"string"}},"additionalProperties":false}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["keys:write"]}},"/agent-connect/{code}/deny":{"post":{"tags":["api-keys"],"summary":"Decline a connection","security":[{"SessionCookie":[]}],"parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["keys:write"]}},"/api-keys":{"get":{"tags":["api-keys"],"summary":"List API keys","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."}],"responses":{"200":{"description":"API key list","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"$ref":"#/components/schemas/ApiKey"}}},"additionalProperties":false}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["keys:read"]},"post":{"tags":["api-keys"],"summary":"Create an API key","description":"An agent key creates keys only with scopes it holds (its own by default, 403 otherwise) that expire no later than itself (its own expiry by default, 400 otherwise).","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional mutation key. All HTTP responses are replayable for 24 hours. If execution finishes ambiguously before the replay is stored, the key enters reconciliation and is never re-executed automatically. A key always identifies one immutable request; use a new key for a new action after remediation."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["name"],"properties":{"name":{"type":"string","minLength":1,"maxLength":100},"workspaceId":{"type":"string"},"scopes":{"type":"array","items":{"type":"string","enum":["workspace:read","workspace:write","keys:read","keys:write"]}},"expiresAt":{"type":"string","format":"date-time"}},"additionalProperties":false}}}},"responses":{"201":{"description":"API key created","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/ApiKey"}},"additionalProperties":false}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["keys:write"]}},"/api-keys/{id}":{"delete":{"tags":["api-keys"],"summary":"Revoke an API key","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional mutation key. All HTTP responses are replayable for 24 hours. If execution finishes ambiguously before the replay is stored, the key enters reconciliation and is never re-executed automatically. A key always identifies one immutable request; use a new key for a new action after remediation."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["keys:write"]}},"/subscribers":{"get":{"tags":["subscribers"],"summary":"List subscribers","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"status","in":"query","required":false,"schema":{"type":"string","enum":["active","unsubscribed","bounced"]}},{"name":"language","in":"query","required":false,"schema":{"type":"string","enum":["es","en"]}},{"name":"search","in":"query","required":false,"schema":{"type":"string"}},{"name":"tag","in":"query","required":false,"schema":{"type":"string"}},{"name":"sequence","in":"query","required":false,"schema":{"type":"string"}},{"name":"sort","in":"query","required":false,"schema":{"type":"string","enum":["subscribed_at","email","emails_received","open_rate"],"default":"subscribed_at"}},{"name":"order","in":"query","required":false,"schema":{"type":"string","enum":["asc","desc"],"default":"desc"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer"}},{"name":"pageSize","in":"query","required":false,"schema":{"type":"integer"}}],"description":"Each subscriber comes with emails_received, measured_emails, opened_emails, clicked_emails and open_rate. tag limits the list to one tag id; sequence to the people going through that sequence now. Sorting by open_rate puts subscribers with no measured email last.","responses":{"200":{"description":"Subscriber page","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","required":["items","total","page","pageSize","totalPages"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/Subscriber"}},"total":{"type":"integer"},"page":{"type":"integer"},"pageSize":{"type":"integer"},"totalPages":{"type":"integer"}},"additionalProperties":false}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:read"]},"post":{"tags":["subscribers"],"summary":"Create a subscriber","description":"Adds an active subscriber with optional name and fields, and fires subscriber_added. You are responsible for having the person's consent. 400 when the address is already active; 409 when it unsubscribed, bounced or complained: only a fresh signup form confirmation brings it back.","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional mutation key. All HTTP responses are replayable for 24 hours. If execution finishes ambiguously before the replay is stored, the key enters reconciliation and is never re-executed automatically. A key always identifies one immutable request; use a new key for a new action after remediation."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["email"],"properties":{"email":{"type":"string","format":"email"},"language":{"type":"string","enum":["es","en"]},"name":{"type":["string","null"],"maxLength":200},"fields":{"type":"object","description":"A patch of contact fields: the keys given are set, null removes a key, the rest stay. Contact fields: an object of lowercase snake_case keys (^[a-z][a-z0-9_]{0,39}$, at most 50) whose values are text up to 500 characters, numbers or booleans. Reserved keys: email, name, status, event, id, subscriber_id, workspace_id, language, tags, fields, source, subscribed_at, unsubscribed_at, created_at, updated_at, unsubscribe_url.","additionalProperties":{"type":["string","number","boolean","null"]}},"workspaceId":{"type":"string"}},"additionalProperties":false}}}},"responses":{"201":{"description":"Subscriber created","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/Subscriber"}},"additionalProperties":false}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:write"]}},"/subscribers/stats":{"get":{"tags":["subscribers"],"summary":"Get subscriber counts","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."}],"responses":{"200":{"description":"Subscriber statistics","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","required":["totalActive","newLast30Days","unsubscribedLast30Days","breakdown"],"properties":{"totalActive":{"type":"integer"},"newLast30Days":{"type":"integer","description":"Subscribers who joined in the last 30 days, whatever their status now."},"unsubscribedLast30Days":{"type":"integer","description":"Subscribers who unsubscribed in the last 30 days."},"breakdown":{"type":"array","items":{"type":"object","additionalProperties":true}}},"additionalProperties":false}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:read"]}},"/subscribers/import":{"post":{"tags":["subscribers"],"summary":"Import subscribers from JSON","description":"Only adds people: an address already in the workspace, in any status, is skipped and left as it is (use /subscribers/upsert to update). Everyone added fires subscriber_added.","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional mutation key. All HTTP responses are replayable for 24 hours. If execution finishes ambiguously before the replay is stored, the key enters reconciliation and is never re-executed automatically. A key always identifies one immutable request; use a new key for a new action after remediation."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["subscribers"],"properties":{"subscribers":{"type":"array","minItems":1,"maxItems":1000,"items":{"type":"object","required":["email"],"properties":{"email":{"type":"string","format":"email"},"language":{"type":"string","enum":["es","en"]},"name":{"type":["string","null"],"maxLength":200},"fields":{"type":"object","description":"A patch of contact fields: the keys given are set, null removes a key, the rest stay. Contact fields: an object of lowercase snake_case keys (^[a-z][a-z0-9_]{0,39}$, at most 50) whose values are text up to 500 characters, numbers or booleans. Reserved keys: email, name, status, event, id, subscriber_id, workspace_id, language, tags, fields, source, subscribed_at, unsubscribed_at, created_at, updated_at, unsubscribe_url.","additionalProperties":{"type":["string","number","boolean","null"]}}},"additionalProperties":false}}},"additionalProperties":false}}}},"responses":{"200":{"description":"Import result","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/ImportResult"}},"additionalProperties":false}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:write"]}},"/subscribers/upsert":{"post":{"tags":["subscribers"],"summary":"Create or update up to 1,000 people by email (CRM sync)","description":"Idempotent: the same call twice leaves the same state. A known address gets the fields patch (null removes a key), name and language when given, and the tags added (by name; missing tags are created; tags are never removed here). Its status never changes, so someone who unsubscribed, bounced or complained stays that way. An unknown address is added as active and fires subscriber_added. Rows for the same address merge in order. A row whose fields would pass 50 keys is reported in errors and not written.","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional mutation key. All HTTP responses are replayable for 24 hours. If execution finishes ambiguously before the replay is stored, the key enters reconciliation and is never re-executed automatically. A key always identifies one immutable request; use a new key for a new action after remediation."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["subscribers"],"properties":{"subscribers":{"type":"array","minItems":1,"maxItems":1000,"items":{"type":"object","required":["email"],"properties":{"email":{"type":"string","format":"email"},"name":{"type":["string","null"],"maxLength":200},"language":{"type":"string","enum":["es","en"]},"fields":{"type":"object","description":"A patch of contact fields: the keys given are set, null removes a key, the rest stay. Contact fields: an object of lowercase snake_case keys (^[a-z][a-z0-9_]{0,39}$, at most 50) whose values are text up to 500 characters, numbers or booleans. Reserved keys: email, name, status, event, id, subscriber_id, workspace_id, language, tags, fields, source, subscribed_at, unsubscribed_at, created_at, updated_at, unsubscribe_url.","additionalProperties":{"type":["string","number","boolean","null"]}},"tags":{"type":"array","maxItems":20,"items":{"type":"string","minLength":1,"maxLength":50},"description":"Tag names."}},"additionalProperties":false}}},"additionalProperties":false}}}},"responses":{"200":{"description":"What changed","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","required":["created","updated","items","errors","tags_created"],"properties":{"created":{"type":"integer"},"updated":{"type":"integer"},"items":{"type":"array","items":{"type":"object","required":["email","subscriber_id","status","created"],"properties":{"email":{"type":"string"},"subscriber_id":{"type":"string"},"status":{"type":"string"},"created":{"type":"boolean"}},"additionalProperties":false}},"errors":{"type":"array","items":{"type":"object","required":["email","error"],"properties":{"email":{"type":"string"},"error":{"type":"string"}},"additionalProperties":false}},"tags_created":{"type":"array","items":{"type":"string"}}},"additionalProperties":false}},"additionalProperties":false}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:write"]}},"/subscribers/import/csv":{"post":{"tags":["subscribers"],"summary":"Import subscribers from CSV","description":"A header row names the columns: email (required), name, language, and any other column whose header normalizes to a valid field key (\"First Name\" becomes first_name) is a contact field stored as text; an empty cell sets nothing. Other columns are ignored and listed in ignoredColumns. Without a header, the first column is the email and the second the language. Like the JSON import it only adds people and fires subscriber_added for each.","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional mutation key. All HTTP responses are replayable for 24 hours. If execution finishes ambiguously before the replay is stored, the key enters reconciliation and is never re-executed automatically. A key always identifies one immutable request; use a new key for a new action after remediation."}],"requestBody":{"required":true,"content":{"text/csv":{"schema":{"type":"string"}}}},"responses":{"200":{"description":"Import result","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/ImportResult"}},"additionalProperties":false}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"413":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"415":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:write"]}},"/subscribers/export":{"get":{"tags":["subscribers"],"summary":"Export subscribers as CSV","description":"Columns: email, language, status, subscribed_at, name, then one column per field key in use, so the file imports back with its fields.","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"status","in":"query","required":false,"schema":{"type":"string","enum":["active","unsubscribed","bounced"],"default":"active"}}],"responses":{"200":{"description":"Subscriber CSV","content":{"text/csv":{"schema":{"type":"string"}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:read"]}},"/subscribers/{id}":{"get":{"tags":["subscribers"],"summary":"Get a subscriber with fields, tags and every sequence they joined","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Subscriber","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/Subscriber"}},"additionalProperties":false}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:read"]},"patch":{"tags":["subscribers"],"summary":"Update a subscriber","description":"fields is a patch: the keys given are set, null removes a key. 400 when the result would hold more than 50 fields.","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional mutation key. All HTTP responses are replayable for 24 hours. If execution finishes ambiguously before the replay is stored, the key enters reconciliation and is never re-executed automatically. A key always identifies one immutable request; use a new key for a new action after remediation."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"language":{"type":"string","enum":["es","en"]},"name":{"type":["string","null"],"maxLength":200},"fields":{"type":"object","description":"A patch of contact fields: the keys given are set, null removes a key, the rest stay. Contact fields: an object of lowercase snake_case keys (^[a-z][a-z0-9_]{0,39}$, at most 50) whose values are text up to 500 characters, numbers or booleans. Reserved keys: email, name, status, event, id, subscriber_id, workspace_id, language, tags, fields, source, subscribed_at, unsubscribed_at, created_at, updated_at, unsubscribe_url.","additionalProperties":{"type":["string","number","boolean","null"]}}},"additionalProperties":false}}}},"responses":{"200":{"description":"Subscriber updated","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/Subscriber"}},"additionalProperties":false}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:write"]},"delete":{"tags":["subscribers"],"summary":"Unsubscribe a subscriber","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional mutation key. All HTTP responses are replayable for 24 hours. If execution finishes ambiguously before the replay is stored, the key enters reconciliation and is never re-executed automatically. A key always identifies one immutable request; use a new key for a new action after remediation."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:write"]}},"/subscribers/{id}/tags":{"get":{"tags":["subscribers"],"summary":"List subscriber tags","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Tag list","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"$ref":"#/components/schemas/Tag"}}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:read"]},"put":{"tags":["subscribers"],"summary":"Replace subscriber tags","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional mutation key. All HTTP responses are replayable for 24 hours. If execution finishes ambiguously before the replay is stored, the key enters reconciliation and is never re-executed automatically. A key always identifies one immutable request; use a new key for a new action after remediation."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"tagIds":{"type":"array","maxItems":100,"items":{"type":"string"}},"tag_ids":{"type":"array","maxItems":100,"items":{"type":"string"}}},"additionalProperties":false}}}},"responses":{"200":{"description":"Updated tag list","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"$ref":"#/components/schemas/Tag"}}},"additionalProperties":false}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:write"]}},"/subscribers/{id}/tags/{tagId}":{"post":{"tags":["subscribers"],"summary":"Add a subscriber tag","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"tagId","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional mutation key. All HTTP responses are replayable for 24 hours. If execution finishes ambiguously before the replay is stored, the key enters reconciliation and is never re-executed automatically. A key always identifies one immutable request; use a new key for a new action after remediation."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:write"]},"delete":{"tags":["subscribers"],"summary":"Remove a subscriber tag","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"tagId","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional mutation key. All HTTP responses are replayable for 24 hours. If execution finishes ambiguously before the replay is stored, the key enters reconciliation and is never re-executed automatically. A key always identifies one immutable request; use a new key for a new action after remediation."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:write"]}},"/fields":{"get":{"tags":["subscribers"],"summary":"List the contact field keys in use","description":"Each key with how many subscribers have it (any status, and active) and the type most of its values have. {{email}} and {{name}} are always available besides these.","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."}],"responses":{"200":{"description":"Field keys","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","required":["items","built_in"],"properties":{"items":{"type":"array","items":{"type":"object","required":["key","subscribers","active_subscribers","type"],"properties":{"key":{"type":"string"},"subscribers":{"type":"integer"},"active_subscribers":{"type":"integer"},"type":{"type":"string","enum":["text","number","boolean"]}},"additionalProperties":false}},"built_in":{"type":"array","items":{"type":"string"}}},"additionalProperties":false}},"additionalProperties":false}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:read"]}},"/tags":{"get":{"tags":["tags"],"summary":"List subscriber tags","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."}],"responses":{"200":{"description":"Tag list","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"$ref":"#/components/schemas/Tag"}}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:read"]},"post":{"tags":["tags"],"summary":"Create a subscriber tag","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional mutation key. All HTTP responses are replayable for 24 hours. If execution finishes ambiguously before the replay is stored, the key enters reconciliation and is never re-executed automatically. A key always identifies one immutable request; use a new key for a new action after remediation."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["name"],"properties":{"name":{"type":"string","minLength":1,"maxLength":50},"description":{"type":["string","null"],"maxLength":1000},"workspaceId":{"type":"string"}},"additionalProperties":false}}}},"responses":{"201":{"description":"Tag created","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/Tag"}},"additionalProperties":false}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:write"]}},"/tags/{id}":{"get":{"tags":["tags"],"summary":"Get a subscriber tag","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Tag","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/Tag"}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:read"]},"patch":{"tags":["tags"],"summary":"Update a subscriber tag","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional mutation key. All HTTP responses are replayable for 24 hours. If execution finishes ambiguously before the replay is stored, the key enters reconciliation and is never re-executed automatically. A key always identifies one immutable request; use a new key for a new action after remediation."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":50},"description":{"type":["string","null"],"maxLength":1000}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tag updated","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/Tag"}},"additionalProperties":false}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:write"]},"delete":{"tags":["tags"],"summary":"Delete a subscriber tag","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional mutation key. All HTTP responses are replayable for 24 hours. If execution finishes ambiguously before the replay is stored, the key enters reconciliation and is never re-executed automatically. A key always identifies one immutable request; use a new key for a new action after remediation."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:write"]}},"/tags/{id}/subscribers":{"get":{"tags":["tags"],"summary":"List subscribers with a tag","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Subscriber list","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"$ref":"#/components/schemas/Subscriber"}}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:read"]}},"/sequences":{"get":{"tags":["sequences"],"summary":"List sequences with their people counts (archived ones only with status=archived)","description":"The first read of a workspace that never had a sequence creates its draft \"Welcome\" (days 1, 3 and 5, placeholder subjects, no text) in time_zone, or UTC. It is never recreated once archived.","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"status","in":"query","required":false,"schema":{"type":"string","enum":["draft","active","paused","archived"]}},{"name":"time_zone","in":"query","required":false,"schema":{"type":"string","description":"IANA zone for the default sequence, used only when it is created."}}],"responses":{"200":{"description":"Sequences","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","required":["items"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/Sequence"}}},"additionalProperties":false}},"additionalProperties":false}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:read"]},"post":{"tags":["sequences"],"summary":"Create a draft sequence","description":"Everyone who confirms through the signup form after a person activates the sequence is enrolled, whatever their language. language (optional, defaults to the signup form language) only sets the email footer words.","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional mutation key. All HTTP responses are replayable for 24 hours. If execution finishes ambiguously before the replay is stored, the key enters reconciliation and is never re-executed automatically. A key always identifies one immutable request; use a new key for a new action after remediation."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["name","time_zone"],"properties":{"name":{"type":"string"},"language":{"type":"string","enum":["es","en"]},"time_zone":{"type":"string"},"send_time":{"type":"string","default":"09:00"},"template_id":{"type":"string"},"trigger":{"type":"string","default":"signup_confirmed","description":"An event key from GET /events."}},"additionalProperties":false}}}},"responses":{"201":{"description":"Sequence created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SequenceResponse"}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:write"]}},"/sequences/{id}":{"get":{"tags":["sequences"],"summary":"Get a sequence with its steps in delay order","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SequenceResponse"}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:read"]},"patch":{"tags":["sequences"],"summary":"Rename, reschedule or change what starts a sequence","description":"trigger takes an event key from GET /events, in any status but archived; it only changes who joins from now on.","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional mutation key. All HTTP responses are replayable for 24 hours. If execution finishes ambiguously before the replay is stored, the key enters reconciliation and is never re-executed automatically. A key always identifies one immutable request; use a new key for a new action after remediation."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"},"time_zone":{"type":"string"},"send_time":{"type":"string"},"template_id":{"type":"string"},"trigger":{"type":"string"}},"additionalProperties":false}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SequenceResponse"}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:write"]}},"/sequences/{id}/archive":{"post":{"tags":["sequences"],"summary":"Archive a sequence: it stops sending and everyone in it leaves","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional mutation key. All HTTP responses are replayable for 24 hours. If execution finishes ambiguously before the replay is stored, the key enters reconciliation and is never re-executed automatically. A key always identifies one immutable request; use a new key for a new action after remediation."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SequenceResponse"}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:write"]}},"/sequences/{id}/activate":{"post":{"tags":["sequences"],"summary":"Activate or resume a sequence (people only)","description":"Like approving an issue, turning a sequence on is the decision of the person. API keys get 403 with the dashboard_url where the person activates it. Needs at least one step and a verified sender domain.","x-human-only":true,"security":[{"SessionCookie":[]}],"parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional mutation key. All HTTP responses are replayable for 24 hours. If execution finishes ambiguously before the replay is stored, the key enters reconciliation and is never re-executed automatically. A key always identifies one immutable request; use a new key for a new action after remediation."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SequenceResponse"}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}}}},"/sequences/{id}/pause":{"post":{"tags":["sequences"],"summary":"Pause an active sequence: no sends and no new enrollments until a person resumes it","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional mutation key. All HTTP responses are replayable for 24 hours. If execution finishes ambiguously before the replay is stored, the key enters reconciliation and is never re-executed automatically. A key always identifies one immutable request; use a new key for a new action after remediation."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SequenceResponse"}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:write"]}},"/sequences/{id}/metrics":{"get":{"tags":["sequences"],"summary":"Per-step funnel and people active, completed and stopped","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Sequence metrics","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/SequenceMetrics"}},"additionalProperties":false}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:read"]}},"/sequences/{id}/steps":{"post":{"tags":["sequences"],"summary":"Add a step; two steps cannot share a delay","description":"In a draft, subject and body may be left empty and written later; activating needs every step to have a subject and a body. An active sequence only takes complete steps.","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional mutation key. All HTTP responses are replayable for 24 hours. If execution finishes ambiguously before the replay is stored, the key enters reconciliation and is never re-executed automatically. A key always identifies one immutable request; use a new key for a new action after remediation."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["delay_days"],"properties":{"subject":{"type":"string"},"preview_text":{"type":["string","null"]},"body":{"type":"string","maxLength":50000,"description":"Plain text. Blank lines separate paragraphs; a line starting with ## is a heading, - starts a bullet, a line that is only ![alt](https://...) is an image, and bare URLs and [label](https://...) links become links. Everything else is shown as written."},"delay_days":{"type":"integer","minimum":0,"maximum":365},"template_id":{"type":["string","null"],"description":"null uses the sequence's template"}},"additionalProperties":false}}}},"responses":{"201":{"description":"Step created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SequenceStepResponse"}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:write"]}},"/sequences/{id}/steps/{stepId}":{"patch":{"tags":["sequences"],"summary":"Edit a step; applies to people who have not received it yet","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"stepId","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional mutation key. All HTTP responses are replayable for 24 hours. If execution finishes ambiguously before the replay is stored, the key enters reconciliation and is never re-executed automatically. A key always identifies one immutable request; use a new key for a new action after remediation."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"subject":{"type":"string"},"preview_text":{"type":["string","null"]},"body":{"type":"string","maxLength":50000,"description":"Plain text. Blank lines separate paragraphs; a line starting with ## is a heading, - starts a bullet, a line that is only ![alt](https://...) is an image, and bare URLs and [label](https://...) links become links. Everything else is shown as written."},"delay_days":{"type":"integer","minimum":0,"maximum":365},"template_id":{"type":["string","null"],"description":"null uses the sequence's template"}},"additionalProperties":false}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SequenceStepResponse"}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:write"]},"delete":{"tags":["sequences"],"summary":"Delete a step","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"stepId","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional mutation key. All HTTP responses are replayable for 24 hours. If execution finishes ambiguously before the replay is stored, the key enters reconciliation and is never re-executed automatically. A key always identifies one immutable request; use a new key for a new action after remediation."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:write"]}},"/sequences/{id}/steps/{stepId}/preview":{"post":{"tags":["sequences"],"summary":"Render a step with the workspace template and brand","description":"Pass subject, preview_text, body or template_id to preview unsaved changes, and subscriber_id or email to render merge tags as that person (with the data of their latest occurrence of the event that starts the sequence). A read: viewers and workspace:read keys may call it.","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"stepId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"subject":{"type":"string"},"preview_text":{"type":["string","null"]},"body":{"type":"string","maxLength":50000,"description":"Plain text. Blank lines separate paragraphs; a line starting with ## is a heading, - starts a bullet, a line that is only ![alt](https://...) is an image, and bare URLs and [label](https://...) links become links. Everything else is shown as written."},"template_id":{"type":["string","null"]},"subscriber_id":{"type":"string","description":"Render merge tags as this subscriber."},"email":{"type":"string","format":"email","description":"Render merge tags as the subscriber with this address."}},"additionalProperties":false}}}},"responses":{"200":{"description":"Rendered step","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","required":["subject","html","plain","merge_tags","rendered_as"],"properties":{"subject":{"type":"string"},"html":{"type":"string"},"plain":{"type":"string"},"merge_tags":{"type":"array","items":{"type":"object","required":["key","fallback"],"properties":{"key":{"type":"string"},"fallback":{"type":["string","null"]}},"additionalProperties":false}},"rendered_as":{"type":["object","null"],"description":"Whom the merge tags were rendered as: the subscriber asked for, otherwise the first active one; null when there is nobody, and each tag shows its fallback or the tag itself.","properties":{"subscriber_id":{"type":"string"},"email":{"type":"string"}}}},"additionalProperties":false}},"additionalProperties":false}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:read"]}},"/sequences/{id}/steps/{stepId}/test-send":{"post":{"tags":["sequences"],"summary":"Email a test copy of a step to one address","description":"Same rules as newsletter test copies: verified sender domain, no credits, shared daily limit, inert unsubscribe link. Merge tags render as the subscriber with that address when there is one, otherwise with their fallbacks.","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"stepId","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional mutation key. All HTTP responses are replayable for 24 hours. If execution finishes ambiguously before the replay is stored, the key enters reconciliation and is never re-executed automatically. A key always identifies one immutable request; use a new key for a new action after remediation."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["to"],"properties":{"to":{"type":"string"}},"additionalProperties":false}}}},"responses":{"200":{"description":"Test copy accepted by the provider","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","required":["to","subject"],"properties":{"to":{"type":"string"},"subject":{"type":"string"},"provider_id":{"type":["string","null"]}},"additionalProperties":false}},"additionalProperties":false}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"429":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"502":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"503":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:write"]}},"/events":{"get":{"tags":["events"],"summary":"List the events that can start a sequence","description":"The built-in events first: signup_confirmed (someone confirms through the signup form) and subscriber_added (someone is added by an import, the API, an upsert, the dashboard or an event with subscribe; an import fires it for every person it adds), then custom events.","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."}],"responses":{"200":{"description":"Events","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","required":["items"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/Event"}}},"additionalProperties":false}},"additionalProperties":false}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}}},"post":{"tags":["events"],"summary":"Create a custom event","description":"The key is derived from the name (\"First purchase\" becomes first_purchase); 409 when the workspace already has it.","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional mutation key. All HTTP responses are replayable for 24 hours. If execution finishes ambiguously before the replay is stored, the key enters reconciliation and is never re-executed automatically. A key always identifies one immutable request; use a new key for a new action after remediation."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["name"],"properties":{"name":{"type":"string","minLength":1,"maxLength":80},"description":{"type":["string","null"],"maxLength":500}},"additionalProperties":false}}}},"responses":{"201":{"description":"Event created","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/Event"}},"additionalProperties":false}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}}}},"/events/{key}":{"delete":{"tags":["events"],"summary":"Delete a custom event","description":"409 while a sequence that is not archived starts with it; 400 for the built-in event.","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"key","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional mutation key. All HTTP responses are replayable for 24 hours. If execution finishes ambiguously before the replay is stored, the key enters reconciliation and is never re-executed automatically. A key always identifies one immutable request; use a new key for a new action after remediation."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}}}},"/events/{key}/occurrences":{"post":{"tags":["events"],"summary":"Fire a custom event for one person","description":"Enrolls the person in every active sequence the event starts, at most once per sequence, and records the call (the events dataset). Call it from your server with the API key, never from browser code. data (a JSON object up to 8 KB) reaches the sequence emails as {{event.path}} merge tags, such as {{event.order.total}}. fields updates the person like PATCH /subscribers/{id} and tags adds tags by name, in any status. Without subscribe, an unknown address joins nothing; with subscribe: true it is added as active (source event, which also fires subscriber_added) and you are responsible for having the person's consent. Unsubscribed, bounced and complained addresses are never made active again. Skipped calls still answer 200 with enrolled 0 and a reason, so a webhook does not retry. 400 for a built-in event.","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"key","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional mutation key. All HTTP responses are replayable for 24 hours. If execution finishes ambiguously before the replay is stored, the key enters reconciliation and is never re-executed automatically. A key always identifies one immutable request; use a new key for a new action after remediation."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string","format":"email"},"subscriber_id":{"type":"string"},"data":{"type":["object","null"],"additionalProperties":true,"description":"Any JSON object up to 8 KB; nested objects are read with dots."},"fields":{"type":"object","description":"A patch of contact fields: the keys given are set, null removes a key, the rest stay. Contact fields: an object of lowercase snake_case keys (^[a-z][a-z0-9_]{0,39}$, at most 50) whose values are text up to 500 characters, numbers or booleans. Reserved keys: email, name, status, event, id, subscriber_id, workspace_id, language, tags, fields, source, subscribed_at, unsubscribed_at, created_at, updated_at, unsubscribe_url.","additionalProperties":{"type":["string","number","boolean","null"]}},"subscribe":{"type":"boolean","default":false},"tags":{"type":"array","maxItems":20,"items":{"type":"string","minLength":1,"maxLength":50},"description":"Tag names; missing tags are created."}},"additionalProperties":false}}}},"responses":{"200":{"description":"What the event did","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/EventOccurrenceResult"}},"additionalProperties":false}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}}}},"/events/{key}/inbound/rotate":{"post":{"tags":["events"],"summary":"Make a new inbound URL for a custom event","description":"Returns the URL once; only its hash is stored. The previous URL stops working; the mapping stays. Use it where no server of your own can call the API: a no-code tool or a payment provider posts JSON to it. 400 for the built-in event.","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"key","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional mutation key. All HTTP responses are replayable for 24 hours. If execution finishes ambiguously before the replay is stored, the key enters reconciliation and is never re-executed automatically. A key always identifies one immutable request; use a new key for a new action after remediation."}],"responses":{"200":{"description":"The new URL","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","required":["url","inbound"],"properties":{"url":{"type":"string","format":"uri","description":"POST https://.../hooks/events/ih_...; a secret: anyone with it can fire the event."},"inbound":{"$ref":"#/components/schemas/EventInbound"}},"additionalProperties":false}},"additionalProperties":false}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}}}},"/events/{key}/inbound":{"patch":{"tags":["events"],"summary":"Map incoming JSON to the event","description":"email_path and data_path are dot paths such as data.object.customer_details.email or items.0.email; null goes back to the default. data_path picks the event data read by {{event.*}} merge tags: a JSON object of at most 8 KB. subscribe adds unknown addresses as subscribers.","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"key","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional mutation key. All HTTP responses are replayable for 24 hours. If execution finishes ambiguously before the replay is stored, the key enters reconciliation and is never re-executed automatically. A key always identifies one immutable request; use a new key for a new action after remediation."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"email_path":{"type":["string","null"],"maxLength":200},"data_path":{"type":["string","null"],"maxLength":200},"subscribe":{"type":"boolean"}},"additionalProperties":false}}}},"responses":{"200":{"description":"Inbound settings","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","required":["inbound"],"properties":{"inbound":{"$ref":"#/components/schemas/EventInbound"}},"additionalProperties":false}},"additionalProperties":false}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}}},"delete":{"tags":["events"],"summary":"Turn the inbound URL off","description":"The mapping and the last payload stay; rotating makes a new URL.","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"key","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional mutation key. All HTTP responses are replayable for 24 hours. If execution finishes ambiguously before the replay is stored, the key enters reconciliation and is never re-executed automatically. A key always identifies one immutable request; use a new key for a new action after remediation."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}}}},"/hooks/events/{token}":{"post":{"tags":["events"],"summary":"Fire a custom event from any JSON (inbound URL)","description":"Public; the token is the credential. Accepts any JSON up to 64 KB, finds the email with the event mapping and fires the event for that person. Answers 200 even when nothing fired (reason no_email, not_a_subscriber, ...); event data that is not a JSON object of at most 8 KB is dropped with data_dropped: true and the event still fires, so senders do not retry; 400 when the body is not JSON or nests deeper than 32 levels; 413 above 64 KB; 404 for an unknown or turned-off URL; 429 above 120 requests a minute per URL.","servers":[{"url":"/"}],"security":[],"parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"responses":{"200":{"description":"Received","content":{"application/json":{"schema":{"type":"object","required":["received","enrolled","reason"],"properties":{"received":{"type":"boolean","enum":[true]},"enrolled":{"type":"integer"},"reason":{"type":["string","null"]}},"additionalProperties":false}}}},"400":{"description":"Not JSON","content":{"application/json":{"schema":{"type":"object","required":["received","error"],"properties":{"received":{"type":"boolean","enum":[false]},"error":{"type":"string"}},"additionalProperties":false}}}},"404":{"description":"Unknown URL","content":{"application/json":{"schema":{"type":"object","required":["received","error"],"properties":{"received":{"type":"boolean","enum":[false]},"error":{"type":"string"}},"additionalProperties":false}}}},"413":{"description":"Too large","content":{"application/json":{"schema":{"type":"object","required":["received","error"],"properties":{"received":{"type":"boolean","enum":[false]},"error":{"type":"string"}},"additionalProperties":false}}}},"429":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}}}},"/templates":{"get":{"tags":["templates"],"summary":"List the starter templates and the latest active custom versions","description":"Starters the workspace removed are left out; pass include_hidden=true to list them too, marked hidden. Retired system templates (system-briefing-v1, system-research-v1, system-showcase-v1, system-letter-v1, system-minimal-v1, system-editorial-v1, system-magazine-v1, system-digest-v1, system-executive-v1) are not listed but still render and can be used.","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"include_hidden","in":"query","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Template list","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"$ref":"#/components/schemas/EmailTemplateSummary"}}},"additionalProperties":false}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:read"]},"post":{"tags":["templates"],"summary":"Create a custom template family","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional mutation key. All HTTP responses are replayable for 24 hours. If execution finishes ambiguously before the replay is stored, the key enters reconciliation and is never re-executed automatically. A key always identifies one immutable request; use a new key for a new action after remediation."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["name","html"],"properties":{"name":{"type":"string","minLength":1,"maxLength":100},"description":{"type":["string","null"],"maxLength":500},"html":{"type":"string"},"css":{"type":"string"}},"additionalProperties":false}}}},"responses":{"201":{"description":"Template created","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/EmailTemplateDetail"}},"additionalProperties":false}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:write"]}},"/templates/restore-starters":{"post":{"tags":["templates"],"summary":"Bring back every starter this workspace removed","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional mutation key. All HTTP responses are replayable for 24 hours. If execution finishes ambiguously before the replay is stored, the key enters reconciliation and is never re-executed automatically. A key always identifies one immutable request; use a new key for a new action after remediation."}],"responses":{"200":{"description":"Starters restored","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","required":["restored"],"properties":{"restored":{"type":"integer"}},"additionalProperties":false}},"additionalProperties":false}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:write"]}},"/templates/preview":{"post":{"tags":["templates"],"summary":"Render a system, saved custom, or unsaved custom template without persistence","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"oneOf":[{"type":"object","required":["template_id"],"properties":{"workspaceId":{"type":"string"},"template_id":{"type":"string"}},"additionalProperties":false},{"type":"object","required":["html","css"],"properties":{"workspaceId":{"type":"string"},"html":{"type":"string"},"css":{"type":"string"}},"additionalProperties":false}]}}}},"responses":{"200":{"description":"Rendered template sample","content":{"application/json":{"schema":{"type":"object","required":["html"],"properties":{"html":{"type":"string"}},"additionalProperties":false}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:read"]}},"/templates/{id}":{"get":{"tags":["templates"],"summary":"Get an exact template version","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Template","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/EmailTemplateDetail"}},"additionalProperties":false}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:read"]},"patch":{"tags":["templates"],"summary":"Create a new immutable version","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional mutation key. All HTTP responses are replayable for 24 hours. If execution finishes ambiguously before the replay is stored, the key enters reconciliation and is never re-executed automatically. A key always identifies one immutable request; use a new key for a new action after remediation."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100},"description":{"type":["string","null"],"maxLength":500},"html":{"type":"string"},"css":{"type":"string"}},"additionalProperties":false}}}},"responses":{"201":{"description":"Template version created","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/EmailTemplateDetail"}},"additionalProperties":false}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:write"]},"delete":{"tags":["templates"],"summary":"Remove a template from the gallery","description":"Archives every version of a custom template, or hides a starter for this workspace only. Newsletters and sequences that already use it keep rendering with it.","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional mutation key. All HTTP responses are replayable for 24 hours. If execution finishes ambiguously before the replay is stored, the key enters reconciliation and is never re-executed automatically. A key always identifies one immutable request; use a new key for a new action after remediation."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:write"]}},"/templates/{id}/duplicate":{"post":{"tags":["templates"],"summary":"Duplicate a system or custom template into a new family","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional mutation key. All HTTP responses are replayable for 24 hours. If execution finishes ambiguously before the replay is stored, the key enters reconciliation and is never re-executed automatically. A key always identifies one immutable request; use a new key for a new action after remediation."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100},"description":{"type":["string","null"],"maxLength":500}},"additionalProperties":false}}}},"responses":{"201":{"description":"Template duplicated","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/EmailTemplateDetail"}},"additionalProperties":false}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:write"]}},"/assets":{"get":{"tags":["assets"],"summary":"List workspace image assets","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."}],"responses":{"200":{"description":"Asset list","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"$ref":"#/components/schemas/BrandAsset"}}},"additionalProperties":false}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:read"]},"post":{"tags":["assets"],"summary":"Upload a PNG, JPEG, or WebP image up to 5MB","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional mutation key. All HTTP responses are replayable for 24 hours. If execution finishes ambiguously before the replay is stored, the key enters reconciliation and is never re-executed automatically. A key always identifies one immutable request; use a new key for a new action after remediation."}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","required":["file"],"properties":{"file":{"type":"string","format":"binary"}},"additionalProperties":false}}}},"responses":{"201":{"description":"Asset uploaded","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/BrandAsset"}},"additionalProperties":false}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"413":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"415":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:write"]}},"/assets/logo":{"delete":{"tags":["assets"],"summary":"Clear the active workspace logo","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional mutation key. All HTTP responses are replayable for 24 hours. If execution finishes ambiguously before the replay is stored, the key enters reconciliation and is never re-executed automatically. A key always identifies one immutable request; use a new key for a new action after remediation."}],"responses":{"200":{"description":"Logo cleared","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","required":["logo_url"],"properties":{"logo_url":{"type":"null"}},"additionalProperties":false}},"additionalProperties":false}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:write"]}},"/assets/{id}":{"get":{"tags":["assets"],"summary":"Read a public image asset","servers":[{"url":"/"}],"security":[],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"PNG, JPEG, or WebP image bytes","content":{"image/png":{"schema":{"type":"string","format":"binary"}},"image/jpeg":{"schema":{"type":"string","format":"binary"}},"image/webp":{"schema":{"type":"string","format":"binary"}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}}},"delete":{"tags":["assets"],"summary":"Delete a workspace asset","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional mutation key. All HTTP responses are replayable for 24 hours. If execution finishes ambiguously before the replay is stored, the key enters reconciliation and is never re-executed automatically. A key always identifies one immutable request; use a new key for a new action after remediation."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:write"]}},"/assets/{id}/logo":{"post":{"tags":["assets"],"summary":"Set a workspace asset as the active logo","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional mutation key. All HTTP responses are replayable for 24 hours. If execution finishes ambiguously before the replay is stored, the key enters reconciliation and is never re-executed automatically. A key always identifies one immutable request; use a new key for a new action after remediation."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{},"additionalProperties":false}}}},"responses":{"200":{"description":"Logo selected","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","required":["logo_url","asset"],"properties":{"logo_url":{"type":"string","format":"uri"},"asset":{"$ref":"#/components/schemas/BrandAsset"}},"additionalProperties":false}},"additionalProperties":false}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:write"]}},"/signup-form":{"get":{"tags":["signup-forms"],"summary":"Read the signup form and the code to paste into a website","description":"Every workspace has a form; the first read creates it with defaults. It takes signups even before the sending domain is verified.","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignupFormSettingsResponse"}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:read"]},"put":{"tags":["signup-forms"],"summary":"Change the signup form","description":"Only the fields sent change. A blank text or color goes back to its default.","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional mutation key. All HTTP responses are replayable for 24 hours. If execution finishes ambiguously before the replay is stored, the key enters reconciliation and is never re-executed automatically. A key always identifies one immutable request; use a new key for a new action after remediation."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"defaultLanguage":{"type":"string","enum":["es","en"]},"privacyUrl":{"type":"string","maxLength":2048,"description":"HTTPS address of the privacy policy, or empty for no consent line."},"accentColor":{"type":["string","null"],"pattern":"^#[0-9a-fA-F]{6}$","description":"Button color; blank uses the brand color."},"heading":{"type":["string","null"],"maxLength":120},"description":{"type":["string","null"],"maxLength":300},"thankYouMessage":{"type":["string","null"],"maxLength":300}},"additionalProperties":false}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignupFormSettingsResponse"}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:write"]}},"/newsletters":{"get":{"tags":["newsletters"],"summary":"List newsletters","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"page","in":"query","required":false,"schema":{"type":"integer"}},{"name":"pageSize","in":"query","required":false,"schema":{"type":"integer"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer"}},{"name":"status","in":"query","required":false,"schema":{"type":"string","enum":["draft","ready","sent"]}},{"name":"tag","in":"query","required":false,"schema":{"type":"string","description":"A tag id, or all for newsletters sent to every active subscriber."}},{"name":"sort","in":"query","required":false,"schema":{"type":"string","enum":["subject","status","sent","opens","date"],"default":"date"}},{"name":"order","in":"query","required":false,"schema":{"type":"string","enum":["asc","desc"],"default":"desc"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NewsletterPageResponse"}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:read"]},"post":{"tags":["newsletters"],"summary":"Create a draft newsletter","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional mutation key. All HTTP responses are replayable for 24 hours. If execution finishes ambiguously before the replay is stored, the key enters reconciliation and is never re-executed automatically. A key always identifies one immutable request; use a new key for a new action after remediation."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"workspaceId":{"type":"string"},"subject":{"type":"string"},"preview_text":{"type":"string"},"body":{"type":"string","maxLength":50000,"description":"Plain text. Blank lines separate paragraphs; a line starting with ## is a heading, - starts a bullet, a line that is only ![alt](https://...) is an image, and bare URLs and [label](https://...) links become links. Everything else is shown as written."},"template_id":{"type":"string"},"scheduled_for":{"type":["string","null"],"format":"date-time"},"send_to_all":{"type":"boolean"},"tag_ids":{"type":"array","items":{"type":"string"}},"language":{"type":"string","enum":["es","en"],"description":"Language of the email's own words (footer, unsubscribe). Defaults to the signup form language."},"generation_config":{"type":["object","null"],"deprecated":true}},"additionalProperties":false}}}},"responses":{"201":{"description":"Newsletter created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NewsletterResponse"}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:write"]}},"/newsletters/reach":{"get":{"tags":["newsletters"],"summary":"Count the distinct active subscribers an audience reaches","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"all","in":"query","required":false,"schema":{"type":"string","enum":["true","false"]}},{"name":"tagIds","in":"query","required":false,"schema":{"type":"string","description":"Comma-separated tag ids."}}],"responses":{"200":{"description":"Distinct subscribers reached","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","required":["subscribers"],"properties":{"subscribers":{"type":"integer"}},"additionalProperties":false}},"additionalProperties":false}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:read"]}},"/newsletters/{id}":{"get":{"tags":["newsletters"],"summary":"Get a newsletter","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NewsletterResponse"}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:read"]},"patch":{"tags":["newsletters"],"summary":"Update a draft or ready newsletter","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional mutation key. All HTTP responses are replayable for 24 hours. If execution finishes ambiguously before the replay is stored, the key enters reconciliation and is never re-executed automatically. A key always identifies one immutable request; use a new key for a new action after remediation."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"subject":{"type":["string","null"]},"preview_text":{"type":["string","null"]},"template_id":{"type":"string"},"scheduled_for":{"type":["string","null"],"format":"date-time"},"body":{"type":"string","maxLength":50000,"description":"Plain text. Blank lines separate paragraphs; a line starting with ## is a heading, - starts a bullet, a line that is only ![alt](https://...) is an image, and bare URLs and [label](https://...) links become links. Everything else is shown as written."},"send_to_all":{"type":"boolean"},"tag_ids":{"type":"array","items":{"type":"string"}},"generation_config":{"type":["object","string","null"],"deprecated":true}},"additionalProperties":false}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NewsletterResponse"}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:write"]},"delete":{"tags":["newsletters"],"summary":"Delete an unsent newsletter","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional mutation key. All HTTP responses are replayable for 24 hours. If execution finishes ambiguously before the replay is stored, the key enters reconciliation and is never re-executed automatically. A key always identifies one immutable request; use a new key for a new action after remediation."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:write"]}},"/newsletters/{id}/preview":{"post":{"tags":["newsletters"],"summary":"Render unsaved local overrides without mutating the draft","description":"Merge tags render as subscriber_id or email when given (404 when there is no such subscriber), otherwise as the first active subscriber. missing_fields counts, over the current audience, the recipients without a value for each tag that has no fallback: approval refuses while it is not empty.","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"subject":{"type":["string","null"]},"preview_text":{"type":["string","null"]},"body":{"type":"string","maxLength":50000,"description":"Plain text. Blank lines separate paragraphs; a line starting with ## is a heading, - starts a bullet, a line that is only ![alt](https://...) is an image, and bare URLs and [label](https://...) links become links. Everything else is shown as written."},"template_id":{"type":"string"},"subscriber_id":{"type":"string","description":"Render merge tags as this subscriber."},"email":{"type":"string","format":"email","description":"Render merge tags as the subscriber with this address."}},"additionalProperties":false}}}},"responses":{"200":{"description":"Rendered email","content":{"application/json":{"schema":{"type":"object","required":["subject","html","plain","merge_tags","missing_fields","rendered_as"],"properties":{"subject":{"type":"string"},"html":{"type":"string"},"plain":{"type":"string"},"merge_tags":{"type":"array","items":{"type":"object","required":["key","fallback"],"properties":{"key":{"type":"string"},"fallback":{"type":["string","null"]}},"additionalProperties":false}},"missing_fields":{"type":"object","additionalProperties":{"type":"integer"}},"rendered_as":{"type":["object","null"],"description":"Whom the merge tags were rendered as: the subscriber asked for, otherwise the first active one; null when there is nobody, and each tag shows its fallback or the tag itself.","properties":{"subscriber_id":{"type":"string"},"email":{"type":"string"}}}},"additionalProperties":false}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:read"]}},"/newsletters/{id}/test-send":{"post":{"tags":["newsletters"],"summary":"Email a test copy of the issue to one address","description":"Renders the stored issue and sends it from the workspace sender to a single recipient. Requires a verified sender domain, consumes no credits, and leaves the status unchanged. Unsubscribe links in the copy are inert. Merge tags render as the subscriber with that address when there is one, otherwise with their fallbacks.","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional mutation key. All HTTP responses are replayable for 24 hours. If execution finishes ambiguously before the replay is stored, the key enters reconciliation and is never re-executed automatically. A key always identifies one immutable request; use a new key for a new action after remediation."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["to"],"properties":{"to":{"type":"string"}},"additionalProperties":false}}}},"responses":{"200":{"description":"Test copy accepted by the provider","content":{"application/json":{"schema":{"type":"object","required":["to","subject"],"properties":{"to":{"type":"string"},"subject":{"type":"string"},"provider_id":{"type":["string","null"]}},"additionalProperties":false}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"502":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"503":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:write"]}},"/newsletters/{id}/approve":{"post":{"tags":["newsletters"],"summary":"Approve a draft newsletter (status becomes ready); needs a subject, a body, and send_to_all or at least one tag","description":"While some recipients have no value for a merge tag without a fallback, answers 400 with code MISSING_MERGE_FIELDS and details { key: recipients without it }. Add a fallback ({{first_name|there}}), fill the fields, or pass allow_missing_fields: true to send those tags empty.","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional mutation key. All HTTP responses are replayable for 24 hours. If execution finishes ambiguously before the replay is stored, the key enters reconciliation and is never re-executed automatically. A key always identifies one immutable request; use a new key for a new action after remediation."}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"allow_missing_fields":{"type":"boolean","default":false},"workspaceId":{"type":"string"}},"additionalProperties":false}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NewsletterResponse"}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:write"]}},"/newsletters/{id}/send":{"post":{"tags":["newsletters"],"summary":"Send a ready newsletter now","description":"A large audience goes out in parts: this call sends the first and answers 202 with sending true, sentTo so far and remaining; the rest follows by itself every five minutes. Do not call it again; follow send-status.","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional mutation key. All HTTP responses are replayable for 24 hours. If execution finishes ambiguously before the replay is stored, the key enters reconciliation and is never re-executed automatically. A key always identifies one immutable request; use a new key for a new action after remediation."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NewsletterSendResponse"}}}},"202":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NewsletterSendResponse"}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"500":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:write"]}},"/newsletters/{id}/send-status":{"get":{"tags":["newsletters"],"summary":"Inspect durable delivery and reconciliation state","description":"Returns batch status and provider attempt identifiers without recipient payloads.","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NewsletterSendStatusResponse"}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:read"]}},"/newsletters/{id}/reconcile":{"post":{"tags":["newsletters"],"summary":"Reconcile one ambiguous provider batch after external confirmation","description":"Inspect send-status and confirm the provider result before choosing accepted or rejected. When all ambiguous batches are resolved, this operation resumes and finalizes delivery. Use a new Idempotency-Key for each distinct reconciliation attempt.","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional mutation key. All HTTP responses are replayable for 24 hours. If execution finishes ambiguously before the replay is stored, the key enters reconciliation and is never re-executed automatically. A key always identifies one immutable request; use a new key for a new action after remediation."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["decision","batchIndex","note"],"properties":{"workspaceId":{"type":"string"},"decision":{"type":"string","enum":["accepted","rejected"]},"batchIndex":{"type":"integer","minimum":0},"note":{"type":"string","minLength":1,"maxLength":1000}},"additionalProperties":false}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NewsletterSendReconciliationResponse"}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:write"]}},"/metrics":{"get":{"tags":["metrics"],"summary":"Get aggregate delivery metrics","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"range","in":"query","required":false,"schema":{"type":"string","enum":["7d","30d","90d","all"]}},{"name":"days","in":"query","required":false,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Metric summary","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/MetricSummary"}},"additionalProperties":false}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:read"]}},"/metrics/newsletter/{id}":{"get":{"tags":["metrics"],"summary":"Get newsletter delivery metrics","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Newsletter metrics","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/NewsletterMetricDetail"}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:read"]}},"/metrics/history":{"get":{"tags":["metrics"],"summary":"Get newsletter metric history","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Metric history","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"$ref":"#/components/schemas/MetricHistoryItem"}}},"additionalProperties":false}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:read"]}},"/metrics/top-links":{"get":{"tags":["metrics"],"summary":"Get most-clicked links","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"days","in":"query","required":false,"schema":{"type":"integer"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Top links","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"$ref":"#/components/schemas/TopLink"}}},"additionalProperties":false}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:read"]}},"/data":{"get":{"tags":["data"],"summary":"Data dictionary: datasets, columns, parameters and caveats","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."}],"responses":{"200":{"description":"Data dictionary","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}}}},"/data/summary":{"get":{"tags":["data"],"summary":"Ready-made aggregates: engagement by tag, sequence funnels with step-to-step change, engagement segments and weekly growth","description":"Plain numbers, no judgments. Rates are 0 to 1 next to their counts, null when the denominator is empty; opens and clicks are over tracked emails.","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"days","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":365,"default":90}}],"responses":{"200":{"description":"Summary","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}}}},"/data/{dataset}":{"get":{"tags":["data"],"summary":"Export one page of a raw dataset","description":"Datasets: emails (one row per email per person), subscribers, sends (per newsletter and sequence step), links, tags. Columns are described at GET /data. The next page cursor is in the X-Next-Cursor header (next_cursor with format=json); no cursor means the last page. Email addresses only with include_email=true.","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"dataset","in":"path","required":true,"schema":{"type":"string","enum":["emails","subscribers","sends","links","tags","events"]}},{"name":"format","in":"query","required":false,"schema":{"type":"string","enum":["jsonl","csv","json"],"default":"jsonl"}},{"name":"since","in":"query","required":false,"schema":{"type":"string","description":"ISO date or timestamp, inclusive."}},{"name":"until","in":"query","required":false,"schema":{"type":"string","description":"ISO date or timestamp, exclusive."}},{"name":"cursor","in":"query","required":false,"schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":5000,"default":1000}},{"name":"include_email","in":"query","required":false,"schema":{"type":"string","enum":["true","false"],"default":"false"}}],"responses":{"200":{"description":"Rows as JSON Lines, CSV or JSON","headers":{"X-Next-Cursor":{"schema":{"type":"string"},"description":"Cursor for the next page; absent on the last page."}},"content":{"application/x-ndjson":{"schema":{"type":"string"}},"text/csv":{"schema":{"type":"string"}},"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","required":["rows","next_cursor"],"properties":{"rows":{"type":"array","items":{"type":"object","additionalProperties":true}},"next_cursor":{"type":["string","null"]}},"additionalProperties":false}},"additionalProperties":false}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}}}},"/alerts":{"get":{"tags":["alerts"],"summary":"List alerts","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"unreadOnly","in":"query","required":false,"schema":{"type":"boolean"}},{"name":"unread_only","in":"query","required":false,"schema":{"type":"boolean"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Alert list","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"$ref":"#/components/schemas/Alert"}}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:read"]}},"/alerts/{id}/read":{"patch":{"tags":["alerts"],"summary":"Mark an alert read","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional mutation key. All HTTP responses are replayable for 24 hours. If execution finishes ambiguously before the replay is stored, the key enters reconciliation and is never re-executed automatically. A key always identifies one immutable request; use a new key for a new action after remediation."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:write"]}},"/alerts/read-all":{"post":{"tags":["alerts"],"summary":"Mark all alerts read","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional mutation key. All HTTP responses are replayable for 24 hours. If execution finishes ambiguously before the replay is stored, the key enters reconciliation and is never re-executed automatically. A key always identifies one immutable request; use a new key for a new action after remediation."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:write"]}},"/alerts/{id}":{"delete":{"tags":["alerts"],"summary":"Delete an alert","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional mutation key. All HTTP responses are replayable for 24 hours. If execution finishes ambiguously before the replay is stored, the key enters reconciliation and is never re-executed automatically. A key always identifies one immutable request; use a new key for a new action after remediation."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:write"]}},"/webhooks/events":{"get":{"tags":["webhooks"],"summary":"List the events an endpoint can listen to","description":"Each delivery body is a WebhookEnvelope; see the webhooks section of this document for each type.","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."}],"responses":{"200":{"description":"Webhook event catalog","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","required":["items"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/WebhookEventCatalogEntry"}}},"additionalProperties":false}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:read"]}},"/webhooks":{"get":{"tags":["webhooks"],"summary":"List outgoing webhooks","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."}],"responses":{"200":{"description":"Webhook list","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"$ref":"#/components/schemas/WebhookEndpoint"}}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:read"]},"post":{"tags":["webhooks"],"summary":"Register an outgoing webhook","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional mutation key. All HTTP responses are replayable for 24 hours. If execution finishes ambiguously before the replay is stored, the key enters reconciliation and is never re-executed automatically. A key always identifies one immutable request; use a new key for a new action after remediation."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["url","events"],"properties":{"url":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"events":{"type":"array","minItems":1,"maxItems":20,"items":{"type":"string","enum":["subscriber.created","subscriber.updated","subscriber.unsubscribed","subscriber.bounced","subscriber.complained","email.clicked","sequence.enrolled","sequence.completed","newsletter.sent","event.occurred","webhook.test"]}},"description":{"type":["string","null"],"maxLength":1000},"workspaceId":{"type":"string"}},"additionalProperties":false}}}},"responses":{"201":{"description":"Webhook registered","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/WebhookEndpoint"}},"additionalProperties":false}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:write"]}},"/webhooks/{id}":{"get":{"tags":["webhooks"],"summary":"Get a webhook","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Webhook","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/WebhookEndpoint"}},"additionalProperties":false}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:read"]},"patch":{"tags":["webhooks"],"summary":"Update a webhook","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional mutation key. All HTTP responses are replayable for 24 hours. If execution finishes ambiguously before the replay is stored, the key enters reconciliation and is never re-executed automatically. A key always identifies one immutable request; use a new key for a new action after remediation."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"events":{"type":"array","minItems":1,"maxItems":20,"items":{"type":"string","enum":["subscriber.created","subscriber.updated","subscriber.unsubscribed","subscriber.bounced","subscriber.complained","email.clicked","sequence.enrolled","sequence.completed","newsletter.sent","event.occurred","webhook.test"]}},"description":{"type":["string","null"],"maxLength":1000},"enabled":{"type":"boolean"}},"additionalProperties":false}}}},"responses":{"200":{"description":"Webhook updated","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/WebhookEndpoint"}},"additionalProperties":false}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:write"]},"delete":{"tags":["webhooks"],"summary":"Delete a webhook and its delivery log","description":"To pause one and keep its log, PATCH it with enabled false.","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional mutation key. All HTTP responses are replayable for 24 hours. If execution finishes ambiguously before the replay is stored, the key enters reconciliation and is never re-executed automatically. A key always identifies one immutable request; use a new key for a new action after remediation."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:write"]}},"/webhooks/{id}/rotate":{"post":{"tags":["webhooks"],"summary":"Rotate a webhook signing secret","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional mutation key. All HTTP responses are replayable for 24 hours. If execution finishes ambiguously before the replay is stored, the key enters reconciliation and is never re-executed automatically. A key always identifies one immutable request; use a new key for a new action after remediation."}],"responses":{"200":{"description":"Rotated webhook secret","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/WebhookEndpoint"}},"additionalProperties":false}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:write"]}},"/webhooks/{id}/deliveries":{"get":{"tags":["webhooks"],"summary":"List webhook deliveries","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Webhook delivery list","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"$ref":"#/components/schemas/WebhookDelivery"}}},"additionalProperties":false}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:read"]}},"/webhooks/{id}/test":{"post":{"tags":["webhooks"],"summary":"Queue a test webhook delivery","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional mutation key. All HTTP responses are replayable for 24 hours. If execution finishes ambiguously before the replay is stored, the key enters reconciliation and is never re-executed automatically. A key always identifies one immutable request; use a new key for a new action after remediation."}],"responses":{"202":{"description":"Test queued","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","required":["deliveryIds"],"properties":{"deliveryIds":{"type":"array","items":{"type":"string"}}},"additionalProperties":false}},"additionalProperties":false}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:write"]}},"/domains":{"get":{"tags":["domains"],"summary":"List sender domains","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."}],"responses":{"200":{"description":"Domain list","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"$ref":"#/components/schemas/Domain"}}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:read"]},"post":{"tags":["domains"],"summary":"Register a sender domain","description":"Open and click tracking starts on. When the provider needs a tracking record it is listed in dns_records with purpose tracking.","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional mutation key. All HTTP responses are replayable for 24 hours. If execution finishes ambiguously before the replay is stored, the key enters reconciliation and is never re-executed automatically. A key always identifies one immutable request; use a new key for a new action after remediation."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["domain"],"properties":{"domain":{"type":"string","minLength":3,"maxLength":253}},"additionalProperties":false}}}},"responses":{"201":{"description":"Domain registered","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/Domain"}},"additionalProperties":false}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"502":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"503":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:write"]}},"/domains/{id}":{"get":{"tags":["domains"],"summary":"Get a sender domain","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Domain","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/Domain"}},"additionalProperties":false}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:read"]},"delete":{"tags":["domains"],"summary":"Delete a sender domain","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional mutation key. All HTTP responses are replayable for 24 hours. If execution finishes ambiguously before the replay is stored, the key enters reconciliation and is never re-executed automatically. A key always identifies one immutable request; use a new key for a new action after remediation."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:write"]}},"/domains/{id}/verify":{"post":{"tags":["domains"],"summary":"Refresh domain verification","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional mutation key. All HTTP responses are replayable for 24 hours. If execution finishes ambiguously before the replay is stored, the key enters reconciliation and is never re-executed automatically. A key always identifies one immutable request; use a new key for a new action after remediation."}],"responses":{"200":{"description":"Domain verification refreshed","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/Domain"}},"additionalProperties":false}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"502":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"503":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:write"]}},"/domains/{id}/tracking":{"post":{"tags":["domains"],"summary":"Turn open and click tracking on or off","description":"Tracking does not change what you pay. Turning it on may list a tracking record to publish; it never blocks sending.","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional mutation key. All HTTP responses are replayable for 24 hours. If execution finishes ambiguously before the replay is stored, the key enters reconciliation and is never re-executed automatically. A key always identifies one immutable request; use a new key for a new action after remediation."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["enabled"],"properties":{"enabled":{"type":"boolean"}},"additionalProperties":false}}}},"responses":{"200":{"description":"Domain tracking changed","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/Domain"}},"additionalProperties":false}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"502":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"503":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:write"]}},"/admin/access":{"get":{"tags":["admin"],"summary":"Check platform-admin access","security":[{"SessionCookie":[]}],"responses":{"200":{"description":"Admin access","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","required":["authorized"],"properties":{"authorized":{"type":"boolean"}},"additionalProperties":false}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}}}},"/admin/overview":{"get":{"tags":["admin"],"summary":"Get platform delivery and prepaid funding overview","security":[{"SessionCookie":[]}],"parameters":[{"name":"range","in":"query","required":false,"schema":{"type":"string","enum":["7d","30d","90d","all"],"default":"30d"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminOverviewResponse"}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}}}},"/admin/tenants":{"get":{"tags":["admin"],"summary":"List tenant prepaid funding and delivery health","security":[{"SessionCookie":[]}],"parameters":[{"name":"search","in":"query","required":false,"schema":{"type":"string"}},{"name":"fundingStatus","in":"query","required":false,"schema":{"type":"string","enum":["credits_available","depleted","never_paid"]}},{"name":"deliveryStatus","in":"query","required":false,"schema":{"type":"string","enum":["healthy","warning","critical","no_data"]}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100,"default":50}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"maximum":100000,"default":0}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminTenantListResponse"}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}}}},"/admin/tenants/{id}":{"get":{"tags":["admin"],"summary":"Get tenant operational detail","security":[{"SessionCookie":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminTenantDetailResponse"}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}}}},"/admin/tenants/{id}/topups":{"get":{"tags":["admin"],"summary":"List local tenant top-ups with optional verified receipts","security":[{"SessionCookie":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100,"default":50}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"maximum":100000,"default":0}},{"name":"includeReceipts","in":"query","required":false,"schema":{"type":"boolean","default":false}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminTopupListResponse"}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}}}},"/admin/feedback":{"get":{"tags":["admin"],"summary":"List the latest feedback across workspaces","security":[{"SessionCookie":[]}],"responses":{"200":{"description":"Latest 100 pieces of feedback","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","required":["items"],"properties":{"items":{"type":"array","items":{"type":"object","additionalProperties":true}}},"additionalProperties":false}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}}}},"/admin/feedback/{id}/files/{n}":{"get":{"tags":["admin"],"summary":"Read one screenshot attached to a piece of feedback","security":[{"SessionCookie":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"n","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The image","content":{"image/png":{"schema":{"type":"string","format":"binary"}},"image/jpeg":{"schema":{"type":"string","format":"binary"}},"image/webp":{"schema":{"type":"string","format":"binary"}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}}}},"/feedback":{"post":{"tags":["feedback"],"summary":"Report a bug or send an idea to the Djinnletter team","description":"Stored and emailed to the founders. JSON, or multipart/form-data with the same fields and up to three screenshots (PNG, JPEG or WebP, 5 MB each). Any workspace member can send it, and so can a key with workspace:write, for its person. At most 20 per workspace a day (429).","x-required-scopes":["workspace:write"],"parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["kind","message"],"properties":{"kind":{"type":"string","enum":["bug","idea","other"]},"message":{"type":"string","minLength":1,"maxLength":5000},"score":{"type":["integer","null"],"minimum":0,"maximum":10,"description":"How likely the person is to recommend Djinnletter."},"page":{"type":["string","null"],"maxLength":300,"description":"Where in the dashboard or API it happened."},"workspaceId":{"type":"string"}},"additionalProperties":false}},"multipart/form-data":{"schema":{"type":"object","required":["kind","message"],"properties":{"kind":{"type":"string","enum":["bug","idea","other"]},"message":{"type":"string"},"score":{"type":"integer","minimum":0,"maximum":10},"page":{"type":"string"},"screenshots":{"type":"array","maxItems":3,"items":{"type":"string","format":"binary"}}}}}}},"responses":{"201":{"description":"Feedback received","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","required":["id"],"properties":{"id":{"type":"string"}},"additionalProperties":false}},"additionalProperties":false}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"413":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"415":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"429":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}}}},"/billing/account":{"get":{"tags":["billing"],"summary":"Get prepaid balance, card, auto-recharge, and activity","description":"Credits never expire: the balance stays until it is spent on emails or taken back by a refund.","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BillingAccountResponse"}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:read"]}},"/billing/topups":{"post":{"tags":["billing"],"summary":"Start a credit purchase; amountEur excludes VAT, which Stripe Tax adds. The invoice is issued once the payment succeeds","security":[{"SessionCookie":[]}],"parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["amountEur"],"properties":{"amountEur":{"type":"integer","minimum":1,"maximum":10000},"country":{"type":"string","pattern":"^[A-Za-z]{2}$","description":"Buyer country for VAT (ISO 3166-1 alpha-2). Saved as the billing country when it differs. Left out, the saved billing details are used."},"vatId":{"type":["string","null"],"description":"EU VAT ID with country prefix, only for EU countries"},"postalCode":{"type":["string","null"],"description":"Only needed where Stripe Tax requires it (US, CA)"}},"additionalProperties":false}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BillingTopupResponse"}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"502":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"503":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:write"]}},"/billing/topups/{topupId}/confirm":{"post":{"tags":["billing"],"summary":"Settle a top-up right after the card payment succeeded in the browser: grants the credits and issues the invoice without waiting for the webhook. Safe to repeat","security":[{"SessionCookie":[]}],"parameters":[{"name":"topupId","in":"path","required":true,"schema":{"type":"string"}},{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BillingTopupConfirmResponse"}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"502":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"503":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:write"]}},"/billing/details":{"put":{"tags":["billing"],"summary":"Set the billing details Stripe Tax uses for VAT (owner only)","security":[{"SessionCookie":[]}],"parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["country"],"properties":{"country":{"type":"string","pattern":"^[A-Za-z]{2}$","description":"ISO 3166-1 alpha-2 country code"},"postalCode":{"type":["string","null"]},"name":{"type":["string","null"],"description":"Business or person name"},"vatId":{"type":["string","null"],"description":"EU VAT ID with country prefix. Only accepted for EU countries; businesses in other EU countries pay 0% (reverse charge) with a valid ID."}},"additionalProperties":false}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BillingDetailsResponse"}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"502":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"503":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:write"]}},"/billing/invoices":{"get":{"tags":["billing"],"summary":"List paid credit invoices with PDF links","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BillingInvoiceListResponse"}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"502":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:read"]}},"/billing/tax-preview":{"get":{"tags":["billing"],"summary":"Preview VAT and the total charged for a top-up","parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."},{"name":"amountEur","in":"query","required":true,"schema":{"type":"integer","minimum":1,"maximum":10000}},{"name":"country","in":"query","required":false,"schema":{"type":"string","pattern":"^[A-Za-z]{2}$"}},{"name":"vatId","in":"query","required":false,"schema":{"type":"string"}},{"name":"postalCode","in":"query","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BillingTaxPreviewResponse"}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"502":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"503":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:read"]}},"/billing/payment-method/setup":{"post":{"tags":["billing"],"summary":"Prepare a reusable card for auto-recharge; with autoRechargeAmountEur, saving the card also turns auto-recharge on","security":[{"SessionCookie":[]}],"parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"country":{"type":"string","pattern":"^[A-Za-z]{2}$","description":"Buyer country for VAT (ISO 3166-1 alpha-2). Saved as the billing country when it differs. Left out, the saved billing details are used."},"vatId":{"type":["string","null"],"description":"EU VAT ID with country prefix, only for EU countries"},"postalCode":{"type":["string","null"],"description":"Only needed where Stripe Tax requires it (US, CA)"},"autoRechargeAmountEur":{"type":"integer","minimum":1,"maximum":10000},"autoRechargeThresholdCredits":{"type":"integer","minimum":0,"maximum":10000000}},"additionalProperties":false}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BillingPaymentMethodSetupResponse"}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"502":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"503":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:write"]}},"/billing/payment-method/confirm":{"post":{"tags":["billing"],"summary":"Save the card a SetupIntent confirmed in the browser, without waiting for the webhook. Safe to repeat","security":[{"SessionCookie":[]}],"parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["setupIntentId"],"properties":{"setupIntentId":{"type":"string"}},"additionalProperties":false}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BillingPaymentMethodConfirmResponse"}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"404":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"502":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"503":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:write"]}},"/billing/auto-recharge":{"patch":{"tags":["billing"],"summary":"Configure auto-recharge: the amount added and the balance that triggers it","security":[{"SessionCookie":[]}],"parameters":[{"name":"workspaceId","in":"query","required":false,"schema":{"type":"string"},"description":"Required for human sessions; API keys are pinned to one workspace."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["enabled"],"properties":{"enabled":{"type":"boolean"},"amountEur":{"type":"integer","minimum":1,"maximum":10000},"thresholdCredits":{"type":"integer","minimum":0,"maximum":10000000,"description":"Recharge once the balance falls to this many credits. Left out, the saved threshold is kept."}},"additionalProperties":false}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BillingAutoRechargeResponse"}}}},"400":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"401":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"403":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}},"409":{"description":"Request failed","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}},"x-required-scopes":["workspace:write"]}}}}