REST API reference

NoticeAPI exposes a project-aware JSON REST API for transactional email, consent-based marketing, domains, templates, receiving, webhooks, access management, and invited private-beta SMS. This page summarizes the surface; the canonical, machine-readable contract is OpenAPI 3.1.

Base URL and auth

GET/api/v1/...

Production endpoints live under https://www.noticeapi.com/api/v1. Except for the liveness probe, authenticate with Authorization: Bearer ntc_.... API keys are shown once after creation; learn the scopes and flow in the account API keys guide.

auth
curl https://www.noticeapi.com/api/v1/emails/EMAIL_ID \
  -H "Authorization: Bearer ntc_xxxxxxxxxxxxxxxxxxxx"

Project context

Project-bound keys require no project header. For email sends, a workspace key can also omit the header: NoticeAPI resolves the project from the verified domain in from. This lets one key send from domains across several projects without another environment variable. Use X-NoticeAPI-Project-ID for project-local management endpoints, sandbox sends, or when you want an explicit guard. A header that conflicts with the sender domain returns project_not_allowed; a request that cannot be resolved safely returnsproject_required.

Scoped keys

Full-access keys carry every scope. For apps, CI jobs, and authorized agents, create a key with only the scopes that workflow needs. Out-of-scope calls return 403 and the stable insufficient_scope code.

FieldTypeDescription
email:sendscopeSend, batch send, email status, cancel, and reschedule.
sms:send / sms:readprivate betaQueue SMS or read SMS activity only for an invited project; live carrier delivery remains separately gated.
sms:manage / sms:billing:readprivate betaPrepare SMS compliance records or read the prepaid wallet; neither scope activates a sender or funds a wallet.
projects:readscopeList and inspect projects visible to the key.
projects:writescopeCreate, update, pause, and archive projects.
api-keys:writescopeList key metadata, create narrower grants, and revoke keys.
domains:readscopeList and inspect sending domains.
domains:writescopeCreate, verify, and remove sending domains.
templates:writescopeCreate, list, update, delete, and seed templates.
audiences:writescopeCreate audiences and manage opted-in contacts.
broadcasts:writescopeCreate, schedule, cancel, inspect, and send broadcasts.
automations:writescopeCreate and manage audience-triggered automations.
suppressions:writescopeList, add, and remove suppressions.
receiving:readscopeRead received emails and attachments.
receiving:writescopeCreate, verify, list, and remove receiving domains.
webhooks:writescopeCreate, list, update, and remove signed webhook endpoints.
403 insufficient_scope
{
  "error": "This API key does not have the broadcasts:write scope. Create a key with the scopes this integration needs.",
  "code": "insufficient_scope"
}

Idempotency and retries

The single-email send endpoint accepts an Idempotency-Key header up to 256 characters. Repeating the same key returns the original result instead of sending twice, which is the safest retry pattern for agents, queues, and webhooks. Reusing a key with a different payload returns 409 idempotency_mismatch. Batch email sends do not accept idempotency keys; SMS uses its own required idempotency header.

idempotent send
curl -X POST https://www.noticeapi.com/api/v1/email/send \
  -H "Authorization: Bearer ntc_xxxxxxxxxxxxxxxxxxxx" \
  -H "Idempotency-Key: receipt-8412" \
  -H "Content-Type: application/json" \
  -d '{
    "from": "Acme <[email protected]>",
    "to": "[email protected]",
    "subject": "Your receipt",
    "html": "<p>Thanks for your purchase.</p>"
  }'

Endpoint inventory

Health

MethodEndpointScopePurpose
GET/api/v1/healthnoneUnauthenticated liveness probe; it does not read the datastore.

Request fields: Health docs

Projects, keys, and domains

MethodEndpointScopePurpose
GET/api/v1/projectsprojects:readList projects visible to the key.
POST/api/v1/projectsprojects:writeCreate a project in the workspace.
GET/PATCH/DELETE/api/v1/projects/:idprojects:read/writeInspect, update, pause, or archive a project.
GET/api/v1/api-keysapi-keys:writeList key metadata without secrets.
POST/api/v1/api-keysapi-keys:writeCreate a key no broader than the caller.
GET/DELETE/api/v1/api-keys/:idapi-keys:writeInspect a grant or revoke a key immediately.
GET/POST/api/v1/domainsdomains:read/writeList or create sending domains.
GET/DELETE/api/v1/domains/:iddomains:read/writeInspect or remove a sending domain.
POST/api/v1/domains/:id/verifydomains:writeCheck sending-domain DNS.

Request fields: Projects, keys, and domains docs

Transactional email

MethodEndpointScopePurpose
POST/api/v1/email/sendemail:sendSend one email now or schedule it with sendAt.
POST/api/v1/email/batchemail:sendSend up to 100 transactional emails in one request.
GET/api/v1/emails/:idemail:sendRead status, stored body, and per-recipient events.
POST/api/v1/emails/:id/cancelemail:sendCancel a scheduled transactional email.
POST/api/v1/emails/:id/rescheduleemail:sendMove a scheduled transactional email.

Request fields: Transactional email docs

SMS private beta

