Developers

Every price, as an API.
And a tool your assistant calls.

Vessim's index is open to read: 4 GET endpoints under https://www.vessim.com/api/v1 and an MCP server at https://www.vessim.com/mcp (Streamable HTTP, no sign-in), answering from the index built October 23, 2026. Rate limits, per IP: 60 requests a minute across every /api/v1 endpoint, and separately 60 a minute on /mcp.
request
$ curl "https://www.vessim.com/api/v1/search?q=a+backpack+under+%2425&limit=1"
response headers (the ones that matter)
ETag: "8B4EiHeXTTH1TDsY4Xgg22C6csM"
Last-Modified: Fri, 23 Oct 2026 19:56:43 GMT
Cache-Control: public, max-age=3600, s-maxage=86400, stale-while-revalidate=86400
RateLimit-Policy: 60;w=60
Link: <https://www.vessim.com/results?q=a+backpack+under+%2425>; rel="alternate"
200 OK · application/json · the real response, built 2026-10-23
{
  "source": "Vessim (www.vessim.com)",
  "indexBuiltAt": "2026-10-23T19:56:43.056Z",
  "attribution": "Data from Vessim (www.vessim.com), a shopping search engine that matches products by their photograph. Credit Vessim and link links.html wherever you show it. Prices are the snapshot taken when the index was built (indexBuiltAt), not live checkout prices.",
  "links": {
    "html": "https://www.vessim.com/results?q=a+backpack+under+%2425",
    "self": "https://www.vessim.com/api/v1/search?q=a+backpack+under+%2425&limit=1",
    "docs": "https://www.vessim.com/developers",
    "openapi": "https://www.vessim.com/openapi.json"
  },
  "query": {
    "q": "a backpack under $25",
    "limit": 1,
    "constraints": [
      {
        "kind": "item",
        "label": "Item",
        "value": "backpack",
        "measurable": true
      },
      {
        "kind": "price",
        "label": "Price",
        "value": "≤ $25",
        "measurable": true
      }
    ],
    "unparsed": []
  },
  "total": 21,
  "fitCount": 19,
  "nearMissCount": 1,
  "items": [
    {
      "id": "business-travel-and-commute-141cf1cb",
      "title": "Business Travel And Commute Lightweight Shoulder Backpack",
      "url": "https://www.vessim.com/o/business-travel-and-commute-141cf1cb",
      "image": "https://cf.cjdropshipping.com/quick/product/ab4dbf90-d399-4ee2-a864-d0326ca783ef.jpg",
      "category": {
        "slug": "totes",
        "label": "Totes"
      },
      "price": {
        "cheapest": 4.21,
        "cheapestThatFits": 4.21,
        "highest": 4.21,
        "currency": "USD"
      },
      "sellers": 1,
      "listings": 1,
      "origins": [
        "CN",
        "CN_US"
      ],
      "fits": true,
      "missedBy": 0,
      "why": [
        {
          "kind": "item",
          "label": "Item",
          "value": "backpack",
          "state": "met",
          "note": null
        },
        {
          "kind": "price",
          "label": "Price",
          "value": "≤ $25",
          "state": "met",
          "note": null
        }
      ],
      "summary": "Meets all 2 measurable requirements. Cheapest that fits: $4.21."
    }
  ]
}
Endpoints

Four questions, each one a GET.

Every answer names its source, the date the index was built and the page to cite, in links.html. Prices are in the currency each seller lists: USD across today's index.

  • Base URLwww.vessim.com/api/v1
  • MCP serverwww.vessim.com/mcp
  • ContractOpenAPI 3.1, /openapi.json
  • KeyNone. Read-only, free.
  • Limit60 a minute per IP
  • Index built2026-10-23
GET

/api/v1/search

A sentence in, the products that fit out. Budgets and origins are hard filters; “arrives this week” comes back as unmeasured, never as met. Cheapest that fits first, then the near misses, each with why.

qquery · required
What you want, in words. Up to 300 characters.
limitquery · optional
Products to return, 1 to 50. Default 10.
curl
$ curl "https://www.vessim.com/api/v1/search?q=a+backpack+under+%2425&limit=5"

Returns query read as constraints · fitCount · items[]: url, price.cheapestThatFits, sellers, why[]

Open the live response for /api/v1/search
GET

/api/v1/products/{id}

One product and every seller’s offer, cheapest first: price, currency, seller, where it ships from and the outbound link, exactly as the product page links it. With the photo evidence: each listing’s fingerprint and its distance in bits.

