Control plane
Docs / Control plane

Control plane API

The control plane is the part that decides and records — not the part that delivers. Send is only half of it. These endpoints let your own software list and write the same resources the panel manages. Auth is the same Bearer spw_ key. Abilities are chosen at mint, never widenable, no wildcard. messages:send and messages:read-content still may not share a key.

Abilities

suppressions:read · suppressions:write
applications:read · applications:write
templates:read · domains:read · transports:read · usage:read

A key without the ability for a surface gets 403 with { "message": "Forbidden" }. templates:manage and transports:manage also grant the matching read surface. Write paths exist only for suppressions and applications — the rest are read-only over the API.

Pagination

Lists paginate like messages: ?limit= (1–100, default 25) and ?cursor= (keyset on integer id — pass the last id from the previous page). Response shape is always { data, next_cursor }. See .

Tenancy fails closed

Cross-account ids return 404, not 403. Errors share the same { message } envelope as .

What this is not

HONESTY NOTE — WHAT THIS API WILL NOT DOPublishing templates, testing transports, verifying domains, minting API keys and changing plan remain panel (or templates:sync). Batch send, bulk suppression import and webhook CRUD are not on v1 yet.