{"openapi":"3.1.0","info":{"title":"EuroMail API","description":"Transactional email API for European developers. GDPR-compliant with EU data residency.\n\nAuthenticate by passing your API key in the `X-EuroMail-Api-Key` header.","contact":{"name":"EuroMail","url":"https://euromail.dev"},"license":{"name":"Proprietary"},"version":"1.0.0"},"paths":{"/v1/account":{"get":{"tags":["Account"],"summary":"GET /v1/account - Get current account info and quota usage","operationId":"get_account","responses":{"200":{"description":"Account details with quota usage","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccountResponse"}}}},"401":{"description":"Unauthorized"}},"security":[{"api_key":[]}]},"delete":{"tags":["Account"],"summary":"DELETE /v1/account - GDPR account deletion","description":"Requires `X-Confirm-Delete: DELETE` header.\nDeactivates the account immediately and enqueues cascading data deletion.","operationId":"delete_account","responses":{"202":{"description":"Account deletion accepted"},"400":{"description":"Missing X-Confirm-Delete header"},"401":{"description":"Unauthorized"}},"security":[{"api_key":[]}]}},"/v1/account/export":{"get":{"tags":["Account"],"summary":"GET /v1/account/export - GDPR data export","description":"Returns a JSON export of all account data (no email bodies).\nRate limited to 1 per hour via Redis key.","operationId":"export_account","responses":{"200":{"description":"GDPR data export"},"401":{"description":"Unauthorized"},"429":{"description":"Export rate limited (1 per hour)"}},"security":[{"api_key":[]}]}},"/v1/analytics/domains":{"get":{"tags":["Analytics"],"summary":"GET /v1/analytics/domains","description":"Returns email stats aggregated by recipient domain.","operationId":"get_domains","parameters":[{"name":"period","in":"query","description":"Period shorthand: 7d, 30d, 90d","required":false,"schema":{"type":"string"}},{"name":"from","in":"query","description":"Start date","required":false,"schema":{"type":"string"}},{"name":"to","in":"query","description":"End date","required":false,"schema":{"type":"string"}},{"name":"limit","in":"query","description":"Number of top domains (default: 10)","required":false,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"Top domains by volume"},"400":{"description":"Invalid parameters"},"401":{"description":"Unauthorized"}},"security":[{"api_key":[]}]}},"/v1/analytics/export":{"get":{"tags":["Analytics"],"summary":"GET /v1/analytics/export","description":"Export daily analytics as CSV download.","operationId":"export_csv","parameters":[{"name":"period","in":"query","description":"Period shorthand: 7d, 30d, 90d","required":false,"schema":{"type":"string"}},{"name":"from","in":"query","description":"Start date","required":false,"schema":{"type":"string"}},{"name":"to","in":"query","description":"End date","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"CSV file download","content":{"text/csv":{}}},"400":{"description":"Invalid parameters"},"401":{"description":"Unauthorized"}},"security":[{"api_key":[]}]}},"/v1/analytics/overview":{"get":{"tags":["Analytics"],"summary":"GET /v1/analytics/overview","description":"Returns summary statistics (totals + rates) for the authenticated account.","operationId":"get_overview","parameters":[{"name":"period","in":"query","description":"Period shorthand: 7d, 30d, 90d (default: 30d)","required":false,"schema":{"type":"string"}},{"name":"from","in":"query","description":"Start date (YYYY-MM-DD)","required":false,"schema":{"type":"string"}},{"name":"to","in":"query","description":"End date (YYYY-MM-DD)","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Analytics summary"},"400":{"description":"Invalid parameters"},"401":{"description":"Unauthorized"}},"security":[{"api_key":[]}]}},"/v1/analytics/timeseries":{"get":{"tags":["Analytics"],"summary":"GET /v1/analytics/timeseries","description":"Returns daily stats over time for charting.","operationId":"get_timeseries","parameters":[{"name":"period","in":"query","description":"Period shorthand: 7d, 30d, 90d","required":false,"schema":{"type":"string"}},{"name":"from","in":"query","description":"Start date","required":false,"schema":{"type":"string"}},{"name":"to","in":"query","description":"End date","required":false,"schema":{"type":"string"}},{"name":"metrics","in":"query","description":"Comma-separated: sent,delivered,bounced,opens,clicks","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Timeseries data points"},"400":{"description":"Invalid parameters"},"401":{"description":"Unauthorized"}},"security":[{"api_key":[]}]}},"/v1/audit-logs":{"get":{"tags":["Audit"],"summary":"GET /v1/audit-logs","operationId":"list_audit_logs","parameters":[{"name":"page","in":"query","description":"Page number (default: 1)","required":false,"schema":{"type":"integer","format":"int64"}},{"name":"per_page","in":"query","description":"Items per page (default: 25)","required":false,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"Paginated list of audit log entries"},"401":{"description":"Unauthorized"}},"security":[{"api_key":[]}]}},"/v1/billing/plans":{"get":{"tags":["Billing"],"summary":"List all available plans with their prices and limits.","operationId":"list_plans","responses":{"200":{"description":"Available billing plans"}}}},"/v1/billing/subscription":{"get":{"tags":["Billing"],"summary":"Get the current account's subscription status.","operationId":"get_subscription","responses":{"200":{"description":"Current subscription details"},"401":{"description":"Unauthorized"}},"security":[{"api_key":[]}]}},"/v1/contact-lists":{"get":{"tags":["Contact Lists"],"summary":"GET /v1/contact-lists","operationId":"list_contact_lists","responses":{"200":{"description":"List of contact lists with contact counts"},"401":{"description":"Unauthorized"}},"security":[{"api_key":[]}]},"post":{"tags":["Contact Lists"],"summary":"POST /v1/contact-lists","operationId":"create_contact_list","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateContactListRequest"}}},"required":true},"responses":{"201":{"description":"Contact list created","content":{"application/json":{"schema":{}}}},"401":{"description":"Unauthorized"},"409":{"description":"List name already exists"},"422":{"description":"Validation error"}},"security":[{"api_key":[]}]}},"/v1/contact-lists/{id}":{"get":{"tags":["Contact Lists"],"summary":"GET /v1/contact-lists/{id}","operationId":"get_contact_list","parameters":[{"name":"id","in":"path","description":"Contact list ID","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Contact list details with contact count"},"401":{"description":"Unauthorized"},"404":{"description":"Contact list not found"}},"security":[{"api_key":[]}]},"put":{"tags":["Contact Lists"],"summary":"PUT /v1/contact-lists/{id}","operationId":"update_contact_list","parameters":[{"name":"id","in":"path","description":"Contact list ID","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateContactListRequest"}}},"required":true},"responses":{"200":{"description":"Contact list updated"},"401":{"description":"Unauthorized"},"404":{"description":"Contact list not found"},"409":{"description":"List name already exists"}},"security":[{"api_key":[]}]},"delete":{"tags":["Contact Lists"],"summary":"DELETE /v1/contact-lists/{id}","operationId":"delete_contact_list","parameters":[{"name":"id","in":"path","description":"Contact list ID","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":"Contact list deleted"},"401":{"description":"Unauthorized"},"404":{"description":"Contact list not found"}},"security":[{"api_key":[]}]}},"/v1/contact-lists/{id}/contacts":{"get":{"tags":["Contact Lists"],"summary":"GET /v1/contact-lists/{id}/contacts","operationId":"list_contacts","parameters":[{"name":"id","in":"path","description":"Contact list ID","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"page","in":"query","description":"Page number (default: 1)","required":false,"schema":{"type":"integer","format":"int64"}},{"name":"per_page","in":"query","description":"Items per page","required":false,"schema":{"type":"integer","format":"int64"}},{"name":"status","in":"query","description":"Filter by status","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Paginated list of contacts"},"401":{"description":"Unauthorized"},"404":{"description":"Contact list not found"}},"security":[{"api_key":[]}]},"post":{"tags":["Contact Lists"],"summary":"POST /v1/contact-lists/{id}/contacts","operationId":"add_contacts","parameters":[{"name":"id","in":"path","description":"Contact list ID","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddContactRequest"}}},"required":true},"responses":{"201":{"description":"Contact(s) added"},"401":{"description":"Unauthorized"},"404":{"description":"Contact list not found"},"409":{"description":"Contact already exists in list"},"422":{"description":"Invalid email address"}},"security":[{"api_key":[]}]}},"/v1/contact-lists/{id}/contacts/{email}":{"delete":{"tags":["Contact Lists"],"summary":"DELETE /v1/contact-lists/{id}/contacts/{email}","operationId":"remove_contact","parameters":[{"name":"id","in":"path","description":"Contact list ID","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"email","in":"path","description":"Contact email address","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"Contact removed"},"401":{"description":"Unauthorized"},"404":{"description":"Contact or list not found"}},"security":[{"api_key":[]}]}},"/v1/dead-letters":{"get":{"tags":["Dead Letters"],"summary":"GET /v1/dead-letters","operationId":"list_dead_letters","parameters":[{"name":"count","in":"query","description":"Number of items to return (default: 50, max: 200)","required":false,"schema":{"type":"integer","minimum":0}}],"responses":{"200":{"description":"List of dead letter messages"},"401":{"description":"Unauthorized"}},"security":[{"api_key":[]}]}},"/v1/dead-letters/{id}":{"delete":{"tags":["Dead Letters"],"summary":"DELETE /v1/dead-letters/{id}","operationId":"delete_dead_letter","parameters":[{"name":"id","in":"path","description":"Stream ID of the dead letter","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"Dead letter deleted"},"401":{"description":"Unauthorized"}},"security":[{"api_key":[]}]}},"/v1/dead-letters/{id}/retry":{"post":{"tags":["Dead Letters"],"summary":"POST /v1/dead-letters/{id}/retry","operationId":"retry_dead_letter","parameters":[{"name":"id","in":"path","description":"Stream ID of the dead letter","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Dead letter re-enqueued for retry"},"401":{"description":"Unauthorized"}},"security":[{"api_key":[]}]}},"/v1/domains":{"get":{"tags":["Domains"],"summary":"GET /v1/domains","operationId":"list_domains","parameters":[{"name":"page","in":"query","description":"Page number (default: 1)","required":false,"schema":{"type":"integer","format":"int64"}},{"name":"per_page","in":"query","description":"Items per page (default: 25)","required":false,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"Paginated list of registered domains","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Domain"}}}}},"401":{"description":"Unauthorized"}},"security":[{"api_key":[]}]},"post":{"tags":["Domains"],"summary":"POST /v1/domains - Register a new domain and generate DKIM keys","operationId":"add_domain","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddDomainRequest"}}},"required":true},"responses":{"201":{"description":"Domain registered with DNS records. The envelope is `{ data }`, plus an optional `warnings` array of strings when the domain was accepted but something about it is worth flagging — currently a name that already carries the sending subdomain.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Domain"}}}},"401":{"description":"Unauthorized"},"409":{"description":"Domain already registered"}},"security":[{"api_key":[]}]}},"/v1/domains/{id}":{"get":{"tags":["Domains"],"summary":"GET /v1/domains/:id","operationId":"get_domain","parameters":[{"name":"id","in":"path","description":"Domain ID","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Domain details","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Domain"}}}},"401":{"description":"Unauthorized"},"404":{"description":"Domain not found"}},"security":[{"api_key":[]}]},"delete":{"tags":["Domains"],"summary":"DELETE /v1/domains/:id","operationId":"delete_domain","parameters":[{"name":"id","in":"path","description":"Domain ID","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":"Domain deleted"},"401":{"description":"Unauthorized"},"404":{"description":"Domain not found"}},"security":[{"api_key":[]}]}},"/v1/domains/{id}/tracking-domain":{"put":{"tags":["Domains"],"summary":"PUT /v1/domains/:id/tracking-domain — Set the vanity tracking domain.","operationId":"set_tracking_domain","parameters":[{"name":"id","in":"path","description":"Domain ID","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetTrackingDomainRequest"}}},"required":true},"responses":{"200":{"description":"Tracking domain set","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Domain"}}}},"401":{"description":"Unauthorized"},"404":{"description":"Domain not found"},"409":{"description":"Tracking domain already in use"}},"security":[{"api_key":[]}]},"delete":{"tags":["Domains"],"summary":"DELETE /v1/domains/:id/tracking-domain — Remove the vanity tracking domain.","operationId":"remove_tracking_domain","parameters":[{"name":"id","in":"path","description":"Domain ID","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Tracking domain removed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Domain"}}}},"401":{"description":"Unauthorized"},"404":{"description":"Domain not found"}},"security":[{"api_key":[]}]}},"/v1/domains/{id}/verify":{"post":{"tags":["Domains"],"summary":"POST /v1/domains/:id/verify - Trigger DNS verification","operationId":"verify_domain","parameters":[{"name":"id","in":"path","description":"Domain ID","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"DNS verification results","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Domain"}}}},"401":{"description":"Unauthorized"},"404":{"description":"Domain not found"}},"security":[{"api_key":[]}]}},"/v1/domains/{id}/verify-tracking":{"post":{"tags":["Domains"],"summary":"POST /v1/domains/:id/verify-tracking — Verify the tracking domain CNAME.","operationId":"verify_tracking_domain","parameters":[{"name":"id","in":"path","description":"Domain ID","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Tracking domain verification result"},"401":{"description":"Unauthorized"},"404":{"description":"Domain not found"},"422":{"description":"No tracking domain configured"}},"security":[{"api_key":[]}]}},"/v1/emails":{"get":{"tags":["Emails"],"summary":"GET /v1/emails - List emails with pagination and filters","operationId":"list_emails","parameters":[{"name":"page","in":"query","description":"Page number (default: 1)","required":false,"schema":{"type":"integer","format":"int64"}},{"name":"per_page","in":"query","description":"Items per page (default: 25)","required":false,"schema":{"type":"integer","format":"int64"}},{"name":"status","in":"query","description":"Filter by status (queued, sent, bounced, failed)","required":false,"schema":{"type":"string"}},{"name":"from_date","in":"query","description":"Filter from date (ISO 8601)","required":false,"schema":{"type":"string"}},{"name":"to_date","in":"query","description":"Filter to date (ISO 8601)","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Paginated list of emails","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Email"}}}}},"401":{"description":"Unauthorized"}},"security":[{"api_key":[]}]},"post":{"tags":["Emails"],"summary":"POST /v1/emails - Send a single email","operationId":"send_email","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SendEmailRequest"}}},"required":true},"responses":{"202":{"description":"Email accepted for delivery","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SendEmailResponse"}}}},"401":{"description":"Unauthorized"},"422":{"description":"Validation error"},"429":{"description":"Rate limit or quota exceeded"}},"security":[{"api_key":[]}]}},"/v1/emails/batch":{"post":{"tags":["Emails"],"summary":"POST /v1/emails/batch - Send up to 500 emails in a single request","description":"Send up to 500 emails in a single request. Returns an operation_id for tracking, a data array of queued emails, and an errors array for any per-email validation failures. Partial success is supported.","operationId":"send_batch","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchEmailRequest"}}},"required":true},"responses":{"202":{"description":"Batch accepted for delivery","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchEmailResponse"}}}},"401":{"description":"Unauthorized"},"422":{"description":"Validation error"},"429":{"description":"Rate limit or quota exceeded"}},"security":[{"api_key":[]}]}},"/v1/emails/{id}":{"get":{"tags":["Emails"],"summary":"GET /v1/emails/:id - Get email details with events","operationId":"get_email","parameters":[{"name":"id","in":"path","description":"Email ID","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Email details with events","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Email"}}}},"401":{"description":"Unauthorized"},"404":{"description":"Email not found"}},"security":[{"api_key":[]}]}},"/v1/emails/{id}/cancel":{"post":{"tags":["Emails"],"operationId":"cancel_scheduled_email","parameters":[{"name":"id","in":"path","description":"Email ID","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Scheduled email cancelled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SendEmailResponse"}}}},"401":{"description":"Unauthorized"},"404":{"description":"Email not found or not in scheduled status"}},"security":[{"api_key":[]}]}},"/v1/emails/{id}/links":{"get":{"tags":["Emails"],"summary":"GET /v1/emails/{id}/links - Per-link click statistics for an email","operationId":"get_email_links","parameters":[{"name":"id","in":"path","description":"Email ID","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Per-link click statistics","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/LinkClickStat"}}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden"},"404":{"description":"Email not found"}},"security":[{"api_key":[]}]}},"/v1/inbound":{"get":{"tags":["Inbound"],"summary":"GET /v1/inbound - List inbound emails for the authenticated account","operationId":"list_inbound_emails","parameters":[{"name":"page","in":"query","description":"Page number (default: 1)","required":false,"schema":{"type":"integer","format":"int64"}},{"name":"per_page","in":"query","description":"Items per page (default: 25)","required":false,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"Paginated list of inbound emails"},"401":{"description":"Unauthorized"}},"security":[{"api_key":[]}]}},"/v1/inbound/{id}":{"get":{"tags":["Inbound"],"summary":"GET /v1/inbound/:id - Get a single inbound email by ID","operationId":"get_inbound_email","parameters":[{"name":"id","in":"path","description":"Inbound email ID","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Inbound email details"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"}},"security":[{"api_key":[]}]},"delete":{"tags":["Inbound"],"summary":"DELETE /v1/inbound/:id - Delete a single inbound email","operationId":"delete_inbound_email","parameters":[{"name":"id","in":"path","description":"Inbound email ID","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":"Inbound email deleted"},"401":{"description":"Unauthorized"},"404":{"description":"Not found"}},"security":[{"api_key":[]}]}},"/v1/insights/generate":{"post":{"tags":["insights"],"summary":"Trigger insights generation","description":"Immediately generate an AI-powered operational insights report for the account. Capped at one generation per 24 hours. Requires `account:admin` scope.","operationId":"trigger_generation","responses":{"200":{"description":"Report generated"},"429":{"description":"Already generated within 24 hours"},"503":{"description":"ANTHROPIC_API_KEY not configured"}},"security":[{"api_key":[]}]}},"/v1/signup-forms":{"get":{"tags":["Signup Forms"],"summary":"GET /v1/signup-forms","operationId":"list_signup_forms","responses":{"200":{"description":"List of signup forms","content":{"application/json":{"schema":{}}}},"401":{"description":"Unauthorized"}},"security":[{"api_key":[]}]},"post":{"tags":["Signup Forms"],"summary":"POST /v1/signup-forms","operationId":"create_signup_form","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSignupFormRequest"}}},"required":true},"responses":{"201":{"description":"Signup form created","content":{"application/json":{"schema":{}}}},"401":{"description":"Unauthorized"},"404":{"description":"Contact list not found"},"409":{"description":"A signup form already exists for this list"},"422":{"description":"Validation error"}},"security":[{"api_key":[]}]}},"/v1/signup-forms/{id}":{"get":{"tags":["Signup Forms"],"summary":"GET /v1/signup-forms/{id}","operationId":"get_signup_form","parameters":[{"name":"id","in":"path","description":"Signup form ID","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Signup form details","content":{"application/json":{"schema":{}}}},"401":{"description":"Unauthorized"},"404":{"description":"Signup form not found"}},"security":[{"api_key":[]}]},"put":{"tags":["Signup Forms"],"summary":"PUT /v1/signup-forms/{id}","operationId":"update_signup_form","parameters":[{"name":"id","in":"path","description":"Signup form ID","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateSignupFormRequest"}}},"required":true},"responses":{"200":{"description":"Signup form updated","content":{"application/json":{"schema":{}}}},"401":{"description":"Unauthorized"},"404":{"description":"Signup form not found"},"422":{"description":"Validation error"}},"security":[{"api_key":[]}]},"delete":{"tags":["Signup Forms"],"summary":"DELETE /v1/signup-forms/{id}","operationId":"delete_signup_form","parameters":[{"name":"id","in":"path","description":"Signup form ID","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":"Signup form deleted"},"401":{"description":"Unauthorized"},"404":{"description":"Signup form not found"}},"security":[{"api_key":[]}]}},"/v1/signup-forms/{id}/toggle":{"post":{"tags":["Signup Forms"],"summary":"POST /v1/signup-forms/{id}/toggle","operationId":"toggle_signup_form","parameters":[{"name":"id","in":"path","description":"Signup form ID","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Signup form toggled","content":{"application/json":{"schema":{}}}},"401":{"description":"Unauthorized"},"404":{"description":"Signup form not found"}},"security":[{"api_key":[]}]}},"/v1/suppressions":{"get":{"tags":["Suppressions"],"summary":"GET /v1/suppressions","operationId":"list_suppressions","parameters":[{"name":"page","in":"query","description":"Page number (default: 1)","required":false,"schema":{"type":"integer","format":"int64"}},{"name":"per_page","in":"query","description":"Items per page (default: 25)","required":false,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"Paginated suppression list","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Suppression"}}}}},"401":{"description":"Unauthorized"}},"security":[{"api_key":[]}]},"post":{"tags":["Suppressions"],"summary":"POST /v1/suppressions","operationId":"create_suppression","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSuppressionRequest"}}},"required":true},"responses":{"201":{"description":"Address added to suppression list","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Suppression"}}}},"401":{"description":"Unauthorized"},"422":{"description":"Validation error"}},"security":[{"api_key":[]}]}},"/v1/suppressions/{email}":{"delete":{"tags":["Suppressions"],"summary":"DELETE /v1/suppressions/:email","operationId":"delete_suppression","parameters":[{"name":"email","in":"path","description":"Email address to remove from suppression list","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"Suppression removed"},"401":{"description":"Unauthorized"}},"security":[{"api_key":[]}]}},"/v1/templates":{"get":{"tags":["Templates"],"summary":"GET /v1/templates","operationId":"list_templates","parameters":[{"name":"page","in":"query","description":"Page number (default: 1)","required":false,"schema":{"type":"integer","format":"int64"}},{"name":"per_page","in":"query","description":"Items per page (default: 25)","required":false,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"Paginated list of templates","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Template"}}}}},"401":{"description":"Unauthorized"}},"security":[{"api_key":[]}]},"post":{"tags":["Templates"],"summary":"POST /v1/templates","operationId":"create_template","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTemplateRequest"}}},"required":true},"responses":{"201":{"description":"Template created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Template"}}}},"401":{"description":"Unauthorized"},"409":{"description":"Template alias already exists"}},"security":[{"api_key":[]}]}},"/v1/templates/{id}":{"get":{"tags":["Templates"],"summary":"GET /v1/templates/:id","operationId":"get_template","parameters":[{"name":"id","in":"path","description":"Template ID","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Template details","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Template"}}}},"401":{"description":"Unauthorized"},"404":{"description":"Template not found"}},"security":[{"api_key":[]}]},"put":{"tags":["Templates"],"summary":"PUT /v1/templates/:id","operationId":"update_template","parameters":[{"name":"id","in":"path","description":"Template ID","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTemplateRequest"}}},"required":true},"responses":{"200":{"description":"Template updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Template"}}}},"401":{"description":"Unauthorized"},"404":{"description":"Template not found"}},"security":[{"api_key":[]}]},"delete":{"tags":["Templates"],"summary":"DELETE /v1/templates/:id","operationId":"delete_template","parameters":[{"name":"id","in":"path","description":"Template ID","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":"Template deleted"},"401":{"description":"Unauthorized"},"404":{"description":"Template not found"}},"security":[{"api_key":[]}]}},"/v1/validate":{"post":{"tags":["Validation"],"summary":"POST /v1/validate - Validate an email address","operationId":"validate_email","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidateEmailRequest"}}},"required":true},"responses":{"200":{"description":"Validation result","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidateEmailResponse"}}}},"401":{"description":"Unauthorized"},"422":{"description":"Validation error"}},"security":[{"api_key":[]}]}},"/v1/webhooks":{"get":{"tags":["Webhooks"],"summary":"GET /v1/webhooks","operationId":"list_webhooks","parameters":[{"name":"page","in":"query","description":"Page number (default: 1)","required":false,"schema":{"type":"integer","format":"int64"}},{"name":"per_page","in":"query","description":"Items per page (default: 25)","required":false,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"Paginated list of webhooks","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Webhook"}}}}},"401":{"description":"Unauthorized"}},"security":[{"api_key":[]}]},"post":{"tags":["Webhooks"],"summary":"POST /v1/webhooks","operationId":"create_webhook","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateWebhookRequest"}}},"required":true},"responses":{"201":{"description":"Webhook created (signing secret returned only at creation)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Webhook"}}}},"401":{"description":"Unauthorized"},"422":{"description":"Invalid webhook URL"}},"security":[{"api_key":[]}]}},"/v1/webhooks/{id}":{"get":{"tags":["Webhooks"],"summary":"GET /v1/webhooks/:id","operationId":"get_webhook","parameters":[{"name":"id","in":"path","description":"Webhook ID","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Webhook details","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Webhook"}}}},"401":{"description":"Unauthorized"},"404":{"description":"Webhook not found"}},"security":[{"api_key":[]}]},"put":{"tags":["Webhooks"],"summary":"PUT /v1/webhooks/:id","operationId":"update_webhook","parameters":[{"name":"id","in":"path","description":"Webhook ID","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateWebhookRequest"}}},"required":true},"responses":{"200":{"description":"Webhook updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Webhook"}}}},"401":{"description":"Unauthorized"},"404":{"description":"Webhook not found"}},"security":[{"api_key":[]}]},"delete":{"tags":["Webhooks"],"summary":"DELETE /v1/webhooks/:id","operationId":"delete_webhook","parameters":[{"name":"id","in":"path","description":"Webhook ID","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":"Webhook deleted"},"401":{"description":"Unauthorized"},"404":{"description":"Webhook not found"}},"security":[{"api_key":[]}]}},"/v1/webhooks/{id}/test":{"post":{"tags":["Webhooks"],"summary":"POST /v1/webhooks/:id/test - Send a test webhook event","operationId":"test_webhook","parameters":[{"name":"id","in":"path","description":"Webhook ID","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Test event queued and will be delivered to the webhook URL"},"401":{"description":"Unauthorized"},"404":{"description":"Webhook not found"}},"security":[{"api_key":[]}]}}},"components":{"schemas":{"AccountResponse":{"type":"object","required":["id","name","email","plan","monthly_quota","emails_sent_this_month","quota_reset_at","created_at"],"properties":{"created_at":{"type":"string","format":"date-time"},"email":{"type":"string"},"emails_sent_this_month":{"type":"integer","format":"int64"},"id":{"type":"string","format":"uuid"},"monthly_quota":{"type":"integer","format":"int32","description":"Emails this account may send this period. This is the ceiling actually\nenforced, which is the free allowance until the first non-zero invoice\nsettles — it can therefore be lower than the plan's headline number."},"name":{"type":"string"},"plan":{"type":"string"},"quota_reset_at":{"type":"string","format":"date-time"}}},"AddContactRequest":{"type":"object","properties":{"contacts":{"type":["array","null"],"items":{"$ref":"#/components/schemas/BulkContact"}},"email":{"type":["string","null"]},"metadata":{}}},"AddDomainRequest":{"type":"object","required":["domain"],"properties":{"domain":{"type":"string"}}},"AttachmentRequest":{"type":"object","required":["filename","content","content_type"],"properties":{"content":{"type":"string","description":"Base64-encoded file content."},"content_type":{"type":"string"},"filename":{"type":"string"}}},"AuditLog":{"type":"object","required":["id","actor_type","actor_id","action","created_at"],"properties":{"account_id":{"type":["string","null"],"format":"uuid"},"action":{"type":"string"},"actor_id":{"type":"string"},"actor_type":{"type":"string"},"created_at":{"type":"string","format":"date-time"},"id":{"type":"string","format":"uuid"},"ip_address":{"type":["string","null"]},"metadata":{},"resource_id":{"type":["string","null"]},"resource_type":{"type":["string","null"]}}},"BatchEmailError":{"type":"object","required":["index","error"],"properties":{"error":{"type":"string"},"index":{"type":"integer","minimum":0}}},"BatchEmailRequest":{"type":"object","required":["emails"],"properties":{"emails":{"type":"array","items":{"$ref":"#/components/schemas/SendEmailRequest"}}}},"BatchEmailResponse":{"type":"object","required":["operation_id","data","errors"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/SendEmailResponse"}},"errors":{"type":"array","items":{"$ref":"#/components/schemas/BatchEmailError"}},"operation_id":{"type":"string","format":"uuid"}}},"BulkContact":{"type":"object","required":["email"],"properties":{"email":{"type":"string"},"metadata":{}}},"Contact":{"type":"object","required":["id","account_id","list_id","email","metadata","status","subscribed_at","created_at"],"properties":{"account_id":{"type":"string","format":"uuid"},"created_at":{"type":"string","format":"date-time"},"email":{"type":"string"},"id":{"type":"string","format":"uuid"},"list_id":{"type":"string","format":"uuid"},"metadata":{},"status":{"type":"string"},"subscribed_at":{"type":"string","format":"date-time"},"unsubscribed_at":{"type":["string","null"],"format":"date-time"},"welcome_email_sent_at":{"type":["string","null"],"format":"date-time"}}},"ContactList":{"type":"object","required":["id","account_id","name","double_opt_in","welcome_email_enabled","welcome_email_delay_seconds","created_at","updated_at"],"properties":{"account_id":{"type":"string","format":"uuid"},"created_at":{"type":"string","format":"date-time"},"description":{"type":["string","null"]},"double_opt_in":{"type":"boolean"},"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"updated_at":{"type":"string","format":"date-time"},"welcome_email_delay_seconds":{"type":"integer","format":"int32"},"welcome_email_enabled":{"type":"boolean"},"welcome_email_from_address":{"type":["string","null"]},"welcome_email_html_body":{"type":["string","null"]},"welcome_email_subject":{"type":["string","null"]},"welcome_email_template_id":{"type":["string","null"],"format":"uuid"},"welcome_email_text_body":{"type":["string","null"]}}},"CreateContactListRequest":{"type":"object","required":["name"],"properties":{"description":{"type":["string","null"]},"double_opt_in":{"type":"boolean"},"name":{"type":"string"}}},"CreateSignupFormRequest":{"type":"object","required":["list_id","title"],"properties":{"custom_fields":{"description":"Custom fields rendered on the form."},"description":{"type":["string","null"],"description":"Optional description shown below the title."},"from_address":{"type":["string","null"],"description":"From address for confirmation emails (e.g. noreply@yourdomain.com).\nMust use a verified domain. Defaults to noreply@<first verified domain>."},"list_id":{"type":"string","format":"uuid","description":"Contact list ID to attach this form to."},"messages":{"description":"Customizable UI messages for localization."},"redirect_url":{"type":["string","null"],"description":"URL to redirect to after subscription (overrides success_message)."},"success_message":{"type":["string","null"],"description":"Message displayed after successful subscription."},"theme":{"description":"Theme customization: bg_color, text_color, button_color, button_text_color,\nborder_color, accent_color, border_radius, font_family, embed, hide_branding."},"title":{"type":"string","description":"Form title displayed to subscribers."}}},"CreateSuppressionRequest":{"type":"object","required":["email_address"],"properties":{"email_address":{"type":"string"},"reason":{"type":["string","null"]}}},"CreateTemplateRequest":{"type":"object","required":["alias","name","subject"],"properties":{"alias":{"type":"string"},"html_body":{"type":["string","null"]},"name":{"type":"string"},"subject":{"type":"string"},"text_body":{"type":["string","null"]}}},"CreateWebhookRequest":{"type":"object","required":["url","events"],"properties":{"events":{"type":"array","items":{"type":"string"}},"url":{"type":"string"}}},"Deliverable":{"type":"string","description":"Deliverability assessment: \"yes\" if MX records found, \"no\" if invalid syntax\nor disposable, \"unknown\" if MX lookup failed or timed out.","enum":["yes","no","unknown"]},"Domain":{"type":"object","required":["id","account_id","domain","dkim_selector","sending_subdomain","spf_verified","dkim_verified","dmarc_verified","return_path_verified","dns_records","created_at","updated_at","mx_verified","inbound_enabled","tracking_domain_verified"],"properties":{"account_id":{"type":"string","format":"uuid"},"created_at":{"type":"string","format":"date-time"},"dkim_public_key":{"type":["string","null"]},"dkim_selector":{"type":"string"},"dkim_verified":{"type":"boolean"},"dmarc_verified":{"type":"boolean"},"dns_records":{},"domain":{"type":"string"},"id":{"type":"string","format":"uuid"},"inbound_enabled":{"type":"boolean"},"mx_verified":{"type":"boolean"},"mx_verified_at":{"type":["string","null"],"format":"date-time"},"return_path_verified":{"type":"boolean"},"sending_subdomain":{"type":"string"},"spf_verified":{"type":"boolean"},"tracking_domain":{"type":["string","null"]},"tracking_domain_verified":{"type":"boolean"},"tracking_domain_verified_at":{"type":["string","null"],"format":"date-time"},"updated_at":{"type":"string","format":"date-time"},"verified_at":{"type":["string","null"],"format":"date-time"}}},"Email":{"type":"object","required":["id","account_id","message_id","from_address","to_address","cc","bcc","subject","tags","status","attempts","max_attempts","suppress_list_management_header","created_at","updated_at"],"properties":{"account_id":{"type":"string","format":"uuid"},"attachments":{},"attempts":{"type":"integer","format":"int32"},"bcc":{"type":"array","items":{"type":"string"}},"cc":{"type":"array","items":{"type":"string"}},"created_at":{"type":"string","format":"date-time"},"delivery_started_at":{"type":["string","null"],"format":"date-time","description":"When the irreversible SMTP DATA phase began (H6 double-send fence).\n`None` = delivery not yet started, so crash recovery may safely re-queue;\n`Some` = the MX may have accepted, so recovery must not auto-resend."},"domain_id":{"type":["string","null"],"format":"uuid"},"error_message":{"type":["string","null"]},"from_address":{"type":"string"},"headers":{},"html_body":{"type":["string","null"]},"id":{"type":"string","format":"uuid"},"idempotency_key":{"type":["string","null"]},"max_attempts":{"type":"integer","format":"int32"},"message_id":{"type":"string"},"metadata":{},"next_retry_at":{"type":["string","null"],"format":"date-time"},"operation_id":{"type":["string","null"],"format":"uuid"},"reply_to":{"type":["string","null"]},"scheduled_at":{"type":["string","null"],"format":"date-time"},"sending_ip":{"type":["string","null"],"description":"The source IP address used to deliver this email (set after SMTP delivery)."},"sent_at":{"type":["string","null"],"format":"date-time"},"smtp_response":{"type":["string","null"]},"status":{"type":"string"},"stream_id":{"type":["string","null"],"format":"uuid"},"subject":{"type":"string"},"suppress_list_management_header":{"type":"boolean","description":"When true, omit List-Unsubscribe and List-Unsubscribe-Post headers"},"tags":{"type":"array","items":{"type":"string"}},"template_data":{},"template_id":{"type":["string","null"],"format":"uuid"},"text_body":{"type":["string","null"]},"to_address":{"type":"string"},"tracking_override":{"type":["boolean","null"],"description":"Per-email tracking override: None = use account default, Some(true) = force on, Some(false) = force off"},"updated_at":{"type":"string","format":"date-time"}}},"EmailEvent":{"type":"object","required":["id","email_id","account_id","event_type","created_at"],"properties":{"account_id":{"type":"string","format":"uuid"},"bounce_category":{"type":["string","null"]},"bounce_type":{"type":["string","null"]},"created_at":{"type":"string","format":"date-time"},"diagnostic_code":{"type":["string","null"]},"email_id":{"type":"string","format":"uuid"},"event_type":{"type":"string"},"id":{"type":"string","format":"uuid"},"ip_address":{"type":["string","null"]},"link_url":{"type":["string","null"]},"raw_payload":{},"remote_mta":{"type":["string","null"]},"user_agent":{"type":["string","null"]}}},"InboundEmail":{"type":"object","required":["id","account_id","domain_id","mail_from","rcpt_to","size_bytes","status","created_at","updated_at"],"properties":{"account_id":{"type":"string","format":"uuid"},"attachments":{},"cc_header":{"type":["string","null"]},"created_at":{"type":"string","format":"date-time"},"domain_id":{"type":"string","format":"uuid"},"error_message":{"type":["string","null"]},"from_header":{"type":["string","null"]},"html_body":{"type":["string","null"]},"id":{"type":"string","format":"uuid"},"mail_from":{"type":"string"},"message_id":{"type":["string","null"]},"raw_headers":{},"rcpt_to":{"type":"array","items":{"type":"string"}},"route_id":{"type":["string","null"],"format":"uuid"},"size_bytes":{"type":"integer","format":"int32"},"source_ip":{"type":["string","null"]},"spf_result":{"type":["string","null"]},"status":{"type":"string"},"subject":{"type":["string","null"]},"text_body":{"type":["string","null"]},"to_header":{"type":["string","null"]},"updated_at":{"type":"string","format":"date-time"},"webhook_delivered_at":{"type":["string","null"],"format":"date-time"}}},"LinkClickStat":{"type":"object","description":"Per-link click statistics for a single email.","required":["url","clicks","unique_clicks","last_clicked_at"],"properties":{"clicks":{"type":"integer","format":"int64","description":"Total number of clicks recorded for this URL."},"last_clicked_at":{"type":"string","format":"date-time","description":"Timestamp of the most recent click."},"unique_clicks":{"type":"integer","format":"int64","description":"Number of distinct UTC calendar days on which this URL was clicked."},"url":{"type":"string","description":"The original destination URL."}}},"OneOrMany":{"$ref":"#/components/schemas/OneOrManySchema","description":"Accepts a single string `\"user@example.com\"` or an array `[\"a@example.com\", \"b@example.com\"]`."},"OneOrManySchema":{"oneOf":[{"type":"object","required":["Single"],"properties":{"Single":{"type":"string"}}},{"type":"object","required":["Multiple"],"properties":{"Multiple":{"type":"array","items":{"type":"string"}}}}]},"SendEmailRequest":{"type":"object","required":["from","to"],"properties":{"attachments":{"type":["array","null"],"items":{"$ref":"#/components/schemas/AttachmentRequest"}},"bcc":{"type":"array","items":{"type":"string"}},"cc":{"type":"array","items":{"type":"string"}},"from":{"type":"string"},"headers":{},"html_body":{"type":["string","null"]},"idempotency_key":{"type":["string","null"],"description":"Optional idempotency key. If provided, a duplicate send with the same\nkey (per account) returns the original email instead of creating a new one."},"metadata":{},"reply_to":{"type":["string","null"]},"send_at":{"type":["string","null"],"format":"date-time"},"stream":{"type":["string","null"],"description":"Message stream slug. Routes this email through the named stream, enabling\nseparate reputation tracking for transactional vs. marketing email.\nDefaults to `\"transactional\"`. The stream must exist for the account."},"subject":{"type":["string","null"]},"tags":{"type":"array","items":{"type":"string"}},"template_alias":{"type":["string","null"]},"template_data":{},"text_body":{"type":["string","null"]},"to":{"$ref":"#/components/schemas/OneOrMany","description":"Single recipient `\"user@example.com\"` or multiple `[\"a@example.com\", \"b@example.com\"]`."},"tracking":{"type":["boolean","null"],"description":"Per-email tracking override. When `false`, disables open/click tracking\nfor this email even if the account has tracking enabled. When `true`,\nenables tracking even if the account default is off. Omit to use account default."},"transactional":{"type":"boolean","description":"Whether this is a transactional email (password reset, receipt, notification).\nWhen `true` (default), `List-Unsubscribe` headers are omitted so Gmail routes\nthe message to the Primary inbox instead of Promotions.\nSet to `false` for marketing or newsletter emails that need one-click unsubscribe."}}},"SendEmailResponse":{"type":"object","required":["id","message_id","status","to","sandbox","created_at"],"properties":{"created_at":{"type":"string","format":"date-time"},"id":{"type":"string","format":"uuid"},"message_id":{"type":"string"},"sandbox":{"type":"boolean"},"scheduled_at":{"type":["string","null"],"format":"date-time"},"status":{"type":"string"},"to":{"type":"string"}}},"SetTrackingDomainRequest":{"type":"object","required":["tracking_domain"],"properties":{"tracking_domain":{"type":"string"}}},"SignupForm":{"type":"object","required":["id","account_id","list_id","slug","title","custom_fields","is_active","theme","messages","created_at","updated_at"],"properties":{"account_id":{"type":"string","format":"uuid"},"created_at":{"type":"string","format":"date-time"},"custom_fields":{},"description":{"type":["string","null"]},"from_address":{"type":["string","null"],"description":"From address for double opt-in confirmation emails.\nWhen None, falls back to noreply@<first verified domain>."},"id":{"type":"string","format":"uuid"},"is_active":{"type":"boolean"},"list_id":{"type":"string","format":"uuid"},"messages":{"description":"Customizable UI messages (JSONB). Keys: submit_button, email_label,\nemail_placeholder, submitting, already_subscribed, confirmation_sent,\nconfirmation_pending, invalid_email, error. Empty = English defaults."},"redirect_url":{"type":["string","null"]},"slug":{"type":"string"},"success_message":{"type":["string","null"]},"theme":{"description":"Visual customization: bg_color, text_color, button_color, button_text_color,\nborder_radius, font_family, accent_color. Stored as JSONB."},"title":{"type":"string"},"updated_at":{"type":"string","format":"date-time"}}},"SignupFormResponse":{"type":"object","required":["id","account_id","list_id","slug","title","custom_fields","theme","messages","is_active","form_url","embed_code","created_at","updated_at"],"properties":{"account_id":{"type":"string","format":"uuid"},"created_at":{"type":"string","format":"date-time"},"custom_fields":{},"description":{"type":["string","null"]},"embed_code":{"type":"string","description":"HTML embed code for iframe integration."},"form_url":{"type":"string","description":"Public URL where this form is accessible."},"from_address":{"type":["string","null"]},"id":{"type":"string","format":"uuid"},"is_active":{"type":"boolean"},"list_id":{"type":"string","format":"uuid"},"messages":{},"redirect_url":{"type":["string","null"]},"slug":{"type":"string"},"success_message":{"type":["string","null"]},"theme":{},"title":{"type":"string"},"updated_at":{"type":"string","format":"date-time"}}},"Suppression":{"type":"object","required":["id","account_id","email_address","reason","created_at"],"properties":{"account_id":{"type":"string","format":"uuid"},"created_at":{"type":"string","format":"date-time"},"email_address":{"type":"string"},"id":{"type":"string","format":"uuid"},"reason":{"type":"string"},"source_email_id":{"type":["string","null"],"format":"uuid"}}},"Template":{"type":"object","required":["id","account_id","alias","name","subject","created_at","updated_at"],"properties":{"account_id":{"type":"string","format":"uuid"},"alias":{"type":"string"},"created_at":{"type":"string","format":"date-time"},"html_body":{"type":["string","null"]},"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"subject":{"type":"string"},"text_body":{"type":["string","null"]},"updated_at":{"type":"string","format":"date-time"}}},"UpdateContactListRequest":{"type":"object","required":["name"],"properties":{"description":{"type":["string","null"]},"double_opt_in":{"type":"boolean"},"name":{"type":"string"}}},"UpdateSignupFormRequest":{"type":"object","required":["title"],"properties":{"custom_fields":{"description":"Custom fields rendered on the form."},"description":{"type":["string","null"],"description":"Optional description shown below the title."},"from_address":{"type":["string","null"],"description":"From address for confirmation emails."},"messages":{"description":"Customizable UI messages for localization."},"redirect_url":{"type":["string","null"],"description":"URL to redirect to after subscription (overrides success_message)."},"success_message":{"type":["string","null"],"description":"Message displayed after successful subscription."},"theme":{"description":"Theme customization: bg_color, text_color, button_color, button_text_color,\nborder_color, accent_color, border_radius, font_family, embed, hide_branding."},"title":{"type":"string","description":"Form title displayed to subscribers."}}},"UpdateTemplateRequest":{"type":"object","required":["name","subject"],"properties":{"html_body":{"type":["string","null"]},"name":{"type":"string"},"subject":{"type":"string"},"text_body":{"type":["string","null"]}}},"UpdateWebhookRequest":{"type":"object","required":["url","events","is_active"],"properties":{"events":{"type":"array","items":{"type":"string"}},"is_active":{"type":"boolean"},"url":{"type":"string"}}},"ValidateEmailRequest":{"type":"object","required":["email"],"properties":{"email":{"type":"string","description":"The email address to validate."}}},"ValidateEmailResponse":{"type":"object","required":["email","valid","deliverable","is_disposable","is_role","is_free","mx_found"],"properties":{"deliverable":{"$ref":"#/components/schemas/Deliverable","description":"Deliverability assessment."},"email":{"type":"string","description":"The email address that was validated."},"is_disposable":{"type":"boolean","description":"Whether the domain is a known disposable email provider."},"is_free":{"type":"boolean","description":"Whether the domain is a known free email provider (e.g. gmail.com)."},"is_role":{"type":"boolean","description":"Whether the local part is a role-based address (e.g. info@, admin@)."},"mx_found":{"type":"boolean","description":"Whether MX records were found for the domain."},"reason":{"type":["string","null"],"description":"Explanation when the address is invalid."},"valid":{"type":"boolean","description":"Whether the email address passes all checks."}}},"Webhook":{"type":"object","required":["id","account_id","url","events","is_active","failure_count","created_at","updated_at"],"properties":{"account_id":{"type":"string","format":"uuid"},"created_at":{"type":"string","format":"date-time"},"events":{"type":"array","items":{"type":"string"}},"failure_count":{"type":"integer","format":"int32"},"id":{"type":"string","format":"uuid"},"is_active":{"type":"boolean"},"last_failure_at":{"type":["string","null"],"format":"date-time"},"last_failure_reason":{"type":["string","null"]},"last_success_at":{"type":["string","null"],"format":"date-time"},"updated_at":{"type":"string","format":"date-time"},"url":{"type":"string"}}}},"securitySchemes":{"api_key":{"type":"apiKey","in":"header","name":"X-EuroMail-Api-Key"}}},"tags":[{"name":"Emails","description":"Send and track transactional emails"},{"name":"Domains","description":"Register and verify sender domains (SPF, DKIM, DMARC)"},{"name":"Templates","description":"Manage email templates with MiniJinja syntax"},{"name":"Webhooks","description":"Configure webhook endpoints for delivery events"},{"name":"Suppressions","description":"Manage the per-account suppression list"},{"name":"Account","description":"Account management, GDPR export and deletion"},{"name":"Audit","description":"Security audit log"},{"name":"Contact Lists","description":"Manage contact lists and contacts"},{"name":"Signup Forms","description":"Create and manage public signup forms for contact lists"},{"name":"Analytics","description":"Email analytics: overview, timeseries, domain breakdown, CSV export"},{"name":"Dead Letters","description":"View, retry, or delete failed emails from the dead letter queue"},{"name":"Inbound","description":"View and manage received inbound emails"},{"name":"Validation","description":"Validate email addresses: syntax, MX, disposable, role, and free provider checks"},{"name":"Billing","description":"Plans, subscriptions, and billing management"}]}