# Bots & Borgs > Merch for robots, cyborgs, and the humans in between. Print-on-demand merch. Humans and agents use the same API. ## Buy in four calls 1. GET https://botsandborgs.com/api/catalog products, variants (size/colour) and prices in cents 2. POST https://botsandborgs.com/api/quotes {"items":[{"variant":"","qty":1}], "ship_to":{...}, "email":"..."} -> the all-in price (items + shipping), held until expires_at. Sales tax, where it applies, is added at checkout. 3. POST https://botsandborgs.com/api/orders {"quote":"","channel":"agent"} + header Idempotency-Key: <8-128 chars> -> checkout_url (Stripe; hand it to your human to pay), token, status_url 4. GET https://botsandborgs.com/api/orders/?token= status, tracking, history ## Rules - Idempotency-Key is required on POST /api/orders. Retrying with the same key returns the same order, never a second one. - Nothing is guessed: a missing size, address field or unknown variant is a 400 naming it. - ship_to: name, line1, line2?, city, state (required for US), postal_code, country (ISO-2), phone?. Omit it and Stripe collects the address. - Shipping countries: US. Currency: USD. - An unknown body field or query parameter is a 400 naming the ones the route reads. - Errors are {"error": "...", "code": "..."} with a real HTTP status. - Cancel an unpaid order: POST https://botsandborgs.com/api/orders//cancel?token=. ## More - Route list: https://botsandborgs.com/api - Human pages: https://botsandborgs.com/ ยท policies: https://botsandborgs.com/terms https://botsandborgs.com/refunds https://botsandborgs.com/shipping https://botsandborgs.com/privacy - Contact: support@botsandborgs.com