{"openapi": "3.1.0", "info": {"title": "BuildplateCo guest agent ordering API", "version": "1.0.0", "description": "BuildplateCo quotes STL/STEP models and sells custom 3D prints to guests; no customer account is needed. Get the catalog, create a guest session, quote the customer's file, inspect the quote and quantity, then preview the complete order. Orders allow up to 20 distinct parts and 999 total units. Dimensions are millimeters; shipping is U.S. only. Slicing may take minutes. Use the same idempotency key and identical arguments to recover an interrupted upload; do not create duplicate quotes. Protect the returned session token as a password. Before create_checkout, obtain the customer's authorization for the exact preview total, USD currency, items and shipping address. The preview expires after 15 minutes. create_checkout returns a secure Stripe-hosted payment URL, not a paid order. Open that URL to finish payment using available Stripe methods, including Link when enabled. Never ask for or send card details to these tools. get_order_status verifies Stripe payment and may save a newly paid state and trigger the paid-order receipt. The user's agent must support these HTTP APIs or remote MCP; compatibility and autonomous payment support vary by agent."}, "servers": [{"url": "https://buildplateco.com"}], "security": [], "paths": {"/api/agent/v1/catalog/": {"get": {"operationId": "catalog", "summary": "Get current printing options, limits and payment availability", "responses": {"200": {"description": "Successful result.", "content": {"application/json": {"schema": {"type": "object"}}}}, "400": {"description": "Invalid input; inspect the error and fields before retrying.", "content": {"application/json": {"schema": {"type": "object"}}}}, "401": {"description": "Missing, invalid or expired guest bearer token.", "content": {"application/json": {"schema": {"type": "object"}}}}, "404": {"description": "Session, quote or order not found in this session.", "content": {"application/json": {"schema": {"type": "object"}}}}, "409": {"description": "Conflicting idempotency key, unfinished quote, changed/expired preview or existing order conflict.", "content": {"application/json": {"schema": {"type": "object"}}}}, "413": {"description": "Model or request exceeds the allowed upload size.", "content": {"application/json": {"schema": {"type": "object"}}}}, "415": {"description": "Use the operation's documented request Content-Type.", "content": {"application/json": {"schema": {"type": "object"}}}}, "429": {"description": "Rate limited; wait before retrying.", "content": {"application/json": {"schema": {"type": "object"}}}}, "503": {"description": "Slicing, shipping or payment service unavailable; order has not been paid.", "content": {"application/json": {"schema": {"type": "object"}}}}}}}, "/api/agent/v1/sessions/": {"post": {"operationId": "create_guest_session", "summary": "Create a guest session; no customer account required", "responses": {"201": {"description": "Private session_id and token; bearer expires after 7 days. Creation is IP rate limited.", "content": {"application/json": {"schema": {"type": "object", "properties": {"session_id": {"type": "string", "format": "uuid"}, "token": {"type": "string"}, "token_type": {"type": "string", "enum": ["Bearer"]}, "expires_at": {"type": "string", "format": "date-time"}, "next_action": {"type": "string"}}, "required": ["session_id", "token", "token_type", "expires_at"], "additionalProperties": false}}}}, "400": {"description": "Invalid input; inspect the error and fields before retrying.", "content": {"application/json": {"schema": {"type": "object"}}}}, "401": {"description": "Missing, invalid or expired guest bearer token.", "content": {"application/json": {"schema": {"type": "object"}}}}, "404": {"description": "Session, quote or order not found in this session.", "content": {"application/json": {"schema": {"type": "object"}}}}, "409": {"description": "Conflicting idempotency key, unfinished quote, changed/expired preview or existing order conflict.", "content": {"application/json": {"schema": {"type": "object"}}}}, "413": {"description": "Model or request exceeds the allowed upload size.", "content": {"application/json": {"schema": {"type": "object"}}}}, "415": {"description": "Use the operation's documented request Content-Type.", "content": {"application/json": {"schema": {"type": "object"}}}}, "429": {"description": "Rate limited; wait before retrying.", "content": {"application/json": {"schema": {"type": "object"}}}}, "503": {"description": "Slicing, shipping or payment service unavailable; order has not been paid.", "content": {"application/json": {"schema": {"type": "object"}}}}}}}, "/api/agent/v1/sessions/{session_id}/quotes/": {"post": {"operationId": "quote_model", "summary": "Upload and slice a model; may take minutes", "responses": {"201": {"description": "New quote result. Identical idempotent replays return the existing quote with HTTP 200; pending work may return HTTP 202.", "content": {"application/json": {"schema": {"type": "object", "properties": {"quote_id": {"type": "integer", "minimum": 1}, "status": {"type": "string", "enum": ["pending", "completed", "failed"]}, "file_name": {"type": "string"}, "dimensions_mm": {"type": "array", "minItems": 3, "maxItems": 3, "items": {"type": "string"}}, "material": {"type": "string", "description": "Active material code from catalog; for example pla or petg.", "minLength": 1, "maxLength": 20, "default": "pla"}, "color": {"type": "string", "description": "Available color code from the material catalog; omitted uses this material's default.", "minLength": 1, "maxLength": 20}, "quality": {"type": "string", "description": "Active quality code from catalog.", "enum": ["draft", "standard", "fine"], "default": "standard"}, "infill_percent": {"type": "integer", "enum": [15, 20, 25, 30, 35, 100], "default": 15}, "orientation_mode": {"type": "string", "description": "Automatic orientation or retain the uploaded orientation.", "enum": ["auto_orient", "keep_uploaded"], "default": "auto_orient"}, "quantity": {"type": "integer", "minimum": 1, "maximum": 999, "default": 1}, "currency": {"type": "string", "enum": ["USD"]}, "shipping_included": {"type": "boolean", "const": false}, "quote_url": {"type": "string", "format": "uri"}, "unit_price": {"type": "string", "description": "Decimal monetary amount.", "pattern": "^\\d+\\.\\d{2}$"}, "line_total": {"type": "string", "description": "Decimal monetary amount.", "pattern": "^\\d+\\.\\d{2}$"}, "production_days": {"type": "integer"}, "next_action": {"type": "string"}, "retry_after_seconds": {"type": "integer"}, "error": {"type": "object"}}, "required": ["quote_id", "status", "currency", "quote_url"]}}}}, "400": {"description": "Invalid input; inspect the error and fields before retrying.", "content": {"application/json": {"schema": {"type": "object"}}}}, "401": {"description": "Missing, invalid or expired guest bearer token.", "content": {"application/json": {"schema": {"type": "object"}}}}, "404": {"description": "Session, quote or order not found in this session.", "content": {"application/json": {"schema": {"type": "object"}}}}, "409": {"description": "Conflicting idempotency key, unfinished quote, changed/expired preview or existing order conflict.", "content": {"application/json": {"schema": {"type": "object"}}}}, "413": {"description": "Model or request exceeds the allowed upload size.", "content": {"application/json": {"schema": {"type": "object"}}}}, "415": {"description": "Use the operation's documented request Content-Type.", "content": {"application/json": {"schema": {"type": "object"}}}}, "429": {"description": "Rate limited; wait before retrying.", "content": {"application/json": {"schema": {"type": "object"}}}}, "503": {"description": "Slicing, shipping or payment service unavailable; order has not been paid.", "content": {"application/json": {"schema": {"type": "object"}}}}, "200": {"description": "Existing quote returned by an identical Idempotency-Key replay.", "content": {"application/json": {"schema": {"type": "object", "properties": {"quote_id": {"type": "integer", "minimum": 1}, "status": {"type": "string", "enum": ["pending", "completed", "failed"]}, "file_name": {"type": "string"}, "dimensions_mm": {"type": "array", "minItems": 3, "maxItems": 3, "items": {"type": "string"}}, "material": {"type": "string", "description": "Active material code from catalog; for example pla or petg.", "minLength": 1, "maxLength": 20, "default": "pla"}, "color": {"type": "string", "description": "Available color code from the material catalog; omitted uses this material's default.", "minLength": 1, "maxLength": 20}, "quality": {"type": "string", "description": "Active quality code from catalog.", "enum": ["draft", "standard", "fine"], "default": "standard"}, "infill_percent": {"type": "integer", "enum": [15, 20, 25, 30, 35, 100], "default": 15}, "orientation_mode": {"type": "string", "description": "Automatic orientation or retain the uploaded orientation.", "enum": ["auto_orient", "keep_uploaded"], "default": "auto_orient"}, "quantity": {"type": "integer", "minimum": 1, "maximum": 999, "default": 1}, "currency": {"type": "string", "enum": ["USD"]}, "shipping_included": {"type": "boolean", "const": false}, "quote_url": {"type": "string", "format": "uri"}, "unit_price": {"type": "string", "description": "Decimal monetary amount.", "pattern": "^\\d+\\.\\d{2}$"}, "line_total": {"type": "string", "description": "Decimal monetary amount.", "pattern": "^\\d+\\.\\d{2}$"}, "production_days": {"type": "integer"}, "next_action": {"type": "string"}, "retry_after_seconds": {"type": "integer"}, "error": {"type": "object"}}, "required": ["quote_id", "status", "currency", "quote_url"]}}}}, "202": {"description": "The identical upload is still slicing; retry the same request with the same key.", "content": {"application/json": {"schema": {"type": "object", "properties": {"status": {"type": "string", "enum": ["pending"]}, "retry_after_seconds": {"type": "integer"}, "next_action": {"type": "string", "enum": ["retry_same_upload"]}}, "required": [], "additionalProperties": false}}}}}, "security": [{"guestSessionToken": []}], "parameters": [{"name": "session_id", "in": "path", "required": true, "schema": {"type": "string", "format": "uuid"}}, {"name": "Idempotency-Key", "in": "header", "required": true, "schema": {"type": "string", "minLength": 1, "maxLength": 100}, "description": "Visible ASCII key. Replay identical file/options to recover a quote. Changed inputs for the same key return 409."}], "requestBody": {"required": true, "content": {"multipart/form-data": {"schema": {"type": "object", "properties": {"file": {"type": "string", "format": "binary", "description": "Original STL/STEP model bytes; dimensions interpreted in millimeters."}, "material": {"type": "string", "description": "Active material code from catalog; for example pla or petg.", "minLength": 1, "maxLength": 20, "default": "pla"}, "color": {"type": "string", "description": "Available color code from the material catalog; omitted uses this material's default.", "minLength": 1, "maxLength": 20}, "quality": {"type": "string", "description": "Active quality code from catalog.", "enum": ["draft", "standard", "fine"], "default": "standard"}, "infill_percent": {"type": "integer", "enum": [15, 20, 25, 30, 35, 100], "default": 15}, "orientation_mode": {"type": "string", "description": "Automatic orientation or retain the uploaded orientation.", "enum": ["auto_orient", "keep_uploaded"], "default": "auto_orient"}}, "required": ["file"], "additionalProperties": false}}}}}}, "/api/agent/v1/sessions/{session_id}/quotes/{quote_id}/": {"get": {"operationId": "get_quote", "summary": "Read this session's quote and requested quantity price", "responses": {"200": {"description": "Successful result.", "content": {"application/json": {"schema": {"type": "object", "properties": {"quote_id": {"type": "integer", "minimum": 1}, "status": {"type": "string", "enum": ["pending", "completed", "failed"]}, "file_name": {"type": "string"}, "dimensions_mm": {"type": "array", "minItems": 3, "maxItems": 3, "items": {"type": "string"}}, "material": {"type": "string", "description": "Active material code from catalog; for example pla or petg.", "minLength": 1, "maxLength": 20, "default": "pla"}, "color": {"type": "string", "description": "Available color code from the material catalog; omitted uses this material's default.", "minLength": 1, "maxLength": 20}, "quality": {"type": "string", "description": "Active quality code from catalog.", "enum": ["draft", "standard", "fine"], "default": "standard"}, "infill_percent": {"type": "integer", "enum": [15, 20, 25, 30, 35, 100], "default": 15}, "orientation_mode": {"type": "string", "description": "Automatic orientation or retain the uploaded orientation.", "enum": ["auto_orient", "keep_uploaded"], "default": "auto_orient"}, "quantity": {"type": "integer", "minimum": 1, "maximum": 999, "default": 1}, "currency": {"type": "string", "enum": ["USD"]}, "shipping_included": {"type": "boolean", "const": false}, "quote_url": {"type": "string", "format": "uri"}, "unit_price": {"type": "string", "description": "Decimal monetary amount.", "pattern": "^\\d+\\.\\d{2}$"}, "line_total": {"type": "string", "description": "Decimal monetary amount.", "pattern": "^\\d+\\.\\d{2}$"}, "production_days": {"type": "integer"}, "next_action": {"type": "string"}, "retry_after_seconds": {"type": "integer"}, "error": {"type": "object"}}, "required": ["quote_id", "status", "currency", "quote_url"]}}}}, "400": {"description": "Invalid input; inspect the error and fields before retrying.", "content": {"application/json": {"schema": {"type": "object"}}}}, "401": {"description": "Missing, invalid or expired guest bearer token.", "content": {"application/json": {"schema": {"type": "object"}}}}, "404": {"description": "Session, quote or order not found in this session.", "content": {"application/json": {"schema": {"type": "object"}}}}, "409": {"description": "Conflicting idempotency key, unfinished quote, changed/expired preview or existing order conflict.", "content": {"application/json": {"schema": {"type": "object"}}}}, "413": {"description": "Model or request exceeds the allowed upload size.", "content": {"application/json": {"schema": {"type": "object"}}}}, "415": {"description": "Use the operation's documented request Content-Type.", "content": {"application/json": {"schema": {"type": "object"}}}}, "429": {"description": "Rate limited; wait before retrying.", "content": {"application/json": {"schema": {"type": "object"}}}}, "503": {"description": "Slicing, shipping or payment service unavailable; order has not been paid.", "content": {"application/json": {"schema": {"type": "object"}}}}}, "security": [{"guestSessionToken": []}], "parameters": [{"name": "session_id", "in": "path", "required": true, "schema": {"type": "string", "format": "uuid"}}, {"name": "quote_id", "in": "path", "required": true, "schema": {"type": "integer", "minimum": 1}}, {"name": "quantity", "in": "query", "schema": {"type": "integer", "minimum": 1, "maximum": 999, "default": 1}}]}}, "/api/agent/v1/sessions/{session_id}/preview/": {"post": {"operationId": "preview_order", "summary": "Preview shipping and totals, frozen for 15 minutes", "responses": {"200": {"description": "Successful result.", "content": {"application/json": {"schema": {"type": "object", "properties": {"preview_id": {"type": "string", "format": "uuid"}, "expires_at": {"type": "string", "format": "date-time"}, "currency": {"type": "string", "enum": ["USD"]}, "subtotal": {"type": "string", "description": "Decimal monetary amount.", "pattern": "^\\d+\\.\\d{2}$"}, "shipping": {"type": "string", "description": "Decimal monetary amount.", "pattern": "^\\d+\\.\\d{2}$"}, "total": {"type": "string", "description": "Decimal monetary amount.", "pattern": "^\\d+\\.\\d{2}$"}, "production_days": {"type": "integer"}, "items": {"type": "array", "items": {"type": "object", "properties": {"quote_id": {"type": "integer", "minimum": 1}, "quantity": {"type": "integer", "minimum": 1, "maximum": 999, "default": 1}, "unit_price": {"type": "string", "description": "Decimal monetary amount.", "pattern": "^\\d+\\.\\d{2}$"}, "line_total": {"type": "string", "description": "Decimal monetary amount.", "pattern": "^\\d+\\.\\d{2}$"}, "production_days": {"type": "integer", "minimum": 0}}, "required": ["quote_id", "quantity", "unit_price", "line_total", "production_days"], "additionalProperties": false}}, "selected_shipping_option": {"type": "string"}, "shipping_options": {"type": "array", "items": {"type": "object", "properties": {"code": {"type": "string"}, "label": {"type": "string"}, "amount": {"type": "string", "description": "Decimal monetary amount.", "pattern": "^\\d+\\.\\d{2}$"}, "estimated_days": {"type": ["integer", "null"]}}}}, "terms_urls": {"type": "array", "items": {"type": "string", "format": "uri"}}, "next_action": {"type": "string"}, "payment_status": {"type": "string", "enum": ["unpaid"]}}, "required": ["preview_id", "expires_at", "currency", "subtotal", "shipping", "total", "items", "selected_shipping_option", "shipping_options"]}}}}, "400": {"description": "Invalid input; inspect the error and fields before retrying.", "content": {"application/json": {"schema": {"type": "object"}}}}, "401": {"description": "Missing, invalid or expired guest bearer token.", "content": {"application/json": {"schema": {"type": "object"}}}}, "404": {"description": "Session, quote or order not found in this session.", "content": {"application/json": {"schema": {"type": "object"}}}}, "409": {"description": "Conflicting idempotency key, unfinished quote, changed/expired preview or existing order conflict.", "content": {"application/json": {"schema": {"type": "object"}}}}, "413": {"description": "Model or request exceeds the allowed upload size.", "content": {"application/json": {"schema": {"type": "object"}}}}, "415": {"description": "Use the operation's documented request Content-Type.", "content": {"application/json": {"schema": {"type": "object"}}}}, "429": {"description": "Rate limited; wait before retrying.", "content": {"application/json": {"schema": {"type": "object"}}}}, "503": {"description": "Slicing, shipping or payment service unavailable; order has not been paid.", "content": {"application/json": {"schema": {"type": "object"}}}}}, "security": [{"guestSessionToken": []}], "parameters": [{"name": "session_id", "in": "path", "required": true, "schema": {"type": "string", "format": "uuid"}}], "requestBody": {"required": true, "content": {"application/json": {"schema": {"type": "object", "properties": {"items": {"type": "array", "minItems": 1, "maxItems": 20, "items": {"type": "object", "properties": {"quote_id": {"type": "integer", "minimum": 1}, "quantity": {"type": "integer", "minimum": 1, "maximum": 999, "default": 1}}, "required": ["quote_id", "quantity"], "additionalProperties": false}, "description": "Up to 20 distinct quote IDs; the sum of all quantities must not exceed 999 units."}, "customer": {"type": "object", "properties": {"full_name": {"type": "string", "description": "Customer name.", "minLength": 1, "maxLength": 120}, "email": {"type": "string", "description": "Customer's email for receipt and order notifications.", "minLength": 3, "maxLength": 254, "format": "email"}, "shipping_name": {"type": "string", "description": "Recipient name.", "minLength": 1, "maxLength": 120}, "address_line1": {"type": "string", "description": "Shipping street address.", "minLength": 1, "maxLength": 120}, "address_line2": {"type": "string", "description": "Apartment, suite or unit.", "maxLength": 120}, "city": {"type": "string", "description": "Shipping city.", "minLength": 1, "maxLength": 80}, "state_region": {"type": "string", "description": "U.S. state or territory code; for example OH.", "minLength": 2, "maxLength": 2}, "postal_code": {"type": "string", "description": "5-digit ZIP or ZIP+4.", "minLength": 5, "maxLength": 10}, "country_code": {"type": "string", "description": "U.S. shipping only.", "enum": ["US"], "default": "US"}, "company_name": {"type": "string", "description": "Optional company name.", "maxLength": 120}, "phone_number": {"type": "string", "description": "Optional contact telephone.", "maxLength": 30}, "notes": {"type": "string", "description": "Optional production or delivery notes.", "maxLength": 4000}}, "required": ["full_name", "email", "shipping_name", "address_line1", "city", "state_region", "postal_code"], "additionalProperties": false}, "shipping_option": {"type": "string", "description": "Shipping option code returned by a previous preview. Omit to preview the lowest-price available service.", "minLength": 1, "maxLength": 120}}, "required": ["items", "customer"], "additionalProperties": false}}}}}}, "/api/agent/v1/sessions/{session_id}/checkout/": {"post": {"operationId": "create_checkout", "summary": "Confirm the exact preview and create/reuse secure Stripe checkout", "responses": {"200": {"description": "Order ID and Stripe-hosted checkout URL. Complete payment at that URL. Repeated confirmation reuses the session's single order; this response does not establish payment.", "content": {"application/json": {"schema": {"type": "object", "properties": {"order_id": {"type": ["integer", "null"]}, "status": {"type": "string"}, "payment_status": {"type": "string", "enum": ["unpaid", "paid", "failed", "refunded"]}, "currency": {"type": "string", "enum": ["USD"]}, "subtotal": {"type": "string", "description": "Decimal monetary amount.", "pattern": "^\\d+\\.\\d{2}$"}, "shipping": {"type": "string", "description": "Decimal monetary amount.", "pattern": "^\\d+\\.\\d{2}$"}, "total": {"type": "string", "description": "Decimal monetary amount.", "pattern": "^\\d+\\.\\d{2}$"}, "checkout_url": {"type": "string", "format": "uri"}, "order_url": {"type": "string", "format": "uri"}, "tracking_url": {"type": "string", "format": "uri"}, "tracking_number": {"type": "string"}, "verification_pending": {"type": "boolean"}, "next_action": {"type": "string"}}, "required": ["order_id", "payment_status", "next_action"]}}}}, "400": {"description": "Invalid input; inspect the error and fields before retrying.", "content": {"application/json": {"schema": {"type": "object"}}}}, "401": {"description": "Missing, invalid or expired guest bearer token.", "content": {"application/json": {"schema": {"type": "object"}}}}, "404": {"description": "Session, quote or order not found in this session.", "content": {"application/json": {"schema": {"type": "object"}}}}, "409": {"description": "Conflicting idempotency key, unfinished quote, changed/expired preview or existing order conflict.", "content": {"application/json": {"schema": {"type": "object"}}}}, "413": {"description": "Model or request exceeds the allowed upload size.", "content": {"application/json": {"schema": {"type": "object"}}}}, "415": {"description": "Use the operation's documented request Content-Type.", "content": {"application/json": {"schema": {"type": "object"}}}}, "429": {"description": "Rate limited; wait before retrying.", "content": {"application/json": {"schema": {"type": "object"}}}}, "503": {"description": "Slicing, shipping or payment service unavailable; order has not been paid.", "content": {"application/json": {"schema": {"type": "object"}}}}}, "security": [{"guestSessionToken": []}], "parameters": [{"name": "session_id", "in": "path", "required": true, "schema": {"type": "string", "format": "uuid"}}], "requestBody": {"required": true, "content": {"application/json": {"schema": {"type": "object", "properties": {"preview_id": {"type": "string", "description": "The unexpired, frozen preview ID returned by preview_order.", "minLength": 1, "maxLength": 64}, "expected_total": {"type": "string", "description": "Exact two-decimal total from the preview, for example 42.50.", "minLength": 4, "maxLength": 20, "pattern": "^\\d+\\.\\d{2}$"}, "currency": {"type": "string", "description": "Currency from the preview.", "enum": ["USD"]}, "confirm": {"type": "boolean", "const": true, "description": "Must be true only after the customer authorizes this exact purchase."}}, "required": ["preview_id", "expected_total", "currency", "confirm"], "additionalProperties": false}}}}}}, "/api/agent/v1/sessions/{session_id}/status/": {"get": {"operationId": "get_order_status", "summary": "Verify Stripe payment and return minimal order state; may save paid state and trigger its receipt", "responses": {"200": {"description": "Successful result.", "content": {"application/json": {"schema": {"type": "object", "properties": {"order_id": {"type": ["integer", "null"]}, "status": {"type": "string"}, "payment_status": {"type": "string", "enum": ["unpaid", "paid", "failed", "refunded"]}, "currency": {"type": "string", "enum": ["USD"]}, "subtotal": {"type": "string", "description": "Decimal monetary amount.", "pattern": "^\\d+\\.\\d{2}$"}, "shipping": {"type": "string", "description": "Decimal monetary amount.", "pattern": "^\\d+\\.\\d{2}$"}, "total": {"type": "string", "description": "Decimal monetary amount.", "pattern": "^\\d+\\.\\d{2}$"}, "checkout_url": {"type": "string", "format": "uri"}, "order_url": {"type": "string", "format": "uri"}, "tracking_url": {"type": "string", "format": "uri"}, "tracking_number": {"type": "string"}, "verification_pending": {"type": "boolean"}, "next_action": {"type": "string"}}, "required": ["order_id", "payment_status", "next_action"]}}}}, "400": {"description": "Invalid input; inspect the error and fields before retrying.", "content": {"application/json": {"schema": {"type": "object"}}}}, "401": {"description": "Missing, invalid or expired guest bearer token.", "content": {"application/json": {"schema": {"type": "object"}}}}, "404": {"description": "Session, quote or order not found in this session.", "content": {"application/json": {"schema": {"type": "object"}}}}, "409": {"description": "Conflicting idempotency key, unfinished quote, changed/expired preview or existing order conflict.", "content": {"application/json": {"schema": {"type": "object"}}}}, "413": {"description": "Model or request exceeds the allowed upload size.", "content": {"application/json": {"schema": {"type": "object"}}}}, "415": {"description": "Use the operation's documented request Content-Type.", "content": {"application/json": {"schema": {"type": "object"}}}}, "429": {"description": "Rate limited; wait before retrying.", "content": {"application/json": {"schema": {"type": "object"}}}}, "503": {"description": "Slicing, shipping or payment service unavailable; order has not been paid.", "content": {"application/json": {"schema": {"type": "object"}}}}}, "security": [{"guestSessionToken": []}], "parameters": [{"name": "session_id", "in": "path", "required": true, "schema": {"type": "string", "format": "uuid"}}]}}}, "components": {"securitySchemes": {"guestSessionToken": {"type": "http", "scheme": "bearer", "description": "Secret token from create_guest_session; expires after 7 days. Never place the token in a URL."}}, "schemas": {"Customer": {"type": "object", "properties": {"full_name": {"type": "string", "description": "Customer name.", "minLength": 1, "maxLength": 120}, "email": {"type": "string", "description": "Customer's email for receipt and order notifications.", "minLength": 3, "maxLength": 254, "format": "email"}, "shipping_name": {"type": "string", "description": "Recipient name.", "minLength": 1, "maxLength": 120}, "address_line1": {"type": "string", "description": "Shipping street address.", "minLength": 1, "maxLength": 120}, "address_line2": {"type": "string", "description": "Apartment, suite or unit.", "maxLength": 120}, "city": {"type": "string", "description": "Shipping city.", "minLength": 1, "maxLength": 80}, "state_region": {"type": "string", "description": "U.S. state or territory code; for example OH.", "minLength": 2, "maxLength": 2}, "postal_code": {"type": "string", "description": "5-digit ZIP or ZIP+4.", "minLength": 5, "maxLength": 10}, "country_code": {"type": "string", "description": "U.S. shipping only.", "enum": ["US"], "default": "US"}, "company_name": {"type": "string", "description": "Optional company name.", "maxLength": 120}, "phone_number": {"type": "string", "description": "Optional contact telephone.", "maxLength": 30}, "notes": {"type": "string", "description": "Optional production or delivery notes.", "maxLength": 4000}}, "required": ["full_name", "email", "shipping_name", "address_line1", "city", "state_region", "postal_code"], "additionalProperties": false}, "OrderItem": {"type": "object", "properties": {"quote_id": {"type": "integer", "minimum": 1}, "quantity": {"type": "integer", "minimum": 1, "maximum": 999, "default": 1}}, "required": ["quote_id", "quantity"], "additionalProperties": false}}}, "externalDocs": {"description": "Guest ordering guide", "url": "https://buildplateco.com/order-with-ai/"}}