{"openapi":"3.1.0","info":{"title":"PawUltra API v1","version":"1.0.0","description":"PawUltra API v1 specification.\n\nApproved trade businesses request access at My Account → API & Integrations → Request API access. API approval is manual and separate from trade approval. After approval, customers create their own secret API keys. The secret is displayed once and is never emailed.\n\nNew approved access defaults to 60 requests/minute/key and 120 requests/minute/business. Existing businesses may retain legacy or individually agreed limits; multiple keys share the business allowance. See response quota headers and the effective account limits. Documentation examples are synthetic, not identifiers guaranteed to exist."},"servers":[{"url":"https://api.pawultra.com/v1","description":"PawUltra API v1 base URL."}],"security":[{"bearerAuth":[]}],"paths":{"/products":{"get":{"summary":"List canonical products","description":"Requires catalogue:read.","x-required-scopes":["catalogue:read"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Successful response","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductPage"},"example":{"data":[{"id":"123e4567-e89b-42d3-a456-426614174000","sku":"PU-DOG-1234","title":"Example Complete Pet Food 2kg","brand":"Example Brand","gtin":null,"category":{"name":"Dogs","slug":"dogs"},"description":null,"availability":"available","availability_updated_at":"2026-10-30T16:30:00Z","updated_at":"2026-10-30T16:30:00Z","primary_image":{"url":"https://media.pawultra.com/example/product.jpg","width":1200,"height":1200},"image_count":1}],"next_cursor":null}}}},"400":{"description":"Invalid request values (validation_error) or invalid_cursor.","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"validation_error","message":"Example error message.","request_id":"req_example"}}}}},"401":{"description":"Missing, malformed, unknown, expired or revoked credential (invalid_api_key).","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"invalid_api_key","message":"Example error message.","request_id":"req_example"}}}}},"403":{"description":"Missing scope (insufficient_scope), or API access/trade eligibility not enabled (api_access_suspended).","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"insufficient_scope","message":"Example error message.","request_id":"req_example"}}}}},"404":{"description":"Resource not found or not owned by this business (not_found); missing effective price (price_not_found).","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Conflict response, if returned. Inspect error.code.","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"conflict","message":"Example error message.","request_id":"req_example"}}}}},"410":{"description":"Resource expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}}},"422":{"description":"Request exceeds an allowed limit (validation_error).","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"validation_error","message":"Example error message.","request_id":"req_example"}}}}},"429":{"description":"Shared business or key quota exceeded (rate_limited). Respect Retry-After in seconds.","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"Retry-After":{"description":"Retry delay in seconds or an HTTP date.","schema":{"type":"string"}},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"rate_limited","message":"Example error message.","request_id":"req_example"}}}}},"500":{"description":"500 internal_error","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"internal_error","message":"Example error message.","request_id":"req_example"}}}}},"503":{"description":"Service or export temporarily unavailable (temporarily_unavailable or export_unavailable).","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"temporarily_unavailable","message":"Example error message.","request_id":"req_example"}}}}}},"parameters":[{"name":"limit","in":"query","required":false,"description":"Page size, from 1 to the configured maximum (default maximum 100).","schema":{"type":"integer","minimum":1,"default":50,"maximum":100}},{"name":"cursor","in":"query","required":false,"description":"Server-issued opaque cursor; do not parse or construct.","schema":{"type":"string"}},{"name":"category","in":"query","required":false,"schema":{"type":"string"},"description":"Exact canonical category filter; bound into the pagination cursor."},{"name":"brand","in":"query","required":false,"schema":{"type":"string"},"description":"Exact canonical brand filter; bound into the pagination cursor."}],"operationId":"listProducts"}},"/products/{sku}":{"get":{"summary":"Get a product","description":"Requires catalogue:read.","x-required-scopes":["catalogue:read"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Successful response","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"ETag":{"description":"Entity tag for conditional reads.","schema":{"type":"string"}},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Product"},"example":{"id":"123e4567-e89b-42d3-a456-426614174000","sku":"PU-DOG-1234","title":"Example Complete Pet Food 2kg","brand":"Example Brand","gtin":null,"category":{"name":"Dogs","slug":"dogs"},"description":null,"availability":"available","availability_updated_at":"2026-10-30T16:30:00Z","images":[{"url":"https://media.pawultra.com/example/product.jpg","position":1,"primary":true,"width":1200,"height":1200}],"updated_at":"2026-10-30T16:30:00Z"}}}},"304":{"description":"Not modified; no response body. Delivery infrastructure can omit custom request and quota headers on this status. Authentication and quota consumption still apply.","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier. May be omitted by delivery infrastructure on 304 responses."},"RateLimit-Limit":{"schema":{"type":"integer"},"description":"May be omitted by delivery infrastructure on 304 responses."},"RateLimit-Remaining":{"schema":{"type":"integer"},"description":"May be omitted by delivery infrastructure on 304 responses."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset. May be omitted by delivery infrastructure on 304 responses."},"ETag":{"schema":{"type":"string"},"description":"Entity tag for the unchanged representation."}}},"400":{"description":"Invalid request values (validation_error) or invalid_cursor.","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"validation_error","message":"Example error message.","request_id":"req_example"}}}}},"401":{"description":"Missing, malformed, unknown, expired or revoked credential (invalid_api_key).","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"invalid_api_key","message":"Example error message.","request_id":"req_example"}}}}},"403":{"description":"Missing scope (insufficient_scope), or API access/trade eligibility not enabled (api_access_suspended).","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"insufficient_scope","message":"Example error message.","request_id":"req_example"}}}}},"404":{"description":"Resource not found or not owned by this business (not_found); missing effective price (price_not_found).","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Conflict response, if returned. Inspect error.code.","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"conflict","message":"Example error message.","request_id":"req_example"}}}}},"410":{"description":"Resource expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}}},"422":{"description":"Request exceeds an allowed limit (validation_error).","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"validation_error","message":"Example error message.","request_id":"req_example"}}}}},"429":{"description":"Shared business or key quota exceeded (rate_limited). Respect Retry-After in seconds.","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"Retry-After":{"description":"Retry delay in seconds or an HTTP date.","schema":{"type":"string"}},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"rate_limited","message":"Example error message.","request_id":"req_example"}}}}},"500":{"description":"500 internal_error","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"internal_error","message":"Example error message.","request_id":"req_example"}}}}},"503":{"description":"Service or export temporarily unavailable (temporarily_unavailable or export_unavailable).","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"temporarily_unavailable","message":"Example error message.","request_id":"req_example"}}}}}},"parameters":[{"name":"sku","in":"path","required":true,"description":"Canonical PawUltra SKU.","schema":{"type":"string","example":"PU-DOG-1234"}},{"name":"If-None-Match","in":"header","required":false,"schema":{"type":"string"}}],"operationId":"getProduct"}},"/brands":{"get":{"summary":"List brands","description":"Requires catalogue:read.","x-required-scopes":["catalogue:read"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Successful response","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Brand"}}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Invalid request values (validation_error) or invalid_cursor.","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"validation_error","message":"Example error message.","request_id":"req_example"}}}}},"401":{"description":"Missing, malformed, unknown, expired or revoked credential (invalid_api_key).","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"invalid_api_key","message":"Example error message.","request_id":"req_example"}}}}},"403":{"description":"Missing scope (insufficient_scope), or API access/trade eligibility not enabled (api_access_suspended).","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"insufficient_scope","message":"Example error message.","request_id":"req_example"}}}}},"404":{"description":"Resource not found or not owned by this business (not_found); missing effective price (price_not_found).","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Conflict response, if returned. Inspect error.code.","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"conflict","message":"Example error message.","request_id":"req_example"}}}}},"410":{"description":"Resource expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}}},"422":{"description":"Request exceeds an allowed limit (validation_error).","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"validation_error","message":"Example error message.","request_id":"req_example"}}}}},"429":{"description":"Shared business or key quota exceeded (rate_limited). Respect Retry-After in seconds.","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"Retry-After":{"description":"Retry delay in seconds or an HTTP date.","schema":{"type":"string"}},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"rate_limited","message":"Example error message.","request_id":"req_example"}}}}},"500":{"description":"500 internal_error","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"internal_error","message":"Example error message.","request_id":"req_example"}}}}},"503":{"description":"Service or export temporarily unavailable (temporarily_unavailable or export_unavailable).","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"temporarily_unavailable","message":"Example error message.","request_id":"req_example"}}}}}},"operationId":"listBrands"}},"/categories":{"get":{"summary":"List categories","description":"Requires catalogue:read.","x-required-scopes":["catalogue:read"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Successful response","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Category"}}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Invalid request values (validation_error) or invalid_cursor.","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"validation_error","message":"Example error message.","request_id":"req_example"}}}}},"401":{"description":"Missing, malformed, unknown, expired or revoked credential (invalid_api_key).","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"invalid_api_key","message":"Example error message.","request_id":"req_example"}}}}},"403":{"description":"Missing scope (insufficient_scope), or API access/trade eligibility not enabled (api_access_suspended).","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"insufficient_scope","message":"Example error message.","request_id":"req_example"}}}}},"404":{"description":"Resource not found or not owned by this business (not_found); missing effective price (price_not_found).","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Conflict response, if returned. Inspect error.code.","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"conflict","message":"Example error message.","request_id":"req_example"}}}}},"410":{"description":"Resource expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}}},"422":{"description":"Request exceeds an allowed limit (validation_error).","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"validation_error","message":"Example error message.","request_id":"req_example"}}}}},"429":{"description":"Shared business or key quota exceeded (rate_limited). Respect Retry-After in seconds.","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"Retry-After":{"description":"Retry delay in seconds or an HTTP date.","schema":{"type":"string"}},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"rate_limited","message":"Example error message.","request_id":"req_example"}}}}},"500":{"description":"500 internal_error","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"internal_error","message":"Example error message.","request_id":"req_example"}}}}},"503":{"description":"Service or export temporarily unavailable (temporarily_unavailable or export_unavailable).","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"temporarily_unavailable","message":"Example error message.","request_id":"req_example"}}}}}},"operationId":"listCategories"}},"/availability/{sku}":{"get":{"summary":"Get availability","description":"Requires availability:read.","x-required-scopes":["availability:read"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Successful response","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Availability"},"example":{"sku":"PU-DOG-1234","availability":"available","availability_updated_at":null}}}},"400":{"description":"Invalid request values (validation_error) or invalid_cursor.","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"validation_error","message":"Example error message.","request_id":"req_example"}}}}},"401":{"description":"Missing, malformed, unknown, expired or revoked credential (invalid_api_key).","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"invalid_api_key","message":"Example error message.","request_id":"req_example"}}}}},"403":{"description":"Missing scope (insufficient_scope), or API access/trade eligibility not enabled (api_access_suspended).","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"insufficient_scope","message":"Example error message.","request_id":"req_example"}}}}},"404":{"description":"Resource not found or not owned by this business (not_found); missing effective price (price_not_found).","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Conflict response, if returned. Inspect error.code.","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"conflict","message":"Example error message.","request_id":"req_example"}}}}},"410":{"description":"Resource expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}}},"422":{"description":"Request exceeds an allowed limit (validation_error).","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"validation_error","message":"Example error message.","request_id":"req_example"}}}}},"429":{"description":"Shared business or key quota exceeded (rate_limited). Respect Retry-After in seconds.","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"Retry-After":{"description":"Retry delay in seconds or an HTTP date.","schema":{"type":"string"}},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"rate_limited","message":"Example error message.","request_id":"req_example"}}}}},"500":{"description":"500 internal_error","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"internal_error","message":"Example error message.","request_id":"req_example"}}}}},"503":{"description":"Service or export temporarily unavailable (temporarily_unavailable or export_unavailable).","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"temporarily_unavailable","message":"Example error message.","request_id":"req_example"}}}}}},"parameters":[{"name":"sku","in":"path","required":true,"description":"Canonical PawUltra SKU.","schema":{"type":"string","example":"PU-DOG-1234"}}],"operationId":"getAvailability"}},"/availability/batch":{"post":{"summary":"Read availability in a batch","description":"Requires availability:read.","x-required-scopes":["availability:read"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Successful response","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchResponse"}}}},"400":{"description":"Invalid request values (validation_error) or invalid_cursor.","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"validation_error","message":"Example error message.","request_id":"req_example"}}}}},"401":{"description":"Missing, malformed, unknown, expired or revoked credential (invalid_api_key).","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"invalid_api_key","message":"Example error message.","request_id":"req_example"}}}}},"403":{"description":"Missing scope (insufficient_scope), or API access/trade eligibility not enabled (api_access_suspended).","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"insufficient_scope","message":"Example error message.","request_id":"req_example"}}}}},"404":{"description":"Resource not found or not owned by this business (not_found); missing effective price (price_not_found).","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Conflict response, if returned. Inspect error.code.","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"conflict","message":"Example error message.","request_id":"req_example"}}}}},"410":{"description":"Resource expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}}},"422":{"description":"Request exceeds an allowed limit (validation_error).","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"validation_error","message":"Example error message.","request_id":"req_example"}}}}},"429":{"description":"Shared business or key quota exceeded (rate_limited). Respect Retry-After in seconds.","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"Retry-After":{"description":"Retry delay in seconds or an HTTP date.","schema":{"type":"string"}},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"rate_limited","message":"Example error message.","request_id":"req_example"}}}}},"500":{"description":"500 internal_error","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"internal_error","message":"Example error message.","request_id":"req_example"}}}}},"503":{"description":"Service or export temporarily unavailable (temporarily_unavailable or export_unavailable).","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"temporarily_unavailable","message":"Example error message.","request_id":"req_example"}}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchRequest"},"example":{"skus":["PU-DOG-0001","PU-CAT-0001"]}}}},"operationId":"getAvailabilityBatch"}},"/catalogue/export":{"get":{"summary":"Get a pre-generated catalogue snapshot","description":"Requires catalogue:read. Each NDJSON line is a full Product including its editorial gallery.","x-required-scopes":["catalogue:read"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Successful response","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Export"}}}},"400":{"description":"Invalid request values (validation_error) or invalid_cursor.","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"validation_error","message":"Example error message.","request_id":"req_example"}}}}},"401":{"description":"Missing, malformed, unknown, expired or revoked credential (invalid_api_key).","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"invalid_api_key","message":"Example error message.","request_id":"req_example"}}}}},"403":{"description":"Missing scope (insufficient_scope), or API access/trade eligibility not enabled (api_access_suspended).","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"insufficient_scope","message":"Example error message.","request_id":"req_example"}}}}},"404":{"description":"Resource not found or not owned by this business (not_found); missing effective price (price_not_found).","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Conflict response, if returned. Inspect error.code.","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"conflict","message":"Example error message.","request_id":"req_example"}}}}},"410":{"description":"Resource expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}}},"422":{"description":"Request exceeds an allowed limit (validation_error).","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"validation_error","message":"Example error message.","request_id":"req_example"}}}}},"429":{"description":"Shared business or key quota exceeded (rate_limited). Respect Retry-After in seconds.","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"Retry-After":{"description":"Retry delay in seconds or an HTTP date.","schema":{"type":"string"}},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"rate_limited","message":"Example error message.","request_id":"req_example"}}}}},"500":{"description":"500 internal_error","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"internal_error","message":"Example error message.","request_id":"req_example"}}}}},"503":{"description":"Service or export temporarily unavailable (temporarily_unavailable or export_unavailable).","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"temporarily_unavailable","message":"Example error message.","request_id":"req_example"}}}}}},"operationId":"getCatalogueExport"}},"/products/changes":{"get":{"summary":"Read incremental changes","description":"Requires catalogue:read.","x-required-scopes":["catalogue:read"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Successful response","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChangePage"}}}},"400":{"description":"Invalid request values (validation_error) or invalid_cursor.","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"validation_error","message":"Example error message.","request_id":"req_example"}}}}},"401":{"description":"Missing, malformed, unknown, expired or revoked credential (invalid_api_key).","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"invalid_api_key","message":"Example error message.","request_id":"req_example"}}}}},"403":{"description":"Missing scope (insufficient_scope), or API access/trade eligibility not enabled (api_access_suspended).","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"insufficient_scope","message":"Example error message.","request_id":"req_example"}}}}},"404":{"description":"Resource not found or not owned by this business (not_found); missing effective price (price_not_found).","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Conflict response, if returned. Inspect error.code.","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"conflict","message":"Example error message.","request_id":"req_example"}}}}},"410":{"description":"changes_cursor_expired: obtain a new catalogue export.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}}},"422":{"description":"Request exceeds an allowed limit (validation_error).","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"validation_error","message":"Example error message.","request_id":"req_example"}}}}},"429":{"description":"Shared business or key quota exceeded (rate_limited). Respect Retry-After in seconds.","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"Retry-After":{"description":"Retry delay in seconds or an HTTP date.","schema":{"type":"string"}},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"rate_limited","message":"Example error message.","request_id":"req_example"}}}}},"500":{"description":"500 internal_error","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"internal_error","message":"Example error message.","request_id":"req_example"}}}}},"503":{"description":"Service or export temporarily unavailable (temporarily_unavailable or export_unavailable).","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"temporarily_unavailable","message":"Example error message.","request_id":"req_example"}}}}}},"parameters":[{"name":"cursor","in":"query","required":true,"description":"Opaque checkpoint from the export or previous response. Required.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Page size, from 1 to the configured maximum (default maximum 100).","schema":{"type":"integer","minimum":1,"default":50,"maximum":100}}],"operationId":"getProductChanges"}},"/prices/{sku}":{"get":{"summary":"Get customer-specific price","description":"Requires pricing:read and an authenticated eligible PawUltra business. Resources are restricted to the authorised business.","x-required-scopes":["pricing:read"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Successful response; restricted to the authenticated business.","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"ETag":{"description":"Entity tag for conditional reads.","schema":{"type":"string"}},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Price"},"example":{"sku":"PU-DOG-1234","currency":"GBP","net_price":"12.40","vat_rate":"20.00","price_updated_at":"2026-10-30T18:30:00Z"}}}},"304":{"description":"Not modified; no response body. Delivery infrastructure can omit custom request and quota headers on this status. Authentication and quota consumption still apply.","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier. May be omitted by delivery infrastructure on 304 responses."},"RateLimit-Limit":{"schema":{"type":"integer"},"description":"May be omitted by delivery infrastructure on 304 responses."},"RateLimit-Remaining":{"schema":{"type":"integer"},"description":"May be omitted by delivery infrastructure on 304 responses."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset. May be omitted by delivery infrastructure on 304 responses."},"ETag":{"schema":{"type":"string"},"description":"Entity tag for the unchanged representation."}}},"400":{"description":"Invalid request values (validation_error) or invalid_cursor.","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"validation_error","message":"Example error message.","request_id":"req_example"}}}}},"401":{"description":"Missing, malformed, unknown, expired or revoked credential (invalid_api_key).","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"invalid_api_key","message":"Example error message.","request_id":"req_example"}}}}},"403":{"description":"Missing scope (insufficient_scope), or API access/trade eligibility not enabled (api_access_suspended).","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"insufficient_scope","message":"Example error message.","request_id":"req_example"}}}}},"404":{"description":"Resource not found or not owned by this business (not_found); missing effective price (price_not_found).","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Conflict response, if returned. Inspect error.code.","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"conflict","message":"Example error message.","request_id":"req_example"}}}}},"410":{"description":"Resource expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}}},"422":{"description":"Request exceeds an allowed limit (validation_error).","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"validation_error","message":"Example error message.","request_id":"req_example"}}}}},"429":{"description":"Shared business or key quota exceeded (rate_limited). Respect Retry-After in seconds.","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"Retry-After":{"description":"Retry delay in seconds or an HTTP date.","schema":{"type":"string"}},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"rate_limited","message":"Example error message.","request_id":"req_example"}}}}},"500":{"description":"500 internal_error","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"internal_error","message":"Example error message.","request_id":"req_example"}}}}},"503":{"description":"Service or export temporarily unavailable (temporarily_unavailable or export_unavailable).","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"temporarily_unavailable","message":"Example error message.","request_id":"req_example"}}}}}},"parameters":[{"name":"sku","in":"path","required":true,"description":"Canonical PawUltra SKU.","schema":{"type":"string","example":"PU-DOG-1234"}},{"name":"If-None-Match","in":"header","required":false,"schema":{"type":"string"}}],"operationId":"getPrice"}},"/prices/batch":{"post":{"summary":"Read customer-specific prices in a batch","description":"Requires pricing:read and an authenticated eligible PawUltra business. Resources are restricted to the authorised business.","x-required-scopes":["pricing:read"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Successful response","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PriceBatchResponse"},"example":{"data":[{"sku":"PU-DOG-1234","currency":"GBP","net_price":"12.40","vat_rate":"20.00","price_updated_at":"2026-10-30T18:30:00Z"}],"not_found":["PU-CAT-0001"]}}}},"400":{"description":"Invalid request values (validation_error) or invalid_cursor.","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"validation_error","message":"Example error message.","request_id":"req_example"}}}}},"401":{"description":"Missing, malformed, unknown, expired or revoked credential (invalid_api_key).","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"invalid_api_key","message":"Example error message.","request_id":"req_example"}}}}},"403":{"description":"Missing scope (insufficient_scope), or API access/trade eligibility not enabled (api_access_suspended).","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"insufficient_scope","message":"Example error message.","request_id":"req_example"}}}}},"404":{"description":"Resource not found or not owned by this business (not_found); missing effective price (price_not_found).","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Conflict response, if returned. Inspect error.code.","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"conflict","message":"Example error message.","request_id":"req_example"}}}}},"410":{"description":"Resource expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}}},"422":{"description":"Request exceeds an allowed limit (validation_error).","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"validation_error","message":"Example error message.","request_id":"req_example"}}}}},"429":{"description":"Shared business or key quota exceeded (rate_limited). Respect Retry-After in seconds.","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"Retry-After":{"description":"Retry delay in seconds or an HTTP date.","schema":{"type":"string"}},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"rate_limited","message":"Example error message.","request_id":"req_example"}}}}},"500":{"description":"500 internal_error","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"internal_error","message":"Example error message.","request_id":"req_example"}}}}},"503":{"description":"Service or export temporarily unavailable (temporarily_unavailable or export_unavailable).","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"temporarily_unavailable","message":"Example error message.","request_id":"req_example"}}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchRequest"},"example":{"skus":["PU-DOG-0001","PU-CAT-0001"]}}}},"operationId":"getPriceBatch"}},"/orders":{"get":{"summary":"List orders","description":"Requires orders:read and an authenticated eligible PawUltra business. Resources are restricted to the authorised business. Cursor pagination uses a stable order and a bounded limit.","x-required-scopes":["orders:read"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Successful response","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrderPage"},"example":{"data":[{"id":"ord_example","number":"PU-10482","status":"processing","fulfilment_status":"partially_fulfilled","created_at":"2026-10-30T12:00:00Z","updated_at":"2026-10-30T18:40:00Z","shipments":[{"id":"shp_example","carrier":{"code":"example","name":"Example Carrier"},"tracking_number":null,"tracking_url":null,"status":"in_transit","dispatched_at":"2026-10-30T15:10:00Z","estimated_delivery_at":null,"delivered_at":null,"tracking_updated_at":"2026-10-30T18:42:00Z"}]}],"next_cursor":null}}}},"400":{"description":"Invalid request values (validation_error) or invalid_cursor.","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"validation_error","message":"Example error message.","request_id":"req_example"}}}}},"401":{"description":"Missing, malformed, unknown, expired or revoked credential (invalid_api_key).","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"invalid_api_key","message":"Example error message.","request_id":"req_example"}}}}},"403":{"description":"Missing scope (insufficient_scope), or API access/trade eligibility not enabled (api_access_suspended).","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"insufficient_scope","message":"Example error message.","request_id":"req_example"}}}}},"404":{"description":"Resource not found or not owned by this business (not_found); missing effective price (price_not_found).","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Conflict response, if returned. Inspect error.code.","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"conflict","message":"Example error message.","request_id":"req_example"}}}}},"410":{"description":"Resource expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}}},"422":{"description":"Request exceeds an allowed limit (validation_error).","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"validation_error","message":"Example error message.","request_id":"req_example"}}}}},"429":{"description":"Shared business or key quota exceeded (rate_limited). Respect Retry-After in seconds.","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"Retry-After":{"description":"Retry delay in seconds or an HTTP date.","schema":{"type":"string"}},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"rate_limited","message":"Example error message.","request_id":"req_example"}}}}},"500":{"description":"500 internal_error","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"internal_error","message":"Example error message.","request_id":"req_example"}}}}},"503":{"description":"Service or export temporarily unavailable (temporarily_unavailable or export_unavailable).","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"temporarily_unavailable","message":"Example error message.","request_id":"req_example"}}}}}},"parameters":[{"name":"limit","in":"query","required":false,"description":"Page size, from 1 to the configured maximum (default maximum 100).","schema":{"type":"integer","minimum":1,"default":50,"maximum":100}},{"name":"cursor","in":"query","required":false,"description":"Server-issued opaque cursor; do not parse or construct.","schema":{"type":"string"}}],"operationId":"listOrders"}},"/orders/{id}":{"get":{"summary":"Get an order and its shipments","description":"Requires orders:read and an authenticated eligible PawUltra business. Resources are restricted to the authorised business.","x-required-scopes":["orders:read"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Successful response; restricted to the authenticated business.","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"ETag":{"description":"Entity tag for conditional reads.","schema":{"type":"string"}},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Order"},"example":{"id":"ord_example","number":"PU-10482","status":"processing","fulfilment_status":"partially_fulfilled","created_at":"2026-10-30T12:00:00Z","updated_at":"2026-10-30T18:40:00Z","shipments":[{"id":"shp_example","carrier":{"code":"example","name":"Example Carrier"},"tracking_number":null,"tracking_url":null,"status":"in_transit","dispatched_at":"2026-10-30T15:10:00Z","estimated_delivery_at":null,"delivered_at":null,"tracking_updated_at":"2026-10-30T18:42:00Z"}],"items":[]}}}},"400":{"description":"Invalid request values (validation_error) or invalid_cursor.","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"validation_error","message":"Example error message.","request_id":"req_example"}}}}},"401":{"description":"Missing, malformed, unknown, expired or revoked credential (invalid_api_key).","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"invalid_api_key","message":"Example error message.","request_id":"req_example"}}}}},"403":{"description":"Missing scope (insufficient_scope), or API access/trade eligibility not enabled (api_access_suspended).","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"insufficient_scope","message":"Example error message.","request_id":"req_example"}}}}},"404":{"description":"Resource not found or not owned by this business (not_found); missing effective price (price_not_found).","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Conflict response, if returned. Inspect error.code.","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"conflict","message":"Example error message.","request_id":"req_example"}}}}},"410":{"description":"Resource expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}}},"422":{"description":"Request exceeds an allowed limit (validation_error).","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"validation_error","message":"Example error message.","request_id":"req_example"}}}}},"429":{"description":"Shared business or key quota exceeded (rate_limited). Respect Retry-After in seconds.","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"Retry-After":{"description":"Retry delay in seconds or an HTTP date.","schema":{"type":"string"}},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"rate_limited","message":"Example error message.","request_id":"req_example"}}}}},"500":{"description":"500 internal_error","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"internal_error","message":"Example error message.","request_id":"req_example"}}}}},"503":{"description":"Service or export temporarily unavailable (temporarily_unavailable or export_unavailable).","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"temporarily_unavailable","message":"Example error message.","request_id":"req_example"}}}}}},"parameters":[{"name":"id","in":"path","required":true,"description":"PawUltra order ID; access also requires business ownership.","schema":{"type":"string"}}],"operationId":"getOrder"}},"/webhooks":{"get":{"summary":"List webhook","description":"Requires webhooks:manage and an enabled, approved PawUltra business. Endpoint ownership is enforced. Resource IDs are wh_ followed by 32 hexadecimal characters. Signing secrets are returned only on creation/rotation and are distinct from API bearer keys.","x-required-scopes":["webhooks:manage"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Successful response","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/WebhookEndpoint"}}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Invalid request values (validation_error) or invalid_cursor.","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"validation_error","message":"Example error message.","request_id":"req_example"}}}}},"401":{"description":"Missing, malformed, unknown, expired or revoked credential (invalid_api_key).","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"invalid_api_key","message":"Example error message.","request_id":"req_example"}}}}},"403":{"description":"Missing scope (insufficient_scope), or API access/trade eligibility not enabled (api_access_suspended).","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"insufficient_scope","message":"Example error message.","request_id":"req_example"}}}}},"404":{"description":"Resource not found or not owned by this business (not_found); missing effective price (price_not_found).","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Conflict response, if returned. Inspect error.code.","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"conflict","message":"Example error message.","request_id":"req_example"}}}}},"410":{"description":"Resource expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}}},"422":{"description":"Request exceeds an allowed limit (validation_error).","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"validation_error","message":"Example error message.","request_id":"req_example"}}}}},"429":{"description":"Shared business or key quota exceeded (rate_limited). Respect Retry-After in seconds.","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"Retry-After":{"description":"Retry delay in seconds or an HTTP date.","schema":{"type":"string"}},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"rate_limited","message":"Example error message.","request_id":"req_example"}}}}},"500":{"description":"500 internal_error","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"internal_error","message":"Example error message.","request_id":"req_example"}}}}},"503":{"description":"Service or export temporarily unavailable (temporarily_unavailable or export_unavailable).","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"temporarily_unavailable","message":"Example error message.","request_id":"req_example"}}}}}},"operationId":"listWebhooks"},"post":{"summary":"Create webhook","description":"Requires webhooks:manage and an enabled, approved PawUltra business. Endpoint ownership is enforced. Resource IDs are wh_ followed by 32 hexadecimal characters. Signing secrets are returned only on creation/rotation and are distinct from API bearer keys. The limit is 10 non-deleted subscriptions per business, including disabled ones.","x-required-scopes":["webhooks:manage"],"security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Successful response","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookWithSecret"}}}},"400":{"description":"Invalid request values (validation_error) or invalid_cursor.","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"validation_error","message":"Example error message.","request_id":"req_example"}}}}},"401":{"description":"Missing, malformed, unknown, expired or revoked credential (invalid_api_key).","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"invalid_api_key","message":"Example error message.","request_id":"req_example"}}}}},"403":{"description":"Missing scope (insufficient_scope), or API access/trade eligibility not enabled (api_access_suspended).","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"insufficient_scope","message":"Example error message.","request_id":"req_example"}}}}},"404":{"description":"Resource not found or not owned by this business (not_found); missing effective price (price_not_found).","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Conflict response, if returned. Inspect error.code.","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"conflict","message":"Example error message.","request_id":"req_example"}}}}},"410":{"description":"Resource expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}}},"422":{"description":"Request exceeds an allowed limit (validation_error).","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"validation_error","message":"Example error message.","request_id":"req_example"}}}}},"429":{"description":"Shared business or key quota exceeded (rate_limited). Respect Retry-After in seconds.","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"Retry-After":{"description":"Retry delay in seconds or an HTTP date.","schema":{"type":"string"}},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"rate_limited","message":"Example error message.","request_id":"req_example"}}}}},"500":{"description":"500 internal_error","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"internal_error","message":"Example error message.","request_id":"req_example"}}}}},"503":{"description":"Service or export temporarily unavailable (temporarily_unavailable or export_unavailable).","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"temporarily_unavailable","message":"Example error message.","request_id":"req_example"}}}}}},"operationId":"createWebhook","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","format":"uri","description":"Public HTTPS destination on port 443; redirects are not followed."},"events":{"type":"array","minItems":1,"maxItems":10,"items":{"type":"string","enum":["product.updated","product.unpublished","availability.updated","price.updated","order.updated","shipment.dispatched","shipment.updated","shipment.out_for_delivery","shipment.delivered","shipment.exception"]}},"enabled":{"type":"boolean"}},"required":["url","events"],"additionalProperties":false}}}}}},"/webhooks/{id}":{"get":{"summary":"Get webhook","description":"Requires webhooks:manage and an enabled, approved PawUltra business. Endpoint ownership is enforced. Resource IDs are wh_ followed by 32 hexadecimal characters. Signing secrets are returned only on creation/rotation and are distinct from API bearer keys.","x-required-scopes":["webhooks:manage"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Successful response","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEndpoint"}}}},"400":{"description":"Invalid request values (validation_error) or invalid_cursor.","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"validation_error","message":"Example error message.","request_id":"req_example"}}}}},"401":{"description":"Missing, malformed, unknown, expired or revoked credential (invalid_api_key).","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"invalid_api_key","message":"Example error message.","request_id":"req_example"}}}}},"403":{"description":"Missing scope (insufficient_scope), or API access/trade eligibility not enabled (api_access_suspended).","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"insufficient_scope","message":"Example error message.","request_id":"req_example"}}}}},"404":{"description":"Resource not found or not owned by this business (not_found); missing effective price (price_not_found).","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Conflict response, if returned. Inspect error.code.","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"conflict","message":"Example error message.","request_id":"req_example"}}}}},"410":{"description":"Resource expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}}},"422":{"description":"Request exceeds an allowed limit (validation_error).","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"validation_error","message":"Example error message.","request_id":"req_example"}}}}},"429":{"description":"Shared business or key quota exceeded (rate_limited). Respect Retry-After in seconds.","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"Retry-After":{"description":"Retry delay in seconds or an HTTP date.","schema":{"type":"string"}},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"rate_limited","message":"Example error message.","request_id":"req_example"}}}}},"500":{"description":"500 internal_error","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"internal_error","message":"Example error message.","request_id":"req_example"}}}}},"503":{"description":"Service or export temporarily unavailable (temporarily_unavailable or export_unavailable).","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"temporarily_unavailable","message":"Example error message.","request_id":"req_example"}}}}}},"operationId":"getWebhook","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]},"patch":{"summary":"Update webhook","description":"Requires webhooks:manage and an enabled, approved PawUltra business. Endpoint ownership is enforced. Resource IDs are wh_ followed by 32 hexadecimal characters. Signing secrets are returned only on creation/rotation and are distinct from API bearer keys.","x-required-scopes":["webhooks:manage"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Successful response","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEndpoint"}}}},"400":{"description":"Invalid request values (validation_error) or invalid_cursor.","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"validation_error","message":"Example error message.","request_id":"req_example"}}}}},"401":{"description":"Missing, malformed, unknown, expired or revoked credential (invalid_api_key).","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"invalid_api_key","message":"Example error message.","request_id":"req_example"}}}}},"403":{"description":"Missing scope (insufficient_scope), or API access/trade eligibility not enabled (api_access_suspended).","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"insufficient_scope","message":"Example error message.","request_id":"req_example"}}}}},"404":{"description":"Resource not found or not owned by this business (not_found); missing effective price (price_not_found).","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Conflict response, if returned. Inspect error.code.","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"conflict","message":"Example error message.","request_id":"req_example"}}}}},"410":{"description":"Resource expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}}},"422":{"description":"Request exceeds an allowed limit (validation_error).","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"validation_error","message":"Example error message.","request_id":"req_example"}}}}},"429":{"description":"Shared business or key quota exceeded (rate_limited). Respect Retry-After in seconds.","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"Retry-After":{"description":"Retry delay in seconds or an HTTP date.","schema":{"type":"string"}},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"rate_limited","message":"Example error message.","request_id":"req_example"}}}}},"500":{"description":"500 internal_error","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"internal_error","message":"Example error message.","request_id":"req_example"}}}}},"503":{"description":"Service or export temporarily unavailable (temporarily_unavailable or export_unavailable).","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"temporarily_unavailable","message":"Example error message.","request_id":"req_example"}}}}}},"operationId":"updateWebhook","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","format":"uri","description":"Public HTTPS destination on port 443; redirects are not followed."},"events":{"type":"array","minItems":1,"maxItems":10,"items":{"type":"string","enum":["product.updated","product.unpublished","availability.updated","price.updated","order.updated","shipment.dispatched","shipment.updated","shipment.out_for_delivery","shipment.delivered","shipment.exception"]}},"enabled":{"type":"boolean"}},"required":[],"additionalProperties":false}}}}},"delete":{"summary":"Delete webhook","description":"Requires webhooks:manage and an enabled, approved PawUltra business. Endpoint ownership is enforced. Resource IDs are wh_ followed by 32 hexadecimal characters. Signing secrets are returned only on creation/rotation and are distinct from API bearer keys.","x-required-scopes":["webhooks:manage"],"security":[{"bearerAuth":[]}],"responses":{"204":{"description":"Deleted endpoint; no response body."},"400":{"description":"Invalid request values (validation_error) or invalid_cursor.","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"validation_error","message":"Example error message.","request_id":"req_example"}}}}},"401":{"description":"Missing, malformed, unknown, expired or revoked credential (invalid_api_key).","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"invalid_api_key","message":"Example error message.","request_id":"req_example"}}}}},"403":{"description":"Missing scope (insufficient_scope), or API access/trade eligibility not enabled (api_access_suspended).","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"insufficient_scope","message":"Example error message.","request_id":"req_example"}}}}},"404":{"description":"Resource not found or not owned by this business (not_found); missing effective price (price_not_found).","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Conflict response, if returned. Inspect error.code.","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"conflict","message":"Example error message.","request_id":"req_example"}}}}},"410":{"description":"Resource expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}}},"422":{"description":"Request exceeds an allowed limit (validation_error).","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"validation_error","message":"Example error message.","request_id":"req_example"}}}}},"429":{"description":"Shared business or key quota exceeded (rate_limited). Respect Retry-After in seconds.","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"Retry-After":{"description":"Retry delay in seconds or an HTTP date.","schema":{"type":"string"}},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"rate_limited","message":"Example error message.","request_id":"req_example"}}}}},"500":{"description":"500 internal_error","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"internal_error","message":"Example error message.","request_id":"req_example"}}}}},"503":{"description":"Service or export temporarily unavailable (temporarily_unavailable or export_unavailable).","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"temporarily_unavailable","message":"Example error message.","request_id":"req_example"}}}}}},"operationId":"deleteWebhook","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]}},"/webhooks/{id}/rotate-secret":{"post":{"summary":"Rotate webhook","description":"Requires webhooks:manage and an enabled, approved PawUltra business. Endpoint ownership is enforced. Resource IDs are wh_ followed by 32 hexadecimal characters. Signing secrets are returned only on creation/rotation and are distinct from API bearer keys. Configure your receiver with the replacement signing secret before requesting a new test. Old signing material is not an acceptance guarantee after rotation.","x-required-scopes":["webhooks:manage"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Successful response","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookWithSecret"}}}},"400":{"description":"Invalid request values (validation_error) or invalid_cursor.","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"validation_error","message":"Example error message.","request_id":"req_example"}}}}},"401":{"description":"Missing, malformed, unknown, expired or revoked credential (invalid_api_key).","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"invalid_api_key","message":"Example error message.","request_id":"req_example"}}}}},"403":{"description":"Missing scope (insufficient_scope), or API access/trade eligibility not enabled (api_access_suspended).","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"insufficient_scope","message":"Example error message.","request_id":"req_example"}}}}},"404":{"description":"Resource not found or not owned by this business (not_found); missing effective price (price_not_found).","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Conflict response, if returned. Inspect error.code.","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"conflict","message":"Example error message.","request_id":"req_example"}}}}},"410":{"description":"Resource expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}}},"422":{"description":"Request exceeds an allowed limit (validation_error).","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"validation_error","message":"Example error message.","request_id":"req_example"}}}}},"429":{"description":"Shared business or key quota exceeded (rate_limited). Respect Retry-After in seconds.","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"Retry-After":{"description":"Retry delay in seconds or an HTTP date.","schema":{"type":"string"}},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"rate_limited","message":"Example error message.","request_id":"req_example"}}}}},"500":{"description":"500 internal_error","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"internal_error","message":"Example error message.","request_id":"req_example"}}}}},"503":{"description":"Service or export temporarily unavailable (temporarily_unavailable or export_unavailable).","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"temporarily_unavailable","message":"Example error message.","request_id":"req_example"}}}}}},"operationId":"rotateWebhook","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]}},"/webhooks/{id}/test":{"post":{"summary":"Test webhook","description":"Requires webhooks:manage and an enabled, approved PawUltra business. Endpoint ownership is enforced. Resource IDs are wh_ followed by 32 hexadecimal characters. Signing secrets are returned only on creation/rotation and are distinct from API bearer keys. Records a webhook.test event for asynchronous delivery; HTTP 200 is acceptance only, not a receiver delivery confirmation. The subscription must be enabled for delivery. Confirm reception and signature at your receiver. webhook.test is not a selectable subscription event.","x-required-scopes":["webhooks:manage"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Test event accepted for asynchronous delivery; does not confirm receiver delivery.","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEndpoint"}}}},"400":{"description":"Invalid request values (validation_error) or invalid_cursor.","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"validation_error","message":"Example error message.","request_id":"req_example"}}}}},"401":{"description":"Missing, malformed, unknown, expired or revoked credential (invalid_api_key).","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"invalid_api_key","message":"Example error message.","request_id":"req_example"}}}}},"403":{"description":"Missing scope (insufficient_scope), or API access/trade eligibility not enabled (api_access_suspended).","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"insufficient_scope","message":"Example error message.","request_id":"req_example"}}}}},"404":{"description":"Resource not found or not owned by this business (not_found); missing effective price (price_not_found).","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Conflict response, if returned. Inspect error.code.","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"conflict","message":"Example error message.","request_id":"req_example"}}}}},"410":{"description":"Resource expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}}},"422":{"description":"Request exceeds an allowed limit (validation_error).","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"validation_error","message":"Example error message.","request_id":"req_example"}}}}},"429":{"description":"Shared business or key quota exceeded (rate_limited). Respect Retry-After in seconds.","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"Retry-After":{"description":"Retry delay in seconds or an HTTP date.","schema":{"type":"string"}},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"rate_limited","message":"Example error message.","request_id":"req_example"}}}}},"500":{"description":"500 internal_error","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"internal_error","message":"Example error message.","request_id":"req_example"}}}}},"503":{"description":"Service or export temporarily unavailable (temporarily_unavailable or export_unavailable).","headers":{"X-PawUltra-Request-Id":{"schema":{"type":"string"},"description":"Request correlation identifier."},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp for quota reset."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"temporarily_unavailable","message":"Example error message.","request_id":"req_example"}}}}}},"operationId":"testWebhook","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]}}},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"PawUltra API key"}},"schemas":{"Category":{"type":"object","properties":{"name":{"type":"string"},"slug":{"type":"string"}},"required":["name","slug"],"additionalProperties":false},"Brand":{"type":"object","properties":{"name":{"type":"string"},"slug":{"type":"string"}},"required":["name","slug"],"additionalProperties":false},"AvailabilityState":{"type":"string","enum":["available","unavailable"]},"Availability":{"type":"object","properties":{"sku":{"type":"string","example":"PU-DOG-1234"},"availability":{"$ref":"#/components/schemas/AvailabilityState"},"availability_updated_at":{"type":["string","null"],"format":"date-time"}},"required":["sku","availability","availability_updated_at"],"additionalProperties":false},"Product":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"Stable PawUltra canonical product ID."},"sku":{"type":"string","example":"PU-DOG-1234"},"title":{"type":"string"},"brand":{"type":"string"},"gtin":{"type":["string","null"]},"category":{"$ref":"#/components/schemas/Category"},"description":{"type":["string","null"]},"availability":{"$ref":"#/components/schemas/AvailabilityState"},"availability_updated_at":{"type":["string","null"],"format":"date-time","description":"PawUltra availability freshness; null if no freshness time is available."},"images":{"type":"array","minItems":1,"items":{"$ref":"#/components/schemas/ProductImage"}},"updated_at":{"type":"string","format":"date-time"},"ingredients":{"type":["string","null"],"description":"Validated canonical PawUltra ingredients. Omitted or null when complete authoritative information is unavailable."},"composition":{"type":["string","null"],"description":"Validated canonical PawUltra composition. Omitted or null when complete authoritative information is unavailable."},"analytical_constituents":{"type":["string","null"],"description":"Validated canonical PawUltra analytical constituents. Omitted or null when complete authoritative information is unavailable."},"additives":{"type":["string","null"],"description":"Validated canonical PawUltra additives. Omitted or null when complete authoritative information is unavailable."},"feeding_guide":{"type":["string","null"],"description":"Validated canonical PawUltra feeding guide. Omitted or null when complete authoritative information is unavailable."},"directions_or_care":{"type":["string","null"],"description":"Validated canonical PawUltra directions or care. Omitted or null when complete authoritative information is unavailable."}},"required":["id","sku","title","brand","gtin","category","description","availability","availability_updated_at","images","updated_at"],"additionalProperties":false,"description":"Canonical product detail with the complete PawUltra editorial gallery in position order."},"ProductPage":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/ProductSummary"}},"next_cursor":{"type":["string","null"]}},"required":["data","next_cursor"],"additionalProperties":false},"BatchRequest":{"type":"object","properties":{"skus":{"type":"array","minItems":1,"uniqueItems":false,"items":{"type":"string","example":"PU-DOG-1234"},"description":"Maximum 100 inputs by default; duplicate SKUs are deduplicated.","maxItems":100}},"required":["skus"],"additionalProperties":false},"BatchResponse":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Availability"}},"not_found":{"type":"array","items":{"type":"string","example":"PU-DOG-1234"}}},"required":["data","not_found"],"additionalProperties":false},"Change":{"type":"object","properties":{"sku":{"type":"string","example":"PU-DOG-1234"},"action":{"type":"string","enum":["created","updated","unpublished","republished"]},"updated_at":{"type":"string","format":"date-time"}},"required":["sku","action","updated_at"],"additionalProperties":false},"ChangePage":{"type":"object","properties":{"changes":{"type":"array","items":{"$ref":"#/components/schemas/Change"}},"next_cursor":{"type":"string","description":"Opaque checkpoint for the next poll, including when no changes are returned."},"has_more":{"type":"boolean","description":"True if more changes are available before the client should wait to poll."}},"required":["changes","next_cursor","has_more"],"additionalProperties":false},"Export":{"type":"object","properties":{"version":{"type":"string"},"generated_at":{"type":"string","format":"date-time"},"format":{"const":"ndjson"},"compression":{"const":"gzip"},"product_count":{"type":"integer","minimum":0},"download_url":{"type":"string","format":"uri"},"expires_at":{"type":"string","format":"date-time"},"changes_cursor":{"type":"string","description":"Opaque change checkpoint associated consistently with this exact snapshot."},"sha256":{"type":"string","pattern":"^[a-f0-9]{64}$"}},"required":["version","generated_at","format","compression","product_count","download_url","expires_at","changes_cursor","sha256"],"additionalProperties":false},"Error":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}},"required":["code","message","request_id"],"additionalProperties":false}},"required":["error"],"additionalProperties":false},"ProductImage":{"type":"object","properties":{"url":{"type":"string","format":"uri","example":"https://media.pawultra.com/example/product.jpg"},"position":{"type":"integer","minimum":1,"description":"One-based PawUltra editorial gallery position."},"primary":{"type":"boolean","description":"True only for the first editorial image."},"width":{"type":"integer","minimum":1},"height":{"type":"integer","minimum":1}},"required":["url","position","primary","width","height"],"additionalProperties":false,"description":"PawUltra editorial gallery image; position is one-based, primary is true only at position 1. Dimensions are validated pixels."},"PrimaryImage":{"type":"object","properties":{"url":{"type":"string","format":"uri","description":"PawUltra-hosted media URL."},"width":{"type":"integer","minimum":1},"height":{"type":"integer","minimum":1}},"required":["url","width","height"],"additionalProperties":false},"ProductSummary":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"Stable PawUltra canonical product ID."},"sku":{"type":"string","example":"PU-DOG-1234"},"title":{"type":"string"},"brand":{"type":"string"},"gtin":{"type":["string","null"]},"category":{"$ref":"#/components/schemas/Category"},"description":{"type":["string","null"]},"availability":{"$ref":"#/components/schemas/AvailabilityState"},"availability_updated_at":{"type":["string","null"],"format":"date-time","description":"PawUltra availability freshness; null if no freshness time is available."},"updated_at":{"type":"string","format":"date-time"},"primary_image":{"$ref":"#/components/schemas/PrimaryImage"},"image_count":{"type":"integer","minimum":1,"description":"Number of images in the complete editorial gallery."},"ingredients":{"type":["string","null"],"description":"Validated canonical PawUltra ingredients. Omitted or null when complete authoritative information is unavailable."},"composition":{"type":["string","null"],"description":"Validated canonical PawUltra composition. Omitted or null when complete authoritative information is unavailable."},"analytical_constituents":{"type":["string","null"],"description":"Validated canonical PawUltra analytical constituents. Omitted or null when complete authoritative information is unavailable."},"additives":{"type":["string","null"],"description":"Validated canonical PawUltra additives. Omitted or null when complete authoritative information is unavailable."},"feeding_guide":{"type":["string","null"],"description":"Validated canonical PawUltra feeding guide. Omitted or null when complete authoritative information is unavailable."},"directions_or_care":{"type":["string","null"],"description":"Validated canonical PawUltra directions or care. Omitted or null when complete authoritative information is unavailable."}},"required":["id","sku","title","brand","gtin","category","description","availability","availability_updated_at","updated_at","primary_image","image_count"],"additionalProperties":false,"description":"Lightweight canonical product listing; primary_image is the first PawUltra editorial image."},"Price":{"type":"object","properties":{"sku":{"type":"string","example":"PU-DOG-1234"},"currency":{"type":"string","const":"GBP"},"net_price":{"type":"string","pattern":"^[0-9]+\\.[0-9]{2}$","description":"Customer-specific PawUltra trade selling price before VAT, expressed as a decimal string."},"vat_rate":{"type":["string","null"],"pattern":"^[0-9]+\\.[0-9]{2}$","description":"Applicable VAT percentage as a decimal string, or null when VAT has not been confirmed."},"price_updated_at":{"type":"string","format":"date-time"}},"required":["sku","currency","net_price","vat_rate","price_updated_at"],"additionalProperties":false},"PriceBatchResponse":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Price"}},"not_found":{"type":"array","items":{"type":"string","example":"PU-DOG-1234"}}},"required":["data","not_found"],"additionalProperties":false},"Carrier":{"type":"object","properties":{"code":{"type":"string"},"name":{"type":"string"}},"required":["code","name"],"additionalProperties":false},"ShipmentItem":{"type":"object","properties":{"sku":{"type":"string","example":"PU-DOG-1234"},"quantity":{"type":"integer","minimum":1}},"required":["sku","quantity"],"additionalProperties":false},"Shipment":{"type":"object","properties":{"id":{"type":"string"},"carrier":{"anyOf":[{"$ref":"#/components/schemas/Carrier"},{"type":"null"}]},"tracking_number":{"type":["string","null"]},"tracking_url":{"type":["string","null"],"format":"uri","description":"Official carrier tracking destination, where available."},"status":{"type":"string","enum":["unknown","dispatched","in_transit","out_for_delivery","delivered","exception","cancelled"],"description":"PawUltra-normalised shipment status."},"dispatched_at":{"type":["string","null"],"format":"date-time"},"estimated_delivery_at":{"type":["string","null"],"format":"date-time"},"delivered_at":{"type":["string","null"],"format":"date-time"},"tracking_updated_at":{"type":["string","null"],"format":"date-time"},"items":{"type":["array","null"],"items":{"$ref":"#/components/schemas/ShipmentItem"},"description":"Optional item allocations, only when authoritative."}},"required":["id","carrier","tracking_number","tracking_url","status","dispatched_at","estimated_delivery_at","delivered_at","tracking_updated_at"],"additionalProperties":false},"Order":{"type":"object","properties":{"id":{"type":"string"},"number":{"type":"string"},"status":{"type":"string"},"fulfilment_status":{"type":"string"},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"},"shipments":{"type":"array","items":{"$ref":"#/components/schemas/Shipment"},"description":"Zero or more shipments; multiple packages and split dispatch are supported."},"items":{"type":"array","items":{"$ref":"#/components/schemas/OrderItem"}},"merchandise_net":{"type":["number","null"]},"merchandise_vat":{"type":["number","null"]},"delivery_net":{"type":["number","null"]},"delivery_vat":{"type":["number","null"]},"total_vat":{"type":["number","null"]},"grand_total":{"type":["number","null"]},"payment_status":{"type":"string"},"currency":{"type":["string","null"]},"delivery_address":{"type":["object","null"],"additionalProperties":{"type":"string"}},"delivery_label":{"type":["string","null"]},"vat_breakdown":{"type":["array","null"],"items":{"type":"object"}}},"required":["id","number","status","fulfilment_status","created_at","updated_at","shipments","items"],"additionalProperties":false},"OrderPage":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/OrderSummary"}},"next_cursor":{"type":["string","null"]}},"required":["data","next_cursor"],"additionalProperties":false},"OrderItem":{"type":"object","properties":{"sku":{"type":"string"},"title":{"type":"string"},"quantity":{"type":"integer","minimum":1},"unit_net":{"type":["number","null"]},"vat_rate":{"type":["number","null"]},"line_net":{"type":["number","null"]},"line_vat":{"type":["number","null"]},"line_gross":{"type":["number","null"]}},"required":["sku","title","quantity"],"additionalProperties":false},"OrderSummary":{"type":"object","properties":{"id":{"type":"string"},"number":{"type":"string"},"status":{"type":"string"},"fulfilment_status":{"type":"string"},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"},"shipments":{"type":"array","items":{"$ref":"#/components/schemas/Shipment"},"description":"Zero or more shipments; multiple packages and split dispatch are supported."},"merchandise_net":{"type":["number","null"]},"merchandise_vat":{"type":["number","null"]},"delivery_net":{"type":["number","null"]},"delivery_vat":{"type":["number","null"]},"total_vat":{"type":["number","null"]},"grand_total":{"type":["number","null"]},"payment_status":{"type":"string"},"currency":{"type":["string","null"]}},"required":["id","number","status","fulfilment_status","created_at","updated_at","shipments"],"additionalProperties":false},"WebhookEndpoint":{"type":"object","properties":{"id":{"type":"string","description":"Webhook subscription identifier: wh_ followed by 32 hexadecimal characters; not a UUID."},"url":{"type":"string","format":"uri"},"events":{"type":"array","items":{"type":"string","enum":["product.updated","product.unpublished","availability.updated","price.updated","order.updated","shipment.dispatched","shipment.updated","shipment.out_for_delivery","shipment.delivered","shipment.exception"]}},"enabled":{"type":"boolean"},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"},"last_success_at":{"type":["string","null"],"format":"date-time"},"last_failure_at":{"type":["string","null"],"format":"date-time"}},"required":["id","url","events","enabled","created_at","updated_at","last_success_at","last_failure_at"],"additionalProperties":false},"WebhookWithSecret":{"type":"object","properties":{"id":{"type":"string"},"url":{"type":"string","format":"uri"},"events":{"type":"array","items":{"type":"string","enum":["product.updated","product.unpublished","availability.updated","price.updated","order.updated","shipment.dispatched","shipment.updated","shipment.out_for_delivery","shipment.delivered","shipment.exception"]}},"enabled":{"type":"boolean"},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"},"last_success_at":{"type":["string","null"],"format":"date-time"},"last_failure_at":{"type":["string","null"],"format":"date-time"},"secret":{"type":"string","description":"Shown only on creation or explicit rotation. Store securely."}},"required":["id","url","events","enabled","created_at","updated_at","last_success_at","last_failure_at","secret"],"additionalProperties":false},"WebhookEvent":{"type":"object","properties":{"id":{"type":"string","description":"Stable event identifier: evt_ followed by 32 hexadecimal characters; not a UUID. Use for durable deduplication. Equals X-PawUltra-Webhook-Id."},"type":{"type":"string","enum":["product.updated","product.unpublished","availability.updated","price.updated","order.updated","shipment.dispatched","shipment.updated","shipment.out_for_delivery","shipment.delivered","shipment.exception","webhook.test"]},"created_at":{"type":"string","format":"date-time"},"data":{"type":"object","description":"Small PawUltra notification identifying the affected resource.","additionalProperties":true}},"required":["id","type","created_at","data"],"additionalProperties":false,"description":"Signed asynchronous notification. HMAC-SHA256 covers the timestamp, a dot and the exact original HTTP body bytes. The signature header is v1= plus lowercase hexadecimal. Reject timestamps more than five minutes in the past or future. Accept duplicates idempotently; do not assume ordered or guaranteed delivery. Transient/non-2xx failures have bounded exponential retries, up to six attempts. Reconcile using authorised read endpoints."}}},"webhooks":{"pawultraEvent":{"post":{"operationId":"receivePawUltraEvent","summary":"Receive a signed PawUltra notification","security":[],"parameters":[{"name":"X-PawUltra-Webhook-Id","in":"header","required":true,"schema":{"type":"string"}},{"name":"X-PawUltra-Webhook-Timestamp","in":"header","required":true,"schema":{"type":"string"}},{"name":"X-PawUltra-Webhook-Signature","in":"header","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEvent"}}}},"responses":{"200":{"description":"The subscriber durably accepted the event."}}}}}}