Skip to main content
One endpoint. It resolves the checkout’s currently pending action and resumes the run. For the concepts — action keys, schema rendering, TTLs, what happens to the values you send — see User actions.

Resolve an action

Success: 200. actionId is pendingUserAction.id from the checkout object. It must belong to that checkout and still be pending.

Body

A discriminated union on action. Nothing else validates.
"submit"
required
object
required
The object described by pendingUserAction.responseSchema. Send exactly the keys in properties — the schema is additionalProperties: false, so extra keys are meaningless.Values should be strings. The API accepts any JSON here, but the engines read them as strings.

Response

200 with the full checkout object — the same shape as GET /v1/checkouts/{id}, taken after the update. pendingUserAction is gone. The status returns to running on a submit — the run has resumed. On a decline the checkout goes terminal with failure.reason: "user_cancelled".

Errors

The 409 is your idempotency signal. If your own submit retries and comes back Action already submitted, the first attempt landed — poll the checkout instead of treating it as a failure.

What happens next

1

A redacted copy is written to the action record

Card-shaped field names — card, cc-num, pan, cvc, cvv, security code, expir — become "[redacted]". Everything else is stored as sent.
2

The raw values go to a transient, delete-on-read store

Keyed by action id, with a short TTL. The only place raw values exist.
3

The resume event carries the action id and the outcome only

Never the values. The event bus persists payloads durably; values must not be in them.
4

The run resumes and consumes the values

Read inside the one step that types them, deleted once that step completes.
Submitted values are not returned by any endpoint. Full detail in What happens to submitted values.