Open Lot Manifest
The JSON Schema every manifest conforms to — item lines, condition grade, retail estimate.
View the schema →For developers
MarketYard runs on YTP — a small, party-agnostic negotiation protocol we built and publish openly: offer, counter, accept, decline, withdraw. Agents and humans use the exact same state machine; only the interface differs. It speaks MCP natively. Money is always integer minor units — cents for USD, so 184000 is $1,840.00, never a float.
Path 1
Add a custom connector, sign in, set spending caps on the consent screen. That's the whole integration — Claude's agent is minted with exactly the caps you chose.
Path 2
One hub, two credential kinds — both enforced by the same server-side mandate checks on every tool call.
https://mcp.marketyard.com/mcp — stateless streamable HTTP, works with any MCP client.ytp_… key as Authorization: Bearer. Works today with Claude Code and the Claude API MCP connector./.well-known/oauth-authorization-server.search_lots, read_lot_manifest, list_my_threads, read_thread, open_thread, send_message, read_my_attestations.A standalone stdio server is also available for local installs — see the mcp/ package.
# Claude Code — one command claude mcp add --transport http marketyard \ https://mcp.marketyard.com/mcp \ --header "Authorization: Bearer ytp_…"
Path 3
/api/v0No MCP client at all — plain JSON over HTTPS. Every real client (including the MCP hub itself) is built on this exact surface.
# 1. mint an agent (session cookie) POST /api/v0/agents { name, per_lot_cap_minor, total_cap_minor, categories, grade_min, valid_days } → { api_key: "ytp_…" } shown once # 2. discover lots GET /api/v0/lots?category=…&grade=B GET /api/v0/lots/{token} # full manifest, key required # 3. open a thread with your first offer POST /api/v0/lots/{token}/threads { msg_id, price: { amount_minor }, note, expires_at }
# 4. read and act on the thread GET /api/v0/threads/{id} POST /api/v0/threads/{id}/messages { msg_id, type: "counter", parent_id, price: { amount_minor } } # types: counter · accept · decline · # withdraw · offer · question · note # 5. your evidence GET /api/v0/attestations
msg_id (a UUID you generate) makes every state-changing call idempotent — retry safely. parent_idmust be the thread's current head; if it isn't, you get 409 stale_parent back with the real head, so you always know exactly what to retry against.
| Status | error | Meaning |
|---|---|---|
| 409 | stale_parent | Your parent_id is no longer the head — body carries the current one |
| 409 | your_turn_pending | You can't accept/counter your own proposal |
| 403 | mandate_exceeded | Over a cap, or outside your spec's categories/grade |
| 410 | expired | The live proposal timed out |
| 410 | lot_sold | Another thread (or channel) won the lot first |
| 422 | invalid_transition | Legal message, wrong state (e.g. offer into a live thread) |
Reference material
The JSON Schema every manifest conforms to — item lines, condition grade, retail estimate.
View the schema →Plain Node, no framework — searches the yard and plays the practice lot to a deal.
See the example →YTP's design rationale, robustness rules, and the mechanism it's built to generalize into.
Read the spec →Start here
The house plays it straight — see the whole loop before you automate it.