https://app.conversimple.com. This contract applies to an active widget deployment configured for Existing Concierge Voice. Your configured hook and SaaS origin must use HTTPS. The shared secret is server-side only.
Identity token
Your backend issues an HS256 JWT to its signed-in user. The browser’sgetIdentityToken callback fetches it immediately before voice.start().
The start request is bound to the configured SaaS origin and token. The shared secret must never be sent to the browser. Mint a fresh token for each start; an old token or wrong origin fails before a voice session is allocated.
Reply hook
For each final utterance, ConverSimple sends a JSONPOST to your configured HTTPS hook. The body contains:
trace_id equals turn_id and correlates related timeline events. ConverSimple signs the exact raw request body with HMAC-SHA256 using the deployment secret. The header is X-Conversimple-Signature: sha256=<lowercase hexadecimal digest>. Verify before processing, using a constant-time comparison. Do not reserialize JSON for verification.
Your hook must return HTTP 2xx with matching IDs. For an immediate answer:
Deferred reply
For work that takes longer, acknowledge promptly:turn_id. When ready, send a JSON POST to:
conversation_id, turn_id, and reply_text. The callback accepts a pending turn for up to two minutes. An identical repeat returns {"status":"duplicate"}; a first accepted reply returns {"status":"accepted"}. A superseded turn returns HTTP 409 stale_turn; an ended conversation returns HTTP 410 conversation_ended. Do not retry 409 or 410 as if they were transient server failures. Invalid signatures or malformed callback bodies return HTTP 401 invalid_reply.
If the browser disconnects during a pending turn, ConverSimple makes a best-effort signed POST to the same hook: