> ## Documentation Index
> Fetch the complete documentation index at: https://fal.ai/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Questions and approvals

> Answer questions and approvals, then resume the same Agent response.

Use the [quickstart client](/docs/documentation/agent/sdk/quickstart#create-a-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.

```ts theme={null}
import { agent } from "./client.ts";

await agent.responses.answer(
  "RESPONSE_ID",
  {
    input_request_id: "INPUT_REQUEST_ID",
    answer: {
      kind: "answers",
      answers: [
        {
          question_id: "QUESTION_ID",
          selected_option_ids: ["OPTION_ID"],
        },
      ],
    },
  },
  { idempotencyKey: "SAVED_ANSWER_KEY" },
);
```

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.

```ts theme={null}
import { agent } from "./client.ts";

await agent.responses.answer(
  "RESPONSE_ID",
  {
    input_request_id: "INPUT_REQUEST_ID",
    answer: {
      kind: "approval",
      decision: "approve",
    },
  },
  { idempotencyKey: "SAVED_APPROVAL_KEY" },
);
```

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.
