Responses
/v1/responses/{id}Retrieve a response
One response with its answers — the endpoint most integrations are built around. Answers are keyed on questionKey, which is stable across edits to the question text. The conversation itself is not inlined here: fetch it from GET /v1/responses/{id}/transcript, which keeps this response a predictable size however long the conversation ran.
Requires the responses:read scope.
Example request
curl https://api.acquainto.com/v1/responses/resp_abc123 \
-H "Authorization: Bearer acq_live_xxxxxxxx"Parameters
idpathstringrequiredA response id, prefixed `resp_`.
Responses
200Retrieve a responseidstringrequiredA response id, prefixed `resp_`.
eflowIdstringrequiredA eflow id, prefixed `eflow_`.
status"active" | "completed" | "abandoned" | "expired"requiredsubjectRefstring | nullrequiredThe respondent identifier you supplied. Null once your `respondentLabelRetentionDays` policy has purged it.
refstring | nullrequiredUnverified attribution: the `?aq_ref=` value carried on the hosted eflow link, if any. This is a value the respondent's sender put on the URL, not something we verified -- treat it as a tag, never as identity. Null when the response carried none or your `respondentLabelRetentionDays` policy has since purged it (it ages out on the same clock as `subjectRef`).
startedAtstringrequiredcompletedAtstring | nullrequiredanswerCountintegerrequiredlanguagestring | nullrequiredThe language the conversation was actually held in, as a BCP-47 tag (`tr`, `pt-BR`). Detected from the respondent's first typed reply and fixed for the rest of the conversation. Null means no language was ever detected: nothing was typed, only options tapped. It is deliberately not the eflow's default language -- "we never detected one" and "this eflow opens in English" are different facts, and filtering a multi-market eflow by language needs them kept apart.
metadataobjectrequiredEverything we hold about this response that is not an answer. Carries the `metadata` you attached when the session started, and -- when the respondent arrived through a personalized link -- a `prefill` key holding, verbatim, the object you sent to `POST /v1/eflows/{id}/links`. `prefill` is what **you** asserted about this respondent, not something they confirmed. The assistant never saw it: it did not skip, shorten or pre-answer any question because of it, so a value here and an answer to the same question can legitimately disagree. Treat it as the context you sent, handed back so you can join on it.
answersarray of objectrequiredquestionKeystring | nullrequiredThe stable key. Key your own storage on this.
questionIdstringrequiredA question id, prefixed `q_`.
questionTextstringrequiredThe prompt as authored. A label, not a key -- it changes when someone fixes a typo.
valueanyThe answer as submitted, typed: a string, number, or array depending on question type. For a multiple-choice question this is the option's stored value (`"m"`) -- stable when the option is reworded, which is what makes it safe to key an enum on.
rawValuestring | nullrequiredThe same answer as display text: a multiple-choice answer's label (`"11–50"`), a multi-select joined with `, `, or a typed answer in its cleaned-up form. This is the one to show a person.
sourcestringrequiredHow the answer arrived, e.g. `chat_text`.
answeredAtstringrequiredtypestringrequiredWhat kind of question this was: `text`, `single_choice`, `multi_choice`, `scale`, `email`, `phone`, `date`, `number` or `url`. A Money amount question and a plain Number question both report `number`; the one with a `currency` is the money one.
canonicalValueanyThe answer in its real JSON type -- `1500.5` for a money amount, `9` for a rating, `"2026-10-01"` for a date, an array of option keys for a multiple choice. This is the field to do arithmetic on. Null for a skipped question.
currencystringISO 4217. Present only on a money amount.
confidence"high" | "low"Phone numbers only. `low` means the respondent gave no country code, so we delivered the digits as typed rather than invent one. Do not assume a `low` number is dialable.
scaleMinnumberRating scales only: the bottom of the range the respondent was given.
scaleMaxnumberRating scales only: the top of the range. A 7 means nothing without it.
lowConfidenceobject | nullrequiredPresent only when this answer was accepted without the engine being able to ground a follow-up it wanted to ask -- worth a human look. Null for every answer the engine had no concern about, which is almost all of them.
reason"ungrounded_followup" | "unconfigured_options"required`ungrounded_followup`: the model itself judged the answer too vague to act on but had no way to narrow it without inventing something the eflow never configured. `unconfigured_options`: the model wrote a follow-up anyway and this caught it offering options nobody configured, so the follow-up was withheld.
detailstringrequiredWhat was unclear or withheld, truncated to 280 characters. A review hint, not a transcript.
400The request was malformed or failed validation.errorobjectrequiredtype"invalid_request_error" | "authentication_error" | "permission_error" | "not_found_error" | "idempotency_error" | "rate_limit_error" | "api_error"requiredThe bucket a client branches on to decide how to react.
codestringrequiredStable machine-readable code. Branch on this, not on `message`.
messagestringrequiredHuman-readable. May change without notice.
paramstringThe offending request field, when the error names one.
requestIdstringrequiredEchoes the `req_...` id; quote it in support requests.
401Missing, invalid, or revoked credential.errorobjectrequiredtype"invalid_request_error" | "authentication_error" | "permission_error" | "not_found_error" | "idempotency_error" | "rate_limit_error" | "api_error"requiredThe bucket a client branches on to decide how to react.
codestringrequiredStable machine-readable code. Branch on this, not on `message`.
messagestringrequiredHuman-readable. May change without notice.
paramstringThe offending request field, when the error names one.
requestIdstringrequiredEchoes the `req_...` id; quote it in support requests.
403The credential lacks the scope this route requires.errorobjectrequiredtype"invalid_request_error" | "authentication_error" | "permission_error" | "not_found_error" | "idempotency_error" | "rate_limit_error" | "api_error"requiredThe bucket a client branches on to decide how to react.
codestringrequiredStable machine-readable code. Branch on this, not on `message`.
messagestringrequiredHuman-readable. May change without notice.
paramstringThe offending request field, when the error names one.
requestIdstringrequiredEchoes the `req_...` id; quote it in support requests.
404No such resource, or it belongs to another tenant.errorobjectrequiredtype"invalid_request_error" | "authentication_error" | "permission_error" | "not_found_error" | "idempotency_error" | "rate_limit_error" | "api_error"requiredThe bucket a client branches on to decide how to react.
codestringrequiredStable machine-readable code. Branch on this, not on `message`.
messagestringrequiredHuman-readable. May change without notice.
paramstringThe offending request field, when the error names one.
requestIdstringrequiredEchoes the `req_...` id; quote it in support requests.
429Rate limited. Retry after the interval in `Retry-After`.errorobjectrequiredtype"invalid_request_error" | "authentication_error" | "permission_error" | "not_found_error" | "idempotency_error" | "rate_limit_error" | "api_error"requiredThe bucket a client branches on to decide how to react.
codestringrequiredStable machine-readable code. Branch on this, not on `message`.
messagestringrequiredHuman-readable. May change without notice.
paramstringThe offending request field, when the error names one.
requestIdstringrequiredEchoes the `req_...` id; quote it in support requests.
500Something failed on our side. Safe to retry.errorobjectrequiredtype"invalid_request_error" | "authentication_error" | "permission_error" | "not_found_error" | "idempotency_error" | "rate_limit_error" | "api_error"requiredThe bucket a client branches on to decide how to react.
codestringrequiredStable machine-readable code. Branch on this, not on `message`.
messagestringrequiredHuman-readable. May change without notice.
paramstringThe offending request field, when the error names one.
requestIdstringrequiredEchoes the `req_...` id; quote it in support requests.
Browse every operation, with full request/response schemas, in the full API reference.