---
title: "Answer a job's question"
method: POST
path: "/v1/jobs/{id}/answers"
tags: ["jobs"]
---

# Answer a job's question

`POST /v1/jobs/{id}/answers`

## Request

- Base URL: `https://api.pomerado.ai`
- URL: `https://api.pomerado.ai/v1/jobs/{id}/answers`
- Auth: HTTP bearer

Answer every question in a job's input request at once; the job then continues.

Secrets and website logins sent here pass through your client. To keep them private, give the person the input request's answer_url instead. Sending the same answers again counts as one answer.

## Path parameters

- `id` string, required

## Query parameters

- `include_result` 'true' | 'false'

## Request body

- object
  - `input_request_id` string, required: The input_request.id you are answering
  - `answers` object, required: Answers keyed by question ID. choice: an option ID, {"other": text} (allow_other) or {"option": id, "note": text} (allow_note). multi_choice: option IDs, or {"options": [ids]} with "other" (allow_other) and "note" (allow_note). text and secret: a string. confirm: {"confirmed": true|false}. login: {"username", "password", "save_login"}, where username is the identifier its fields name (username, email, phone or account_number), left out when they name none, and password is sent only when fields lists it. A login whose fields name several identifiers is answered at its answer_url.

## Response `202`

The job, continuing

