{
  "openapi": "3.1.0",
  "info": {
    "title": "Wearo Agent Commerce API",
    "version": "1.0.0",
    "summary": "Live inventory, production capacity, pricing and deadline feasibility for a wholesale heat-transfer and custom apparel shop in South Florida.",
    "description": "Wholesale heat transfers and decorated apparel. Ready-made press-ready designs in packs of 25, custom 28x40 gang sheets, blank garments, and blanks printed to order.\n\nThis API exists so that AI assistants and automated purchasing agents can answer, without calling or emailing anyone: what does Wearo sell, what is in stock right now, how fast can it be produced, what will it cost, and can a specific deadline be met.\n\n**Which endpoint to use.** If you have a concrete order in mind ('100 black medium t-shirts with a front print, picked up by Sunday'), call `/api/agent/availability` once - it returns a yes/no, a price and a ready-by timestamp. Use `/api/agent/quote` when you need the itemised breakdown. Use `/api/agent/inventory` and `/api/agent/capacity` only when you are exploring what is possible. Use `/api/agent/business` for hours, location, fulfillment options and supported production methods.\n\n**Freshness.** Inventory and capacity are maintained by hand in a single configuration file, not read from a live POS. Every operational response therefore reports `last_updated` and `data_freshness_seconds` so you can judge how much to trust it.\n\n**Ready-made printed t-shirts.** Wearo sells the finished shirt as well as the transfer: any catalogue design pressed onto a blank it stocks, one shirt minimum. Ask for `product=ready_made_tshirt` with a `design` SKU from https://wearotransfers.com/catalog.json and the ink count, and therefore the price, is resolved from the catalogue for you. These are printed to order from blanks on the shelf rather than held as finished stock, so availability is the blank's stock plus production capacity.\n\n**Same-day service.** Wearo prints up to 300 t-shirts and hands them over the same business day, with one print position per shirt, from blanks already in stock, ordered before the same-day cutoff on a business day and within the capacity still free that day. Every operational response carries a `same_day` object saying whether the offer covers THIS order right now and, when it does not, a plain `reason`. Inside those limits it is a standing business commitment, so `deadline_guaranteed` is true.\n\n**Guarantees.** `deadline_guaranteed` is calculated from stock on hand, configured daily capacity, the next open production slot, business hours and a required safety buffer. It is never a hard-coded true, and an ordinary rush job is scheduled but never guaranteed. Separately, `business_backed_guarantees` lists the promises the business has made explicitly, including same-day and the exact conditions attached to it.\n\n**Ordering.** No endpoint takes payment or creates a binding order. `POST /api/agent/quote-request` submits a lead that a person confirms.",
    "contact": {
      "name": "Wearo",
      "url": "https://wearotransfers.com",
      "email": "danamazon6@gmail.com"
    },
    "license": {
      "name": "Public read access",
      "identifier": "LicenseRef-Public-Read"
    }
  },
  "servers": [
    {
      "url": "https://wearotransfers.com",
      "description": "Production"
    }
  ],
  "externalDocs": {
    "description": "Human-readable API documentation",
    "url": "https://wearotransfers.com/agent-api"
  },
  "tags": [
    {
      "name": "discovery",
      "description": "What the business is and does."
    },
    {
      "name": "operations",
      "description": "Live stock, capacity and feasibility."
    },
    {
      "name": "ordering",
      "description": "Requesting a human-confirmed quote."
    }
  ],
  "paths": {
    "/api/agent/business": {
      "get": {
        "operationId": "getBusiness",
        "tags": [
          "discovery"
        ],
        "summary": "Business identity, hours, location, services and supported production methods.",
        "description": "Start here to learn what this business is, whether it is open, where it is, which production methods it actually offers, whether local pickup is available, and which other endpoints exist. Contains no per-order data.",
        "responses": {
          "200": {
            "description": "Business profile.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      }
    },
    "/api/agent/inventory": {
      "get": {
        "operationId": "getInventory",
        "tags": [
          "operations"
        ],
        "summary": "Blank garment stock on hand, filterable.",
        "description": "Use this to check whether a specific blank - brand, model, color, size - is in stock and in what quantity. Pass `quantity` to have each match flagged `sufficient_inventory` and priced at that quantity break. When nothing matches, the response carries `reason_code` and real `alternatives` that are actually in stock. Pass `design` to look up a catalogue design and get its ink count, palette and transfer pack price back.",
        "parameters": [
          {
            "name": "product",
            "in": "query",
            "required": false,
            "description": "Product type. Stocked blanks: hoodie, tshirt. Also accepts 'ready_made_tshirt' (a catalogue design already printed on a blank we stock, sold as a finished shirt - pair it with `design`), 'gang_sheet' (custom 28x40 transfer sheets) and 'transfer_pack' (ready-made designs, 25 per pack). Plurals and common synonyms such as 'tee' or 'shirt' are accepted.",
            "schema": {
              "type": "string"
            },
            "example": "tshirt"
          },
          {
            "name": "brand",
            "in": "query",
            "required": false,
            "description": "Blank manufacturer, e.g. Gildan.",
            "schema": {
              "type": "string"
            },
            "example": "Gildan"
          },
          {
            "name": "model",
            "in": "query",
            "required": false,
            "description": "Blank model number, e.g. 5000.",
            "schema": {
              "type": "string"
            },
            "example": "5000"
          },
          {
            "name": "color",
            "in": "query",
            "required": false,
            "description": "Garment color. Stocked: Black, Navy, Sport Grey, White.",
            "schema": {
              "type": "string"
            },
            "example": "Black"
          },
          {
            "name": "size",
            "in": "query",
            "required": false,
            "description": "Garment size. Stocked: 2XL, L, M, S, XL. 'medium', 'M', 'XXL' and '2XL' all work.",
            "schema": {
              "type": "string"
            },
            "example": "M"
          },
          {
            "name": "sku",
            "in": "query",
            "required": false,
            "description": "Exact blank SKU, when known. Overrides brand/model/color/size.",
            "schema": {
              "type": "string"
            },
            "example": "G5000-BLK-M"
          },
          {
            "name": "design",
            "in": "query",
            "required": false,
            "description": "Catalogue design SKU for a ready-made printed t-shirt, from https://wearotransfers.com/catalog.json (157 designs). The design's real ink count is read from the catalogue and drives the price, so `colors` is not needed. An unknown SKU is refused with DESIGN_NOT_FOUND rather than quoted.",
            "schema": {
              "type": "string"
            },
            "example": "PK5028"
          },
          {
            "name": "quantity",
            "in": "query",
            "required": false,
            "description": "Quantity to test each match against.",
            "schema": {
              "type": "integer"
            },
            "example": 100
          }
        ],
        "responses": {
          "200": {
            "description": "Matching stock, or a reason none matched.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                },
                "examples": {
                  "sufficient": {
                    "value": {
                      "query": {
                        "product": "tshirt",
                        "color": "black",
                        "size": "M",
                        "quantity": 100
                      },
                      "available": true,
                      "reason_code": "OK",
                      "matches": [
                        {
                          "sku": "G5000-BLK-M",
                          "brand": "Gildan",
                          "model": "5000",
                          "color": "Black",
                          "size": "M",
                          "available_quantity": 320,
                          "sufficient_inventory": true
                        }
                      ],
                      "last_updated": "2026-09-10T09:00:00-04:00"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "A parameter could not be parsed.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "description": "A machine-readable refusal. `reason_code` is stable; `message` is for humans; `alternatives` lists real, in-stock or offered substitutes when any exist.",
                  "properties": {
                    "available": {
                      "type": "boolean"
                    },
                    "reason_code": {
                      "type": "string",
                      "enum": [
                        "CAPACITY_NOT_CONFIGURED",
                        "DEADLINE_IN_PAST",
                        "DEADLINE_NOT_FEASIBLE",
                        "DESIGN_NOT_FOUND",
                        "FULFILLMENT_NOT_OFFERED",
                        "INSUFFICIENT_INVENTORY",
                        "INVALID_PARAMETER",
                        "MISSING_PARAMETER",
                        "NO_MATCHING_INVENTORY",
                        "OK",
                        "PRODUCT_NOT_OFFERED",
                        "TOO_MANY_COLORS",
                        "UNSUPPORTED_PRINT_METHOD"
                      ],
                      "description": "Stable code describing why the request cannot be met."
                    },
                    "message": {
                      "type": "string"
                    },
                    "alternatives": {
                      "type": "array",
                      "items": {
                        "type": "object"
                      }
                    },
                    "last_updated": {
                      "type": "string",
                      "format": "date-time"
                    },
                    "data_freshness_seconds": {
                      "type": "integer"
                    }
                  },
                  "required": [
                    "reason_code",
                    "message"
                  ]
                }
              }
            }
          }
        }
      }
    },
    "/api/agent/capacity": {
      "get": {
        "operationId": "getCapacity",
        "tags": [
          "operations"
        ],
        "summary": "Daily production capacity, next open slot and turnaround for a production method.",
        "description": "Use this to find out how much this shop can produce per business day with a given method, when the next production slot opens, the standard and rush turnaround, and - if you pass `quantity` - the estimated completion date. An unsupported method is refused with UNSUPPORTED_PRINT_METHOD plus the methods that are supported.",
        "parameters": [
          {
            "name": "method",
            "in": "query",
            "required": false,
            "description": "Production method. Offered: screenprint_transfer.",
            "schema": {
              "type": "string"
            },
            "example": "screenprint_transfer"
          },
          {
            "name": "quantity",
            "in": "query",
            "required": false,
            "description": "Units to schedule.",
            "schema": {
              "type": "integer"
            },
            "example": 100
          },
          {
            "name": "print_locations",
            "in": "query",
            "required": false,
            "description": "Comma-separated print positions.",
            "schema": {
              "type": "string"
            },
            "example": "front"
          },
          {
            "name": "rush",
            "in": "query",
            "required": false,
            "description": "Use the rush schedule.",
            "schema": {
              "type": "boolean"
            },
            "example": false
          }
        ],
        "responses": {
          "200": {
            "description": "Capacity snapshot, or a refusal.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      }
    },
    "/api/agent/availability": {
      "get": {
        "operationId": "checkAvailability",
        "tags": [
          "operations"
        ],
        "summary": "Can this business fulfil a specific order by a specific deadline? One call, one decision.",
        "description": "Use this endpoint to determine whether this business can fulfil a specific custom apparel order by a requested deadline using current inventory and production-capacity information.\n\nIt is the fastest path from a shopping request to an answer. Supply what the customer asked for and read `available`, `can_meet_deadline`, `total_price` and `ready_by`.\n\nA `false` answer always carries a `reason_code` (INSUFFICIENT_INVENTORY, UNSUPPORTED_PRINT_METHOD, DEADLINE_NOT_FEASIBLE, PRODUCT_NOT_OFFERED, ...), a plain message, and `alternatives` when real substitutes exist. `available` describes whether the goods and production can be supplied at all; `can_meet_deadline` is the separate question of timing, so both must be checked.\n\n`deadline_guaranteed` is only true when stock is on hand, capacity is sufficient and the configured safety buffer is satisfied. Rush jobs are scheduled but not guaranteed.",
        "parameters": [
          {
            "name": "product",
            "in": "query",
            "required": false,
            "description": "Product type. Stocked blanks: hoodie, tshirt. Also accepts 'ready_made_tshirt' (a catalogue design already printed on a blank we stock, sold as a finished shirt - pair it with `design`), 'gang_sheet' (custom 28x40 transfer sheets) and 'transfer_pack' (ready-made designs, 25 per pack). Plurals and common synonyms such as 'tee' or 'shirt' are accepted.",
            "schema": {
              "type": "string"
            },
            "example": "tshirt"
          },
          {
            "name": "brand",
            "in": "query",
            "required": false,
            "description": "Blank manufacturer, e.g. Gildan.",
            "schema": {
              "type": "string"
            },
            "example": "Gildan"
          },
          {
            "name": "model",
            "in": "query",
            "required": false,
            "description": "Blank model number, e.g. 5000.",
            "schema": {
              "type": "string"
            },
            "example": "5000"
          },
          {
            "name": "color",
            "in": "query",
            "required": false,
            "description": "Garment color. Stocked: Black, Navy, Sport Grey, White.",
            "schema": {
              "type": "string"
            },
            "example": "Black"
          },
          {
            "name": "size",
            "in": "query",
            "required": false,
            "description": "Garment size. Stocked: 2XL, L, M, S, XL. 'medium', 'M', 'XXL' and '2XL' all work.",
            "schema": {
              "type": "string"
            },
            "example": "M"
          },
          {
            "name": "sku",
            "in": "query",
            "required": false,
            "description": "Exact blank SKU, when known. Overrides brand/model/color/size.",
            "schema": {
              "type": "string"
            },
            "example": "G5000-BLK-M"
          },
          {
            "name": "design",
            "in": "query",
            "required": false,
            "description": "Catalogue design SKU for a ready-made printed t-shirt, from https://wearotransfers.com/catalog.json (157 designs). The design's real ink count is read from the catalogue and drives the price, so `colors` is not needed. An unknown SKU is refused with DESIGN_NOT_FOUND rather than quoted.",
            "schema": {
              "type": "string"
            },
            "example": "PK5028"
          },
          {
            "name": "quantity",
            "in": "query",
            "required": true,
            "description": "How many finished units are needed. REQUIRED.",
            "schema": {
              "type": "integer"
            },
            "example": 100
          },
          {
            "name": "print_method",
            "in": "query",
            "required": false,
            "description": "Production method. Currently offered: screenprint_transfer. Anything else is refused with reason_code UNSUPPORTED_PRINT_METHOD and the list of methods that are offered.",
            "schema": {
              "type": "string"
            },
            "example": "screenprint_transfer"
          },
          {
            "name": "print_locations",
            "in": "query",
            "required": false,
            "description": "Comma-separated print positions: front, full_front, back, left_chest, right_chest, sleeve, youth_front. Each position is priced separately.",
            "schema": {
              "type": "string"
            },
            "example": "front"
          },
          {
            "name": "colors",
            "in": "query",
            "required": false,
            "description": "Number of ink colors in the artwork. Drives the per-sheet price.",
            "schema": {
              "type": "integer"
            },
            "example": 1
          },
          {
            "name": "pickup",
            "in": "query",
            "required": false,
            "description": "true for local pickup, false to ship. Defaults to pickup where pickup is offered.",
            "schema": {
              "type": "boolean"
            },
            "example": true
          },
          {
            "name": "needed_by",
            "in": "query",
            "required": false,
            "description": "Requested deadline as an ISO 8601 timestamp. Feasibility is calculated against it.",
            "schema": {
              "type": "string"
            },
            "example": "2026-09-13T12:00:00-04:00"
          },
          {
            "name": "rush",
            "in": "query",
            "required": false,
            "description": "Ask for the rush schedule explicitly. Rush is applied automatically when it is the only way to hit needed_by.",
            "schema": {
              "type": "boolean"
            },
            "example": false
          },
          {
            "name": "new_art",
            "in": "query",
            "required": false,
            "description": "true when the artwork has never been separated and screened here, which adds the setup fee.",
            "schema": {
              "type": "boolean"
            },
            "example": false
          }
        ],
        "responses": {
          "200": {
            "description": "The decision. HTTP 200 is returned for both yes and no - read `available` and `reason_code`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                },
                "examples": {
                  "yes": {
                    "summary": "100 black medium tees, front print, pickup",
                    "value": {
                      "available": true,
                      "can_meet_deadline": true,
                      "confidence": "scheduled_pending_office_confirmation_of_stock_and_capacity",
                      "inventory_confirmed": true,
                      "production_slot_confirmed": true,
                      "sku": "G5000-BLK-M",
                      "quantity": 100,
                      "inventory_on_hand": null,
                      "stock_status": "unverified",
                      "total_price": null,
                      "priced_subtotal": 150.0,
                      "price_complete": false,
                      "unpriced_lines": [
                        "garments",
                        "press_labor"
                      ],
                      "currency": "USD",
                      "ready_by": "2026-09-12T17:00:00-04:00",
                      "fulfillment": "local_pickup",
                      "pickup_location": "Fort Lauderdale, FL (exact pickup address confirmed at booking)",
                      "deadline_requested": "2026-09-13T12:00:00-04:00",
                      "deadline_guaranteed": false,
                      "guarantee_basis": "only 19.0h of slack before the deadline; 24h is required to guarantee it",
                      "reason_code": "OK",
                      "last_updated": "2026-09-10T09:00:00-04:00",
                      "data_freshness_seconds": 0
                    }
                  },
                  "insufficient_stock": {
                    "summary": "More units than are in stock",
                    "value": {
                      "available": false,
                      "can_meet_deadline": false,
                      "reason_code": "INSUFFICIENT_INVENTORY",
                      "message": "Only 320 units of G5000-BLK-M are currently available; 500 were requested.",
                      "inventory_on_hand": 320,
                      "alternatives": [
                        {
                          "sku": "G5000-WHT-M",
                          "color": "White",
                          "size": "M",
                          "available_quantity": 340
                        }
                      ]
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Missing or unparseable parameter, e.g. no `quantity`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "description": "A machine-readable refusal. `reason_code` is stable; `message` is for humans; `alternatives` lists real, in-stock or offered substitutes when any exist.",
                  "properties": {
                    "available": {
                      "type": "boolean"
                    },
                    "reason_code": {
                      "type": "string",
                      "enum": [
                        "CAPACITY_NOT_CONFIGURED",
                        "DEADLINE_IN_PAST",
                        "DEADLINE_NOT_FEASIBLE",
                        "DESIGN_NOT_FOUND",
                        "FULFILLMENT_NOT_OFFERED",
                        "INSUFFICIENT_INVENTORY",
                        "INVALID_PARAMETER",
                        "MISSING_PARAMETER",
                        "NO_MATCHING_INVENTORY",
                        "OK",
                        "PRODUCT_NOT_OFFERED",
                        "TOO_MANY_COLORS",
                        "UNSUPPORTED_PRINT_METHOD"
                      ],
                      "description": "Stable code describing why the request cannot be met."
                    },
                    "message": {
                      "type": "string"
                    },
                    "alternatives": {
                      "type": "array",
                      "items": {
                        "type": "object"
                      }
                    },
                    "last_updated": {
                      "type": "string",
                      "format": "date-time"
                    },
                    "data_freshness_seconds": {
                      "type": "integer"
                    }
                  },
                  "required": [
                    "reason_code",
                    "message"
                  ]
                },
                "example": {
                  "error": true,
                  "reason_code": "MISSING_PARAMETER",
                  "message": "'quantity' is required - how many units do you need?",
                  "field": "quantity"
                }
              }
            }
          }
        }
      }
    },
    "/api/agent/quote": {
      "get": {
        "operationId": "getQuote",
        "tags": [
          "operations"
        ],
        "summary": "Full itemised quote: garments, printing, setup, rush, fulfillment, tax and total.",
        "description": "Same inputs as /api/agent/availability, but returns the complete price breakdown, the production schedule, an expiring quote id and the next action for placing the order. Use it when the customer needs to see the numbers.",
        "parameters": [
          {
            "name": "product",
            "in": "query",
            "required": false,
            "description": "Product type. Stocked blanks: hoodie, tshirt. Also accepts 'ready_made_tshirt' (a catalogue design already printed on a blank we stock, sold as a finished shirt - pair it with `design`), 'gang_sheet' (custom 28x40 transfer sheets) and 'transfer_pack' (ready-made designs, 25 per pack). Plurals and common synonyms such as 'tee' or 'shirt' are accepted.",
            "schema": {
              "type": "string"
            },
            "example": "tshirt"
          },
          {
            "name": "brand",
            "in": "query",
            "required": false,
            "description": "Blank manufacturer, e.g. Gildan.",
            "schema": {
              "type": "string"
            },
            "example": "Gildan"
          },
          {
            "name": "model",
            "in": "query",
            "required": false,
            "description": "Blank model number, e.g. 5000.",
            "schema": {
              "type": "string"
            },
            "example": "5000"
          },
          {
            "name": "color",
            "in": "query",
            "required": false,
            "description": "Garment color. Stocked: Black, Navy, Sport Grey, White.",
            "schema": {
              "type": "string"
            },
            "example": "Black"
          },
          {
            "name": "size",
            "in": "query",
            "required": false,
            "description": "Garment size. Stocked: 2XL, L, M, S, XL. 'medium', 'M', 'XXL' and '2XL' all work.",
            "schema": {
              "type": "string"
            },
            "example": "M"
          },
          {
            "name": "sku",
            "in": "query",
            "required": false,
            "description": "Exact blank SKU, when known. Overrides brand/model/color/size.",
            "schema": {
              "type": "string"
            },
            "example": "G5000-BLK-M"
          },
          {
            "name": "design",
            "in": "query",
            "required": false,
            "description": "Catalogue design SKU for a ready-made printed t-shirt, from https://wearotransfers.com/catalog.json (157 designs). The design's real ink count is read from the catalogue and drives the price, so `colors` is not needed. An unknown SKU is refused with DESIGN_NOT_FOUND rather than quoted.",
            "schema": {
              "type": "string"
            },
            "example": "PK5028"
          },
          {
            "name": "quantity",
            "in": "query",
            "required": true,
            "description": "How many finished units are needed. REQUIRED.",
            "schema": {
              "type": "integer"
            },
            "example": 100
          },
          {
            "name": "print_method",
            "in": "query",
            "required": false,
            "description": "Production method. Currently offered: screenprint_transfer. Anything else is refused with reason_code UNSUPPORTED_PRINT_METHOD and the list of methods that are offered.",
            "schema": {
              "type": "string"
            },
            "example": "screenprint_transfer"
          },
          {
            "name": "print_locations",
            "in": "query",
            "required": false,
            "description": "Comma-separated print positions: front, full_front, back, left_chest, right_chest, sleeve, youth_front. Each position is priced separately.",
            "schema": {
              "type": "string"
            },
            "example": "front"
          },
          {
            "name": "colors",
            "in": "query",
            "required": false,
            "description": "Number of ink colors in the artwork. Drives the per-sheet price.",
            "schema": {
              "type": "integer"
            },
            "example": 1
          },
          {
            "name": "pickup",
            "in": "query",
            "required": false,
            "description": "true for local pickup, false to ship. Defaults to pickup where pickup is offered.",
            "schema": {
              "type": "boolean"
            },
            "example": true
          },
          {
            "name": "needed_by",
            "in": "query",
            "required": false,
            "description": "Requested deadline as an ISO 8601 timestamp. Feasibility is calculated against it.",
            "schema": {
              "type": "string"
            },
            "example": "2026-09-13T12:00:00-04:00"
          },
          {
            "name": "rush",
            "in": "query",
            "required": false,
            "description": "Ask for the rush schedule explicitly. Rush is applied automatically when it is the only way to hit needed_by.",
            "schema": {
              "type": "boolean"
            },
            "example": false
          },
          {
            "name": "new_art",
            "in": "query",
            "required": false,
            "description": "true when the artwork has never been separated and screened here, which adds the setup fee.",
            "schema": {
              "type": "boolean"
            },
            "example": false
          }
        ],
        "responses": {
          "200": {
            "description": "A quote, or an explained refusal.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Missing or unparseable parameter.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "description": "A machine-readable refusal. `reason_code` is stable; `message` is for humans; `alternatives` lists real, in-stock or offered substitutes when any exist.",
                  "properties": {
                    "available": {
                      "type": "boolean"
                    },
                    "reason_code": {
                      "type": "string",
                      "enum": [
                        "CAPACITY_NOT_CONFIGURED",
                        "DEADLINE_IN_PAST",
                        "DEADLINE_NOT_FEASIBLE",
                        "DESIGN_NOT_FOUND",
                        "FULFILLMENT_NOT_OFFERED",
                        "INSUFFICIENT_INVENTORY",
                        "INVALID_PARAMETER",
                        "MISSING_PARAMETER",
                        "NO_MATCHING_INVENTORY",
                        "OK",
                        "PRODUCT_NOT_OFFERED",
                        "TOO_MANY_COLORS",
                        "UNSUPPORTED_PRINT_METHOD"
                      ],
                      "description": "Stable code describing why the request cannot be met."
                    },
                    "message": {
                      "type": "string"
                    },
                    "alternatives": {
                      "type": "array",
                      "items": {
                        "type": "object"
                      }
                    },
                    "last_updated": {
                      "type": "string",
                      "format": "date-time"
                    },
                    "data_freshness_seconds": {
                      "type": "integer"
                    }
                  },
                  "required": [
                    "reason_code",
                    "message"
                  ]
                }
              }
            }
          }
        }
      }
    },
    "/api/agent/quote-request": {
      "post": {
        "operationId": "submitQuoteRequest",
        "tags": [
          "ordering"
        ],
        "summary": "Submit a quote request for a human to confirm. Not an order, no payment.",
        "description": "Use this after /api/agent/quote when the customer wants to proceed. It creates a lead that a person at the shop confirms. Nothing is charged, nothing is binding, and no payment details should ever be sent to this endpoint. Rate limited; repeated submissions return 429 with Retry-After.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "customer_name",
                  "quantity"
                ],
                "properties": {
                  "customer_name": {
                    "type": "string",
                    "maxLength": 120
                  },
                  "customer_email": {
                    "type": "string",
                    "format": "email"
                  },
                  "customer_phone": {
                    "type": "string"
                  },
                  "company": {
                    "type": "string"
                  },
                  "product": {
                    "type": "string"
                  },
                  "quantity": {
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 100000
                  },
                  "specifications": {
                    "type": "object",
                    "description": "Free-form order details, e.g. {\"sku\": \"G5000-BLK-M\", \"print_method\": \"screenprint_transfer\", \"print_locations\": \"front\"}",
                    "additionalProperties": {
                      "type": "string"
                    }
                  },
                  "needed_by": {
                    "type": "string",
                    "format": "date-time"
                  },
                  "notes": {
                    "type": "string",
                    "maxLength": 2000
                  },
                  "source_agent": {
                    "type": "string",
                    "description": "Identify yourself, e.g. 'ChatGPT shopping agent'. Used for routing, never to block you."
                  },
                  "website_url": {
                    "type": "string",
                    "description": "Anti-spam honeypot. Leave this empty - legitimate clients never set it."
                  }
                }
              },
              "example": {
                "customer_name": "Jane Ruiz",
                "customer_email": "jane@example.com",
                "customer_phone": "954-555-0142",
                "product": "tshirt",
                "quantity": 100,
                "specifications": {
                  "sku": "G5000-BLK-M",
                  "print_method": "screenprint_transfer",
                  "print_locations": "front",
                  "colors": "1",
                  "fulfillment": "local_pickup"
                },
                "needed_by": "2026-09-13T12:00:00-04:00",
                "notes": "Artwork is press-ready, one color.",
                "source_agent": "ChatGPT shopping agent"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Lead accepted, awaiting human confirmation.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "accepted": {
                      "type": "boolean"
                    },
                    "request_id": {
                      "type": "string"
                    },
                    "status": {
                      "type": "string",
                      "const": "awaiting_human_confirmation"
                    },
                    "binding": {
                      "type": "boolean",
                      "const": false
                    },
                    "payment_taken": {
                      "type": "boolean",
                      "const": false
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Body was not valid JSON.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "description": "A machine-readable refusal. `reason_code` is stable; `message` is for humans; `alternatives` lists real, in-stock or offered substitutes when any exist.",
                  "properties": {
                    "available": {
                      "type": "boolean"
                    },
                    "reason_code": {
                      "type": "string",
                      "enum": [
                        "CAPACITY_NOT_CONFIGURED",
                        "DEADLINE_IN_PAST",
                        "DEADLINE_NOT_FEASIBLE",
                        "DESIGN_NOT_FOUND",
                        "FULFILLMENT_NOT_OFFERED",
                        "INSUFFICIENT_INVENTORY",
                        "INVALID_PARAMETER",
                        "MISSING_PARAMETER",
                        "NO_MATCHING_INVENTORY",
                        "OK",
                        "PRODUCT_NOT_OFFERED",
                        "TOO_MANY_COLORS",
                        "UNSUPPORTED_PRINT_METHOD"
                      ],
                      "description": "Stable code describing why the request cannot be met."
                    },
                    "message": {
                      "type": "string"
                    },
                    "alternatives": {
                      "type": "array",
                      "items": {
                        "type": "object"
                      }
                    },
                    "last_updated": {
                      "type": "string",
                      "format": "date-time"
                    },
                    "data_freshness_seconds": {
                      "type": "integer"
                    }
                  },
                  "required": [
                    "reason_code",
                    "message"
                  ]
                }
              }
            }
          },
          "405": {
            "description": "GET is not allowed on this path."
          },
          "413": {
            "description": "Request body too large."
          },
          "422": {
            "description": "Validation failed. `errors` lists each field and why.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "accepted": {
                      "type": "boolean"
                    },
                    "errors": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "description": "A machine-readable refusal. `reason_code` is stable; `message` is for humans; `alternatives` lists real, in-stock or offered substitutes when any exist.",
                        "properties": {
                          "available": {
                            "type": "boolean"
                          },
                          "reason_code": {
                            "type": "string",
                            "enum": [
                              "CAPACITY_NOT_CONFIGURED",
                              "DEADLINE_IN_PAST",
                              "DEADLINE_NOT_FEASIBLE",
                              "DESIGN_NOT_FOUND",
                              "FULFILLMENT_NOT_OFFERED",
                              "INSUFFICIENT_INVENTORY",
                              "INVALID_PARAMETER",
                              "MISSING_PARAMETER",
                              "NO_MATCHING_INVENTORY",
                              "OK",
                              "PRODUCT_NOT_OFFERED",
                              "TOO_MANY_COLORS",
                              "UNSUPPORTED_PRINT_METHOD"
                            ],
                            "description": "Stable code describing why the request cannot be met."
                          },
                          "message": {
                            "type": "string"
                          },
                          "alternatives": {
                            "type": "array",
                            "items": {
                              "type": "object"
                            }
                          },
                          "last_updated": {
                            "type": "string",
                            "format": "date-time"
                          },
                          "data_freshness_seconds": {
                            "type": "integer"
                          }
                        },
                        "required": [
                          "reason_code",
                          "message"
                        ]
                      }
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limited. See Retry-After."
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "Error": {
        "type": "object",
        "description": "A machine-readable refusal. `reason_code` is stable; `message` is for humans; `alternatives` lists real, in-stock or offered substitutes when any exist.",
        "properties": {
          "available": {
            "type": "boolean"
          },
          "reason_code": {
            "type": "string",
            "enum": [
              "CAPACITY_NOT_CONFIGURED",
              "DEADLINE_IN_PAST",
              "DEADLINE_NOT_FEASIBLE",
              "DESIGN_NOT_FOUND",
              "FULFILLMENT_NOT_OFFERED",
              "INSUFFICIENT_INVENTORY",
              "INVALID_PARAMETER",
              "MISSING_PARAMETER",
              "NO_MATCHING_INVENTORY",
              "OK",
              "PRODUCT_NOT_OFFERED",
              "TOO_MANY_COLORS",
              "UNSUPPORTED_PRINT_METHOD"
            ],
            "description": "Stable code describing why the request cannot be met."
          },
          "message": {
            "type": "string"
          },
          "alternatives": {
            "type": "array",
            "items": {
              "type": "object"
            }
          },
          "last_updated": {
            "type": "string",
            "format": "date-time"
          },
          "data_freshness_seconds": {
            "type": "integer"
          }
        },
        "required": [
          "reason_code",
          "message"
        ]
      }
    }
  }
}