Agent Product Graph

What the API does

Three questions, the fields that make the answer safe to use, and what the catalogue contains right now.

This is a small demonstration catalogue, not live retailer inventory. Use it to understand the interface and honesty fields, not as a market snapshot.

Worked examples

Which battery fits a DeWalt DCD796?

POST /v1/products/search
{
  "query": "battery for DeWalt DCD796N",
  "limit": 5
}
match.identity

The compatible battery is identified against the drill with confirmed evidence.

price.completeness

Shipping and tax are known, so 62.49 is a comparable delivered total.

purchase_ready

Identity, stock, price and route all pass; the route is safe to show.

{
  "results": [{
    "product": {
      "title": "DeWalt DCB184 18V XR 5.0Ah Battery"
    },
    "match": {
      "type": "compatible",
      "identity": "confirmed",
      "reasons": ["Manufacturer-compatible model DCD796N"]
    },
    "best_offer": {
      "price": {
        "item": "52.99",
        "shipping": "5.00",
        "tax": "4.50",
        "total": "62.49",
        "currency": "GBP",
        "completeness": "complete",
        "unknown_components": []
      },
      "availability": "in_stock"
    },
    "purchase_ready": true
  }]

Is this barcode the exact product I asked for?

POST /v1/products/search
{
  "query": "5035048469658",
  "limit": 5
}
match.identity

The GTIN resolves to one canonical product instead of matching title text.

purchase_ready

False because the observed offer lacks tax, even though stock is known.

price.completeness

location_required prevents a total from being invented.

{
  "results": [{
    "product": {
      "title": "18V XR Lithium-Ion Battery",
      "identifiers": [{
        "type": "gtin",
        "value": "5035048469658"
      }]
    },
    "match": {
      "type": "exact",
      "identity": "confirmed",
      "reasons": ["GTIN equality"]
    },
    "best_offer": {
      "price": {
        "item": "49.99",
        "shipping": "4.95",
        "tax": null,
        "total": null,
        "currency": "GBP",
        "completeness": "location_required",
        "unknown_components": ["tax"]
      },
      "availability": "in_stock"
    },
    "purchase_ready": false
  }]

Can this be shipped today, and can I trust the total?

POST /v1/products/search
{
  "query": "DeWalt DCB184 battery",
  "limit": 5
}
best_offer

The response distinguishes item cost from delivered cost and carries an observed_at time.

price.completeness

A missing shipping amount is disclosed as unknown rather than treated as free.

purchase_ready

False because no comparable delivered total is available, even though stock is known.

{
  "coverage": {
    "merchants_searched": 3,
    "merchants_known": 4,
    "market_complete": false
  },
  "results": [{
    "product": {
      "title": "DeWalt DCB184 18V XR 5.0Ah Battery"
    },
    "match": {
      "type": "exact",
      "identity": "confirmed"
    },
    "best_offer": {
      "price": {
        "item": "55.00",
        "shipping": null,
        "tax": null,
        "total": null,
        "currency": "GBP",
        "completeness": "incomplete",
        "unknown_components": ["shipping", "tax"]
      },
      "availability": "in_stock",
      "observed_at": "2026-08-31T08:12:00Z"
    },
    "offer_count": 2,
    "purchase_ready": false
  }]

In the catalogue now

12,475
Products
14,964
Offers
989
Merchants
987
Authorised sources
Live from /public/stats

These are the merchants and sources this service has rights to search. It is not a complete view of the market.

Try it yourself

Search the demonstration catalogue without writing a client, then get a free key to send the same request over REST or MCP.