- Job
  - `id` string, required: a job ID: job_ and 32 lowercase hex digits
  - `type` 'run' | 'build', required
  - `status` 'queued' | 'running' | 'needs_input' | 'paused' | 'succeeded' | 'failed' | 'cancelled', required
  - `tool_id` string, nullable, required
  - `input_request` InputRequest, required
    - `id` string, required: An input request ID: req_ and 32 lowercase hex digits
    - `expires_at` string, required
    - `answer_url` string, required
    - `message` string, required
    - `questions` Question[], required
      - union
        - object
          - `id` string, required
          - `prompt` string, required
          - `type` 'choice', required
          - `options` object[], required
            - `id` string, required
            - `label` string, required
          - `allow_other` boolean, required
          - `allow_note` boolean, required
        - object
          - `id` string, required
          - `prompt` string, required
          - `type` 'multi_choice', required
          - `options` object[], required
            - `id` string, required
            - `label` string, required
          - `min_selections` integer, required: an integer
          - `max_selections` integer, required: an integer
          - `allow_other` boolean, required
          - `allow_note` boolean, required
        - object
          - `id` string, required
          - `prompt` string, required
          - `type` 'text', required
          - `max_length` integer, required: an integer
        - object
          - `id` string, required
          - `prompt` string, required
          - `type` 'confirm', required
          - `follow_up` object, nullable, required
            - `prompt` string, required
        - object
          - `id` string, required
          - `prompt` string, required
          - `type` 'secret', required
          - `kind` 'one_time_code' | 'authenticator_code' | 'private_text', required
        - object
          - `id` string, required
          - `prompt` string, required
          - `type` 'login', required
          - `site_url` string, required
          - `fields` string[], required
          - `reason` 'missing' | 'rejected' | 'expired', required
          - `username_masked` string, nullable, required
          - `can_save` boolean, required
  - `pause` JobPause
    - `reason` 'question_expired' | 'sign_in_expired' | 'owner' | 'credentials_rejected', required
    - `paused_at` string, required: a string to be decoded into a Date
    - `expires_at` string, required: a string to be decoded into a Date
    - `resume_by` 'answer' | 'resume' | 'sign_in', required
  - `result` unknown, required
  - `result_file` ResultFile
    - `id` string, required
    - `name` string, required
    - `media_type` string, required
    - `size` number, required
    - `sha256` string, required
    - `download_url` string, required
    - `expires_at` string, required
  - `result_preview` unknown
  - `result_status` 'available' | 'delivered' | 'expired', nullable, required
  - `result_expires_at` string, required: a string to be decoded into a Date
  - `write_status` 'not_attempted' | 'may_have_applied' | 'applied' | 'not_applied', nullable, required
  - `login_save` object, nullable, required
    - `status` 'saved' | 'not_saved' | 'failed', required
    - `login_id` string, nullable, required
    - `reason` string, nullable, required
  - `error` Error, required
    - `error` object, required
      - `code` string, required
      - `message` string, required
      - `retryable` boolean, required
      - `docs_url` string, required
      - `details` object
  - `message` string, nullable, required
  - `maintenance` object, nullable, required
    - `status` 'repairing' | 'repaired' | 'incomplete', required
    - `result_recovered` boolean, required
    - `message` string, required
    - `deadline_at` string, nullable, required
    - `now` JobMaintenanceNow: What the repair is doing now while the run waits for it. Absent otherwise, and from an older backend
      - `label` string, required: One line for the user saying what the repair is doing now: repairing, testing the fix or publishing it
      - `started_at` string, nullable, required: When the repair's current step started (ISO 8601 UTC); null when unknown
    - `waiting_for_repair` true: Present, as true, while the run waits behind another repair of its tool, which runs first. Each time a repair publishes a fixed tool, Pomerado runs the task again on it, and repairs the tool for this run if it still fails. Absent otherwise, and from an older backend
    - `change_in_progress` true: Present, as true, with waiting_for_repair while the repair the run waits behind is a change to the tool that someone requested. When the change publishes, Pomerado runs the task again on the changed tool; deadline_at leaves the change its time to finish. Absent otherwise, and from an older backend
    - `input_refusal` JobMaintenanceInputRefusal: Present while the repair checks a value in the input that the tool refused. It finds whether the input or the tool is wrong. Absent otherwise, and from an older backend
      - `reason` string, nullable, required: The tool's own reason for refusing the value. Null from a status-only read, or when Pomerado can't read it
  - `build` JobBuild, required
    - `integration_id` string, required: an integration ID: int_ and 32 lowercase hex digits
    - `stage` 'queued' | 'checking_login' | 'exploring' | 'building' | 'publishing', required
    - `stages` object[], required
      - `key` 'queued' | 'checking_login' | 'exploring' | 'building' | 'publishing', required
      - `label` string, required
      - `status` 'done' | 'active' | 'pending', required
      - `started_at` string, nullable, required
      - `completed_at` string, nullable, required
    - `now` JobBuildNow
      - `label` string, required: One line for the user saying what the build is doing now, such as its step on the site, a test round's progress or that it waits for an answer. It changes as the build moves on
      - `started_at` string, nullable, required: When this line started (ISO 8601 UTC); null when unknown
    - `eta` object, nullable, required
      - `min_seconds` number, required
      - `max_seconds` number, required
    - `longer_than_usual` boolean: True when this build is queued or running and has run longer than usual. eta is null then
    - `example_result` unknown, required
    - `existing_tool_id` string, nullable, required
    - `change` JobChange, required
      - `revision_id` string, nullable, required
      - `previous_revision_id` string, nullable, required
      - `write_started` boolean, required
    - `recorded` boolean, required: Whether the build's browser was recorded. A Business account watches the recording on the build page, or reads there why it was removed
  - `site_url` string, nullable: The website's https origin the job was asked for: a build's site_url, or the site of the tool a run runs
  - `site_name` string, nullable: The site's name: its tool's integration's, else the integration of its website; null until one names it
  - `task` string, nullable: A build's task, or a requested change, as it was sent; null for a run and a job accepted before Pomerado kept tasks
  - `tool_name` string, nullable: The name of the tool tool_id names, as GET /v1/tools shows it
  - `waiting_since` string, nullable: When the question input_request asks was asked; null when the job asks none
  - `answered_questions` JobAnsweredQuestion[]: The questions the job asked and its member answered, oldest first; a secret, login or code shows only that it was answered
    - `request_id` string, required
    - `question_id` string, required
    - `type` string, required
    - `prompt` string, required
    - `options` string[], nullable, required: The offered options' labels, for a choice; null otherwise
    - `selected` string[], required: The labels picked
    - `other` string, nullable, required: The member's own answer instead of, or beside, the offered options
    - `note` string, nullable, required
    - `text` string, nullable, required: A text answer, or the text a confirmation sent
    - `confirmed` boolean, nullable, required
    - `answered` boolean, required: False for an optional question left unanswered
    - `value_hidden` boolean, required: True for a secret, a login, a code or a saved login's choice: it was answered, and its value is never shown
    - `asked_at` string, nullable, required
    - `answered_at` string, nullable, required
  - `warnings` JobWarning[]: What to tell the person about a build or requested change, as is, or, on the answer that accepted a run, about its call. Absent when there is none
    - `code` 'non_us_site' | 'login_not_needed', required
    - `message` string, required
  - `watch_url` string, required
  - `tip` string
  - `created_at` string, required: a string to be decoded into a Date
  - `updated_at` string, required: a string to be decoded into a Date
  - `completed_at` string, required: a string to be decoded into a Date

## Other responses

- `400`: invalid_answer, invalid_request
- `401`: unauthorized, reauthentication_required
- `403`: save_forbidden, forbidden
- `404`: not_found
- `409`: input_not_pending, site_login_exists, login_identity_conflict
- `410`: input_expired
- `413`: request_too_large
- `500`: internal_error
- `503`: temporarily_unavailable

## Changes

- **2026-10-20** `c07cea59691c`: 1 warning, 1 info
  - added the new `paused` enum value to the `status` response property for the response status `202`
  - added the optional property `pause` to the response with the `202` status

[Operation history](https://skmtc.dev/pomerado/apis/pomerado-api/changes/v1/jobs/:id/answers/post.md)

---

[API](https://skmtc.dev/pomerado/apis/pomerado-api.md) · [All operations](https://skmtc.dev/pomerado/apis/pomerado-api/llms.txt) · [OpenAPI document](https://skmtc.dev/pomerado/apis/pomerado-api/revisions/c07cea59691c?raw)
