Acquainto
← API reference

Responses

GET/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

  • idpathstringrequired

    A response id, prefixed `resp_`.

Responses

200Retrieve a response
  • idstringrequired

    A response id, prefixed `resp_`.

  • eflowIdstringrequired

    A eflow id, prefixed `eflow_`.

  • status"active" | "completed" | "abandoned" | "expired"required
  • subjectRefstring | nullrequired

    The respondent identifier you supplied. Null once your `respondentLabelRetentionDays` policy has purged it.

  • refstring | nullrequired

    Unverified 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`).

  • startedAtstringrequired
  • completedAtstring | nullrequired
  • answerCountintegerrequired
  • languagestring | nullrequired

    The 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.

  • metadataobjectrequired

    Everything 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 objectrequired
    • questionKeystring | nullrequired

      The stable key. Key your own storage on this.

    • questionIdstringrequired

      A question id, prefixed `q_`.

    • questionTextstringrequired

      The prompt as authored. A label, not a key -- it changes when someone fixes a typo.

    • valueany

      The 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 | nullrequired

      The 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.

    • sourcestringrequired

      How the answer arrived, e.g. `chat_text`.

    • answeredAtstringrequired
    • typestringrequired

      What 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.

    • canonicalValueany

      The 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.

    • currencystring

      ISO 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.

    • scaleMinnumber

      Rating scales only: the bottom of the range the respondent was given.

    • scaleMaxnumber

      Rating scales only: the top of the range. A 7 means nothing without it.

    • lowConfidenceobject | nullrequired

      Present 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.

      • detailstringrequired

        What was unclear or withheld, truncated to 280 characters. A review hint, not a transcript.

400The request was malformed or failed validation.
  • errorobjectrequired
    • type"invalid_request_error" | "authentication_error" | "permission_error" | "not_found_error" | "idempotency_error" | "rate_limit_error" | "api_error"required

      The bucket a client branches on to decide how to react.

    • codestringrequired

      Stable machine-readable code. Branch on this, not on `message`.

    • messagestringrequired

      Human-readable. May change without notice.

    • paramstring

      The offending request field, when the error names one.

    • requestIdstringrequired

      Echoes the `req_...` id; quote it in support requests.

401Missing, invalid, or revoked credential.
  • errorobjectrequired
    • type"invalid_request_error" | "authentication_error" | "permission_error" | "not_found_error" | "idempotency_error" | "rate_limit_error" | "api_error"required

      The bucket a client branches on to decide how to react.

    • codestringrequired

      Stable machine-readable code. Branch on this, not on `message`.

    • messagestringrequired

      Human-readable. May change without notice.

    • paramstring

      The offending request field, when the error names one.

    • requestIdstringrequired

      Echoes the `req_...` id; quote it in support requests.

403The credential lacks the scope this route requires.
  • errorobjectrequired
    • type"invalid_request_error" | "authentication_error" | "permission_error" | "not_found_error" | "idempotency_error" | "rate_limit_error" | "api_error"required

      The bucket a client branches on to decide how to react.

    • codestringrequired

      Stable machine-readable code. Branch on this, not on `message`.

    • messagestringrequired

      Human-readable. May change without notice.

    • paramstring

      The offending request field, when the error names one.

    • requestIdstringrequired

      Echoes the `req_...` id; quote it in support requests.

404No such resource, or it belongs to another tenant.
  • errorobjectrequired
    • type"invalid_request_error" | "authentication_error" | "permission_error" | "not_found_error" | "idempotency_error" | "rate_limit_error" | "api_error"required

      The bucket a client branches on to decide how to react.

    • codestringrequired

      Stable machine-readable code. Branch on this, not on `message`.

    • messagestringrequired

      Human-readable. May change without notice.

    • paramstring

      The offending request field, when the error names one.

    • requestIdstringrequired

      Echoes the `req_...` id; quote it in support requests.

429Rate limited. Retry after the interval in `Retry-After`.
  • errorobjectrequired
    • type"invalid_request_error" | "authentication_error" | "permission_error" | "not_found_error" | "idempotency_error" | "rate_limit_error" | "api_error"required

      The bucket a client branches on to decide how to react.

    • codestringrequired

      Stable machine-readable code. Branch on this, not on `message`.

    • messagestringrequired

      Human-readable. May change without notice.

    • paramstring

      The offending request field, when the error names one.

    • requestIdstringrequired

      Echoes the `req_...` id; quote it in support requests.

500Something failed on our side. Safe to retry.
  • errorobjectrequired
    • type"invalid_request_error" | "authentication_error" | "permission_error" | "not_found_error" | "idempotency_error" | "rate_limit_error" | "api_error"required

      The bucket a client branches on to decide how to react.

    • codestringrequired

      Stable machine-readable code. Branch on this, not on `message`.

    • messagestringrequired

      Human-readable. May change without notice.

    • paramstring

      The offending request field, when the error names one.

    • requestIdstringrequired

      Echoes the `req_...` id; quote it in support requests.

Browse every operation, with full request/response schemas, in the full API reference.