me:readmereadpublicInspect the current API key, org, scopes, and rate-limit profile.
Create a key, validate it against /api/v1/me, copy a request, and move to production without waiting on support.
Use the portal to create a stx_ key with only the scopes your integration needs.
/api/v1/me.The response confirms org, key id, scopes, and rate-limit profile.
Start with contacts, inbox threads, broadcasts, or webhook delivery logs.
Use retry-safe writes and signed webhooks before going live.
Send the key in the Authorization header. Do not put keys in query strings, logs, or frontend bundles you do not control.
Public keys authorize only the versioned /api/v1 surface. They do not grant access to older portal routes or internal assistant systems.
curl https://api.statxe.com/api/v1/me \ -H "Authorization: Bearer stx_live_xxx"
me:readmereadpublicInspect the current API key, org, scopes, and rate-limit profile.
domains:readdomainsreadpublicRead verified sending domains and available sender identities.
inbox.threads:readinboxreadpublicRead inbox threads, messages, and delivery events.
inbox.threads:writeinboxwritepublicUpdate inbox thread/message state such as read, starred, archived, and tags.
inbox.messages:sendinboxsendpublicSend 1:1 conversation email from a mailbox you are assigned: new threads and replies, with the sender's signature. Uses no email credits; new threads count against the domain's daily limit, replies never do.
outbox.broadcasts:readoutboxreadpublicRead outbox broadcasts, campaign drafts, schedules, and send status.
outbox.broadcasts:writeoutboxwritepublicCreate and update broadcast drafts and schedules.
outbox.broadcasts:sendoutboxsendpublicLaunch or cancel broadcast/send lifecycle operations.
outbox.transactional:sendoutboxsendpublicSend individual transactional emails via the API or the SMTP front door. Deliberately separate from outbox.broadcasts:send so an SMTP-only key cannot launch a broadcast.
outbox.marketing:sendoutboxsendpublicSend one marketing email to one contact (flow steps). Promotes the contact into a free premium slot, adds the legal footer and unsubscribe link, and queues the send when the domain is at its daily limit.
contacts:readcontactsreadpublicRead contacts and contact metadata.
contacts:writecontactswritepublicCreate, update, import, export, and delete contacts.
segments:readsegmentsreadpublicRead segments, groups, and membership lists.
segments:writesegmentswritepublicCreate/update segments and manage contact membership.
webhooks:readwebhooksreadpublicRead webhook endpoints and delivery status.
webhooks:writewebhookswritepublicCreate and update webhook endpoints.
webhooks:adminwebhooksadminpublicDelete webhooks, rotate secrets, and replay deliveries.
api_keys:readapi_keysreadpublicRead API key metadata.
api_keys:writeapi_keyswritepublicCreate and revoke API keys.
automations:readautomationsreadpublicRead automations and their run history.
automations:writeautomationswritepublicUpdate an automation's name, description, and status (activate/pause/archive), and delete automations. Creating an automation's workflow is not yet supported over the API — use the dashboard.
templates:readtemplatesreadpublicRead email templates.
templates:writetemplateswritepublicCreate, update, and delete email templates.
metrics:readmetricsreadpublicRead send/engagement metrics summaries.
assistant.chat:writeassistantwritegatedSend gated assistant chat requests for admin-approved orgs.
assistant.tools:readassistantreadgatedDiscover gated assistant tools available to an approved org.
assistant.sessions:readassistantreadgatedRead gated assistant session and usage state.
/api/v1/meTest an API key
/api/v1/contactsList contacts
/api/v1/contactsIdempotent writeCreate a contact
/api/v1/contacts/{id}Retrieve a contact
/api/v1/contacts/{id}Idempotent writeUpdate a contact
/api/v1/contacts/{id}Idempotent writeDelete a contact
/api/v1/segmentsList segments
/api/v1/segmentsIdempotent writeCreate a segment
/api/v1/inbox/threadsList inbox threads
/api/v1/outbox/broadcastsList broadcasts
/api/v1/outbox/broadcastsIdempotent writeDraft a broadcast
/api/v1/webhooksList webhook endpoints
/api/v1/webhooksIdempotent writeCreate a webhook endpoint
/api/v1/webhooks/deliveriesList webhook delivery logs
/api/v1/webhooks/deliveries/{id}/replayIdempotent writeQueue a webhook delivery replay
{
"ok": false,
"error": {
"code": "missing_scope",
"message": "The API key does not include the required scope.",
"docs_url": "https://docs.statxe.com/api/errors/missing_scope"
},
"meta": {
"request_id": "req_123"
}
}invalid_requestThe request payload or query parameters are invalid.
invalid_api_keyThe API key is missing, invalid, or expired.
missing_scopeThe API key does not include the required scope.
not_foundThe requested resource was not found.
conflictThe request conflicts with the current resource state.
rate_limitedThe request exceeded the configured rate limit.
idempotency_conflictThe idempotency key was already used with a different request.
insufficient_creditsThe workspace has no email credits left for this send.
webhook_signature_invalidThe webhook signature is missing, expired, or invalid.
internal_errorAn unexpected server error occurred.
Keys get at least 60 requests per minute.
Burst capacity is included and capped to keep traffic fair.
Respect Retry-After and retry with backoff.
Use the playground’s GET /api/v1/me preset to inspect the current key’s meta.rate_limit profile.
Send an Idempotency-Key header on every POST, PATCH, and DELETE. Keys must be 8 to 128 characters.
Reusing the same key with the same request replays the stored response. Reusing it with different request content returns idempotency_conflict.
/api/v1/inbox/threadsList inbox threads
/api/v1/outbox/broadcastsList broadcasts
/api/v1/outbox/broadcastsIdempotency-KeyDraft a broadcast
/api/v1/contactsList contacts
/api/v1/contactsIdempotency-KeyCreate a contact
/api/v1/contacts/{id}Retrieve a contact
/api/v1/contacts/{id}Idempotency-KeyUpdate a contact
/api/v1/contacts/{id}Idempotency-KeyDelete a contact
t=...,v1=... signature.Each delivery is an HTTPS POST of { id, type, created_at, data } with the headers statxe-signature, statxe-event-id, statxe-event-type and statxe-delivery-id. Answer within 10 seconds. Timeouts, 408, 409, 425, 429 and 5xx are retried after 1m, 5m, 15m, 1h and 6h; other answers, redirects included, are final until you replay them.
/api/v1/webhooksList webhook endpoints
/api/v1/webhooksIdempotency-KeyCreate a webhook endpoint
/api/v1/webhooks/deliveriesList webhook delivery logs
/api/v1/webhooks/deliveries/{id}/replayIdempotency-KeyQueue a webhook delivery replay
import crypto from "node:crypto"
// statxe-signature: t=<unix seconds>,v1=<hex HMAC-SHA256 of "<t>.<raw body>">
// keyed with your endpoint's whsec_... secret, used as-is.
export async function POST(request: Request) {
const body = await request.text() // the raw body, before any JSON parsing
const header = request.headers.get("statxe-signature") ?? ""
const parts = Object.fromEntries(header.split(",").map((p) => p.split("=")))
const expected = crypto
.createHmac("sha256", process.env.STATXE_WEBHOOK_SECRET!)
.update(`${parts.t}.${body}`)
.digest("hex")
const fresh = Math.abs(Date.now() / 1000 - Number(parts.t)) < 300
const valid =
fresh &&
typeof parts.v1 === "string" &&
parts.v1.length === expected.length &&
crypto.timingSafeEqual(Buffer.from(parts.v1), Buffer.from(expected))
if (!valid) return new Response("invalid signature", { status: 400 })
const event = JSON.parse(body) // { id, type, created_at, data }
// event.id is the same on every retry and replay: process each id once.
return new Response(null, { status: 204 })
}Assistant traffic must flow through the internal AI layer for policy, tool allowlists, usage budgets, audit logging, and provider abstraction before any broader external exposure.
If your org is approved, use the portal assistant experience instead of attempting direct public API calls.
Open Assistant