MethodEndpointScopePurpose
GET/POST/api/v1/sms/messagessms:read / sms:sendRead redacted activity or queue one SMS for an invited project.
GET/api/v1/sms/messages/:idsms:readRead one authorized sensitive message detail.
GET/api/v1/sms/usagesms:readRead project SMS usage.
GET/api/v1/sms/wallet/*sms:billing:readRead prepaid-wallet state, ledger, periods, and top-ups.
GET/POST/PATCH/api/v1/sms/business-profiles, programs, senderssms:managePrepare carrier-dossier records; this never activates a number or live sending.
GET/POST/api/v1/sms/consents, suppressionssms:manageManage durable consent and STOP/suppression records.

Request fields: SMS private beta docs

Templates

MethodEndpointScopePurpose
GET/api/v1/templatestemplates:writeList stored templates.
POST/api/v1/templatestemplates:writeCreate a reusable subject/html/text template.
GET/api/v1/templates/:idtemplates:writeFetch one template.
PATCH/api/v1/templates/:idtemplates:writeUpdate a template.
DELETE/api/v1/templates/:idtemplates:writeDelete a template.
POST/api/v1/templates/starterstemplates:writeSeed the starter templates again.

Request fields: Templates docs

Audiences and broadcasts

MethodEndpointScopePurpose
GET/api/v1/audiencesaudiences:writeList audiences.
POST/api/v1/audiencesaudiences:writeCreate an audience.
GET/api/v1/audiences/:idaudiences:writeFetch one audience and contact counts.
DELETE/api/v1/audiences/:idaudiences:writeDelete an audience.
GET/api/v1/audiences/:id/contactsaudiences:writeList contacts in an audience.
POST/api/v1/audiences/:id/contactsaudiences:writeCreate or update an opted-in contact.
GET/api/v1/audiences/:id/contacts/:contactIdaudiences:writeFetch one contact.
PATCH/api/v1/audiences/:id/contacts/:contactIdaudiences:writeUpdate name fields or subscribed state.
DELETE/api/v1/audiences/:id/contacts/:contactIdaudiences:writeRemove a contact from an audience.
GET/api/v1/broadcastsbroadcasts:writeList broadcasts.
POST/api/v1/broadcastsbroadcasts:writeCreate an audience broadcast draft.
GET/api/v1/broadcasts/:idbroadcasts:writeFetch one broadcast and delivery stats.
DELETE/api/v1/broadcasts/:idbroadcasts:writeDelete a draft or scheduled broadcast.
POST/api/v1/broadcasts/:id/sendbroadcasts:writeSend a draft broadcast to subscribed contacts.
POST/api/v1/broadcasts/:id/schedulebroadcasts:writeSchedule or reschedule a broadcast.
POST/api/v1/broadcasts/:id/cancelbroadcasts:writeCancel a scheduled broadcast.

Request fields: Audiences and broadcasts docs

Automations

MethodEndpointScopePurpose
GET/api/v1/automationsautomations:writeList audience-triggered sequences.
POST/api/v1/automationsautomations:writeCreate an automation.
GET/api/v1/automations/:idautomations:writeFetch one automation and recent runs.
PATCH/api/v1/automations/:idautomations:writeUpdate steps, sender, tracking, or enabled state.
DELETE/api/v1/automations/:idautomations:writeDelete an automation.

Request fields: Automations docs

Suppressions

MethodEndpointScopePurpose
GET/api/v1/suppressionssuppressions:writeList suppressed recipients.
POST/api/v1/suppressionssuppressions:writeAdd a suppression manually.
DELETE/api/v1/suppressionssuppressions:writeRemove a suppression after a confirmed re-opt-in.

Request fields: Suppressions docs

Receiving

MethodEndpointScopePurpose
GET/api/v1/receiving/domainsreceiving:writeList receiving domains.
POST/api/v1/receiving/domainsreceiving:writeCreate a custom or managed receiving domain.
GET/api/v1/receiving/domains/:idreceiving:writeFetch one receiving domain.
POST/api/v1/receiving/domains/:id/verifyreceiving:writeCheck required TXT and MX records.
DELETE/api/v1/receiving/domains/:idreceiving:writeRemove a receiving domain.
GET/api/v1/receiving/emailsreceiving:readList received messages.
GET/api/v1/receiving/emails/:idreceiving:readFetch a received message body and headers.
GET/api/v1/receiving/emails/:id/attachmentsreceiving:readList attachment metadata.
GET/api/v1/receiving/emails/:id/attachments/:attachmentIdreceiving:readDownload attachment bytes.

Request fields: Receiving docs

Webhooks

MethodEndpointScopePurpose
GET/api/v1/webhookswebhooks:writeList project webhook endpoints.
POST/api/v1/webhookswebhooks:writeCreate a signed HTTPS endpoint.
PATCH/api/v1/webhooks/:idwebhooks:writeUpdate URL or enabled state.
DELETE/api/v1/webhooks/:idwebhooks:writeDelete an endpoint.

Request fields: Webhooks docs

Testing without sending real mail

Use [email protected] as the sender and recipients at simulator.noticeapi.com to exercise delivered, bounced, complained, and suppressed outcomes without using ACS or sending real mail.

Errors and limits

API errors return JSON with error and a stable code. Agents should branch on the code, respect Retry-After on 429, and stop on policy boundaries such as insufficient_scope, recipient_suppressed, and quota_exceeded. See Errors and limits.