- Docs
- API Reference
- REST API
REST API
Base URL: https://rest.qpub.io/v1
JSON fields use snake_case.
Authentication
| Scheme | Header / query |
|---|---|
| API key | Authorization: Basic <base64(publicId:secret)> or api_key |
| JWT | Authorization: Bearer <jwt> or access_token |
Optional: X-Alias: <alias>.
Token issue requires API key auth. Token request uses a signed body (no Basic header).
Tokens
Issue JWT
POST /v1/key/:keyID/token/issue
Body (optional, camelCase): alias, permission, expiresIn (seconds).
200: { "token": "<jwt>" }
Exchange token request
POST /v1/key/:keyID/token/request
Body: aki, timestamp, optional alias / permission, signature. Prefer SDK createTokenRequest / requestToken.
200: { "token": "<jwt>" }
Publish
One channel
POST /v1/channel/:channelName/messages
{
"messages": [
{ "event": "greeting", "data": { "text": "Hello" }, "alias": "api" }
]
}
201 response shape:
{
"published": [
{
"channel": "demo",
"message_id": "...",
"published_at": "2026-07-16T00:00:00Z",
"payload_count": 1
}
]
}
Many channels
POST /v1/channels/messages
{
"channels": ["a", "b"],
"messages": [{ "data": { "ok": true } }]
}
Partial failure may return 207 with an error envelope (code: PARTIAL_CONTENT) whose details include published and failed_channels. Rate limits return 429.
Queues
| Method | Path | Notes |
|---|---|---|
| PUT | /v1/queue/:queueName | Create if missing (max_attempts, webhooks); existing queues returned unchanged |
| GET | /v1/queue/:queueName | Read config |
| POST | /v1/queue/:queueName/jobs | Enqueue |
| GET | /v1/queue/:queueName/jobs | List (?status=) |
| GET | /v1/queue/:queueName/jobs/:jobId | Get job |
| DELETE | /v1/queue/:queueName/jobs/:jobId | Cancel |
| POST | /v1/queue/:queueName/jobs/:jobId/retry | Retry |
| POST | /v1/queue/:queueName/pull | Pull jobs |
| POST | /v1/queue/:queueName/jobs/:jobId/ack | Ack |
| POST | /v1/queue/:queueName/jobs/:jobId/nack | Nack |
| POST | /v1/workers/register | Register worker |
| POST | /v1/workers/heartbeat | Heartbeat |
See Queue for request bodies and SDK usage.
Health
GET /health
→ { "status": "healthy" }
Errors
Error responses use an HTTP status and a JSON body with code and message (for example UNAUTHORIZED, FORBIDDEN, RATE_LIMITED, BAD_REQUEST). Some responses include a details field.