{"openapi":"3.0.0","paths":{"/v1/email":{"post":{"operationId":"SendController_create_v1","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SendEmailDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"type":"object"}}}}},"summary":"POST /v1/email — accept a message for delivery. Returns the ledger id and\n its status (queued | suppressed | <existing status on idempotent repeat>).","tags":["Send"],"security":[{"apiKey":[]}]},"get":{"operationId":"MessagesController_list_v1","parameters":[{"name":"limit","required":true,"in":"query","schema":{"type":"string"}},{"name":"offset","required":true,"in":"query","schema":{"type":"string"}},{"name":"projectId","required":true,"in":"query","schema":{"type":"string"}},{"name":"search","required":true,"in":"query","schema":{"type":"string"}},{"name":"status","required":true,"in":"query","schema":{"type":"string"}},{"name":"stream","required":true,"in":"query","schema":{"type":"string"}},{"name":"since","required":true,"in":"query","schema":{"type":"string"}},{"name":"until","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object"}}}}},"summary":"GET /v1/email — the account's messages, newest first. Supports server-side\n filters: search (subject or exact recipient), status, stream, since, until.","tags":["Messages"],"security":[{"apiKey":[]}]}},"/v1/email/batch":{"post":{"operationId":"SendController_batch_v1","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchSendDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"type":"object"}}}}}},"summary":"POST /v1/email/batch — accept up to 500 messages in one call. Returns a\n result per message (id + status, or a per-item error).","tags":["Send"],"security":[{"apiKey":[]}]}},"/v1/suppressions":{"get":{"operationId":"SuppressionController_list_v1","parameters":[{"name":"limit","required":true,"in":"query","schema":{"type":"string"}},{"name":"offset","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object"}}}}},"tags":["Suppressions"],"security":[{"apiKey":[]}]},"post":{"operationId":"SuppressionController_add_v1","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddSuppressionDto"}}}},"responses":{"201":{"description":""}},"tags":["Suppressions"],"security":[{"apiKey":[]}]}},"/v1/suppressions/stats":{"get":{"operationId":"SuppressionController_stats_v1","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object"}}}}},"summary":"Counts by reason, for the reputation dashboard.","tags":["Suppressions"],"security":[{"apiKey":[]}]}},"/v1/suppressions/import":{"post":{"operationId":"SuppressionController_importMany_v1","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportSuppressionsDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"type":"object"}}}}},"summary":"Bulk-import suppressions when migrating from another provider. Returns a\n summary (imported / duplicates / invalid); never fails on individual bad rows.","tags":["Suppressions"],"security":[{"apiKey":[]}]}},"/v1/suppressions/{address}":{"delete":{"operationId":"SuppressionController_remove_v1","parameters":[{"name":"address","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Suppressions"],"security":[{"apiKey":[]}]}},"/v1/domains":{"post":{"operationId":"DomainsController_create_v1","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateDomainDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"type":"object"}}}}},"summary":"POST /v1/domains — add a sending domain; returns the DNS records to publish.","tags":["Domains"],"security":[{"apiKey":[]}]},"get":{"operationId":"DomainsController_list_v1","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"type":"object"}}}}}},"tags":["Domains"],"security":[{"apiKey":[]}]}},"/v1/domains/import":{"post":{"operationId":"DomainsController_importMany_v1","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportDomainsDto"}}}},"responses":{"201":{"description":""}},"summary":"POST /v1/domains/import — bulk pre-provision domains when migrating. Static\n path declared before the `:domain` routes so it never matches as a domain.","tags":["Domains"],"security":[{"apiKey":[]}]}},"/v1/domains/{domain}":{"get":{"operationId":"DomainsController_get_v1","parameters":[{"name":"domain","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object"}}}}},"tags":["Domains"],"security":[{"apiKey":[]}]},"delete":{"operationId":"DomainsController_remove_v1","parameters":[{"name":"domain","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"DELETE /v1/domains/:domain — remove a sending domain.","tags":["Domains"],"security":[{"apiKey":[]}]}},"/v1/domains/{domain}/verify":{"post":{"operationId":"DomainsController_verify_v1","parameters":[{"name":"domain","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"summary":"POST /v1/domains/:domain/verify — re-check the domain's DNS records and verify it.","tags":["Domains"],"security":[{"apiKey":[]}]}},"/v1/domains/{domain}/dmarc":{"post":{"operationId":"DomainsController_setDmarc_v1","parameters":[{"name":"domain","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DmarcMonitoringDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"type":"object"}}}}},"summary":"POST /v1/domains/:domain/dmarc — turn DMARC monitoring on or off.","tags":["Domains"],"security":[{"apiKey":[]}]},"get":{"operationId":"DomainsController_dmarcReport_v1","parameters":[{"name":"domain","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object"}}}}},"summary":"GET /v1/domains/:domain/dmarc — the DMARC monitoring view (sources + rates).","tags":["Domains"],"security":[{"apiKey":[]}]}},"/v1/domains/{domain}/share-instructions":{"post":{"operationId":"DomainsController_share_v1","parameters":[{"name":"domain","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShareInstructionsDto"}}}},"responses":{"201":{"description":""}},"summary":"POST /v1/domains/:domain/share-instructions — email the DNS records to\n teammates through Mailhuset. Dashboard-only (needs the signed-in user for\n attribution and reply-to), so API keys are rejected.","tags":["Domains"],"security":[{"apiKey":[]}]}},"/v1/sender-signatures":{"post":{"operationId":"SenderSignaturesController_create_v1","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSenderDto"}}}},"responses":{"201":{"description":""}},"tags":["Sender signatures"],"security":[{"apiKey":[]}]},"get":{"operationId":"SenderSignaturesController_list_v1","parameters":[],"responses":{"200":{"description":""}},"tags":["Sender signatures"],"security":[{"apiKey":[]}]}},"/v1/sender-signatures/{id}":{"patch":{"operationId":"SenderSignaturesController_update_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateSenderDto"}}}},"responses":{"200":{"description":""}},"tags":["Sender signatures"],"security":[{"apiKey":[]}]},"delete":{"operationId":"SenderSignaturesController_remove_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Sender signatures"],"security":[{"apiKey":[]}]}},"/v1/sender-signatures/{id}/verify":{"post":{"operationId":"SenderSignaturesController_verify_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["Sender signatures"],"security":[{"apiKey":[]}]}},"/v1/templates":{"post":{"operationId":"TemplatesController_create_v1","parameters":[{"name":"projectId","required":true,"in":"query","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTemplateDto"}}}},"responses":{"201":{"description":""}},"tags":["Templates"],"security":[{"apiKey":[]}]},"get":{"operationId":"TemplatesController_list_v1","parameters":[{"name":"projectId","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Templates"],"security":[{"apiKey":[]}]}},"/v1/templates/import":{"post":{"operationId":"TemplatesController_importMany_v1","parameters":[{"name":"projectId","required":true,"in":"query","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportTemplatesDto"}}}},"responses":{"201":{"description":""}},"summary":"Bulk-import templates when migrating from another provider. Existing aliases\n are skipped (never overwritten). Returns a summary.","tags":["Templates"],"security":[{"apiKey":[]}]}},"/v1/templates/{id}":{"get":{"operationId":"TemplatesController_get_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"projectId","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Templates"],"security":[{"apiKey":[]}]},"put":{"operationId":"TemplatesController_update_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"projectId","required":true,"in":"query","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTemplateDto"}}}},"responses":{"200":{"description":""}},"tags":["Templates"],"security":[{"apiKey":[]}]},"delete":{"operationId":"TemplatesController_remove_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"projectId","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Templates"],"security":[{"apiKey":[]}]}},"/v1/templates/{id}/preview":{"post":{"operationId":"TemplatesController_preview_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"projectId","required":true,"in":"query","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreviewDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"type":"object"}}}}},"tags":["Templates"],"security":[{"apiKey":[]}]}},"/v1/email/stats":{"get":{"operationId":"MessagesController_stats_v1","parameters":[{"name":"days","required":true,"in":"query","schema":{"type":"string"}},{"name":"projectId","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object"}}}}},"summary":"GET /v1/email/stats?days= — delivery counts and a daily send series.","tags":["Messages"],"security":[{"apiKey":[]}]}},"/v1/email/{id}":{"get":{"operationId":"MessagesController_get_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object"}}}}},"summary":"GET /v1/email/:id — one message with its event history.","tags":["Messages"],"security":[{"apiKey":[]}]}},"/v1/content/check":{"post":{"operationId":"ContentController_check_v1","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckContentDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"type":"object"}}}}},"summary":"Check email content for spam signals","tags":["Content"],"security":[{"apiKey":[]}]}},"/v1/keys":{"post":{"operationId":"KeysController_create_v1","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateKeyDto"}}}},"responses":{"201":{"description":""}},"tags":["API keys"],"security":[{"apiKey":[]}]},"get":{"operationId":"KeysController_list_v1","parameters":[{"name":"projectId","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"type":"object"}}}}}},"tags":["API keys"],"security":[{"apiKey":[]}]}},"/v1/keys/{id}/rotate":{"post":{"operationId":"KeysController_rotate_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"summary":"POST /v1/keys/:id/rotate — mint a new token with the same project/type/scopes\n and revoke the old one. The new raw token is returned once.","tags":["API keys"],"security":[{"apiKey":[]}]}},"/v1/keys/{id}":{"delete":{"operationId":"KeysController_revoke_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["API keys"],"security":[{"apiKey":[]}]}},"/v1/contact-lists":{"post":{"operationId":"ContactsController_createList_v1","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateListDto"}}}},"responses":{"201":{"description":""}},"tags":["Contact lists"],"security":[{"apiKey":[]}]},"get":{"operationId":"ContactsController_listLists_v1","parameters":[],"responses":{"200":{"description":""}},"tags":["Contact lists"],"security":[{"apiKey":[]}]}},"/v1/contact-lists/{id}":{"get":{"operationId":"ContactsController_getList_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"limit","required":true,"in":"query","schema":{"type":"string"}},{"name":"offset","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Contact lists"],"security":[{"apiKey":[]}]},"delete":{"operationId":"ContactsController_deleteList_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Contact lists"],"security":[{"apiKey":[]}]}},"/v1/contact-lists/{id}/contacts":{"post":{"operationId":"ContactsController_addContacts_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddContactsDto"}}}},"responses":{"201":{"description":""}},"tags":["Contact lists"],"security":[{"apiKey":[]}]}},"/v1/contact-lists/{id}/contacts/{contactId}":{"delete":{"operationId":"ContactsController_removeContact_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"contactId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Contact lists"],"security":[{"apiKey":[]}]}},"/v1/broadcasts":{"post":{"operationId":"BroadcastsController_create_v1","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateBroadcastDto"}}}},"responses":{"201":{"description":""}},"tags":["Broadcasts"],"security":[{"apiKey":[]}]},"get":{"operationId":"BroadcastsController_list_v1","parameters":[],"responses":{"200":{"description":""}},"tags":["Broadcasts"],"security":[{"apiKey":[]}]}},"/v1/broadcasts/{id}":{"get":{"operationId":"BroadcastsController_get_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Broadcasts"],"security":[{"apiKey":[]}]}},"/v1/broadcasts/{id}/send":{"post":{"operationId":"BroadcastsController_send_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["Broadcasts"],"security":[{"apiKey":[]}]}},"/v1/webhook-endpoints":{"post":{"operationId":"WebhookEndpointsController_create_v1","parameters":[{"name":"projectId","required":true,"in":"query","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateWebhookDto"}}}},"responses":{"201":{"description":""}},"tags":["Webhook endpoints"],"security":[{"apiKey":[]}]},"get":{"operationId":"WebhookEndpointsController_list_v1","parameters":[{"name":"projectId","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"type":"object"}}}}}},"tags":["Webhook endpoints"],"security":[{"apiKey":[]}]}},"/v1/webhook-endpoints/events":{"get":{"operationId":"WebhookEndpointsController_events_v1","parameters":[],"responses":{"200":{"description":""}},"summary":"List all webhook event types","tags":["Webhook endpoints"],"security":[{"apiKey":[]}]}},"/v1/webhook-endpoints/deliveries/{deliveryId}":{"get":{"operationId":"WebhookEndpointsController_getDelivery_v1","parameters":[{"name":"deliveryId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object"}}}}},"summary":"Fetch a single delivery, including the payload we POSTed.","tags":["Webhook endpoints"],"security":[{"apiKey":[]}]}},"/v1/webhook-endpoints/deliveries/{deliveryId}/replay":{"post":{"operationId":"WebhookEndpointsController_replay_v1","parameters":[{"name":"deliveryId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":"","content":{"application/json":{"schema":{"type":"object"}}}}},"summary":"Replay a past webhook delivery","tags":["Webhook endpoints"],"security":[{"apiKey":[]}]}},"/v1/webhook-endpoints/{id}":{"patch":{"operationId":"WebhookEndpointsController_update_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateWebhookDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object"}}}}},"summary":"Update, enable or disable a webhook endpoint","tags":["Webhook endpoints"],"security":[{"apiKey":[]}]},"delete":{"operationId":"WebhookEndpointsController_remove_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Webhook endpoints"],"security":[{"apiKey":[]}]}},"/v1/webhook-endpoints/{id}/deliveries":{"get":{"operationId":"WebhookEndpointsController_listDeliveries_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"limit","required":true,"in":"query","schema":{"type":"string"}},{"name":"offset","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"type":"object"}}}}}},"summary":"Recent delivery attempts for one endpoint (newest first).","tags":["Webhook endpoints"],"security":[{"apiKey":[]}]}},"/v1/webhook-endpoints/{id}/test":{"post":{"operationId":"WebhookEndpointsController_sendTest_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":"","content":{"application/json":{"schema":{"type":"object"}}}}},"summary":"Send a test event to a webhook endpoint","tags":["Webhook endpoints"],"security":[{"apiKey":[]}]}},"/v1/inbound":{"get":{"operationId":"InboundController_list_v1","parameters":[{"name":"limit","required":true,"in":"query","schema":{"type":"string"}},{"name":"offset","required":true,"in":"query","schema":{"type":"string"}},{"name":"projectId","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Inbound"],"security":[{"apiKey":[]}]}},"/v1/inbound/{id}":{"get":{"operationId":"InboundController_get_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Inbound"],"security":[{"apiKey":[]}]}},"/v1/inbound/{id}/attachments/{index}":{"get":{"operationId":"InboundController_attachment_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"index","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"Short-lived presigned download URL for one over-cap attachment.","tags":["Inbound"],"security":[{"apiKey":[]}]}},"/v1/inbound-routes":{"post":{"operationId":"InboundController_createRoute_v1","parameters":[{"name":"projectId","required":true,"in":"query","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateInboundRouteDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"type":"object"}}}}},"tags":["Inbound"],"security":[{"apiKey":[]}]},"get":{"operationId":"InboundController_listRoutes_v1","parameters":[{"name":"projectId","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Inbound"],"security":[{"apiKey":[]}]}},"/v1/inbound-routes/{id}/setup":{"get":{"operationId":"InboundController_routeSetup_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object"}}}}},"tags":["Inbound"],"security":[{"apiKey":[]}]}},"/v1/inbound-routes/{id}":{"put":{"operationId":"InboundController_updateRoute_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateInboundRouteDto"}}}},"responses":{"200":{"description":""}},"tags":["Inbound"],"security":[{"apiKey":[]}]},"delete":{"operationId":"InboundController_removeRoute_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Inbound"],"security":[{"apiKey":[]}]}},"/v1/inbound-routes/{id}/verify":{"post":{"operationId":"InboundController_verifyRoute_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":"","content":{"application/json":{"schema":{"type":"object"}}}}},"tags":["Inbound"],"security":[{"apiKey":[]}]}}},"info":{"title":"Mailhuset API","description":"The Mailhuset REST API. Send email, manage sending domains and templates,\nrun broadcasts, receive inbound mail, and subscribe to delivery events.\n\nAuthenticate every request with an API key as a bearer token:\n`Authorization: Bearer mh_...`. Create keys in the dashboard under **Keys**.\n\nAll endpoints are versioned under `/v1`. Full guides and examples live at\nhttps://mailhuset.com/docs.","version":"1.0.0","contact":{"name":"Mailhuset support","url":"https://mailhuset.com/docs","email":"support@mailhuset.com"}},"tags":[],"servers":[{"url":"https://api.mailhuset.com","description":"Production"}],"components":{"securitySchemes":{"apiKey":{"scheme":"bearer","bearerFormat":"mh_...","type":"http","description":"Your Mailhuset API key, created in the dashboard under Keys."}},"schemas":{"AttachmentDto":{"type":"object","properties":{"filename":{"type":"string","description":"File name shown to the recipient. No path separators or line breaks.","maxLength":256,"pattern":"/^[^\\r\\n/\\\\]+$/"},"content":{"type":"string","description":"Base64-encoded file content. ~14M chars ≈ 10 MB decoded (SES message cap).","maxLength":14000000,"format":"base64"},"contentType":{"type":"string","description":"MIME type, e.g. application/pdf.","maxLength":128,"pattern":"/^[\\w.+-]+\\/[\\w.+-]+$/"}},"required":["filename","content","contentType"]},"TrackingDto":{"type":"object","properties":{"opens":{"type":"boolean"},"clicks":{"type":"boolean"}}},"SendEmailDto":{"type":"object","properties":{"attachments":{"description":"File attachments (base64). Combined size is capped in the send service.","maxItems":20,"type":"array","items":{"$ref":"#/components/schemas/AttachmentDto"}},"from":{"type":"string","description":"Header sender, e.g. `Mailhuset <no-reply@mailhuset.com>`. Must be an address\n on a domain you have verified, or a verified sender signature.","maxLength":320,"pattern":"/^[^\\r\\n]+$/"},"to":{"minItems":1,"maxItems":50,"type":"array","items":{"type":"string","format":"email"}},"cc":{"maxItems":50,"type":"array","items":{"type":"string","format":"email"}},"bcc":{"maxItems":50,"type":"array","items":{"type":"string","format":"email"}},"replyTo":{"maxItems":10,"type":"array","items":{"type":"string","format":"email"}},"subject":{"type":"string","description":"Required unless templateAlias is given (then the template's subject is used,\n or this overrides it).","maxLength":998},"html":{"type":"string","maxLength":2000000},"text":{"type":"string","maxLength":2000000},"templateAlias":{"type":"string","description":"Send from a stored template: its subject/html/text are rendered with the\n model. `subject`/`html`/`text` above override the rendered result if set.","maxLength":120},"templateModel":{"type":"object"},"stream":{"type":"string","description":"transactional (default) or broadcast.","maxLength":64},"headers":{"type":"object"},"tags":{"type":"object"},"tracking":{"$ref":"#/components/schemas/TrackingDto"},"sendAt":{"type":"string","description":"Optional ISO-8601 time to send at (delayed send). Must be in the future and\n within 30 days. Omit to send immediately."},"idempotencyKey":{"type":"string","description":"Optional client idempotency key; a repeat returns the original message.","maxLength":200}},"required":["from","to"]},"BatchSendDto":{"type":"object","properties":{"messages":{"minItems":1,"maxItems":500,"type":"array","items":{"$ref":"#/components/schemas/SendEmailDto"}}},"required":["messages"]},"AddSuppressionDto":{"type":"object","properties":{"address":{"type":"string","format":"email"},"reason":{"type":"object"}},"required":["address"]},"ImportSuppressionEntryDto":{"type":"object","properties":{"email":{"type":"string"},"reason":{"type":"object"}},"required":["email"]},"ImportSuppressionsDto":{"type":"object","properties":{"entries":{"minItems":1,"maxItems":20000,"type":"array","items":{"$ref":"#/components/schemas/ImportSuppressionEntryDto"}}},"required":["entries"]},"CreateDomainDto":{"type":"object","properties":{"domain":{"type":"string","pattern":"/^(?=.{1,253}$)([a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?\\.)+[a-z]{2,}$/i"}},"required":["domain"]},"ImportDomainsDto":{"type":"object","properties":{"domains":{"minItems":1,"maxItems":25,"type":"array","items":{"type":"string"}}},"required":["domains"]},"DmarcMonitoringDto":{"type":"object","properties":{"enabled":{"type":"boolean"}},"required":["enabled"]},"ShareInstructionsDto":{"type":"object","properties":{"emails":{"minItems":1,"maxItems":5,"type":"array","items":{"type":"string","format":"email"}},"note":{"type":"string","maxLength":500}},"required":["emails"]},"CreateSenderDto":{"type":"object","properties":{"email":{"type":"string","format":"email"},"name":{"type":"string","maxLength":120},"replyTo":{"type":"string","format":"email"}},"required":["email"]},"UpdateSenderDto":{"type":"object","properties":{"name":{"type":"string","maxLength":120},"replyTo":{"type":"string","maxLength":200,"format":"email"}}},"CreateTemplateDto":{"type":"object","properties":{"name":{"type":"string","maxLength":120},"alias":{"type":"string","maxLength":120},"subject":{"type":"string","maxLength":500},"htmlBody":{"type":"string"},"textBody":{"type":"string"}},"required":["name","subject"]},"ImportTemplateEntryDto":{"type":"object","properties":{"name":{"type":"string","maxLength":120},"alias":{"type":"string","maxLength":120},"subject":{"type":"string","maxLength":500},"htmlBody":{"type":"string"},"textBody":{"type":"string"}}},"ImportTemplatesDto":{"type":"object","properties":{"templates":{"minItems":1,"maxItems":1000,"type":"array","items":{"$ref":"#/components/schemas/ImportTemplateEntryDto"}}},"required":["templates"]},"UpdateTemplateDto":{"type":"object","properties":{"name":{"type":"string","maxLength":120},"alias":{"type":"string","maxLength":120},"subject":{"type":"string","maxLength":500},"htmlBody":{"type":"string"},"textBody":{"type":"string"}}},"PreviewDto":{"type":"object","properties":{"model":{"type":"object"}}},"CheckContentDto":{"type":"object","properties":{"subject":{"type":"string","maxLength":2000,"description":"The subject line to check."},"html":{"type":"string","maxLength":2000000,"description":"The HTML body to check."},"text":{"type":"string","maxLength":2000000,"description":"The plain-text body to check."},"bulk":{"type":"boolean","description":"Set for bulk/broadcast mail, which must carry an unsubscribe link."}}},"CreateKeyDto":{"type":"object","properties":{"name":{"type":"string","maxLength":100},"projectId":{"type":"string","description":"Project to create the key in. Defaults to the caller's project (API-key\n auth) or the account's default project."},"type":{"type":"string","description":"LIVE (default) sends for real; TEST (mh_test_) always routes to sandbox.","enum":["LIVE","TEST"]},"scopes":{"type":"string","description":"Least-privilege scopes. Omit or empty = full access.","enum":["email:send","email:read","manage"]}},"required":["name"]},"CreateListDto":{"type":"object","properties":{"name":{"type":"string","maxLength":120}},"required":["name"]},"ContactInputDto":{"type":"object","properties":{"email":{"type":"string","format":"email"},"fields":{"type":"object"}},"required":["email"]},"AddContactsDto":{"type":"object","properties":{"contacts":{"minItems":1,"maxItems":1000,"type":"array","items":{"$ref":"#/components/schemas/ContactInputDto"}}},"required":["contacts"]},"CreateBroadcastDto":{"type":"object","properties":{"listId":{"type":"string"},"name":{"type":"string","maxLength":160},"from":{"type":"string"},"templateId":{"type":"string"},"subject":{"type":"string","maxLength":500},"htmlBody":{"type":"string"},"textBody":{"type":"string"}},"required":["listId","name","from"]},"CreateWebhookDto":{"type":"object","properties":{"url":{"type":"string","description":"Validated for SSRF in the service, so a plain string (not @IsUrl) here."},"events":{"description":"Event types to subscribe to; omit/empty = all.","type":"array","items":{"type":"string"}}},"required":["url"]},"UpdateWebhookDto":{"type":"object","properties":{"url":{"type":"string","description":"Validated for SSRF in the service, so a plain string (not @IsUrl) here."},"events":{"description":"Replaces the subscribed event list; empty array = all events.","type":"array","items":{"type":"string"}},"disabled":{"type":"boolean","description":"true = disable delivery, false = re-enable."}}},"CreateInboundRouteDto":{"type":"object","properties":{"kind":{"type":"string","enum":["HASH","DOMAIN"]},"domain":{"type":"string","description":"Required for a DOMAIN route: the customer's inbound subdomain."},"webhookUrl":{"type":"string","format":"uri"}},"required":["kind"]},"UpdateInboundRouteDto":{"type":"object","properties":{"webhookUrl":{"type":"string","format":"uri"}}}}}}