{"openapi":"3.1.0","info":{"title":"Tecapy Developer API","version":"1.0.0","description":"Tecapy store API reference. Send your API key and project ID with each request."},"servers":[{"url":"https://api.tecapy.com/v1/api","description":"Production API"}],"security":[{"ApiKey":[],"ProjectId":[]}],"tags":[{"name":"Store & settings","description":"Read and update the store bound to your key. Store creation and deletion are available only in the CRM."},{"name":"Products","description":"Maintain your inventory. Prices are in the product currency. A category and a cover image are required. image is the cover URL; images contains additional URL strings."},{"name":"Categories","description":"Organize products and choose a replacement category before deleting a category in use."},{"name":"Orders & enquiries","description":"Read checkout orders, WhatsApp enquiries and calls. Calls/WhatsApp can contain only id, createdAt, currency, productName, total and type. Checkout orders include flat customer/address fields and item snapshots. Update an order’s fulfillment status or delete a record. Order creation remains in the storefront or CRM."},{"name":"Store design","description":"Use these two endpoints for design, branding, media, checkout preferences and store policies. Policies and checkout are nested in the design record, not separate API resources."},{"name":"Payment connections","description":"Manage payment provider connections. Checkout preferences and payment icons belong to the store design record."},{"name":"Domains & DNS","description":"Connect existing domains, search and purchase new ones, inspect registration details, renew and manage DNS. Payment confirmation is verified server-side."},{"name":"Advertising & tracking","description":"Independent integrations use OAuth consent. Managed Google campaigns share the same wallet and setup checks as the CRM. Advertising-platform credentials never appear in responses."},{"name":"Payments","description":"Create payment links to recharge your advertising wallet, pay the one-time USD 300 storefront license, or subscribe to an Independent integration or APIs & MCP (platform api) for USD 60 per month. currency is required for each request. Returned amount is in that currency; amountUsd is the USD charge. Follow paymentLink to pay; creating a link does not confirm payment."},{"name":"Wallet, licenses & billing","description":"Read balances and entitlements. Use Payments to create wallet, license or integration payment links. Clients cannot set balances, licenses or transaction payment states."},{"name":"Management & notifications","description":"Sensitive operations require the appropriate store-owner authorization. API access never grants platform-team or cross-store access."}],"paths":{"/store":{"get":{"operationId":"get-store","tags":["Store & settings"],"summary":"Get store","description":"Return the complete store data, including workingHours. Timestamps are serialized as ISO 8601 UTC strings.","parameters":[],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"message":{"type":"string"},"data":{"$ref":"#/components/schemas/Store"}},"required":["success","message","data"],"additionalProperties":false},"example":{"success":true,"message":"Success","data":{"id":"your_project_id","name":"Example Store","slug":"example-store","description":"","address":"","city":"Kampala","contactEmail":"shop@example.com","country":"Uganda","countryCode":"UG","createdAt":"2026-01-01T09:00:00Z","currency":"UGX","phoneNumber":"+256123456789","state":"Central","status":"live","updatedAt":"2026-01-01T09:05:00Z","workingHours":[{"day":"Mon-Fri","isOpen":false,"open":"09:00","close":"18:00"},{"day":"Sat","isOpen":false,"open":"09:00","close":"18:00"},{"day":"Sun","isOpen":false,"open":"09:00","close":"18:00"}],"zipCode":"000","googleMaps":"https://www.google.com/maps/embed?pb=<embed_parameters>"}}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"401":{"description":"Invalid credentials","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"403":{"description":"Access denied","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"404":{"description":"Configuration or resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"422":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"503":{"description":"Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}}}},"patch":{"operationId":"patch-store","tags":["Store & settings"],"summary":"Update store","description":"Send only editable fields. Do not include id, slug, status, createdAt, updatedAt; these read-only fields are rejected. workingHours is an array of Mon-Fri, Sat and Sun groups with day, isOpen, open and close. A successful update returns the same full Store shape as GET.","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"Business name."},"description":{"type":"string","description":"What the business does."},"country":{"type":"string","description":"Country name."},"countryCode":{"type":"string","description":"ISO 3166-1 alpha-2 country code."},"currency":{"type":"string","description":"Store base currency."},"phoneNumber":{"type":"string","description":"International phone number including country code."},"contactEmail":{"type":"string","description":"Business contact email.","format":"email"},"address":{"type":"string","description":"Street address."},"city":{"type":"string","description":"City."},"state":{"type":"string","description":"State or region."},"zipCode":{"type":"string","description":"Postal code."},"googleMaps":{"type":"string","description":"Google Maps embed URL for the store location.","format":"uri"},"workingHours":{"type":"array","minItems":3,"maxItems":3,"description":"Three groups, each once: Mon-Fri, Sat, Sun. Each entry has day, isOpen, open and close. Times are local HH:mm. isOpen:false means closed. PATCH replaces the entire array.","items":{"type":"object","properties":{"day":{"type":"string","description":"Day group.","enum":["Mon-Fri","Sat","Sun"]},"isOpen":{"type":"boolean","description":"Whether this day group is open."},"open":{"type":"string","description":"Local opening time.","pattern":"^([01][0-9]|2[0-3]):[0-5][0-9]$"},"close":{"type":"string","description":"Local closing time.","pattern":"^([01][0-9]|2[0-3]):[0-5][0-9]$"}},"required":["day","isOpen","open","close"],"additionalProperties":false}}},"required":[],"additionalProperties":false},"example":{"name":"Example Store","description":"Everyday home essentials.","currency":"UGX","googleMaps":"https://www.google.com/maps/embed?pb=<embed_parameters>","workingHours":[{"day":"Mon-Fri","isOpen":false,"open":"09:00","close":"18:00"},{"day":"Sat","isOpen":false,"open":"09:00","close":"18:00"},{"day":"Sun","isOpen":false,"open":"09:00","close":"18:00"}]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"message":{"type":"string"},"data":{"$ref":"#/components/schemas/Store"}},"required":["success","message","data"],"additionalProperties":false},"example":{"success":true,"message":"Success","data":{"id":"your_project_id","name":"Example Store","slug":"example-store","description":"","address":"","city":"Kampala","contactEmail":"shop@example.com","country":"Uganda","countryCode":"UG","createdAt":"2026-01-01T09:00:00Z","currency":"UGX","phoneNumber":"+256123456789","state":"Central","status":"live","updatedAt":"2026-01-01T09:05:00Z","workingHours":[{"day":"Mon-Fri","isOpen":false,"open":"09:00","close":"18:00"},{"day":"Sat","isOpen":false,"open":"09:00","close":"18:00"},{"day":"Sun","isOpen":false,"open":"09:00","close":"18:00"}],"zipCode":"000","googleMaps":"https://www.google.com/maps/embed?pb=<embed_parameters>"}}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"401":{"description":"Invalid credentials","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"403":{"description":"Access denied","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"404":{"description":"Configuration or resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"422":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"503":{"description":"Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}}}}},"/store/progress":{"get":{"operationId":"get-store-progress","tags":["Store & settings"],"summary":"Get store progress","description":"Read the store’s setup and activity milestones. Progress is maintained by successful store actions, not directly changed through this endpoint.","parameters":[],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"message":{"type":"string"},"data":{"type":"object","properties":{"created_store":{"type":"boolean"},"added_products":{"type":"boolean"},"run_ads":{"type":"boolean"},"cleared_license":{"type":"boolean"},"custom_domain":{"type":"boolean"},"designed_store":{"type":"boolean"},"got_orders":{"type":"boolean"}}}},"required":["success","message","data"],"additionalProperties":false},"example":{"success":true,"message":"Success","data":{"created_store":true,"added_products":true,"run_ads":true,"cleared_license":true,"custom_domain":true,"designed_store":true,"got_orders":true}}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"401":{"description":"Invalid credentials","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"403":{"description":"Access denied","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"404":{"description":"Configuration or resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"422":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"503":{"description":"Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}}}}},"/products":{"get":{"operationId":"get-products","tags":["Products"],"summary":"List products","description":"Cursor-paginated products. Optional categoryId and sort (newest, oldest, price-asc, price-desc, name-asc, name-desc).","parameters":[{"in":"query","name":"categoryId","required":false,"schema":{"type":"string"}},{"in":"query","name":"sort","required":false,"schema":{"type":"string"}},{"in":"query","name":"limit","schema":{"type":"integer","minimum":1,"maximum":100,"default":20}},{"in":"query","name":"cursor","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"message":{"type":"string"},"data":{"type":"array","items":{"$ref":"#/components/schemas/Product"}},"meta":{"type":"object","properties":{"nextCursor":{"type":["string","null"]},"hasMore":{"type":"boolean"}},"required":["nextCursor","hasMore"],"additionalProperties":false}},"required":["success","message","data"],"additionalProperties":false},"example":{"success":true,"message":"Success","data":[{"id":"prod_123","projectId":"your_project_id","slug":"battery-charger","name":"Battery Charger","brand":"Example Brand","category":"Mechanical equipment","categoryId":"cat_123","description":"A workshop charger for compatible 12V and 24V batteries.","price":900000,"currency":"UGX","condition":"new","inStock":true,"image":"https://example.com/charger-cover.webp","images":["https://example.com/charger-side.webp"],"facebookVideo":null,"tiktokVideo":null,"youtubeVideo":null,"createdAt":"2026-01-01T09:00:00Z","updatedAt":"2026-01-01T09:05:00Z"}],"meta":{"nextCursor":null,"hasMore":false}}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"401":{"description":"Invalid credentials","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"403":{"description":"Access denied","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"404":{"description":"Configuration or resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"422":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"503":{"description":"Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}}}},"post":{"operationId":"post-products","tags":["Products"],"summary":"Create product","description":"Send editable fields only. image is the cover URL and images is an array of additional URL strings. Do not send id, projectId, slug, createdAt or updatedAt. The backend validates image URLs and queues feed updates.","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"Product title, natural capitalization, maximum 100 characters.","maxLength":100},"brand":{"type":"string","description":"Brand or Unbranded.","maxLength":80},"category":{"type":"string","description":"Category display name."},"categoryId":{"type":"string","description":"Opaque resource ID."},"description":{"type":"string","description":"Plain-text description.","maxLength":5000},"price":{"type":"number","description":"Regular price in the product currency.","minimum":0},"discountPrice":{"type":["number","null"],"description":"Optional sale price, greater than zero and lower than price; null removes the discount."},"currency":{"type":"string","description":"ISO 4217 currency code.","pattern":"^[A-Z]{3}$"},"condition":{"type":"string","description":"Product condition.","enum":["new","used","refurbished"]},"inStock":{"type":"boolean","description":"Whether the product is available."},"image":{"type":"string","description":"Cover image: one public HTTPS URL.","format":"uri","pattern":"^https://"},"images":{"type":"array","minItems":0,"maxItems":5,"description":"Additional image URLs, as strings, not objects. The cover image is separate in image; maximum six images including the cover.","items":{"type":"string","format":"uri","pattern":"^https://"}},"facebookVideo":{"type":["string","null"],"description":"Facebook video URL, or null."},"tiktokVideo":{"type":["string","null"],"description":"TikTok video URL, or null."},"youtubeVideo":{"type":["string","null"],"description":"YouTube video URL, or null."}},"required":["name","brand","description","price","currency","category","categoryId","condition","inStock","image"],"additionalProperties":false},"example":{"name":"Battery Charger","brand":"Example Brand","category":"Mechanical equipment","categoryId":"cat_123","description":"A workshop charger for compatible 12V and 24V batteries.","price":900000,"currency":"UGX","condition":"new","inStock":true,"image":"https://example.com/charger-cover.webp","images":["https://example.com/charger-side.webp"],"facebookVideo":null,"tiktokVideo":null,"youtubeVideo":null}}}},"responses":{"201":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"message":{"type":"string"},"data":{"$ref":"#/components/schemas/Product"}},"required":["success","message","data"],"additionalProperties":false},"example":{"success":true,"message":"Success","data":{"id":"prod_123","projectId":"your_project_id","slug":"battery-charger","name":"Battery Charger","brand":"Example Brand","category":"Mechanical equipment","categoryId":"cat_123","description":"A workshop charger for compatible 12V and 24V batteries.","price":900000,"currency":"UGX","condition":"new","inStock":true,"image":"https://example.com/charger-cover.webp","images":["https://example.com/charger-side.webp"],"facebookVideo":null,"tiktokVideo":null,"youtubeVideo":null,"createdAt":"2026-01-01T09:00:00Z","updatedAt":"2026-01-01T09:05:00Z"}}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"401":{"description":"Invalid credentials","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"403":{"description":"Access denied","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"404":{"description":"Configuration or resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"422":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"503":{"description":"Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}}}}},"/products/{productId}":{"get":{"operationId":"get-products-productId","tags":["Products"],"summary":"Get product","description":"Read a single product.","parameters":[{"in":"path","name":"productId","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"message":{"type":"string"},"data":{"$ref":"#/components/schemas/Product"}},"required":["success","message","data"],"additionalProperties":false},"example":{"success":true,"message":"Success","data":{"id":"prod_123","projectId":"your_project_id","slug":"battery-charger","name":"Battery Charger","brand":"Example Brand","category":"Mechanical equipment","categoryId":"cat_123","description":"A workshop charger for compatible 12V and 24V batteries.","price":900000,"currency":"UGX","condition":"new","inStock":true,"image":"https://example.com/charger-cover.webp","images":["https://example.com/charger-side.webp"],"facebookVideo":null,"tiktokVideo":null,"youtubeVideo":null,"createdAt":"2026-01-01T09:00:00Z","updatedAt":"2026-01-01T09:05:00Z"}}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"401":{"description":"Invalid credentials","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"403":{"description":"Access denied","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"404":{"description":"Configuration or resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"422":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"503":{"description":"Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}}}},"patch":{"operationId":"patch-products-productId","tags":["Products"],"summary":"Update product","description":"Patch editable fields only. Do not send updatedAt, createdAt, projectId, slug or id. Keep one cover URL in image and additional URL strings in images. Send discountPrice:null to remove a sale price.","parameters":[{"in":"path","name":"productId","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"Product title, natural capitalization, maximum 100 characters.","maxLength":100},"brand":{"type":"string","description":"Brand or Unbranded.","maxLength":80},"category":{"type":"string","description":"Category display name."},"categoryId":{"type":"string","description":"Opaque resource ID."},"description":{"type":"string","description":"Plain-text description.","maxLength":5000},"price":{"type":"number","description":"Regular price in the product currency.","minimum":0},"discountPrice":{"type":["number","null"],"description":"Optional sale price, greater than zero and lower than price; null removes the discount."},"currency":{"type":"string","description":"ISO 4217 currency code.","pattern":"^[A-Z]{3}$"},"condition":{"type":"string","description":"Product condition.","enum":["new","used","refurbished"]},"inStock":{"type":"boolean","description":"Whether the product is available."},"image":{"type":"string","description":"Cover image: one public HTTPS URL.","format":"uri","pattern":"^https://"},"images":{"type":"array","minItems":0,"maxItems":5,"description":"Additional image URLs, as strings, not objects. The cover image is separate in image; maximum six images including the cover.","items":{"type":"string","format":"uri","pattern":"^https://"}},"facebookVideo":{"type":["string","null"],"description":"Facebook video URL, or null."},"tiktokVideo":{"type":["string","null"],"description":"TikTok video URL, or null."},"youtubeVideo":{"type":["string","null"],"description":"YouTube video URL, or null."}},"required":[],"additionalProperties":false},"example":{"price":850000,"inStock":true,"images":["https://example.com/charger-side.webp"]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"message":{"type":"string"},"data":{"$ref":"#/components/schemas/Product"}},"required":["success","message","data"],"additionalProperties":false},"example":{"success":true,"message":"Success","data":{"id":"prod_123","projectId":"your_project_id","slug":"battery-charger","name":"Battery Charger","brand":"Example Brand","category":"Mechanical equipment","categoryId":"cat_123","description":"A workshop charger for compatible 12V and 24V batteries.","price":900000,"currency":"UGX","condition":"new","inStock":true,"image":"https://example.com/charger-cover.webp","images":["https://example.com/charger-side.webp"],"facebookVideo":null,"tiktokVideo":null,"youtubeVideo":null,"createdAt":"2026-01-01T09:00:00Z","updatedAt":"2026-01-01T09:05:00Z"}}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"401":{"description":"Invalid credentials","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"403":{"description":"Access denied","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"404":{"description":"Configuration or resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"422":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"503":{"description":"Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}}}},"delete":{"operationId":"delete-products-productId","tags":["Products"],"summary":"Delete product","description":"Remove a product and its managed media; existing order snapshots remain.","parameters":[{"in":"path","name":"productId","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"message":{"type":"string"},"data":{"type":"null"}},"required":["success","message","data"],"additionalProperties":false},"example":{"success":true,"message":"Success","data":null}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"401":{"description":"Invalid credentials","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"403":{"description":"Access denied","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"404":{"description":"Configuration or resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"422":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"503":{"description":"Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}}}}},"/categories":{"get":{"operationId":"get-categories","tags":["Categories"],"summary":"List categories","description":"Cursor-paginated categories. sort accepts newest, oldest, name-asc or name-desc; defaults to newest.","parameters":[{"in":"query","name":"sort","required":false,"schema":{"type":"string","enum":["newest","oldest","name-asc","name-desc"],"default":"newest"}},{"in":"query","name":"limit","schema":{"type":"integer","minimum":1,"maximum":100,"default":20}},{"in":"query","name":"cursor","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"message":{"type":"string"},"data":{"type":"array","items":{"$ref":"#/components/schemas/Category"}},"meta":{"type":"object","properties":{"nextCursor":{"type":["string","null"]},"hasMore":{"type":"boolean"}},"required":["nextCursor","hasMore"],"additionalProperties":false}},"required":["success","message","data"],"additionalProperties":false},"example":{"success":true,"message":"Success","data":[{"id":"cat_123","name":"Cleaning supplies","slug":"cleaning-supplies","createdAt":"2026-01-01T09:00:00Z","UpdatedAt":"2026-01-01T09:05:00Z"}],"meta":{"nextCursor":null,"hasMore":false}}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"401":{"description":"Invalid credentials","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"403":{"description":"Access denied","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"404":{"description":"Configuration or resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"422":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"503":{"description":"Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}}}},"post":{"operationId":"post-categories","tags":["Categories"],"summary":"Create category","description":"Send name only. id, slug, createdAt and UpdatedAt are generated by the backend.","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"Category name.","maxLength":80}},"required":["name"],"additionalProperties":false},"example":{"name":"Cleaning supplies"}}}},"responses":{"201":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"message":{"type":"string"},"data":{"$ref":"#/components/schemas/Category"}},"required":["success","message","data"],"additionalProperties":false},"example":{"success":true,"message":"Success","data":{"id":"cat_123","name":"Cleaning supplies","slug":"cleaning-supplies","createdAt":"2026-01-01T09:00:00Z","UpdatedAt":"2026-01-01T09:05:00Z"}}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"401":{"description":"Invalid credentials","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"403":{"description":"Access denied","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"404":{"description":"Configuration or resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"422":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"503":{"description":"Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}}}}},"/categories/{categoryId}":{"get":{"operationId":"get-categories-categoryId","tags":["Categories"],"summary":"Get category","description":"Fetch one category by categoryId. Returns id, name, slug, createdAt and UpdatedAt.","parameters":[{"in":"path","name":"categoryId","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"message":{"type":"string"},"data":{"$ref":"#/components/schemas/Category"}},"required":["success","message","data"],"additionalProperties":false},"example":{"success":true,"message":"Success","data":{"id":"cat_123","name":"Cleaning supplies","slug":"cleaning-supplies","createdAt":"2026-01-01T09:00:00Z","UpdatedAt":"2026-01-01T09:05:00Z"}}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"401":{"description":"Invalid credentials","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"403":{"description":"Access denied","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"404":{"description":"Configuration or resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"422":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"503":{"description":"Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}}}},"patch":{"operationId":"patch-categories-categoryId","tags":["Categories"],"summary":"Rename category","description":"Send name only. id, slug, createdAt and UpdatedAt cannot be submitted. Returns the full category data.","parameters":[{"in":"path","name":"categoryId","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"Category name.","maxLength":80}},"required":["name"],"additionalProperties":false},"example":{"name":"Home cleaning"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"message":{"type":"string"},"data":{"$ref":"#/components/schemas/Category"}},"required":["success","message","data"],"additionalProperties":false},"example":{"success":true,"message":"Success","data":{"id":"cat_123","name":"Cleaning supplies","slug":"cleaning-supplies","createdAt":"2026-01-01T09:00:00Z","UpdatedAt":"2026-01-01T09:05:00Z"}}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"401":{"description":"Invalid credentials","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"403":{"description":"Access denied","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"404":{"description":"Configuration or resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"422":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"503":{"description":"Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}}}},"delete":{"operationId":"delete-categories-categoryId","tags":["Categories"],"summary":"Delete category","description":"Use replacementCategoryId when products are assigned. Reject deletion without a valid replacement when required.","parameters":[{"in":"path","name":"categoryId","required":true,"schema":{"type":"string"}},{"in":"query","name":"replacementCategoryId","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"message":{"type":"string"},"data":{"type":"null"}},"required":["success","message","data"],"additionalProperties":false},"example":{"success":true,"message":"Success","data":null}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"401":{"description":"Invalid credentials","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"403":{"description":"Access denied","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"404":{"description":"Configuration or resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"422":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"503":{"description":"Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}}}}},"/orders":{"get":{"operationId":"get-orders","tags":["Orders & enquiries"],"summary":"List orders & enquiries","description":"Optional filters: type=order, type=whatsapp or type=call; from is an inclusive ISO 8601 timestamp and to is exclusive. Omit type to include all three record types. Pagination works with these filters.","parameters":[{"in":"query","name":"type","required":false,"schema":{"type":"string","enum":["order","whatsapp","call"]}},{"in":"query","name":"from","required":false,"schema":{"type":"string"}},{"in":"query","name":"to","required":false,"schema":{"type":"string"}},{"in":"query","name":"limit","schema":{"type":"integer","minimum":1,"maximum":100,"default":20}},{"in":"query","name":"cursor","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"message":{"type":"string"},"data":{"type":"array","items":{"$ref":"#/components/schemas/Order"}},"meta":{"type":"object","properties":{"nextCursor":{"type":["string","null"]},"hasMore":{"type":"boolean"}},"required":["nextCursor","hasMore"],"additionalProperties":false}},"required":["success","message","data"],"additionalProperties":false},"examples":{"Order":{"value":{"success":true,"message":"Success","data":[{"id":"order_123","type":"order","createdAt":"2026-01-01T09:00:00Z","currency":"KES","customerName":"Example Customer","customerEmail":"customer@example.com","apartment":"","city":"Kampala","country":"UG","streetAddress":"Example Road","postalCode":"000","deliveryFee":0,"fulfillment":"delivery","items":[{"id":"prod_123","name":"Example Product","slug":"example-product","currency":"KES","price":500,"quantity":1}],"orderStatus":"Processing","paymentMethod":"dpo","paymentStatus":"pending","productName":"Example Product","subtotal":500,"total":500}],"meta":{"nextCursor":null,"hasMore":false}}},"Call":{"value":{"success":true,"message":"Success","data":[{"id":"call_123","createdAt":"2026-01-01T09:00:00Z","currency":"KES","productName":"Store enquiry","total":0,"type":"call"}],"meta":{"nextCursor":null,"hasMore":false}}},"WhatsApp":{"value":{"success":true,"message":"Success","data":[{"id":"whatsapp_123","createdAt":"2026-01-01T09:00:00Z","currency":"KES","productName":"Store enquiry","total":0,"type":"whatsapp"}],"meta":{"nextCursor":null,"hasMore":false}}}}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"401":{"description":"Invalid credentials","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"403":{"description":"Access denied","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"404":{"description":"Configuration or resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"422":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"503":{"description":"Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}}}}},"/orders/{orderId}":{"get":{"operationId":"get-orders-orderId","tags":["Orders & enquiries"],"summary":"Get order or enquiry","description":"Read one record. The returned fields depend on whether its type is order, call or whatsapp.","parameters":[{"in":"path","name":"orderId","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"message":{"type":"string"},"data":{"$ref":"#/components/schemas/Order"}},"required":["success","message","data"],"additionalProperties":false},"example":{"success":true,"message":"Success","data":{"id":"order_123","type":"order","createdAt":"2026-01-01T09:00:00Z","currency":"KES","customerName":"Example Customer","customerEmail":"customer@example.com","apartment":"","city":"Kampala","country":"UG","streetAddress":"Example Road","postalCode":"000","deliveryFee":0,"fulfillment":"delivery","items":[{"id":"prod_123","name":"Example Product","slug":"example-product","currency":"KES","price":500,"quantity":1}],"orderStatus":"Processing","paymentMethod":"dpo","paymentStatus":"pending","productName":"Example Product","subtotal":500,"total":500}}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"401":{"description":"Invalid credentials","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"403":{"description":"Access denied","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"404":{"description":"Configuration or resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"422":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"503":{"description":"Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}}}},"patch":{"operationId":"patch-orders-orderId","tags":["Orders & enquiries"],"summary":"Update order status","description":"Send orderStatus only: Processing, Shipped, Delivered or Cancelled. Other fields cannot be updated through this endpoint. Returns the updated order.","parameters":[{"in":"path","name":"orderId","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"orderStatus":{"type":"string","description":"Checkout fulfillment status.","enum":["Processing","Shipped","Delivered","Cancelled"]}},"required":["orderStatus"],"additionalProperties":false},"example":{"orderStatus":"Shipped"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"message":{"type":"string"},"data":{"$ref":"#/components/schemas/Order"}},"required":["success","message","data"],"additionalProperties":false},"example":{"success":true,"message":"Success","data":{"id":"order_123","type":"order","createdAt":"2026-01-01T09:00:00Z","currency":"KES","customerName":"Example Customer","customerEmail":"customer@example.com","apartment":"","city":"Kampala","country":"UG","streetAddress":"Example Road","postalCode":"000","deliveryFee":0,"fulfillment":"delivery","items":[{"id":"prod_123","name":"Example Product","slug":"example-product","currency":"KES","price":500,"quantity":1}],"orderStatus":"Processing","paymentMethod":"dpo","paymentStatus":"pending","productName":"Example Product","subtotal":500,"total":500}}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"401":{"description":"Invalid credentials","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"403":{"description":"Access denied","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"404":{"description":"Configuration or resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"422":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"503":{"description":"Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}}}},"delete":{"operationId":"delete-orders-orderId","tags":["Orders & enquiries"],"summary":"Delete order","description":"Delete the order or enquiry record from this store. This permanently removes the record and does not refund payments.","parameters":[{"in":"path","name":"orderId","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"message":{"type":"string"},"data":{"type":"null"}},"required":["success","message","data"],"additionalProperties":false},"example":{"success":true,"message":"Success","data":null}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"401":{"description":"Invalid credentials","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"403":{"description":"Access denied","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"404":{"description":"Configuration or resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"422":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"503":{"description":"Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}}}}},"/design":{"get":{"operationId":"get-design","tags":["Store design"],"summary":"Get store design","description":"Read the store design with asset objects, checkout, policies, theme, social links and product presentation. Asset entries use id, path, type and url. All design fields are optional and allow null. fit/imageFit accepts cover or contain; productMedia accepts grid or slideshow; hero.mode accepts single, none or slideshow. feedAccess, tagManager, googleSiteVerification, updatedAt and asset path fields are read-only. Timestamps are ISO 8601 strings.","parameters":[],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"message":{"type":"string"},"data":{"$ref":"#/components/schemas/Design"}},"required":["success","message","data"],"additionalProperties":false},"example":{"success":true,"message":"Success","data":{"checkout":{"countryDeliveryFees":{"US":50000},"currency":"UGX","deliveryEnabled":true,"deliveryFee":5000,"enabled":true,"methods":["cash-on-delivery","pesapal","flutterwave","stripe","dpo","paystack","paypal"],"phoneRequired":true,"pickupEnabled":true,"whatsappEnabled":true},"designComplete":true,"footerLogo":{"id":"footer_logo","path":"branding/your_project_id/footer-logo.webp","type":"image/webp","url":"https://example.com/footer-logo.webp"},"hero":{"desktop":[{"id":"hero_desktop","path":"branding/your_project_id/hero-desktop.webp","type":"image/webp","url":"https://example.com/hero-desktop.webp"}],"mobile":[{"id":"hero_mobile","path":"branding/your_project_id/hero-mobile.webp","type":"image/webp","url":"https://example.com/hero-mobile.webp"}],"fit":"cover","height":600,"mobileHeight":400,"mode":"single","videos":{"desktop":null,"mobile":null}},"logo":{"id":"logo","path":"branding/your_project_id/logo.webp","type":"image/webp","url":"https://example.com/logo.webp"},"logoVisibility":{"footer":true,"toolbar":true},"paymentIcons":[{"id":"payment-one","path":"branding/your_project_id/payment-one.webp","type":"image/webp","url":"https://example.com/payment-one.webp"},{"id":"payment-two","path":"branding/your_project_id/payment-two.webp","type":"image/webp","url":"https://example.com/payment-two.webp"},{"id":"payment-three","path":"branding/your_project_id/payment-three.webp","type":"image/webp","url":"https://example.com/payment-three.webp"}],"policies":{"about":{"body":"We provide products for our local community.","published":true,"updatedAt":"2026-01-01T09:00:00Z"},"payments":{"body":"Choose an available payment method at checkout.","published":true,"updatedAt":"2026-01-01T09:00:00Z"},"privacy":{"body":"We use customer details to fulfill orders.","published":true,"updatedAt":"2026-01-01T09:00:00Z"},"returns":{"body":"Contact us about eligible returns.","published":true,"updatedAt":"2026-01-01T09:00:00Z"},"shipping":{"body":"Contact us for delivery availability.","published":true,"updatedAt":"2026-01-01T09:00:00Z"},"terms":{"body":"Please review our store terms before ordering.","published":true,"updatedAt":"2026-01-01T09:00:00Z"},"faq":{"body":"Contact us if you have questions about products or delivery.","published":true,"updatedAt":"2026-01-01T09:00:00Z"}},"productCard":{"border":true,"buttons":true,"imageFit":"cover","imageHeight":280,"mobileImageHeight":180},"productMedia":"slideshow","schemaVersion":1,"socialLinks":{"facebook":"https://facebook.com/example","instagram":"https://instagram.com/example","linkedin":"https://linkedin.com/example","pinterest":"https://pinterest.com/example","tiktok":"https://tiktok.com/example","x":"https://x.com/example","youtube":"https://youtube.com/example"},"theme":{"background":"#ffffff","primary":"#171080","secondary":"#111827"},"toolbarLogo":{"id":"toolbar_logo","path":"branding/your_project_id/toolbar-logo.webp","type":"image/webp","url":"https://example.com/toolbar-logo.webp"},"updatedAt":"2026-01-01T09:00:00Z","tagManager":"GTM-XXXXXXX","googleSiteVerification":"<google_site_verification_token>","crawlersEnabled":false,"currencySettings":{"baseCurrency":"UGX","rates":{"USD":0.00024}},"feedAccess":{"hash":"<server_generated_feed_hash>","version":1}}}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"401":{"description":"Invalid credentials","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"403":{"description":"Access denied","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"404":{"description":"Configuration or resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"422":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"503":{"description":"Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}}}},"patch":{"operationId":"patch-design","tags":["Store design"],"summary":"Update store design","description":"Patch the design fields you want to change. Include checkout preferences under checkout and pages under policies.<page>. Media fields use asset objects; toolbarLogo/footerLogo and video slots may be null. No design field is required; null is allowed. Do not send server-controlled feedAccess, tagManager, googleSiteVerification, updatedAt, schemaVersion or path inside media objects. The request example includes every editable field; the response returns the full design, including read-only fields.","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":["object","null"],"properties":{"checkout":{"type":["object","null"],"properties":{"countryDeliveryFees":{"type":["object","null"],"description":"Country codes mapped to delivery fees in the checkout currency.","additionalProperties":{"type":["number","null"],"minimum":0}},"currency":{"type":["string","null"],"description":"Checkout currency."},"deliveryEnabled":{"type":["boolean","null"],"description":"Offer delivery."},"deliveryFee":{"type":["number","null"],"description":"Default delivery fee.","minimum":0},"enabled":{"type":["boolean","null"],"description":"Enable checkout."},"methods":{"type":["array","null"],"items":{"type":["string","null"],"description":"Payment method identifier, for example cash-on-delivery."}},"phoneRequired":{"type":["boolean","null"],"description":"Require customer phone."},"pickupEnabled":{"type":["boolean","null"],"description":"Offer store pickup."},"whatsappEnabled":{"type":["boolean","null"],"description":"Enable WhatsApp checkout."}},"required":[],"additionalProperties":false},"designComplete":{"type":["boolean","null"],"description":"Whether a design has been saved."},"logo":{"anyOf":[{"type":["object","null"],"properties":{"id":{"type":["string","null"],"description":"Asset ID."},"type":{"type":["string","null"],"description":"Media MIME type, such as image/webp."},"url":{"type":["string","null"],"description":"Public HTTPS asset URL.","format":"uri","pattern":"^https://"}},"required":[],"additionalProperties":false},{"type":"null"}],"description":"Media asset object, or null to clear it."},"toolbarLogo":{"anyOf":[{"type":["object","null"],"properties":{"id":{"type":["string","null"],"description":"Asset ID."},"type":{"type":["string","null"],"description":"Media MIME type, such as image/webp."},"url":{"type":["string","null"],"description":"Public HTTPS asset URL.","format":"uri","pattern":"^https://"}},"required":[],"additionalProperties":false},{"type":"null"}],"description":"Media asset object, or null to clear it."},"footerLogo":{"anyOf":[{"type":["object","null"],"properties":{"id":{"type":["string","null"],"description":"Asset ID."},"type":{"type":["string","null"],"description":"Media MIME type, such as image/webp."},"url":{"type":["string","null"],"description":"Public HTTPS asset URL.","format":"uri","pattern":"^https://"}},"required":[],"additionalProperties":false},{"type":"null"}],"description":"Media asset object, or null to clear it."},"logoVisibility":{"type":["object","null"],"properties":{"toolbar":{"type":["boolean","null"],"description":"Show toolbar logo."},"footer":{"type":["boolean","null"],"description":"Show footer logo."}},"required":[],"additionalProperties":false},"hero":{"type":["object","null"],"properties":{"desktop":{"type":["array","null"],"items":{"type":["object","null"],"properties":{"id":{"type":["string","null"],"description":"Asset ID."},"type":{"type":["string","null"],"description":"Media MIME type, such as image/webp."},"url":{"type":["string","null"],"description":"Public HTTPS asset URL.","format":"uri","pattern":"^https://"}},"required":[],"additionalProperties":false}},"mobile":{"type":["array","null"],"items":{"type":["object","null"],"properties":{"id":{"type":["string","null"],"description":"Asset ID."},"type":{"type":["string","null"],"description":"Media MIME type, such as image/webp."},"url":{"type":["string","null"],"description":"Public HTTPS asset URL.","format":"uri","pattern":"^https://"}},"required":[],"additionalProperties":false}},"fit":{"type":["string","null"],"description":"Image fit.","enum":["cover","contain",null]},"height":{"type":["integer","null"],"minimum":120,"maximum":1200},"mobileHeight":{"type":["integer","null"],"minimum":120,"maximum":1000},"mode":{"type":["string","null"],"description":"Hero display mode.","enum":["single","none","slideshow",null]},"videos":{"type":["object","null"],"properties":{"desktop":{"anyOf":[{"type":["object","null"],"properties":{"id":{"type":["string","null"],"description":"Asset ID."},"type":{"type":["string","null"],"description":"Media MIME type, such as image/webp."},"url":{"type":["string","null"],"description":"Public HTTPS asset URL.","format":"uri","pattern":"^https://"}},"required":[],"additionalProperties":false},{"type":"null"}],"description":"Media asset object, or null to clear it."},"mobile":{"anyOf":[{"type":["object","null"],"properties":{"id":{"type":["string","null"],"description":"Asset ID."},"type":{"type":["string","null"],"description":"Media MIME type, such as image/webp."},"url":{"type":["string","null"],"description":"Public HTTPS asset URL.","format":"uri","pattern":"^https://"}},"required":[],"additionalProperties":false},{"type":"null"}],"description":"Media asset object, or null to clear it."}},"required":[],"additionalProperties":false}},"required":[],"additionalProperties":false},"paymentIcons":{"type":["array","null"],"items":{"type":["object","null"],"properties":{"id":{"type":["string","null"],"description":"Asset ID."},"type":{"type":["string","null"],"description":"Media MIME type, such as image/webp."},"url":{"type":["string","null"],"description":"Public HTTPS asset URL.","format":"uri","pattern":"^https://"}},"required":[],"additionalProperties":false}},"policies":{"type":["object","null"],"description":"Store pages keyed by about, faq, payments, privacy, returns, shipping or terms. Save body and published under the page key.","properties":{"about":{"type":["object","null"],"properties":{"body":{"type":["string","null"],"description":"Page text."},"published":{"type":["boolean","null"],"description":"Whether the page is visible."}},"required":[],"additionalProperties":false},"faq":{"type":["object","null"],"properties":{"body":{"type":["string","null"],"description":"Page text."},"published":{"type":["boolean","null"],"description":"Whether the page is visible."}},"required":[],"additionalProperties":false},"payments":{"type":["object","null"],"properties":{"body":{"type":["string","null"],"description":"Page text."},"published":{"type":["boolean","null"],"description":"Whether the page is visible."}},"required":[],"additionalProperties":false},"privacy":{"type":["object","null"],"properties":{"body":{"type":["string","null"],"description":"Page text."},"published":{"type":["boolean","null"],"description":"Whether the page is visible."}},"required":[],"additionalProperties":false},"returns":{"type":["object","null"],"properties":{"body":{"type":["string","null"],"description":"Page text."},"published":{"type":["boolean","null"],"description":"Whether the page is visible."}},"required":[],"additionalProperties":false},"shipping":{"type":["object","null"],"properties":{"body":{"type":["string","null"],"description":"Page text."},"published":{"type":["boolean","null"],"description":"Whether the page is visible."}},"required":[],"additionalProperties":false},"terms":{"type":["object","null"],"properties":{"body":{"type":["string","null"],"description":"Page text."},"published":{"type":["boolean","null"],"description":"Whether the page is visible."}},"required":[],"additionalProperties":false}},"additionalProperties":false,"required":[]},"productCard":{"type":["object","null"],"properties":{"border":{"type":["boolean","null"],"description":"Show card border."},"buttons":{"type":["boolean","null"],"description":"Show product action buttons."},"imageFit":{"type":["string","null"],"description":"Card image fit.","enum":["cover","contain",null]},"imageHeight":{"type":["integer","null"],"minimum":100,"maximum":800},"mobileImageHeight":{"type":["integer","null"],"minimum":100,"maximum":600}},"required":[],"additionalProperties":false},"productMedia":{"type":["string","null"],"description":"Product details layout.","enum":["grid","slideshow",null]},"socialLinks":{"type":["object","null"],"description":"Social platform names mapped to public profile URLs.","additionalProperties":{"type":["string","null"],"format":"uri"}},"theme":{"type":["object","null"],"properties":{"background":{"type":["string","null"],"description":"Background hex color."},"primary":{"type":["string","null"],"description":"Primary hex color."},"secondary":{"type":["string","null"],"description":"Secondary hex color."}},"required":[],"additionalProperties":false},"crawlersEnabled":{"type":["boolean","null"],"description":"Allow search engines to crawl the dedicated store domain."},"currencySettings":{"type":["object","null"],"properties":{"baseCurrency":{"type":["string","null"],"description":"Store base currency."},"rates":{"type":["object","null"],"additionalProperties":{"type":["number","null"],"exclusiveMinimum":0}}},"required":[],"additionalProperties":false}},"required":[],"additionalProperties":false},"example":{"checkout":{"countryDeliveryFees":{"US":50000},"currency":"UGX","deliveryEnabled":true,"deliveryFee":5000,"enabled":true,"methods":["cash-on-delivery","pesapal","flutterwave","stripe","dpo","paystack","paypal"],"phoneRequired":true,"pickupEnabled":true,"whatsappEnabled":true},"designComplete":true,"footerLogo":{"id":"footer_logo","type":"image/webp","url":"https://example.com/footer-logo.webp"},"hero":{"desktop":[{"id":"hero_desktop","type":"image/webp","url":"https://example.com/hero-desktop.webp"}],"mobile":[{"id":"hero_mobile","type":"image/webp","url":"https://example.com/hero-mobile.webp"}],"fit":"cover","height":600,"mobileHeight":400,"mode":"single","videos":{"desktop":null,"mobile":null}},"logo":{"id":"logo","type":"image/webp","url":"https://example.com/logo.webp"},"logoVisibility":{"footer":true,"toolbar":true},"paymentIcons":[{"id":"payment-one","type":"image/webp","url":"https://example.com/payment-one.webp"},{"id":"payment-two","type":"image/webp","url":"https://example.com/payment-two.webp"},{"id":"payment-three","type":"image/webp","url":"https://example.com/payment-three.webp"}],"policies":{"about":{"body":"We provide products for our local community.","published":true},"payments":{"body":"Choose an available payment method at checkout.","published":true},"privacy":{"body":"We use customer details to fulfill orders.","published":true},"returns":{"body":"Contact us about eligible returns.","published":true},"shipping":{"body":"Contact us for delivery availability.","published":true},"terms":{"body":"Please review our store terms before ordering.","published":true},"faq":{"body":"Contact us if you have questions about products or delivery.","published":true}},"productCard":{"border":true,"buttons":true,"imageFit":"cover","imageHeight":280,"mobileImageHeight":180},"productMedia":"slideshow","socialLinks":{"facebook":"https://facebook.com/example","instagram":"https://instagram.com/example","linkedin":"https://linkedin.com/example","pinterest":"https://pinterest.com/example","tiktok":"https://tiktok.com/example","x":"https://x.com/example","youtube":"https://youtube.com/example"},"theme":{"background":"#ffffff","primary":"#171080","secondary":"#111827"},"toolbarLogo":{"id":"toolbar_logo","type":"image/webp","url":"https://example.com/toolbar-logo.webp"},"crawlersEnabled":false,"currencySettings":{"baseCurrency":"UGX","rates":{"USD":0.00024}}}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"message":{"type":"string"},"data":{"$ref":"#/components/schemas/Design"}},"required":["success","message","data"],"additionalProperties":false},"example":{"success":true,"message":"Success","data":{"checkout":{"countryDeliveryFees":{"US":50000},"currency":"UGX","deliveryEnabled":true,"deliveryFee":5000,"enabled":true,"methods":["cash-on-delivery","pesapal","flutterwave","stripe","dpo","paystack","paypal"],"phoneRequired":true,"pickupEnabled":true,"whatsappEnabled":true},"designComplete":true,"footerLogo":{"id":"footer_logo","path":"branding/your_project_id/footer-logo.webp","type":"image/webp","url":"https://example.com/footer-logo.webp"},"hero":{"desktop":[{"id":"hero_desktop","path":"branding/your_project_id/hero-desktop.webp","type":"image/webp","url":"https://example.com/hero-desktop.webp"}],"mobile":[{"id":"hero_mobile","path":"branding/your_project_id/hero-mobile.webp","type":"image/webp","url":"https://example.com/hero-mobile.webp"}],"fit":"cover","height":600,"mobileHeight":400,"mode":"single","videos":{"desktop":null,"mobile":null}},"logo":{"id":"logo","path":"branding/your_project_id/logo.webp","type":"image/webp","url":"https://example.com/logo.webp"},"logoVisibility":{"footer":true,"toolbar":true},"paymentIcons":[{"id":"payment-one","path":"branding/your_project_id/payment-one.webp","type":"image/webp","url":"https://example.com/payment-one.webp"},{"id":"payment-two","path":"branding/your_project_id/payment-two.webp","type":"image/webp","url":"https://example.com/payment-two.webp"},{"id":"payment-three","path":"branding/your_project_id/payment-three.webp","type":"image/webp","url":"https://example.com/payment-three.webp"}],"policies":{"about":{"body":"We provide products for our local community.","published":true,"updatedAt":"2026-01-01T09:00:00Z"},"payments":{"body":"Choose an available payment method at checkout.","published":true,"updatedAt":"2026-01-01T09:00:00Z"},"privacy":{"body":"We use customer details to fulfill orders.","published":true,"updatedAt":"2026-01-01T09:00:00Z"},"returns":{"body":"Contact us about eligible returns.","published":true,"updatedAt":"2026-01-01T09:00:00Z"},"shipping":{"body":"Contact us for delivery availability.","published":true,"updatedAt":"2026-01-01T09:00:00Z"},"terms":{"body":"Please review our store terms before ordering.","published":true,"updatedAt":"2026-01-01T09:00:00Z"},"faq":{"body":"Contact us if you have questions about products or delivery.","published":true,"updatedAt":"2026-01-01T09:00:00Z"}},"productCard":{"border":true,"buttons":true,"imageFit":"cover","imageHeight":280,"mobileImageHeight":180},"productMedia":"slideshow","schemaVersion":1,"socialLinks":{"facebook":"https://facebook.com/example","instagram":"https://instagram.com/example","linkedin":"https://linkedin.com/example","pinterest":"https://pinterest.com/example","tiktok":"https://tiktok.com/example","x":"https://x.com/example","youtube":"https://youtube.com/example"},"theme":{"background":"#ffffff","primary":"#171080","secondary":"#111827"},"toolbarLogo":{"id":"toolbar_logo","path":"branding/your_project_id/toolbar-logo.webp","type":"image/webp","url":"https://example.com/toolbar-logo.webp"},"updatedAt":"2026-01-01T09:00:00Z","tagManager":"GTM-XXXXXXX","googleSiteVerification":"<google_site_verification_token>","crawlersEnabled":false,"currencySettings":{"baseCurrency":"UGX","rates":{"USD":0.00024}},"feedAccess":{"hash":"<server_generated_feed_hash>","version":1}}}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"401":{"description":"Invalid credentials","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"403":{"description":"Access denied","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"404":{"description":"Configuration or resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"422":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"503":{"description":"Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}}}}},"/payment-gateways":{"get":{"operationId":"get-payment-gateways","tags":["Payment connections"],"summary":"List gateway connections","description":"Return provider and connection status only, never saved secrets.","parameters":[],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"message":{"type":"string"},"data":{"type":"array","items":{"type":"object","properties":{"provider":{"type":"string"},"isActive":{"type":"boolean"}}}}},"required":["success","message","data"],"additionalProperties":false},"example":{"success":true,"message":"Success","data":[{"provider":"paypal","isActive":true}]}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"401":{"description":"Invalid credentials","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"403":{"description":"Access denied","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"404":{"description":"Configuration or resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"422":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"503":{"description":"Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}}}}},"/payment-gateways/{provider}":{"get":{"operationId":"get-payment-gateways-provider","tags":["Payment connections"],"summary":"Get payment connection","description":"Return provider and isActive for one payment provider. Saved credentials are never returned.","parameters":[{"in":"path","name":"provider","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"message":{"type":"string"},"data":{"type":"object","properties":{"provider":{"type":"string"},"isActive":{"type":"boolean"}}}},"required":["success","message","data"],"additionalProperties":false},"example":{"success":true,"message":"Success","data":{"provider":"paypal","isActive":true}}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"401":{"description":"Invalid credentials","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"403":{"description":"Access denied","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"404":{"description":"Configuration or resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"422":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"503":{"description":"Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}}}},"put":{"operationId":"put-payment-gateways-provider","tags":["Payment connections"],"summary":"Connect payment gateway","description":"Set provider credentials. PayPal uses client_id and client_secret; provider must be flutterwave, paystack, pesapal, stripe, dpo or paypal. Stripe uses publishable_key/secret_key; DPO uses company_token/service_type; Flutterwave/Paystack use public_key/secret_key; Pesapal uses consumer_key/consumer_secret.","parameters":[{"in":"path","name":"provider","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"provider":{"type":"string","description":"Gateway identifier.","enum":["flutterwave","paystack","pesapal","stripe","dpo","paypal"]},"isActive":{"type":"boolean","description":"Connection status."},"credentials":{"type":"object","writeOnly":true,"description":"Provider-specific secret fields. PayPal uses client_id and client_secret. Never returned by GET.","additionalProperties":{"type":"string"}}},"required":["credentials"],"additionalProperties":false},"example":{"credentials":{"client_id":"your_paypal_client_id","client_secret":"your_paypal_secret"}}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"message":{"type":"string"},"data":{"type":"object","properties":{"provider":{"type":"string"},"isActive":{"type":"boolean"},"webhook":{"type":"string"}}}},"required":["success","message","data"],"additionalProperties":false},"example":{"success":true,"message":"Success","data":{"provider":"paypal","isActive":true,"webhook":"<webhook_url>"}}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"401":{"description":"Invalid credentials","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"403":{"description":"Access denied","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"404":{"description":"Configuration or resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"422":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"503":{"description":"Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}}}},"delete":{"operationId":"delete-payment-gateways-provider","tags":["Payment connections"],"summary":"Disconnect gateway","description":"Revoke or remove the provider connection.","parameters":[{"in":"path","name":"provider","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"message":{"type":"string"},"data":{"type":"null"}},"required":["success","message","data"],"additionalProperties":false},"example":{"success":true,"message":"Success","data":null}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"401":{"description":"Invalid credentials","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"403":{"description":"Access denied","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"404":{"description":"Configuration or resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"422":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"503":{"description":"Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}}}}},"/domains":{"get":{"operationId":"get-domains","tags":["Domains & DNS"],"summary":"List connected domains","description":"Read connected hostnames.","parameters":[{"in":"query","name":"limit","schema":{"type":"integer","minimum":1,"maximum":100,"default":20}},{"in":"query","name":"cursor","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"message":{"type":"string"},"data":{"type":"array","items":{"type":"object","properties":{"hostname":{"type":"string"}}}},"meta":{"type":"object","properties":{"nextCursor":{"type":["string","null"]},"hasMore":{"type":"boolean"}},"required":["nextCursor","hasMore"],"additionalProperties":false}},"required":["success","message","data"],"additionalProperties":false},"example":{"success":true,"message":"Success","data":[{"hostname":"example.com"}],"meta":{"nextCursor":null,"hasMore":false}}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"401":{"description":"Invalid credentials","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"403":{"description":"Access denied","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"404":{"description":"Configuration or resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"422":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"503":{"description":"Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}}}},"post":{"operationId":"post-domains","tags":["Domains & DNS"],"summary":"Connect existing domain","description":"Start setup for a hostname. Backend includes the store slug when calling domain_management.","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"hostname":{"type":"string"}}},"example":{"hostname":"example-store.com"}}}},"responses":{"201":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"message":{"type":"string"},"data":{"type":"object","properties":{"hostname":{"type":"string"},"status":{"type":"string"}}}},"required":["success","message","data"],"additionalProperties":false},"example":{"success":true,"message":"Success","data":{"hostname":"example-store.com","status":"pending"}}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"401":{"description":"Invalid credentials","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"403":{"description":"Access denied","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"404":{"description":"Configuration or resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"422":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"503":{"description":"Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}}}}},"/domains/{hostname}/check":{"post":{"operationId":"post-domains-hostname-check","tags":["Domains & DNS"],"summary":"Check domain setup","description":"Return DNS configuration actions. ADD means create the DNS record; DELETE means remove it. Each record includes action, type, name and value.","parameters":[{"in":"path","name":"hostname","required":true,"schema":{"type":"string"}}],"responses":{"201":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"message":{"type":"string"},"data":{"type":"array","items":{"type":"object","properties":{"action":{"type":"string"},"type":{"type":"string"},"name":{"type":"string"},"value":{"type":"string"}}}}},"required":["success","message","data"],"additionalProperties":false},"example":{"success":true,"message":"Success","data":[{"action":"ADD","type":"CNAME","name":"www","value":"target.example.com"},{"action":"DELETE","type":"CNAME","name":"www","value":"old-target.example.com"}]}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"401":{"description":"Invalid credentials","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"403":{"description":"Access denied","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"404":{"description":"Configuration or resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"422":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"503":{"description":"Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}}}}},"/domains/{hostname}":{"delete":{"operationId":"delete-domains-hostname","tags":["Domains & DNS"],"summary":"Remove connected domain","description":"Disconnect this hostname; does not cancel its registration.","parameters":[{"in":"path","name":"hostname","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"message":{"type":"string"},"data":{"type":"null"}},"required":["success","message","data"],"additionalProperties":false},"example":{"success":true,"message":"Success","data":null}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"401":{"description":"Invalid credentials","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"403":{"description":"Access denied","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"404":{"description":"Configuration or resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"422":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"503":{"description":"Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}}}}},"/custom-domains/search":{"get":{"operationId":"get-custom-domains-search","tags":["Domains & DNS"],"summary":"Search domain availability","description":"Requires domain query. Return one-year USD price and a local estimate. Prices are returned without a quote ID.","parameters":[{"in":"query","name":"domain","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"message":{"type":"string"},"data":{"type":"object","properties":{"domain":{"type":"string"},"available":{"type":"boolean"},"priceUsd":{"type":"number"},"currency":{"type":"string"},"periodYears":{"type":"number"}}}},"required":["success","message","data"],"additionalProperties":false},"example":{"success":true,"message":"Success","data":{"domain":"example-store.com","available":true,"priceUsd":15,"currency":"USD","periodYears":1}}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"401":{"description":"Invalid credentials","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"403":{"description":"Access denied","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"404":{"description":"Configuration or resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"422":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"503":{"description":"Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}}}}},"/custom-domains":{"get":{"operationId":"get-custom-domains","tags":["Domains & DNS"],"summary":"List purchased domains","description":"Read purchased domain registration and owner details. ACT means active; PEN means pending because payment has not been completed. expirationDate is Unix seconds; addressNumber is an integer. authCode is confidential.","parameters":[{"in":"query","name":"limit","schema":{"type":"integer","minimum":1,"maximum":100,"default":20}},{"in":"query","name":"cursor","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"message":{"type":"string"},"data":{"type":"array","items":{"$ref":"#/components/schemas/CustomDomain"}},"meta":{"type":"object","properties":{"nextCursor":{"type":["string","null"]},"hasMore":{"type":"boolean"}},"required":["nextCursor","hasMore"],"additionalProperties":false}},"required":["success","message","data"],"additionalProperties":false},"example":{"success":true,"message":"Success","data":[{"address":"Example Trade Center, Shop 204","addressNumber":204,"authCode":"<domain_auth_code>","city":"Kampala","contactHandle":"<contact_handle>","country":"UG","domainId":12345678,"domainName":"example.com","eMail":"owner@example.com","expirationDate":1825502994,"firstName":"Alex","lastName":"Example","phone":"456789","phoneAreaCode":"123","phoneCountryCode":"+256","postalCode":"1101","state":"Central","status":"ACT"}],"meta":{"nextCursor":null,"hasMore":false}}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"401":{"description":"Invalid credentials","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"403":{"description":"Access denied","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"404":{"description":"Configuration or resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"422":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"503":{"description":"Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}}}}},"/custom-domains/register":{"post":{"operationId":"post-custom-domains-register","tags":["Domains & DNS"],"summary":"Register/purchase domain","description":"Register and purchase a domain using flat owner contact fields and domainName. state is required. Do not send status, expirationDate, domainId, contactHandle or authCode. No quoteId is needed. Follow paymentLink to complete payment.","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"firstName":{"type":"string","description":"Registrant first name."},"lastName":{"type":"string","description":"Registrant surname."},"eMail":{"type":"string","description":"Registrant email.","format":"email"},"phoneCountryCode":{"type":"string","description":"Country calling code."},"phoneAreaCode":{"type":"string","description":"First three digits of national phone number."},"phone":{"type":"string","description":"Remaining national phone number."},"country":{"type":"string","description":"Country code."},"address":{"type":"string","description":"Street name."},"addressNumber":{"type":"integer","minimum":0,"description":"Building or address number."},"city":{"type":"string","description":"City."},"state":{"type":"string","description":"Region."},"postalCode":{"type":"string","description":"Postal code."},"domainName":{"type":"string","description":"Purchased domain hostname."}},"required":["domainName","firstName","lastName","eMail","phoneCountryCode","phoneAreaCode","phone","country","address","addressNumber","city","state","postalCode"],"additionalProperties":false},"example":{"address":"Example Trade Center, Shop 204","addressNumber":204,"city":"Kampala","country":"UG","domainName":"example.com","eMail":"owner@example.com","firstName":"Alex","lastName":"Example","phone":"456789","phoneAreaCode":"123","phoneCountryCode":"+256","postalCode":"1101","state":"Central"}}}},"responses":{"201":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"message":{"type":"string"},"data":{"type":"object","properties":{"domain":{"type":"string"},"periodYears":{"type":"number"},"price":{"type":"number"},"currency":{"type":"string"},"paymentLink":{"type":"string"},"payment_id":{"type":"string"}}}},"required":["success","message","data"],"additionalProperties":false},"example":{"success":true,"message":"Success","data":{"domain":"example.com","periodYears":1,"price":0,"currency":"USD","paymentLink":"<payment_link>","payment_id":"<payment_id>"}}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"401":{"description":"Invalid credentials","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"403":{"description":"Access denied","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"404":{"description":"Configuration or resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"422":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"503":{"description":"Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}}}}},"/custom-domains/{hostname}":{"get":{"operationId":"get-custom-domains-hostname","tags":["Domains & DNS"],"summary":"Get registration details","description":"Return purchased domain registration and contact details. expirationDate is Unix seconds.","parameters":[{"in":"path","name":"hostname","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"message":{"type":"string"},"data":{"$ref":"#/components/schemas/CustomDomain"}},"required":["success","message","data"],"additionalProperties":false},"example":{"success":true,"message":"Success","data":{"address":"Example Trade Center, Shop 204","addressNumber":204,"authCode":"<domain_auth_code>","city":"Kampala","contactHandle":"<contact_handle>","country":"UG","domainId":12345678,"domainName":"example.com","eMail":"owner@example.com","expirationDate":1825502994,"firstName":"Alex","lastName":"Example","phone":"456789","phoneAreaCode":"123","phoneCountryCode":"+256","postalCode":"1101","state":"Central","status":"ACT"}}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"401":{"description":"Invalid credentials","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"403":{"description":"Access denied","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"404":{"description":"Configuration or resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"422":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"503":{"description":"Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}}}},"delete":{"operationId":"delete-custom-domains-hostname","tags":["Domains & DNS"],"summary":"Delete incomplete registration","description":"Delete the saved draft only if status is not ACT. Reject active registrations.","parameters":[{"in":"path","name":"hostname","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"message":{"type":"string"},"data":{"type":"null"}},"required":["success","message","data"],"additionalProperties":false},"example":{"success":true,"message":"Success","data":null}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"401":{"description":"Invalid credentials","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"403":{"description":"Access denied","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"404":{"description":"Configuration or resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"422":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"503":{"description":"Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}}}}},"/custom-domains/{hostname}/renewal":{"post":{"operationId":"post-custom-domains-hostname-renewal","tags":["Domains & DNS"],"summary":"Renew domain","description":"Prepare a one-year renewal and return its price and payment link. Follow paymentLink to pay; the link is not proof of payment.","parameters":[{"in":"path","name":"hostname","required":true,"schema":{"type":"string"}}],"responses":{"201":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"message":{"type":"string"},"data":{"type":"object","properties":{"domain":{"type":"string"},"periodYears":{"type":"number"},"price":{"type":"number"},"currency":{"type":"string"},"paymentLink":{"type":"string"},"payment_id":{"type":"string"}}}},"required":["success","message","data"],"additionalProperties":false},"example":{"success":true,"message":"Success","data":{"domain":"example.com","periodYears":1,"price":0,"currency":"USD","paymentLink":"<payment_link>","payment_id":"<payment_id>"}}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"401":{"description":"Invalid credentials","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"403":{"description":"Access denied","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"404":{"description":"Configuration or resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"422":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"503":{"description":"Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}}}}},"/custom-domains/{hostname}/connect":{"post":{"operationId":"post-custom-domains-hostname-connect","tags":["Domains & DNS"],"summary":"Connect purchased domain","description":"Configure the purchased domain for this store.","parameters":[{"in":"path","name":"hostname","required":true,"schema":{"type":"string"}}],"responses":{"201":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"message":{"type":"string"},"data":{"type":"object","properties":{"hostname":{"type":"string"},"status":{"type":"string"}}}},"required":["success","message","data"],"additionalProperties":false},"example":{"success":true,"message":"Success","data":{"hostname":"example-store.com","status":"pending"}}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"401":{"description":"Invalid credentials","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"403":{"description":"Access denied","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"404":{"description":"Configuration or resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"422":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"503":{"description":"Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}}}}},"/custom-domains/{hostname}/dns":{"get":{"operationId":"get-custom-domains-hostname-dns","tags":["Domains & DNS"],"summary":"List DNS records","description":"Read DNS records.","parameters":[{"in":"path","name":"hostname","required":true,"schema":{"type":"string"}},{"in":"query","name":"limit","schema":{"type":"integer","minimum":1,"maximum":100,"default":20}},{"in":"query","name":"cursor","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"message":{"type":"string"},"data":{"type":"array","items":{"$ref":"#/components/schemas/DnsRecord"}},"meta":{"type":"object","properties":{"nextCursor":{"type":["string","null"]},"hasMore":{"type":"boolean"}},"required":["nextCursor","hasMore"],"additionalProperties":false}},"required":["success","message","data"],"additionalProperties":false},"example":{"success":true,"message":"Success","data":[{"id":"dns_123","name":"www","type":"CNAME","value":"example-store.com","ttl":3600}],"meta":{"nextCursor":null,"hasMore":false}}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"401":{"description":"Invalid credentials","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"403":{"description":"Access denied","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"404":{"description":"Configuration or resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"422":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"503":{"description":"Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}}}},"post":{"operationId":"post-custom-domains-hostname-dns","tags":["Domains & DNS"],"summary":"Add DNS record","description":"Validate record type, target and TTL.","parameters":[{"in":"path","name":"hostname","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"Record host/name."},"type":{"type":"string","description":"Record type.","enum":["A","AAAA","CNAME","MX","TXT","NS","SOA","CAA","SRV"]},"value":{"type":"string","description":"Record target/value."},"ttl":{"type":"integer","minimum":60},"priority":{"type":"integer","minimum":0}},"required":["name","type","value","ttl"],"additionalProperties":false},"example":{"name":"www","type":"CNAME","value":"example-store.com","ttl":3600}}}},"responses":{"201":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"message":{"type":"string"},"data":{"$ref":"#/components/schemas/DnsRecord"}},"required":["success","message","data"],"additionalProperties":false},"example":{"success":true,"message":"Success","data":{"id":"dns_123","name":"www","type":"CNAME","value":"example-store.com","ttl":3600}}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"401":{"description":"Invalid credentials","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"403":{"description":"Access denied","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"404":{"description":"Configuration or resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"422":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"503":{"description":"Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}}}}},"/custom-domains/{hostname}/dns/{recordId}":{"delete":{"operationId":"delete-custom-domains-hostname-dns-recordId","tags":["Domains & DNS"],"summary":"Delete DNS record","description":"Openprovider NS and SOA records are protected and must be rejected.","parameters":[{"in":"path","name":"hostname","required":true,"schema":{"type":"string"}},{"in":"path","name":"recordId","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"message":{"type":"string"},"data":{"type":"null"}},"required":["success","message","data"],"additionalProperties":false},"example":{"success":true,"message":"Success","data":null}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"401":{"description":"Invalid credentials","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"403":{"description":"Access denied","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"404":{"description":"Configuration or resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"422":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"503":{"description":"Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}}}}},"/advertising/integrations":{"get":{"operationId":"get-advertising-integrations","tags":["Advertising & tracking"],"summary":"Get ad connections","description":"Connection status for google, meta, tiktok, x, reddit, pinterest, snapchat, bing and google_tag. mode is managed or independent. Google Tag Manager uses google_tag under Independent integrations.","parameters":[],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"message":{"type":"string"},"data":{"type":"array","items":{"$ref":"#/components/schemas/AdIntegration"}}},"required":["success","message","data"],"additionalProperties":false},"example":{"success":true,"message":"Success","data":[{"platform":"google","mode":"managed","isActive":true},{"platform":"google_tag","mode":"independent","isActive":true}]}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"401":{"description":"Invalid credentials","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"403":{"description":"Access denied","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"404":{"description":"Configuration or resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"422":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"503":{"description":"Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}}}}},"/advertising/integrations/{platform}/authorization":{"post":{"operationId":"post-advertising-integrations-platform-authorization","tags":["Advertising & tracking"],"summary":"Begin Independent authorization","description":"Return a short-lived authorization URL. The account holder completes consent in the browser. Use platform google_tag for Google Tag Manager, like other Independent integrations.","parameters":[{"in":"path","name":"platform","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"returnUrl":{"type":"string"}}},"example":{"returnUrl":"https://example-store.com/integration-return"}}}},"responses":{"201":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"message":{"type":"string"},"data":{"type":"object","properties":{"authorizationUrl":{"type":"string"},"expiresAt":{"type":"string"}}}},"required":["success","message","data"],"additionalProperties":false},"example":{"success":true,"message":"Success","data":{"authorizationUrl":"https://example.com/oauth/authorize","expiresAt":"2026-11-09T12:15:00Z"}}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"401":{"description":"Invalid credentials","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"403":{"description":"Access denied","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"404":{"description":"Configuration or resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"422":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"503":{"description":"Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}}}}},"/advertising/integrations/{platform}":{"delete":{"operationId":"delete-advertising-integrations-platform","tags":["Advertising & tracking"],"summary":"Disconnect integration","description":"Disconnect the platform and revoke saved access where supported.","parameters":[{"in":"path","name":"platform","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"message":{"type":"string"},"data":{"type":"null"}},"required":["success","message","data"],"additionalProperties":false},"example":{"success":true,"message":"Success","data":null}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"401":{"description":"Invalid credentials","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"403":{"description":"Access denied","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"404":{"description":"Configuration or resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"422":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"503":{"description":"Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}}}}},"/feeds/credentials":{"post":{"operationId":"post-feeds-credentials","tags":["Advertising & tracking"],"summary":"Generate feed credentials","description":"Generate/replace catalog access credentials. Credentials are sensitive and must use no-store responses.","parameters":[],"responses":{"201":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"message":{"type":"string"},"data":{"type":"array","items":{"type":"object","properties":{"platform":{"type":"string"},"url":{"type":"string"},"username":{"type":"string"},"password":{"type":"string"}}}}},"required":["success","message","data"],"additionalProperties":false},"example":{"success":true,"message":"Success","data":[{"platform":"google","url":"https://example-store.com/feed/google.xml","username":"<feed_username>","password":"<feed_password>"}]}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"401":{"description":"Invalid credentials","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"403":{"description":"Access denied","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"404":{"description":"Configuration or resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"422":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"503":{"description":"Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}}}}},"/feeds":{"get":{"operationId":"get-feeds","tags":["Advertising & tracking"],"summary":"Get catalog feed","description":"Read catalog feed URLs and access credentials for supported platforms. Treat these credentials as confidential. Feed format and availability/condition casing depend on platform.","parameters":[],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"message":{"type":"string"},"data":{"type":"array","items":{"type":"object","properties":{"platform":{"type":"string"},"url":{"type":"string"},"username":{"type":"string"},"password":{"type":"string"}}}}},"required":["success","message","data"],"additionalProperties":false},"example":{"success":true,"message":"Success","data":[{"platform":"google","url":"https://example-store.com/feed/google.xml","username":"<feed_username>","password":"<feed_password>"}]}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"401":{"description":"Invalid credentials","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"403":{"description":"Access denied","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"404":{"description":"Configuration or resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"422":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"503":{"description":"Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}}}}},"/feeds/refresh":{"post":{"operationId":"post-feeds-refresh","tags":["Advertising & tracking"],"summary":"Refresh Google product feed","description":"Invoke google_feed with projectId only. Return an accepted refresh job.","parameters":[],"responses":{"201":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"message":{"type":"string"},"data":{"type":"object","properties":{"jobId":{"type":"string"},"status":{"type":"string"}}}},"required":["success","message","data"],"additionalProperties":false},"example":{"success":true,"message":"Success","data":{"jobId":"job_123","status":"queued"}}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"401":{"description":"Invalid credentials","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"403":{"description":"Access denied","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"404":{"description":"Configuration or resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"422":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"503":{"description":"Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}}}}},"/advertising/campaign":{"get":{"operationId":"get-advertising-campaign","tags":["Advertising & tracking"],"summary":"Get managed campaign","description":"Return campaign and advertiser identifiers plus settings.","parameters":[],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"message":{"type":"string"},"data":{"$ref":"#/components/schemas/Campaign"}},"required":["success","message","data"],"additionalProperties":false},"example":{"success":true,"message":"Success","data":{"campaignId":"campaign_123","advertiserId":"advertiser_123","merchantId":"merchant_123","platform":"google","status":"active","budget":1,"maxCpc":0.1,"countryCode":"UG","country":"Uganda","schedule":{"monday":{"start_hour":6,"start_minute":0,"end_hour":23,"end_minute":30},"tuesday":{"start_hour":6,"start_minute":0,"end_hour":23,"end_minute":30},"wednesday":{"start_hour":6,"start_minute":0,"end_hour":23,"end_minute":30},"thursday":{"start_hour":6,"start_minute":0,"end_hour":23,"end_minute":30},"friday":{"start_hour":6,"start_minute":0,"end_hour":23,"end_minute":30},"saturday":{"start_hour":6,"start_minute":0,"end_hour":23,"end_minute":30},"sunday":{"start_hour":6,"start_minute":0,"end_hour":23,"end_minute":30}}}}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"401":{"description":"Invalid credentials","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"403":{"description":"Access denied","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"404":{"description":"Configuration or resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"422":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"503":{"description":"Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}}}},"post":{"operationId":"post-advertising-campaign","tags":["Advertising & tracking"],"summary":"Provision managed campaign","description":"Google only. Validate license, store merchant details and verified wallet funds. Merchant details are resolved from this store, not trusted from another project.","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"platform":{"type":"string","description":"Managed provider.","enum":["google"]},"status":{"type":"string","description":"Requested campaign state.","enum":["active","inactive"]},"budget":{"type":"number","description":"Average daily budget in USD.","minimum":1},"maxCpc":{"type":"number","description":"Maximum USD cost per click.","minimum":0.01},"countryCode":{"type":"string","description":"Target country code."},"country":{"type":"string","description":"Target country name."},"schedule":{"type":"object","description":"All seven day names required; start must precede end.","additionalProperties":{"type":"object","properties":{"start_hour":{"type":"integer","minimum":0,"maximum":23},"start_minute":{"type":"integer","minimum":0,"maximum":59},"end_hour":{"type":"integer","minimum":0,"maximum":23},"end_minute":{"type":"integer","minimum":0,"maximum":59}},"required":["start_hour","start_minute","end_hour","end_minute"],"additionalProperties":false}},"timeZone":{"type":"string","description":"IANA timezone. Accepted only when creating a campaign; cannot be updated. Omit if unknown."}},"required":["platform","status","budget","maxCpc","countryCode","country","schedule"],"additionalProperties":false},"example":{"platform":"google","status":"active","budget":1,"maxCpc":0.1,"countryCode":"UG","country":"Uganda","schedule":{"monday":{"start_hour":6,"start_minute":0,"end_hour":23,"end_minute":30},"tuesday":{"start_hour":6,"start_minute":0,"end_hour":23,"end_minute":30},"wednesday":{"start_hour":6,"start_minute":0,"end_hour":23,"end_minute":30},"thursday":{"start_hour":6,"start_minute":0,"end_hour":23,"end_minute":30},"friday":{"start_hour":6,"start_minute":0,"end_hour":23,"end_minute":30},"saturday":{"start_hour":6,"start_minute":0,"end_hour":23,"end_minute":30},"sunday":{"start_hour":6,"start_minute":0,"end_hour":23,"end_minute":30}}}}}},"responses":{"201":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"message":{"type":"string"},"data":{"$ref":"#/components/schemas/Campaign"}},"required":["success","message","data"],"additionalProperties":false},"example":{"success":true,"message":"Success","data":{"campaignId":"campaign_123","advertiserId":"advertiser_123","merchantId":"merchant_123","platform":"google","status":"active","budget":1,"maxCpc":0.1,"countryCode":"UG","country":"Uganda","schedule":{"monday":{"start_hour":6,"start_minute":0,"end_hour":23,"end_minute":30},"tuesday":{"start_hour":6,"start_minute":0,"end_hour":23,"end_minute":30},"wednesday":{"start_hour":6,"start_minute":0,"end_hour":23,"end_minute":30},"thursday":{"start_hour":6,"start_minute":0,"end_hour":23,"end_minute":30},"friday":{"start_hour":6,"start_minute":0,"end_hour":23,"end_minute":30},"saturday":{"start_hour":6,"start_minute":0,"end_hour":23,"end_minute":30},"sunday":{"start_hour":6,"start_minute":0,"end_hour":23,"end_minute":30}}}}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"401":{"description":"Invalid credentials","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"403":{"description":"Access denied","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"404":{"description":"Configuration or resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"422":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"503":{"description":"Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}}}},"patch":{"operationId":"patch-advertising-campaign","tags":["Advertising & tracking"],"summary":"Update managed campaign","description":"Forward stored campaignId and advertiserId. timeZone cannot be updated; omit it. Validate budget, CPC and schedule.","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"platform":{"type":"string","description":"Managed provider.","enum":["google"]},"status":{"type":"string","description":"Requested campaign state.","enum":["active","inactive"]},"budget":{"type":"number","description":"Average daily budget in USD.","minimum":1},"maxCpc":{"type":"number","description":"Maximum USD cost per click.","minimum":0.01},"countryCode":{"type":"string","description":"Target country code."},"country":{"type":"string","description":"Target country name."},"schedule":{"type":"object","description":"All seven day names required; start must precede end.","additionalProperties":{"type":"object","properties":{"start_hour":{"type":"integer","minimum":0,"maximum":23},"start_minute":{"type":"integer","minimum":0,"maximum":59},"end_hour":{"type":"integer","minimum":0,"maximum":23},"end_minute":{"type":"integer","minimum":0,"maximum":59}},"required":["start_hour","start_minute","end_hour","end_minute"],"additionalProperties":false}}},"required":[],"additionalProperties":false},"example":{"budget":2,"maxCpc":0.1}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"message":{"type":"string"},"data":{"$ref":"#/components/schemas/Campaign"}},"required":["success","message","data"],"additionalProperties":false},"example":{"success":true,"message":"Success","data":{"campaignId":"campaign_123","advertiserId":"advertiser_123","merchantId":"merchant_123","platform":"google","status":"active","budget":1,"maxCpc":0.1,"countryCode":"UG","country":"Uganda","schedule":{"monday":{"start_hour":6,"start_minute":0,"end_hour":23,"end_minute":30},"tuesday":{"start_hour":6,"start_minute":0,"end_hour":23,"end_minute":30},"wednesday":{"start_hour":6,"start_minute":0,"end_hour":23,"end_minute":30},"thursday":{"start_hour":6,"start_minute":0,"end_hour":23,"end_minute":30},"friday":{"start_hour":6,"start_minute":0,"end_hour":23,"end_minute":30},"saturday":{"start_hour":6,"start_minute":0,"end_hour":23,"end_minute":30},"sunday":{"start_hour":6,"start_minute":0,"end_hour":23,"end_minute":30}}}}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"401":{"description":"Invalid credentials","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"403":{"description":"Access denied","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"404":{"description":"Configuration or resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"422":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"503":{"description":"Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}}}}},"/advertising/analytics":{"get":{"operationId":"get-advertising-analytics","tags":["Advertising & tracking"],"summary":"Get campaign analytics","description":"Requires from/to. Server forwards the stored advertiserId and campaignId.","parameters":[{"in":"query","name":"from","required":true,"schema":{"type":"string"}},{"in":"query","name":"to","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"message":{"type":"string"},"data":{"type":"object","properties":{"clicks":{"type":"number"},"impressions":{"type":"number"},"cost":{"type":"number"},"conversions":{"type":"number"},"conversionValue":{"type":"number"},"currency":{"type":"string"}}}},"required":["success","message","data"],"additionalProperties":false},"example":{"success":true,"message":"Success","data":{"clicks":12,"impressions":400,"cost":0.8,"conversions":2,"conversionValue":9000,"currency":"USD"}}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"401":{"description":"Invalid credentials","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"403":{"description":"Access denied","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"404":{"description":"Configuration or resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"422":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"503":{"description":"Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}}}}},"/advertising/keywords":{"get":{"operationId":"get-advertising-keywords","tags":["Advertising & tracking"],"summary":"Get clicked search keywords","description":"Requires from/to. Only keywords with clicks are shown, not all search appearances.","parameters":[{"in":"query","name":"from","required":true,"schema":{"type":"string"}},{"in":"query","name":"to","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"message":{"type":"string"},"data":{"type":"array","items":{"type":"object","properties":{"keyword":{"type":"string"},"clicks":{"type":"number"},"impressions":{"type":"number"},"cost":{"type":"number"}}}}},"required":["success","message","data"],"additionalProperties":false},"example":{"success":true,"message":"Success","data":[{"keyword":"yellow cleaning sponge","clicks":1,"impressions":13,"cost":0.01}]}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"401":{"description":"Invalid credentials","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"403":{"description":"Access denied","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"404":{"description":"Configuration or resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"422":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"503":{"description":"Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}}}}},"/advertising/product-issues":{"get":{"operationId":"get-advertising-product-issues","tags":["Advertising & tracking"],"summary":"Get Merchant Center issues","description":"Use the stored merchantId. Return severity, description, detail, documentation and applicable countries. Some issues are informational.","parameters":[],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"message":{"type":"string"},"data":{"type":"array","items":{"type":"object","properties":{"productId":{"type":"string"},"title":{"type":"string"},"issues":{"type":"array","items":{}}}}}},"required":["success","message","data"],"additionalProperties":false},"example":{"success":true,"message":"Success","data":[{"productId":"prod_123","title":"Yellow sponge","issues":[]}]}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"401":{"description":"Invalid credentials","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"403":{"description":"Access denied","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"404":{"description":"Configuration or resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"422":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"503":{"description":"Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}}}}},"/payments/deposit":{"post":{"operationId":"post-payments-deposit","tags":["Payments"],"summary":"Recharge wallet","description":"Send currency for local payment and amount in USD. Only deposits accept an amount; the backend converts it into the requested local currency.","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"currency":{"type":"string","description":"Local currency for the payment link, for example UGX.","pattern":"^[A-Z]{3}$"},"amount":{"type":"number","description":"Wallet deposit amount in USD, not local currency.","exclusiveMinimum":0}},"required":["currency","amount"],"additionalProperties":false},"example":{"currency":"UGX","amount":2}}}},"responses":{"201":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"message":{"type":"string"},"data":{"type":"object","properties":{"type":{"type":"string"},"amountUsd":{"type":"number"},"currency":{"type":"string"},"amount":{"type":"number"},"paymentLink":{"type":"string"},"payment_id":{"type":"string"}}}},"required":["success","message","data"],"additionalProperties":false},"example":{"success":true,"message":"Success","data":{"type":"deposit","amountUsd":2,"currency":"UGX","amount":7200,"paymentLink":"<payment_link>","payment_id":"<payment_id>"}}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"401":{"description":"Invalid credentials","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"403":{"description":"Access denied","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"404":{"description":"Configuration or resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"422":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"503":{"description":"Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}}}}},"/payments/license":{"post":{"operationId":"post-payments-license","tags":["Payments"],"summary":"Pay storefront license","description":"Send currency only. The one-time license price is fixed at USD 300; do not send amount or amountUsd.","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"currency":{"type":"string","description":"Local currency for the payment link, for example UGX.","pattern":"^[A-Z]{3}$"}},"required":["currency"],"additionalProperties":false},"example":{"currency":"UGX"}}}},"responses":{"201":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"message":{"type":"string"},"data":{"type":"object","properties":{"type":{"type":"string"},"amountUsd":{"type":"number"},"currency":{"type":"string"},"amount":{"type":"number"},"paymentLink":{"type":"string"},"payment_id":{"type":"string"}}}},"required":["success","message","data"],"additionalProperties":false},"example":{"success":true,"message":"Success","data":{"type":"license","amountUsd":300,"currency":"UGX","amount":1080000,"paymentLink":"<payment_link>","payment_id":"<payment_id>"}}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"401":{"description":"Invalid credentials","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"403":{"description":"Access denied","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"404":{"description":"Configuration or resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"422":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"503":{"description":"Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}}}}},"/payments/subscriptions/{platform}":{"post":{"operationId":"post-payments-subscriptions-platform","tags":["Payments"],"summary":"Start integration subscription","description":"Send currency only and choose the integration platform in the URL: google, meta, tiktok, x, reddit, pinterest, snapchat, bing or api (APIs & MCP). The price is fixed at USD 60 per month; do not send amount or amountUsd. The response type is the platform, and renewsOn is returned only for subscriptions.","parameters":[{"in":"path","name":"platform","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"currency":{"type":"string","description":"Local currency for the payment link, for example UGX.","pattern":"^[A-Z]{3}$"}},"required":["currency"],"additionalProperties":false},"example":{"currency":"UGX"}}}},"responses":{"201":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"message":{"type":"string"},"data":{"type":"object","properties":{"type":{"type":"string"},"amountUsd":{"type":"number"},"currency":{"type":"string"},"renewsOn":{"type":"string"},"amount":{"type":"number"},"paymentLink":{"type":"string"},"payment_id":{"type":"string"}}}},"required":["success","message","data"],"additionalProperties":false},"example":{"success":true,"message":"Success","data":{"type":"google","amountUsd":60,"currency":"UGX","renewsOn":"2026-12-10T00:00:00Z","amount":216000,"paymentLink":"<payment_link>","payment_id":"<payment_id>"}}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"401":{"description":"Invalid credentials","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"403":{"description":"Access denied","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"404":{"description":"Configuration or resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"422":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"503":{"description":"Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}}}}},"/wallet":{"get":{"operationId":"get-wallet","tags":["Wallet, licenses & billing"],"summary":"Get verified wallet balance","description":"Wallet funds and ad spend are USD.","parameters":[],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"message":{"type":"string"},"data":{"type":"object","properties":{"balance":{"type":"number"},"currency":{"type":"string"}}}},"required":["success","message","data"],"additionalProperties":false},"example":{"success":true,"message":"Success","data":{"balance":40,"currency":"USD"}}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"401":{"description":"Invalid credentials","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"403":{"description":"Access denied","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"404":{"description":"Configuration or resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"422":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"503":{"description":"Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}}}}},"/transactions":{"get":{"operationId":"get-transactions","tags":["Wallet, licenses & billing"],"summary":"List payment history","description":"Cursor-paginated payment history.","parameters":[{"in":"query","name":"from","required":false,"schema":{"type":"string"}},{"in":"query","name":"to","required":false,"schema":{"type":"string"}},{"in":"query","name":"limit","schema":{"type":"integer","minimum":1,"maximum":100,"default":20}},{"in":"query","name":"cursor","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"message":{"type":"string"},"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"amount":{"type":"number"},"currency":{"type":"string"},"reason":{"type":"string"},"createdAt":{"type":"string"}}}},"meta":{"type":"object","properties":{"nextCursor":{"type":["string","null"]},"hasMore":{"type":"boolean"}},"required":["nextCursor","hasMore"],"additionalProperties":false}},"required":["success","message","data"],"additionalProperties":false},"example":{"success":true,"message":"Success","data":[{"id":"transaction_123","amount":30,"currency":"USD","reason":"wallet","createdAt":"2026-11-09T12:00:00Z"}],"meta":{"nextCursor":null,"hasMore":false}}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"401":{"description":"Invalid credentials","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"403":{"description":"Access denied","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"404":{"description":"Configuration or resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"422":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"503":{"description":"Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}}}}},"/licenses":{"get":{"operationId":"get-licenses","tags":["Wallet, licenses & billing"],"summary":"Get licenses & subscriptions","description":"isActive may be true for a trial. isTrial:true does not mean paid; users can still subscribe.","parameters":[],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"message":{"type":"string"},"data":{"type":"object","properties":{"storefront":{"type":"object","properties":{"isActive":{"type":"boolean"},"isTrial":{"type":"boolean"},"expiresOn":{"type":"string"}}},"integrations":{"type":"object","properties":{"google":{"type":"object","properties":{"isActive":{"type":"boolean"},"isTrial":{"type":"boolean"},"renewsOn":{"type":"string"}}}}}}}},"required":["success","message","data"],"additionalProperties":false},"example":{"success":true,"message":"Success","data":{"storefront":{"isActive":true,"isTrial":true,"expiresOn":"2026-12-09T00:00:00Z"},"integrations":{"google":{"isActive":true,"isTrial":false,"renewsOn":"2026-12-09T00:00:00Z"}}}}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"401":{"description":"Invalid credentials","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"403":{"description":"Access denied","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"404":{"description":"Configuration or resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"422":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"503":{"description":"Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}}}}},"/exchange-rates":{"get":{"operationId":"get-exchange-rates","tags":["Wallet, licenses & billing"],"summary":"Get payment quote","description":"Use currency and amountUsd. Return local units per USD; USD-to-local multiplies by rate. Payment uses backend-verified quotes.","parameters":[{"in":"query","name":"currency","required":true,"schema":{"type":"string"}},{"in":"query","name":"amountUsd","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"message":{"type":"string"},"data":{"type":"object","properties":{"currency":{"type":"string"},"amountUsd":{"type":"number"},"rate":{"type":"number"},"amount":{"type":"number"}}}},"required":["success","message","data"],"additionalProperties":false},"example":{"success":true,"message":"Success","data":{"currency":"UGX","amountUsd":30,"rate":3600,"amount":108000}}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"401":{"description":"Invalid credentials","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"403":{"description":"Access denied","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"404":{"description":"Configuration or resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"422":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"503":{"description":"Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}}}}},"/transfers":{"post":{"operationId":"post-transfers","tags":["Management & notifications"],"summary":"Invite store manager or owner","description":"Creates an invitation. Full transfer removes the original owner after acceptance; partial adds shared management. Acceptance requires the recipient to sign in to Tecapy.","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string","description":"Recipient email.","format":"email"},"transfer":{"type":"string","description":"Full removes the original owner’s access after acceptance; partial adds shared management.","enum":["full","partial"]}},"required":["email","transfer"],"additionalProperties":false},"example":{"email":"manager@example.com","transfer":"partial"}}}},"responses":{"201":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"message":{"type":"string"},"data":{"type":"object","properties":{"id":{"type":"string"},"status":{"type":"string"},"emailSent":{"type":"boolean"},"email":{"type":"string"},"transfer":{"type":"string"}}}},"required":["success","message","data"],"additionalProperties":false},"example":{"success":true,"message":"Success","data":{"id":"transfer_123","status":"pending","emailSent":true,"email":"manager@example.com","transfer":"partial"}}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"401":{"description":"Invalid credentials","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"403":{"description":"Access denied","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"404":{"description":"Configuration or resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"422":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"503":{"description":"Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}}}}},"/access-reports":{"post":{"operationId":"post-access-reports","tags":["Management & notifications"],"summary":"Email an access report","description":"Send the report to a confirmed email via user_report with storeName resolved server-side.","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string"}}},"example":{"email":"owner@example.com"}}}},"responses":{"201":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"message":{"type":"string"},"data":{"type":"object","properties":{"emailSent":{"type":"boolean"}}}},"required":["success","message","data"],"additionalProperties":false},"example":{"success":true,"message":"Success","data":{"emailSent":true}}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"401":{"description":"Invalid credentials","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"403":{"description":"Access denied","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"404":{"description":"Configuration or resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"422":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"503":{"description":"Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}}}}},"/notifications/devices":{"get":{"operationId":"get-notifications-devices","tags":["Management & notifications"],"summary":"List notification devices","description":"Return deviceId, token, updatedAt and userId for registered devices. Treat push tokens as confidential.","parameters":[{"in":"query","name":"limit","schema":{"type":"integer","minimum":1,"maximum":100,"default":20}},{"in":"query","name":"cursor","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"message":{"type":"string"},"data":{"type":"array","items":{"$ref":"#/components/schemas/Device"}},"meta":{"type":"object","properties":{"nextCursor":{"type":["string","null"]},"hasMore":{"type":"boolean"}},"required":["nextCursor","hasMore"],"additionalProperties":false}},"required":["success","message","data"],"additionalProperties":false},"example":{"success":true,"message":"Success","data":[{"deviceId":"device_123","token":"<device_push_token>","updatedAt":"2026-11-05T00:00:00Z","userId":"<user_id>"}],"meta":{"nextCursor":null,"hasMore":false}}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"401":{"description":"Invalid credentials","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"403":{"description":"Access denied","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"404":{"description":"Configuration or resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"422":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"503":{"description":"Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}}}}},"/notifications/devices/{deviceId}":{"put":{"operationId":"put-notifications-devices-deviceId","tags":["Management & notifications"],"summary":"Register notification device","description":"Send deviceId and token only. deviceId must match the URL. Do not send updatedAt or userId; they are assigned by the server. Browser must first grant notification permission; registration alone cannot grant it.","parameters":[{"in":"path","name":"deviceId","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"deviceId":{"type":"string","description":"Device identifier. Must match deviceId in the request URL."},"token":{"type":"string","description":"Device push token. Treat as confidential."}},"required":["deviceId","token"],"additionalProperties":false},"example":{"deviceId":"device_123","token":"<device_push_token>"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"message":{"type":"string"},"data":{"$ref":"#/components/schemas/Device"}},"required":["success","message","data"],"additionalProperties":false},"example":{"success":true,"message":"Success","data":{"deviceId":"device_123","token":"<device_push_token>","updatedAt":"2026-11-05T00:00:00Z","userId":"<user_id>"}}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"401":{"description":"Invalid credentials","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"403":{"description":"Access denied","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"404":{"description":"Configuration or resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"422":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"503":{"description":"Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}}}},"delete":{"operationId":"delete-notifications-devices-deviceId","tags":["Management & notifications"],"summary":"Disable notifications on a device","description":"Delete the saved device token.","parameters":[{"in":"path","name":"deviceId","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"message":{"type":"string"},"data":{"type":"null"}},"required":["success","message","data"],"additionalProperties":false},"example":{"success":true,"message":"Success","data":null}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"401":{"description":"Invalid credentials","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"403":{"description":"Access denied","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"404":{"description":"Configuration or resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"422":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}},"503":{"description":"Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"message":"<error_message>","error":{"code":"<ERROR_CODE>","details":"<error_details>"}}}}}}}}},"components":{"securitySchemes":{"ApiKey":{"type":"http","scheme":"bearer","description":"Store-scoped API key."},"ProjectId":{"type":"apiKey","in":"header","name":"X-Project-ID"}},"schemas":{"Product":{"type":"object","properties":{"id":{"type":"string","description":"Opaque resource ID.","readOnly":true},"projectId":{"type":"string","description":"Store project ID, resolved from X-Project-ID.","readOnly":true},"slug":{"type":"string","description":"Server-generated product slug.","readOnly":true},"name":{"type":"string","description":"Product title, natural capitalization, maximum 100 characters.","maxLength":100},"brand":{"type":"string","description":"Brand or Unbranded.","maxLength":80},"category":{"type":"string","description":"Category display name."},"categoryId":{"type":"string","description":"Opaque resource ID."},"description":{"type":"string","description":"Plain-text description.","maxLength":5000},"price":{"type":"number","description":"Regular price in the product currency.","minimum":0},"discountPrice":{"type":["number","null"],"description":"Optional sale price, greater than zero and lower than price; null removes the discount."},"currency":{"type":"string","description":"ISO 4217 currency code.","pattern":"^[A-Z]{3}$"},"condition":{"type":"string","description":"Product condition.","enum":["new","used","refurbished"]},"inStock":{"type":"boolean","description":"Whether the product is available."},"image":{"type":"string","description":"Cover image: one public HTTPS URL.","format":"uri","pattern":"^https://"},"images":{"type":"array","minItems":0,"maxItems":5,"description":"Additional image URLs, as strings, not objects. The cover image is separate in image; maximum six images including the cover.","items":{"type":"string","format":"uri","pattern":"^https://"}},"facebookVideo":{"type":["string","null"],"description":"Facebook video URL, or null."},"tiktokVideo":{"type":["string","null"],"description":"TikTok video URL, or null."},"youtubeVideo":{"type":["string","null"],"description":"YouTube video URL, or null."},"createdAt":{"type":"string","description":"Server-generated UTC timestamp.","format":"date-time","readOnly":true},"updatedAt":{"type":"string","description":"Server-generated UTC timestamp.","format":"date-time","readOnly":true}},"required":["name","brand","description","price","currency","category","categoryId","condition","inStock","image"],"additionalProperties":false},"Category":{"type":"object","properties":{"id":{"type":"string","description":"Opaque resource ID.","readOnly":true},"name":{"type":"string","description":"Category name.","maxLength":80},"slug":{"type":"string","description":"Server-generated category slug.","readOnly":true},"createdAt":{"type":"string","description":"Server-generated UTC timestamp.","format":"date-time","readOnly":true},"UpdatedAt":{"type":"string","description":"Server-generated UTC timestamp.","format":"date-time","readOnly":true}},"required":["name"],"additionalProperties":false},"Store":{"type":"object","properties":{"id":{"type":"string","description":"Opaque resource ID.","readOnly":true},"name":{"type":"string","description":"Business name."},"slug":{"type":"string","description":"Storefront slug. Cannot be changed through the API.","readOnly":true},"description":{"type":"string","description":"What the business does."},"country":{"type":"string","description":"Country name."},"countryCode":{"type":"string","description":"ISO 3166-1 alpha-2 country code."},"currency":{"type":"string","description":"Store base currency."},"phoneNumber":{"type":"string","description":"International phone number including country code."},"contactEmail":{"type":"string","description":"Business contact email.","format":"email"},"address":{"type":"string","description":"Street address."},"city":{"type":"string","description":"City."},"state":{"type":"string","description":"State or region."},"zipCode":{"type":"string","description":"Postal code."},"googleMaps":{"type":"string","description":"Google Maps embed URL for the store location.","format":"uri"},"workingHours":{"type":"array","minItems":3,"maxItems":3,"description":"Three groups, each once: Mon-Fri, Sat, Sun. Each entry has day, isOpen, open and close. Times are local HH:mm. isOpen:false means closed. PATCH replaces the entire array.","items":{"type":"object","properties":{"day":{"type":"string","description":"Day group.","enum":["Mon-Fri","Sat","Sun"]},"isOpen":{"type":"boolean","description":"Whether this day group is open."},"open":{"type":"string","description":"Local opening time.","pattern":"^([01][0-9]|2[0-3]):[0-5][0-9]$"},"close":{"type":"string","description":"Local closing time.","pattern":"^([01][0-9]|2[0-3]):[0-5][0-9]$"}},"required":["day","isOpen","open","close"],"additionalProperties":false}},"status":{"type":"string","description":"Platform-controlled publication status.","readOnly":true},"createdAt":{"type":"string","description":"Server-generated UTC timestamp.","format":"date-time","readOnly":true},"updatedAt":{"type":"string","description":"Server-generated UTC timestamp.","format":"date-time","readOnly":true}},"required":[],"additionalProperties":false},"Order":{"type":"object","properties":{"id":{"type":"string","description":"Opaque resource ID.","readOnly":true},"createdAt":{"type":"string","description":"Server-generated UTC timestamp.","format":"date-time","readOnly":true},"type":{"type":"string","description":"Record type.","enum":["order","whatsapp","call"]},"currency":{"type":"string","description":"Record currency."},"productName":{"type":"string","description":"Product name, or Store enquiry for a general call/WhatsApp record."},"total":{"type":"number","description":"Recorded total; general store enquiries may have zero value."},"customerName":{"type":"string","description":"Checkout customer name; absent on basic enquiry records."},"customerEmail":{"type":"string","description":"Checkout customer email.","format":"email"},"customerPhone":{"type":"string","description":"Customer phone, when supplied."},"apartment":{"type":"string","description":"Apartment/unit."},"city":{"type":"string","description":"Delivery city."},"country":{"type":"string","description":"Delivery country code."},"streetAddress":{"type":"string","description":"Delivery street address."},"postalCode":{"type":"string","description":"Delivery postal code."},"deliveryFee":{"type":"number","description":"Delivery fee."},"subtotal":{"type":"number","description":"Items subtotal."},"fulfillment":{"type":"string","description":"Checkout fulfillment method.","enum":["delivery","pickup"]},"orderStatus":{"type":"string","description":"Checkout fulfillment status.","enum":["Processing","Shipped","Delivered","Cancelled"]},"paymentMethod":{"type":"string","description":"Payment provider/method identifier, for example dpo."},"paymentStatus":{"type":"string","description":"Server-verified payment state, for example pending."},"items":{"type":"array","description":"Checkout product snapshots; absent on basic call/WhatsApp records.","items":{"type":"object","properties":{"id":{"type":"string","description":"Product ID."},"name":{"type":"string","description":"Product name at order time."},"slug":{"type":"string","description":"Product slug at order time."},"currency":{"type":"string","description":"Item currency."},"price":{"type":"number","description":"Unit price at order time."},"quantity":{"type":"integer","minimum":1}},"required":["id","name","slug","currency","price","quantity"],"additionalProperties":false}}},"required":["id","createdAt","type","currency","productName","total"],"additionalProperties":false},"Design":{"type":["object","null"],"properties":{"checkout":{"type":["object","null"],"properties":{"countryDeliveryFees":{"type":["object","null"],"description":"Country codes mapped to delivery fees in the checkout currency.","additionalProperties":{"type":["number","null"],"minimum":0}},"currency":{"type":["string","null"],"description":"Checkout currency."},"deliveryEnabled":{"type":["boolean","null"],"description":"Offer delivery."},"deliveryFee":{"type":["number","null"],"description":"Default delivery fee.","minimum":0},"enabled":{"type":["boolean","null"],"description":"Enable checkout."},"methods":{"type":["array","null"],"items":{"type":["string","null"],"description":"Payment method identifier, for example cash-on-delivery."}},"phoneRequired":{"type":["boolean","null"],"description":"Require customer phone."},"pickupEnabled":{"type":["boolean","null"],"description":"Offer store pickup."},"whatsappEnabled":{"type":["boolean","null"],"description":"Enable WhatsApp checkout."}},"required":[],"additionalProperties":false},"designComplete":{"type":["boolean","null"],"description":"Whether a design has been saved."},"logo":{"anyOf":[{"type":["object","null"],"properties":{"id":{"type":["string","null"],"description":"Asset ID."},"path":{"type":["string","null"],"description":"Server-managed media storage path. Returned by GET; omit from PATCH.","readOnly":true},"type":{"type":["string","null"],"description":"Media MIME type, such as image/webp."},"url":{"type":["string","null"],"description":"Public HTTPS asset URL.","format":"uri","pattern":"^https://"}},"required":[],"additionalProperties":false},{"type":"null"}],"description":"Media asset object, or null to clear it."},"toolbarLogo":{"anyOf":[{"type":["object","null"],"properties":{"id":{"type":["string","null"],"description":"Asset ID."},"path":{"type":["string","null"],"description":"Server-managed media storage path. Returned by GET; omit from PATCH.","readOnly":true},"type":{"type":["string","null"],"description":"Media MIME type, such as image/webp."},"url":{"type":["string","null"],"description":"Public HTTPS asset URL.","format":"uri","pattern":"^https://"}},"required":[],"additionalProperties":false},{"type":"null"}],"description":"Media asset object, or null to clear it."},"footerLogo":{"anyOf":[{"type":["object","null"],"properties":{"id":{"type":["string","null"],"description":"Asset ID."},"path":{"type":["string","null"],"description":"Server-managed media storage path. Returned by GET; omit from PATCH.","readOnly":true},"type":{"type":["string","null"],"description":"Media MIME type, such as image/webp."},"url":{"type":["string","null"],"description":"Public HTTPS asset URL.","format":"uri","pattern":"^https://"}},"required":[],"additionalProperties":false},{"type":"null"}],"description":"Media asset object, or null to clear it."},"logoVisibility":{"type":["object","null"],"properties":{"toolbar":{"type":["boolean","null"],"description":"Show toolbar logo."},"footer":{"type":["boolean","null"],"description":"Show footer logo."}},"required":[],"additionalProperties":false},"hero":{"type":["object","null"],"properties":{"desktop":{"type":["array","null"],"items":{"type":["object","null"],"properties":{"id":{"type":["string","null"],"description":"Asset ID."},"path":{"type":["string","null"],"description":"Server-managed media storage path. Returned by GET; omit from PATCH.","readOnly":true},"type":{"type":["string","null"],"description":"Media MIME type, such as image/webp."},"url":{"type":["string","null"],"description":"Public HTTPS asset URL.","format":"uri","pattern":"^https://"}},"required":[],"additionalProperties":false}},"mobile":{"type":["array","null"],"items":{"type":["object","null"],"properties":{"id":{"type":["string","null"],"description":"Asset ID."},"path":{"type":["string","null"],"description":"Server-managed media storage path. Returned by GET; omit from PATCH.","readOnly":true},"type":{"type":["string","null"],"description":"Media MIME type, such as image/webp."},"url":{"type":["string","null"],"description":"Public HTTPS asset URL.","format":"uri","pattern":"^https://"}},"required":[],"additionalProperties":false}},"fit":{"type":["string","null"],"description":"Image fit.","enum":["cover","contain",null]},"height":{"type":["integer","null"],"minimum":120,"maximum":1200},"mobileHeight":{"type":["integer","null"],"minimum":120,"maximum":1000},"mode":{"type":["string","null"],"description":"Hero display mode.","enum":["single","none","slideshow",null]},"videos":{"type":["object","null"],"properties":{"desktop":{"anyOf":[{"type":["object","null"],"properties":{"id":{"type":["string","null"],"description":"Asset ID."},"path":{"type":["string","null"],"description":"Server-managed media storage path. Returned by GET; omit from PATCH.","readOnly":true},"type":{"type":["string","null"],"description":"Media MIME type, such as image/webp."},"url":{"type":["string","null"],"description":"Public HTTPS asset URL.","format":"uri","pattern":"^https://"}},"required":[],"additionalProperties":false},{"type":"null"}],"description":"Media asset object, or null to clear it."},"mobile":{"anyOf":[{"type":["object","null"],"properties":{"id":{"type":["string","null"],"description":"Asset ID."},"path":{"type":["string","null"],"description":"Server-managed media storage path. Returned by GET; omit from PATCH.","readOnly":true},"type":{"type":["string","null"],"description":"Media MIME type, such as image/webp."},"url":{"type":["string","null"],"description":"Public HTTPS asset URL.","format":"uri","pattern":"^https://"}},"required":[],"additionalProperties":false},{"type":"null"}],"description":"Media asset object, or null to clear it."}},"required":[],"additionalProperties":false}},"required":[],"additionalProperties":false},"paymentIcons":{"type":["array","null"],"items":{"type":["object","null"],"properties":{"id":{"type":["string","null"],"description":"Asset ID."},"path":{"type":["string","null"],"description":"Server-managed media storage path. Returned by GET; omit from PATCH.","readOnly":true},"type":{"type":["string","null"],"description":"Media MIME type, such as image/webp."},"url":{"type":["string","null"],"description":"Public HTTPS asset URL.","format":"uri","pattern":"^https://"}},"required":[],"additionalProperties":false}},"policies":{"type":["object","null"],"description":"Store pages keyed by about, faq, payments, privacy, returns, shipping or terms. Save body and published under the page key.","properties":{"about":{"type":["object","null"],"properties":{"body":{"type":["string","null"],"description":"Page text."},"published":{"type":["boolean","null"],"description":"Whether the page is visible."},"updatedAt":{"type":["string","null"],"description":"Server-generated UTC timestamp.","format":"date-time","readOnly":true}},"required":[],"additionalProperties":false},"faq":{"type":["object","null"],"properties":{"body":{"type":["string","null"],"description":"Page text."},"published":{"type":["boolean","null"],"description":"Whether the page is visible."},"updatedAt":{"type":["string","null"],"description":"Server-generated UTC timestamp.","format":"date-time","readOnly":true}},"required":[],"additionalProperties":false},"payments":{"type":["object","null"],"properties":{"body":{"type":["string","null"],"description":"Page text."},"published":{"type":["boolean","null"],"description":"Whether the page is visible."},"updatedAt":{"type":["string","null"],"description":"Server-generated UTC timestamp.","format":"date-time","readOnly":true}},"required":[],"additionalProperties":false},"privacy":{"type":["object","null"],"properties":{"body":{"type":["string","null"],"description":"Page text."},"published":{"type":["boolean","null"],"description":"Whether the page is visible."},"updatedAt":{"type":["string","null"],"description":"Server-generated UTC timestamp.","format":"date-time","readOnly":true}},"required":[],"additionalProperties":false},"returns":{"type":["object","null"],"properties":{"body":{"type":["string","null"],"description":"Page text."},"published":{"type":["boolean","null"],"description":"Whether the page is visible."},"updatedAt":{"type":["string","null"],"description":"Server-generated UTC timestamp.","format":"date-time","readOnly":true}},"required":[],"additionalProperties":false},"shipping":{"type":["object","null"],"properties":{"body":{"type":["string","null"],"description":"Page text."},"published":{"type":["boolean","null"],"description":"Whether the page is visible."},"updatedAt":{"type":["string","null"],"description":"Server-generated UTC timestamp.","format":"date-time","readOnly":true}},"required":[],"additionalProperties":false},"terms":{"type":["object","null"],"properties":{"body":{"type":["string","null"],"description":"Page text."},"published":{"type":["boolean","null"],"description":"Whether the page is visible."},"updatedAt":{"type":["string","null"],"description":"Server-generated UTC timestamp.","format":"date-time","readOnly":true}},"required":[],"additionalProperties":false}},"additionalProperties":false,"required":[]},"productCard":{"type":["object","null"],"properties":{"border":{"type":["boolean","null"],"description":"Show card border."},"buttons":{"type":["boolean","null"],"description":"Show product action buttons."},"imageFit":{"type":["string","null"],"description":"Card image fit.","enum":["cover","contain",null]},"imageHeight":{"type":["integer","null"],"minimum":100,"maximum":800},"mobileImageHeight":{"type":["integer","null"],"minimum":100,"maximum":600}},"required":[],"additionalProperties":false},"productMedia":{"type":["string","null"],"description":"Product details layout.","enum":["grid","slideshow",null]},"schemaVersion":{"type":["integer","null"],"description":"Server-controlled design schema version.","readOnly":true},"socialLinks":{"type":["object","null"],"description":"Social platform names mapped to public profile URLs.","additionalProperties":{"type":["string","null"],"format":"uri"}},"theme":{"type":["object","null"],"properties":{"background":{"type":["string","null"],"description":"Background hex color."},"primary":{"type":["string","null"],"description":"Primary hex color."},"secondary":{"type":["string","null"],"description":"Secondary hex color."}},"required":[],"additionalProperties":false},"crawlersEnabled":{"type":["boolean","null"],"description":"Allow search engines to crawl the dedicated store domain."},"tagManager":{"type":["string","null"],"description":"Google Tag Manager container ID.","readOnly":true},"googleSiteVerification":{"type":["string","null"],"description":"Google verification content token.","readOnly":true},"currencySettings":{"type":["object","null"],"properties":{"baseCurrency":{"type":["string","null"],"description":"Store base currency."},"rates":{"type":["object","null"],"additionalProperties":{"type":["number","null"],"exclusiveMinimum":0}}},"required":[],"additionalProperties":false},"updatedAt":{"type":["string","null"],"description":"Server-generated UTC timestamp.","format":"date-time","readOnly":true},"feedAccess":{"type":["object","null"],"properties":{"hash":{"type":["string","null"],"description":"Server-managed feed credential hash."},"version":{"type":["integer","null"]}},"required":[],"additionalProperties":false,"readOnly":true,"description":"Server-managed feed access metadata. Returned by GET; never send in PATCH."}},"required":[],"additionalProperties":false},"Gateway":{"type":"object","properties":{"provider":{"type":"string","description":"Gateway identifier.","enum":["flutterwave","paystack","pesapal","stripe","dpo","paypal"]},"isActive":{"type":"boolean","description":"Connection status."},"credentials":{"type":"object","writeOnly":true,"description":"Provider-specific secret fields. PayPal uses client_id and client_secret. Never returned by GET.","additionalProperties":{"type":"string"}}},"required":["credentials"],"additionalProperties":false},"Domain":{"type":"object","properties":{"id":{"type":"string","description":"Opaque resource ID.","readOnly":true},"hostname":{"type":"string","description":"Hostname only, without protocol or path."},"status":{"type":"string","description":"Server-managed registration state, such as ACT or PEN.","readOnly":true},"renewStatus":{"type":"string","description":"Server-managed renewal state.","readOnly":true}},"required":[],"additionalProperties":false},"DomainContact":{"type":"object","properties":{"firstName":{"type":"string","description":"Registrant first name."},"lastName":{"type":"string","description":"Registrant surname."},"eMail":{"type":"string","description":"Registrant email.","format":"email"},"phoneCountryCode":{"type":"string","description":"Country calling code."},"phoneAreaCode":{"type":"string","description":"First three digits of national phone number."},"phone":{"type":"string","description":"Remaining national phone number."},"country":{"type":"string","description":"Country code."},"address":{"type":"string","description":"Street name."},"addressNumber":{"type":"integer","minimum":0,"description":"Building or address number."},"city":{"type":"string","description":"City."},"state":{"type":"string","description":"Region."},"postalCode":{"type":"string","description":"Postal code."},"slug":{"type":"string","description":"Store slug."}},"required":["firstName","lastName","eMail","phoneCountryCode","phoneAreaCode","phone","country","address","addressNumber","city","postalCode","slug"],"additionalProperties":false},"DnsRecord":{"type":"object","properties":{"id":{"type":"string","description":"Opaque resource ID.","readOnly":true},"name":{"type":"string","description":"Record host/name."},"type":{"type":"string","description":"Record type.","enum":["A","AAAA","CNAME","MX","TXT","NS","SOA","CAA","SRV"]},"value":{"type":"string","description":"Record target/value."},"ttl":{"type":"integer","minimum":60},"priority":{"type":"integer","minimum":0}},"required":["name","type","value","ttl"],"additionalProperties":false},"Campaign":{"type":"object","properties":{"campaignId":{"type":"string","description":"Opaque resource ID.","readOnly":true},"advertiserId":{"type":"string","description":"Opaque resource ID.","readOnly":true},"merchantId":{"type":"string","description":"Opaque resource ID.","readOnly":true},"platform":{"type":"string","description":"Managed provider.","enum":["google"]},"status":{"type":"string","description":"Requested campaign state.","enum":["active","inactive"]},"budget":{"type":"number","description":"Average daily budget in USD.","minimum":1},"maxCpc":{"type":"number","description":"Maximum USD cost per click.","minimum":0.01},"countryCode":{"type":"string","description":"Target country code."},"country":{"type":"string","description":"Target country name."},"schedule":{"type":"object","description":"All seven day names required; start must precede end.","additionalProperties":{"type":"object","properties":{"start_hour":{"type":"integer","minimum":0,"maximum":23},"start_minute":{"type":"integer","minimum":0,"maximum":59},"end_hour":{"type":"integer","minimum":0,"maximum":23},"end_minute":{"type":"integer","minimum":0,"maximum":59}},"required":["start_hour","start_minute","end_hour","end_minute"],"additionalProperties":false}},"timeZone":{"type":"string","description":"IANA timezone. Accepted only when creating a campaign; cannot be updated. Omit if unknown."}},"required":["platform","status","budget","maxCpc","countryCode","country","schedule"],"additionalProperties":false},"Transfer":{"type":"object","properties":{"id":{"type":"string","description":"Opaque resource ID.","readOnly":true},"status":{"type":"string","description":"Invitation status.","readOnly":true},"email":{"type":"string","description":"Recipient email.","format":"email"},"transfer":{"type":"string","description":"Full removes the original owner’s access after acceptance; partial adds shared management.","enum":["full","partial"]}},"required":["email","transfer"],"additionalProperties":false},"Device":{"type":"object","properties":{"deviceId":{"type":"string","description":"Device identifier. Must match deviceId in the request URL."},"token":{"type":"string","description":"Device push token. Treat as confidential."},"updatedAt":{"type":"string","description":"Server-generated UTC timestamp.","format":"date-time","readOnly":true},"userId":{"type":"string","description":"Server-managed user ID.","readOnly":true}},"required":["deviceId","token"],"additionalProperties":false},"AdIntegration":{"type":"object","properties":{"platform":{"type":"string","description":"Integration platform.","enum":["google","meta","tiktok","x","reddit","pinterest","snapchat","bing","google_tag"]},"mode":{"type":"string","description":"Connection management mode.","enum":["managed","independent"]},"isActive":{"type":"boolean","description":"Whether this integration is active."}},"required":[],"additionalProperties":false},"CustomDomain":{"type":"object","properties":{"firstName":{"type":"string","description":"Registrant first name."},"lastName":{"type":"string","description":"Registrant surname."},"eMail":{"type":"string","description":"Registrant email.","format":"email"},"phoneCountryCode":{"type":"string","description":"Country calling code."},"phoneAreaCode":{"type":"string","description":"First three digits of national phone number."},"phone":{"type":"string","description":"Remaining national phone number."},"country":{"type":"string","description":"Country code."},"address":{"type":"string","description":"Street name."},"addressNumber":{"type":"integer","minimum":0,"description":"Building or address number."},"city":{"type":"string","description":"City."},"state":{"type":"string","description":"Region."},"postalCode":{"type":"string","description":"Postal code."},"domainName":{"type":"string","description":"Purchased domain hostname."},"status":{"type":"string","description":"ACT means active. PEN means pending: the user has not completed payment.","enum":["ACT","PEN"],"readOnly":true},"expirationDate":{"type":"number","description":"Expiration time as Unix seconds.","readOnly":true},"domainId":{"type":"integer","description":"Registrar domain ID.","readOnly":true},"contactHandle":{"type":"string","description":"Registrar contact handle.","readOnly":true},"authCode":{"type":"string","description":"Domain authorization code. Treat as confidential.","readOnly":true}},"required":["domainName","firstName","lastName","eMail","phoneCountryCode","phoneAreaCode","phone","country","address","addressNumber","city","state","postalCode"],"additionalProperties":false},"DesignAsset":{"type":["object","null"],"properties":{"id":{"type":["string","null"],"description":"Asset ID."},"path":{"type":["string","null"],"description":"Server-managed media storage path. Returned by GET; omit from PATCH.","readOnly":true},"type":{"type":["string","null"],"description":"Media MIME type, such as image/webp."},"url":{"type":["string","null"],"description":"Public HTTPS asset URL.","format":"uri","pattern":"^https://"}},"required":[],"additionalProperties":false},"Checkout":{"type":["object","null"],"properties":{"countryDeliveryFees":{"type":["object","null"],"description":"Country codes mapped to delivery fees in the checkout currency.","additionalProperties":{"type":["number","null"],"minimum":0}},"currency":{"type":["string","null"],"description":"Checkout currency."},"deliveryEnabled":{"type":["boolean","null"],"description":"Offer delivery."},"deliveryFee":{"type":["number","null"],"description":"Default delivery fee.","minimum":0},"enabled":{"type":["boolean","null"],"description":"Enable checkout."},"methods":{"type":["array","null"],"items":{"type":["string","null"],"description":"Payment method identifier, for example cash-on-delivery."}},"phoneRequired":{"type":["boolean","null"],"description":"Require customer phone."},"pickupEnabled":{"type":["boolean","null"],"description":"Offer store pickup."},"whatsappEnabled":{"type":["boolean","null"],"description":"Enable WhatsApp checkout."}},"required":[],"additionalProperties":false},"Error":{"type":"object","properties":{"success":{"type":"boolean","const":false},"message":{"type":"string"},"error":{"type":"object","properties":{"code":{"type":"string","description":"Machine-readable uppercase error code."},"details":{"type":"string","description":"Error explanation with templated values in documentation."}},"required":["code","details"],"additionalProperties":false}},"required":["success","message","error"],"additionalProperties":false}}}}