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.
Resources
messages:send and messages:read-content may not share a key. Message metadata also has GET /v1/messages/{id}.
Abilities
A key without the ability for a surface gets 403 with type: forbidden_ability and the required_ability it lacks. templates:manage and transports:manage also grant the matching read. Neither is a write on this 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). DMARC reports are the exception: their cursor is an opaque string naming range_end and id, and an integer is 422 invalid_cursor. 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 .