Eflows
/v1/eflows/{id}Update an eflow
Settings only. status is deliberately not writable — moving an eflow through its lifecycle is the publish/unpublish/archive verbs, which validate first. Requires If-Match: <version>.
Requires the eflows:write scope.
Example request
curl https://api.acquainto.com/v1/eflows/eflow_abc123 \
-H "Authorization: Bearer acq_live_xxxxxxxx" \
-X PATCH \
-H "Content-Type: application/json" \
-d '{
"title": "string",
"description": "string",
"tonePreset": "efficient",
"resumeTokenTtlHours": 1,
"notifyOnCompletion": true,
"introScreenEnabled": true,
"requireLinkToken": true,
"openingStatement": "string",
"openingStatementSurfaces": [
"hosted"
],
"completionStatement": "string",
"completionStatementSurfaces": [
"hosted"
],
"completionCtaLabel": "string",
"completionCtaUrl": "string",
"completionCtaSurfaces": [
"hosted"
],
"completionRedirectUrl": "string",
"completionEmailContent": "link_only"
}'Parameters
idpathstringrequiredA eflow id, prefixed `eflow_`.
Request body
titlestringdescriptionstring | nulltonePreset"efficient" | "friendly" | "concierge"resumeTokenTtlHoursintegernotifyOnCompletionbooleanintroScreenEnabledbooleanrequireLinkTokenbooleanopeningStatementstring | nullopeningStatementSurfacesarray of "hosted" | "iframe" | "chat_box"completionStatementstring | nullcompletionStatementSurfacesarray of "hosted" | "iframe" | "chat_box"completionCtaLabelstring | nullcompletionCtaUrlstring | nullcompletionCtaSurfacesarray of "hosted" | "chat_box"completionRedirectUrlstring | nullcompletionEmailContent"link_only" | "full"
Responses
200Update an eflowidstringrequiredA eflow id, prefixed `eflow_`.
titlestringrequireddescriptionstring | nullrequiredstatus"draft" | "live" | "paused" | "archived"requiredtonePreset"efficient" | "friendly" | "concierge"requiredresumeTokenTtlHoursintegerrequiredHow long a respondent may leave and come back before their progress expires.
notifyOnCompletionbooleanrequiredintroScreenEnabledbooleanrequiredShow the pre-conversation intro screen -- who is asking, how long it takes, where the answers go -- before the first question, with a Start button. False drops the respondent straight into turn 1, and no session (or model call) exists until they answer.
requireLinkTokenbooleanrequiredRefuse to start a new session for this eflow unless the request carries a valid link token minted by POST /v1/eflows/{id}/links. Off by default: a bare {eflowId} starts an anonymous session same as always. On, an anonymous POST /api/v1/sessions gets a 403 link_token_required -- resuming an existing session is unaffected.
openingStatementstring | nullrequiredopeningStatementSurfacesarray of "hosted" | "iframe" | "chat_box"requiredcompletionStatementstring | nullrequiredcompletionStatementSurfacesarray of "hosted" | "iframe" | "chat_box"requiredcompletionCtaLabelstring | nullrequiredcompletionCtaUrlstring | nullrequiredcompletionCtaSurfacesarray of "hosted" | "chat_box"requiredcompletionRedirectUrlstring | nullrequiredWhere a respondent is sent ~8s after the completion screen, with a visible notice they can decline. Applies where the conversation is the page (the hosted link and inline embeds); ignored in the floating chat box and iframe embeds, where navigating would move the embed rather than the page. https: only.
completionEmailContent"link_only" | "full"requiredHow much of a response a completion email carries. `full` embeds every answer inline. `link_only` sends the eflow title, respondent, completion time and question count plus a link into the app, and no answer content -- an email is the one copy of a response neither the retention sweep nor an erasure request can reach. Existing eflows are `full`; that is what they have always sent.
versionintegerrequiredIncrements on every write. Send it back as `If-Match` so a concurrent edit fails loudly instead of being clobbered.
createdAtstringrequiredupdatedAtstringrequiredpublishedAtstring | nullrequiredThe *first* time this eflow went live, not the latest -- a pause/resume cycle does not move it.
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.
409Error.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.
412Error.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.
428Error.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.