Skip to content
Get an API key

Get started

Responses and errors

Every answer has one of two shapes. Test `error.code`, never the text.

Success: data

HTTP

HTTP/1.1 200 OK{ "data": { "items": [ { "id": "9c1f…", "status": "open", "unreadCount": 2 } ], "nextCursor": "MjAyNi0wOS0xOFQw…", "hasMore": true }}

Refusal: error

HTTP

HTTP/1.1 409 Conflict{ "error": { "status": 409, "code": "window_closed", "message": "The 24-hour customer service window is closed: only an approved template can be sent.", "detail": "…", "requestId": "a1b2c3d4" }}
  • code is stable and documented below. message is in English. detail is the specific reason, and may be in French.
  • requestId identifies the call in our logs and in GET /api-requests: quote it if you need help.
  • Some refusals carry data with more facts — template_holes_unfilled lists the unfilled placeholders in data.issues.

Pagination

Lists are cursor-paginated: pass limit, then send back nextCursor as cursor until it is null. Cursors are opaque; do not build them.

Node.js

let cursordo { const url = new URL('https://nodium.io/api/v1/inbox/conversations') url.searchParams.set('limit', '100') if (cursor) url.searchParams.set('cursor', cursor) const res = await fetch(url, { headers: { Authorization: `Bearer ${process.env.NODIUM_KEY}` } }) const body = await res.json() if (body.error) throw new Error(`${body.error.code}: ${body.error.message}`) for (const conversation of body.data.items) handle(conversation) cursor = body.data.nextCursor} while (cursor)

Error codes