{"openapi":"3.0.3","info":{"title":"One Stop Wedding Supplies public API","version":"1.0.0","description":"Browse the catalog and place orders for Indian wedding and pooja supplies, shipped across India.\n\nAI agents and bots are welcome to use the same public API as the website. Please send an `X-Agent-Name` header on every request (for example `X-Agent-Name: ExampleAssistant/1.0`) so the store can see which orders came from an agent. The store may switch agent orders off; the order call then answers 403.\n\nOrder flow: 1) find products (GET /api/feed/products.json or GET /api/products), 2) POST /api/cart, 3) POST /api/cart/{token}/items for each item, 4) POST /api/cart/{token}/identify with the buyer's name and phone, 5) POST /api/shipping/quote, 6) POST /api/checkout/order. Cash on Delivery orders are placed at once. For online payment the response has `payUrl`: give it to the person, who opens it and pays with UPI, card, netbanking or a wallet. The order is held for 15 minutes; after that it expires and nothing is charged. 7) POST /api/track-order for status.\n\nPrices are in Indian rupees (INR) and include everything except delivery. Shipping is calculated from the delivery pincode at checkout (POST /api/shipping/quote with the cart's sessionToken and pincode). It is never free, and there is no separate Cash on Delivery fee.\n\nRules: at most 10 of any one item per order (bulk quantities: https://onestopweddingssupplies.com/One%20Stop%20Wedding%20Supplies%20-%20Bulk%20Orders.dc.html). Cash on Delivery only where the courier offers it for the pincode, for orders up to ₹5000, and at most 2 undelivered COD orders per phone number. At most 3 unpaid online orders per cart per hour.\n\nRate limits are per IP address and answered with 429; each operation lists its own as `x-rate-limit`. Errors always look like `{ \"error\": { \"message\", \"status\" } }`; the message is written for people and safe to show.\n\nStep-by-step guide: https://onestopweddingssupplies.com/agents","contact":{"name":"One Stop Wedding Supplies","url":"https://onestopweddingssupplies.com/One%20Stop%20Wedding%20Supplies%20-%20Contact.dc.html"}},"servers":[{"url":"https://osws-backend.onestopweddingssupplies.com"}],"tags":[{"name":"Catalog"},{"name":"Cart"},{"name":"Shipping"},{"name":"Checkout"},{"name":"Orders"}],"paths":{"/api/feed/products.json":{"get":{"tags":["Catalog"],"operationId":"getProductFeed","summary":"Every product on sale, with prices, options, availability and images","description":"Cached for 5 minutes. Field names are stable: fields may be added, never renamed or removed.","parameters":[{"$ref":"#/components/parameters/AgentName"}],"x-rate-limit":"120 requests per hour per IP address","responses":{"200":{"description":"The catalog","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductFeed"},"example":{"version":1,"generated_at":"2026-10-09T10:00:00.000Z","store":{"name":"One Stop Wedding Supplies","url":"https://onestopweddingssupplies.com","country":"IN","currency":"INR"},"shipping_note":"Shipping is calculated from the delivery pincode at checkout (POST /api/shipping/quote with the cart's sessionToken and pincode). It is never free, and there is no separate Cash on Delivery fee.","max_quantity_per_item":10,"how_to_order":"https://onestopweddingssupplies.com/agents","products":[{"id":"6b0f1c8e-2d4a-4f7e-9c11-3a5b7d9e0f12","sku":"OSWS-PT-014","name":"Brass Pooja Thali Set","description":"Seven-piece brass thali for haldi and pooja ceremonies.","url":"https://onestopweddingssupplies.com/One%20Stop%20Wedding%20Supplies%20-%20Product.dc.html?id=6b0f1c8e-2d4a-4f7e-9c11-3a5b7d9e0f12","category":{"name":"Pooja Trays","slug":"pooja-trays"},"occasion":{"name":"Haldi","slug":"haldi"},"currency":"INR","price":299,"compare_at_price":null,"options":[{"id":"a1c3e5f7-0b2d-4f6a-8c9e-1d3f5a7b9c0e","name":"High","sku":"OSWS-PT-014-H","price":349,"availability":"in_stock"}],"availability":"in_stock","lead_time_days":null,"images":["https://example.supabase.co/storage/v1/object/public/product-images/pooja-thali.jpg"],"size_cm":{"length":30,"width":30,"height":5},"weight_grams":600,"material":"Brass","tags":["pooja"],"updated_at":"2026-10-08T12:00:00.000Z"}]}}}},"429":{"description":"Rate limit reached. Wait and retry later; do not retry in a loop.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"message":"You’re doing that a lot — please wait a little while and try again.","status":429}}}}}}}},"/api/products":{"get":{"tags":["Catalog"],"operationId":"listProducts","summary":"Products on sale (the website's list)","parameters":[{"$ref":"#/components/parameters/AgentName"},{"name":"q","in":"query","schema":{"type":"string"},"description":"Words in the product name","example":"thali"},{"name":"sort","in":"query","schema":{"type":"string","enum":["newest","price_low","price_high"]}},{"name":"priceMin","in":"query","schema":{"type":"number"}},{"name":"priceMax","in":"query","schema":{"type":"number"}}],"responses":{"200":{"description":"Products","content":{"application/json":{"schema":{"type":"object"},"example":{"products":[{"id":"6b0f1c8e-2d4a-4f7e-9c11-3a5b7d9e0f12","title":"Brass Pooja Thali Set","price":299,"compare_at_price":null,"stock":40,"product_images":[{"url":"https://example.supabase.co/storage/v1/object/public/product-images/pooja-thali.jpg","position":0}]}]}}}}}}},"/api/products/{id}":{"get":{"tags":["Catalog"],"operationId":"getProduct","summary":"One product with its options (product_variants), photos and specs","parameters":[{"$ref":"#/components/parameters/AgentName"},{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"},"example":"6b0f1c8e-2d4a-4f7e-9c11-3a5b7d9e0f12"}],"responses":{"200":{"description":"The product","content":{"application/json":{"schema":{"type":"object"},"example":{"product":{"id":"6b0f1c8e-2d4a-4f7e-9c11-3a5b7d9e0f12","title":"Brass Pooja Thali Set","price":299,"product_variants":[{"id":"a1c3e5f7-0b2d-4f6a-8c9e-1d3f5a7b9c0e","name":"High","price":349,"stock":12}],"product_images":[],"product_specs":[],"product_faqs":[],"product_box_items":[]}}}}},"404":{"description":"Not on sale","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"message":"Product not found: 6b0f1c8e-2d4a-4f7e-9c11-3a5b7d9e0f12","status":400}}}}}}}},"/api/cart":{"post":{"tags":["Cart"],"operationId":"createCart","summary":"Start a cart","description":"Keep `cart.session_token`: it is the cart's only key, used by every cart, shipping and checkout call.","parameters":[{"$ref":"#/components/parameters/AgentName"}],"x-rate-limit":"60 requests per hour per IP address","responses":{"201":{"description":"New empty cart","content":{"application/json":{"schema":{"type":"object"},"example":{"cart":{"session_token":"0d9c4f2a-7b1e-4c3d-9a8f-5e6b7c8d9e0f","status":"active","customer_id":null,"promo_code":null,"items":[]}}}}},"429":{"description":"Rate limit reached. Wait and retry later; do not retry in a loop.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"message":"You’re doing that a lot — please wait a little while and try again.","status":429}}}}}}}},"/api/cart/{token}":{"get":{"tags":["Cart"],"operationId":"getCart","summary":"Read a cart with its subtotal","parameters":[{"$ref":"#/components/parameters/AgentName"},{"$ref":"#/components/parameters/CartToken"}],"responses":{"200":{"description":"The cart","content":{"application/json":{"schema":{"type":"object"},"example":{"cart":{"session_token":"0d9c4f2a-7b1e-4c3d-9a8f-5e6b7c8d9e0f","status":"active","customer_id":null,"promo_code":null,"items":[{"id":"4e5f6a7b-8c9d-4e0f-a1b2-c3d4e5f6a7b8","product_id":"6b0f1c8e-2d4a-4f7e-9c11-3a5b7d9e0f12","variant_id":"a1c3e5f7-0b2d-4f6a-8c9e-1d3f5a7b9c0e","qty":2,"price_at_add":349,"name_at_add":"High"}],"subtotal":698,"discount":null}}}}},"404":{"description":"Unknown cart","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"message":"Cart not found","status":400}}}}}}}},"/api/cart/{token}/items":{"post":{"tags":["Cart"],"operationId":"addCartItem","summary":"Add a product (and option) to the cart","description":"variantId is the option id from the feed's `options` (omit it for products without options). At most 10 of one item.","parameters":[{"$ref":"#/components/parameters/AgentName"},{"$ref":"#/components/parameters/CartToken"}],"x-rate-limit":"300 requests per hour per IP address","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddItem"},"example":{"productId":"6b0f1c8e-2d4a-4f7e-9c11-3a5b7d9e0f12","variantId":"a1c3e5f7-0b2d-4f6a-8c9e-1d3f5a7b9c0e","qty":2}}}},"responses":{"201":{"description":"The updated cart","content":{"application/json":{"schema":{"type":"object"},"example":{"cart":{"session_token":"0d9c4f2a-7b1e-4c3d-9a8f-5e6b7c8d9e0f","status":"active","customer_id":null,"promo_code":null,"items":[{"id":"4e5f6a7b-8c9d-4e0f-a1b2-c3d4e5f6a7b8","product_id":"6b0f1c8e-2d4a-4f7e-9c11-3a5b7d9e0f12","variant_id":"a1c3e5f7-0b2d-4f6a-8c9e-1d3f5a7b9c0e","qty":2,"price_at_add":349,"name_at_add":"High"}]}}}}},"400":{"description":"Quantity over the limit, or a product with two or more options added without variantId (code option_required)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"message":"You can add up to 10 of each item. For larger quantities, please use our Bulk Orders form for a quote.","status":400}}}}},"404":{"description":"Product not on sale","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"message":"Product not found","status":400}}}}},"429":{"description":"Rate limit reached. Wait and retry later; do not retry in a loop.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"message":"You’re doing that a lot — please wait a little while and try again.","status":429}}}}}}}},"/api/cart/{token}/items/{itemId}":{"patch":{"tags":["Cart"],"operationId":"updateCartItem","summary":"Change an item's quantity","parameters":[{"$ref":"#/components/parameters/AgentName"},{"$ref":"#/components/parameters/CartToken"},{"$ref":"#/components/parameters/ItemId"}],"x-rate-limit":"300 requests per hour per IP address","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["qty"],"properties":{"qty":{"type":"integer","minimum":1,"maximum":10}}},"example":{"qty":3}}}},"responses":{"200":{"description":"The updated cart","content":{"application/json":{"schema":{"type":"object"},"example":{"cart":{"session_token":"0d9c4f2a-7b1e-4c3d-9a8f-5e6b7c8d9e0f","status":"active","customer_id":null,"promo_code":null,"items":[{"id":"4e5f6a7b-8c9d-4e0f-a1b2-c3d4e5f6a7b8","product_id":"6b0f1c8e-2d4a-4f7e-9c11-3a5b7d9e0f12","variant_id":"a1c3e5f7-0b2d-4f6a-8c9e-1d3f5a7b9c0e","qty":3,"price_at_add":349,"name_at_add":"High"}]}}}}},"429":{"description":"Rate limit reached. Wait and retry later; do not retry in a loop.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"message":"You’re doing that a lot — please wait a little while and try again.","status":429}}}}}}},"delete":{"tags":["Cart"],"operationId":"removeCartItem","summary":"Remove an item","parameters":[{"$ref":"#/components/parameters/AgentName"},{"$ref":"#/components/parameters/CartToken"},{"$ref":"#/components/parameters/ItemId"}],"x-rate-limit":"300 requests per hour per IP address","responses":{"200":{"description":"The updated cart","content":{"application/json":{"schema":{"type":"object"},"example":{"cart":{"session_token":"0d9c4f2a-7b1e-4c3d-9a8f-5e6b7c8d9e0f","status":"active","customer_id":null,"promo_code":null,"items":[]}}}}},"429":{"description":"Rate limit reached. Wait and retry later; do not retry in a loop.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"message":"You’re doing that a lot — please wait a little while and try again.","status":429}}}}}}}},"/api/cart/{token}/identify":{"post":{"tags":["Cart"],"operationId":"identifyBuyer","summary":"Say who is buying (required before checkout)","description":"The buyer's own name and 10-digit Indian mobile number. The phone is how they track the order. Only use details the buyer gave you for this order.","parameters":[{"$ref":"#/components/parameters/AgentName"},{"$ref":"#/components/parameters/CartToken"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Identify"},"example":{"name":"Asha Patel","phone":"9876543210","email":"asha@example.com"}}}},"responses":{"200":{"description":"The cart, now linked to a customer","content":{"application/json":{"schema":{"type":"object"},"example":{"cart":{"session_token":"0d9c4f2a-7b1e-4c3d-9a8f-5e6b7c8d9e0f","status":"active","customer_id":"c7d8e9f0-1a2b-4c3d-8e4f-5a6b7c8d9e0f","promo_code":null,"items":[{"id":"4e5f6a7b-8c9d-4e0f-a1b2-c3d4e5f6a7b8","product_id":"6b0f1c8e-2d4a-4f7e-9c11-3a5b7d9e0f12","variant_id":"a1c3e5f7-0b2d-4f6a-8c9e-1d3f5a7b9c0e","qty":2,"price_at_add":349,"name_at_add":"High"}]}}}}}}}},"/api/shipping/pincode/{pincode}":{"get":{"tags":["Shipping"],"operationId":"checkPincode","summary":"Can the store deliver to this pincode, and is Cash on Delivery available?","parameters":[{"$ref":"#/components/parameters/AgentName"},{"name":"pincode","in":"path","required":true,"schema":{"type":"string","pattern":"^[1-9][0-9]{5}$"},"example":"400001"}],"x-rate-limit":"120 requests per hour per IP address","responses":{"200":{"description":"Serviceability. status is serviceable, not_serviceable or unknown (the courier couldn't be reached: online payment still works, COD doesn't).","content":{"application/json":{"schema":{"type":"object"},"example":{"pincode":"400001","status":"serviceable","cod":true,"city":"Mumbai","state":"MH","message":"We deliver to Mumbai (400001). Cash on Delivery is available."}}}},"429":{"description":"Rate limit reached. Wait and retry later; do not retry in a loop.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"message":"You’re doing that a lot — please wait a little while and try again.","status":429}}}}}}}},"/api/shipping/quote":{"post":{"tags":["Shipping"],"operationId":"quoteShipping","summary":"Delivery charge for a cart to a pincode","description":"paymentMethod is cod or an online method (upi, card, netbanking, wallet); the charge can differ. `shipping.estimated` true means the courier's price couldn't be fetched and a flat estimate is used. The same charge is applied when the order is placed.","parameters":[{"$ref":"#/components/parameters/AgentName"}],"x-rate-limit":"120 requests per hour per IP address","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Quote"},"example":{"sessionToken":"0d9c4f2a-7b1e-4c3d-9a8f-5e6b7c8d9e0f","pincode":"400001","paymentMethod":"upi"}}}},"responses":{"200":{"description":"Quote","content":{"application/json":{"schema":{"type":"object"},"example":{"pincode":"400001","status":"serviceable","cod":true,"city":"Mumbai","state":"MH","message":"We deliver to Mumbai (400001). Cash on Delivery is available.","canDeliver":true,"codAvailable":true,"shipping":{"amount":100,"estimated":false,"source":"flat","boxCount":null}}}}},"429":{"description":"Rate limit reached. Wait and retry later; do not retry in a loop.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"message":"You’re doing that a lot — please wait a little while and try again.","status":429}}}}}}}},"/api/checkout/status":{"get":{"tags":["Checkout"],"operationId":"checkoutStatus","summary":"Is the store taking orders right now?","parameters":[{"$ref":"#/components/parameters/AgentName"}],"responses":{"200":{"description":"Switches","content":{"application/json":{"schema":{"type":"object"},"example":{"checkoutEnabled":true,"codEnabled":true,"agentOrdersEnabled":true}}}}}}},"/api/checkout/order":{"post":{"tags":["Checkout"],"operationId":"placeOrder","summary":"Place the order","description":"Uses the cart's items and the server's own prices and delivery charge; nothing price-related is taken from the request. Cash on Delivery: the order is placed and will be delivered; the buyer pays on delivery. Online (upi, card, netbanking, wallet): the response has `payUrl` and `payBy`; give the link to the buyer, who pays on the store's page. Unpaid orders expire at `payBy` (15 minutes) and nothing is charged.","parameters":[{"$ref":"#/components/parameters/AgentName"}],"x-rate-limit":"30 requests per hour per IP address","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlaceOrder"},"example":{"sessionToken":"0d9c4f2a-7b1e-4c3d-9a8f-5e6b7c8d9e0f","paymentMethod":"upi","shippingAddress":{"name":"Asha Patel","phone":"9876543210","line1":"12 Marine Lines","landmark":"Near Metro Cinema","city":"Mumbai","state":"Maharashtra","pincode":"400001"}}}}},"responses":{"201":{"description":"Order placed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlacedOrder"},"examples":{"online":{"summary":"Online payment: hand payUrl to the buyer","value":{"order":{"id":"9f8e7d6c-5b4a-4c3d-8e2f-1a0b9c8d7e6f","order_number":"OSWS-1042","status":"pending","payment_status":"pending","payment_method":"upi","total":798,"placed_via":"agent"},"razorpay":{"orderId":"order_Q1w2E3r4T5y6U7","keyId":"rzp_test_xxxxxxxxxxxxxx","amount":79800,"currency":"INR"},"payUrl":"https://onestopweddingssupplies.com/One%20Stop%20Wedding%20Supplies%20-%20Pay.dc.html?t=pGx3V2c1bU5hT3pRbGJ4dGZ3SmE","payBy":"2026-10-09T10:15:00.000Z"}},"cod":{"summary":"Cash on Delivery: placed","value":{"order":{"id":"9f8e7d6c-5b4a-4c3d-8e2f-1a0b9c8d7e6f","order_number":"OSWS-1042","status":"paid","payment_status":"pending","payment_method":"cod","total":798,"placed_via":"agent"}}}}}}},"400":{"description":"Something in the order can't be accepted (empty cart, buyer not identified, COD not available, COD over the limit, ...)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"message":"Cash on Delivery is available for orders up to ₹5000. Please pay online for this order.","status":400}}}}},"403":{"description":"The store isn't accepting agent orders right now","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"message":"This store isn’t accepting orders placed by AI agents right now. A person can still order on the website.","status":400}}}}},"409":{"description":"Not enough stock","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"message":"One or more items in your cart are no longer available in the requested quantity","status":400}}}}},"429":{"description":"Rate limit reached. Wait and retry later; do not retry in a loop.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"message":"You’re doing that a lot — please wait a little while and try again.","status":429}}}}},"503":{"description":"Checkout is switched off","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"message":"Checkout is temporarily unavailable. Your cart is saved — please try again soon.","status":400}}}}}}}},"/api/checkout/pay/{payToken}":{"get":{"tags":["Checkout"],"operationId":"paymentStatus","summary":"State of an online order's payment (what the payUrl page shows)","description":"payToken is the `t` value in payUrl. state is payable, paid, expired or cancelled. Poll at most every 10 seconds.","parameters":[{"$ref":"#/components/parameters/AgentName"},{"name":"payToken","in":"path","required":true,"schema":{"type":"string"},"example":"pGx3V2c1bU5hT3pRbGJ4dGZ3SmE"}],"x-rate-limit":"300 requests per hour per IP address","responses":{"200":{"description":"Payment state","content":{"application/json":{"schema":{"type":"object"},"example":{"state":"paid","order":{"id":"9f8e7d6c-5b4a-4c3d-8e2f-1a0b9c8d7e6f","orderNumber":"OSWS-1042","subtotal":698,"discountAmount":0,"shippingCost":100,"total":798,"currency":"INR","items":[{"name":"High","qty":2,"lineTotal":698}],"payBy":"2026-10-09T10:15:00.000Z"},"razorpay":null}}}},"404":{"description":"Unknown link","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"message":"This payment link isn’t valid.","status":400}}}}},"429":{"description":"Rate limit reached. Wait and retry later; do not retry in a loop.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"message":"You’re doing that a lot — please wait a little while and try again.","status":429}}}}}}}},"/api/track-order":{"post":{"tags":["Orders"],"operationId":"trackOrder","summary":"Order status by order number and the phone used at checkout","description":"Every miss answers 200 with order null and the same message. Limited to 20 per hour per IP and 8 per hour per order number.","parameters":[{"$ref":"#/components/parameters/AgentName"}],"x-rate-limit":"20 requests per hour per IP address","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["orderNumber","phone"],"properties":{"orderNumber":{"type":"string"},"phone":{"type":"string"}}},"example":{"orderNumber":"OSWS-1042","phone":"9876543210"}}}},"responses":{"200":{"description":"The order, or null","content":{"application/json":{"schema":{"type":"object"},"example":{"order":{"orderNumber":"OSWS-1042","status":"paid","paymentMethod":"upi","paymentStatus":"paid","total":798,"placedAt":"2026-10-09T10:00:00.000Z","courierName":null,"trackingNumber":null,"trackingUrl":null,"items":[{"name":"High","qty":2}]}}}}},"429":{"description":"Rate limit reached. Wait and retry later; do not retry in a loop.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"message":"You’re doing that a lot — please wait a little while and try again.","status":429}}}}}}}}},"components":{"parameters":{"AgentName":{"name":"X-Agent-Name","in":"header","required":false,"schema":{"type":"string","maxLength":80},"description":"Who you are, e.g. ExampleAssistant/1.0. Marks orders as placed by an agent.","example":"ExampleAssistant/1.0"},"CartToken":{"name":"token","in":"path","required":true,"schema":{"type":"string","format":"uuid"},"description":"cart.session_token from POST /api/cart","example":"0d9c4f2a-7b1e-4c3d-9a8f-5e6b7c8d9e0f"},"ItemId":{"name":"itemId","in":"path","required":true,"schema":{"type":"string","format":"uuid"},"description":"id of the line in cart.items","example":"4e5f6a7b-8c9d-4e0f-a1b2-c3d4e5f6a7b8"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"object","properties":{"message":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string","description":"Present for errors a client must react to, e.g. option_required"}}}}},"AddItem":{"type":"object","required":["productId","qty"],"properties":{"productId":{"type":"string","format":"uuid"},"variantId":{"type":"string","format":"uuid"},"qty":{"type":"integer","minimum":1,"maximum":10}}},"Identify":{"type":"object","required":["name","phone"],"properties":{"name":{"type":"string"},"phone":{"type":"string","description":"10-digit Indian mobile number"},"email":{"type":"string","format":"email"}}},"Quote":{"type":"object","required":["sessionToken","pincode"],"properties":{"sessionToken":{"type":"string"},"pincode":{"type":"string"},"paymentMethod":{"type":"string","enum":["upi","card","netbanking","wallet","cod"]}}},"Address":{"type":"object","required":["name","phone","line1","city","state","pincode"],"properties":{"name":{"type":"string"},"phone":{"type":"string"},"line1":{"type":"string"},"landmark":{"type":"string"},"city":{"type":"string"},"state":{"type":"string"},"pincode":{"type":"string"}}},"PlaceOrder":{"type":"object","required":["sessionToken","paymentMethod","shippingAddress"],"properties":{"sessionToken":{"type":"string"},"paymentMethod":{"type":"string","enum":["upi","card","netbanking","wallet","cod"]},"shippingAddress":{"$ref":"#/components/schemas/Address"}}},"PlacedOrder":{"type":"object","properties":{"order":{"type":"object","properties":{"id":{"type":"string"},"order_number":{"type":"string"},"status":{"type":"string"},"payment_status":{"type":"string"},"payment_method":{"type":"string"},"total":{"type":"number"},"placed_via":{"type":"string","enum":["web","agent"]}}},"razorpay":{"type":"object","nullable":true},"payUrl":{"type":"string","format":"uri","description":"Online payment only: the page where the buyer pays"},"payBy":{"type":"string","format":"date-time","description":"Online payment only: the order expires unpaid after this"}}},"ProductFeed":{"type":"object","properties":{"version":{"type":"integer"},"generated_at":{"type":"string","format":"date-time"},"shipping_note":{"type":"string"},"max_quantity_per_item":{"type":"integer"},"products":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"sku":{"type":"string"},"name":{"type":"string"},"description":{"type":"string"},"url":{"type":"string"},"category":{"type":"object","nullable":true},"occasion":{"type":"object","nullable":true},"currency":{"type":"string","enum":["INR"]},"price":{"type":"number"},"compare_at_price":{"type":"number","nullable":true},"options":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"sku":{"type":"string","nullable":true},"price":{"type":"number"},"availability":{"type":"string"}}}},"availability":{"type":"string","enum":["in_stock","backorder","out_of_stock"]},"lead_time_days":{"type":"integer","nullable":true},"images":{"type":"array","items":{"type":"string"}},"size_cm":{"type":"object","nullable":true},"weight_grams":{"type":"number","nullable":true}}}}}}}}}