Skip to main content
Use the quickstart client. Replace uppercase IDs with values from the pending request. The SAVED_*_KEY values represent persisted keys for those answers. When response.fal.phase is waiting_for_input, read response.pending_inputs for the questions or approvals that need an answer.

Answer a clarification

Render each question’s text and options using its multiple and allow_text fields. Use IDs from the pending input request.
Answer every question exactly once. Select only the returned option IDs, without duplicates. When multiple is false, select at most one option. Include free text only when allow_text is true. Each answer requires an option or nonempty text. Submit 1–20 answers, with at most 20 selected options per question and 2,000 characters of text. Model preference questions use the same answer format. Select the returned option IDs. The answer applies the requested preference change before execution continues.

Submit an approval decision

An approval identifies its target with target.item_id and target.revision. The accepted_answers field lists the permitted decisions for that target.
Send approve to allow the requested action or reject to decline it. Input request states are pending, answered, rejected, expired, and cancelled. An optional expires_at gives the expiry time. Only pending requests can accept an answer.

Resume and recover

After answering, call responses.wait(id) or responses.stream(id) with the same response ID. The agent can request another input. If the acknowledgement is lost, retry with the exact answer body and idempotency key. If the input is stale, retrieve the response and render its current pending inputs.

Recover a saved answer that could not resume

An answer can be saved before the next turn starts. If that turn fails to start, fal.pending_submission contains the input_request_id, action: "retry_input", and an error. The response stays unfinished. Polling and streaming helpers return the snapshot. Fix the reported problem. Retry responses.answer with the exact saved body and idempotency key. This resumes the saved answer without applying the decision twice. Observation alone does not retry submission.