Developer docs
Build on Calmar
Two surfaces, one engine. vend for agents (Claude, Cursor, OpenClaw, anything that connects to tools) and REST for everything else. Auth is one key (clmr_…) minted at /keys. Pass it as ?key= on the vend URL or Authorization: Bearer on REST. Interop note for builders: vend speaks MCP on the wire, so every MCP client already works with zero changes.
vend — one config line
With a key, tools know who you are (no refs needed). 19 tools: get_started · find_offers · get_offer · buy · order_my_usual · create_standing_order · my_orders · order_status · request_refund · send_order_message · my_sales · mark_shipped · approve_refund · list_from_photo · create_listing · add_photo_to_listing · connect_catalog · my_listings · update_listing
REST — buying, end to end
REST — selling, end to end
All endpoints
GET/api/marketPublic catalog. Filters: q, vertical, maxPrice, fulfillment.
GET/api/offers?query=…Ranked, valid offers for a buyer intent (validity first, then value).
POST/api/order-my-usualNatural-language intent → best offer via AI reasoning → quote or buy.
POST/api/buyQuote (confirm=false) or execute (confirm=true + shippingAddress + buyerName).
GET/api/orders?buyerRef=…Buyer order history with strict statuses.
GET/api/orders/{orderId}One order + buyer-seller message thread.
POST/api/orders/{orderId}Lifecycle: mark_shipped, request_refund, approve_refund, cancel, message.
GET/api/sales?sellerRef=…Seller view: orders on your listings, with shipping addresses.
POST/api/listingsCreate a listing. GET with ?sellerRef= lists yours.
POST/api/list-from-photoPhoto → AI-drafted, priced, published listing.
POST/api/connectImport a catalog: shopify, woocommerce, url (AI extract), csv, json.
POST/api/keysSelf-serve API key for a sellerRef (idempotent).
Order state machine
status (money): pending_confirmation → settled → refund_requested → refunded, or cancelled (before settle).
shipStatus (package): label_created → awaiting_dropoff → shipped → in_transit → delivered (C2C); brands start at none → shipped.
Every order carries agentId — pass agentName (MCP) or X-Agent-Id (REST) so sellers see which agent ordered.