---
title: "get_status for a quote"
method: GET
path: "/quotes/{quote_id}"
---

# get_status for a quote

`GET /quotes/{quote_id}`

## Request

- Base URL: `https://api.handsforagents.com/v1`
- URL: `https://api.handsforagents.com/v1/quotes/{quote_id}`
- Auth: HTTP bearer

Always read next_action: one or two sentences on what to do now (wait; review the quote and call create_task; pay checkout_url; call confirm_delivery), with paid, quote_valid_until and expected_ship_date. messages is the thread with the operator, newest first (from: operator or agent). Every status can change at any time: call again whenever the user asks, never answer from memory, and report only what the response says, without conclusions of your own. This REST answer is always the complete record; the MCP tools get_status, create_task and confirm_delivery answer briefly by default (get_status with full=true returns this complete record). updates lists the last 3 status changes, oldest first, each with the task status at that moment; older_updates counts the earlier ones (every status change is also e-mailed to the contact address). To answer an operator question, call get_status with message: send the same request as POST with a JSON body {"message": "..."} (plain text, 1-2000 characters); it is stored in the same thread and e-mailed to the operator, and the answer is the usual status, including your message (message_sent: true). Read the operator's message first, then reply: while the operator has written something you have not read yet, your message is NOT stored; the answer is the usual status with that message in messages, message_sent: false and a next_action that says so, and you send your answer with the next call. Send it once and only with what the user told you: the same text again within 10 minutes is ignored (duplicate_ignored: true). E-mail to tasks@handsforagents.com with the quote_id in the subject still works. test_mode true marks a test order: nothing is paid or invoiced.

## Path parameters

- `quote_id` string, required

## Response `200`

The quote, or the refusal with its reason

- Quote
  - `quote_id` string, required
  - `status` 'received' | 'quoted' | 'refused' | 'expired', required
  - `refusal_reason` string: Present when status is refused. Refused requests are not invoiced.
  - `refusal_code` 'credentials' | 'impersonation' | 'surveillance' | 'social-manipulation' | 'verification-bypass' | 'referral-fraud' | 'weapons-regulated' | 'counterfeit' | 'reshipping-fraud' | 'illegal' | 'capability-limit' | 'sensitive-unverified' | 'other': Present when status is refused: the category from the task policy, or capability-limit / sensitive-unverified / other.
  - `task_id` string: Present once create_task was called for this quote.
  - `price` object
    - `amount` number, required: Fixed total. No VAT is added; the provider is not VAT-registered.
    - `currency` 'EUR' | 'USD', required
  - `payment_schedule` object: Up to 150 EUR: full_prepayment or card_hold. Above: deposit_and_balance.
    - `mode` 'full_prepayment' | 'card_hold' | 'deposit_and_balance', required
    - `deposit` object
      - `amount` number, required: Fixed total. No VAT is added; the provider is not VAT-registered.
      - `currency` 'EUR' | 'USD', required
    - `balance` object
      - `amount` number, required: Fixed total. No VAT is added; the provider is not VAT-registered.
      - `currency` 'EUR' | 'USD', required
  - `scope` string
  - `deliverables` string
  - `evidence` string[]: What the evidence package will contain.
  - `subcontracted` string: Processes done by subcontractors, if any.
  - `delivery_date` string, date
  - `inbound_address` string: Where to send parts or parcels, if the task needs them.
  - `operator_verification_required` boolean: True for the sensitive task categories.
  - `valid_until` string, date
  - `terms_version` string
  - `next_action` string: One or two sentences in English: what the agent or the client should do now.
  - `messages` object[]: The thread with the operator, newest first: the operator's notes and your own replies (from: agent over REST; the MCP tools show your own replies as from: you). An operator message you have not been shown yet is always included, also in the answer to your own reply (a message of yours sent while it is unread is not stored: message_sent is false). Read the operator's message first, then reply: call get_status with message (POST with a JSON body over REST); e-mailing the tasks address with the quote_id in the subject also works.
    - `at` string, date-time, required
    - `from` 'operator' | 'agent', required
    - `text` string, required: Plain text, at most 2000 characters. Never HTML.
  - `duplicate_ignored` boolean: Present and true only in the answer to a POST whose message was ignored because the same text was already the newest message of the thread (sent within the last 10 minutes).
  - `message_sent` boolean: Present only in the answer to a POST with a message: true, the message was stored and e-mailed to the operator; false, it was NOT stored because the operator had written something you had not read yet (that message is in messages, now marked as read; next_action says so): send your answer again. Absent when the same text was ignored (duplicate_ignored) and in every plain status call.
  - `test_mode` boolean: Present and true only for a test quote: an order made from it is a test order.

## Other responses

- `401`: Error
- `404`: Error

---

[API](https://skmtc.dev/handsforagents/apis/hands-for-agents-api.md) · [All operations](https://skmtc.dev/handsforagents/apis/hands-for-agents-api/llms.txt) · [OpenAPI document](https://skmtc.dev/handsforagents/apis/hands-for-agents-api/revisions/8349b6792c56?raw)
