Guide
Answer a customer
Read what has been said on a case and add to it: a reply that goes to the customer, a note for the team, or a message from the customer that your system received.
Last updated 20 October 2026
Before you start
An admin makes a key in Settings → API keys. A key has scopes, the things it may do, and the groups of cases it sees. The secret is shown once, so keep it on your server and never in a web page or an app. Every request carries it as a header:
Authorization: Bearer nolmo_live_…Every error is JSON, {"error": {"code": "…", "message": "…", "details": null}}. Branch on code. Past the limit the answer is 429 with Retry-After.
Read the thread
With cases:read, a case's public thread comes oldest first, a page at a time. Send next_cursor as after for the next page. The team's internal notes are left out unless you ask with include_notes=true.
curl "https://api.nolmo.no/v1/cases/1042/messages" \
-H "Authorization: Bearer $NOLMO_KEY"
# { "items": [ { "kind": "customer", "body_text": "…", … }, … ], "next_cursor": null }Reply
A reply is a public answer. It goes out through the case's channel as a team reply does, by email for an email case, and is authored by the key. It needs its own scope, cases:reply, so a key that only makes cases cannot speak for the team. The key does not become the case's assignee.
const res = await fetch(`https://api.nolmo.no/v1/cases/${number}/messages`, {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.NOLMO_KEY}`,
"Idempotency-Key": `answer-${number}-${answerId}`,
"Content-Type": "application/json",
},
body: JSON.stringify({ kind: "reply", body_text: "Hi Kari, we are sending new tiles today." }),
});
// 201 { id, kind: "reply", delivery: "queued", … }
// 403 without cases:reply · 409 no_way_to_answer · 409 case_closeddelivery says where the answer is: queued, sent or failed. If nothing can carry the answer, because the case has no address or channel, the answer is 409 no_way_to_answer and nothing is written.
Leave a note, or pass the customer's message on
{"kind": "note", "body_text": "…"}: internal, for the team. Never part of the public thread.{"kind": "customer", "body_text": "…"}: something the person the case is about wrote somewhere else. It reopens a solved case, as an email would, and is refused with 409case_closedon a closed one.
Do not poll
To hear that the team replied or the case changed, take a webhook instead of asking over and over.