# Check a price

Assess whether a USD price is reasonable for a stated product or shopping requirement.

## What this endpoint does

Endpoint

```
POST https://mcp.gaisho.co/v1/tools/vet_price
```

Assess a quoted USD price for a specific product or a shopping requirement, with a price verdict, suggested action and supporting reasons. Use it to answer whether an offer is worth considering; use find_deals separately when the shopper wants places to buy.

- Check whether a quoted price for a named model is reasonable.
- Assess the total price of a multipack or measured quantity.
- Ask for a reference range when the shopper has not supplied a quote.

## Before you call

- Include the model, generation, size, condition and pack size when known. For a broad request, state the actual requirements instead of inventing a precise model.
- price is the final total to assess, not a per-unit price to be multiplied again. For two 500 ml bottles costing $18 in total, pass price: 18 and unit: {quantity: 1000, unit: ml}.
- Only provide known quantities. Empty packaging, explicit replicas, deposits or installment amounts, and damaged or parts-only products are not supported price assessments; the result explains this with unverifiable and action null.

Send a JSON object as the request body and authenticate with Authorization: Bearer <API key>. Amounts are in USD unless the result explicitly says otherwise.

## Request body

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| product | string | Required | Product URL, ASIN, GTIN, ID, model or description. Pass URLs and IDs alone. Must contain non-whitespace text; at most 2,000 characters (enforced by the service). |
| unit | object | Optional | Known total quantity covered by price; for example 1000 ml for two 500 ml bottles. |
| unit.quantity | number | When parent supplied | Total quantity covered by price. Must be greater than 0. |
| unit.unit | string | When parent supplied | Unit of measure for quantity, such as ml, g, count or item. Cannot be empty; up to 80 characters. |
| price | number | Optional | Total USD amount to assess, excluding tax and shipping. Must be greater than 0. |

## Example request

Set GAISHO_API_KEY in your server or local environment. These examples use a JSON POST request; Python uses the standard library and JavaScript uses Node.js fetch. The 60-second client timeout in Python and JavaScript is configurable, not a service latency guarantee.

cURL

```
curl --fail-with-body 'https://mcp.gaisho.co/v1/tools/vet_price' \
  -H "Authorization: Bearer $GAISHO_API_KEY" \
  -H 'Content-Type: application/json' \
  --data '{
  "product": "Bose QuietComfort Ultra Headphones (2nd Gen)",
  "price": 349
}'
```

Python

```
import json
import os
import urllib.error
import urllib.request

arguments = json.loads(r'''{
  "product": "Bose QuietComfort Ultra Headphones (2nd Gen)",
  "price": 349
}''')
request = urllib.request.Request(
    "https://mcp.gaisho.co/v1/tools/vet_price",
    data=json.dumps(arguments).encode("utf-8"),
    headers={
        "Authorization": "Bearer " + os.environ["GAISHO_API_KEY"],
        "Content-Type": "application/json",
    },
    method="POST",
)
try:
    with urllib.request.urlopen(request, timeout=60) as response:
        payload = json.load(response)
    print(json.dumps(payload, indent=2))
except urllib.error.HTTPError as error:
    print(error.read().decode("utf-8"))
    raise
```

JavaScript

```
// Node.js 18+; keep this code and the key on your server.
const response = await fetch("https://mcp.gaisho.co/v1/tools/vet_price", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.GAISHO_API_KEY}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
  "product": "Bose QuietComfort Ultra Headphones (2nd Gen)",
  "price": 349
}),
  signal: AbortSignal.timeout(60_000),
});
const body = await response.text();
if (!response.ok) {
  throw new Error(`HTTP ${response.status}: ${body}`);
}
const payload = JSON.parse(body);
console.log(payload);
```

## Common request patterns

### Evaluate a multipack total

The $24.99 covers the entire 81-load pack, not each load.

JSON request body

```
{
  "product": "Tide PODS Original, 81-load pack",
  "price": 24.99,
  "unit": {
    "quantity": 81,
    "unit": "load"
  }
}
```

### Request a reference without a quote

Omit price; do not pass zero as a substitute for a missing quote.

JSON request body

```
{
  "product": "Bose QuietComfort Ultra Headphones (2nd Gen)"
}
```

## Response fields

The HTTP response contains tool and a top-level summary. The other payload fields are inside result.

| Field | Type | Description |
| --- | --- | --- |
| tool | string | The tool called: vet_price. |
| result.verdict | string | good: good price; fair: reasonable; high: expensive; suspicious: unusually low and needs verification; unverifiable: unable to assess. |
| result.action | string \| null | buy_now, wait, compare, verify_seller, or null when no recommendation is available. |
| result.confidence | number | Confidence in the price judgment, from 0 to 1. |
| summary | string | A concise explanation of the judgment. |
| result.evidence | string[] | Supporting reasons. |

## Example response

Examples are illustrative and may omit optional detail fields. Prices are not live quotes; identifiers and example.com URLs are placeholders to replace, not usable product records.

HTTP 200 · illustrative, shortened

```
{
  "tool": "vet_price",
  "summary": "$349.00 is a reasonable price for Bose QuietComfort Ultra Headphones (2nd Gen).",
  "result": {
    "verdict": "fair",
    "action": "buy_now",
    "confidence": 0.65,
    "evidence": [
      "Same-model Bose QuietComfort Ultra Headphones (2nd Gen) reference: $359.99 for 1 headphone set; your quote is $10.99 lower."
    ]
  }
}
```

## How to read the result

- In REST, summary is at the top level; verdict, action, confidence and evidence are under result. MCP exposes the five fields together as the tool payload.
- verdict describes the price and action describes the next step. Read both with their explanation; do not turn a price judgment into a seller-trust judgment.
- Use confidence to guide wording: at least 0.75 permits a direct assessment; 0.45 to below 0.75 calls for a qualification based on the evidence; below 0.45 calls for any stated assumptions or limitations. It is not a calibrated probability of correctness.
- Evidence supports the judgment. A model-estimated reference is not a live seller offer; suspicious means an unusually low price needs verification, not that fraud is proven.

## Empty results and errors

| Situation | How to handle it |
| --- | --- |
| unverifiable with action null | This is an assessment outcome, not an HTTP failure. Read the explanation; provide missing product or quantity information when available. |
| No quoted price | The result is unverifiable with no purchase action; a reference range is provided when available. |
| suspicious or verify_seller | Inspect the listing and seller before paying. Use vet_seller when a seller check is needed. |
| compare | Use find_deals if the shopper wants alternative purchase options. |

A successful request can return no candidates, missing information or an unavailable assessment. Check the result before recommending a product. For request failures, use the error code and message; retrying the same invalid input will not fix it.

- [Error handling and retries](https://gaisho.co/docs/api#errors): HTTP statuses, structured errors, rate limits and quota responses.

## What to call next

- [Compare purchase options](https://gaisho.co/docs/api/find_deals): Find offers for the same product, compatible alternatives, or models with specification upgrades and downgrades.
- [Check a seller](https://gaisho.co/docs/api/vet_seller): Assess a seller or online store and return a trust assessment with supporting facts.
- [Get offer details](https://gaisho.co/docs/api/get_offer): Read a listing’s purchase URL, seller, price, coupon terms and stated product information.

- [Use this tool through MCP](https://gaisho.co/docs/mcp/vet_price): The same capability through the other connection.
- [REST API conventions](https://gaisho.co/docs/api): Authentication, response envelopes and request handling.
