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.

TypeScript
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_closed

delivery 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 409 case_closed on 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.

Next

Receive webhooks.