public

POST /v1/public/assistant/ask

Ask Zinn® a pre-sales question — no account, one grounded answer.

All public endpoints

All developer docs

Authentication

This endpoint is public. It takes no credential and no organisation — it is what our own marketing site and AI answer engines read.

This endpoint takes no organisation id. Your key already identifies the organisation it belongs to, and the response is scoped to it.

Try it

Replace anything in angle brackets with your own values, and the key placeholder with a key from your dashboard.

curl -X POST https://api.zinndigital.com/v1/public/assistant/ask \
  -H "Content-Type: application/json" \
  -d '{ "question": <string> }'

Signed in? The API console in your dashboard fills in your real organisation id and your own key, and runs the request against the live API so you can see the actual response. Open this endpoint in the API console

Details

Anonymous — no credential, no tenant, nothing stored. The public half of Ask Zinn®: a visitor deciding whether to buy asks a question, and the answer is built from PUBLISHED knowledge-base articles plus the LIVE catalogue read at request time, so a price it quotes is the price the engine will charge. ⛔ It answers only from that material. grounded: false is the assistant saying it could not — a successful response whose correct rendering is a route to a human, never an error banner. A client that renders it as a failure has inverted the one property this surface exists to give (§2.44, §2.57). ⛔ It cannot read a site, a ticket, an invoice or an org: no identifier for one is accepted anywhere on this path. Anything about an existing account comes back grounded: false. ⛔ history is supplied by the CALLER because nothing is persisted — there is no account to hang a conversation on. It is bounded here and again in the engine. Charged against a fail-closed per-IP and global budget before the body is parsed, because every call is a paid model call.

Request body

NameTypeRequiredWhat it is
questionstringYesWhat the visitor asked, in their own language. ⛔ Shorter than the dashboard assistant's 4,000: a customer pastes an error log, a prospect asks a question, and an unbounded prompt…
localestringNoWhich translation of a knowledge-base article to retrieve, and the language to answer in. An unknown value falls back to English rather than failing.
currencystringNoWhich currency's catalogue prices reach the answer. ⛔ A hint, not a filter: a plan that carries no price in this currency is quoted in one it does have, clearly labelled, because…
historyPresalesTurn[]NoEarlier turns, oldest first. ⛔ The CALLER holds these because nothing is stored — there is no account to hang a conversation on and no lawful basis to keep one. They are therefore…

Response

NameTypeRequiredWhat it is
answerstringYesThe reply, in the language the visitor wrote in.
groundedbooleanYesTrue when the answer came from the supplied articles and catalogue. False when the assistant said it could not answer from them — which is the honest outcome and the one this…
citationsstring[]YesSlugs of published articles the answer used, for /kb/{slug}. ⛔ Filtered to the ones actually supplied to the model, so a fabricated citation can never render as a link to a 404.
plan_codesstring[]YesCatalogue plan codes the answer recommends or prices, filtered the same way. The site turns these into links to the page that sells them.
plansobject[]YesThe plans in plan_codes, in the same order, with the name a visitor sees. ⛔ A code is an internal identifier and is never shown; the answer text has already had every supplied…

Errors this endpoint can return

422 · 429 · 503