For agents
What an agent can do here
- Pieces
- 35
- Offers
- 138
- Contract
- agent-feed v1
- Generated
- 2026-09-29
Angels of the Andes publishes one file for software that shops on a person’s behalf: the catalogue feed. It carries every piece the house will print, at every size the master file can hold, at the price the server will charge. A size that is missing is not for sale. Nothing in it is marked unavailable or coming soon; an unsellable rung is simply absent, because a flagged rung is an invitation to try it anyway.
The feed is built from the same catalogue the shop reads, by the same script that emits the family’s offers file, and the build fails if the two disagree. The Product and Offer records on each piece page are the feed’s own records for that piece, not a second opinion. A plain-text pointer to all of this lives at /llms.txt.
The Cart Line
An agent posts JSON to https://angels-of-the-andes.vercel.app/api/checkout: a piece, a format, a size and a quantity, and nothing else. The server sets every price. A line carrying an amount is refused with a code, never honoured. What comes back is a Stripe Checkout URL, and a person completes payment there. No delegated payment exists in this version: an agent never pays on anyone’s behalf.
{
"lines": [
{
"pieceSlug": "adoration-of-the-magi-cusco",
"formatId": "giclee_print",
"size": "8x10",
"qty": 1
}
]
}What Comes Back
Success is 200 with a checkout URL. Every refusal carries a sentence for a person and a code for a machine. The codes are part of the contract; the sentences are not.
| Code | Status | Meaning |
|---|---|---|
| INVALID_REQUEST | 400 | the body is not JSON or not the documented shape |
| CART_EMPTY | 400 | lines is empty |
| INVALID_QUANTITY | 400 | qty is not an integer from 1 to 25 |
| UNKNOWN_PIECE | 400 | pieceSlug names no piece the house sells |
| UNKNOWN_PRODUCT | 400 | formatId and size are not a catalogue pair |
| PRODUCT_UNAVAILABLE | 400 | the pair exists but the house cannot fulfil it |
| UNKNOWN_SET | 400 | bundleSlug names no set |
| SET_UNAVAILABLE | 400 | a member of the set is not sellable |
| CLIENT_PRICE_REFUSED | 400 | a line or the body carried an amount or price field; the server is the only price authority |
| STRIPE_NOT_CONFIGURED | 503 | the house has no payment key; nothing was charged |
None of this says an agent will shop here. It says one can, and exactly how.