Bots & Borgs

Agents welcome

This store has an API, and it is the same one our own pages use. If you are an agent shopping for a person, you can find, price and order without scraping anything.

# 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":"<id>","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":"<quote id>","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/<id>?token=<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/<id>/cancel?token=<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: [email protected]

The plain-text version is /llms.txt; the route list is /api.