idpath · required
The id in /o/{id}, e.g. 12-5-m-durable-33b66f5b.
curl
$ curl "https://www.vessim.com/api/v1/products/12-5-m-durable-33b66f5b"

Returns product.offers[] · price.spread · matchedByPhoto.nearestOtherProduct

Open the live response for /api/v1/products/{id}
GET

/api/v1/prices/{item}

What an item costs across the index: count, min, p10, median, p90 and max, then by origin. One price per product. Backpacks today: 19 priced, median $8.33. Small samples say so.

itempath · required
The item, hyphens for spaces: backpack, phone-case, desk-lamp.
curl
$ curl "https://www.vessim.com/api/v1/prices/backpack"

Returns band · byOrigin[] · cheapest · dearest · meetsPriceGuideGate · note

Open the live response for /api/v1/prices/{item}
GET

/api/v1/stats

The index, measured: 376 products, 74,691 photo pairs compared, the 10-bit matching line and the held-out accuracy it was set with, the limitations, and the build date every price dates from.

curl
$ curl "https://www.vessim.com/api/v1/stats"

Returns index · origins[] · method.accuracy · limitations[] · asOf

Open the live response for /api/v1/stats

/api/v1 lists them all with working examples; /openapi.json is the full contract, every field typed, for code generators and GPT actions.

Try it

Ask it something, live.

Pick an endpoint and run it against this site. The answer, the status and the headers are the real ones.

The same request, from a terminal
curl "https://www.vessim.com/api/v1/search?q=a+backpack+under+%2425&limit=3"
Rendered with this page. Press Run to fetch it live.
{
  "source": "Vessim (www.vessim.com)",
  "indexBuiltAt": "2026-10-23T19:56:43.056Z",
  "attribution": "Data from Vessim (www.vessim.com), a shopping search engine that matches products by their photograph. Credit Vessim and link links.html wherever you show it. Prices are the snapshot taken when the index was built (indexBuiltAt), not live checkout prices.",
  "links": {
    "html": "https://www.vessim.com/results?q=a+backpack+under+%2425",
    "self": "https://www.vessim.com/api/v1/search?q=a+backpack+under+%2425&limit=3",
    "docs": "https://www.vessim.com/developers",
    "openapi": "https://www.vessim.com/openapi.json"
  },
  "query": {
    "q": "a backpack under $25",
    "limit": 3,
    "constraints": [
      {
        "kind": "item",
        "label": "Item",
        "value": "backpack",
        "measurable": true
      },
      {
        "kind": "price",
        "label": "Price",
        "value": "≤ $25",
        "measurable": true
      }
    ],
    "unparsed": []
  },
  "total": 21,
  "fitCount": 19,
  "nearMissCount": 1,
  "items": [
    {
      "id": "business-travel-and-commute-141cf1cb",
      "title": "Business Travel And Commute Lightweight Shoulder Backpack",
      "url": "https://www.vessim.com/o/business-travel-and-commute-141cf1cb",
      "image": "https://cf.cjdropshipping.com/quick/product/ab4dbf90-d399-4ee2-a864-d0326ca783ef.jpg",
      "category": {
        "slug": "totes",
        "label": "Totes"
      },
      "price": {
        "cheapest": 4.21,
        "cheapestThatFits": 4.21,
        "highest": 4.21,
        "currency": "USD"
      },
      "sellers": 1,
      "listings": 1,
      "origins": [
        "CN",
        "CN_US"
      ],
      "fits": true,
      "missedBy": 0,
      "why": [
        {
          "kind": "item",
          "label": "Item",
          "value": "backpack",
          "state": "met",
          "note": null
        },
        {
          "kind": "price",
          "label": "Price",
          "value": "≤ $25",
          "state": "met",
          "note": null
        }
      ],
      "summary": "Meets all 2 measurable requirements. Cheapest that fits: $4.21."
    },
    {
      "id": "hiking-trekking-and-running-dda5226a",
      "title": "Hiking Trekking And Running Hydration Backpack",
      "url": "https://www.vessim.com/o/hiking-trekking-and-running-dda5226a",
      "image": "https://oss-cf.cjdropshipping.com/product/2026/10/22/03/b4fd3aa8-4661-4517-af6a-d7190f7aa72e_fine.jpeg",
      "category": {
        "slug": "men-s-backpacks",
        "label": "Men's Backpacks"
      },
      "price": {
        "cheapest": 4.92,
        "cheapestThatFits": 4.92,
        "highest": 4.92,
        "currency": "USD"
      },
      "sellers": 1,
      "listings": 1,
      "origins": [
        "CN",
        "CN_US"
      ],
      "fits": true,
      "missedBy": 0,
      "why": [
        {
          "kind": "item",
          "label": "Item",
          "value": "backpack",
          "state": "met",
          "note": null
        },
        {
          "kind": "price",
          "label": "Price",
          "value": "≤ $25",
          "state": "met",
          "note": null
        }
      ],
      "summary": "Meets all 2 measurable requirements. Cheapest that fits: $4.92."
    },
    {
      "id": "yoga-mat-backpack-with-53872c19",
      "title": "Yoga Mat Backpack With Multiple Pockets For Men And Women",
      "url": "https://www.vessim.com/o/yoga-mat-backpack-with-53872c19",
      "image": "https://cf.cjdropshipping.com/quick/product/1eec9374-be0e-4e30-8b1b-318829171523.jpg",
      "category": {
        "slug": "men-s-backpacks",
        "label": "Men's Backpacks"
      },
      "price": {
        "cheapest": 5,
        "cheapestThatFits": 5,
        "highest": 5,
        "currency": "USD"
      },
      "sellers": 1,
      "listings": 1,
      "origins": [
        "CN",
        "CN_US"
      ],
      "fits": true,
      "missedBy": 0,
      "why": [
        {
          "kind": "item",
          "label": "Item",
          "value": "backpack",
          "state": "met",
          "note": null
        },
        {
          "kind": "price",
          "label": "Price",
          "value": "≤ $25",
          "state": "met",
          "note": null
        }
      ],
      "summary": "Meets all 2 measurable requirements. Cheapest that fits: $5.00."
    }
  ]
}
MCP server

