POST /api/v1/chat

Send a message. Get back the reply, simple.

Request

Auth: Authorization: Bearer <api_key>. Content-Type: application/json.

FieldTypeRequiredDescription
agentIdstringYesAgent public ID
messagestringYesCustomer message. Max 4,000 chars
sessionIdstringNoConversation id. Generated if omitted
visitorIdstringNoStable hashed user id. Cross-session memory on Humaner
const res = await fetch("https://app.humaner.ai/api/v1/chat", {
  method: "POST",
  headers: {
    Authorization: "Bearer hu_1b1a577877",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    agentId: "ag_demo123",
    sessionId: crypto.randomUUID(),
    message: "Where is my order?",
  }),
});

// Responses stream as SSE — { delta } chunks

SSE response

  1. N events: data: {"delta":"..."} — append to the reply
  2. 1 final JSON event: usage, metadata, handoff, suggestions
  3. data: [DONE]

Stream shape

data: {"delta":"Your order "}

data: {"delta":"shipped."}

data: {"usage":{...},"metadata":{...},"handoff":null,"suggestions":["..."]}

data: [DONE]

Final event fields

FieldUse it for
usage.sessionIdPersist for the next turn
usage.groundedWhether the answer used your knowledge
metadata.intentOptional UI routing (order_status, etc.)
metadata.escalatetrue → show handoff / create ticket
metadata.urgencylow | medium | high | critical
metadata.cancellationIntenttrue → run your retention flow
handoffnull, or { humanDesk, email } when escalate is true
suggestionsOptional quick-reply chips

Errors