API v1
Qsendyx API documentation
The public API is REST over JSON, versioned in the path. Requests and responses are JSON, timestamps are UTC in ISO 8601, identifiers are UUIDs you can store as opaque strings. Everything below works in both the test and live environments — the token prefix decides which.
Copy, paste, run
Send your first email in the language you already use.
curl -X POST https://api.qsendyx.com/api/v1/email/messages \
-H "Authorization: Bearer $QSENDYX_TOKEN" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{
"from": { "email": "you@yourcompany.com", "name": "Your Company" },
"to": [{ "email": "user@example.com" }],
"subject": "Welcome aboard",
"html": "<h1>You are in.</h1>"
}'Response: 202 Accepted · { "id": "…", "status": "queued" }
Jump straight to what you need.
Getting started Every call carries a bearer token. Its prefix tells you the environment; its scopes tell you what it may do. Email POST /email/messages accepts raw content or a template, never both, and returns 202 with a message you can poll. SMS POST /sms/messages takes from, to and body, and bills you by segment — a message is not one SMS. Verify The Verify endpoints handle one-time codes end to end — generation, expiry, attempt limits and validation. You never store the code. Webhooks Register an HTTPS endpoint and receive delivery events. Verify the signature, apply idempotency, and let status come to you. Deliverability The suppression list is the memory of who you must not contact. Sending to a suppressed address is refused before it leaves the queue.
When something fails
Every error returns the same shape — an HTTP status and a stable code you can branch on.
| code | Status | When |
|---|---|---|
invalid_token | 401 | Missing, malformed or revoked token. |
insufficient_scope | 403 | Token lacks the scope for this call. |
not_found | 404 | Resource does not exist in your tenant. |
idempotency_conflict | 409 | Same key reused with a different payload. |
unprocessable | 422 | Unverified sender or suppressed recipient. |
rate_limited | 429 | Too many requests — back off and retry. |
Frequently asked questions
Test freely
Use a test token while you integrate — it runs the full pipeline on isolated data, never emails a real recipient and never spends balance. Switch to a live token when you go to production.