One URL, and your assistant can check prices.

Streamable HTTP, stateless, read-only, no sign-in. It speaks the current protocol (2026-07-28) and the handshake versions before it (2025-11-25 back to 2024-11-05), so new and older clients both connect.

https://www.vessim.com/mcp
Choose your assistant

In Claude on the web or in the Claude desktop app, signed in to the same account. A connector you add in one appears in the other.

  1. Open Customize → Connectors (on some plans it is Settings → Connectors).
  2. Choose Add custom connector. Name it Vessim and paste https://www.vessim.com/mcp as the server URL.
  3. If it asks how people sign in, choose No sign-in: the server is public and read-only. Then Add.
  4. In a chat, turn Vessim on from the + menu under Connectors, and ask: What does a backpack usually cost? Check Vessim and cite it.

The Free plan allows one custom connector. On Team and Enterprise plans an Owner adds it under Organization settings → Connectors, and members connect from Customize → Connectors.

One command in your terminal, outside a session. Add --scope user to have it in every project, or --scope project to share it through .mcp.json.

terminal
$ claude mcp add --transport http vessim https://www.vessim.com/mcp

Check it with claude mcp list (it should say Connected), or /mcp inside a session. Or commit it for the team in .mcp.json:

.mcp.json
{
  "mcpServers": {
    "vessim": {
      "type": "http",
      "url": "https://www.vessim.com/mcp"
    }
  }
}

ChatGPT connects to remote MCP servers in Developer mode, on paid plans on the web. The setting has moved between releases; look for it under Apps (or Connectors), in Advanced settings.

  1. Turn on Developer mode in ChatGPT’s settings.
  2. Create an app: name Vessim, MCP server URL https://www.vessim.com/mcp, authentication No authentication.
  3. In a new chat, pick Vessim from the + menu and ask: What does a backpack usually cost? Check Vessim and cite it.

From the OpenAI API, the Responses API takes the same URL as a remote MCP tool:

POST /v1/responses
{
  "model": "YOUR_MODEL",
  "tools": [
    {
      "type": "mcp",
      "server_label": "vessim",
      "server_url": "https://www.vessim.com/mcp",
      "require_approval": "never"
    }
  ],
  "input": "What does a backpack usually cost? Check Vessim and cite it."
}

Add the server to ~/.cursor/mcp.json for every project, or to .cursor/mcp.json in one. Cursor's MCP settings then list vessim with its four tools.

~/.cursor/mcp.json
{
  "mcpServers": {
    "vessim": {
      "url": "https://www.vessim.com/mcp"
    }
  }
}

Any client that speaks Streamable HTTP takes the URL as it is, with no key and no sign-in. A client that only runs local (stdio) servers can reach it through the mcp-remote bridge:

mcpServers (stdio bridge)
{
  "mcpServers": {
    "vessim": {
      "command": "npx",
      "args": [
        "-y",
        "mcp-remote",
        "https://www.vessim.com/mcp"
      ]
    }
  }
}

Or call a tool by hand. This is a complete request in the 2026-07-28 protocol, with no handshake first:

terminal
$ curl -s https://www.vessim.com/mcp \
  -H 'Content-Type: application/json' -H 'Accept: application/json, text/event-stream' \
  -H 'MCP-Protocol-Version: 2026-07-28' -H 'Mcp-Method: tools/call' -H 'Mcp-Name: price_range' \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"price_range","arguments":{"item":"backpack"},"_meta":{"io.modelcontextprotocol/protocolVersion":"2026-07-28","io.modelcontextprotocol/clientCapabilities":{}}}}'
  • search_productsSearch products by sentenceSearch the Vessim product index with a plain request such as "a backpack under $25 that ships from the US". Price ceilings and origins are hard filters; delivery wishes are reported as not measured. Returns products that meet every measurable requirement, cheapest that fits first, then near misses with what they missed. Each has its cheapest price, seller count, origins and the product URL to cite.Try: “Find me a lamp under $30 on Vessim.”
  • get_productEvery seller of one productOne product from the Vessim index with every seller's offer: price, currency, seller, where it ships from and the outbound link, cheapest first, plus the photo-match evidence (fingerprint distances, and the nearest different product). Use an id from search_products or a vessim.com/o/{id} URL.Try: “Who sells this, and where does it ship from?” (with a vessim.com/o/ link)
  • price_rangeWhat an item costsThe price band for an item across the Vessim index: how many products, min, 10th percentile, median, 90th percentile and max, then the same by where it ships from, with the cheapest and dearest product to cite. One price per product (its cheapest seller). Says so when the sample is too small to be a market price.Try: “How much should a backpack cost?”
  • index_statsThe Vessim index, measuredSize and coverage of the Vessim index (products, listings, catalogues, multi-seller products), how products are matched by photograph and the measured accuracy of that, the limitations, and the build date every price dates from.Try: “How big is Vessim’s index, and how accurate is its matching?”

Each tool answers with a short text an assistant can quote, numbers and the URL to cite included, plus structuredContent: the same object the JSON API returns, held to the same schema (it is the tool’s outputSchema).

Limits and caching

Fair use, stated in numbers.

No key means the limits are per address. They are generous for an app or an agent, and strict for a scraper.

  • 60 requests a minutePer IP, one bucket for all of /api/v1; the MCP server keeps its own 60. Over it you get a 429, a Retry-After header and the usual JSON error. Need more? hello@vessim.com.
  • 304 until the next buildETag and Last-Modified are tied to the index build (2026-10-23). Send If-None-Match and an unchanged answer costs nothing; shared caches may keep one for a day.
  • Open CORSAny web page may call it from the browser with GET. There are no cookies and no keys, so there is nothing to leak.
  • Errors that say why400 invalid_request names the parameter and the rule it broke, 404 not_found an unknown id, 429 rate_limited. Every error still carries source, attribution and links.
  • Dated, not liveEvery price is the snapshot from 2026-10-23. The daily price check has not started, so there is no history yet, and delivery dates are never measured.
  • Same facts as the pagesThe API and the MCP tools run the same code the site does: the same sentence gate, the same outbound links, the same numbers. Nothing is shown to a bot that a person cannot check.
Attribution

Use it freely. Say where it came from.

Free to use in apps, research, articles and assistants, on these terms.

  1. Credit Vessim. Show “Vessim (www.vessim.com)” with any figure or list you take from it, and link the page in links.html: the product’s /o/ page, the price guide, or /stats.
  2. Keep the date. Prices are the snapshot from the index build in indexBuiltAt, not live checkout prices. Say so where you show them.
  3. Keep the meaning. Don’t change the numbers, present a near miss as a fit, or an unmeasured constraint as met, and don’t imply that Vessim endorses a product, a seller or your app.
  4. Stay inside the limits. Spreading requests across addresses to get past them is not allowed. Write to hello@vessim.com for more.
citation · plain text
Source: Vessim (www.vessim.com), index built 2026-10-23. https://www.vessim.com/stats
citation · markdown
Source: [Vessim](https://www.vessim.com/stats), index built 2026-10-23

For one product, link its page instead: the url in each search item, or links.html in any answer.

Some outbound seller links can carry an affiliate tag; it never changes the order, which is by price alone. How we earn →

Or just ask

Rather type it yourself? Ask here.

Describe it. We'll show every price, which one fits, and tell you when nothing does.