{"openapi":"3.1.0","info":{"title":"Mimeeq External API","version":"1.1.0","description":"Connect external systems to your Mimeeq account through the public REST API. Use it to read configured products, synchronize business and pricing data, retrieve carts and quotations, and manage supported account resources.\n\n## Start here\n\n1. Create an API key with the scopes your integration needs.\n2. Read Customer to identify the account and its configured languages, currencies and markets.\n3. Open the relevant resource overview, then choose an operation. Each operation describes its inputs, response and important update rules.\n4. Use the production base URL: `https://admin.mimeeqapi.com`. Endpoint paths already include `/v1`.\n\nThe reference is generated from the OpenAPI specification. **Test it sends a real API request** with the credentials and values you provide; it is not a pre-run automated test. Start with a read operation and avoid sending write requests against production data just to explore the documentation.\n\n## Authentication\n\nSend your API key in the Authorization header on every resource request:\n\n    Authorization: Bearer YOUR_API_KEY\n\nEach operation lists its required scope. A valid key without that scope receives `403 scope_denied`. The API key identifies the Mimeeq account; passing a record ID does not grant access to another account's data. Keep keys private and grant only the scopes your integration needs.\n\n## Response shape\n\nSuccessful JSON responses put the resource under `data`. A detail request normally returns one object; a list returns an array. Pagination metadata, where supported, is returned alongside `data` under `page`.\n\nA write may return the stored record, an identifier or a confirmation object. Check the operation's response schema rather than assuming all writes return the same shape. Operations returning `204` have no response body.\n\nCollection sets, galleries, global option sets, product categories and product groups read the resource back after writes. The result can differ from the submitted payload because the backend normalizes stored values. Inspect the response, particularly after multi-step creation, before treating a synchronization as complete.\n\n## Pagination\n\nOperations with `limit` and `cursor` parameters support cursor pagination. The default limit is 50 and the allowed range is 1–5000.\n\n1. Send the first request without a cursor.\n2. Read the returned `data` and `page.nextCursor`.\n3. Send the same filters with that cursor to request the next page.\n4. Stop when `nextCursor` is `null`.\n\nTreat cursors as opaque strings. Not every list is paginated: Users, Roles and Invitations return a single data array. Market Cost Prices has a separate retrieval ceiling and can return `page.truncated`; see that operation before exporting a large dataset.\n\n## Errors\n\nAPI errors normally use this JSON envelope:\n\n    { \"code\": \"error_code\", \"message\": \"Readable explanation\", \"requestId\": \"request-id\" }\n\nSome errors also include `details`, for example field validation failures. Use the HTTP status and `code` to decide how to respond; keep `requestId`, the endpoint and request time when reporting a problem. Do not include your API key in a support report.\n\n| Status | Meaning | Next step |\n| --- | --- | --- |\n| 400 / 422 | Invalid input or an unsupported operation for this record | Check the response code, details and request schema before retrying. |\n| 401 | Missing or invalid API key | Check the Authorization header and key. |\n| 403 | Missing scope or an operation not allowed for the account | Check the key's scopes and resource restrictions. |\n| 404 | The resource was not found or is not available to this account | Check the ID and account context. |\n| 409 | A conflicting record or state | Read the existing resource before retrying. |\n| 429 | Request rate or monthly allowance exceeded | Follow Retry-After and the rate-limit guidance below. |\n| 500 / 503 | Server error or temporary unavailability | Preserve request details; follow Retry-After when provided. |\n\nEdge firewall rejections occur before the request reaches the API. An IP rate-limit rejection returns `429 rate_limit_exceeded` without `requestId`. A blocked attack pattern or an IP reputation rule can return `403` with a non-JSON body. Report the endpoint and request time for these cases.\n\n## Deleting resources\n\nDeletion is only available for pending invitations, custom-field definitions, and soft-deletion of media-library files and directories. Use the Mimeeq app for other supported deletion workflows.\n\nRemoving a member from a collection, category, gallery or product group changes that relationship; it does not delete the referenced resource. An empty replacement list can remove all members, so read each operation's replacement rules before writing.\n\n## Reading API schemas\n\nThe Models page lists the named request and response schemas used by this reference. These are API data shapes, not 3D model assets. Open the schema linked from an operation to check required fields, types, allowed values and nested objects. Request and response shapes can differ.\n\n## Rate limits\nEach API key has a request-rate limit and a monthly request allowance. Read the response headers to understand the key's current limits instead of hard-coding values.\n\n### Request rate and monthly allowance\n\n- **Request rate** limits how quickly a key can send requests. A burst allowance permits a limited number of requests at once.\n- **Monthly allowance** limits the number of requests a key can make during a calendar month. It resets at the start of the next month in **UTC**.\n\n### Response headers\n\nWhen rate limiting is enabled, responses admitted by the limiter include:\n\n| Header | Meaning |\n| --- | --- |\n| `RateLimit-Limit` | The key's burst capacity: the maximum requests it can spend at once. |\n| `RateLimit-Remaining` | The remaining burst capacity after this request. This is not the remaining monthly allowance. |\n| `RateLimit-Reset` | Seconds until the burst capacity is full again. This is a duration, not a timestamp. |\n\n### When a request is rejected\n\n| Response | Meaning | What to do |\n| --- | --- | --- |\n| `429` with `rate_limit_exceeded` | The key has exhausted its current request-rate capacity. | Wait at least the number of seconds in `Retry-After`, then retry. |\n| `429` with `quota_exceeded` | The key has used its monthly allowance. | Respect `Retry-After`; repeated immediate retries will not restore the allowance. |\n| `503` with `Retry-After` | The service is temporarily unavailable. | Wait at least the stated number of seconds before retrying. |\n\nA request-rate rejection includes `RateLimit-*` headers. A monthly-quota rejection does not: burst capacity does not tell you whether monthly allowance remains.\n\n### Firewall limits\n\nThe edge firewall can also return `429 rate_limit_exceeded` when one IP address sends too many requests across API keys. That response has no `requestId`. See [Errors](https://help.mimeeq.com/developers/errors) for reporting guidance."},"servers":[{"url":"https://admin.mimeeqapi.com","description":"Production API"}],"tags":[{"name":"Carts","description":"Read shopping carts and their configured product selections. A cart can be open or submitted; its submission details become available after it is submitted.\n\nUse carts to retrieve a submitted enquiry or order input for another system, including contact information, selected configurations, quantities and prices. A cart is distinct from a quotation and does not by itself confirm a completed sale.\n\n## What you can do\n\n| Task | Reference |\n| --- | --- |\n| Find available carts | [List Carts](https://help.mimeeq.com/developers/carts/list-carts) |\n| Read one cart | [Get Cart](https://help.mimeeq.com/developers/carts/get-cart) |\n\n## Before you start\n\nYour API key needs `carts:read` to read these resources.\n\n## Important behaviour\n\nThese endpoints are read-only. List Carts requires at least one filter: status, `companyId` or `contactId`. Company and contact filters cannot be combined. Use Get Cart for the full line items, price modifiers and submission data; submission-specific values are null while the cart is open."},{"name":"Companies","description":"Manage the companies stored in your Mimeeq account. Company records hold business details, delivery addresses and commercial relationships, including assigned price lists.\n\nUse this section to synchronize company records with a CRM or ERP, retrieve company notes, and attach or detach price lists. People belonging to a company are managed through Contacts.\n\n## What you can do\n\n| Task | Reference |\n| --- | --- |\n| Find available companies | [List Companies](https://help.mimeeq.com/developers/companies/list-companies) |\n| Add a new company | [Create Company](https://help.mimeeq.com/developers/companies/create-company) |\n| Read one company | [Get Company](https://help.mimeeq.com/developers/companies/get-company) |\n| Change company | [Update Company](https://help.mimeeq.com/developers/companies/update-company) |\n| Find available company notes | [List Company Notes](https://help.mimeeq.com/developers/companies/list-company-notes) |\n| Change company price lists | [Update Company Price Lists](https://help.mimeeq.com/developers/companies/update-company-price-lists) |\n\n## Before you start\n\nYour API key needs `companies:read` to read these resources. Use `companies:write` for write operations.\n\n## Important behaviour\n\nRead Customer settings to obtain configured currency codes before creating or updating a company. General company updates replace the submitted configuration, and omitted optional arrays are cleared. Manage price-list assignments through their dedicated operation. Company deletion is not exposed by this API."},{"name":"Contacts","description":"Manage people associated with companies in your Mimeeq account. A contact is a business record; creating one does not create a Tier 1 account user or send an invitation.\n\nUse this section to synchronize names, email addresses, contact details and reporting relationships from a CRM. Contact detail also exposes invitation and portal-user assignment state where available.\n\n## What you can do\n\n| Task | Reference |\n| --- | --- |\n| Find available contacts | [List Contacts](https://help.mimeeq.com/developers/contacts/list-contacts) |\n| Add a new contact | [Create Contact](https://help.mimeeq.com/developers/contacts/create-contact) |\n| Read one contact | [Get Contact](https://help.mimeeq.com/developers/contacts/get-contact) |\n| Change contact | [Update Contact](https://help.mimeeq.com/developers/contacts/update-contact) |\n\n## Before you start\n\nYour API key needs `contacts:read` to read these resources. Use `contacts:write` for write operations.\n\n## Important behaviour\n\nCreate the company first and use its `companyId`. A reporting manager must be another contact in the same company. Updates replace submitted fields and arrays; changing a contact’s company can be rejected when it has quotations, an invitation or a portal user. Use Users, Invitations and Roles for Tier 1 account access."},{"name":"Customer","description":"Read and maintain the Mimeeq account associated with your API key. This is your account-level identity and configuration, rather than a company or a contact stored inside the account.\n\nUse this section to read account settings before synchronizing contact details, supported languages, currencies, markets, or public price-list groups. These settings provide reference values used by other API resources.\n\n## What you can do\n\n| Task | Reference |\n| --- | --- |\n| Find available customer | [List Customer](https://help.mimeeq.com/developers/customer/list-customer) |\n| Change customer contact | [Update Customer Contact](https://help.mimeeq.com/developers/customer/update-customer-contact) |\n| Change customer languages | [Update Customer Languages](https://help.mimeeq.com/developers/customer/update-customer-languages) |\n| Change customer pricing | [Update Customer Pricing](https://help.mimeeq.com/developers/customer/update-customer-pricing) |\n\n## Before you start\n\nYour API key needs `customer:read` to read these resources. Use `customer:write` for write operations.\n\n## Important behaviour\n\nRead the current customer first. Contact, language and pricing updates replace their respective submitted settings; send the complete values you intend to keep. Exactly one language and one currency must be the default. Theme values are returned for reference; these endpoints do not edit the theme or upload a logo."},{"name":"Custom Fields","description":"Define additional fields for option-set options, cart submissions and product data-grid (bill of materials) items. A field definition describes the field’s key, label, data type, validation and display configuration; it is not the value entered on an individual record.\n\nUse this section to discover existing fields or configure the metadata an integration needs. For example, define an internal reference on an option or an additional field on a cart submission.\n\n## What you can do\n\n| Task | Reference |\n| --- | --- |\n| Find available custom fields | [List Custom Fields](https://help.mimeeq.com/developers/custom-fields/list-custom-fields) |\n| Add a new custom field | [Create Custom Field](https://help.mimeeq.com/developers/custom-fields/create-custom-field) |\n| Read one custom field | [Get Custom Field](https://help.mimeeq.com/developers/custom-fields/get-custom-field) |\n| Change custom field | [Update Custom Field](https://help.mimeeq.com/developers/custom-fields/update-custom-field) |\n| Remove custom field | [Delete Custom Field](https://help.mimeeq.com/developers/custom-fields/delete-custom-field) |\n\n## Before you start\n\nYour API key needs `customFields:read` to read these resources. Use `customFields:write` for write operations.\n\n## Important behaviour\n\nChoose `resourceType` on every request: `OPTION_SET`, CART or `PRODUCT_DATA_GRID`. The same field ID must be interpreted in its resource context. Lists include `SYSTEM` and `CUSTOM` definitions; system definitions cannot be changed. Updates replace the definition, so preserve every setting you want to keep. Deleting a definition is a schema change; do not assume it edits existing record values."},{"name":"Users","description":"Read and manage the active or inactive status of Tier 1 users in your Mimeeq account. These are account users; they are different from the company contacts and Tier 2 dealer or partner users represented elsewhere in Mimeeq.\n\nUse List Users to find account user IDs before inspecting a user, changing their status or assigning them to a role. To invite a person to the account, use Invitations; to manage their permissions, use Roles.\n\n## What you can do\n\n| Task | Reference |\n| --- | --- |\n| Find available users | [List Users](https://help.mimeeq.com/developers/users/list-users) |\n| Read one user | [Get User](https://help.mimeeq.com/developers/users/get-user) |\n| Change user status | [Set User Status](https://help.mimeeq.com/developers/users/set-user-status) |\n\n## Before you start\n\nYour API key needs `users:read` to read these resources. Use `users:write` for write operations.\n\n## Important behaviour\n\nList Users returns the available users in one data array; it has no cursor or filter parameters. This section does not create users, edit profiles or delete users. Set User Status accepts `ACTIVE` or `INACTIVE` and first checks that the user belongs to this account."},{"name":"Invitations","description":"Invite people to join your Mimeeq account as Tier 1 users and manage pending invitations. Invitations connect a person to the account and specify the account roles they should receive.\n\nUse this section when onboarding an account user. Choose role IDs from Roles, create the invitation with the person’s email, name and default language, then use Users once the person is available as an account user.\n\n## What you can do\n\n| Task | Reference |\n| --- | --- |\n| Find available invitations | [List Invitations](https://help.mimeeq.com/developers/invitations/list-invitations) |\n| Add a new invitation | [Create Invitation](https://help.mimeeq.com/developers/invitations/create-invitation) |\n| Remove invitation | [Delete Invitation](https://help.mimeeq.com/developers/invitations/delete-invitation) |\n\n## Before you start\n\nYour API key needs `invitations:read` to read these resources. Use `invitations:write` for write operations.\n\n## Important behaviour\n\nCreating an invitation can send an invitation email or assign an existing eligible user. The result may contain a null `invitationId` when there is no pending invitation to track. List Invitations is not cursor-paginated. Cancelling an invitation removes the pending invitation; it does not deactivate an existing user."},{"name":"Roles","description":"Manage roles for **Tier 1 users in your Mimeeq account**. A role groups the permissions that control what an account user can view or change in the Mimeeq admin app.\n\nThese endpoints manage Tier 1 account roles. They do not manage Tier 2 dealer or partner roles.\n\n## What you can do\n\n| Task | Operation |\n| --- | --- |\n| Find existing roles | [List Roles](https://help.mimeeq.com/developers/roles/list-roles) |\n| Discover available permission identifiers | [List Role Permissions](https://help.mimeeq.com/developers/roles/list-role-permissions) |\n| Read a role and its assigned users | [Get Role](https://help.mimeeq.com/developers/roles/get-role) |\n| Add a role with permissions and user assignments | [Create Role](https://help.mimeeq.com/developers/roles/create-role) |\n| Change a role or its assignments | [Update Role](https://help.mimeeq.com/developers/roles/update-role) |\n\n## Before you start\n\nYour API key needs `roles:read` to read roles and available permissions, or `roles:write` to create or update them. API-key scopes control which API requests your integration can make. Role permissions control what the assigned users can do in Mimeeq.\n\nTo assign users, use user IDs returned by [List Users](https://help.mimeeq.com/developers/users/list-users) for the same Mimeeq account.\n\n## Updating user assignments\n\n> **The supplied user list replaces the current assignments.** Include every user you want to keep. Send an empty `userIds` array to remove all assignments, or omit `userIds` to leave them unchanged.\n\nStart with Get Role, prepare the complete list of users, and then submit Update Role. A new role is inactive unless you set its status to `ACTIVE`."},{"name":"Global Option Sets","description":"Manage reusable option sets belonging to your Mimeeq account. An option set contains choices and their metadata that can be used in product configurators.\n\nUse this section to maintain shared choices such as finishes or materials, instead of maintaining equivalent option data separately. Collection Sets group option sets; Custom Fields defines additional fields carried by options.\n\n## What you can do\n\n| Task | Reference |\n| --- | --- |\n| Find available global option sets | [List Global Option Sets](https://help.mimeeq.com/developers/global-option-sets/list-global-option-sets) |\n| Add a new global option set | [Create Global Option Set](https://help.mimeeq.com/developers/global-option-sets/create-global-option-set) |\n| Read one global option set | [Get Global Option Set](https://help.mimeeq.com/developers/global-option-sets/get-global-option-set) |\n| Change global option set | [Update Global Option Set](https://help.mimeeq.com/developers/global-option-sets/update-global-option-set) |\n| Change global option set options | [Update Global Option Set Options](https://help.mimeeq.com/developers/global-option-sets/update-global-option-set-options) |\n| Add or Update Global Option Set Options | [Add or Update Global Option Set Options](https://help.mimeeq.com/developers/global-option-sets/add-or-update-global-option-set-options) |\n| Remove Global Option Set Options | [Remove Global Option Set Options](https://help.mimeeq.com/developers/global-option-sets/remove-global-option-set-options) |\n| Copy global option set | [Duplicate Global Option Set](https://help.mimeeq.com/developers/global-option-sets/duplicate-global-option-set) |\n\n## Before you start\n\nYour API key needs `globalOptionSets:read` to read these resources. Use `globalOptionSets:write` for write operations.\n\n## Important behaviour\n\nGeneral settings and option membership have separate operations. PUT on the options list replaces every option; POST adds or replaces the options supplied; the remove operation removes selected IDs. A submitted option is a complete value, not a partial field patch. Preserve its other fields and translations when editing it. List responses are localized; Get without lang returns complete translation maps."},{"name":"Collection Sets","description":"Manage reusable collections of global option sets in your Mimeeq account. A collection set groups existing option sets; it does not define the individual options inside them.\n\nUse a collection set to maintain an ordered group of option sets for a configurator workflow. Create or update the underlying choices through Global Option Sets first.\n\n## What you can do\n\n| Task | Reference |\n| --- | --- |\n| Find available collection sets | [List Collection Sets](https://help.mimeeq.com/developers/collection-sets/list-collection-sets) |\n| Add a new collection set | [Create Collection Set](https://help.mimeeq.com/developers/collection-sets/create-collection-set) |\n| Read one collection set | [Get Collection Set](https://help.mimeeq.com/developers/collection-sets/get-collection-set) |\n| Change collection set | [Update Collection Set](https://help.mimeeq.com/developers/collection-sets/update-collection-set) |\n| Change collection set option sets | [Update Collection Set Option Sets](https://help.mimeeq.com/developers/collection-sets/update-collection-set-option-sets) |\n| Add Collection Set Option Sets | [Add Collection Set Option Sets](https://help.mimeeq.com/developers/collection-sets/add-collection-set-option-sets) |\n| Remove Collection Set Option Sets | [Remove Collection Set Option Sets](https://help.mimeeq.com/developers/collection-sets/remove-collection-set-option-sets) |\n| Copy collection set | [Duplicate Collection Set](https://help.mimeeq.com/developers/collection-sets/duplicate-collection-set) |\n\n## Before you start\n\nYour API key needs `collectionSets:read` to read these resources. Use `collectionSets:write` for write operations.\n\n## Important behaviour\n\nUse existing option-set IDs from the same account. General settings and member option sets are updated separately. PUT replaces the full member list; POST adds members without duplicates; the remove operation removes selected members. New collections are inactive by default. Inspect create responses because optional follow-up settings may not all have been applied."},{"name":"Galleries","description":"Manage named, localized media galleries used by product configurators. A gallery contains image or video items and their presentation metadata, such as captions and playback settings.\n\nUse this section to maintain reusable product imagery or video collections. Files manages the underlying media library; gallery operations manage the references and display settings rather than upload binary files.\n\n## What you can do\n\n| Task | Reference |\n| --- | --- |\n| Find available galleries | [List Galleries](https://help.mimeeq.com/developers/galleries/list-galleries) |\n| Add a new gallery | [Create Gallery](https://help.mimeeq.com/developers/galleries/create-gallery) |\n| Read one gallery | [Get Gallery](https://help.mimeeq.com/developers/galleries/get-gallery) |\n| Change gallery | [Update Gallery](https://help.mimeeq.com/developers/galleries/update-gallery) |\n| Change gallery items | [Update Gallery Items](https://help.mimeeq.com/developers/galleries/update-gallery-items) |\n| Add or Update Gallery Items | [Add or Update Gallery Items](https://help.mimeeq.com/developers/galleries/add-or-update-gallery-items) |\n| Remove Gallery Items | [Remove Gallery Items](https://help.mimeeq.com/developers/galleries/remove-gallery-items) |\n\n## Before you start\n\nYour API key needs `galleries:read` to read these resources. Use `galleries:write` for write operations.\n\n## Important behaviour\n\nGeneral gallery settings and media items have separate operations. PUT on items replaces the complete media list; POST adds or replaces supplied items; the remove operation removes selected IDs. Preserve all fields and caption translations on each submitted item. List responses are localized; Get without lang returns translation maps."},{"name":"Item Masters","description":"Manage item master records identified by product or item codes. These records hold operational data such as dimensions, weight, delivery time, commerce identifiers and company-specific alias codes.\n\nUse this section to synchronize item reference data from an ERP or catalogue system. Item masters are distinct from configurable Products. Market cost prices can be read with an item master but are maintained through Market Cost Prices.\n\n## What you can do\n\n| Task | Reference |\n| --- | --- |\n| Find available item masters | [List Item Masters](https://help.mimeeq.com/developers/item-masters/list-item-masters) |\n| Add a new item master | [Create Item Master](https://help.mimeeq.com/developers/item-masters/create-item-master) |\n| Import or update item masters | [Bulk upsert Item Masters](https://help.mimeeq.com/developers/item-masters/bulk-upsert-item-masters) |\n| Read one item master | [Get Item Master](https://help.mimeeq.com/developers/item-masters/get-item-master) |\n| Change item master | [Update Item Master](https://help.mimeeq.com/developers/item-masters/update-item-master) |\n\n## Before you start\n\nYour API key needs `itemMasters:read` to read these resources. Use `itemMasters:write` for write operations.\n\n## Important behaviour\n\nItem codes are unique without regard to case. Start with List Item Masters to resolve an `itemMasterId`. General updates replace the record fields, including alias codes. Bulk imports accept up to 1000 items and do not accept alias codes; inspect the result for skipped and invalid codes."},{"name":"Market Cost Prices","description":"Manage cost prices and optional recommended retail prices for a configured market, item code and quantity. The market selects the currency; requests do not supply a separate currency.\n\nUse this section to synchronize market-specific price inputs from a pricing or ERP system. Use Price Lists for selling-price lists and Companies for their assignments.\n\n## What you can do\n\n| Task | Reference |\n| --- | --- |\n| Find available market cost prices | [List Market Cost Prices](https://help.mimeeq.com/developers/market-cost-prices/list-market-cost-prices) |\n| Add a new market cost price | [Create Market Cost Price](https://help.mimeeq.com/developers/market-cost-prices/create-market-cost-price) |\n| Import or update market cost prices | [Bulk upsert Market Cost Prices](https://help.mimeeq.com/developers/market-cost-prices/bulk-upsert-market-cost-prices) |\n| Change market cost price | [Update Market Cost Price](https://help.mimeeq.com/developers/market-cost-prices/update-market-cost-price) |\n\n## Before you start\n\nYour API key needs `marketCostPrices:read` to read these resources. Use `marketCostPrices:write` for write operations.\n\n## Important behaviour\n\nRead Customer pricing settings for valid markets. The combination of market, code and quantity identifies a price record. Updates and bulk upserts replace the submitted price fields; omitting rrp clears it. The list has a 10000-record retrieval ceiling, so check page.truncated and use search to narrow large datasets."},{"name":"Price Lists","description":"Read and manage the price lists in your Mimeeq account. Use these endpoints to connect an external pricing system, maintain fixed-price rows, or configure calculated and linked lists.\n\n## Price list modes\n\n| Mode | Purpose |\n| --- | --- |\n| `FIXED` | Store explicit recommended retail and sale prices by price code and quantity. |\n| `CALCULATED` | Configure pricing calculations for a selected market and scope. |\n| `LINKED` | Base a list on another price list, with its own calculation settings. |\n\nEach mode has a different request shape. Use the schema for the mode you are creating or updating.\n\n## What you can do\n\n| Task | Operation |\n| --- | --- |\n| Find existing lists | [List Price Lists](https://help.mimeeq.com/developers/price-lists/list-price-lists) |\n| Read settings, prices, and attached companies | [Get Price List](https://help.mimeeq.com/developers/price-lists/get-price-list) |\n| Add a fixed, calculated, or linked list | [Create Price List](https://help.mimeeq.com/developers/price-lists/create-price-list) |\n| Replace a list's general configuration | [Update Price List](https://help.mimeeq.com/developers/price-lists/update-price-list) |\n| Replace the rows in a fixed-price list | [Update Price List Prices](https://help.mimeeq.com/developers/price-lists/update-price-list-prices) |\n\nYour API key needs `priceLists:read` to read lists, or `priceLists:write` to create or update them.\n\n## Updating a price list\n\nRead the existing list before changing it. General updates replace the applicable configuration for the selected mode; send the complete required field set. The `mode` field can also change the list's mode.\n\n> **Replacing fixed prices replaces every row.** Include all rows you want to retain. Sending `codes: []` clears the fixed-price rows.\n\nUse the [Companies](https://help.mimeeq.com/developers/companies) endpoints to manage company price-list assignments."},{"name":"Product Groups","description":"Group configurable products for sharing or embedding. A `SHARED` group connects a product selection to companies; an `EMBED` group holds products for an embedding workflow.\n\nUse this section to manage which products are grouped together and, for shared groups, which companies are connected. Use Product Categories for catalogue hierarchy and Products for product configuration.\n\n## What you can do\n\n| Task | Reference |\n| --- | --- |\n| Find available product groups | [List Product Groups](https://help.mimeeq.com/developers/product-groups/list-product-groups) |\n| Add a new product group | [Create Product Group](https://help.mimeeq.com/developers/product-groups/create-product-group) |\n| Read one product group | [Get Product Group](https://help.mimeeq.com/developers/product-groups/get-product-group) |\n| Change product group | [Update Product Group](https://help.mimeeq.com/developers/product-groups/update-product-group) |\n| Change product group products | [Update Product Group Products](https://help.mimeeq.com/developers/product-groups/update-product-group-products) |\n| Add Product Group Products | [Add Product Group Products](https://help.mimeeq.com/developers/product-groups/add-product-group-products) |\n| Remove Product Group Products | [Remove Product Group Products](https://help.mimeeq.com/developers/product-groups/remove-product-group-products) |\n| Change product group companies | [Update Product Group Companies](https://help.mimeeq.com/developers/product-groups/update-product-group-companies) |\n| Add Product Group Companies | [Add Product Group Companies](https://help.mimeeq.com/developers/product-groups/add-product-group-companies) |\n| Remove Product Group Companies | [Remove Product Group Companies](https://help.mimeeq.com/developers/product-groups/remove-product-group-companies) |\n| Copy product group | [Duplicate Product Group](https://help.mimeeq.com/developers/product-groups/duplicate-product-group) |\n\n## Before you start\n\nYour API key needs `productGroups:read` to read these resources. Use `productGroups:write` for write operations.\n\n## Important behaviour\n\nChoose the group type when creating it; general updates do not change that type. Company membership is only available on `SHARED` groups and connected companies need an API key. PUT replaces a full membership list; POST adds members; the remove operations disconnect selected members. Array order controls manual product ordering."},{"name":"Product Categories","description":"Organize configurable products into a hierarchy of categories. Each category has a localized name and a unique code, and can have a parent category and connected products.\n\nUse categories to synchronize a catalogue navigation structure. Products provides the configurable product records; Product Groups serves sharing and embedding workflows.\n\n## What you can do\n\n| Task | Reference |\n| --- | --- |\n| Find available product categories | [List Product Categories](https://help.mimeeq.com/developers/product-categories/list-product-categories) |\n| Add a new product category | [Create Product Category](https://help.mimeeq.com/developers/product-categories/create-product-category) |\n| Read one product category | [Get Product Category](https://help.mimeeq.com/developers/product-categories/get-product-category) |\n| Change product category | [Update Product Category](https://help.mimeeq.com/developers/product-categories/update-product-category) |\n| Change product category products | [Update Product Category Products](https://help.mimeeq.com/developers/product-categories/update-product-category-products) |\n| Add Product Category Products | [Add Product Category Products](https://help.mimeeq.com/developers/product-categories/add-product-category-products) |\n| Remove Product Category Products | [Remove Product Category Products](https://help.mimeeq.com/developers/product-categories/remove-product-category-products) |\n\n## Before you start\n\nYour API key needs `productCategories:read` to read these resources. Use `productCategories:write` for write operations.\n\n## Important behaviour\n\nCreate parent categories before assigning children. Manage connected products separately from general category settings: PUT replaces membership, POST adds members and the remove operation disconnects selected products. Preserve complete translation maps when changing a name. New categories are inactive by default."},{"name":"Products","description":"Read the configurable products available to your Mimeeq account. Use these endpoints to build a catalogue integration, retrieve a product's configuration, or find related products.\n\n> **These endpoints are read-only.** Create and edit products in the Mimeeq app; this API section does not provide product creation, update, or deletion operations.\n\n## What you can do\n\n| Task | Operation |\n| --- | --- |\n| Find products using filters and pagination | [List Products](https://help.mimeeq.com/developers/products/list-products) |\n| Read a product's full configuration | [Get Product](https://help.mimeeq.com/developers/products/get-product) |\n| Find products related to a selected product | [List Related Products](https://help.mimeeq.com/developers/products/list-related-products) |\n\n## Before you start\n\nYour API key needs the `products:read` scope. Start with List Products and use the returned `productId` in subsequent requests.\n\nList Products supports filters for text, status, product type, configurator mode, privacy, ownership, visibility, lifecycle dates, and variant code. See the operation for the supported values. Follow [Pagination](https://help.mimeeq.com/developers/pagination) when retrieving more than one page.\n\n## Product configuration and related resources\n\nGet Product returns the full configuration. Its structure can vary by product and configurator type, so check the response before selecting fields for your integration. Use the `lang` parameter when you need localized fields, including the description, in a particular language.\n\nUse [Product Categories](https://help.mimeeq.com/developers/product-categories) to work with the category hierarchy, and [Product Groups](https://help.mimeeq.com/developers/product-groups) for groups of products used for sharing or embedding."},{"name":"Files","description":"Manage files and directories in your Mimeeq media library. Use these resources for media assets rather than product records, gallery definitions or quotation records.\n\nBrowse a directory, search its descendants, inspect an asset, upload a file, or organize files through rename, move, copy and soft-delete operations. Download selected library entries as a ZIP, or use Download PoD Assets for artwork attached to a saved product configuration.\n\n## What you can do\n\n| Task | Reference |\n| --- | --- |\n| Add a new directory | [Create Directory](https://help.mimeeq.com/developers/files/create-directory) |\n| Find available files | [List Files](https://help.mimeeq.com/developers/files/list-files) |\n| Rename file or directory | [Rename File or Directory](https://help.mimeeq.com/developers/files/rename-file-or-directory) |\n| Remove file | [Delete File](https://help.mimeeq.com/developers/files/delete-file) |\n| Move files or directories | [Move Files or Directories](https://help.mimeeq.com/developers/files/move-files-or-directories) |\n| Copy files or directories | [Copy Files or Directories](https://help.mimeeq.com/developers/files/copy-files-or-directories) |\n| Download pod assets | [Download PoD Assets](https://help.mimeeq.com/developers/files/download-pod-assets) |\n| Upload file | [Upload File](https://help.mimeeq.com/developers/files/upload-file) |\n| Download files as zip | [Download Files as ZIP](https://help.mimeeq.com/developers/files/download-files-as-zip) |\n| Find matching files | [Search Files](https://help.mimeeq.com/developers/files/search-files) |\n| Read one file details | [Get File Details](https://help.mimeeq.com/developers/files/get-file-details) |\n\n## Before you start\n\nYour API key needs `files:read` to read these resources. Use `files:write` for write operations. Soft-delete requires `files:delete`.\n\n## Important behaviour\n\nUse directory paths and asset IDs returned by the library. List shows immediate children; Search finds matching entries below a directory. Upload uses multipart/form-data and accepts one file up to 25 MiB. Root and system directories have operation-specific restrictions. File deletion needs files:delete, separately from files:write. A PoD download needs a saved configuration `shortCode`, not a product ID."},{"name":"Quotations","description":"Read quotations and their versions, and update a quotation’s status or stage. A quotation holds commercial metadata; its versions hold the selected content, products and pricing for that version.\n\nUse this section to synchronize a sales pipeline or retrieve a specific quotation version for another system. Read quotation settings for configured stages and lost reasons, and Owners for IDs that can filter the list.\n\n## What you can do\n\n| Task | Reference |\n| --- | --- |\n| Find available quotations | [List Quotations](https://help.mimeeq.com/developers/quotations/list-quotations) |\n| Find available quotation owners | [List Quotation Owners](https://help.mimeeq.com/developers/quotations/list-quotation-owners) |\n| Find available quotation settings | [List Quotation Settings](https://help.mimeeq.com/developers/quotations/list-quotation-settings) |\n| Read one quotation | [Get Quotation](https://help.mimeeq.com/developers/quotations/get-quotation) |\n| Change quotation status | [Set Quotation Status](https://help.mimeeq.com/developers/quotations/set-quotation-status) |\n| Change quotation stage | [Set Quotation Stage](https://help.mimeeq.com/developers/quotations/set-quotation-stage) |\n| Find available quotation versions | [List Quotation Versions](https://help.mimeeq.com/developers/quotations/list-quotation-versions) |\n| Read one quotation version | [Get Quotation Version](https://help.mimeeq.com/developers/quotations/get-quotation-version) |\n| Find available quotation notes | [List Quotation Notes](https://help.mimeeq.com/developers/quotations/list-quotation-notes) |\n\n## Before you start\n\nYour API key needs `quotations:read` to read these resources. Use `quotations:write` for write operations.\n\n## Important behaviour\n\nList excludes archived quotations. Expected-close-date filters do not filter creation dates. Get returns the current version unless `versionId` is provided. The quotation-level price and selected-version total represent different values. Setting WON requires an accepted version and acceptor name; setting LOST requires a configured lost reason. These endpoints do not create quotations or edit version content."}],"paths":{"/v1/carts":{"get":{"summary":"List Carts","tags":["Carts"],"description":"List carts.\n\nUse the returned cartId with Get Cart to retrieve full configured line items and submission details.\n\n## Behaviour\n\nSupply at least one filter: `status`, `companyId`, or `contactId`; `companyId` and `contactId` cannot be combined.\n\nResults are cursor-paginated.\n\nRequires the `carts:read` scope.","security":[{"apiKey":[]}],"x-required-scope":"carts:read","responses":{"200":{"description":"Successful response.","headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CartsList"}}}},"400":{"description":"Invalid request data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}}},"403":{"description":"The API key lacks the required scope (`scope_denied`), or the operation is not permitted for this account (`operation_not_permitted`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"429":{"description":"The API key exceeded its request rate (`rate_limit_exceeded`) or its monthly quota (`quota_exceeded`). Both carry `Retry-After`; the `RateLimit-*` headers accompany `rate_limit_exceeded` only, since a spent quota says nothing about the bucket.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}}},"parameters":[{"name":"limit","in":"query","required":false,"schema":{"default":50,"type":"integer","minimum":1,"maximum":5000}},{"name":"cursor","in":"query","required":false,"schema":{"type":"string","minLength":1}},{"name":"status","in":"query","required":false,"schema":{"type":"string","enum":["OPEN","SUBMITTED"]}},{"name":"companyId","in":"query","required":false,"schema":{"type":"string","minLength":1}},{"name":"contactId","in":"query","required":false,"schema":{"type":"string","minLength":1}}]}},"/v1/carts/{cartId}":{"get":{"summary":"Get Cart","tags":["Carts"],"description":"Read a shopping cart’s full contents and submission details using its cartId from List Carts. Use this to retrieve configured product selections for an integration.\n\nThe response includes line items, quantities, prices and price modifiers. A line item may include a saved configuration `shortCode`. Submission-specific fields are null while the cart is `OPEN`.\n\nRequires the `carts:read` scope.","security":[{"apiKey":[]}],"x-required-scope":"carts:read","responses":{"200":{"description":"Successful response.","headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CartsDetail"}}}},"400":{"description":"Invalid request data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}}},"403":{"description":"The API key lacks the required scope (`scope_denied`), or the operation is not permitted for this account (`operation_not_permitted`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"429":{"description":"The API key exceeded its request rate (`rate_limit_exceeded`) or its monthly quota (`quota_exceeded`). Both carry `Retry-After`; the `RateLimit-*` headers accompany `rate_limit_exceeded` only, since a spent quota says nothing about the bucket.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}}},"parameters":[{"name":"cartId","in":"path","required":true,"schema":{"type":"string","minLength":1}}]}},"/v1/companies":{"get":{"summary":"List Companies","tags":["Companies"],"description":"List companies.\n\nUse the returned `companyId` when synchronizing contacts or company price-list assignments.\n\n## Behaviour\n\nOptionally filter by `status` or by a case-insensitive `search` over the company name.\n\nResults are cursor-paginated.\n\nRequires the `companies:read` scope.","security":[{"apiKey":[]}],"x-required-scope":"companies:read","responses":{"200":{"description":"Successful response.","headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompaniesList"}}}},"400":{"description":"Invalid request data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}}},"403":{"description":"The API key lacks the required scope (`scope_denied`), or the operation is not permitted for this account (`operation_not_permitted`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"429":{"description":"The API key exceeded its request rate (`rate_limit_exceeded`) or its monthly quota (`quota_exceeded`). Both carry `Retry-After`; the `RateLimit-*` headers accompany `rate_limit_exceeded` only, since a spent quota says nothing about the bucket.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}}},"parameters":[{"name":"limit","in":"query","required":false,"schema":{"default":50,"type":"integer","minimum":1,"maximum":5000}},{"name":"cursor","in":"query","required":false,"schema":{"type":"string","minLength":1}},{"name":"status","in":"query","required":false,"schema":{"type":"string","enum":["ACTIVE","INACTIVE"]}},{"name":"search","in":"query","required":false,"schema":{"type":"string","minLength":1}}]},"post":{"summary":"Create Company","tags":["Companies"],"description":"Create a company.\n\nUse this to add a business record from your CRM or ERP before creating its contacts.\n\n## Behaviour\n\n`currency` must be configured for your customer; otherwise the request returns 422.\n\nThe main address is supplied as a nested `address` object.\n\nRequires the `companies:write` scope.","security":[{"apiKey":[]}],"x-required-scope":"companies:write","responses":{"201":{"description":"Created.","headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompaniesMutation"}}}},"400":{"description":"Invalid request data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}}},"403":{"description":"The API key lacks the required scope (`scope_denied`), or the operation is not permitted for this account (`operation_not_permitted`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"422":{"description":"Unprocessable entity (e.g. an unconfigured currency or quotation stage).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"429":{"description":"The API key exceeded its request rate (`rate_limit_exceeded`) or its monthly quota (`quota_exceeded`). Both carry `Retry-After`; the `RateLimit-*` headers accompany `rate_limit_exceeded` only, since a spent quota says nothing about the bucket.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompaniesCreateRequest"}}}}}},"/v1/companies/{companyId}":{"get":{"summary":"Get Company","tags":["Companies"],"description":"Get a company with its delivery addresses, socials, contacts, and attached price-list summaries.\n\nUse this detail as the starting point for a company synchronization or general update.\n\nRequires the `companies:read` scope.","security":[{"apiKey":[]}],"x-required-scope":"companies:read","responses":{"200":{"description":"Successful response.","headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompaniesDetail"}}}},"400":{"description":"Invalid request data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}}},"403":{"description":"The API key lacks the required scope (`scope_denied`), or the operation is not permitted for this account (`operation_not_permitted`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"429":{"description":"The API key exceeded its request rate (`rate_limit_exceeded`) or its monthly quota (`quota_exceeded`). Both carry `Retry-After`; the `RateLimit-*` headers accompany `rate_limit_exceeded` only, since a spent quota says nothing about the bucket.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}}},"parameters":[{"name":"companyId","in":"path","required":true,"schema":{"type":"string","pattern":"^COMP-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}}]},"put":{"summary":"Update Company","tags":["Companies"],"description":"Replace a company with the supplied fields.\n\nRead Get Company first and preserve all values that should remain on the company record.\n\n## Behaviour\n\nRequired fields and supplied arrays are authoritative: omit an optional array to clear it.\n\n`currency` must be configured for your customer.\n\nRequires the `companies:write` scope.","security":[{"apiKey":[]}],"x-required-scope":"companies:write","responses":{"200":{"description":"Successful response.","headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompaniesDetail"}}}},"400":{"description":"Invalid request data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}}},"403":{"description":"The API key lacks the required scope (`scope_denied`), or the operation is not permitted for this account (`operation_not_permitted`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"422":{"description":"Unprocessable entity (e.g. an unconfigured currency or quotation stage).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"429":{"description":"The API key exceeded its request rate (`rate_limit_exceeded`) or its monthly quota (`quota_exceeded`). Both carry `Retry-After`; the `RateLimit-*` headers accompany `rate_limit_exceeded` only, since a spent quota says nothing about the bucket.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}}},"parameters":[{"name":"companyId","in":"path","required":true,"schema":{"type":"string","pattern":"^COMP-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompaniesCreateRequest"}}}}}},"/v1/companies/{companyId}/notes":{"get":{"summary":"List Company Notes","tags":["Companies"],"description":"List a company's notes, including attachments with public file URLs.\n\nUse these notes as supporting CRM context for the selected company; this operation does not create or edit notes.\n\nRequires the `companies:read` scope.","security":[{"apiKey":[]}],"x-required-scope":"companies:read","responses":{"200":{"description":"Successful response.","headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompaniesNotes"}}}},"400":{"description":"Invalid request data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}}},"403":{"description":"The API key lacks the required scope (`scope_denied`), or the operation is not permitted for this account (`operation_not_permitted`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"429":{"description":"The API key exceeded its request rate (`rate_limit_exceeded`) or its monthly quota (`quota_exceeded`). Both carry `Retry-After`; the `RateLimit-*` headers accompany `rate_limit_exceeded` only, since a spent quota says nothing about the bucket.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}}},"parameters":[{"name":"companyId","in":"path","required":true,"schema":{"type":"string","pattern":"^COMP-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}}]}},"/v1/companies/{companyId}/price-lists":{"post":{"summary":"Update Company Price Lists","tags":["Companies"],"description":"Attach and/or detach price lists for a company.\n\nUse this to synchronize commercial price-list assignments independently of the company’s general details.\n\n## Behaviour\n\nProvide at least one non-empty list; a price-list id cannot appear in both lists.\n\nEvery id being attached must exist (`404 price_list_not_found` otherwise, naming the unknown ids in `details`); ids being detached are not checked.\n\nReturns the refreshed price-list summaries.\n\nRequires the `companies:write` scope.","security":[{"apiKey":[]}],"x-required-scope":"companies:write","responses":{"200":{"description":"Successful response.","headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompaniesMutation2"}}}},"400":{"description":"Invalid request data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}}},"403":{"description":"The API key lacks the required scope (`scope_denied`), or the operation is not permitted for this account (`operation_not_permitted`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"429":{"description":"The API key exceeded its request rate (`rate_limit_exceeded`) or its monthly quota (`quota_exceeded`). Both carry `Retry-After`; the `RateLimit-*` headers accompany `rate_limit_exceeded` only, since a spent quota says nothing about the bucket.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}}},"parameters":[{"name":"companyId","in":"path","required":true,"schema":{"type":"string","pattern":"^COMP-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompaniesPriceListsRequest"}}}}}},"/v1/contacts":{"get":{"summary":"List Contacts","tags":["Contacts"],"description":"List contacts.\n\nUse the returned `contactId` with Get Contact before updating an individual person.\n\n## Behaviour\n\nOptionally filter by contact `status`, `companyId`, or a case-insensitive `search` over name and email.\n\nResults are cursor-paginated.\n\nRequires the `contacts:read` scope.","security":[{"apiKey":[]}],"x-required-scope":"contacts:read","responses":{"200":{"description":"Successful response.","headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactsList"}}}},"400":{"description":"Invalid request data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}}},"403":{"description":"The API key lacks the required scope (`scope_denied`), or the operation is not permitted for this account (`operation_not_permitted`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"429":{"description":"The API key exceeded its request rate (`rate_limit_exceeded`) or its monthly quota (`quota_exceeded`). Both carry `Retry-After`; the `RateLimit-*` headers accompany `rate_limit_exceeded` only, since a spent quota says nothing about the bucket.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}}},"parameters":[{"name":"limit","in":"query","required":false,"schema":{"default":50,"type":"integer","minimum":1,"maximum":5000}},{"name":"cursor","in":"query","required":false,"schema":{"type":"string","minLength":1}},{"name":"status","in":"query","required":false,"schema":{"type":"string","enum":["ACTIVE","INACTIVE"]}},{"name":"companyId","in":"query","required":false,"schema":{"type":"string","pattern":"^COMP-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}},{"name":"search","in":"query","required":false,"schema":{"type":"string","minLength":1}}]},"post":{"summary":"Create Contact","tags":["Contacts"],"description":"Create a contact for a company.\n\nUse this to add a person to an existing company; this does not create a Tier 1 login.\n\n## Behaviour\n\n`status` defaults to `ACTIVE` when omitted; the nested `address` shape is shared with contact updates.\n\n`reportsToId` must name another contact in the same company (`400 contact_invalid_reports_to` otherwise).\n\nA `companyId` that names no company you can reach answers `404 company_not_found` — the only reason a create returns 404.\n\nRequires the `contacts:write` scope.","security":[{"apiKey":[]}],"x-required-scope":"contacts:write","responses":{"201":{"description":"Created.","headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactsMutation"}}}},"400":{"description":"Invalid request data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}}},"403":{"description":"The API key lacks the required scope (`scope_denied`), or the operation is not permitted for this account (`operation_not_permitted`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"429":{"description":"The API key exceeded its request rate (`rate_limit_exceeded`) or its monthly quota (`quota_exceeded`). Both carry `Retry-After`; the `RateLimit-*` headers accompany `rate_limit_exceeded` only, since a spent quota says nothing about the bucket.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactsCreateRequest"}}}}}},"/v1/contacts/{contactId}":{"get":{"summary":"Get Contact","tags":["Contacts"],"description":"Get a contact with its address, tags, reporting line, invitation state, and user-assignment state.\n\nUse this detail before synchronizing a person’s record; invitation and portal-user flags describe existing relationships.\n\nRequires the `contacts:read` scope.","security":[{"apiKey":[]}],"x-required-scope":"contacts:read","responses":{"200":{"description":"Successful response.","headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactsDetail"}}}},"400":{"description":"Invalid request data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}}},"403":{"description":"The API key lacks the required scope (`scope_denied`), or the operation is not permitted for this account (`operation_not_permitted`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"429":{"description":"The API key exceeded its request rate (`rate_limit_exceeded`) or its monthly quota (`quota_exceeded`). Both carry `Retry-After`; the `RateLimit-*` headers accompany `rate_limit_exceeded` only, since a spent quota says nothing about the bucket.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}}},"parameters":[{"name":"contactId","in":"path","required":true,"schema":{"type":"string","pattern":"^CONT-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}}]},"put":{"summary":"Update Contact","tags":["Contacts"],"description":"Replace a contact with the supplied fields.\n\nRead Get Contact first and preserve all fields and arrays that should remain after the update.\n\n## Behaviour\n\nSupplied arrays replace their stored values; changing `companyId` can be rejected when the contact has quotations, an invitation, or a portal user.\n\n`reportsToId` must name another contact in the same company — the contact itself is not accepted (`400 contact_invalid_reports_to` otherwise).\n\nA 404 carries `contact_not_found` for the addressed contact and `company_not_found` for a `companyId` that names no company you can reach.\n\nRequires the `contacts:write` scope.","security":[{"apiKey":[]}],"x-required-scope":"contacts:write","responses":{"200":{"description":"Successful response.","headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactsDetail"}}}},"400":{"description":"Invalid request data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}}},"403":{"description":"The API key lacks the required scope (`scope_denied`), or the operation is not permitted for this account (`operation_not_permitted`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"429":{"description":"The API key exceeded its request rate (`rate_limit_exceeded`) or its monthly quota (`quota_exceeded`). Both carry `Retry-After`; the `RateLimit-*` headers accompany `rate_limit_exceeded` only, since a spent quota says nothing about the bucket.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}}},"parameters":[{"name":"contactId","in":"path","required":true,"schema":{"type":"string","pattern":"^CONT-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactsCreateRequest"}}}}}},"/v1/customer":{"get":{"summary":"List Customer","tags":["Customer"],"description":"Read the identity and account-level settings of the Mimeeq customer associated with your API key. Use this request to obtain supported languages, currencies and markets before synchronizing related resources.\n\nThe response includes contact details, reference settings and the presentation theme. It returns one account, not a list of Companies. Theme values are read-only through this section.\n\nRequires the `customer:read` scope.","security":[{"apiKey":[]}],"x-required-scope":"customer:read","responses":{"200":{"description":"Successful response.","headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerList"}}}},"400":{"description":"Invalid request data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}}},"403":{"description":"The API key lacks the required scope (`scope_denied`), or the operation is not permitted for this account (`operation_not_permitted`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"429":{"description":"The API key exceeded its request rate (`rate_limit_exceeded`) or its monthly quota (`quota_exceeded`). Both carry `Retry-After`; the `RateLimit-*` headers accompany `rate_limit_exceeded` only, since a spent quota says nothing about the bucket.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}}}}},"/v1/customer/contact":{"put":{"summary":"Update Customer Contact","tags":["Customer"],"description":"Replace the authenticated customer’s display name and contact details.\n\nUse this to synchronize your account’s business contact information. This is distinct from a person’s Contact record.\n\n## Behaviour\n\nLogo uploads are not supported by this endpoint.\n\nRequires the `customer:write` scope.","security":[{"apiKey":[]}],"x-required-scope":"customer:write","responses":{"200":{"description":"Successful response.","headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerMutation"}}}},"400":{"description":"Invalid request data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}}},"403":{"description":"The API key lacks the required scope (`scope_denied`), or the operation is not permitted for this account (`operation_not_permitted`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"429":{"description":"The API key exceeded its request rate (`rate_limit_exceeded`) or its monthly quota (`quota_exceeded`). Both carry `Retry-After`; the `RateLimit-*` headers accompany `rate_limit_exceeded` only, since a spent quota says nothing about the bucket.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerContactRequest"}}}}}},"/v1/customer/languages":{"put":{"summary":"Update Customer Languages","tags":["Customer"],"description":"Replace the customer languages.\n\nRead Customer first and preserve every supported language that should remain available to localized resources.\n\n## Behaviour\n\nSubmit exactly one default language; omitted languages are removed.\n\nRequires the `customer:write` scope.","security":[{"apiKey":[]}],"x-required-scope":"customer:write","responses":{"200":{"description":"Successful response.","headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerMutation2"}}}},"400":{"description":"Invalid request data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}}},"403":{"description":"The API key lacks the required scope (`scope_denied`), or the operation is not permitted for this account (`operation_not_permitted`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"429":{"description":"The API key exceeded its request rate (`rate_limit_exceeded`) or its monthly quota (`quota_exceeded`). Both carry `Retry-After`; the `RateLimit-*` headers accompany `rate_limit_exceeded` only, since a spent quota says nothing about the bucket.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerLanguagesRequest"}}}}}},"/v1/customer/pricing":{"put":{"summary":"Update Customer Pricing","tags":["Customer"],"description":"Replace customer currency, market, rounding, and public price-list-group settings.\n\nRead Customer first and preserve every currency, market and public price-list group that should remain configured.\n\n## Behaviour\n\nNew market codes receive internal record IDs automatically.\n\nRequires the `customer:write` scope.","security":[{"apiKey":[]}],"x-required-scope":"customer:write","responses":{"200":{"description":"Successful response.","headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerMutation3"}}}},"400":{"description":"Invalid request data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}}},"403":{"description":"The API key lacks the required scope (`scope_denied`), or the operation is not permitted for this account (`operation_not_permitted`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"429":{"description":"The API key exceeded its request rate (`rate_limit_exceeded`) or its monthly quota (`quota_exceeded`). Both carry `Retry-After`; the `RateLimit-*` headers accompany `rate_limit_exceeded` only, since a spent quota says nothing about the bucket.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerPricingRequest"}}}}}},"/v1/custom-fields":{"get":{"summary":"List Custom Fields","tags":["Custom Fields"],"description":"List custom-field definitions for the requested `resourceType`, including system parameters.\n\nUse `resourceType` to discover the definition keys and data types for one kind of record before reading or changing a field.\n\n## Behaviour\n\nLocalized fields are translated to `lang` when supplied.\n\nRequires the `customFields:read` scope.","security":[{"apiKey":[]}],"x-required-scope":"customFields:read","responses":{"200":{"description":"Successful response.","headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomFieldsList"}}}},"400":{"description":"Invalid request data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}}},"403":{"description":"The API key lacks the required scope (`scope_denied`), or the operation is not permitted for this account (`operation_not_permitted`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"429":{"description":"The API key exceeded its request rate (`rate_limit_exceeded`) or its monthly quota (`quota_exceeded`). Both carry `Retry-After`; the `RateLimit-*` headers accompany `rate_limit_exceeded` only, since a spent quota says nothing about the bucket.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}}},"parameters":[{"name":"resourceType","in":"query","required":true,"schema":{"type":"string","enum":["OPTION_SET","CART","PRODUCT_DATA_GRID"],"description":"The resource whose records carry this custom field."}},{"name":"lang","in":"query","required":false,"schema":{"type":"string","minLength":2,"maxLength":10,"description":"Language code to translate localized fields to (falls back if unavailable).","examples":["en"],"example":"en"}}]},"post":{"summary":"Create Custom Field","tags":["Custom Fields"],"description":"Create a field definition for the selected `resourceType`. Use this to define the key, localized label, data type and validation rules that records can use.\n\nChoose `OPTION_SET`, CART or `PRODUCT_DATA_GRID` and provide the definition required by that type. This creates the definition, not a field value on an option, cart or bill-of-materials item. Use List Custom Fields first to inspect existing keys and system definitions.\n\nRequires the `customFields:write` scope.","security":[{"apiKey":[]}],"x-required-scope":"customFields:write","responses":{"201":{"description":"Created.","headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomFieldsMutation"}}}},"400":{"description":"Invalid request data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}}},"403":{"description":"The API key lacks the required scope (`scope_denied`), or the operation is not permitted for this account (`operation_not_permitted`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"429":{"description":"The API key exceeded its request rate (`rate_limit_exceeded`) or its monthly quota (`quota_exceeded`). Both carry `Retry-After`; the `RateLimit-*` headers accompany `rate_limit_exceeded` only, since a spent quota says nothing about the bucket.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomFieldsCreateRequest"}}}}}},"/v1/custom-fields/{parameterId}":{"get":{"summary":"Get Custom Field","tags":["Custom Fields"],"description":"Read one field definition using its `parameterId` and `resourceType`. Use List Custom Fields to discover both values.\n\nThe result describes the field’s type, localized labels, validation and type-specific settings. It does not return values stored on individual records.\n\nRequires the `customFields:read` scope.","security":[{"apiKey":[]}],"x-required-scope":"customFields:read","responses":{"200":{"description":"Successful response.","headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomFieldsMutation"}}}},"400":{"description":"Invalid request data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}}},"403":{"description":"The API key lacks the required scope (`scope_denied`), or the operation is not permitted for this account (`operation_not_permitted`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"429":{"description":"The API key exceeded its request rate (`rate_limit_exceeded`) or its monthly quota (`quota_exceeded`). Both carry `Retry-After`; the `RateLimit-*` headers accompany `rate_limit_exceeded` only, since a spent quota says nothing about the bucket.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}}},"parameters":[{"name":"parameterId","in":"path","required":true,"schema":{"type":"string","pattern":"^PARAM-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}},{"name":"resourceType","in":"query","required":true,"schema":{"type":"string","enum":["OPTION_SET","CART","PRODUCT_DATA_GRID"],"description":"The resource whose records carry this custom field."}}]},"put":{"summary":"Update Custom Field","tags":["Custom Fields"],"description":"Replace a custom-field definition for the supplied `resourceType`. Read the current definition first and include every setting that must be retained.\n\nProvide the complete required definition, including its key, name, type and `validationConfig`. Optional settings are not a partial patch. `SYSTEM` parameters cannot be changed through this API.\n\nRequires the `customFields:write` scope.","security":[{"apiKey":[]}],"x-required-scope":"customFields:write","responses":{"200":{"description":"Successful response.","headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomFieldsMutation"}}}},"400":{"description":"Invalid request data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}}},"403":{"description":"The API key lacks the required scope (`scope_denied`), or the operation is not permitted for this account (`operation_not_permitted`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"429":{"description":"The API key exceeded its request rate (`rate_limit_exceeded`) or its monthly quota (`quota_exceeded`). Both carry `Retry-After`; the `RateLimit-*` headers accompany `rate_limit_exceeded` only, since a spent quota says nothing about the bucket.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}}},"parameters":[{"name":"parameterId","in":"path","required":true,"schema":{"type":"string","pattern":"^PARAM-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomFieldsUpdateRequest"}}}}},"delete":{"summary":"Delete Custom Field","tags":["Custom Fields"],"description":"Delete a custom-field definition from the supplied `resourceType`. Confirm the field’s identity with Get Custom Field before removing it.\n\nDeleting an already absent field succeeds without further changes. This endpoint manages definitions; it does not provide a bulk cleanup of values on existing records.\n\nRequires the `customFields:write` scope.","security":[{"apiKey":[]}],"x-required-scope":"customFields:write","responses":{"204":{"description":"No content.","headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"400":{"description":"Invalid request data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}}},"403":{"description":"The API key lacks the required scope (`scope_denied`), or the operation is not permitted for this account (`operation_not_permitted`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"429":{"description":"The API key exceeded its request rate (`rate_limit_exceeded`) or its monthly quota (`quota_exceeded`). Both carry `Retry-After`; the `RateLimit-*` headers accompany `rate_limit_exceeded` only, since a spent quota says nothing about the bucket.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}}},"parameters":[{"name":"parameterId","in":"path","required":true,"schema":{"type":"string","pattern":"^PARAM-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}},{"name":"resourceType","in":"query","required":true,"schema":{"type":"string","enum":["OPTION_SET","CART","PRODUCT_DATA_GRID"],"description":"The resource whose records carry this custom field."}}]}},"/v1/users":{"get":{"summary":"List Users","tags":["Users"],"description":"List Tier 1 account users available to this API key, including active and inactive users. Use the returned `userId` to read a user, change their status or assign them to a role.\n\nEach record contains the user’s name, email, status and beta-tester flag where available. This endpoint returns one data array and does not accept pagination or filter parameters. It does not list company contact records or pending invitations.\n\nRequires the `users:read` scope.","security":[{"apiKey":[]}],"x-required-scope":"users:read","responses":{"200":{"description":"Successful response.","headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UsersList"}}}},"400":{"description":"Invalid request data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}}},"403":{"description":"The API key lacks the required scope (`scope_denied`), or the operation is not permitted for this account (`operation_not_permitted`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"429":{"description":"The API key exceeded its request rate (`rate_limit_exceeded`) or its monthly quota (`quota_exceeded`). Both carry `Retry-After`; the `RateLimit-*` headers accompany `rate_limit_exceeded` only, since a spent quota says nothing about the bucket.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}}}}},"/v1/users/{userId}":{"get":{"summary":"Get User","tags":["Users"],"description":"Read the profile summary and status of one Tier 1 account user. Use a `userId` returned by List Users.\n\nThe user must belong to the account associated with your API key; an unavailable user returns user_not_found. This operation reads the user record and does not return the user’s role assignments.\n\nRequires the `users:read` scope.","security":[{"apiKey":[]}],"x-required-scope":"users:read","responses":{"200":{"description":"Successful response.","headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UsersDetail"}}}},"400":{"description":"Invalid request data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}}},"403":{"description":"The API key lacks the required scope (`scope_denied`), or the operation is not permitted for this account (`operation_not_permitted`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"429":{"description":"The API key exceeded its request rate (`rate_limit_exceeded`) or its monthly quota (`quota_exceeded`). Both carry `Retry-After`; the `RateLimit-*` headers accompany `rate_limit_exceeded` only, since a spent quota says nothing about the bucket.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}}},"parameters":[{"name":"userId","in":"path","required":true,"schema":{"type":"string","pattern":"^USER-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}}]}},"/v1/users/{userId}/status":{"put":{"summary":"Set User Status","tags":["Users"],"description":"Activate or deactivate a Tier 1 user belonging to your Mimeeq account. Use `INACTIVE` to deactivate the user or `ACTIVE` to activate them.\n\nThis operation changes status only; it does not delete the user, edit their profile or replace role assignments. The response confirms the `userId` and resulting status. Read List Users first to identify the correct account member.\n\nRequires the `users:write` scope.","security":[{"apiKey":[]}],"x-required-scope":"users:write","responses":{"200":{"description":"Successful response.","headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UsersMutation"}}}},"400":{"description":"Invalid request data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}}},"403":{"description":"The API key lacks the required scope (`scope_denied`), or the operation is not permitted for this account (`operation_not_permitted`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"429":{"description":"The API key exceeded its request rate (`rate_limit_exceeded`) or its monthly quota (`quota_exceeded`). Both carry `Retry-After`; the `RateLimit-*` headers accompany `rate_limit_exceeded` only, since a spent quota says nothing about the bucket.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}}},"parameters":[{"name":"userId","in":"path","required":true,"schema":{"type":"string","pattern":"^USER-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UsersStatusRequest"}}}}}},"/v1/invitations":{"get":{"summary":"List Invitations","tags":["Invitations"],"description":"List the pending invitations for your Mimeeq account. Use this request to find `invitationId` values before cancelling invitations or to check whether an invitation is still pending.\n\nRecords include the email, name, role IDs, default language and invitation timestamp where available. The response is a single data array with no pagination parameters. Existing account users are read through Users.\n\nRequires the `invitations:read` scope.","security":[{"apiKey":[]}],"x-required-scope":"invitations:read","responses":{"200":{"description":"Successful response.","headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvitationsList"}}}},"400":{"description":"Invalid request data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}}},"403":{"description":"The API key lacks the required scope (`scope_denied`), or the operation is not permitted for this account (`operation_not_permitted`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"429":{"description":"The API key exceeded its request rate (`rate_limit_exceeded`) or its monthly quota (`quota_exceeded`). Both carry `Retry-After`; the `RateLimit-*` headers accompany `rate_limit_exceeded` only, since a spent quota says nothing about the bucket.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}}}},"post":{"summary":"Create Invitation","tags":["Invitations"],"description":"Invite a person to your account as a Tier 1 user, or assign an existing eligible user to the account. This operation can send an invitation email.\n\nProvide the person’s email, first and last names, at least one `roleId` and a `defaultUserLang`. Use Roles to obtain the account role IDs.\n\nThe result contains `invitationId`, which can be null when an existing user is assigned without a pending invitation. Check current invitations and users before retrying; this is not a read-only operation.\n\nRequires the `invitations:write` scope.","security":[{"apiKey":[]}],"x-required-scope":"invitations:write","responses":{"201":{"description":"Created.","headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvitationsMutation"}}}},"400":{"description":"Invalid request data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}}},"403":{"description":"The API key lacks the required scope (`scope_denied`), or the operation is not permitted for this account (`operation_not_permitted`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"429":{"description":"The API key exceeded its request rate (`rate_limit_exceeded`) or its monthly quota (`quota_exceeded`). Both carry `Retry-After`; the `RateLimit-*` headers accompany `rate_limit_exceeded` only, since a spent quota says nothing about the bucket.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvitationsCreateRequest"}}}}}},"/v1/invitations/{invitationId}":{"delete":{"summary":"Delete Invitation","tags":["Invitations"],"description":"Cancel a pending invitation using its `invitationId` from List Invitations. Use this when a person should no longer join through that invitation.\n\nAn already absent invitation is treated as cancelled. Success returns 204 with no response body. Cancelling an invitation does not deactivate an existing user; use Set User Status for that.\n\nRequires the `invitations:write` scope.","security":[{"apiKey":[]}],"x-required-scope":"invitations:write","responses":{"204":{"description":"No content.","headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"400":{"description":"Invalid request data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}}},"403":{"description":"The API key lacks the required scope (`scope_denied`), or the operation is not permitted for this account (`operation_not_permitted`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"429":{"description":"The API key exceeded its request rate (`rate_limit_exceeded`) or its monthly quota (`quota_exceeded`). Both carry `Retry-After`; the `RateLimit-*` headers accompany `rate_limit_exceeded` only, since a spent quota says nothing about the bucket.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}}},"parameters":[{"name":"invitationId","in":"path","required":true,"schema":{"type":"string","pattern":"^INV-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}}]}},"/v1/roles":{"get":{"summary":"List Roles","tags":["Roles"],"description":"List the Tier 1 account roles available in your Mimeeq account. Use this request to find a `roleId` before reading a role, updating it or assigning roles to an invited user.\n\nEach role contains its name, `ACTIVE` or `INACTIVE` status and permission identifiers. The response is a single data array with no pagination or filter parameters.\n\nUse Get Role to inspect assigned user IDs and List Role Permissions for descriptions of the available permissions. These roles do not manage Tier 2 dealer or partner access.\n\nRequires the `roles:read` scope.","security":[{"apiKey":[]}],"x-required-scope":"roles:read","responses":{"200":{"description":"Successful response.","headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RolesList"}}}},"400":{"description":"Invalid request data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}}},"403":{"description":"The API key lacks the required scope (`scope_denied`), or the operation is not permitted for this account (`operation_not_permitted`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"429":{"description":"The API key exceeded its request rate (`rate_limit_exceeded`) or its monthly quota (`quota_exceeded`). Both carry `Retry-After`; the `RateLimit-*` headers accompany `rate_limit_exceeded` only, since a spent quota says nothing about the bucket.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}}}},"post":{"summary":"Create Role","tags":["Roles"],"description":"Create a Tier 1 account role and optionally assign users from the same Mimeeq account. Use List Role Permissions for valid permission IDs and List Users for valid user IDs.\n\nThe role defaults to `INACTIVE`, with no permissions or assigned users unless supplied. Set status to `ACTIVE` when required. The response contains the role detail read after creation.\n\nCreation and settings are separate backend steps. If a later step fails, check existing roles before retrying to avoid creating a duplicate.\n\nRequires the `roles:write` scope.","security":[{"apiKey":[]}],"x-required-scope":"roles:write","responses":{"201":{"description":"Created.","headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RolesDetail"}}}},"400":{"description":"Invalid request data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}}},"403":{"description":"The API key lacks the required scope (`scope_denied`), or the operation is not permitted for this account (`operation_not_permitted`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"429":{"description":"The API key exceeded its request rate (`rate_limit_exceeded`) or its monthly quota (`quota_exceeded`). Both carry `Retry-After`; the `RateLimit-*` headers accompany `rate_limit_exceeded` only, since a spent quota says nothing about the bucket.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RolesCreateRequest"}}}}}},"/v1/roles/permissions":{"get":{"summary":"List Role Permissions","tags":["Roles"],"description":"Read the permission catalogue for Tier 1 account roles. Use the returned id values when creating or updating a role.\n\nEach permission includes a description and group to help you choose the appropriate access. Role permissions govern users in Mimeeq; they are different from the API-key scopes required to call this API.\n\nRequires the `roles:read` scope.","security":[{"apiKey":[]}],"x-required-scope":"roles:read","responses":{"200":{"description":"Successful response.","headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RolesPermissions"}}}},"400":{"description":"Invalid request data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}}},"403":{"description":"The API key lacks the required scope (`scope_denied`), or the operation is not permitted for this account (`operation_not_permitted`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"429":{"description":"The API key exceeded its request rate (`rate_limit_exceeded`) or its monthly quota (`quota_exceeded`). Both carry `Retry-After`; the `RateLimit-*` headers accompany `rate_limit_exceeded` only, since a spent quota says nothing about the bucket.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}}}}},"/v1/roles/{roleId}":{"get":{"summary":"Get Role","tags":["Roles"],"description":"Read one Tier 1 account role, including its permission identifiers, assigned `userIds` and available creation and modification timestamps.\n\nUse List Roles to obtain `roleId`. Read this detail before editing assignments so you can preserve every user who should remain assigned.\n\nRequires the `roles:read` scope.","security":[{"apiKey":[]}],"x-required-scope":"roles:read","responses":{"200":{"description":"Successful response.","headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RolesDetail"}}}},"400":{"description":"Invalid request data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}}},"403":{"description":"The API key lacks the required scope (`scope_denied`), or the operation is not permitted for this account (`operation_not_permitted`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"429":{"description":"The API key exceeded its request rate (`rate_limit_exceeded`) or its monthly quota (`quota_exceeded`). Both carry `Retry-After`; the `RateLimit-*` headers accompany `rate_limit_exceeded` only, since a spent quota says nothing about the bucket.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}}},"parameters":[{"name":"roleId","in":"path","required":true,"schema":{"type":"string","pattern":"^ROLE-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}}]},"put":{"summary":"Update Role","tags":["Roles"],"description":"Change the supplied settings of a Tier 1 account role. Omitted fields retain their current values; at least one field must be supplied.\n\n**Assignments are a complete replacement when `userIds` is supplied.** Include every user who should remain assigned. Send an empty array to remove all assignments or omit `userIds` to preserve them. Submitted users must belong to the same account.\n\nA supplied permissions array also replaces the current permission list. The response contains the updated role detail.\n\nRequires the `roles:write` scope.","security":[{"apiKey":[]}],"x-required-scope":"roles:write","responses":{"200":{"description":"Successful response.","headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RolesDetail"}}}},"400":{"description":"Invalid request data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}}},"403":{"description":"The API key lacks the required scope (`scope_denied`), or the operation is not permitted for this account (`operation_not_permitted`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"429":{"description":"The API key exceeded its request rate (`rate_limit_exceeded`) or its monthly quota (`quota_exceeded`). Both carry `Retry-After`; the `RateLimit-*` headers accompany `rate_limit_exceeded` only, since a spent quota says nothing about the bucket.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}}},"parameters":[{"name":"roleId","in":"path","required":true,"schema":{"type":"string","pattern":"^ROLE-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RolesUpdateRequest"}}}}}},"/v1/global-option-sets":{"get":{"summary":"List Global Option Sets","tags":["Global Option Sets"],"description":"List the customer's global option sets.\n\nUse the returned IDs to inspect individual global option sets before editing them.\n\n## Behaviour\n\nFilter by name with `search`; localized fields come back translated — to `lang` when given, otherwise to your customer's default language.\n\nThe full `{ language: text }` maps are a detail-read feature; the list is always translated.\n\nCursor-paginated.\n\nRequires the `globalOptionSets:read` scope.","security":[{"apiKey":[]}],"x-required-scope":"globalOptionSets:read","responses":{"200":{"description":"Successful response.","headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GlobalOptionSetsList"}}}},"400":{"description":"Invalid request data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}}},"403":{"description":"The API key lacks the required scope (`scope_denied`), or the operation is not permitted for this account (`operation_not_permitted`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"429":{"description":"The API key exceeded its request rate (`rate_limit_exceeded`) or its monthly quota (`quota_exceeded`). Both carry `Retry-After`; the `RateLimit-*` headers accompany `rate_limit_exceeded` only, since a spent quota says nothing about the bucket.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}}},"parameters":[{"name":"limit","in":"query","required":false,"schema":{"default":50,"type":"integer","minimum":1,"maximum":5000}},{"name":"cursor","in":"query","required":false,"schema":{"type":"string","minLength":1}},{"name":"search","in":"query","required":false,"schema":{"type":"string","minLength":1,"description":"Substring match on the option set name."}},{"name":"lang","in":"query","required":false,"schema":{"type":"string","minLength":2,"maxLength":10,"description":"Language code to translate localized fields to (falls back if unavailable).","examples":["en"],"example":"en"}}]},"post":{"summary":"Create Global Option Set","tags":["Global Option Sets"],"description":"Create a global option set.\n\nUse this to create a reusable global option set in your account. Inspect the returned record before continuing the synchronization.\n\n## Behaviour\n\nOnly the name and localized display name are required; you may also pass the general fields (description, status, tags) and the options to build the whole set in one call.\n\nExtras are applied by follow-up update(s) after the set exists; if a step fails the set is still created and the response shows it without them, so compare the response with what you sent.\n\nSend `description: null` to leave it empty.\n\nRequires the `globalOptionSets:write` scope.","security":[{"apiKey":[]}],"x-required-scope":"globalOptionSets:write","responses":{"201":{"description":"Created.","headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GlobalOptionSetsMutation"}}}},"400":{"description":"Invalid request data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}}},"403":{"description":"The API key lacks the required scope (`scope_denied`), or the operation is not permitted for this account (`operation_not_permitted`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"429":{"description":"The API key exceeded its request rate (`rate_limit_exceeded`) or its monthly quota (`quota_exceeded`). Both carry `Retry-After`; the `RateLimit-*` headers accompany `rate_limit_exceeded` only, since a spent quota says nothing about the bucket.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GlobalOptionSetsCreateRequest"}}}}}},"/v1/global-option-sets/{optionSetId}":{"get":{"summary":"Get Global Option Set","tags":["Global Option Sets"],"description":"Get a global option set with its options.\n\nRead this detail before editing the global option set so that existing fields and relationships can be preserved.\n\n## Behaviour\n\nLocalized fields (display name, description, option names and comments) are translated to `lang`; omit `lang` to get the full `{ language: text }` maps instead — the options upsert stores an option exactly as sent, so editing one language means sending the others back with it.\n\nRequires the `globalOptionSets:read` scope.","security":[{"apiKey":[]}],"x-required-scope":"globalOptionSets:read","responses":{"200":{"description":"Successful response.","headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GlobalOptionSetsDetail"}}}},"400":{"description":"Invalid request data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}}},"403":{"description":"The API key lacks the required scope (`scope_denied`), or the operation is not permitted for this account (`operation_not_permitted`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"429":{"description":"The API key exceeded its request rate (`rate_limit_exceeded`) or its monthly quota (`quota_exceeded`). Both carry `Retry-After`; the `RateLimit-*` headers accompany `rate_limit_exceeded` only, since a spent quota says nothing about the bucket.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}}},"parameters":[{"name":"optionSetId","in":"path","required":true,"schema":{"type":"string","pattern":"^OPT-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Global option set identifier (OPT-<uuid>).","examples":["OPT-123e4567-e89b-12d3-a456-426614174000"],"example":"OPT-123e4567-e89b-12d3-a456-426614174000"}},{"name":"lang","in":"query","required":false,"schema":{"type":"string","minLength":2,"maxLength":10,"description":"Language code to translate localized fields to (falls back if unavailable).","examples":["en"],"example":"en"}}]},"put":{"summary":"Update Global Option Set","tags":["Global Option Sets"],"description":"Update the general fields (name, localized display name, description, status, tags).\n\nRead the existing global option set first. Check the replacement rules below before sending a partial list or localized value.\n\n## Behaviour\n\nOnly the fields you send are changed; omitted fields keep their stored value.\n\nSend `description: null` to clear it.\n\nOptions are managed via their own endpoint.\n\nRequires the `globalOptionSets:write` scope.","security":[{"apiKey":[]}],"x-required-scope":"globalOptionSets:write","responses":{"200":{"description":"Successful response.","headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GlobalOptionSetsDetail"}}}},"400":{"description":"Invalid request data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}}},"403":{"description":"The API key lacks the required scope (`scope_denied`), or the operation is not permitted for this account (`operation_not_permitted`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"429":{"description":"The API key exceeded its request rate (`rate_limit_exceeded`) or its monthly quota (`quota_exceeded`). Both carry `Retry-After`; the `RateLimit-*` headers accompany `rate_limit_exceeded` only, since a spent quota says nothing about the bucket.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}}},"parameters":[{"name":"optionSetId","in":"path","required":true,"schema":{"type":"string","pattern":"^OPT-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Global option set identifier (OPT-<uuid>).","examples":["OPT-123e4567-e89b-12d3-a456-426614174000"],"example":"OPT-123e4567-e89b-12d3-a456-426614174000"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GlobalOptionSetsUpdateRequest"}}}}}},"/v1/global-option-sets/{optionSetId}/options":{"put":{"summary":"Update Global Option Set Options","tags":["Global Option Sets"],"description":"Replace the full options list of a global option set.\n\nRead the existing global option set first. Check the replacement rules below before sending a partial list or localized value.\n\n## Behaviour\n\nThis is a full replacement: each option is stored as sent, so include every field you want to keep (e.g.\n\n`filters`, `metafields`) — omitting one clears it.\n\nOption order (`ordinal`) is preserved by matching the option `id`.\n\nRequires the `globalOptionSets:write` scope.","security":[{"apiKey":[]}],"x-required-scope":"globalOptionSets:write","responses":{"200":{"description":"Successful response.","headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GlobalOptionSetsDetail"}}}},"400":{"description":"Invalid request data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}}},"403":{"description":"The API key lacks the required scope (`scope_denied`), or the operation is not permitted for this account (`operation_not_permitted`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"429":{"description":"The API key exceeded its request rate (`rate_limit_exceeded`) or its monthly quota (`quota_exceeded`). Both carry `Retry-After`; the `RateLimit-*` headers accompany `rate_limit_exceeded` only, since a spent quota says nothing about the bucket.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}}},"parameters":[{"name":"optionSetId","in":"path","required":true,"schema":{"type":"string","pattern":"^OPT-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Global option set identifier (OPT-<uuid>).","examples":["OPT-123e4567-e89b-12d3-a456-426614174000"],"example":"OPT-123e4567-e89b-12d3-a456-426614174000"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GlobalOptionSetsOptionsRequest"}}}}},"post":{"summary":"Add or Update Global Option Set Options","tags":["Global Option Sets"],"description":"Add or update a subset of options without sending the whole list.\n\nUse this to add the supplied members without submitting the entire existing list. Review how matching IDs are handled below.\n\n## Behaviour\n\nAn option whose `id` matches a stored one replaces it (the whole option, not a field patch); a new `id` is appended.\n\nOptions you do not send are left untouched.\n\nRequires the `globalOptionSets:write` scope.","security":[{"apiKey":[]}],"x-required-scope":"globalOptionSets:write","responses":{"200":{"description":"Successful response.","headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GlobalOptionSetsDetail"}}}},"400":{"description":"Invalid request data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}}},"403":{"description":"The API key lacks the required scope (`scope_denied`), or the operation is not permitted for this account (`operation_not_permitted`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"429":{"description":"The API key exceeded its request rate (`rate_limit_exceeded`) or its monthly quota (`quota_exceeded`). Both carry `Retry-After`; the `RateLimit-*` headers accompany `rate_limit_exceeded` only, since a spent quota says nothing about the bucket.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}}},"parameters":[{"name":"optionSetId","in":"path","required":true,"schema":{"type":"string","pattern":"^OPT-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Global option set identifier (OPT-<uuid>).","examples":["OPT-123e4567-e89b-12d3-a456-426614174000"],"example":"OPT-123e4567-e89b-12d3-a456-426614174000"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GlobalOptionSetsOptionsRequest2"}}}}}},"/v1/global-option-sets/{optionSetId}/options:remove":{"post":{"summary":"Remove Global Option Set Options","tags":["Global Option Sets"],"description":"Remove a subset of options by id.\n\nUse this to remove selected relationships without replacing the remaining list. It does not delete the referenced resources themselves.\n\n## Behaviour\n\nUnknown ids are ignored.\n\nOptions you do not list are left untouched.\n\nRequires the `globalOptionSets:write` scope.","security":[{"apiKey":[]}],"x-required-scope":"globalOptionSets:write","responses":{"200":{"description":"Successful response.","headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GlobalOptionSetsDetail"}}}},"400":{"description":"Invalid request data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}}},"403":{"description":"The API key lacks the required scope (`scope_denied`), or the operation is not permitted for this account (`operation_not_permitted`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"429":{"description":"The API key exceeded its request rate (`rate_limit_exceeded`) or its monthly quota (`quota_exceeded`). Both carry `Retry-After`; the `RateLimit-*` headers accompany `rate_limit_exceeded` only, since a spent quota says nothing about the bucket.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}}},"parameters":[{"name":"optionSetId","in":"path","required":true,"schema":{"type":"string","pattern":"^OPT-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Global option set identifier (OPT-<uuid>).","examples":["OPT-123e4567-e89b-12d3-a456-426614174000"],"example":"OPT-123e4567-e89b-12d3-a456-426614174000"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GlobalOptionSetsOptionsRemoveRequest"}}}}}},"/v1/global-option-sets/{optionSetId}/duplicate":{"post":{"summary":"Duplicate Global Option Set","tags":["Global Option Sets"],"description":"Duplicate a global option set; returns the new id.\n\nUse this when starting a separate global option set from an existing record. The result identifies the new record; read it before making further changes.\n\nRequires the `globalOptionSets:write` scope.","security":[{"apiKey":[]}],"x-required-scope":"globalOptionSets:write","responses":{"200":{"description":"Successful response.","headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GlobalOptionSetsMutation"}}}},"400":{"description":"Invalid request data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}}},"403":{"description":"The API key lacks the required scope (`scope_denied`), or the operation is not permitted for this account (`operation_not_permitted`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"429":{"description":"The API key exceeded its request rate (`rate_limit_exceeded`) or its monthly quota (`quota_exceeded`). Both carry `Retry-After`; the `RateLimit-*` headers accompany `rate_limit_exceeded` only, since a spent quota says nothing about the bucket.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}}},"parameters":[{"name":"optionSetId","in":"path","required":true,"schema":{"type":"string","pattern":"^OPT-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Global option set identifier (OPT-<uuid>).","examples":["OPT-123e4567-e89b-12d3-a456-426614174000"],"example":"OPT-123e4567-e89b-12d3-a456-426614174000"}}]}},"/v1/collection-sets":{"get":{"summary":"List Collection Sets","tags":["Collection Sets"],"description":"List the customer's collection sets.\n\nUse the returned IDs to inspect individual collection sets before editing them.\n\n## Behaviour\n\nFilter by name with `search`.\n\nCursor-paginated.\n\nRequires the `collectionSets:read` scope.","security":[{"apiKey":[]}],"x-required-scope":"collectionSets:read","responses":{"200":{"description":"Successful response.","headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CollectionSetsList"}}}},"400":{"description":"Invalid request data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}}},"403":{"description":"The API key lacks the required scope (`scope_denied`), or the operation is not permitted for this account (`operation_not_permitted`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"429":{"description":"The API key exceeded its request rate (`rate_limit_exceeded`) or its monthly quota (`quota_exceeded`). Both carry `Retry-After`; the `RateLimit-*` headers accompany `rate_limit_exceeded` only, since a spent quota says nothing about the bucket.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}}},"parameters":[{"name":"limit","in":"query","required":false,"schema":{"default":50,"type":"integer","minimum":1,"maximum":5000}},{"name":"cursor","in":"query","required":false,"schema":{"type":"string","minLength":1}},{"name":"search","in":"query","required":false,"schema":{"type":"string","minLength":1,"description":"Substring match on the collection set name."}}]},"post":{"summary":"Create Collection Set","tags":["Collection Sets"],"description":"Create a collection set.\n\nUse this to create a reusable collection set in your account. Inspect the returned record before continuing the synchronization.\n\n## Behaviour\n\nOnly the name is required; you may also pass the general fields (status, tags) and member option sets to build the whole set in one call.\n\nExtras are applied by a follow-up update after the set exists; if that step fails the set is still created and the response shows it without them.\n\nNew sets default to `INACTIVE`.\n\nReturns 409 if the name already exists.\n\nRequires the `collectionSets:write` scope.","security":[{"apiKey":[]}],"x-required-scope":"collectionSets:write","responses":{"201":{"description":"Created.","headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CollectionSetsMutation"}}}},"400":{"description":"Invalid request data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}}},"403":{"description":"The API key lacks the required scope (`scope_denied`), or the operation is not permitted for this account (`operation_not_permitted`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"409":{"description":"Conflict with the current state (e.g. the resource already exists).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"429":{"description":"The API key exceeded its request rate (`rate_limit_exceeded`) or its monthly quota (`quota_exceeded`). Both carry `Retry-After`; the `RateLimit-*` headers accompany `rate_limit_exceeded` only, since a spent quota says nothing about the bucket.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CollectionSetsCreateRequest"}}}}}},"/v1/collection-sets/{collectionSetId}":{"get":{"summary":"Get Collection Set","tags":["Collection Sets"],"description":"Get a collection set with its member option sets and tags.\n\nRead this detail before editing the collection set so that existing fields and relationships can be preserved.\n\nRequires the `collectionSets:read` scope.","security":[{"apiKey":[]}],"x-required-scope":"collectionSets:read","responses":{"200":{"description":"Successful response.","headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CollectionSetsDetail"}}}},"400":{"description":"Invalid request data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}}},"403":{"description":"The API key lacks the required scope (`scope_denied`), or the operation is not permitted for this account (`operation_not_permitted`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"429":{"description":"The API key exceeded its request rate (`rate_limit_exceeded`) or its monthly quota (`quota_exceeded`). Both carry `Retry-After`; the `RateLimit-*` headers accompany `rate_limit_exceeded` only, since a spent quota says nothing about the bucket.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}}},"parameters":[{"name":"collectionSetId","in":"path","required":true,"schema":{"type":"string","pattern":"^MCS-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Collection set identifier (MCS-<uuid>).","examples":["MCS-123e4567-e89b-12d3-a456-426614174000"],"example":"MCS-123e4567-e89b-12d3-a456-426614174000"}}]},"put":{"summary":"Update Collection Set","tags":["Collection Sets"],"description":"Update the general fields (name, status, tags).\n\nRead the existing collection set first. Check the replacement rules below before sending a partial list or localized value.\n\n## Behaviour\n\nOnly the fields you send are changed; omitted fields keep their stored value.\n\nMember option sets are managed via their own endpoint.\n\nRequires the `collectionSets:write` scope.","security":[{"apiKey":[]}],"x-required-scope":"collectionSets:write","responses":{"200":{"description":"Successful response.","headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CollectionSetsDetail"}}}},"400":{"description":"Invalid request data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}}},"403":{"description":"The API key lacks the required scope (`scope_denied`), or the operation is not permitted for this account (`operation_not_permitted`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"429":{"description":"The API key exceeded its request rate (`rate_limit_exceeded`) or its monthly quota (`quota_exceeded`). Both carry `Retry-After`; the `RateLimit-*` headers accompany `rate_limit_exceeded` only, since a spent quota says nothing about the bucket.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}}},"parameters":[{"name":"collectionSetId","in":"path","required":true,"schema":{"type":"string","pattern":"^MCS-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Collection set identifier (MCS-<uuid>).","examples":["MCS-123e4567-e89b-12d3-a456-426614174000"],"example":"MCS-123e4567-e89b-12d3-a456-426614174000"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CollectionSetsUpdateRequest"}}}}}},"/v1/collection-sets/{collectionSetId}/option-sets":{"put":{"summary":"Update Collection Set Option Sets","tags":["Collection Sets"],"description":"Replace the full member option-set list of a collection set.\n\nRead the existing collection set first. Check the replacement rules below before sending a partial list or localized value.\n\n## Behaviour\n\nThis is a full replacement — option sets omitted from the list are removed.\n\nEvery id must name one of your option sets (`404 global_option_set_not_found` otherwise).\n\nName, status and tags are preserved.\n\nRequires the `collectionSets:write` scope.","security":[{"apiKey":[]}],"x-required-scope":"collectionSets:write","responses":{"200":{"description":"Successful response.","headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CollectionSetsDetail"}}}},"400":{"description":"Invalid request data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}}},"403":{"description":"The API key lacks the required scope (`scope_denied`), or the operation is not permitted for this account (`operation_not_permitted`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"429":{"description":"The API key exceeded its request rate (`rate_limit_exceeded`) or its monthly quota (`quota_exceeded`). Both carry `Retry-After`; the `RateLimit-*` headers accompany `rate_limit_exceeded` only, since a spent quota says nothing about the bucket.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}}},"parameters":[{"name":"collectionSetId","in":"path","required":true,"schema":{"type":"string","pattern":"^MCS-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Collection set identifier (MCS-<uuid>).","examples":["MCS-123e4567-e89b-12d3-a456-426614174000"],"example":"MCS-123e4567-e89b-12d3-a456-426614174000"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CollectionSetsOptionSetsRequest"}}}}},"post":{"summary":"Add Collection Set Option Sets","tags":["Collection Sets"],"description":"Add member option sets without sending the whole list.\n\nUse this to add the supplied members without submitting the entire existing list. Review how matching IDs are handled below.\n\n## Behaviour\n\nIds already in the set are ignored, so the call is idempotent and never creates duplicates; new ids are appended after the current members.\n\nEvery id must name one of your option sets (`404 global_option_set_not_found` otherwise).\n\nName, status and tags are preserved.\n\nRequires the `collectionSets:write` scope.","security":[{"apiKey":[]}],"x-required-scope":"collectionSets:write","responses":{"200":{"description":"Successful response.","headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CollectionSetsDetail"}}}},"400":{"description":"Invalid request data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}}},"403":{"description":"The API key lacks the required scope (`scope_denied`), or the operation is not permitted for this account (`operation_not_permitted`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"429":{"description":"The API key exceeded its request rate (`rate_limit_exceeded`) or its monthly quota (`quota_exceeded`). Both carry `Retry-After`; the `RateLimit-*` headers accompany `rate_limit_exceeded` only, since a spent quota says nothing about the bucket.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}}},"parameters":[{"name":"collectionSetId","in":"path","required":true,"schema":{"type":"string","pattern":"^MCS-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Collection set identifier (MCS-<uuid>).","examples":["MCS-123e4567-e89b-12d3-a456-426614174000"],"example":"MCS-123e4567-e89b-12d3-a456-426614174000"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CollectionSetsOptionSetsRequest2"}}}}}},"/v1/collection-sets/{collectionSetId}/option-sets:remove":{"post":{"summary":"Remove Collection Set Option Sets","tags":["Collection Sets"],"description":"Remove member option sets by id.\n\nUse this to remove selected relationships without replacing the remaining list. It does not delete the referenced resources themselves.\n\n## Behaviour\n\nIds that are not members are ignored.\n\nThe remaining members keep their order, and name, status and tags are preserved.\n\nRequires the `collectionSets:write` scope.","security":[{"apiKey":[]}],"x-required-scope":"collectionSets:write","responses":{"200":{"description":"Successful response.","headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CollectionSetsDetail"}}}},"400":{"description":"Invalid request data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}}},"403":{"description":"The API key lacks the required scope (`scope_denied`), or the operation is not permitted for this account (`operation_not_permitted`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"429":{"description":"The API key exceeded its request rate (`rate_limit_exceeded`) or its monthly quota (`quota_exceeded`). Both carry `Retry-After`; the `RateLimit-*` headers accompany `rate_limit_exceeded` only, since a spent quota says nothing about the bucket.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}}},"parameters":[{"name":"collectionSetId","in":"path","required":true,"schema":{"type":"string","pattern":"^MCS-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Collection set identifier (MCS-<uuid>).","examples":["MCS-123e4567-e89b-12d3-a456-426614174000"],"example":"MCS-123e4567-e89b-12d3-a456-426614174000"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CollectionSetsOptionSetsRemoveRequest"}}}}}},"/v1/collection-sets/{collectionSetId}/duplicate":{"post":{"summary":"Duplicate Collection Set","tags":["Collection Sets"],"description":"Duplicate a collection set; returns the new id.\n\nUse this when starting a separate collection set from an existing record. The result identifies the new record; read it before making further changes.\n\nRequires the `collectionSets:write` scope.","security":[{"apiKey":[]}],"x-required-scope":"collectionSets:write","responses":{"200":{"description":"Successful response.","headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CollectionSetsMutation"}}}},"400":{"description":"Invalid request data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}}},"403":{"description":"The API key lacks the required scope (`scope_denied`), or the operation is not permitted for this account (`operation_not_permitted`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"429":{"description":"The API key exceeded its request rate (`rate_limit_exceeded`) or its monthly quota (`quota_exceeded`). Both carry `Retry-After`; the `RateLimit-*` headers accompany `rate_limit_exceeded` only, since a spent quota says nothing about the bucket.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}}},"parameters":[{"name":"collectionSetId","in":"path","required":true,"schema":{"type":"string","pattern":"^MCS-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Collection set identifier (MCS-<uuid>).","examples":["MCS-123e4567-e89b-12d3-a456-426614174000"],"example":"MCS-123e4567-e89b-12d3-a456-426614174000"}}]}},"/v1/galleries":{"get":{"summary":"List Galleries","tags":["Galleries"],"description":"List the customer's galleries.\n\nUse the returned IDs to inspect individual galleries before editing them.\n\n## Behaviour\n\nFilter by name with `search`; localized fields come back translated — to `lang` when given, otherwise to your customer's default language.\n\nThe full `{ language: text }` maps are a detail-read feature; the list is always translated.\n\nCursor-paginated.\n\nRequires the `galleries:read` scope.","security":[{"apiKey":[]}],"x-required-scope":"galleries:read","responses":{"200":{"description":"Successful response.","headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GalleriesList"}}}},"400":{"description":"Invalid request data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}}},"403":{"description":"The API key lacks the required scope (`scope_denied`), or the operation is not permitted for this account (`operation_not_permitted`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"429":{"description":"The API key exceeded its request rate (`rate_limit_exceeded`) or its monthly quota (`quota_exceeded`). Both carry `Retry-After`; the `RateLimit-*` headers accompany `rate_limit_exceeded` only, since a spent quota says nothing about the bucket.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}}},"parameters":[{"name":"limit","in":"query","required":false,"schema":{"default":50,"type":"integer","minimum":1,"maximum":5000}},{"name":"cursor","in":"query","required":false,"schema":{"type":"string","minLength":1}},{"name":"search","in":"query","required":false,"schema":{"type":"string","minLength":1,"description":"Substring match on the gallery name."}},{"name":"lang","in":"query","required":false,"schema":{"type":"string","minLength":2,"maxLength":10,"description":"Language code to translate localized fields to (falls back if unavailable).","examples":["en"],"example":"en"}}]},"post":{"summary":"Create Gallery","tags":["Galleries"],"description":"Create a gallery.\n\nUse this to create a reusable gallery in your account. Inspect the returned record before continuing the synchronization.\n\n## Behaviour\n\nOnly the localized name is required; you may also pass the general fields (description, number of columns) and media items to build the whole gallery in one call.\n\nExtras are applied by a follow-up update after the gallery exists; if that step fails the gallery is still created and the response shows it without them.\n\nRequires the `galleries:write` scope.","security":[{"apiKey":[]}],"x-required-scope":"galleries:write","responses":{"201":{"description":"Created.","headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GalleriesMutation"}}}},"400":{"description":"Invalid request data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}}},"403":{"description":"The API key lacks the required scope (`scope_denied`), or the operation is not permitted for this account (`operation_not_permitted`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"429":{"description":"The API key exceeded its request rate (`rate_limit_exceeded`) or its monthly quota (`quota_exceeded`). Both carry `Retry-After`; the `RateLimit-*` headers accompany `rate_limit_exceeded` only, since a spent quota says nothing about the bucket.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GalleriesCreateRequest"}}}}}},"/v1/galleries/{galleryId}":{"get":{"summary":"Get Gallery","tags":["Galleries"],"description":"Get a gallery with its media items.\n\nRead this detail before editing the gallery so that existing fields and relationships can be preserved.\n\n## Behaviour\n\nThe localized name, description and item captions are translated to `lang`; omit `lang` to get the full `{ language: text }` maps instead — the items upsert stores an item exactly as sent, so editing one caption language means sending the others back with it.\n\nRequires the `galleries:read` scope.","security":[{"apiKey":[]}],"x-required-scope":"galleries:read","responses":{"200":{"description":"Successful response.","headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GalleriesDetail"}}}},"400":{"description":"Invalid request data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}}},"403":{"description":"The API key lacks the required scope (`scope_denied`), or the operation is not permitted for this account (`operation_not_permitted`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"429":{"description":"The API key exceeded its request rate (`rate_limit_exceeded`) or its monthly quota (`quota_exceeded`). Both carry `Retry-After`; the `RateLimit-*` headers accompany `rate_limit_exceeded` only, since a spent quota says nothing about the bucket.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}}},"parameters":[{"name":"galleryId","in":"path","required":true,"schema":{"type":"string","pattern":"^GALL-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Gallery identifier (GALL-<uuid>).","examples":["GALL-123e4567-e89b-12d3-a456-426614174000"],"example":"GALL-123e4567-e89b-12d3-a456-426614174000"}},{"name":"lang","in":"query","required":false,"schema":{"type":"string","minLength":2,"maxLength":10,"description":"Language code to translate localized fields to (falls back if unavailable).","examples":["en"],"example":"en"}}]},"put":{"summary":"Update Gallery","tags":["Galleries"],"description":"Update the general fields (localized name, description, number of columns).\n\nRead the existing gallery first. Check the replacement rules below before sending a partial list or localized value.\n\n## Behaviour\n\nOnly the fields you send are changed; omitted fields keep their stored value.\n\nSend `description: null` to clear the description.\n\nMedia items are preserved (managed via their own endpoint).\n\nRequires the `galleries:write` scope.","security":[{"apiKey":[]}],"x-required-scope":"galleries:write","responses":{"200":{"description":"Successful response.","headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GalleriesDetail"}}}},"400":{"description":"Invalid request data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}}},"403":{"description":"The API key lacks the required scope (`scope_denied`), or the operation is not permitted for this account (`operation_not_permitted`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"429":{"description":"The API key exceeded its request rate (`rate_limit_exceeded`) or its monthly quota (`quota_exceeded`). Both carry `Retry-After`; the `RateLimit-*` headers accompany `rate_limit_exceeded` only, since a spent quota says nothing about the bucket.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}}},"parameters":[{"name":"galleryId","in":"path","required":true,"schema":{"type":"string","pattern":"^GALL-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Gallery identifier (GALL-<uuid>).","examples":["GALL-123e4567-e89b-12d3-a456-426614174000"],"example":"GALL-123e4567-e89b-12d3-a456-426614174000"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GalleriesUpdateRequest"}}}}}},"/v1/galleries/{galleryId}/items":{"put":{"summary":"Update Gallery Items","tags":["Galleries"],"description":"Replace the full media list of a gallery: items omitted from the list are removed.\n\nRead the existing gallery first. Check the replacement rules below before sending a partial list or localized value.\n\n## Behaviour\n\nEach item is stored as sent, so include every field you want to keep (e.g.\n\n`caption`, `loop`, `autoplay`) — omitting one clears it.\n\nArray order is the display order.\n\nSend an empty list to clear the gallery.\n\nThe name, description and columns are preserved.\n\nRequires the `galleries:write` scope.","security":[{"apiKey":[]}],"x-required-scope":"galleries:write","responses":{"200":{"description":"Successful response.","headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GalleriesDetail"}}}},"400":{"description":"Invalid request data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}}},"403":{"description":"The API key lacks the required scope (`scope_denied`), or the operation is not permitted for this account (`operation_not_permitted`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"429":{"description":"The API key exceeded its request rate (`rate_limit_exceeded`) or its monthly quota (`quota_exceeded`). Both carry `Retry-After`; the `RateLimit-*` headers accompany `rate_limit_exceeded` only, since a spent quota says nothing about the bucket.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}}},"parameters":[{"name":"galleryId","in":"path","required":true,"schema":{"type":"string","pattern":"^GALL-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Gallery identifier (GALL-<uuid>).","examples":["GALL-123e4567-e89b-12d3-a456-426614174000"],"example":"GALL-123e4567-e89b-12d3-a456-426614174000"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GalleriesItemsRequest"}}}}},"post":{"summary":"Add or Update Gallery Items","tags":["Galleries"],"description":"Add or update media items without re-sending the whole list.\n\nUse this to add the supplied members without submitting the entire existing list. Review how matching IDs are handled below.\n\n## Behaviour\n\nAn item whose `id` is already in the gallery replaces that item where it stands (a submitted item is stored as sent, so omitted optional fields are cleared); the rest are appended in the order given.\n\nItems you do not send are left exactly as stored, captions in every language included.\n\nRequires the `galleries:write` scope.","security":[{"apiKey":[]}],"x-required-scope":"galleries:write","responses":{"200":{"description":"Successful response.","headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GalleriesDetail"}}}},"400":{"description":"Invalid request data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}}},"403":{"description":"The API key lacks the required scope (`scope_denied`), or the operation is not permitted for this account (`operation_not_permitted`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"429":{"description":"The API key exceeded its request rate (`rate_limit_exceeded`) or its monthly quota (`quota_exceeded`). Both carry `Retry-After`; the `RateLimit-*` headers accompany `rate_limit_exceeded` only, since a spent quota says nothing about the bucket.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}}},"parameters":[{"name":"galleryId","in":"path","required":true,"schema":{"type":"string","pattern":"^GALL-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Gallery identifier (GALL-<uuid>).","examples":["GALL-123e4567-e89b-12d3-a456-426614174000"],"example":"GALL-123e4567-e89b-12d3-a456-426614174000"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GalleriesItemsRequest2"}}}}}},"/v1/galleries/{galleryId}/items:remove":{"post":{"summary":"Remove Gallery Items","tags":["Galleries"],"description":"Remove media items by id.\n\nUse this to remove selected relationships without replacing the remaining list. It does not delete the referenced resources themselves.\n\n## Behaviour\n\nIds that are not in the gallery are ignored, and the remaining items keep their order.\n\nRemoving nothing leaves the gallery untouched.\n\nRequires the `galleries:write` scope.","security":[{"apiKey":[]}],"x-required-scope":"galleries:write","responses":{"200":{"description":"Successful response.","headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GalleriesDetail"}}}},"400":{"description":"Invalid request data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}}},"403":{"description":"The API key lacks the required scope (`scope_denied`), or the operation is not permitted for this account (`operation_not_permitted`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"429":{"description":"The API key exceeded its request rate (`rate_limit_exceeded`) or its monthly quota (`quota_exceeded`). Both carry `Retry-After`; the `RateLimit-*` headers accompany `rate_limit_exceeded` only, since a spent quota says nothing about the bucket.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}}},"parameters":[{"name":"galleryId","in":"path","required":true,"schema":{"type":"string","pattern":"^GALL-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Gallery identifier (GALL-<uuid>).","examples":["GALL-123e4567-e89b-12d3-a456-426614174000"],"example":"GALL-123e4567-e89b-12d3-a456-426614174000"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GalleriesItemsRemoveRequest"}}}}}},"/v1/item-masters":{"get":{"summary":"List Item Masters","tags":["Item Masters"],"description":"List item masters.\n\nUse the returned `itemMasterId` to read operational reference data or replace the item’s fields.\n\n## Behaviour\n\nOptionally filter by a case-insensitive `search` over code.\n\nResults are cursor-paginated; use the opaque `nextCursor` until it is null.\n\nRequires the `itemMasters:read` scope.","security":[{"apiKey":[]}],"x-required-scope":"itemMasters:read","responses":{"200":{"description":"Successful response.","headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ItemMastersList"}}}},"400":{"description":"Invalid request data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}}},"403":{"description":"The API key lacks the required scope (`scope_denied`), or the operation is not permitted for this account (`operation_not_permitted`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"429":{"description":"The API key exceeded its request rate (`rate_limit_exceeded`) or its monthly quota (`quota_exceeded`). Both carry `Retry-After`; the `RateLimit-*` headers accompany `rate_limit_exceeded` only, since a spent quota says nothing about the bucket.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}}},"parameters":[{"name":"limit","in":"query","required":false,"schema":{"default":50,"type":"integer","minimum":1,"maximum":5000}},{"name":"cursor","in":"query","required":false,"schema":{"type":"string","minLength":1}},{"name":"search","in":"query","required":false,"schema":{"type":"string","minLength":1}}]},"post":{"summary":"Create Item Master","tags":["Item Masters"],"description":"Create an item master.\n\nUse this to introduce one item code before synchronizing its operational data and market prices.\n\n## Behaviour\n\nThe code is unique case-insensitively.\n\nWhen fields beyond `code` are sent, the service persists them in a follow-up update; the response is the item master as stored, so compare it with what you sent.\n\nRequires the `itemMasters:write` scope.","security":[{"apiKey":[]}],"x-required-scope":"itemMasters:write","responses":{"201":{"description":"Created.","headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ItemMastersMutation"}}}},"400":{"description":"Invalid request data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}}},"403":{"description":"The API key lacks the required scope (`scope_denied`), or the operation is not permitted for this account (`operation_not_permitted`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"409":{"description":"Conflict with the current state (e.g. the resource already exists).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"429":{"description":"The API key exceeded its request rate (`rate_limit_exceeded`) or its monthly quota (`quota_exceeded`). Both carry `Retry-After`; the `RateLimit-*` headers accompany `rate_limit_exceeded` only, since a spent quota says nothing about the bucket.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ItemMastersCreateRequest"}}}}}},"/v1/item-masters:bulk":{"post":{"summary":"Bulk upsert Item Masters","tags":["Item Masters"],"description":"Create or upsert up to 1000 item masters.\n\nUse this for a batch of ERP item records. A successful request can still report rows that were skipped or rejected.\n\n## Behaviour\n\n`CREATE` skips existing codes, while `UPSERT` updates them.\n\nAlias codes are not accepted in bulk; inspect `skippedCodes`, `invalidCodes`, and the optional errors report.\n\nRequires the `itemMasters:write` scope.","security":[{"apiKey":[]}],"x-required-scope":"itemMasters:write","responses":{"200":{"description":"Successful response.","headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ItemMastersBulkResponse"}}}},"400":{"description":"Invalid request data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}}},"403":{"description":"The API key lacks the required scope (`scope_denied`), or the operation is not permitted for this account (`operation_not_permitted`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"429":{"description":"The API key exceeded its request rate (`rate_limit_exceeded`) or its monthly quota (`quota_exceeded`). Both carry `Retry-After`; the `RateLimit-*` headers accompany `rate_limit_exceeded` only, since a spent quota says nothing about the bucket.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ItemMastersBulkRequest"}}}}}},"/v1/item-masters/{itemMasterId}":{"get":{"summary":"Get Item Master","tags":["Item Masters"],"description":"Get an item master with its per-company alias codes and read-only market cost prices.\n\nUse this detail to reconcile one item’s reference data; update its market prices through Market Cost Prices.\n\nRequires the `itemMasters:read` scope.","security":[{"apiKey":[]}],"x-required-scope":"itemMasters:read","responses":{"200":{"description":"Successful response.","headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ItemMastersDetail"}}}},"400":{"description":"Invalid request data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}}},"403":{"description":"The API key lacks the required scope (`scope_denied`), or the operation is not permitted for this account (`operation_not_permitted`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"429":{"description":"The API key exceeded its request rate (`rate_limit_exceeded`) or its monthly quota (`quota_exceeded`). Both carry `Retry-After`; the `RateLimit-*` headers accompany `rate_limit_exceeded` only, since a spent quota says nothing about the bucket.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}}},"parameters":[{"name":"itemMasterId","in":"path","required":true,"schema":{"type":"string","pattern":"^IM-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}}]},"put":{"summary":"Update Item Master","tags":["Item Masters"],"description":"Replace an item master with the supplied fields.\n\nRead Get Item Master first and retain all required aliases and operational values in the replacement.\n\n## Behaviour\n\nAlias codes are a full replacement: an omitted or empty array removes existing aliases.\n\nMarket cost prices are read-only.\n\nRequires the `itemMasters:write` scope.","security":[{"apiKey":[]}],"x-required-scope":"itemMasters:write","responses":{"200":{"description":"Successful response.","headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ItemMastersDetail"}}}},"400":{"description":"Invalid request data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}}},"403":{"description":"The API key lacks the required scope (`scope_denied`), or the operation is not permitted for this account (`operation_not_permitted`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"409":{"description":"Conflict with the current state (e.g. the resource already exists).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"429":{"description":"The API key exceeded its request rate (`rate_limit_exceeded`) or its monthly quota (`quota_exceeded`). Both carry `Retry-After`; the `RateLimit-*` headers accompany `rate_limit_exceeded` only, since a spent quota says nothing about the bucket.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}}},"parameters":[{"name":"itemMasterId","in":"path","required":true,"schema":{"type":"string","pattern":"^IM-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ItemMastersCreateRequest"}}}}}},"/v1/market-cost-prices":{"get":{"summary":"List Market Cost Prices","tags":["Market Cost Prices"],"description":"List market cost prices for your customer.\n\nUse this to reconcile market-specific price inputs. Narrow large datasets instead of treating the final page as proof that all records were retrieved.\n\n## Behaviour\n\nOptionally filter by `market` or by `search` (a substring over the full code `market|code|quantity`).\n\nResults are cursor-paginated.\n\nAt most 10000 records can be paged through.\n\n`page.totalRecords` is how many your customer actually has (ignoring filters); when that exceeds what you can page through, `page.truncated` is `true` and reaching `nextCursor: null` still leaves records unseen.\n\nOnly `search` reaches them — it is applied before the cap, while `market` filters the records already returned.\n\nRequires the `marketCostPrices:read` scope.","security":[{"apiKey":[]}],"x-required-scope":"marketCostPrices:read","responses":{"200":{"description":"Successful response.","headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarketCostPricesList"}}}},"400":{"description":"Invalid request data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}}},"403":{"description":"The API key lacks the required scope (`scope_denied`), or the operation is not permitted for this account (`operation_not_permitted`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"429":{"description":"The API key exceeded its request rate (`rate_limit_exceeded`) or its monthly quota (`quota_exceeded`). Both carry `Retry-After`; the `RateLimit-*` headers accompany `rate_limit_exceeded` only, since a spent quota says nothing about the bucket.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}}},"parameters":[{"name":"limit","in":"query","required":false,"schema":{"default":50,"description":"Page size (1–5000, default 50).","examples":[50],"type":"integer","minimum":1,"maximum":5000,"example":50}},{"name":"cursor","in":"query","required":false,"schema":{"type":"string","minLength":1,"description":"Pagination cursor returned as page.nextCursor."}},{"name":"search","in":"query","required":false,"schema":{"type":"string","minLength":1,"description":"Substring match over the full code (market|code|quantity).","examples":["A-TM1680"],"example":"A-TM1680"}},{"name":"market","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":255,"description":"Filter to a single market (case-insensitive).","examples":["UK"],"example":"UK"}}]},"post":{"summary":"Create Market Cost Price","tags":["Market Cost Prices"],"description":"Create a single market cost price.\n\nUse this when adding a new market, code and quantity combination; use update or bulk UPSERT for an existing record.\n\n## Behaviour\n\nThe `market` must be one of your configured markets (`400 market_not_configured` otherwise).\n\nReturns 409 if the market/code/quantity combination already exists.\n\nRequires the `marketCostPrices:write` scope.","security":[{"apiKey":[]}],"x-required-scope":"marketCostPrices:write","responses":{"201":{"description":"Created.","headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarketCostPricesMutation"}}}},"400":{"description":"Invalid request data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}}},"403":{"description":"The API key lacks the required scope (`scope_denied`), or the operation is not permitted for this account (`operation_not_permitted`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"409":{"description":"Conflict with the current state (e.g. the resource already exists).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"429":{"description":"The API key exceeded its request rate (`rate_limit_exceeded`) or its monthly quota (`quota_exceeded`). Both carry `Retry-After`; the `RateLimit-*` headers accompany `rate_limit_exceeded` only, since a spent quota says nothing about the bucket.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarketCostPricesCreateRequest"}}}}}},"/v1/market-cost-prices:bulk":{"post":{"summary":"Bulk upsert Market Cost Prices","tags":["Market Cost Prices"],"description":"Create or upsert market cost prices in bulk (1–5000).\n\nUse this for a batch price synchronization. Inspect the per-batch result and invalid codes before considering the import complete.\n\n## Behaviour\n\nWith `mode: UPSERT` existing full codes are updated (counted under `updated`); the market must be configured for the customer, or the row is reported in `invalidCodes`.\n\nCurrency is not accepted — it is derived from the market.\n\nEach item is a full replacement: omitting `rrp` clears any stored RRP.\n\nRequires the `marketCostPrices:write` scope.","security":[{"apiKey":[]}],"x-required-scope":"marketCostPrices:write","responses":{"200":{"description":"Successful response.","headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarketCostPricesBulkResponse"}}}},"400":{"description":"Invalid request data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}}},"403":{"description":"The API key lacks the required scope (`scope_denied`), or the operation is not permitted for this account (`operation_not_permitted`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"409":{"description":"Conflict with the current state (e.g. the resource already exists).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"429":{"description":"The API key exceeded its request rate (`rate_limit_exceeded`) or its monthly quota (`quota_exceeded`). Both carry `Retry-After`; the `RateLimit-*` headers accompany `rate_limit_exceeded` only, since a spent quota says nothing about the bucket.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarketCostPricesBulkRequest"}}}}}},"/v1/market-cost-prices/{marketCostPriceId}":{"put":{"summary":"Update Market Cost Price","tags":["Market Cost Prices"],"description":"Replace a market cost price by id with the supplied fields.\n\nUse a `marketCostPriceId` returned by List Market Cost Prices and send the complete new price values.\n\n## Behaviour\n\nThis is a full replacement — omitting `rrp` clears any stored RRP.\n\nThe `market` must be one of your configured markets (`400 market_not_configured` otherwise).\n\nCurrency is derived from the market.\n\nReturns 404 if the id does not exist.\n\nRequires the `marketCostPrices:write` scope.","security":[{"apiKey":[]}],"x-required-scope":"marketCostPrices:write","responses":{"200":{"description":"Successful response.","headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarketCostPricesMutation"}}}},"400":{"description":"Invalid request data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}}},"403":{"description":"The API key lacks the required scope (`scope_denied`), or the operation is not permitted for this account (`operation_not_permitted`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"429":{"description":"The API key exceeded its request rate (`rate_limit_exceeded`) or its monthly quota (`quota_exceeded`). Both carry `Retry-After`; the `RateLimit-*` headers accompany `rate_limit_exceeded` only, since a spent quota says nothing about the bucket.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}}},"parameters":[{"name":"marketCostPriceId","in":"path","required":true,"schema":{"type":"string","pattern":"^MCP-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Market cost price identifier (MCP-<uuid>).","examples":["MCP-123e4567-e89b-12d3-a456-426614174000"],"example":"MCP-123e4567-e89b-12d3-a456-426614174000"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarketCostPricesCreateRequest"}}}}}},"/v1/price-lists":{"get":{"summary":"List Price Lists","tags":["Price Lists"],"description":"List the price lists available in your Mimeeq account. Use the returned `priceListId` to read a list’s configuration or update it.\n\nResults are cursor-paginated. Read Get Price List for the full mode-specific settings, fixed-price rows and assigned companies. List membership does not by itself describe how a company’s pricing is calculated.\n\nRequires the `priceLists:read` scope.","security":[{"apiKey":[]}],"x-required-scope":"priceLists:read","responses":{"200":{"description":"Successful response.","headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PriceListsList"}}}},"400":{"description":"Invalid request data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}}},"403":{"description":"The API key lacks the required scope (`scope_denied`), or the operation is not permitted for this account (`operation_not_permitted`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"429":{"description":"The API key exceeded its request rate (`rate_limit_exceeded`) or its monthly quota (`quota_exceeded`). Both carry `Retry-After`; the `RateLimit-*` headers accompany `rate_limit_exceeded` only, since a spent quota says nothing about the bucket.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}}},"parameters":[{"name":"limit","in":"query","required":false,"schema":{"default":50,"type":"integer","minimum":1,"maximum":5000}},{"name":"cursor","in":"query","required":false,"schema":{"type":"string","minLength":1}}]},"post":{"summary":"Create Price List","tags":["Price Lists"],"description":"Create a `FIXED`, `CALCULATED` or `LINKED` price list for your Mimeeq account. Choose the mode that matches the pricing source and use the corresponding request schema.\n\nA `FIXED` list can include its initial price rows. Read Customer for configured currency and market references and existing Price Lists when a linked list needs a source list.\n\nRequires the `priceLists:write` scope.","security":[{"apiKey":[]}],"x-required-scope":"priceLists:write","responses":{"201":{"description":"Created.","headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PriceListsMutation"}}}},"400":{"description":"Invalid request data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}}},"403":{"description":"The API key lacks the required scope (`scope_denied`), or the operation is not permitted for this account (`operation_not_permitted`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"429":{"description":"The API key exceeded its request rate (`rate_limit_exceeded`) or its monthly quota (`quota_exceeded`). Both carry `Retry-After`; the `RateLimit-*` headers accompany `rate_limit_exceeded` only, since a spent quota says nothing about the bucket.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PriceListsCreateRequest"}}}}}},"/v1/price-lists/{priceListId}":{"get":{"summary":"Get Price List","tags":["Price Lists"],"description":"Read a price list’s mode, currency, validity, calculation settings, fixed-price codes and attached companies. Use List Price Lists to obtain the `priceListId`.\n\nRead this detail before updating the list so you can preserve the full settings required by its mode. Company assignments are managed through Update Company Price Lists.\n\nRequires the `priceLists:read` scope.","security":[{"apiKey":[]}],"x-required-scope":"priceLists:read","responses":{"200":{"description":"Successful response.","headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PriceListsDetail"}}}},"400":{"description":"Invalid request data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}}},"403":{"description":"The API key lacks the required scope (`scope_denied`), or the operation is not permitted for this account (`operation_not_permitted`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"429":{"description":"The API key exceeded its request rate (`rate_limit_exceeded`) or its monthly quota (`quota_exceeded`). Both carry `Retry-After`; the `RateLimit-*` headers accompany `rate_limit_exceeded` only, since a spent quota says nothing about the bucket.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}}},"parameters":[{"name":"priceListId","in":"path","required":true,"schema":{"type":"string","pattern":"^PL-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}}]},"put":{"summary":"Update Price List","tags":["Price Lists"],"description":"Replace the general configuration of a price list. The supplied mode selects the full required field set and can change the list’s mode.\n\nRead Get Price List first and submit the complete applicable settings; this is not a partial field patch. Use Update Price List Prices to replace `FIXED` price rows and the Companies section to change company assignments.\n\nRequires the `priceLists:write` scope.","security":[{"apiKey":[]}],"x-required-scope":"priceLists:write","responses":{"200":{"description":"Successful response.","headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PriceListsDetail"}}}},"400":{"description":"Invalid request data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}}},"403":{"description":"The API key lacks the required scope (`scope_denied`), or the operation is not permitted for this account (`operation_not_permitted`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"429":{"description":"The API key exceeded its request rate (`rate_limit_exceeded`) or its monthly quota (`quota_exceeded`). Both carry `Retry-After`; the `RateLimit-*` headers accompany `rate_limit_exceeded` only, since a spent quota says nothing about the bucket.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}}},"parameters":[{"name":"priceListId","in":"path","required":true,"schema":{"type":"string","pattern":"^PL-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PriceListsUpdateRequest"}}}}}},"/v1/price-lists/{priceListId}/prices":{"put":{"summary":"Update Price List Prices","tags":["Price Lists"],"description":"Replace all rows in a `FIXED` price list. Use this when synchronizing a complete set of price-code and quantity prices from another system.\n\n**Every existing row not supplied is removed.** Include all rows you want to retain. Sending codes: [] clears the fixed-price rows. Read the current list and confirm its mode before writing.\n\nRequires the `priceLists:write` scope.","security":[{"apiKey":[]}],"x-required-scope":"priceLists:write","responses":{"200":{"description":"Successful response.","headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PriceListsDetail"}}}},"400":{"description":"Invalid request data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}}},"403":{"description":"The API key lacks the required scope (`scope_denied`), or the operation is not permitted for this account (`operation_not_permitted`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"429":{"description":"The API key exceeded its request rate (`rate_limit_exceeded`) or its monthly quota (`quota_exceeded`). Both carry `Retry-After`; the `RateLimit-*` headers accompany `rate_limit_exceeded` only, since a spent quota says nothing about the bucket.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}}},"parameters":[{"name":"priceListId","in":"path","required":true,"schema":{"type":"string","pattern":"^PL-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PriceListsPricesRequest"}}}}}},"/v1/product-groups":{"get":{"summary":"List Product Groups","tags":["Product Groups"],"description":"List the customer's product groups.\n\nUse the returned IDs to inspect individual product groups before editing them.\n\n## Behaviour\n\nFilter by name with `search`.\n\nCursor-paginated.\n\nRequires the `productGroups:read` scope.","security":[{"apiKey":[]}],"x-required-scope":"productGroups:read","responses":{"200":{"description":"Successful response.","headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductGroupsList"}}}},"400":{"description":"Invalid request data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}}},"403":{"description":"The API key lacks the required scope (`scope_denied`), or the operation is not permitted for this account (`operation_not_permitted`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"429":{"description":"The API key exceeded its request rate (`rate_limit_exceeded`) or its monthly quota (`quota_exceeded`). Both carry `Retry-After`; the `RateLimit-*` headers accompany `rate_limit_exceeded` only, since a spent quota says nothing about the bucket.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}}},"parameters":[{"name":"limit","in":"query","required":false,"schema":{"default":50,"type":"integer","minimum":1,"maximum":5000}},{"name":"cursor","in":"query","required":false,"schema":{"type":"string","minLength":1}},{"name":"search","in":"query","required":false,"schema":{"type":"string","minLength":1,"description":"Substring match on the product group name."}}]},"post":{"summary":"Create Product Group","tags":["Product Groups"],"description":"Create a product group.\n\nUse this to create a reusable product group in your account. Inspect the returned record before continuing the synchronization.\n\n## Behaviour\n\nOnly the name and type (`SHARED` or `EMBED`) are required; you may also pass the general fields (status, manualSort), connected products and — for `SHARED` groups — companies to build the whole group in one call.\n\nExtras are applied by a follow-up update after the group exists; if that step fails the group is still created and the response shows it without them.\n\nCompanies apply to `SHARED` groups only: a non-empty `companyIds` on an `EMBED` group is rejected with `400 product_group_not_shareable` before anything is created, and every company must already have an API key — one that does not is simply not connected, so check `companyIds` in the response; the dedicated companies endpoint reports which and why.\n\nNew groups default to inactive.\n\nRequires the `productGroups:write` scope.","security":[{"apiKey":[]}],"x-required-scope":"productGroups:write","responses":{"201":{"description":"Created.","headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductGroupsMutation"}}}},"400":{"description":"Invalid request data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}}},"403":{"description":"The API key lacks the required scope (`scope_denied`), or the operation is not permitted for this account (`operation_not_permitted`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"429":{"description":"The API key exceeded its request rate (`rate_limit_exceeded`) or its monthly quota (`quota_exceeded`). Both carry `Retry-After`; the `RateLimit-*` headers accompany `rate_limit_exceeded` only, since a spent quota says nothing about the bucket.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductGroupsCreateRequest"}}}}}},"/v1/product-groups/{productGroupId}":{"get":{"summary":"Get Product Group","tags":["Product Groups"],"description":"Get a product group with its connected products (in manual-sort order) and companies.\n\nRead this detail before editing the product group so that existing fields and relationships can be preserved.\n\n## Behaviour\n\nProducts and companies are managed via their own endpoints.\n\nRequires the `productGroups:read` scope.","security":[{"apiKey":[]}],"x-required-scope":"productGroups:read","responses":{"200":{"description":"Successful response.","headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductGroupsDetail"}}}},"400":{"description":"Invalid request data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}}},"403":{"description":"The API key lacks the required scope (`scope_denied`), or the operation is not permitted for this account (`operation_not_permitted`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"429":{"description":"The API key exceeded its request rate (`rate_limit_exceeded`) or its monthly quota (`quota_exceeded`). Both carry `Retry-After`; the `RateLimit-*` headers accompany `rate_limit_exceeded` only, since a spent quota says nothing about the bucket.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}}},"parameters":[{"name":"productGroupId","in":"path","required":true,"schema":{"type":"string","pattern":"^PG-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Product group identifier (PG-<uuid>).","examples":["PG-123e4567-e89b-12d3-a456-426614174000"],"example":"PG-123e4567-e89b-12d3-a456-426614174000"}}]},"put":{"summary":"Update Product Group","tags":["Product Groups"],"description":"Update the general fields (name, manual-sort flag, status).\n\nRead the existing product group first. Check the replacement rules below before sending a partial list or localized value.\n\n## Behaviour\n\nOnly the fields you send are changed; omitted fields keep their stored value.\n\nConnected products/companies and type are preserved.\n\nRequires the `productGroups:write` scope.","security":[{"apiKey":[]}],"x-required-scope":"productGroups:write","responses":{"200":{"description":"Successful response.","headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductGroupsDetail"}}}},"400":{"description":"Invalid request data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}}},"403":{"description":"The API key lacks the required scope (`scope_denied`), or the operation is not permitted for this account (`operation_not_permitted`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"429":{"description":"The API key exceeded its request rate (`rate_limit_exceeded`) or its monthly quota (`quota_exceeded`). Both carry `Retry-After`; the `RateLimit-*` headers accompany `rate_limit_exceeded` only, since a spent quota says nothing about the bucket.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}}},"parameters":[{"name":"productGroupId","in":"path","required":true,"schema":{"type":"string","pattern":"^PG-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Product group identifier (PG-<uuid>).","examples":["PG-123e4567-e89b-12d3-a456-426614174000"],"example":"PG-123e4567-e89b-12d3-a456-426614174000"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductGroupsUpdateRequest"}}}}}},"/v1/product-groups/{productGroupId}/products":{"put":{"summary":"Update Product Group Products","tags":["Product Groups"],"description":"Replace the full list of connected products.\n\nRead the existing product group first. Check the replacement rules below before sending a partial list or localized value.\n\n## Behaviour\n\nSend the product ids in the desired manual-sort order (array position becomes the sort position); products omitted from the list are disconnected.\n\nProducts that are not yours are ignored.\n\nRequires the `productGroups:write` scope.","security":[{"apiKey":[]}],"x-required-scope":"productGroups:write","responses":{"200":{"description":"Successful response.","headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductGroupsDetail"}}}},"400":{"description":"Invalid request data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}}},"403":{"description":"The API key lacks the required scope (`scope_denied`), or the operation is not permitted for this account (`operation_not_permitted`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"429":{"description":"The API key exceeded its request rate (`rate_limit_exceeded`) or its monthly quota (`quota_exceeded`). Both carry `Retry-After`; the `RateLimit-*` headers accompany `rate_limit_exceeded` only, since a spent quota says nothing about the bucket.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}}},"parameters":[{"name":"productGroupId","in":"path","required":true,"schema":{"type":"string","pattern":"^PG-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Product group identifier (PG-<uuid>).","examples":["PG-123e4567-e89b-12d3-a456-426614174000"],"example":"PG-123e4567-e89b-12d3-a456-426614174000"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductGroupsProductsRequest"}}}}},"post":{"summary":"Add Product Group Products","tags":["Product Groups"],"description":"Connect additional products without sending the whole list.\n\nUse this to add the supplied members without submitting the entire existing list. Review how matching IDs are handled below.\n\n## Behaviour\n\nIds already connected are ignored (no duplicates); new ids are appended after the current ones, in the order sent, taking the last manual-sort positions.\n\nProducts already connected keep their relative order.\n\nProducts that are not yours are ignored.\n\nRequires the `productGroups:write` scope.","security":[{"apiKey":[]}],"x-required-scope":"productGroups:write","responses":{"200":{"description":"Successful response.","headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductGroupsDetail"}}}},"400":{"description":"Invalid request data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}}},"403":{"description":"The API key lacks the required scope (`scope_denied`), or the operation is not permitted for this account (`operation_not_permitted`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"429":{"description":"The API key exceeded its request rate (`rate_limit_exceeded`) or its monthly quota (`quota_exceeded`). Both carry `Retry-After`; the `RateLimit-*` headers accompany `rate_limit_exceeded` only, since a spent quota says nothing about the bucket.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}}},"parameters":[{"name":"productGroupId","in":"path","required":true,"schema":{"type":"string","pattern":"^PG-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Product group identifier (PG-<uuid>).","examples":["PG-123e4567-e89b-12d3-a456-426614174000"],"example":"PG-123e4567-e89b-12d3-a456-426614174000"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductGroupsProductsRequest2"}}}}}},"/v1/product-groups/{productGroupId}/products:remove":{"post":{"summary":"Remove Product Group Products","tags":["Product Groups"],"description":"Disconnect a subset of products by id.\n\nUse this to remove selected relationships without replacing the remaining list. It does not delete the referenced resources themselves.\n\n## Behaviour\n\nIds that are not connected are ignored.\n\nThe remaining products keep their relative manual-sort order.\n\nRequires the `productGroups:write` scope.","security":[{"apiKey":[]}],"x-required-scope":"productGroups:write","responses":{"200":{"description":"Successful response.","headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductGroupsDetail"}}}},"400":{"description":"Invalid request data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}}},"403":{"description":"The API key lacks the required scope (`scope_denied`), or the operation is not permitted for this account (`operation_not_permitted`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"429":{"description":"The API key exceeded its request rate (`rate_limit_exceeded`) or its monthly quota (`quota_exceeded`). Both carry `Retry-After`; the `RateLimit-*` headers accompany `rate_limit_exceeded` only, since a spent quota says nothing about the bucket.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}}},"parameters":[{"name":"productGroupId","in":"path","required":true,"schema":{"type":"string","pattern":"^PG-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Product group identifier (PG-<uuid>).","examples":["PG-123e4567-e89b-12d3-a456-426614174000"],"example":"PG-123e4567-e89b-12d3-a456-426614174000"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductGroupsProductsRemoveRequest"}}}}}},"/v1/product-groups/{productGroupId}/companies":{"put":{"summary":"Update Product Group Companies","tags":["Product Groups"],"description":"Replace the full list of connected companies (`SHARED` groups only; returns 400 for an `EMBED` group).\n\nRead the existing product group first. Check the replacement rules below before sending a partial list or localized value.\n\n## Behaviour\n\nCompanies omitted from the list are disconnected; companies that are not yours are ignored.\n\nEvery company you list must already have an API key, otherwise the call returns 400 `company_api_key_missing` naming the ones that do not — sharing has no effect without one.\n\nRequires the `productGroups:write` scope.","security":[{"apiKey":[]}],"x-required-scope":"productGroups:write","responses":{"200":{"description":"Successful response.","headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductGroupsDetail"}}}},"400":{"description":"Invalid request data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}}},"403":{"description":"The API key lacks the required scope (`scope_denied`), or the operation is not permitted for this account (`operation_not_permitted`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"429":{"description":"The API key exceeded its request rate (`rate_limit_exceeded`) or its monthly quota (`quota_exceeded`). Both carry `Retry-After`; the `RateLimit-*` headers accompany `rate_limit_exceeded` only, since a spent quota says nothing about the bucket.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}}},"parameters":[{"name":"productGroupId","in":"path","required":true,"schema":{"type":"string","pattern":"^PG-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Product group identifier (PG-<uuid>).","examples":["PG-123e4567-e89b-12d3-a456-426614174000"],"example":"PG-123e4567-e89b-12d3-a456-426614174000"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductGroupsCompaniesRequest"}}}}},"post":{"summary":"Add Product Group Companies","tags":["Product Groups"],"description":"Connect additional companies without sending the whole list (`SHARED` groups only; returns 400 for an `EMBED` group).\n\nUse this to add the supplied members without submitting the entire existing list. Review how matching IDs are handled below.\n\n## Behaviour\n\nIds already connected are ignored; companies that are not yours are ignored.\n\nEvery company you list must already have an API key, otherwise the call returns 400 `company_api_key_missing` naming the ones that do not.\n\nConnected products are left untouched.\n\nRequires the `productGroups:write` scope.","security":[{"apiKey":[]}],"x-required-scope":"productGroups:write","responses":{"200":{"description":"Successful response.","headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductGroupsDetail"}}}},"400":{"description":"Invalid request data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}}},"403":{"description":"The API key lacks the required scope (`scope_denied`), or the operation is not permitted for this account (`operation_not_permitted`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"429":{"description":"The API key exceeded its request rate (`rate_limit_exceeded`) or its monthly quota (`quota_exceeded`). Both carry `Retry-After`; the `RateLimit-*` headers accompany `rate_limit_exceeded` only, since a spent quota says nothing about the bucket.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}}},"parameters":[{"name":"productGroupId","in":"path","required":true,"schema":{"type":"string","pattern":"^PG-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Product group identifier (PG-<uuid>).","examples":["PG-123e4567-e89b-12d3-a456-426614174000"],"example":"PG-123e4567-e89b-12d3-a456-426614174000"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductGroupsCompaniesRequest2"}}}}}},"/v1/product-groups/{productGroupId}/companies:remove":{"post":{"summary":"Remove Product Group Companies","tags":["Product Groups"],"description":"Disconnect a subset of companies by id (`SHARED` groups only; returns 400 for an `EMBED` group).\n\nUse this to remove selected relationships without replacing the remaining list. It does not delete the referenced resources themselves.\n\n## Behaviour\n\nIds that are not connected are ignored.\n\nConnected products are left untouched.\n\nRequires the `productGroups:write` scope.","security":[{"apiKey":[]}],"x-required-scope":"productGroups:write","responses":{"200":{"description":"Successful response.","headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductGroupsDetail"}}}},"400":{"description":"Invalid request data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}}},"403":{"description":"The API key lacks the required scope (`scope_denied`), or the operation is not permitted for this account (`operation_not_permitted`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"429":{"description":"The API key exceeded its request rate (`rate_limit_exceeded`) or its monthly quota (`quota_exceeded`). Both carry `Retry-After`; the `RateLimit-*` headers accompany `rate_limit_exceeded` only, since a spent quota says nothing about the bucket.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}}},"parameters":[{"name":"productGroupId","in":"path","required":true,"schema":{"type":"string","pattern":"^PG-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Product group identifier (PG-<uuid>).","examples":["PG-123e4567-e89b-12d3-a456-426614174000"],"example":"PG-123e4567-e89b-12d3-a456-426614174000"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductGroupsCompaniesRemoveRequest"}}}}}},"/v1/product-groups/{productGroupId}/duplicate":{"post":{"summary":"Duplicate Product Group","tags":["Product Groups"],"description":"Duplicate a product group; returns the new id.\n\nUse this when starting a separate product group from an existing record. The result identifies the new record; read it before making further changes.\n\nRequires the `productGroups:write` scope.","security":[{"apiKey":[]}],"x-required-scope":"productGroups:write","responses":{"200":{"description":"Successful response.","headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductGroupsMutation"}}}},"400":{"description":"Invalid request data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}}},"403":{"description":"The API key lacks the required scope (`scope_denied`), or the operation is not permitted for this account (`operation_not_permitted`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"429":{"description":"The API key exceeded its request rate (`rate_limit_exceeded`) or its monthly quota (`quota_exceeded`). Both carry `Retry-After`; the `RateLimit-*` headers accompany `rate_limit_exceeded` only, since a spent quota says nothing about the bucket.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}}},"parameters":[{"name":"productGroupId","in":"path","required":true,"schema":{"type":"string","pattern":"^PG-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Product group identifier (PG-<uuid>).","examples":["PG-123e4567-e89b-12d3-a456-426614174000"],"example":"PG-123e4567-e89b-12d3-a456-426614174000"}}]}},"/v1/product-categories":{"get":{"summary":"List Product Categories","tags":["Product Categories"],"description":"List the customer's product categorys.\n\nUse the returned IDs to inspect individual product categorys before editing them.\n\n## Behaviour\n\nFilter by name with `search`; the name comes back translated — to `lang` when given, otherwise to your customer's default language.\n\nThe full `{ language: text }` map is a detail-read feature; the list is always translated.\n\nCursor-paginated.\n\nRequires the `productCategories:read` scope.","security":[{"apiKey":[]}],"x-required-scope":"productCategories:read","responses":{"200":{"description":"Successful response.","headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductCategoriesList"}}}},"400":{"description":"Invalid request data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}}},"403":{"description":"The API key lacks the required scope (`scope_denied`), or the operation is not permitted for this account (`operation_not_permitted`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"429":{"description":"The API key exceeded its request rate (`rate_limit_exceeded`) or its monthly quota (`quota_exceeded`). Both carry `Retry-After`; the `RateLimit-*` headers accompany `rate_limit_exceeded` only, since a spent quota says nothing about the bucket.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}}},"parameters":[{"name":"limit","in":"query","required":false,"schema":{"default":50,"type":"integer","minimum":1,"maximum":5000}},{"name":"cursor","in":"query","required":false,"schema":{"type":"string","minLength":1}},{"name":"search","in":"query","required":false,"schema":{"type":"string","minLength":1,"description":"Substring match on the category name."}},{"name":"lang","in":"query","required":false,"schema":{"type":"string","minLength":2,"maxLength":10,"description":"Language code to translate localized fields to (falls back if unavailable).","examples":["en"],"example":"en"}}]},"post":{"summary":"Create Product Category","tags":["Product Categories"],"description":"Create a product category.\n\nUse this to create a reusable product category in your account. Inspect the returned record before continuing the synchronization.\n\n## Behaviour\n\nOnly the localized name and unique code are required; you may also set a parent (must be one of your categories) and pass the general fields (status) and connected products to build the whole category in one call.\n\nExtras are applied by a follow-up update after the category exists; if that step fails the category is still created and the response shows it without them.\n\nNew categories default to `INACTIVE`.\n\nReturns 409 if the code is taken.\n\nRequires the `productCategories:write` scope.","security":[{"apiKey":[]}],"x-required-scope":"productCategories:write","responses":{"201":{"description":"Created.","headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductCategoriesMutation"}}}},"400":{"description":"Invalid request data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}}},"403":{"description":"The API key lacks the required scope (`scope_denied`), or the operation is not permitted for this account (`operation_not_permitted`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"409":{"description":"Conflict with the current state (e.g. the resource already exists).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"429":{"description":"The API key exceeded its request rate (`rate_limit_exceeded`) or its monthly quota (`quota_exceeded`). Both carry `Retry-After`; the `RateLimit-*` headers accompany `rate_limit_exceeded` only, since a spent quota says nothing about the bucket.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductCategoriesCreateRequest"}}}}}},"/v1/product-categories/{productCategoryId}":{"get":{"summary":"Get Product Category","tags":["Product Categories"],"description":"Get a product category with its connected products (read-only).\n\nRead this detail before editing the product category so that existing fields and relationships can be preserved.\n\n## Behaviour\n\nThe name is translated to `lang`; omit `lang` to get the full `{ language: text }` map instead — the update takes the whole map, so renaming one language means sending the others back with it.\n\nRequires the `productCategories:read` scope.","security":[{"apiKey":[]}],"x-required-scope":"productCategories:read","responses":{"200":{"description":"Successful response.","headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductCategoriesDetail"}}}},"400":{"description":"Invalid request data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}}},"403":{"description":"The API key lacks the required scope (`scope_denied`), or the operation is not permitted for this account (`operation_not_permitted`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"429":{"description":"The API key exceeded its request rate (`rate_limit_exceeded`) or its monthly quota (`quota_exceeded`). Both carry `Retry-After`; the `RateLimit-*` headers accompany `rate_limit_exceeded` only, since a spent quota says nothing about the bucket.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}}},"parameters":[{"name":"productCategoryId","in":"path","required":true,"schema":{"type":"string","pattern":"^PC-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Product category identifier (PC-<uuid>).","examples":["PC-123e4567-e89b-12d3-a456-426614174000"],"example":"PC-123e4567-e89b-12d3-a456-426614174000"}},{"name":"lang","in":"query","required":false,"schema":{"type":"string","minLength":2,"maxLength":10,"description":"Language code to translate localized fields to (falls back if unavailable).","examples":["en"],"example":"en"}}]},"put":{"summary":"Update Product Category","tags":["Product Categories"],"description":"Update the general fields (localized name, code, parent, status).\n\nRead the existing product category first. Check the replacement rules below before sending a partial list or localized value.\n\n## Behaviour\n\nOnly the fields you send are changed; omitted fields keep their stored value.\n\nConnected products are preserved. 409 if the code is taken.\n\nRequires the `productCategories:write` scope.","security":[{"apiKey":[]}],"x-required-scope":"productCategories:write","responses":{"200":{"description":"Successful response.","headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductCategoriesDetail"}}}},"400":{"description":"Invalid request data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}}},"403":{"description":"The API key lacks the required scope (`scope_denied`), or the operation is not permitted for this account (`operation_not_permitted`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"409":{"description":"Conflict with the current state (e.g. the resource already exists).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"429":{"description":"The API key exceeded its request rate (`rate_limit_exceeded`) or its monthly quota (`quota_exceeded`). Both carry `Retry-After`; the `RateLimit-*` headers accompany `rate_limit_exceeded` only, since a spent quota says nothing about the bucket.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}}},"parameters":[{"name":"productCategoryId","in":"path","required":true,"schema":{"type":"string","pattern":"^PC-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Product category identifier (PC-<uuid>).","examples":["PC-123e4567-e89b-12d3-a456-426614174000"],"example":"PC-123e4567-e89b-12d3-a456-426614174000"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductCategoriesUpdateRequest"}}}}}},"/v1/product-categories/{productCategoryId}/products":{"put":{"summary":"Update Product Category Products","tags":["Product Categories"],"description":"Replace the full list of products in the category.\n\nRead the existing product category first. Check the replacement rules below before sending a partial list or localized value.\n\n## Behaviour\n\nProducts omitted from the list are removed; products that are not yours are ignored.\n\nRequires the `productCategories:write` scope.","security":[{"apiKey":[]}],"x-required-scope":"productCategories:write","responses":{"200":{"description":"Successful response.","headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductCategoriesDetail"}}}},"400":{"description":"Invalid request data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}}},"403":{"description":"The API key lacks the required scope (`scope_denied`), or the operation is not permitted for this account (`operation_not_permitted`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"429":{"description":"The API key exceeded its request rate (`rate_limit_exceeded`) or its monthly quota (`quota_exceeded`). Both carry `Retry-After`; the `RateLimit-*` headers accompany `rate_limit_exceeded` only, since a spent quota says nothing about the bucket.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}}},"parameters":[{"name":"productCategoryId","in":"path","required":true,"schema":{"type":"string","pattern":"^PC-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Product category identifier (PC-<uuid>).","examples":["PC-123e4567-e89b-12d3-a456-426614174000"],"example":"PC-123e4567-e89b-12d3-a456-426614174000"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductCategoriesProductsRequest"}}}}},"post":{"summary":"Add Product Category Products","tags":["Product Categories"],"description":"Add products to the category without sending the whole list.\n\nUse this to add the supplied members without submitting the entire existing list. Review how matching IDs are handled below.\n\n## Behaviour\n\nIds already connected are ignored, so the call is idempotent and never creates duplicates.\n\nProducts that are not yours are ignored.\n\nRequires the `productCategories:write` scope.","security":[{"apiKey":[]}],"x-required-scope":"productCategories:write","responses":{"200":{"description":"Successful response.","headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductCategoriesDetail"}}}},"400":{"description":"Invalid request data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}}},"403":{"description":"The API key lacks the required scope (`scope_denied`), or the operation is not permitted for this account (`operation_not_permitted`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"429":{"description":"The API key exceeded its request rate (`rate_limit_exceeded`) or its monthly quota (`quota_exceeded`). Both carry `Retry-After`; the `RateLimit-*` headers accompany `rate_limit_exceeded` only, since a spent quota says nothing about the bucket.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}}},"parameters":[{"name":"productCategoryId","in":"path","required":true,"schema":{"type":"string","pattern":"^PC-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Product category identifier (PC-<uuid>).","examples":["PC-123e4567-e89b-12d3-a456-426614174000"],"example":"PC-123e4567-e89b-12d3-a456-426614174000"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductCategoriesProductsRequest2"}}}}}},"/v1/product-categories/{productCategoryId}/products:remove":{"post":{"summary":"Remove Product Category Products","tags":["Product Categories"],"description":"Remove a subset of products from the category by id.\n\nUse this to remove selected relationships without replacing the remaining list. It does not delete the referenced resources themselves.\n\n## Behaviour\n\nIds that are not connected are ignored.\n\nRequires the `productCategories:write` scope.","security":[{"apiKey":[]}],"x-required-scope":"productCategories:write","responses":{"200":{"description":"Successful response.","headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductCategoriesDetail"}}}},"400":{"description":"Invalid request data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}}},"403":{"description":"The API key lacks the required scope (`scope_denied`), or the operation is not permitted for this account (`operation_not_permitted`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"429":{"description":"The API key exceeded its request rate (`rate_limit_exceeded`) or its monthly quota (`quota_exceeded`). Both carry `Retry-After`; the `RateLimit-*` headers accompany `rate_limit_exceeded` only, since a spent quota says nothing about the bucket.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}}},"parameters":[{"name":"productCategoryId","in":"path","required":true,"schema":{"type":"string","pattern":"^PC-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Product category identifier (PC-<uuid>).","examples":["PC-123e4567-e89b-12d3-a456-426614174000"],"example":"PC-123e4567-e89b-12d3-a456-426614174000"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductCategoriesProductsRemoveRequest"}}}}}},"/v1/products":{"get":{"summary":"List Products","tags":["Products"],"description":"List products.\n\nUse this as the discovery step for a catalogue integration. Pass a returned productId to Get Product for full configuration data.\n\n## Behaviour\n\nFilter by text, status, type, mode, privacy, ownership, visibility, lifecycle dates, or variant code; repeat `mode`, `privacy`, and `variantType` to match multiple values.\n\nOnly a product shared with you can be broken, so `isBroken=true` implies `isOwn=false` unless you send `isOwn` yourself; asking for `isBroken=true` with `isOwn=true` always answers with an empty page.\n\nResults are cursor-paginated.\n\nRequires the `products:read` scope.","security":[{"apiKey":[]}],"x-required-scope":"products:read","responses":{"200":{"description":"Successful response.","headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductsList"}}}},"400":{"description":"Invalid request data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}}},"403":{"description":"The API key lacks the required scope (`scope_denied`), or the operation is not permitted for this account (`operation_not_permitted`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"429":{"description":"The API key exceeded its request rate (`rate_limit_exceeded`) or its monthly quota (`quota_exceeded`). Both carry `Retry-After`; the `RateLimit-*` headers accompany `rate_limit_exceeded` only, since a spent quota says nothing about the bucket.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}}},"parameters":[{"name":"limit","in":"query","required":false,"schema":{"default":50,"type":"integer","minimum":1,"maximum":5000}},{"name":"cursor","in":"query","required":false,"schema":{"type":"string","minLength":1}},{"name":"lang","in":"query","required":false,"schema":{"type":"string","minLength":2,"maxLength":10,"description":"Language code to translate localized fields to (falls back if unavailable).","examples":["en"],"example":"en"}},{"name":"search","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":255}},{"name":"status","in":"query","required":false,"schema":{"type":"string","enum":["ACTIVE","INACTIVE"]}},{"name":"mode","in":"query","required":false,"schema":{"type":"array","items":{"type":"string","enum":["STANDARD","VARIANT","MODULAR","COMPONENT"]}}},{"name":"privacy","in":"query","required":false,"schema":{"type":"array","items":{"type":"string","enum":["PUBLIC","PRIVATE","RESTRICTED_TO"]}}},{"name":"type","in":"query","required":false,"schema":{"type":"string","enum":["2D","3D"]}},{"name":"variantType","in":"query","required":false,"schema":{"type":"array","items":{"type":"string","enum":["STANDARD","HYBRID"]}}},{"name":"visibility","in":"query","required":false,"schema":{"type":"string","enum":["true","false"]}},{"name":"isOwn","in":"query","required":false,"schema":{"type":"string","enum":["true","false"]}},{"name":"isSharedWithOthers","in":"query","required":false,"schema":{"type":"string","enum":["true","false"]}},{"name":"isBroken","in":"query","required":false,"schema":{"type":"string","enum":["true","false"]}},{"name":"variantCode","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":255}},{"name":"createdFrom","in":"query","required":false,"schema":{"type":"string"}},{"name":"createdTo","in":"query","required":false,"schema":{"type":"string"}},{"name":"modifiedFrom","in":"query","required":false,"schema":{"type":"string"}},{"name":"modifiedTo","in":"query","required":false,"schema":{"type":"string"}}]}},"/v1/products/{productId}/related":{"get":{"summary":"List Related Products","tags":["Products"],"description":"Read the products related to a selected configurable product. Use a productId returned by List Products.\n\nRelated-product names are resolved for the customer language. Use Get Product when full configuration data is needed for an individual related product.\n\nRequires the `products:read` scope.","security":[{"apiKey":[]}],"x-required-scope":"products:read","responses":{"200":{"description":"Successful response.","headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductsRelated"}}}},"400":{"description":"Invalid request data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}}},"403":{"description":"The API key lacks the required scope (`scope_denied`), or the operation is not permitted for this account (`operation_not_permitted`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"429":{"description":"The API key exceeded its request rate (`rate_limit_exceeded`) or its monthly quota (`quota_exceeded`). Both carry `Retry-After`; the `RateLimit-*` headers accompany `rate_limit_exceeded` only, since a spent quota says nothing about the bucket.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}}},"parameters":[{"name":"productId","in":"path","required":true,"schema":{"type":"string","pattern":"^PROD-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}},{"name":"lang","in":"query","required":false,"schema":{"type":"string","minLength":2,"maxLength":10,"description":"When set, localized fields including description use this language.","examples":["en"],"example":"en"}}]}},"/v1/products/{productId}":{"get":{"summary":"Get Product","tags":["Products"],"description":"Read the full configuration of a configurable product available to your Mimeeq account. Use a productId returned by List Products.\n\nThe response structure depends on the product and configurator type; inspect its actual fields before mapping it into another system. Supply lang for localized fields where supported. This endpoint does not edit the product.\n\nRequires the `products:read` scope.","security":[{"apiKey":[]}],"x-required-scope":"products:read","responses":{"200":{"description":"Successful response.","headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductsDetail"}}}},"400":{"description":"Invalid request data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}}},"403":{"description":"The API key lacks the required scope (`scope_denied`), or the operation is not permitted for this account (`operation_not_permitted`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"429":{"description":"The API key exceeded its request rate (`rate_limit_exceeded`) or its monthly quota (`quota_exceeded`). Both carry `Retry-After`; the `RateLimit-*` headers accompany `rate_limit_exceeded` only, since a spent quota says nothing about the bucket.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}}},"parameters":[{"name":"productId","in":"path","required":true,"schema":{"type":"string","pattern":"^PROD-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}},{"name":"lang","in":"query","required":false,"schema":{"type":"string","minLength":2,"maxLength":10,"description":"When set, localized fields including description use this language.","examples":["en"],"example":"en"}}]}},"/v1/files":{"post":{"summary":"Create Directory","tags":["Files"],"description":"Create an empty media-library directory.\n\nUse this to organize media before uploading files. Success returns 204 with no response body; list the parent directory to inspect its contents.\n\n## Behaviour\n\nSystem folders cannot be created.\n\nRequires the `files:write` scope.","security":[{"apiKey":[]}],"x-required-scope":"files:write","responses":{"204":{"description":"No content.","headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"400":{"description":"Invalid request data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}}},"403":{"description":"The API key lacks the required scope (`scope_denied`), or the operation is not permitted for this account (`operation_not_permitted`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"429":{"description":"The API key exceeded its request rate (`rate_limit_exceeded`) or its monthly quota (`quota_exceeded`). Both carry `Retry-After`; the `RateLimit-*` headers accompany `rate_limit_exceeded` only, since a spent quota says nothing about the bucket.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FilesCreateRequest"}}}}},"get":{"summary":"List Files","tags":["Files"],"description":"List the immediate files and directories in a media-library directory.\n\nUse this to browse one directory. Search Files is the separate operation for finding entries below a directory.\n\n## Behaviour\n\nUse `directoryPath` to navigate between directories; results are cursor-paginated.\n\nRequires the `files:read` scope.","security":[{"apiKey":[]}],"x-required-scope":"files:read","responses":{"200":{"description":"Successful response.","headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FilesList"}}}},"400":{"description":"Invalid request data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}}},"403":{"description":"The API key lacks the required scope (`scope_denied`), or the operation is not permitted for this account (`operation_not_permitted`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"429":{"description":"The API key exceeded its request rate (`rate_limit_exceeded`) or its monthly quota (`quota_exceeded`). Both carry `Retry-After`; the `RateLimit-*` headers accompany `rate_limit_exceeded` only, since a spent quota says nothing about the bucket.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}}},"parameters":[{"name":"directoryPath","in":"query","required":false,"schema":{"type":"string","maxLength":1024}},{"name":"createdFrom","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"}]}},{"name":"createdTo","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"}]}},{"name":"type","in":"query","required":false,"schema":{"type":"string","enum":["file","directory"]}},{"name":"limit","in":"query","required":false,"schema":{"default":50,"type":"integer","minimum":1,"maximum":5000}},{"name":"cursor","in":"query","required":false,"schema":{"type":"string","minLength":1}}]},"patch":{"summary":"Rename File or Directory","tags":["Files"],"description":"Rename a media-library file or directory.\n\nUse the entry type and path to target the correct library record. This changes its name; use Move Files or Directories to change its location. Success returns 204 with no response body.\n\nRequires the `files:write` scope.","security":[{"apiKey":[]}],"x-required-scope":"files:write","responses":{"204":{"description":"No content.","headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"400":{"description":"Invalid request data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}}},"403":{"description":"The API key lacks the required scope (`scope_denied`), or the operation is not permitted for this account (`operation_not_permitted`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"429":{"description":"The API key exceeded its request rate (`rate_limit_exceeded`) or its monthly quota (`quota_exceeded`). Both carry `Retry-After`; the `RateLimit-*` headers accompany `rate_limit_exceeded` only, since a spent quota says nothing about the bucket.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FilesRequest"}}}}},"delete":{"summary":"Delete File","tags":["Files"],"description":"Soft-delete selected media-library files and directories.\n\nUse this only for library entries you intend to remove. The files:delete scope is required. Success returns 204 with no response body.\n\n## Behaviour\n\nRoot and system folders cannot be deleted.\n\nRequires the `files:delete` scope.","security":[{"apiKey":[]}],"x-required-scope":"files:delete","responses":{"204":{"description":"No content.","headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"400":{"description":"Invalid request data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}}},"403":{"description":"The API key lacks the required scope (`scope_denied`), or the operation is not permitted for this account (`operation_not_permitted`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"429":{"description":"The API key exceeded its request rate (`rate_limit_exceeded`) or its monthly quota (`quota_exceeded`). Both carry `Retry-After`; the `RateLimit-*` headers accompany `rate_limit_exceeded` only, since a spent quota says nothing about the bucket.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FilesRequest2"}}}}}},"/v1/files/move":{"post":{"summary":"Move Files or Directories","tags":["Files"],"description":"Move media-library files or directories to another directory.\n\nUse the source entry paths and destination directory to reorganize the library. Success returns 204 with no response body.\n\n## Behaviour\n\nFiles cannot be moved into system folders.\n\nRequires the `files:write` scope.","security":[{"apiKey":[]}],"x-required-scope":"files:write","responses":{"204":{"description":"No content.","headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"400":{"description":"Invalid request data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}}},"403":{"description":"The API key lacks the required scope (`scope_denied`), or the operation is not permitted for this account (`operation_not_permitted`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"429":{"description":"The API key exceeded its request rate (`rate_limit_exceeded`) or its monthly quota (`quota_exceeded`). Both carry `Retry-After`; the `RateLimit-*` headers accompany `rate_limit_exceeded` only, since a spent quota says nothing about the bucket.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FilesMoveRequest"}}}}}},"/v1/files/copy":{"post":{"summary":"Copy Files or Directories","tags":["Files"],"description":"Copy media-library files or directories to another directory.\n\nUse this to duplicate library entries into another directory while retaining their sources. Success returns 204 with no response body.\n\n## Behaviour\n\nFiles cannot be copied into system folders.\n\nRequires the `files:write` scope.","security":[{"apiKey":[]}],"x-required-scope":"files:write","responses":{"204":{"description":"No content.","headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"400":{"description":"Invalid request data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}}},"403":{"description":"The API key lacks the required scope (`scope_denied`), or the operation is not permitted for this account (`operation_not_permitted`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"429":{"description":"The API key exceeded its request rate (`rate_limit_exceeded`) or its monthly quota (`quota_exceeded`). Both carry `Retry-After`; the `RateLimit-*` headers accompany `rate_limit_exceeded` only, since a spent quota says nothing about the bucket.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FilesCopyRequest"}}}}}},"/v1/files/pod-assets":{"post":{"summary":"Download PoD Assets","tags":["Files"],"description":"Create a ZIP download of the print-on-demand (PoD) artwork uploaded for one product configuration.\n\nUse this to retrieve the customer-uploaded artwork for one saved configuration, for example before a print-production handoff.\n\n## Behaviour\n\n`shortCode` is the short code of the selected product configuration — the code Mimeeq generates when a configuration is saved or shared, also returned as `shortCode` on cart items.\n\nA product ID, embed short code or option-set code is not accepted.\n\nThe ZIP holds one folder per PoD block of the configuration.\n\nThe response `url` is a signed link valid for 24 hours.\n\n`404 product_not_found` when no configuration has that short code; `404 not_found` when the configuration has no uploaded PoD artwork.\n\nRequires the `files:read` scope.","security":[{"apiKey":[]}],"x-required-scope":"files:read","responses":{"200":{"description":"Successful response.","headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FilesPodAssets"}}}},"400":{"description":"Invalid request data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}}},"403":{"description":"The API key lacks the required scope (`scope_denied`), or the operation is not permitted for this account (`operation_not_permitted`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"429":{"description":"The API key exceeded its request rate (`rate_limit_exceeded`) or its monthly quota (`quota_exceeded`). Both carry `Retry-After`; the `RateLimit-*` headers accompany `rate_limit_exceeded` only, since a spent quota says nothing about the bucket.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FilesPodAssetsRequest"}}}}}},"/v1/files/upload":{"post":{"summary":"Upload File","tags":["Files"],"description":"Upload one file to a media-library directory.\n\nSend one file using multipart/form-data and optionally `directoryPath` (the root is the default). The maximum file size is 25 MiB. This operation uploads library media; it does not create a Gallery.\n\nRequires the `files:write` scope.","security":[{"apiKey":[]}],"x-required-scope":"files:write","responses":{"201":{"description":"Created.","headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FilesDetail"}}}},"400":{"description":"Invalid request data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}}},"403":{"description":"The API key lacks the required scope (`scope_denied`), or the operation is not permitted for this account (`operation_not_permitted`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"413":{"description":"Request body exceeds the supported size.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"429":{"description":"The API key exceeded its request rate (`rate_limit_exceeded`) or its monthly quota (`quota_exceeded`). Both carry `Retry-After`; the `RateLimit-*` headers accompany `rate_limit_exceeded` only, since a spent quota says nothing about the bucket.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}}},"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","required":["file"],"properties":{"file":{"type":"string","format":"binary"},"directoryPath":{"type":"string","default":"/"}}}}}}}},"/v1/files/download":{"post":{"summary":"Download Files as ZIP","tags":["Files"],"description":"Create a ZIP download of selected media-library files and directories.\n\nProvide a non-empty list of file or directory entries. Each file needs its `assetId` and path; directories use their path. The response supplies a download URL.\n\nRequires the `files:read` scope.","security":[{"apiKey":[]}],"x-required-scope":"files:read","responses":{"200":{"description":"Successful response.","headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FilesDownload"}}}},"400":{"description":"Invalid request data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}}},"403":{"description":"The API key lacks the required scope (`scope_denied`), or the operation is not permitted for this account (`operation_not_permitted`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"429":{"description":"The API key exceeded its request rate (`rate_limit_exceeded`) or its monthly quota (`quota_exceeded`). Both carry `Retry-After`; the `RateLimit-*` headers accompany `rate_limit_exceeded` only, since a spent quota says nothing about the bucket.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FilesDownloadRequest"}}}}}},"/v1/files/search":{"get":{"summary":"Search Files","tags":["Files"],"description":"Search files and directories below a media-library directory.\n\nProvide query and optionally `directoryPath`, entry type and creation-date bounds. Results are cursor-paginated.\n\nRequires the `files:read` scope.","security":[{"apiKey":[]}],"x-required-scope":"files:read","responses":{"200":{"description":"Successful response.","headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FilesList"}}}},"400":{"description":"Invalid request data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}}},"403":{"description":"The API key lacks the required scope (`scope_denied`), or the operation is not permitted for this account (`operation_not_permitted`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"429":{"description":"The API key exceeded its request rate (`rate_limit_exceeded`) or its monthly quota (`quota_exceeded`). Both carry `Retry-After`; the `RateLimit-*` headers accompany `rate_limit_exceeded` only, since a spent quota says nothing about the bucket.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}}},"parameters":[{"name":"directoryPath","in":"query","required":false,"schema":{"type":"string","maxLength":1024}},{"name":"query","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":1024}},{"name":"createdFrom","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"}]}},{"name":"createdTo","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"}]}},{"name":"type","in":"query","required":false,"schema":{"type":"string","enum":["file","directory"]}},{"name":"limit","in":"query","required":false,"schema":{"default":50,"type":"integer","minimum":1,"maximum":5000}},{"name":"cursor","in":"query","required":false,"schema":{"type":"string","minLength":1}}]}},"/v1/files/lookup":{"get":{"summary":"Get File Details","tags":["Files"],"description":"Get a media-library file by its asset ID and directory path, or by its S3 path.\n\nSupply either `s3Path` alone, or `assetId` together with `directoryPath`. Use values returned by the library rather than constructing asset identifiers.\n\nRequires the `files:read` scope.","security":[{"apiKey":[]}],"x-required-scope":"files:read","responses":{"200":{"description":"Successful response.","headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FilesDetail"}}}},"400":{"description":"Invalid request data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}}},"403":{"description":"The API key lacks the required scope (`scope_denied`), or the operation is not permitted for this account (`operation_not_permitted`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"429":{"description":"The API key exceeded its request rate (`rate_limit_exceeded`) or its monthly quota (`quota_exceeded`). Both carry `Retry-After`; the `RateLimit-*` headers accompany `rate_limit_exceeded` only, since a spent quota says nothing about the bucket.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}}},"parameters":[{"name":"assetId","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":1024}},{"name":"directoryPath","in":"query","required":false,"schema":{"type":"string","maxLength":1024}},{"name":"s3Path","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":2048}}]}},"/v1/quotations":{"get":{"summary":"List Quotations","tags":["Quotations"],"description":"List non-archived quotations.\n\nUse this to synchronize a sales pipeline. The since and until filters refer to expected close dates, not creation timestamps.\n\n## Behaviour\n\nOptionally filter by repeated `status` or `ownerId`, by `companyId`, or by `since`/`until` expected-close dates.\n\nResults are cursor-paginated.\n\nRequires the `quotations:read` scope.","security":[{"apiKey":[]}],"x-required-scope":"quotations:read","responses":{"200":{"description":"Successful response.","headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuotationsList"}}}},"400":{"description":"Invalid request data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}}},"403":{"description":"The API key lacks the required scope (`scope_denied`), or the operation is not permitted for this account (`operation_not_permitted`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"429":{"description":"The API key exceeded its request rate (`rate_limit_exceeded`) or its monthly quota (`quota_exceeded`). Both carry `Retry-After`; the `RateLimit-*` headers accompany `rate_limit_exceeded` only, since a spent quota says nothing about the bucket.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}}},"parameters":[{"name":"limit","in":"query","required":false,"schema":{"default":50,"type":"integer","minimum":1,"maximum":5000}},{"name":"cursor","in":"query","required":false,"schema":{"type":"string","minLength":1}},{"name":"status","in":"query","required":false,"schema":{"type":"array","items":{"type":"string","enum":["OPEN","WON","LOST"]}}},{"name":"ownerId","in":"query","required":false,"schema":{"type":"array","items":{"type":"string"}}},{"name":"companyId","in":"query","required":false,"schema":{"type":"string","pattern":"^COMP-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}},{"name":"since","in":"query","required":false,"schema":{"type":"string","minLength":1}},{"name":"until","in":"query","required":false,"schema":{"type":"string","minLength":1}}]}},"/v1/quotations/owners":{"get":{"summary":"List Quotation Owners","tags":["Quotations"],"description":"List available quotation owners for your customer.\n\nUse these IDs to narrow a quotation synchronization to one or more owners; this operation does not assign an owner.\n\n## Behaviour\n\nUse the returned user ids with the quotation list's `ownerId` filter.\n\nRequires the `quotations:read` scope.","security":[{"apiKey":[]}],"x-required-scope":"quotations:read","responses":{"200":{"description":"Successful response.","headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuotationsOwners"}}}},"400":{"description":"Invalid request data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}}},"403":{"description":"The API key lacks the required scope (`scope_denied`), or the operation is not permitted for this account (`operation_not_permitted`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"429":{"description":"The API key exceeded its request rate (`rate_limit_exceeded`) or its monthly quota (`quota_exceeded`). Both carry `Retry-After`; the `RateLimit-*` headers accompany `rate_limit_exceeded` only, since a spent quota says nothing about the bucket.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}}}}},"/v1/quotations/settings":{"get":{"summary":"List Quotation Settings","tags":["Quotations"],"description":"Get the customer-configured quotation stages and lost reasons.\n\nUse these reference values before setting a quotation’s stage or marking it lost.\n\n## Behaviour\n\nOmit `lang` to receive every translated name map; provide `lang` to receive each selected name with English fallback.\n\nRequires the `quotations:read` scope.","security":[{"apiKey":[]}],"x-required-scope":"quotations:read","responses":{"200":{"description":"Successful response.","headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuotationsSettings"}}}},"400":{"description":"Invalid request data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}}},"403":{"description":"The API key lacks the required scope (`scope_denied`), or the operation is not permitted for this account (`operation_not_permitted`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"429":{"description":"The API key exceeded its request rate (`rate_limit_exceeded`) or its monthly quota (`quota_exceeded`). Both carry `Retry-After`; the `RateLimit-*` headers accompany `rate_limit_exceeded` only, since a spent quota says nothing about the bucket.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}}},"parameters":[{"name":"lang","in":"query","required":false,"schema":{"type":"string","minLength":2,"maxLength":10,"description":"Language code to translate localized fields to (falls back if unavailable).","examples":["en"],"example":"en"}}]}},"/v1/quotations/{quotationId}":{"get":{"summary":"Get Quotation","tags":["Quotations"],"description":"Get a quotation and its selected version, including formatted content, gallery media, document references, version pricing, additional selling charges, and line selection details.\n\nUse this to read the commercial record and the selected version together. Use the versions endpoints when browsing or selecting version history.\n\n## Behaviour\n\nOptionally request a specific `versionId`; otherwise the current version is returned.\n\nThe top-level `price` is current quotation metadata; `version.pricing.total` is the selected version total.\n\nRequires the `quotations:read` scope.","security":[{"apiKey":[]}],"x-required-scope":"quotations:read","responses":{"200":{"description":"Successful response.","headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuotationsDetail"}}}},"400":{"description":"Invalid request data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}}},"403":{"description":"The API key lacks the required scope (`scope_denied`), or the operation is not permitted for this account (`operation_not_permitted`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"429":{"description":"The API key exceeded its request rate (`rate_limit_exceeded`) or its monthly quota (`quota_exceeded`). Both carry `Retry-After`; the `RateLimit-*` headers accompany `rate_limit_exceeded` only, since a spent quota says nothing about the bucket.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}}},"parameters":[{"name":"quotationId","in":"path","required":true,"schema":{"type":"string","pattern":"^QUOT-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}},{"name":"versionId","in":"query","required":false,"schema":{"type":"string","pattern":"^VERSION_\\d+$"}}]}},"/v1/quotations/{quotationId}/status":{"post":{"summary":"Set Quotation Status","tags":["Quotations"],"description":"Set a quotation status.\n\nUse this to synchronize a sales outcome. Read the quotation and its settings first; this changes the live quotation status.\n\n## Behaviour\n\nWON requires `versionId` and `acceptedByName`; LOST requires the configured `lostReasonId`.\n\nThe transition is applied to this quotation only.\n\nRequires the `quotations:write` scope.","security":[{"apiKey":[]}],"x-required-scope":"quotations:write","responses":{"200":{"description":"Successful response.","headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuotationsMutation"}}}},"400":{"description":"Invalid request data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}}},"403":{"description":"The API key lacks the required scope (`scope_denied`), or the operation is not permitted for this account (`operation_not_permitted`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"429":{"description":"The API key exceeded its request rate (`rate_limit_exceeded`) or its monthly quota (`quota_exceeded`). Both carry `Retry-After`; the `RateLimit-*` headers accompany `rate_limit_exceeded` only, since a spent quota says nothing about the bucket.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}}},"parameters":[{"name":"quotationId","in":"path","required":true,"schema":{"type":"string","pattern":"^QUOT-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuotationsStatusRequest"}}}}}},"/v1/quotations/{quotationId}/stage":{"post":{"summary":"Set Quotation Stage","tags":["Quotations"],"description":"Set a quotation stage by its customer-configured `stageId`.\n\nUse List Quotation Settings to obtain a valid `stageId` before changing the live quotation stage.\n\n## Behaviour\n\nAn unconfigured stage returns 422.\n\nRequires the `quotations:write` scope.","security":[{"apiKey":[]}],"x-required-scope":"quotations:write","responses":{"200":{"description":"Successful response.","headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuotationsMutation2"}}}},"400":{"description":"Invalid request data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}}},"403":{"description":"The API key lacks the required scope (`scope_denied`), or the operation is not permitted for this account (`operation_not_permitted`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"422":{"description":"Unprocessable entity (e.g. an unconfigured currency or quotation stage).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"429":{"description":"The API key exceeded its request rate (`rate_limit_exceeded`) or its monthly quota (`quota_exceeded`). Both carry `Retry-After`; the `RateLimit-*` headers accompany `rate_limit_exceeded` only, since a spent quota says nothing about the bucket.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}}},"parameters":[{"name":"quotationId","in":"path","required":true,"schema":{"type":"string","pattern":"^QUOT-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuotationsStageRequest"}}}}}},"/v1/quotations/{quotationId}/versions":{"get":{"summary":"List Quotation Versions","tags":["Quotations"],"description":"List all quotation versions, including inactive and draft versions.\n\nUse the returned `versionId` to retrieve a particular revision; a listed version is not necessarily the current or accepted one.\n\nRequires the `quotations:read` scope.","security":[{"apiKey":[]}],"x-required-scope":"quotations:read","responses":{"200":{"description":"Successful response.","headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuotationsVersions"}}}},"400":{"description":"Invalid request data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}}},"403":{"description":"The API key lacks the required scope (`scope_denied`), or the operation is not permitted for this account (`operation_not_permitted`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"429":{"description":"The API key exceeded its request rate (`rate_limit_exceeded`) or its monthly quota (`quota_exceeded`). Both carry `Retry-After`; the `RateLimit-*` headers accompany `rate_limit_exceeded` only, since a spent quota says nothing about the bucket.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}}},"parameters":[{"name":"quotationId","in":"path","required":true,"schema":{"type":"string","pattern":"^QUOT-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}}]}},"/v1/quotations/{quotationId}/versions/{versionId}":{"get":{"summary":"Get Quotation Version","tags":["Quotations"],"description":"Get a quotation version with formatted content, gallery media, document references, customer-facing pricing totals and additional charges, group totals, and unit and line product amounts.\n\nUse this when an integration must reproduce a specific quotation revision rather than whichever version is current.\n\nRequires the `quotations:read` scope.","security":[{"apiKey":[]}],"x-required-scope":"quotations:read","responses":{"200":{"description":"Successful response.","headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuotationsVersions2"}}}},"400":{"description":"Invalid request data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}}},"403":{"description":"The API key lacks the required scope (`scope_denied`), or the operation is not permitted for this account (`operation_not_permitted`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"429":{"description":"The API key exceeded its request rate (`rate_limit_exceeded`) or its monthly quota (`quota_exceeded`). Both carry `Retry-After`; the `RateLimit-*` headers accompany `rate_limit_exceeded` only, since a spent quota says nothing about the bucket.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}}},"parameters":[{"name":"quotationId","in":"path","required":true,"schema":{"type":"string","pattern":"^QUOT-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}},{"name":"versionId","in":"path","required":true,"schema":{"type":"string","pattern":"^VERSION_\\d+$"}}]}},"/v1/quotations/{quotationId}/notes":{"get":{"summary":"List Quotation Notes","tags":["Quotations"],"description":"List a quotation's notes, including attachments with public file URLs.\n\nUse these notes as supporting sales context. This operation reads notes; it does not add comments to the quotation.\n\nRequires the `quotations:read` scope.","security":[{"apiKey":[]}],"x-required-scope":"quotations:read","responses":{"200":{"description":"Successful response.","headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuotationsNotes"}}}},"400":{"description":"Invalid request data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}}},"403":{"description":"The API key lacks the required scope (`scope_denied`), or the operation is not permitted for this account (`operation_not_permitted`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"429":{"description":"The API key exceeded its request rate (`rate_limit_exceeded`) or its monthly quota (`quota_exceeded`). Both carry `Retry-After`; the `RateLimit-*` headers accompany `rate_limit_exceeded` only, since a spent quota says nothing about the bucket.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicError"}}},"headers":{"RateLimit-Limit":{"description":"Requests that can be admitted at once (the tier burst).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Tokens left after this request.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}}}}},"parameters":[{"name":"quotationId","in":"path","required":true,"schema":{"type":"string","pattern":"^QUOT-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}}]}}},"components":{"securitySchemes":{"apiKey":{"type":"http","scheme":"bearer","description":"API key sent as a bearer token (mk_live_… / mk_test_…)."}},"schemas":{"PublicError":{"description":"An API error response. Use code and the HTTP status to classify the failure, message and optional details for context, and requestId when reporting it. Edge firewall responses may omit requestId.","type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","description":"Present on every error the API itself returns; absent when the edge firewall rejected the request."},"details":{"description":"Optional error-specific details (e.g. per-field validation reasons)."}}},"CartsList":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"cartId":{"type":"string"},"status":{"type":"string","enum":["OPEN","SUBMITTED"]},"referenceCode":{"anyOf":[{"type":"string"},{"type":"null"}]},"contactId":{"anyOf":[{"type":"string"},{"type":"null"}]},"clientEmail":{"anyOf":[{"type":"string"},{"type":"null"}]},"currency":{"anyOf":[{"type":"string"},{"type":"null"}]},"totalValue":{"type":"number"},"totalAdditions":{"type":"number"},"finalPrice":{"type":"number"},"totalQuantity":{"type":"number"},"itemCount":{"type":"number"},"submissionData":{"anyOf":[{"type":"object","properties":{"fullName":{"type":"string"},"email":{"type":"string"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}]},"companyName":{"anyOf":[{"type":"string"},{"type":"null"}]},"address":{"anyOf":[{"type":"string"},{"type":"null"}]},"notes":{"anyOf":[{"type":"string"},{"type":"null"}]},"customFields":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}},"required":["fullName","email","phone","companyName","address","notes","customFields"],"additionalProperties":false},{"type":"null"}]},"createdAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO 8601 creation timestamp."},"modifiedAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO 8601 last-modified timestamp."},"submittedAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO 8601 submission timestamp, or null while the cart is still open."}},"required":["cartId","status","referenceCode","contactId","clientEmail","currency","totalValue","totalAdditions","finalPrice","totalQuantity","itemCount","submissionData","createdAt","modifiedAt","submittedAt"],"additionalProperties":false}},"page":{"type":"object","properties":{"limit":{"type":"number"},"nextCursor":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Cursor for the next page, or null on the last page."}},"required":["limit","nextCursor"],"additionalProperties":false}},"required":["data","page"],"additionalProperties":false,"description":"Data schema used by List Carts (GET /v1/carts). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"CartsDetail":{"type":"object","properties":{"data":{"type":"object","properties":{"cartId":{"type":"string"},"status":{"type":"string","enum":["OPEN","SUBMITTED"]},"referenceCode":{"anyOf":[{"type":"string"},{"type":"null"}]},"contactId":{"anyOf":[{"type":"string"},{"type":"null"}]},"clientEmail":{"anyOf":[{"type":"string"},{"type":"null"}]},"currency":{"anyOf":[{"type":"string"},{"type":"null"}]},"totalValue":{"type":"number"},"totalAdditions":{"type":"number"},"finalPrice":{"type":"number"},"totalQuantity":{"type":"number"},"submissionData":{"anyOf":[{"type":"object","properties":{"fullName":{"type":"string"},"email":{"type":"string"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}]},"companyName":{"anyOf":[{"type":"string"},{"type":"null"}]},"address":{"anyOf":[{"type":"string"},{"type":"null"}]},"notes":{"anyOf":[{"type":"string"},{"type":"null"}]},"customFields":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}},"required":["fullName","email","phone","companyName","address","notes","customFields"],"additionalProperties":false},{"type":"null"}]},"createdAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO 8601 creation timestamp."},"modifiedAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO 8601 last-modified timestamp."},"submittedAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO 8601 submission timestamp, or null while the cart is still open."},"companyId":{"anyOf":[{"type":"string"},{"type":"null"}]},"items":{"type":"array","items":{"type":"object","properties":{"cartItemId":{"type":"string"},"productId":{"type":"string"},"productName":{"type":"string"},"variantCode":{"anyOf":[{"type":"string"},{"type":"null"}]},"sku":{"anyOf":[{"type":"string"},{"type":"null"}]},"shortCode":{"anyOf":[{"type":"string"},{"type":"null"}]},"configurationCode":{"anyOf":[{"type":"string"},{"type":"null"}]},"quantity":{"type":"number"},"unitPrice":{"anyOf":[{"type":"number"},{"type":"string"}],"description":"Parsed numeric price, or a string sentinel when the source value is unparseable."},"price":{"anyOf":[{"type":"number"},{"type":"string"}],"description":"Parsed numeric price, or a string sentinel when the source value is unparseable."},"image":{"anyOf":[{"type":"string"},{"type":"null"}]},"note":{"anyOf":[{"type":"string"},{"type":"null"}]},"link":{"anyOf":[{"type":"string"},{"type":"null"}]},"specification":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}}},"required":["cartItemId","productId","productName","variantCode","sku","shortCode","configurationCode","quantity","unitPrice","price","image","note","link","specification"],"additionalProperties":false}},"priceModifiers":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"description":{"type":"string"},"mode":{"type":"string","enum":["FIXED","PERCENTAGE"]},"modifierValue":{"type":"number"},"type":{"type":"string","enum":["ADDITION","DISCOUNT"]},"calculatedValue":{"type":"number"}},"required":["name","description","mode","modifierValue","type","calculatedValue"],"additionalProperties":false}}},"required":["cartId","status","referenceCode","contactId","clientEmail","currency","totalValue","totalAdditions","finalPrice","totalQuantity","submissionData","createdAt","modifiedAt","submittedAt","companyId","items","priceModifiers"],"additionalProperties":false}},"required":["data"],"additionalProperties":false,"description":"Data schema used by Get Cart (GET /v1/carts/{cartId}). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"CompaniesList":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"companyId":{"type":"string","pattern":"^COMP-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Company identifier (COMP-<uuid>).","examples":["COMP-123e4567-e89b-12d3-a456-426614174000"],"example":"COMP-123e4567-e89b-12d3-a456-426614174000"},"companyNumericId":{"type":"number"},"companyName":{"type":"string"},"address":{"type":"object","properties":{"street":{"anyOf":[{"type":"string"},{"type":"null"}]},"city":{"anyOf":[{"type":"string"},{"type":"null"}]},"postcode":{"anyOf":[{"type":"string"},{"type":"null"}]},"country":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["street","city","postcode","country"],"additionalProperties":false},"email":{"anyOf":[{"type":"string"},{"type":"null"}]},"workNumber":{"anyOf":[{"type":"string"},{"type":"null"}]},"currency":{"anyOf":[{"type":"string"},{"type":"null"}]},"status":{"type":"string","enum":["ACTIVE","INACTIVE"]},"accountManagerId":{"anyOf":[{"type":"string"},{"type":"null"}]},"createdAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO 8601 creation timestamp."},"modifiedAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO 8601 last-modified timestamp."}},"required":["companyId","companyNumericId","companyName","address","email","workNumber","currency","status","accountManagerId","createdAt","modifiedAt"],"additionalProperties":false}},"page":{"type":"object","properties":{"limit":{"type":"number"},"nextCursor":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Cursor for the next page, or null on the last page."}},"required":["limit","nextCursor"],"additionalProperties":false}},"required":["data","page"],"additionalProperties":false,"description":"Data schema used by List Companies (GET /v1/companies). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"CompaniesMutation":{"type":"object","properties":{"data":{"type":"object","properties":{"companyId":{"type":"string","pattern":"^COMP-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Company identifier (COMP-<uuid>).","examples":["COMP-123e4567-e89b-12d3-a456-426614174000"],"example":"COMP-123e4567-e89b-12d3-a456-426614174000"},"status":{"type":"string","enum":["ACTIVE","INACTIVE"]},"companyName":{"type":"string"},"currency":{"type":"string"}},"required":["companyId","status","companyName","currency"],"additionalProperties":false}},"required":["data"],"additionalProperties":false,"description":"Data schema used by Create Company (POST /v1/companies). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"CompaniesCreateRequest":{"type":"object","properties":{"status":{"type":"string","enum":["ACTIVE","INACTIVE"]},"companyName":{"type":"string","minLength":1,"maxLength":255},"currency":{"type":"string","minLength":1,"maxLength":255},"address":{"type":"object","properties":{"street":{"type":"string","minLength":1,"maxLength":255},"city":{"type":"string","minLength":1,"maxLength":255},"postcode":{"type":"string","minLength":1,"maxLength":255},"country":{"type":"string","minLength":1,"maxLength":255}},"additionalProperties":false},"email":{"type":"string","minLength":1,"maxLength":255},"workNumber":{"type":"string","minLength":1,"maxLength":255},"accountManagerId":{"type":"string","pattern":"^USER-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"},"tags":{"description":"Up to 50 tags.","maxItems":50,"type":"array","items":{"type":"string","minLength":1,"maxLength":255}},"paymentTerms":{"type":"string","minLength":1,"maxLength":255},"deliveryAddresses":{"description":"Up to 50 delivery addresses.","maxItems":50,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"},"name":{"type":"string","minLength":1,"maxLength":255},"street":{"type":"string","minLength":1,"maxLength":255},"postcode":{"type":"string","minLength":1,"maxLength":255},"country":{"type":"string","minLength":1,"maxLength":255},"companyName":{"type":"string","minLength":1,"maxLength":255},"city":{"type":"string","minLength":1,"maxLength":255}},"additionalProperties":false}},"socials":{"description":"Up to 20 socials.","maxItems":20,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"},"type":{"type":"string","enum":["facebook","instagram","linkedin","twitter","pinterest","website","youtube","other"]},"address":{"type":"string","minLength":1,"maxLength":255}},"required":["type","address"],"additionalProperties":false}}},"required":["status","companyName","currency"],"additionalProperties":false,"description":"Data schema used by Create Company (POST /v1/companies). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"CompaniesDetail":{"type":"object","properties":{"data":{"type":"object","properties":{"companyId":{"type":"string","pattern":"^COMP-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Company identifier (COMP-<uuid>).","examples":["COMP-123e4567-e89b-12d3-a456-426614174000"],"example":"COMP-123e4567-e89b-12d3-a456-426614174000"},"companyNumericId":{"type":"number"},"status":{"type":"string","enum":["ACTIVE","INACTIVE"]},"companyName":{"type":"string"},"currency":{"anyOf":[{"type":"string"},{"type":"null"}]},"address":{"type":"object","properties":{"street":{"anyOf":[{"type":"string"},{"type":"null"}]},"city":{"anyOf":[{"type":"string"},{"type":"null"}]},"postcode":{"anyOf":[{"type":"string"},{"type":"null"}]},"country":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["street","city","postcode","country"],"additionalProperties":false},"email":{"anyOf":[{"type":"string"},{"type":"null"}]},"workNumber":{"anyOf":[{"type":"string"},{"type":"null"}]},"accountManagerId":{"anyOf":[{"type":"string"},{"type":"null"}]},"accountManager":{"anyOf":[{"type":"string"},{"type":"null"}]},"tags":{"type":"array","items":{"type":"string"}},"paymentTerms":{"anyOf":[{"type":"string"},{"type":"null"}]},"deliveryAddresses":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]},"street":{"anyOf":[{"type":"string"},{"type":"null"}]},"postcode":{"anyOf":[{"type":"string"},{"type":"null"}]},"country":{"anyOf":[{"type":"string"},{"type":"null"}]},"companyName":{"anyOf":[{"type":"string"},{"type":"null"}]},"city":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["id","name","street","postcode","country","companyName","city"],"additionalProperties":false}},"socials":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"type":{"type":"string","enum":["facebook","instagram","linkedin","twitter","pinterest","website","youtube","other"]},"address":{"type":"string"}},"required":["id","type","address"],"additionalProperties":false}},"contacts":{"type":"array","items":{"type":"object","properties":{"contactId":{"type":"string"},"firstName":{"anyOf":[{"type":"string"},{"type":"null"}]},"lastName":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["contactId","firstName","lastName"],"additionalProperties":false}},"priceLists":{"type":"array","items":{"type":"object","properties":{"priceListId":{"type":"string"},"priceListName":{"type":"string"},"status":{"type":"string"}},"required":["priceListId","priceListName","status"],"additionalProperties":false}},"createdAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO 8601 creation timestamp."},"modifiedAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO 8601 last-modified timestamp."}},"required":["companyId","companyNumericId","status","companyName","currency","address","email","workNumber","accountManagerId","accountManager","tags","paymentTerms","deliveryAddresses","socials","contacts","priceLists","createdAt","modifiedAt"],"additionalProperties":false}},"required":["data"],"additionalProperties":false,"description":"Data schema used by Get Company (GET /v1/companies/{companyId}). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"CompaniesNotes":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"noteId":{"type":"string"},"noteTitle":{"anyOf":[{"type":"string"},{"type":"null"}]},"noteContent":{"type":"object","properties":{"html":{"type":"string","description":"Draft.js content rendered as HTML."},"text":{"type":"string","description":"Plain text extracted from Draft.js blocks."}},"required":["html","text"],"additionalProperties":false},"attachments":{"type":"array","items":{"type":"object","properties":{"fileId":{"type":"string"},"filePath":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Public file URL, or null when unavailable."},"label":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["fileId","filePath","label"],"additionalProperties":false}},"createdAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO 8601 creation timestamp."},"modifiedAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO 8601 last-modified timestamp."}},"required":["noteId","noteTitle","noteContent","attachments","createdAt","modifiedAt"],"additionalProperties":false}}},"required":["data"],"additionalProperties":false,"description":"Data schema used by List Company Notes (GET /v1/companies/{companyId}/notes). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"CompaniesMutation2":{"type":"object","properties":{"data":{"type":"object","properties":{"companyId":{"type":"string","pattern":"^COMP-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Company identifier (COMP-<uuid>).","examples":["COMP-123e4567-e89b-12d3-a456-426614174000"],"example":"COMP-123e4567-e89b-12d3-a456-426614174000"},"priceLists":{"type":"array","items":{"type":"object","properties":{"priceListId":{"type":"string"},"priceListName":{"type":"string"},"status":{"type":"string"}},"required":["priceListId","priceListName","status"],"additionalProperties":false}}},"required":["companyId","priceLists"],"additionalProperties":false}},"required":["data"],"additionalProperties":false,"description":"Data schema used by Update Company Price Lists (POST /v1/companies/{companyId}/price-lists). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"CompaniesPriceListsRequest":{"type":"object","properties":{"priceListIdsToAttach":{"minItems":1,"maxItems":50,"type":"array","items":{"type":"string","pattern":"^PL-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}},"priceListIdsToDelete":{"minItems":1,"maxItems":50,"type":"array","items":{"type":"string","pattern":"^PL-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}}},"additionalProperties":false,"description":"Data schema used by Update Company Price Lists (POST /v1/companies/{companyId}/price-lists). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"ContactsList":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"contactId":{"type":"string","pattern":"^CONT-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Contact identifier (CONT-<uuid>).","examples":["CONT-123e4567-e89b-12d3-a456-426614174000"],"example":"CONT-123e4567-e89b-12d3-a456-426614174000"},"contactNumericId":{"type":"number"},"firstName":{"type":"string"},"lastName":{"type":"string"},"companyId":{"type":"string"},"status":{"type":"string","enum":["ACTIVE","INACTIVE"]},"phoneNumbers":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string","enum":["WORK","HOME","PRIVATE"]},"number":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["type","number"],"additionalProperties":false}},"emails":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string","enum":["WORK","HOME","PRIVATE"]},"mail":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["type","mail"],"additionalProperties":false}},"isUserAssigned":{"type":"boolean"},"isInvited":{"type":"boolean","description":"Whether the contact has a pending or accepted invitation."},"lastActivityAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO 8601 timestamp of the last activity, or null."},"createdAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO 8601 creation timestamp."},"modifiedAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO 8601 last-modified timestamp."}},"required":["contactId","contactNumericId","firstName","lastName","companyId","status","phoneNumbers","emails","isUserAssigned","isInvited","lastActivityAt","createdAt","modifiedAt"],"additionalProperties":false}},"page":{"type":"object","properties":{"limit":{"type":"number"},"nextCursor":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Cursor for the next page, or null on the last page."}},"required":["limit","nextCursor"],"additionalProperties":false}},"required":["data","page"],"additionalProperties":false,"description":"Data schema used by List Contacts (GET /v1/contacts). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"ContactsMutation":{"type":"object","properties":{"data":{"type":"object","properties":{"contactId":{"type":"string","pattern":"^CONT-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Contact identifier (CONT-<uuid>).","examples":["CONT-123e4567-e89b-12d3-a456-426614174000"],"example":"CONT-123e4567-e89b-12d3-a456-426614174000"},"status":{"type":"string","enum":["ACTIVE","INACTIVE"]},"firstName":{"type":"string"},"lastName":{"type":"string"},"companyId":{"type":"string"}},"required":["contactId","status","firstName","lastName","companyId"],"additionalProperties":false}},"required":["data"],"additionalProperties":false,"description":"Data schema used by Create Contact (POST /v1/contacts). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"ContactsCreateRequest":{"type":"object","properties":{"status":{"type":"string","enum":["ACTIVE","INACTIVE"]},"firstName":{"type":"string","minLength":1,"maxLength":255},"lastName":{"type":"string","minLength":1,"maxLength":255},"companyId":{"type":"string","pattern":"^COMP-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"},"sameAsCompany":{"type":"boolean"},"address":{"type":"object","properties":{"street":{"type":"string","minLength":1,"maxLength":255},"city":{"type":"string","minLength":1,"maxLength":255},"postcode":{"type":"string","minLength":1,"maxLength":255},"country":{"type":"string","minLength":1,"maxLength":255}},"additionalProperties":false},"tags":{"description":"Up to 50 tags.","maxItems":50,"type":"array","items":{"type":"string","minLength":1,"maxLength":255}},"phoneNumbers":{"description":"Up to 20 phone numbers.","maxItems":20,"type":"array","items":{"type":"object","properties":{"type":{"type":"string","enum":["WORK","HOME","PRIVATE"]},"number":{"type":"string","minLength":1,"maxLength":255}},"required":["type","number"],"additionalProperties":false}},"emails":{"description":"Up to 20 emails.","maxItems":20,"type":"array","items":{"type":"object","properties":{"type":{"type":"string","enum":["WORK","HOME","PRIVATE"]},"mail":{"type":"string"}},"required":["type","mail"],"additionalProperties":false}},"linkedInAccount":{"type":"string","minLength":1,"maxLength":255},"position":{"type":"string","minLength":1,"maxLength":255},"reportsToId":{"type":"string","pattern":"^CONT-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}},"required":["firstName","lastName","companyId"],"additionalProperties":false,"description":"Data schema used by Create Contact (POST /v1/contacts). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"ContactsDetail":{"type":"object","properties":{"data":{"type":"object","properties":{"contactId":{"type":"string","pattern":"^CONT-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Contact identifier (CONT-<uuid>).","examples":["CONT-123e4567-e89b-12d3-a456-426614174000"],"example":"CONT-123e4567-e89b-12d3-a456-426614174000"},"contactNumericId":{"type":"number"},"firstName":{"type":"string"},"lastName":{"type":"string"},"companyId":{"type":"string"},"status":{"type":"string","enum":["ACTIVE","INACTIVE"]},"phoneNumbers":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string","enum":["WORK","HOME","PRIVATE"]},"number":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["type","number"],"additionalProperties":false}},"emails":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string","enum":["WORK","HOME","PRIVATE"]},"mail":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["type","mail"],"additionalProperties":false}},"isUserAssigned":{"type":"boolean"},"isInvited":{"type":"boolean","description":"Whether the contact has a pending or accepted invitation."},"lastActivityAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO 8601 timestamp of the last activity, or null."},"createdAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO 8601 creation timestamp."},"modifiedAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO 8601 last-modified timestamp."},"sameAsCompany":{"type":"boolean"},"address":{"type":"object","properties":{"street":{"anyOf":[{"type":"string"},{"type":"null"}]},"city":{"anyOf":[{"type":"string"},{"type":"null"}]},"postcode":{"anyOf":[{"type":"string"},{"type":"null"}]},"country":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["street","city","postcode","country"],"additionalProperties":false},"tags":{"type":"array","items":{"type":"string"}},"linkedInAccount":{"anyOf":[{"type":"string"},{"type":"null"}]},"position":{"anyOf":[{"type":"string"},{"type":"null"}]},"reportsToId":{"anyOf":[{"type":"string"},{"type":"null"}]},"reportsToName":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["contactId","contactNumericId","firstName","lastName","companyId","status","phoneNumbers","emails","isUserAssigned","isInvited","lastActivityAt","createdAt","modifiedAt","sameAsCompany","address","tags","linkedInAccount","position","reportsToId","reportsToName"],"additionalProperties":false}},"required":["data"],"additionalProperties":false,"description":"Data schema used by Get Contact (GET /v1/contacts/{contactId}). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"CustomerList":{"type":"object","properties":{"data":{"type":"object","properties":{"customerId":{"type":"string","pattern":"^CUST-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"},"customerName":{"type":"string"},"displayName":{"anyOf":[{"type":"string"},{"type":"null"}]},"contact":{"type":"object","properties":{"address":{"anyOf":[{"type":"string"},{"type":"null"}]},"city":{"anyOf":[{"type":"string"},{"type":"null"}]},"postcode":{"anyOf":[{"type":"string"},{"type":"null"}]},"country":{"anyOf":[{"type":"string"},{"type":"null"}]},"phone":{"anyOf":[{"type":"string"},{"type":"null"}]},"website":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["address","city","postcode","country","phone","website"],"additionalProperties":false},"logoUrl":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}]},"languages":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"code":{"type":"string"},"isDefault":{"type":"boolean"}},"required":["id","code","isDefault"],"additionalProperties":false}},"currencies":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"code":{"type":"string"},"name":{"type":"string"},"rate":{"type":"number"},"isDefault":{"type":"boolean"}},"required":["id","code","name","rate","isDefault"],"additionalProperties":false}},"markets":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Configured market code."},"currencyId":{"type":"string"},"usedInMarketCostPrices":{"type":"boolean"}},"required":["id","currencyId","usedInMarketCostPrices"],"additionalProperties":false}},"priceRoundingType":{"type":"string"},"publicPriceListGroups":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"priceListIds":{"type":"array","items":{"type":"string","pattern":"^PL-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}},"priceType":{"type":"string"},"vatType":{"type":"string","enum":["INCLUDED","EXCLUDED"]}},"required":["id","name","priceListIds","priceType","vatType"],"additionalProperties":false}},"theme":{"type":"object","properties":{"exportObjType":{"type":"string","enum":["PUBLIC","PRIVATE","RESTRICTED_TO"]},"backgroundColor":{"type":"string"},"accentColor":{"type":"string"},"isWhiteButtonText":{"type":"boolean"},"hotSpots":{"type":"object","properties":{"color":{"type":"string"},"borderColor":{"type":"string"}},"additionalProperties":false},"groupStyle":{"type":"string"},"group":{"type":"object","properties":{"activeColor":{"type":"string"},"hoverColor":{"type":"string"},"openedGroupTextColor":{"type":"string","enum":["BLACK","WHITE"]},"hoverGroupTextColor":{"type":"string"}},"required":["openedGroupTextColor"],"additionalProperties":false},"quickIcons":{"type":"object","properties":{"mobile":{"type":"array","items":{"type":"string"}},"desktop":{"type":"array","items":{"type":"string"}}},"additionalProperties":false},"modularQuickIcons":{"type":"array","items":{"type":"string"}},"mesh":{"type":"object","properties":{"overlay":{"type":"string"}},"additionalProperties":false}},"required":["exportObjType","backgroundColor","accentColor","isWhiteButtonText","hotSpots","groupStyle","group","quickIcons","modularQuickIcons","mesh"],"additionalProperties":false}},"required":["customerId","customerName","displayName","contact","logoUrl","languages","currencies","markets","priceRoundingType","publicPriceListGroups","theme"],"additionalProperties":false}},"required":["data"],"additionalProperties":false,"description":"Data schema used by List Customer (GET /v1/customer). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"CustomerMutation":{"type":"object","properties":{"data":{"type":"object","properties":{"displayName":{"anyOf":[{"type":"string"},{"type":"null"}]},"contact":{"type":"object","properties":{"address":{"anyOf":[{"type":"string"},{"type":"null"}]},"city":{"anyOf":[{"type":"string"},{"type":"null"}]},"postcode":{"anyOf":[{"type":"string"},{"type":"null"}]},"country":{"anyOf":[{"type":"string"},{"type":"null"}]},"phone":{"anyOf":[{"type":"string"},{"type":"null"}]},"website":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["address","city","postcode","country","phone","website"],"additionalProperties":false},"logoUrl":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}]}},"required":["displayName","contact","logoUrl"],"additionalProperties":false}},"required":["data"],"additionalProperties":false,"description":"Data schema used by Update Customer Contact (PUT /v1/customer/contact). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"CustomerContactRequest":{"type":"object","properties":{"displayName":{"anyOf":[{"type":"string"},{"type":"null"}]},"contact":{"type":"object","properties":{"address":{"anyOf":[{"type":"string"},{"type":"null"}]},"city":{"anyOf":[{"type":"string"},{"type":"null"}]},"postcode":{"anyOf":[{"type":"string"},{"type":"null"}]},"country":{"anyOf":[{"type":"string"},{"type":"null"}]},"phone":{"anyOf":[{"type":"string"},{"type":"null"}]},"website":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["address","city","postcode","country","phone","website"],"additionalProperties":false}},"required":["displayName","contact"],"additionalProperties":false,"description":"Data schema used by Update Customer Contact (PUT /v1/customer/contact). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"CustomerMutation2":{"type":"object","properties":{"data":{"type":"object","properties":{"languages":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"code":{"type":"string"},"isDefault":{"type":"boolean"}},"required":["id","code","isDefault"],"additionalProperties":false}}},"required":["languages"],"additionalProperties":false}},"required":["data"],"additionalProperties":false,"description":"Data schema used by Update Customer Languages (PUT /v1/customer/languages). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"CustomerLanguagesRequest":{"type":"object","properties":{"languages":{"minItems":1,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1},"code":{"type":"string","minLength":2,"maxLength":10,"description":"Language code to translate localized fields to (falls back if unavailable).","examples":["en"],"example":"en"},"isDefault":{"type":"boolean"}},"required":["id","code","isDefault"],"additionalProperties":false}}},"required":["languages"],"additionalProperties":false,"description":"Data schema used by Update Customer Languages (PUT /v1/customer/languages). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"CustomerMutation3":{"type":"object","properties":{"data":{"type":"object","properties":{"currencies":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"code":{"type":"string"},"name":{"type":"string"},"rate":{"type":"number"},"isDefault":{"type":"boolean"}},"required":["id","code","name","rate","isDefault"],"additionalProperties":false}},"markets":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Configured market code."},"currencyId":{"type":"string"},"usedInMarketCostPrices":{"type":"boolean"}},"required":["id","currencyId","usedInMarketCostPrices"],"additionalProperties":false}},"priceRoundingType":{"type":"string"},"publicPriceListGroups":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"priceListIds":{"type":"array","items":{"type":"string","pattern":"^PL-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}},"priceType":{"type":"string"},"vatType":{"type":"string","enum":["INCLUDED","EXCLUDED"]}},"required":["id","name","priceListIds","priceType","vatType"],"additionalProperties":false}}},"required":["currencies","markets","priceRoundingType","publicPriceListGroups"],"additionalProperties":false}},"required":["data"],"additionalProperties":false,"description":"Data schema used by Update Customer Pricing (PUT /v1/customer/pricing). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"CustomerPricingRequest":{"type":"object","properties":{"currencies":{"minItems":1,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1},"code":{"type":"string","minLength":1},"name":{"type":"string","minLength":1,"maxLength":255},"rate":{"type":"number"},"isDefault":{"type":"boolean"}},"required":["id","code","name","rate","isDefault"],"additionalProperties":false}},"markets":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1,"description":"Configured market code."},"currencyId":{"type":"string","minLength":1}},"required":["id","currencyId"],"additionalProperties":false}},"priceRoundingType":{"type":"string","enum":["BEFORE","AFTER"]},"publicPriceListGroups":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1},"name":{"type":"string","minLength":1,"maxLength":255},"priceListIds":{"type":"array","items":{"type":"string","pattern":"^PL-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}},"priceType":{"type":"string","minLength":1,"maxLength":255},"vatType":{"type":"string","enum":["INCLUDED","EXCLUDED"]}},"required":["id","name","priceListIds","priceType","vatType"],"additionalProperties":false}}},"required":["currencies","markets","priceRoundingType","publicPriceListGroups"],"additionalProperties":false,"description":"Data schema used by Update Customer Pricing (PUT /v1/customer/pricing). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"CustomFieldsList":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"parameterId":{"type":"string","pattern":"^PARAM-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"},"resourceType":{"type":"string","enum":["OPTION_SET","CART","PRODUCT_DATA_GRID"],"description":"The resource whose records carry this custom field."},"key":{"type":"string"},"name":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}}]},{"type":"null"}],"description":"Translated text when `lang` is set, otherwise the full `{ language: text }` map. Languages with no text are omitted, and a field with no text at all is null.","examples":["Chair",{"en":"Chair","de":"Stuhl"}],"example":"Chair"},"description":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}}]},{"type":"null"}],"description":"Translated text when `lang` is set, otherwise the full `{ language: text }` map. Languages with no text are omitted, and a field with no text at all is null.","examples":["Chair",{"en":"Chair","de":"Stuhl"}],"example":"Chair"},"type":{"type":"string","enum":["TEXT","NUMBER","TRANSLATABLE_TEXT","MULTI_LINE_TRANSLATABLE_TEXT","CHECKBOX","SINGLE_SELECT","MULTI_LINE_TEXT","FILE","META_OBJECT"]},"source":{"type":"string","enum":["SYSTEM","CUSTOM"]},"status":{"type":"string","enum":["ACTIVE","INACTIVE"]},"validationConfig":{"type":"object","properties":{"min":{"type":"number","minimum":0},"max":{"type":"number","minimum":0},"decimalPlaces":{"type":"integer","minimum":0,"maximum":9007199254740991},"regexExpression":{"type":"string"},"validationMessage":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}}]},{"type":"null"}],"description":"Translated text when `lang` is set, otherwise the full `{ language: text }` map. Languages with no text are omitted, and a field with no text at all is null.","examples":["Chair",{"en":"Chair","de":"Stuhl"}],"example":"Chair"},"isRequired":{"type":"boolean"},"isUnique":{"type":"boolean"},"showOnFrontend":{"type":"boolean"}},"additionalProperties":false},"typeConfig":{"anyOf":[{"type":"object","properties":{"checkboxContent":{"type":"object","properties":{"showInFooter":{"type":"boolean"},"content":{},"checkedLabel":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}}]},{"type":"null"}],"description":"Translated text when `lang` is set, otherwise the full `{ language: text }` map. Languages with no text are omitted, and a field with no text at all is null.","examples":["Chair",{"en":"Chair","de":"Stuhl"}],"example":"Chair"},"uncheckedLabel":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}}]},{"type":"null"}],"description":"Translated text when `lang` is set, otherwise the full `{ language: text }` map. Languages with no text are omitted, and a field with no text at all is null.","examples":["Chair",{"en":"Chair","de":"Stuhl"}],"example":"Chair"}},"required":["content","checkedLabel","uncheckedLabel"],"additionalProperties":false},"selectOptions":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}}]},{"type":"null"}],"description":"Translated text when `lang` is set, otherwise the full `{ language: text }` map. Languages with no text are omitted, and a field with no text at all is null.","examples":["Chair",{"en":"Chair","de":"Stuhl"}],"example":"Chair"},"value":{"type":"string"}},"required":["id","name","value"],"additionalProperties":false}},"fileContent":{"type":"object","properties":{"fileLimit":{"type":"string","enum":["SINGLE_FILE","MULTIPLE_FILE"]},"minFiles":{"type":"number"},"maxFiles":{"type":"number"},"fileTypes":{"type":"object","properties":{"acceptAllFileTypes":{"type":"boolean"},"images":{"type":"boolean"},"videos":{"type":"boolean"},"documents":{"type":"boolean"},"archives":{"type":"boolean"}},"additionalProperties":false},"fileExceptions":{"type":"object","properties":{"allowAdditionalFileTypes":{"type":"array","items":{"type":"string"}},"blockSpecificFileTypes":{"type":"array","items":{"type":"string"}}},"additionalProperties":false}},"required":["fileLimit"],"additionalProperties":false},"metaObjectContent":{"type":"array","items":{"type":"object","properties":{"parameterId":{"type":"string","pattern":"^PARAM-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"},"key":{"type":"string","minLength":1,"pattern":"^[a-zA-Z0-9-_]+$"},"type":{"type":"string","enum":["TEXT","NUMBER","TRANSLATABLE_TEXT","MULTI_LINE_TRANSLATABLE_TEXT","CHECKBOX","SINGLE_SELECT","MULTI_LINE_TEXT","FILE"]},"name":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}}]},{"type":"null"}],"description":"Translated text when `lang` is set, otherwise the full `{ language: text }` map. Languages with no text are omitted, and a field with no text at all is null.","examples":["Chair",{"en":"Chair","de":"Stuhl"}],"example":"Chair"},"description":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}}]},{"type":"null"}],"description":"Translated text when `lang` is set, otherwise the full `{ language: text }` map. Languages with no text are omitted, and a field with no text at all is null.","examples":["Chair",{"en":"Chair","de":"Stuhl"}],"example":"Chair"},"validationConfig":{"type":"object","properties":{"min":{"type":"number","minimum":0},"max":{"type":"number","minimum":0},"decimalPlaces":{"type":"integer","minimum":0,"maximum":9007199254740991},"regexExpression":{"type":"string"},"validationMessage":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}}]},{"type":"null"}],"description":"Translated text when `lang` is set, otherwise the full `{ language: text }` map. Languages with no text are omitted, and a field with no text at all is null.","examples":["Chair",{"en":"Chair","de":"Stuhl"}],"example":"Chair"},"isRequired":{"type":"boolean"},"isUnique":{"type":"boolean"},"showOnFrontend":{"type":"boolean"}},"additionalProperties":false},"typeConfig":{"type":"object","properties":{"checkboxContent":{"type":"object","properties":{"showInFooter":{"type":"boolean"},"content":{},"checkedLabel":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}}]},{"type":"null"}],"description":"Translated text when `lang` is set, otherwise the full `{ language: text }` map. Languages with no text are omitted, and a field with no text at all is null.","examples":["Chair",{"en":"Chair","de":"Stuhl"}],"example":"Chair"},"uncheckedLabel":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}}]},{"type":"null"}],"description":"Translated text when `lang` is set, otherwise the full `{ language: text }` map. Languages with no text are omitted, and a field with no text at all is null.","examples":["Chair",{"en":"Chair","de":"Stuhl"}],"example":"Chair"}},"required":["content","checkedLabel","uncheckedLabel"],"additionalProperties":false},"selectOptions":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}}]},{"type":"null"}],"description":"Translated text when `lang` is set, otherwise the full `{ language: text }` map. Languages with no text are omitted, and a field with no text at all is null.","examples":["Chair",{"en":"Chair","de":"Stuhl"}],"example":"Chair"},"value":{"type":"string"}},"required":["id","name","value"],"additionalProperties":false}},"fileContent":{"type":"object","properties":{"fileLimit":{"type":"string","enum":["SINGLE_FILE","MULTIPLE_FILE"]},"minFiles":{"type":"number"},"maxFiles":{"type":"number"},"fileTypes":{"type":"object","properties":{"acceptAllFileTypes":{"type":"boolean"},"images":{"type":"boolean"},"videos":{"type":"boolean"},"documents":{"type":"boolean"},"archives":{"type":"boolean"}},"additionalProperties":false},"fileExceptions":{"type":"object","properties":{"allowAdditionalFileTypes":{"type":"array","items":{"type":"string"}},"blockSpecificFileTypes":{"type":"array","items":{"type":"string"}}},"additionalProperties":false}},"required":["fileLimit"],"additionalProperties":false}},"additionalProperties":false}},"required":["parameterId","key","type","name","validationConfig"],"additionalProperties":false}}},"additionalProperties":false},{"type":"null"}]},"createdAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO 8601 creation timestamp."},"modifiedAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO 8601 last-modified timestamp."}},"required":["parameterId","resourceType","key","name","description","type","source","status","validationConfig","typeConfig","createdAt","modifiedAt"],"additionalProperties":false}}},"required":["data"],"additionalProperties":false,"description":"Data schema used by List Custom Fields (GET /v1/custom-fields). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"CustomFieldsMutation":{"type":"object","properties":{"data":{"type":"object","properties":{"parameterId":{"type":"string","pattern":"^PARAM-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"},"resourceType":{"type":"string","enum":["OPTION_SET","CART","PRODUCT_DATA_GRID"],"description":"The resource whose records carry this custom field."},"key":{"type":"string"},"name":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}}]},{"type":"null"}],"description":"Translated text when `lang` is set, otherwise the full `{ language: text }` map. Languages with no text are omitted, and a field with no text at all is null.","examples":["Chair",{"en":"Chair","de":"Stuhl"}],"example":"Chair"},"description":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}}]},{"type":"null"}],"description":"Translated text when `lang` is set, otherwise the full `{ language: text }` map. Languages with no text are omitted, and a field with no text at all is null.","examples":["Chair",{"en":"Chair","de":"Stuhl"}],"example":"Chair"},"type":{"type":"string","enum":["TEXT","NUMBER","TRANSLATABLE_TEXT","MULTI_LINE_TRANSLATABLE_TEXT","CHECKBOX","SINGLE_SELECT","MULTI_LINE_TEXT","FILE","META_OBJECT"]},"source":{"type":"string","enum":["SYSTEM","CUSTOM"]},"status":{"type":"string","enum":["ACTIVE","INACTIVE"]},"validationConfig":{"type":"object","properties":{"min":{"type":"number","minimum":0},"max":{"type":"number","minimum":0},"decimalPlaces":{"type":"integer","minimum":0,"maximum":9007199254740991},"regexExpression":{"type":"string"},"validationMessage":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}}]},{"type":"null"}],"description":"Translated text when `lang` is set, otherwise the full `{ language: text }` map. Languages with no text are omitted, and a field with no text at all is null.","examples":["Chair",{"en":"Chair","de":"Stuhl"}],"example":"Chair"},"isRequired":{"type":"boolean"},"isUnique":{"type":"boolean"},"showOnFrontend":{"type":"boolean"}},"additionalProperties":false},"typeConfig":{"anyOf":[{"type":"object","properties":{"checkboxContent":{"type":"object","properties":{"showInFooter":{"type":"boolean"},"content":{},"checkedLabel":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}}]},{"type":"null"}],"description":"Translated text when `lang` is set, otherwise the full `{ language: text }` map. Languages with no text are omitted, and a field with no text at all is null.","examples":["Chair",{"en":"Chair","de":"Stuhl"}],"example":"Chair"},"uncheckedLabel":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}}]},{"type":"null"}],"description":"Translated text when `lang` is set, otherwise the full `{ language: text }` map. Languages with no text are omitted, and a field with no text at all is null.","examples":["Chair",{"en":"Chair","de":"Stuhl"}],"example":"Chair"}},"required":["content","checkedLabel","uncheckedLabel"],"additionalProperties":false},"selectOptions":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}}]},{"type":"null"}],"description":"Translated text when `lang` is set, otherwise the full `{ language: text }` map. Languages with no text are omitted, and a field with no text at all is null.","examples":["Chair",{"en":"Chair","de":"Stuhl"}],"example":"Chair"},"value":{"type":"string"}},"required":["id","name","value"],"additionalProperties":false}},"fileContent":{"type":"object","properties":{"fileLimit":{"type":"string","enum":["SINGLE_FILE","MULTIPLE_FILE"]},"minFiles":{"type":"number"},"maxFiles":{"type":"number"},"fileTypes":{"type":"object","properties":{"acceptAllFileTypes":{"type":"boolean"},"images":{"type":"boolean"},"videos":{"type":"boolean"},"documents":{"type":"boolean"},"archives":{"type":"boolean"}},"additionalProperties":false},"fileExceptions":{"type":"object","properties":{"allowAdditionalFileTypes":{"type":"array","items":{"type":"string"}},"blockSpecificFileTypes":{"type":"array","items":{"type":"string"}}},"additionalProperties":false}},"required":["fileLimit"],"additionalProperties":false},"metaObjectContent":{"type":"array","items":{"type":"object","properties":{"parameterId":{"type":"string","pattern":"^PARAM-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"},"key":{"type":"string","minLength":1,"pattern":"^[a-zA-Z0-9-_]+$"},"type":{"type":"string","enum":["TEXT","NUMBER","TRANSLATABLE_TEXT","MULTI_LINE_TRANSLATABLE_TEXT","CHECKBOX","SINGLE_SELECT","MULTI_LINE_TEXT","FILE"]},"name":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}}]},{"type":"null"}],"description":"Translated text when `lang` is set, otherwise the full `{ language: text }` map. Languages with no text are omitted, and a field with no text at all is null.","examples":["Chair",{"en":"Chair","de":"Stuhl"}],"example":"Chair"},"description":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}}]},{"type":"null"}],"description":"Translated text when `lang` is set, otherwise the full `{ language: text }` map. Languages with no text are omitted, and a field with no text at all is null.","examples":["Chair",{"en":"Chair","de":"Stuhl"}],"example":"Chair"},"validationConfig":{"type":"object","properties":{"min":{"type":"number","minimum":0},"max":{"type":"number","minimum":0},"decimalPlaces":{"type":"integer","minimum":0,"maximum":9007199254740991},"regexExpression":{"type":"string"},"validationMessage":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}}]},{"type":"null"}],"description":"Translated text when `lang` is set, otherwise the full `{ language: text }` map. Languages with no text are omitted, and a field with no text at all is null.","examples":["Chair",{"en":"Chair","de":"Stuhl"}],"example":"Chair"},"isRequired":{"type":"boolean"},"isUnique":{"type":"boolean"},"showOnFrontend":{"type":"boolean"}},"additionalProperties":false},"typeConfig":{"type":"object","properties":{"checkboxContent":{"type":"object","properties":{"showInFooter":{"type":"boolean"},"content":{},"checkedLabel":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}}]},{"type":"null"}],"description":"Translated text when `lang` is set, otherwise the full `{ language: text }` map. Languages with no text are omitted, and a field with no text at all is null.","examples":["Chair",{"en":"Chair","de":"Stuhl"}],"example":"Chair"},"uncheckedLabel":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}}]},{"type":"null"}],"description":"Translated text when `lang` is set, otherwise the full `{ language: text }` map. Languages with no text are omitted, and a field with no text at all is null.","examples":["Chair",{"en":"Chair","de":"Stuhl"}],"example":"Chair"}},"required":["content","checkedLabel","uncheckedLabel"],"additionalProperties":false},"selectOptions":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}}]},{"type":"null"}],"description":"Translated text when `lang` is set, otherwise the full `{ language: text }` map. Languages with no text are omitted, and a field with no text at all is null.","examples":["Chair",{"en":"Chair","de":"Stuhl"}],"example":"Chair"},"value":{"type":"string"}},"required":["id","name","value"],"additionalProperties":false}},"fileContent":{"type":"object","properties":{"fileLimit":{"type":"string","enum":["SINGLE_FILE","MULTIPLE_FILE"]},"minFiles":{"type":"number"},"maxFiles":{"type":"number"},"fileTypes":{"type":"object","properties":{"acceptAllFileTypes":{"type":"boolean"},"images":{"type":"boolean"},"videos":{"type":"boolean"},"documents":{"type":"boolean"},"archives":{"type":"boolean"}},"additionalProperties":false},"fileExceptions":{"type":"object","properties":{"allowAdditionalFileTypes":{"type":"array","items":{"type":"string"}},"blockSpecificFileTypes":{"type":"array","items":{"type":"string"}}},"additionalProperties":false}},"required":["fileLimit"],"additionalProperties":false}},"additionalProperties":false}},"required":["parameterId","key","type","name","validationConfig"],"additionalProperties":false}}},"additionalProperties":false},{"type":"null"}]},"createdAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO 8601 creation timestamp."},"modifiedAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO 8601 last-modified timestamp."}},"required":["parameterId","resourceType","key","name","description","type","source","status","validationConfig","typeConfig","createdAt","modifiedAt"],"additionalProperties":false}},"required":["data"],"additionalProperties":false,"description":"Data schema used by Create Custom Field (POST /v1/custom-fields). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"CustomFieldsCreateRequest":{"type":"object","properties":{"resourceType":{"type":"string","enum":["OPTION_SET","CART","PRODUCT_DATA_GRID"],"description":"The resource whose records carry this custom field."},"key":{"type":"string","minLength":1,"pattern":"^[a-zA-Z0-9-_]+$"},"name":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"},"examples":[{"en":"Chair","de":"Stuhl"}],"example":{"en":"Chair","de":"Stuhl"}},"description":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"},"examples":[{"en":"Chair","de":"Stuhl"}],"example":{"en":"Chair","de":"Stuhl"}},"type":{"type":"string","enum":["TEXT","NUMBER","TRANSLATABLE_TEXT","MULTI_LINE_TRANSLATABLE_TEXT","CHECKBOX","SINGLE_SELECT","MULTI_LINE_TEXT","FILE","META_OBJECT"]},"status":{"type":"string","enum":["ACTIVE","INACTIVE"]},"validationConfig":{"type":"object","properties":{"min":{"type":"number","minimum":0},"max":{"type":"number","minimum":0},"decimalPlaces":{"type":"integer","minimum":0,"maximum":9007199254740991},"regexExpression":{"type":"string"},"validationMessage":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"},"examples":[{"en":"Chair","de":"Stuhl"}],"example":{"en":"Chair","de":"Stuhl"}},"isRequired":{"type":"boolean"},"isUnique":{"type":"boolean"},"showOnFrontend":{"type":"boolean"}},"additionalProperties":false},"typeConfig":{"type":"object","properties":{"checkboxContent":{"type":"object","properties":{"showInFooter":{"type":"boolean"},"content":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},"checkedLabel":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"},"examples":[{"en":"Chair","de":"Stuhl"}],"example":{"en":"Chair","de":"Stuhl"}},"uncheckedLabel":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"},"examples":[{"en":"Chair","de":"Stuhl"}],"example":{"en":"Chair","de":"Stuhl"}}},"required":["content","checkedLabel","uncheckedLabel"],"additionalProperties":false},"selectOptions":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"},"examples":[{"en":"Chair","de":"Stuhl"}],"example":{"en":"Chair","de":"Stuhl"}},"value":{"type":"string","pattern":"^[a-z0-9]+[a-z0-9-]*[a-z0-9]+$"}},"required":["name","value"],"additionalProperties":false}},"fileContent":{"type":"object","properties":{"fileLimit":{"type":"string","enum":["SINGLE_FILE","MULTIPLE_FILE"]},"minFiles":{"type":"number"},"maxFiles":{"type":"number"},"fileTypes":{"type":"object","properties":{"acceptAllFileTypes":{"type":"boolean"},"images":{"type":"boolean"},"videos":{"type":"boolean"},"documents":{"type":"boolean"},"archives":{"type":"boolean"}},"additionalProperties":false},"fileExceptions":{"type":"object","properties":{"allowAdditionalFileTypes":{"type":"array","items":{"type":"string"}},"blockSpecificFileTypes":{"type":"array","items":{"type":"string"}}},"additionalProperties":false}},"required":["fileLimit"],"additionalProperties":false},"metaObjectContent":{"type":"array","items":{"type":"object","properties":{"parameterId":{"type":"string","pattern":"^PARAM-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"},"key":{"type":"string","minLength":1,"pattern":"^[a-zA-Z0-9-_]+$"},"type":{"type":"string","enum":["TEXT","NUMBER","TRANSLATABLE_TEXT","MULTI_LINE_TRANSLATABLE_TEXT","CHECKBOX","SINGLE_SELECT","MULTI_LINE_TEXT","FILE"]},"name":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"},"examples":[{"en":"Chair","de":"Stuhl"}],"example":{"en":"Chair","de":"Stuhl"}},"description":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"},"examples":[{"en":"Chair","de":"Stuhl"}],"example":{"en":"Chair","de":"Stuhl"}},"validationConfig":{"type":"object","properties":{"min":{"type":"number","minimum":0},"max":{"type":"number","minimum":0},"decimalPlaces":{"type":"integer","minimum":0,"maximum":9007199254740991},"regexExpression":{"type":"string"},"validationMessage":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"},"examples":[{"en":"Chair","de":"Stuhl"}],"example":{"en":"Chair","de":"Stuhl"}},"isRequired":{"type":"boolean"},"isUnique":{"type":"boolean"},"showOnFrontend":{"type":"boolean"}},"additionalProperties":false},"typeConfig":{"type":"object","properties":{"checkboxContent":{"type":"object","properties":{"showInFooter":{"type":"boolean"},"content":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},"checkedLabel":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"},"examples":[{"en":"Chair","de":"Stuhl"}],"example":{"en":"Chair","de":"Stuhl"}},"uncheckedLabel":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"},"examples":[{"en":"Chair","de":"Stuhl"}],"example":{"en":"Chair","de":"Stuhl"}}},"required":["content","checkedLabel","uncheckedLabel"],"additionalProperties":false},"selectOptions":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"},"examples":[{"en":"Chair","de":"Stuhl"}],"example":{"en":"Chair","de":"Stuhl"}},"value":{"type":"string","pattern":"^[a-z0-9]+[a-z0-9-]*[a-z0-9]+$"}},"required":["name","value"],"additionalProperties":false}},"fileContent":{"type":"object","properties":{"fileLimit":{"type":"string","enum":["SINGLE_FILE","MULTIPLE_FILE"]},"minFiles":{"type":"number"},"maxFiles":{"type":"number"},"fileTypes":{"type":"object","properties":{"acceptAllFileTypes":{"type":"boolean"},"images":{"type":"boolean"},"videos":{"type":"boolean"},"documents":{"type":"boolean"},"archives":{"type":"boolean"}},"additionalProperties":false},"fileExceptions":{"type":"object","properties":{"allowAdditionalFileTypes":{"type":"array","items":{"type":"string"}},"blockSpecificFileTypes":{"type":"array","items":{"type":"string"}}},"additionalProperties":false}},"required":["fileLimit"],"additionalProperties":false}},"additionalProperties":false}},"required":["parameterId","key","type","name","validationConfig"],"additionalProperties":false}}},"additionalProperties":false}},"required":["resourceType","key","name","type","validationConfig"],"additionalProperties":false,"description":"Data schema used by Create Custom Field (POST /v1/custom-fields). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"CustomFieldsUpdateRequest":{"type":"object","properties":{"resourceType":{"type":"string","enum":["OPTION_SET","CART","PRODUCT_DATA_GRID"],"description":"The resource whose records carry this custom field."},"key":{"type":"string","minLength":1,"pattern":"^[a-zA-Z0-9-_]+$"},"name":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"},"examples":[{"en":"Chair","de":"Stuhl"}],"example":{"en":"Chair","de":"Stuhl"}},"description":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"},"examples":[{"en":"Chair","de":"Stuhl"}],"example":{"en":"Chair","de":"Stuhl"}},"type":{"type":"string","enum":["TEXT","NUMBER","TRANSLATABLE_TEXT","MULTI_LINE_TRANSLATABLE_TEXT","CHECKBOX","SINGLE_SELECT","MULTI_LINE_TEXT","FILE","META_OBJECT"]},"status":{"type":"string","enum":["ACTIVE","INACTIVE"]},"validationConfig":{"type":"object","properties":{"min":{"type":"number","minimum":0},"max":{"type":"number","minimum":0},"decimalPlaces":{"type":"integer","minimum":0,"maximum":9007199254740991},"regexExpression":{"type":"string"},"validationMessage":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"},"examples":[{"en":"Chair","de":"Stuhl"}],"example":{"en":"Chair","de":"Stuhl"}},"isRequired":{"type":"boolean"},"isUnique":{"type":"boolean"},"showOnFrontend":{"type":"boolean"}},"additionalProperties":false},"typeConfig":{"type":"object","properties":{"checkboxContent":{"type":"object","properties":{"showInFooter":{"type":"boolean"},"content":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},"checkedLabel":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"},"examples":[{"en":"Chair","de":"Stuhl"}],"example":{"en":"Chair","de":"Stuhl"}},"uncheckedLabel":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"},"examples":[{"en":"Chair","de":"Stuhl"}],"example":{"en":"Chair","de":"Stuhl"}}},"required":["content","checkedLabel","uncheckedLabel"],"additionalProperties":false},"selectOptions":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"},"examples":[{"en":"Chair","de":"Stuhl"}],"example":{"en":"Chair","de":"Stuhl"}},"value":{"type":"string","pattern":"^[a-z0-9]+[a-z0-9-]*[a-z0-9]+$"}},"required":["name","value"],"additionalProperties":false}},"fileContent":{"type":"object","properties":{"fileLimit":{"type":"string","enum":["SINGLE_FILE","MULTIPLE_FILE"]},"minFiles":{"type":"number"},"maxFiles":{"type":"number"},"fileTypes":{"type":"object","properties":{"acceptAllFileTypes":{"type":"boolean"},"images":{"type":"boolean"},"videos":{"type":"boolean"},"documents":{"type":"boolean"},"archives":{"type":"boolean"}},"additionalProperties":false},"fileExceptions":{"type":"object","properties":{"allowAdditionalFileTypes":{"type":"array","items":{"type":"string"}},"blockSpecificFileTypes":{"type":"array","items":{"type":"string"}}},"additionalProperties":false}},"required":["fileLimit"],"additionalProperties":false},"metaObjectContent":{"type":"array","items":{"type":"object","properties":{"parameterId":{"type":"string","pattern":"^PARAM-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"},"key":{"type":"string","minLength":1,"pattern":"^[a-zA-Z0-9-_]+$"},"type":{"type":"string","enum":["TEXT","NUMBER","TRANSLATABLE_TEXT","MULTI_LINE_TRANSLATABLE_TEXT","CHECKBOX","SINGLE_SELECT","MULTI_LINE_TEXT","FILE"]},"name":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"},"examples":[{"en":"Chair","de":"Stuhl"}],"example":{"en":"Chair","de":"Stuhl"}},"description":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"},"examples":[{"en":"Chair","de":"Stuhl"}],"example":{"en":"Chair","de":"Stuhl"}},"validationConfig":{"type":"object","properties":{"min":{"type":"number","minimum":0},"max":{"type":"number","minimum":0},"decimalPlaces":{"type":"integer","minimum":0,"maximum":9007199254740991},"regexExpression":{"type":"string"},"validationMessage":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"},"examples":[{"en":"Chair","de":"Stuhl"}],"example":{"en":"Chair","de":"Stuhl"}},"isRequired":{"type":"boolean"},"isUnique":{"type":"boolean"},"showOnFrontend":{"type":"boolean"}},"additionalProperties":false},"typeConfig":{"type":"object","properties":{"checkboxContent":{"type":"object","properties":{"showInFooter":{"type":"boolean"},"content":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},"checkedLabel":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"},"examples":[{"en":"Chair","de":"Stuhl"}],"example":{"en":"Chair","de":"Stuhl"}},"uncheckedLabel":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"},"examples":[{"en":"Chair","de":"Stuhl"}],"example":{"en":"Chair","de":"Stuhl"}}},"required":["content","checkedLabel","uncheckedLabel"],"additionalProperties":false},"selectOptions":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"},"examples":[{"en":"Chair","de":"Stuhl"}],"example":{"en":"Chair","de":"Stuhl"}},"value":{"type":"string","pattern":"^[a-z0-9]+[a-z0-9-]*[a-z0-9]+$"}},"required":["name","value"],"additionalProperties":false}},"fileContent":{"type":"object","properties":{"fileLimit":{"type":"string","enum":["SINGLE_FILE","MULTIPLE_FILE"]},"minFiles":{"type":"number"},"maxFiles":{"type":"number"},"fileTypes":{"type":"object","properties":{"acceptAllFileTypes":{"type":"boolean"},"images":{"type":"boolean"},"videos":{"type":"boolean"},"documents":{"type":"boolean"},"archives":{"type":"boolean"}},"additionalProperties":false},"fileExceptions":{"type":"object","properties":{"allowAdditionalFileTypes":{"type":"array","items":{"type":"string"}},"blockSpecificFileTypes":{"type":"array","items":{"type":"string"}}},"additionalProperties":false}},"required":["fileLimit"],"additionalProperties":false}},"additionalProperties":false}},"required":["parameterId","key","type","name","validationConfig"],"additionalProperties":false}}},"additionalProperties":false}},"required":["resourceType","key","name","type","validationConfig"],"additionalProperties":false,"description":"Data schema used by Update Custom Field (PUT /v1/custom-fields/{parameterId}). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"UsersList":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"userId":{"type":"string","pattern":"^USER-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"},"firstName":{"anyOf":[{"type":"string"},{"type":"null"}]},"lastName":{"anyOf":[{"type":"string"},{"type":"null"}]},"email":{"anyOf":[{"type":"string"},{"type":"null"}]},"status":{"anyOf":[{"type":"string","enum":["ACTIVE","INACTIVE"]},{"type":"null"}]},"isBetaTester":{"type":"boolean"}},"required":["userId","firstName","lastName","email","status","isBetaTester"],"additionalProperties":false}}},"required":["data"],"additionalProperties":false,"description":"Data schema used by List Users (GET /v1/users). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"UsersDetail":{"type":"object","properties":{"data":{"type":"object","properties":{"userId":{"type":"string","pattern":"^USER-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"},"firstName":{"anyOf":[{"type":"string"},{"type":"null"}]},"lastName":{"anyOf":[{"type":"string"},{"type":"null"}]},"email":{"anyOf":[{"type":"string"},{"type":"null"}]},"status":{"anyOf":[{"type":"string","enum":["ACTIVE","INACTIVE"]},{"type":"null"}]},"isBetaTester":{"type":"boolean"}},"required":["userId","firstName","lastName","email","status","isBetaTester"],"additionalProperties":false}},"required":["data"],"additionalProperties":false,"description":"Data schema used by Get User (GET /v1/users/{userId}). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"UsersMutation":{"type":"object","properties":{"data":{"type":"object","properties":{"userId":{"type":"string","pattern":"^USER-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"},"status":{"type":"string","enum":["ACTIVE","INACTIVE"]}},"required":["userId","status"],"additionalProperties":false}},"required":["data"],"additionalProperties":false,"description":"Data schema used by Set User Status (PUT /v1/users/{userId}/status). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"UsersStatusRequest":{"type":"object","properties":{"status":{"type":"string","enum":["ACTIVE","INACTIVE"]}},"required":["status"],"additionalProperties":false,"description":"Data schema used by Set User Status (PUT /v1/users/{userId}/status). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"InvitationsList":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"invitationId":{"type":"string","pattern":"^INV-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"},"email":{"type":"string"},"name":{"type":"string"},"roles":{"type":"array","items":{"type":"string"}},"defaultUserLang":{"anyOf":[{"type":"string"},{"type":"null"}]},"invitedAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO 8601 invitation timestamp."}},"required":["invitationId","email","name","roles","defaultUserLang","invitedAt"],"additionalProperties":false}}},"required":["data"],"additionalProperties":false,"description":"Data schema used by List Invitations (GET /v1/invitations). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"InvitationsMutation":{"type":"object","properties":{"data":{"type":"object","properties":{"invitationId":{"anyOf":[{"type":"string","pattern":"^INV-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"},{"type":"null"}]}},"required":["invitationId"],"additionalProperties":false}},"required":["data"],"additionalProperties":false,"description":"Data schema used by Create Invitation (POST /v1/invitations). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"InvitationsCreateRequest":{"type":"object","properties":{"email":{"type":"string"},"firstName":{"type":"string","minLength":1,"maxLength":255},"lastName":{"type":"string","minLength":1,"maxLength":255},"roleIds":{"minItems":1,"type":"array","items":{"type":"string","pattern":"^ROLE-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}},"defaultUserLang":{"type":"string","minLength":2,"maxLength":10,"description":"Language code to translate localized fields to (falls back if unavailable).","examples":["en"],"example":"en"}},"required":["email","firstName","lastName","roleIds","defaultUserLang"],"additionalProperties":false,"description":"Data schema used by Create Invitation (POST /v1/invitations). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"RolesList":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"roleId":{"type":"string","pattern":"^ROLE-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"},"roleName":{"type":"string"},"status":{"type":"string","enum":["ACTIVE","INACTIVE"]},"permissions":{"type":"array","items":{"type":"string"}}},"required":["roleId","roleName","status","permissions"],"additionalProperties":false}}},"required":["data"],"additionalProperties":false,"description":"Data schema used by List Roles (GET /v1/roles). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"RolesPermissions":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"description":{"type":"string"},"group":{"type":"string"}},"required":["id","description","group"],"additionalProperties":false}}},"required":["data"],"additionalProperties":false,"description":"Data schema used by List Role Permissions (GET /v1/roles/permissions). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"RolesDetail":{"type":"object","properties":{"data":{"type":"object","properties":{"roleId":{"type":"string","pattern":"^ROLE-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"},"roleName":{"type":"string"},"status":{"type":"string","enum":["ACTIVE","INACTIVE"]},"permissions":{"type":"array","items":{"type":"string"}},"userIds":{"type":"array","items":{"type":"string","pattern":"^USER-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}},"createdAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO 8601 role creation timestamp."},"modifiedAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO 8601 role last-modified timestamp."}},"required":["roleId","roleName","status","permissions","userIds","createdAt","modifiedAt"],"additionalProperties":false}},"required":["data"],"additionalProperties":false,"description":"Data schema used by Create Role (POST /v1/roles). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"RolesCreateRequest":{"type":"object","properties":{"roleName":{"type":"string","minLength":1,"maxLength":255},"status":{"type":"string","enum":["ACTIVE","INACTIVE"]},"permissions":{"type":"array","items":{"type":"string","enum":["CONTACTS_VIEW","CONTACTS_CREATE_EDIT","CONTACTS_ASSIGN_TIER_2","COMPANIES_VIEW","COMPANIES_CREATE_EDIT","COMPANIES_MANAGE_NOTES","ORDERS_VIEW","ORDERS_CREATE_EDIT","CARTS_VIEW","QUOTATIONS_VIEW","QUOTATIONS_EDIT","PRODUCTS_OPTION_SETS_COLLECTIONS_VIEW","PRODUCTS_OPTION_SETS_COLLECTIONS_CREATE_EDIT","MEDIA_LIBRARY","GALLERIES","3D_MATERIALS","PRICING_ITEM_MASTER","PRICING_MCP_PRICE_LISTS","FULL_CUSTOMER_COMPANIES_ADD_PRICE_LISTS","CONTACTS_ADD_PERMISSIONS_TO_CONTACT","SETTINGS_USER_ROLES","AI_BILLING_MANAGE","SETTINGS_PRODUCT_CATEGORIES","SETTINGS_PRODUCT_GROUPS","SETTINGS_EMBED_TEMPLATES","SETTINGS_CUSTOM_UIS","SETTINGS_WEBHOOKS","SETTINGS_EXTRA_PARAMETERS","SETTINGS_COMPANY_GROUPS","MAIN_SETTINGS_NAME_ADDRESS","MAIN_SETTINGS_THEME","MAIN_SETTINGS_CURRENCIES","MAIN_SETTINGS_OPTION_SET_FILTERS","MAIN_SETTINGS_QUOTE_SETTINGS","MAIN_SETTINGS_LICENCES_VIEW","MAIN_SETTINGS_BASKET_CONFIG","MAIN_SETTINGS_ACCOUNT_SETTINGS","SETTINGS_ACCOUNT_DELETION_RIGHTS","MAIN_SETTINGS_DELETE_CUSTOMER","API_KEYS_MANAGE","MAIN_SETTINGS_LANGUAGES","MAIN_SETTINGS_PRICING","PRICING_RRP_VIEW","PRICING_SALE_VIEW","PRICING_COST_VIEW","PRICING_BLANK_VIEW","PRICING_COMPANY_EDIT","TRASH_PERMANENT_DELETION"]}},"userIds":{"type":"array","items":{"type":"string","pattern":"^USER-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}}},"required":["roleName"],"additionalProperties":false,"description":"Data schema used by Create Role (POST /v1/roles). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"RolesUpdateRequest":{"type":"object","properties":{"roleName":{"type":"string","minLength":1,"maxLength":255},"status":{"type":"string","enum":["ACTIVE","INACTIVE"]},"permissions":{"type":"array","items":{"type":"string","enum":["CONTACTS_VIEW","CONTACTS_CREATE_EDIT","CONTACTS_ASSIGN_TIER_2","COMPANIES_VIEW","COMPANIES_CREATE_EDIT","COMPANIES_MANAGE_NOTES","ORDERS_VIEW","ORDERS_CREATE_EDIT","CARTS_VIEW","QUOTATIONS_VIEW","QUOTATIONS_EDIT","PRODUCTS_OPTION_SETS_COLLECTIONS_VIEW","PRODUCTS_OPTION_SETS_COLLECTIONS_CREATE_EDIT","MEDIA_LIBRARY","GALLERIES","3D_MATERIALS","PRICING_ITEM_MASTER","PRICING_MCP_PRICE_LISTS","FULL_CUSTOMER_COMPANIES_ADD_PRICE_LISTS","CONTACTS_ADD_PERMISSIONS_TO_CONTACT","SETTINGS_USER_ROLES","AI_BILLING_MANAGE","SETTINGS_PRODUCT_CATEGORIES","SETTINGS_PRODUCT_GROUPS","SETTINGS_EMBED_TEMPLATES","SETTINGS_CUSTOM_UIS","SETTINGS_WEBHOOKS","SETTINGS_EXTRA_PARAMETERS","SETTINGS_COMPANY_GROUPS","MAIN_SETTINGS_NAME_ADDRESS","MAIN_SETTINGS_THEME","MAIN_SETTINGS_CURRENCIES","MAIN_SETTINGS_OPTION_SET_FILTERS","MAIN_SETTINGS_QUOTE_SETTINGS","MAIN_SETTINGS_LICENCES_VIEW","MAIN_SETTINGS_BASKET_CONFIG","MAIN_SETTINGS_ACCOUNT_SETTINGS","SETTINGS_ACCOUNT_DELETION_RIGHTS","MAIN_SETTINGS_DELETE_CUSTOMER","API_KEYS_MANAGE","MAIN_SETTINGS_LANGUAGES","MAIN_SETTINGS_PRICING","PRICING_RRP_VIEW","PRICING_SALE_VIEW","PRICING_COST_VIEW","PRICING_BLANK_VIEW","PRICING_COMPANY_EDIT","TRASH_PERMANENT_DELETION"]}},"userIds":{"type":"array","items":{"type":"string","pattern":"^USER-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}}},"additionalProperties":false,"description":"Data schema used by Update Role (PUT /v1/roles/{roleId}). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"GlobalOptionSetsList":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"optionSetId":{"type":"string","pattern":"^OPT-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Global option set identifier (OPT-<uuid>).","examples":["OPT-123e4567-e89b-12d3-a456-426614174000"],"example":"OPT-123e4567-e89b-12d3-a456-426614174000"},"name":{"type":"string"},"displayName":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}}]},{"type":"null"}],"description":"Translated text when `lang` is set, otherwise the full `{ language: text }` map. Languages with no text are omitted, and a field with no text at all is null.","examples":["Chair",{"en":"Chair","de":"Stuhl"}],"example":"Chair"},"description":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}}]},{"type":"null"}],"description":"Translated text when `lang` is set, otherwise the full `{ language: text }` map. Languages with no text are omitted, and a field with no text at all is null.","examples":["Chair",{"en":"Chair","de":"Stuhl"}],"example":"Chair"},"status":{"type":"string","enum":["ACTIVE","INACTIVE"]},"numberOfOptions":{"anyOf":[{"type":"number"},{"type":"null"}]},"createdAt":{"anyOf":[{"type":"string"},{"type":"null"}]},"modifiedAt":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["optionSetId","name","displayName","description","status","numberOfOptions","createdAt","modifiedAt"],"additionalProperties":false}},"page":{"type":"object","properties":{"limit":{"type":"number"},"nextCursor":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["limit","nextCursor"],"additionalProperties":false}},"required":["data","page"],"additionalProperties":false,"description":"Data schema used by List Global Option Sets (GET /v1/global-option-sets). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"GlobalOptionSetsDetail":{"type":"object","properties":{"data":{"type":"object","properties":{"optionSetId":{"type":"string","pattern":"^OPT-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Global option set identifier (OPT-<uuid>).","examples":["OPT-123e4567-e89b-12d3-a456-426614174000"],"example":"OPT-123e4567-e89b-12d3-a456-426614174000"},"name":{"type":"string"},"displayName":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}}]},{"type":"null"}],"description":"Translated text when `lang` is set, otherwise the full `{ language: text }` map. Languages with no text are omitted, and a field with no text at all is null.","examples":["Chair",{"en":"Chair","de":"Stuhl"}],"example":"Chair"},"description":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}}]},{"type":"null"}],"description":"Translated text when `lang` is set, otherwise the full `{ language: text }` map. Languages with no text are omitted, and a field with no text at all is null.","examples":["Chair",{"en":"Chair","de":"Stuhl"}],"example":"Chair"},"status":{"type":"string","enum":["ACTIVE","INACTIVE"]},"numberOfOptions":{"anyOf":[{"type":"number"},{"type":"null"}]},"createdAt":{"anyOf":[{"type":"string"},{"type":"null"}]},"modifiedAt":{"anyOf":[{"type":"string"},{"type":"null"}]},"tags":{"type":"array","items":{"type":"string"}},"options":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"code":{"type":"string"},"name":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}}]},{"type":"null"}],"description":"Translated text when `lang` is set, otherwise the full `{ language: text }` map. Languages with no text are omitted, and a field with no text at all is null.","examples":["Chair",{"en":"Chair","de":"Stuhl"}],"example":"Chair"},"comment":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}}]},{"type":"null"}],"description":"Translated text when `lang` is set, otherwise the full `{ language: text }` map. Languages with no text are omitted, and a field with no text at all is null.","examples":["Chair",{"en":"Chair","de":"Stuhl"}],"example":"Chair"},"priceCode":{"anyOf":[{"type":"string"},{"type":"null"}]},"fbPriceCode":{"anyOf":[{"type":"string"},{"type":"null"}]},"additionalPriceCode":{"anyOf":[{"type":"string"},{"type":"null"}]},"material3dId":{"anyOf":[{"type":"string"},{"type":"null"}]},"arMaterial3dId":{"anyOf":[{"type":"string"},{"type":"null"}]},"additionalPriceCodeQuantity":{"anyOf":[{"anyOf":[{"type":"number"},{"type":"string"}]},{"type":"null"}],"description":"Quantity the `additionalPriceCode` applies to."},"filters":{"anyOf":[{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{},"description":"Opaque filter configuration: parameter id -> selected value ids. Structure is configuration-dependent.","examples":[{"<parameterId>":["<valueId>"]}],"example":{"<parameterId>":["<valueId>"]}},{"type":"null"}]},"metafields":{"anyOf":[{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{},"description":"Opaque metafield map of customer-defined keys to values (string, number, or object).","examples":[{"lead-time-weeks":10,"care-label":"Wipe clean"}],"example":{"lead-time-weeks":10,"care-label":"Wipe clean"}},{"type":"null"}]},"src":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Absolute URL of the option image, resolved against the CDN."}},"required":["id","code","name","comment","priceCode","fbPriceCode","additionalPriceCode","material3dId","arMaterial3dId","additionalPriceCodeQuantity","filters","metafields","src"],"additionalProperties":false}}},"required":["optionSetId","name","displayName","description","status","numberOfOptions","createdAt","modifiedAt","tags","options"],"additionalProperties":false}},"required":["data"],"additionalProperties":false,"description":"Data schema used by Get Global Option Set (GET /v1/global-option-sets/{optionSetId}). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"GlobalOptionSetsMutation":{"type":"object","properties":{"data":{"type":"object","properties":{"optionSetId":{"type":"string","pattern":"^OPT-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Global option set identifier (OPT-<uuid>).","examples":["OPT-123e4567-e89b-12d3-a456-426614174000"],"example":"OPT-123e4567-e89b-12d3-a456-426614174000"},"name":{"type":"string"},"displayName":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}}]},{"type":"null"}],"description":"Translated text when `lang` is set, otherwise the full `{ language: text }` map. Languages with no text are omitted, and a field with no text at all is null.","examples":["Chair",{"en":"Chair","de":"Stuhl"}],"example":"Chair"},"description":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}}]},{"type":"null"}],"description":"Translated text when `lang` is set, otherwise the full `{ language: text }` map. Languages with no text are omitted, and a field with no text at all is null.","examples":["Chair",{"en":"Chair","de":"Stuhl"}],"example":"Chair"},"status":{"type":"string","enum":["ACTIVE","INACTIVE"]},"numberOfOptions":{"anyOf":[{"type":"number"},{"type":"null"}]},"createdAt":{"anyOf":[{"type":"string"},{"type":"null"}]},"modifiedAt":{"anyOf":[{"type":"string"},{"type":"null"}]},"tags":{"type":"array","items":{"type":"string"}},"options":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"code":{"type":"string"},"name":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}}]},{"type":"null"}],"description":"Translated text when `lang` is set, otherwise the full `{ language: text }` map. Languages with no text are omitted, and a field with no text at all is null.","examples":["Chair",{"en":"Chair","de":"Stuhl"}],"example":"Chair"},"comment":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}}]},{"type":"null"}],"description":"Translated text when `lang` is set, otherwise the full `{ language: text }` map. Languages with no text are omitted, and a field with no text at all is null.","examples":["Chair",{"en":"Chair","de":"Stuhl"}],"example":"Chair"},"priceCode":{"anyOf":[{"type":"string"},{"type":"null"}]},"fbPriceCode":{"anyOf":[{"type":"string"},{"type":"null"}]},"additionalPriceCode":{"anyOf":[{"type":"string"},{"type":"null"}]},"material3dId":{"anyOf":[{"type":"string"},{"type":"null"}]},"arMaterial3dId":{"anyOf":[{"type":"string"},{"type":"null"}]},"additionalPriceCodeQuantity":{"anyOf":[{"anyOf":[{"type":"number"},{"type":"string"}]},{"type":"null"}],"description":"Quantity the `additionalPriceCode` applies to."},"filters":{"anyOf":[{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{},"description":"Opaque filter configuration: parameter id -> selected value ids. Structure is configuration-dependent.","examples":[{"<parameterId>":["<valueId>"]}],"example":{"<parameterId>":["<valueId>"]}},{"type":"null"}]},"metafields":{"anyOf":[{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{},"description":"Opaque metafield map of customer-defined keys to values (string, number, or object).","examples":[{"lead-time-weeks":10,"care-label":"Wipe clean"}],"example":{"lead-time-weeks":10,"care-label":"Wipe clean"}},{"type":"null"}]},"src":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Absolute URL of the option image, resolved against the CDN."}},"required":["id","code","name","comment","priceCode","fbPriceCode","additionalPriceCode","material3dId","arMaterial3dId","additionalPriceCodeQuantity","filters","metafields","src"],"additionalProperties":false}}},"required":["optionSetId"],"additionalProperties":false}},"required":["data"],"additionalProperties":false,"description":"Data schema used by Create Global Option Set (POST /v1/global-option-sets). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"GlobalOptionSetsCreateRequest":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":255,"description":"Option set name (internal, not localized).","examples":["Colour"],"example":"Colour"},"displayName":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"},"examples":[{"en":"Colour","de":"Farbe"}],"description":"Display name, keyed by language code.","example":{"en":"Colour","de":"Farbe"}},"description":{"anyOf":[{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"},"examples":[{"en":"Pick a colour","de":"Wähle eine Farbe"}],"example":{"en":"Pick a colour","de":"Wähle eine Farbe"}},{"type":"null"}]},"status":{"type":"string","enum":["ACTIVE","INACTIVE"]},"tags":{"type":"array","items":{"type":"string","minLength":1,"maxLength":255}},"options":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":255,"description":"Client-supplied option id; reuse the stored id to update an existing option.","examples":["af77627b-54d7-4039-86dc-599019320634"],"example":"af77627b-54d7-4039-86dc-599019320634"},"code":{"type":"string","minLength":1,"maxLength":255,"examples":["RED"],"example":"RED"},"name":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"},"examples":[{"en":"Red","de":"Rot"}],"example":{"en":"Red","de":"Rot"}},"comment":{"anyOf":[{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"},"examples":[{"en":"Warm tone","de":"Warmer Ton"}],"example":{"en":"Warm tone","de":"Warmer Ton"}},{"type":"null"}]},"priceCode":{"anyOf":[{"type":"string"},{"type":"null"}]},"fbPriceCode":{"anyOf":[{"type":"string"},{"type":"null"}]},"additionalPriceCode":{"anyOf":[{"type":"string"},{"type":"null"}]},"material3dId":{"anyOf":[{"type":"string"},{"type":"null"}]},"arMaterial3dId":{"anyOf":[{"type":"string"},{"type":"null"}]},"additionalPriceCodeQuantity":{"anyOf":[{"anyOf":[{"type":"integer","minimum":0,"maximum":9007199254740991},{"type":"string","minLength":1}],"description":"Quantity the `additionalPriceCode` applies to."},{"type":"null"}]},"filters":{"anyOf":[{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{},"description":"Opaque filter configuration: parameter id -> selected value ids. Structure is configuration-dependent.","examples":[{"<parameterId>":["<valueId>"]}],"example":{"<parameterId>":["<valueId>"]}},{"type":"null"}]},"metafields":{"anyOf":[{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{},"description":"Opaque metafield map of customer-defined keys to values (string, number, or object).","examples":[{"lead-time-weeks":10,"care-label":"Wipe clean"}],"example":{"lead-time-weeks":10,"care-label":"Wipe clean"}},{"type":"null"}]},"src":{"anyOf":[{"type":"string","minLength":1},{"type":"null"}]}},"required":["id","code","name"],"additionalProperties":false}}},"required":["name","displayName"],"additionalProperties":false,"description":"Data schema used by Create Global Option Set (POST /v1/global-option-sets). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"GlobalOptionSetsUpdateRequest":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":255,"description":"Option set name (internal, not localized).","examples":["Colour"],"example":"Colour"},"displayName":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"},"examples":[{"en":"Colour","de":"Farbe"}],"description":"Display name, keyed by language code.","example":{"en":"Colour","de":"Farbe"}},"description":{"anyOf":[{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"},"examples":[{"en":"Pick a colour","de":"Wähle eine Farbe"}],"example":{"en":"Pick a colour","de":"Wähle eine Farbe"}},{"type":"null"}]},"status":{"type":"string","enum":["ACTIVE","INACTIVE"]},"tags":{"type":"array","items":{"type":"string","minLength":1,"maxLength":255}}},"additionalProperties":false,"description":"Data schema used by Update Global Option Set (PUT /v1/global-option-sets/{optionSetId}). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"GlobalOptionSetsOptionsRequest":{"type":"object","properties":{"options":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":255,"description":"Client-supplied option id; reuse the stored id to update an existing option.","examples":["af77627b-54d7-4039-86dc-599019320634"],"example":"af77627b-54d7-4039-86dc-599019320634"},"code":{"type":"string","minLength":1,"maxLength":255,"examples":["RED"],"example":"RED"},"name":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"},"examples":[{"en":"Red","de":"Rot"}],"example":{"en":"Red","de":"Rot"}},"comment":{"anyOf":[{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"},"examples":[{"en":"Warm tone","de":"Warmer Ton"}],"example":{"en":"Warm tone","de":"Warmer Ton"}},{"type":"null"}]},"priceCode":{"anyOf":[{"type":"string"},{"type":"null"}]},"fbPriceCode":{"anyOf":[{"type":"string"},{"type":"null"}]},"additionalPriceCode":{"anyOf":[{"type":"string"},{"type":"null"}]},"material3dId":{"anyOf":[{"type":"string"},{"type":"null"}]},"arMaterial3dId":{"anyOf":[{"type":"string"},{"type":"null"}]},"additionalPriceCodeQuantity":{"anyOf":[{"anyOf":[{"type":"integer","minimum":0,"maximum":9007199254740991},{"type":"string","minLength":1}],"description":"Quantity the `additionalPriceCode` applies to."},{"type":"null"}]},"filters":{"anyOf":[{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{},"description":"Opaque filter configuration: parameter id -> selected value ids. Structure is configuration-dependent.","examples":[{"<parameterId>":["<valueId>"]}],"example":{"<parameterId>":["<valueId>"]}},{"type":"null"}]},"metafields":{"anyOf":[{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{},"description":"Opaque metafield map of customer-defined keys to values (string, number, or object).","examples":[{"lead-time-weeks":10,"care-label":"Wipe clean"}],"example":{"lead-time-weeks":10,"care-label":"Wipe clean"}},{"type":"null"}]},"src":{"anyOf":[{"type":"string","minLength":1},{"type":"null"}]}},"required":["id","code","name"],"additionalProperties":false}}},"required":["options"],"additionalProperties":false,"description":"Data schema used by Update Global Option Set Options (PUT /v1/global-option-sets/{optionSetId}/options). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"GlobalOptionSetsOptionsRequest2":{"type":"object","properties":{"options":{"minItems":1,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":255,"description":"Client-supplied option id; reuse the stored id to update an existing option.","examples":["af77627b-54d7-4039-86dc-599019320634"],"example":"af77627b-54d7-4039-86dc-599019320634"},"code":{"type":"string","minLength":1,"maxLength":255,"examples":["RED"],"example":"RED"},"name":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"},"examples":[{"en":"Red","de":"Rot"}],"example":{"en":"Red","de":"Rot"}},"comment":{"anyOf":[{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"},"examples":[{"en":"Warm tone","de":"Warmer Ton"}],"example":{"en":"Warm tone","de":"Warmer Ton"}},{"type":"null"}]},"priceCode":{"anyOf":[{"type":"string"},{"type":"null"}]},"fbPriceCode":{"anyOf":[{"type":"string"},{"type":"null"}]},"additionalPriceCode":{"anyOf":[{"type":"string"},{"type":"null"}]},"material3dId":{"anyOf":[{"type":"string"},{"type":"null"}]},"arMaterial3dId":{"anyOf":[{"type":"string"},{"type":"null"}]},"additionalPriceCodeQuantity":{"anyOf":[{"anyOf":[{"type":"integer","minimum":0,"maximum":9007199254740991},{"type":"string","minLength":1}],"description":"Quantity the `additionalPriceCode` applies to."},{"type":"null"}]},"filters":{"anyOf":[{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{},"description":"Opaque filter configuration: parameter id -> selected value ids. Structure is configuration-dependent.","examples":[{"<parameterId>":["<valueId>"]}],"example":{"<parameterId>":["<valueId>"]}},{"type":"null"}]},"metafields":{"anyOf":[{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{},"description":"Opaque metafield map of customer-defined keys to values (string, number, or object).","examples":[{"lead-time-weeks":10,"care-label":"Wipe clean"}],"example":{"lead-time-weeks":10,"care-label":"Wipe clean"}},{"type":"null"}]},"src":{"anyOf":[{"type":"string","minLength":1},{"type":"null"}]}},"required":["id","code","name"],"additionalProperties":false}}},"required":["options"],"additionalProperties":false,"description":"Data schema used by Add or Update Global Option Set Options (POST /v1/global-option-sets/{optionSetId}/options). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"GlobalOptionSetsOptionsRemoveRequest":{"type":"object","properties":{"optionIds":{"minItems":1,"type":"array","items":{"type":"string","minLength":1,"maxLength":255},"description":"Ids of the options to remove.","examples":[["af77627b-54d7-4039-86dc-599019320634"]],"example":["af77627b-54d7-4039-86dc-599019320634"]}},"required":["optionIds"],"additionalProperties":false,"description":"Data schema used by Remove Global Option Set Options (POST /v1/global-option-sets/{optionSetId}/options:remove). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"CollectionSetsList":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"collectionSetId":{"type":"string","pattern":"^MCS-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Collection set identifier (MCS-<uuid>).","examples":["MCS-123e4567-e89b-12d3-a456-426614174000"],"example":"MCS-123e4567-e89b-12d3-a456-426614174000"},"name":{"type":"string"},"status":{"type":"string","enum":["ACTIVE","INACTIVE"]},"createdAt":{"anyOf":[{"type":"string"},{"type":"null"}]},"modifiedAt":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["collectionSetId","name","status","createdAt","modifiedAt"],"additionalProperties":false}},"page":{"type":"object","properties":{"limit":{"type":"number"},"nextCursor":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["limit","nextCursor"],"additionalProperties":false}},"required":["data","page"],"additionalProperties":false,"description":"Data schema used by List Collection Sets (GET /v1/collection-sets). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"CollectionSetsDetail":{"type":"object","properties":{"data":{"type":"object","properties":{"collectionSetId":{"type":"string","pattern":"^MCS-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Collection set identifier (MCS-<uuid>).","examples":["MCS-123e4567-e89b-12d3-a456-426614174000"],"example":"MCS-123e4567-e89b-12d3-a456-426614174000"},"name":{"type":"string"},"status":{"type":"string","enum":["ACTIVE","INACTIVE"]},"createdAt":{"anyOf":[{"type":"string"},{"type":"null"}]},"modifiedAt":{"anyOf":[{"type":"string"},{"type":"null"}]},"tags":{"type":"array","items":{"type":"string"}},"optionSets":{"type":"array","items":{"type":"object","properties":{"optionSetId":{"type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]},"status":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["optionSetId","name","status"],"additionalProperties":false}}},"required":["collectionSetId","name","status","createdAt","modifiedAt","tags","optionSets"],"additionalProperties":false}},"required":["data"],"additionalProperties":false,"description":"Data schema used by Get Collection Set (GET /v1/collection-sets/{collectionSetId}). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"CollectionSetsMutation":{"type":"object","properties":{"data":{"type":"object","properties":{"collectionSetId":{"type":"string","pattern":"^MCS-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Collection set identifier (MCS-<uuid>).","examples":["MCS-123e4567-e89b-12d3-a456-426614174000"],"example":"MCS-123e4567-e89b-12d3-a456-426614174000"},"name":{"type":"string"},"status":{"type":"string","enum":["ACTIVE","INACTIVE"]},"createdAt":{"anyOf":[{"type":"string"},{"type":"null"}]},"modifiedAt":{"anyOf":[{"type":"string"},{"type":"null"}]},"tags":{"type":"array","items":{"type":"string"}},"optionSets":{"type":"array","items":{"type":"object","properties":{"optionSetId":{"type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]},"status":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["optionSetId","name","status"],"additionalProperties":false}}},"required":["collectionSetId"],"additionalProperties":false}},"required":["data"],"additionalProperties":false,"description":"Data schema used by Create Collection Set (POST /v1/collection-sets). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"CollectionSetsCreateRequest":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":255,"description":"Collection set name.","examples":["Summer Collection"],"example":"Summer Collection"},"status":{"type":"string","enum":["ACTIVE","INACTIVE"]},"tags":{"type":"array","items":{"type":"string","minLength":1,"maxLength":255}},"optionSetIds":{"type":"array","items":{"type":"string","pattern":"^OPT-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Member option set identifier (OPT-<uuid>).","examples":["OPT-123e4567-e89b-12d3-a456-426614174000"],"example":"OPT-123e4567-e89b-12d3-a456-426614174000"}}},"required":["name"],"additionalProperties":false,"description":"Data schema used by Create Collection Set (POST /v1/collection-sets). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"CollectionSetsUpdateRequest":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":255,"description":"Collection set name.","examples":["Summer Collection"],"example":"Summer Collection"},"tags":{"type":"array","items":{"type":"string","minLength":1,"maxLength":255}},"status":{"type":"string","enum":["ACTIVE","INACTIVE"]}},"additionalProperties":false,"description":"Data schema used by Update Collection Set (PUT /v1/collection-sets/{collectionSetId}). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"CollectionSetsOptionSetsRequest":{"type":"object","properties":{"optionSetIds":{"type":"array","items":{"type":"string","pattern":"^OPT-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Member option set identifier (OPT-<uuid>).","examples":["OPT-123e4567-e89b-12d3-a456-426614174000"],"example":"OPT-123e4567-e89b-12d3-a456-426614174000"}}},"required":["optionSetIds"],"additionalProperties":false,"description":"Data schema used by Update Collection Set Option Sets (PUT /v1/collection-sets/{collectionSetId}/option-sets). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"CollectionSetsOptionSetsRequest2":{"type":"object","properties":{"optionSetIds":{"minItems":1,"type":"array","items":{"type":"string","pattern":"^OPT-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Member option set identifier (OPT-<uuid>).","examples":["OPT-123e4567-e89b-12d3-a456-426614174000"],"example":"OPT-123e4567-e89b-12d3-a456-426614174000"}}},"required":["optionSetIds"],"additionalProperties":false,"description":"Data schema used by Add Collection Set Option Sets (POST /v1/collection-sets/{collectionSetId}/option-sets). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"CollectionSetsOptionSetsRemoveRequest":{"type":"object","properties":{"optionSetIds":{"minItems":1,"type":"array","items":{"type":"string","pattern":"^OPT-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Member option set identifier (OPT-<uuid>).","examples":["OPT-123e4567-e89b-12d3-a456-426614174000"],"example":"OPT-123e4567-e89b-12d3-a456-426614174000"}}},"required":["optionSetIds"],"additionalProperties":false,"description":"Data schema used by Remove Collection Set Option Sets (POST /v1/collection-sets/{collectionSetId}/option-sets:remove). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"GalleriesList":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"galleryId":{"type":"string","pattern":"^GALL-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Gallery identifier (GALL-<uuid>).","examples":["GALL-123e4567-e89b-12d3-a456-426614174000"],"example":"GALL-123e4567-e89b-12d3-a456-426614174000"},"name":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}}]},{"type":"null"}],"description":"Translated text when `lang` is set, otherwise the full `{ language: text }` map. Languages with no text are omitted, and a field with no text at all is null.","examples":["Chair",{"en":"Chair","de":"Stuhl"}],"example":"Chair"},"numberOfItems":{"type":"number"},"createdAt":{"anyOf":[{"type":"string"},{"type":"null"}]},"modifiedAt":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["galleryId","name","numberOfItems","createdAt","modifiedAt"],"additionalProperties":false}},"page":{"type":"object","properties":{"limit":{"type":"number"},"nextCursor":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["limit","nextCursor"],"additionalProperties":false}},"required":["data","page"],"additionalProperties":false,"description":"Data schema used by List Galleries (GET /v1/galleries). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"GalleriesDetail":{"type":"object","properties":{"data":{"type":"object","properties":{"galleryId":{"type":"string","pattern":"^GALL-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Gallery identifier (GALL-<uuid>).","examples":["GALL-123e4567-e89b-12d3-a456-426614174000"],"example":"GALL-123e4567-e89b-12d3-a456-426614174000"},"name":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}}]},{"type":"null"}],"description":"Translated text when `lang` is set, otherwise the full `{ language: text }` map. Languages with no text are omitted, and a field with no text at all is null.","examples":["Chair",{"en":"Chair","de":"Stuhl"}],"example":"Chair"},"numberOfItems":{"type":"number"},"createdAt":{"anyOf":[{"type":"string"},{"type":"null"}]},"modifiedAt":{"anyOf":[{"type":"string"},{"type":"null"}]},"description":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}}]},{"type":"null"}],"description":"Translated text when `lang` is set, otherwise the full `{ language: text }` map. Languages with no text are omitted, and a field with no text at all is null.","examples":["Chair",{"en":"Chair","de":"Stuhl"}],"example":"Chair"},"numColumns":{"anyOf":[{"type":"string"},{"type":"null"}]},"items":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"mediaType":{"type":"string","enum":["IMAGE","VIDEO"]},"mediaSource":{"type":"string","enum":["CUSTOM","MEDIA_LIBRARY"]},"caption":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}}]},{"type":"null"}],"description":"Translated text when `lang` is set, otherwise the full `{ language: text }` map. Languages with no text are omitted, and a field with no text at all is null.","examples":["Chair",{"en":"Chair","de":"Stuhl"}],"example":"Chair"},"fileId":{"anyOf":[{"type":"string"},{"type":"null"}]},"filePath":{"anyOf":[{"type":"string"},{"type":"null"}]},"url":{"anyOf":[{"type":"string"},{"type":"null"}]},"loop":{"anyOf":[{"type":"boolean"},{"type":"null"}]},"autoplay":{"anyOf":[{"type":"boolean"},{"type":"null"}]}},"required":["id","mediaType","mediaSource","caption","fileId","filePath","url","loop","autoplay"],"additionalProperties":false}}},"required":["galleryId","name","numberOfItems","createdAt","modifiedAt","description","numColumns","items"],"additionalProperties":false}},"required":["data"],"additionalProperties":false,"description":"Data schema used by Get Gallery (GET /v1/galleries/{galleryId}). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"GalleriesMutation":{"type":"object","properties":{"data":{"type":"object","properties":{"galleryId":{"type":"string","pattern":"^GALL-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Gallery identifier (GALL-<uuid>).","examples":["GALL-123e4567-e89b-12d3-a456-426614174000"],"example":"GALL-123e4567-e89b-12d3-a456-426614174000"},"name":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}}]},{"type":"null"}],"description":"Translated text when `lang` is set, otherwise the full `{ language: text }` map. Languages with no text are omitted, and a field with no text at all is null.","examples":["Chair",{"en":"Chair","de":"Stuhl"}],"example":"Chair"},"numberOfItems":{"type":"number"},"createdAt":{"anyOf":[{"type":"string"},{"type":"null"}]},"modifiedAt":{"anyOf":[{"type":"string"},{"type":"null"}]},"description":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}}]},{"type":"null"}],"description":"Translated text when `lang` is set, otherwise the full `{ language: text }` map. Languages with no text are omitted, and a field with no text at all is null.","examples":["Chair",{"en":"Chair","de":"Stuhl"}],"example":"Chair"},"numColumns":{"anyOf":[{"type":"string"},{"type":"null"}]},"items":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"mediaType":{"type":"string","enum":["IMAGE","VIDEO"]},"mediaSource":{"type":"string","enum":["CUSTOM","MEDIA_LIBRARY"]},"caption":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}}]},{"type":"null"}],"description":"Translated text when `lang` is set, otherwise the full `{ language: text }` map. Languages with no text are omitted, and a field with no text at all is null.","examples":["Chair",{"en":"Chair","de":"Stuhl"}],"example":"Chair"},"fileId":{"anyOf":[{"type":"string"},{"type":"null"}]},"filePath":{"anyOf":[{"type":"string"},{"type":"null"}]},"url":{"anyOf":[{"type":"string"},{"type":"null"}]},"loop":{"anyOf":[{"type":"boolean"},{"type":"null"}]},"autoplay":{"anyOf":[{"type":"boolean"},{"type":"null"}]}},"required":["id","mediaType","mediaSource","caption","fileId","filePath","url","loop","autoplay"],"additionalProperties":false}}},"required":["galleryId"],"additionalProperties":false}},"required":["data"],"additionalProperties":false,"description":"Data schema used by Create Gallery (POST /v1/galleries). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"GalleriesCreateRequest":{"type":"object","properties":{"name":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"},"examples":[{"en":"Summer Lookbook","de":"Sommer-Lookbook"}],"description":"Gallery name, keyed by language code.","example":{"en":"Summer Lookbook","de":"Sommer-Lookbook"}},"description":{"anyOf":[{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"},"examples":[{"en":"Spring collection","de":"Frühjahrskollektion"}],"example":{"en":"Spring collection","de":"Frühjahrskollektion"}},{"type":"null"}]},"numColumns":{"type":"string","minLength":1},"items":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":255},"mediaType":{"type":"string","enum":["IMAGE","VIDEO"]},"mediaSource":{"type":"string","enum":["CUSTOM","MEDIA_LIBRARY"]},"caption":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"anyOf":[{"type":"string"},{"type":"null"}]},"examples":[{"en":"A caption","de":"Eine Bildunterschrift"}],"example":{"en":"A caption","de":"Eine Bildunterschrift"}},"fileId":{"anyOf":[{"type":"string","minLength":1},{"type":"null"}]},"filePath":{"anyOf":[{"type":"string","minLength":1},{"type":"null"}]},"url":{"anyOf":[{"type":"string","minLength":1},{"type":"null"}]},"loop":{"anyOf":[{"type":"boolean"},{"type":"null"}]},"autoplay":{"anyOf":[{"type":"boolean"},{"type":"null"}]}},"required":["id","mediaType","mediaSource"],"additionalProperties":false}}},"required":["name"],"additionalProperties":false,"description":"Data schema used by Create Gallery (POST /v1/galleries). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"GalleriesUpdateRequest":{"type":"object","properties":{"name":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"},"examples":[{"en":"Summer Lookbook","de":"Sommer-Lookbook"}],"description":"Gallery name, keyed by language code.","example":{"en":"Summer Lookbook","de":"Sommer-Lookbook"}},"description":{"anyOf":[{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"},"examples":[{"en":"Spring collection","de":"Frühjahrskollektion"}],"example":{"en":"Spring collection","de":"Frühjahrskollektion"}},{"type":"null"}]},"numColumns":{"type":"string","minLength":1}},"additionalProperties":false,"description":"Data schema used by Update Gallery (PUT /v1/galleries/{galleryId}). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"GalleriesItemsRequest":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":255},"mediaType":{"type":"string","enum":["IMAGE","VIDEO"]},"mediaSource":{"type":"string","enum":["CUSTOM","MEDIA_LIBRARY"]},"caption":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"anyOf":[{"type":"string"},{"type":"null"}]},"examples":[{"en":"A caption","de":"Eine Bildunterschrift"}],"example":{"en":"A caption","de":"Eine Bildunterschrift"}},"fileId":{"anyOf":[{"type":"string","minLength":1},{"type":"null"}]},"filePath":{"anyOf":[{"type":"string","minLength":1},{"type":"null"}]},"url":{"anyOf":[{"type":"string","minLength":1},{"type":"null"}]},"loop":{"anyOf":[{"type":"boolean"},{"type":"null"}]},"autoplay":{"anyOf":[{"type":"boolean"},{"type":"null"}]}},"required":["id","mediaType","mediaSource"],"additionalProperties":false}}},"required":["items"],"additionalProperties":false,"examples":[{"items":[{"id":"dd6b3644-4e56-4ccc-ac34-f8abca595a7f","mediaType":"IMAGE","mediaSource":"MEDIA_LIBRARY","caption":{"en":"Front view"},"fileId":"dd6b3644-4e56-4ccc-ac34-f8abca595a7f","filePath":"c_rmE/dd6b3644-4e56-4ccc-ac34-f8abca595a7f.jpg"},{"id":"13421ebc-8888-45db-b40d-b5180d803aba","mediaType":"VIDEO","mediaSource":"CUSTOM","caption":{"en":"Promo"},"url":"https://www.youtube.com/watch?v=VIDEO_ID","autoplay":true,"loop":true},{"id":"8f6c9ac0-2686-455c-9e93-93a5199f289c","mediaType":"VIDEO","mediaSource":"MEDIA_LIBRARY","fileId":"4391d4d0-e42d-4d6c-81ba-1a7f4936f679","filePath":"c_rmE/4391d4d0-e42d-4d6c-81ba-1a7f4936f679.mov","autoplay":false,"loop":false}]}],"example":{"items":[{"id":"dd6b3644-4e56-4ccc-ac34-f8abca595a7f","mediaType":"IMAGE","mediaSource":"MEDIA_LIBRARY","caption":{"en":"Front view"},"fileId":"dd6b3644-4e56-4ccc-ac34-f8abca595a7f","filePath":"c_rmE/dd6b3644-4e56-4ccc-ac34-f8abca595a7f.jpg"},{"id":"13421ebc-8888-45db-b40d-b5180d803aba","mediaType":"VIDEO","mediaSource":"CUSTOM","caption":{"en":"Promo"},"url":"https://www.youtube.com/watch?v=VIDEO_ID","autoplay":true,"loop":true},{"id":"8f6c9ac0-2686-455c-9e93-93a5199f289c","mediaType":"VIDEO","mediaSource":"MEDIA_LIBRARY","fileId":"4391d4d0-e42d-4d6c-81ba-1a7f4936f679","filePath":"c_rmE/4391d4d0-e42d-4d6c-81ba-1a7f4936f679.mov","autoplay":false,"loop":false}]},"description":"Data schema used by Update Gallery Items (PUT /v1/galleries/{galleryId}/items). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"GalleriesItemsRequest2":{"type":"object","properties":{"items":{"minItems":1,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":255},"mediaType":{"type":"string","enum":["IMAGE","VIDEO"]},"mediaSource":{"type":"string","enum":["CUSTOM","MEDIA_LIBRARY"]},"caption":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"anyOf":[{"type":"string"},{"type":"null"}]},"examples":[{"en":"A caption","de":"Eine Bildunterschrift"}],"example":{"en":"A caption","de":"Eine Bildunterschrift"}},"fileId":{"anyOf":[{"type":"string","minLength":1},{"type":"null"}]},"filePath":{"anyOf":[{"type":"string","minLength":1},{"type":"null"}]},"url":{"anyOf":[{"type":"string","minLength":1},{"type":"null"}]},"loop":{"anyOf":[{"type":"boolean"},{"type":"null"}]},"autoplay":{"anyOf":[{"type":"boolean"},{"type":"null"}]}},"required":["id","mediaType","mediaSource"],"additionalProperties":false}}},"required":["items"],"additionalProperties":false,"description":"Data schema used by Add or Update Gallery Items (POST /v1/galleries/{galleryId}/items). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"GalleriesItemsRemoveRequest":{"type":"object","properties":{"itemIds":{"minItems":1,"type":"array","items":{"type":"string","minLength":1,"maxLength":255},"description":"Ids of the items to remove, as returned in the gallery detail.","examples":[["dd6b3644-4e56-4ccc-ac34-f8abca595a7f"]],"example":["dd6b3644-4e56-4ccc-ac34-f8abca595a7f"]}},"required":["itemIds"],"additionalProperties":false,"description":"Data schema used by Remove Gallery Items (POST /v1/galleries/{galleryId}/items:remove). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"ItemMastersList":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"itemMasterId":{"type":"string","pattern":"^IM-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Item master identifier (IM-<uuid>).","examples":["IM-123e4567-e89b-12d3-a456-426614174000"],"example":"IM-123e4567-e89b-12d3-a456-426614174000"},"code":{"type":"string"},"deliveryTime":{"anyOf":[{"type":"number"},{"type":"null"}]},"m3":{"anyOf":[{"type":"number"},{"type":"null"}]},"weight":{"anyOf":[{"type":"number"},{"type":"null"}]},"weightUnit":{"type":"string","enum":["kg","lb"]},"dimensions":{"type":"object","properties":{"width":{"anyOf":[{"type":"number"},{"type":"null"}]},"depth":{"anyOf":[{"type":"number"},{"type":"null"}]},"height":{"anyOf":[{"type":"number"},{"type":"null"}]}},"required":["width","depth","height"],"additionalProperties":false},"commerceId":{"anyOf":[{"type":"string"},{"type":"null"}]},"createdAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO 8601 creation timestamp."},"modifiedAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO 8601 last-modified timestamp."}},"required":["itemMasterId","code","deliveryTime","m3","weight","weightUnit","dimensions","commerceId","createdAt","modifiedAt"],"additionalProperties":false}},"page":{"type":"object","properties":{"limit":{"type":"number"},"nextCursor":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Cursor for the next page, or null on the last page."}},"required":["limit","nextCursor"],"additionalProperties":false}},"required":["data","page"],"additionalProperties":false,"description":"Data schema used by List Item Masters (GET /v1/item-masters). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"ItemMastersMutation":{"type":"object","properties":{"data":{"type":"object","properties":{"itemMasterId":{"type":"string","pattern":"^IM-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Item master identifier (IM-<uuid>).","examples":["IM-123e4567-e89b-12d3-a456-426614174000"],"example":"IM-123e4567-e89b-12d3-a456-426614174000"},"code":{"type":"string"},"deliveryTime":{"anyOf":[{"type":"number"},{"type":"null"}]},"m3":{"anyOf":[{"type":"number"},{"type":"null"}]},"weight":{"anyOf":[{"type":"number"},{"type":"null"}]},"weightUnit":{"type":"string","enum":["kg","lb"]},"dimensions":{"type":"object","properties":{"width":{"anyOf":[{"type":"number"},{"type":"null"}]},"depth":{"anyOf":[{"type":"number"},{"type":"null"}]},"height":{"anyOf":[{"type":"number"},{"type":"null"}]}},"required":["width","depth","height"],"additionalProperties":false},"commerceId":{"anyOf":[{"type":"string"},{"type":"null"}]},"createdAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO 8601 creation timestamp."},"modifiedAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO 8601 last-modified timestamp."},"aliasCodes":{"type":"array","items":{"type":"object","properties":{"companyId":{"type":"string"},"companyName":{"anyOf":[{"type":"string"},{"type":"null"}]},"aliasCode":{"type":"string"}},"required":["companyId","companyName","aliasCode"],"additionalProperties":false}},"marketCostPrices":{"type":"array","items":{"type":"object","properties":{"market":{"anyOf":[{"type":"string"},{"type":"null"}]},"quantity":{"anyOf":[{"type":"number"},{"type":"null"}]},"cost":{"anyOf":[{"type":"number"},{"type":"null"}]},"rrp":{"anyOf":[{"type":"number"},{"type":"null"}]},"modifiedAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO 8601 last-modified timestamp."}},"required":["market","quantity","cost","rrp","modifiedAt"],"additionalProperties":false}}},"required":["itemMasterId"],"additionalProperties":false}},"required":["data"],"additionalProperties":false,"description":"Data schema used by Create Item Master (POST /v1/item-masters). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"ItemMastersCreateRequest":{"type":"object","properties":{"code":{"type":"string","minLength":1,"maxLength":255,"pattern":"^[./\\\\_\\-\\w]+$"},"deliveryTime":{"type":"integer","minimum":0,"maximum":9007199254740991},"m3":{"type":"number","minimum":0},"weight":{"type":"number","minimum":0},"weightUnit":{"type":"string","enum":["kg","lb"]},"dimensions":{"type":"object","properties":{"width":{"type":"number","minimum":0},"depth":{"type":"number","minimum":0},"height":{"type":"number","minimum":0}},"additionalProperties":false},"commerceId":{"type":"string","minLength":1,"maxLength":255},"aliasCodes":{"type":"array","items":{"type":"object","properties":{"companyId":{"type":"string","pattern":"^COMP-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"},"companyName":{"type":"string","minLength":1,"maxLength":255},"aliasCode":{"type":"string","minLength":1,"maxLength":255}},"required":["companyId","aliasCode"],"additionalProperties":false}}},"required":["code"],"additionalProperties":false,"description":"Data schema used by Create Item Master (POST /v1/item-masters). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"ItemMastersBulkResponse":{"type":"object","properties":{"data":{"type":"object","properties":{"existingCount":{"type":"number","description":"Records already stored for the customer before the import."},"added":{"type":"number"},"updated":{"type":"number"},"processed":{"type":"number"},"skippedCodes":{"type":"array","items":{"type":"string"},"description":"Codes skipped because they already exist (CREATE mode; UPSERT updates them)."},"invalidCodes":{"type":"array","items":{"type":"string"},"description":"Codes rejected by validation."},"errorsFileUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"URL of a generated errors report, or null."}},"required":["existingCount","added","updated","processed","skippedCodes","invalidCodes","errorsFileUrl"],"additionalProperties":false}},"required":["data"],"additionalProperties":false,"description":"Data schema used by Bulk upsert Item Masters (POST /v1/item-masters:bulk). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"ItemMastersBulkRequest":{"type":"object","properties":{"mode":{"default":"CREATE","type":"string","enum":["CREATE","UPSERT"]},"items":{"minItems":1,"maxItems":1000,"type":"array","items":{"type":"object","properties":{"code":{"type":"string","minLength":1,"maxLength":255,"pattern":"^[./\\\\_\\-\\w]+$"},"deliveryTime":{"type":"integer","minimum":0,"maximum":9007199254740991},"m3":{"type":"number","minimum":0},"weight":{"type":"number","minimum":0},"weightUnit":{"type":"string","enum":["kg","lb"]},"dimensions":{"type":"object","properties":{"width":{"type":"number","minimum":0},"depth":{"type":"number","minimum":0},"height":{"type":"number","minimum":0}},"additionalProperties":false},"commerceId":{"type":"string","minLength":1,"maxLength":255}},"required":["code"],"additionalProperties":false}}},"required":["items"],"additionalProperties":false,"description":"Data schema used by Bulk upsert Item Masters (POST /v1/item-masters:bulk). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"ItemMastersDetail":{"type":"object","properties":{"data":{"type":"object","properties":{"itemMasterId":{"type":"string","pattern":"^IM-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Item master identifier (IM-<uuid>).","examples":["IM-123e4567-e89b-12d3-a456-426614174000"],"example":"IM-123e4567-e89b-12d3-a456-426614174000"},"code":{"type":"string"},"deliveryTime":{"anyOf":[{"type":"number"},{"type":"null"}]},"m3":{"anyOf":[{"type":"number"},{"type":"null"}]},"weight":{"anyOf":[{"type":"number"},{"type":"null"}]},"weightUnit":{"type":"string","enum":["kg","lb"]},"dimensions":{"type":"object","properties":{"width":{"anyOf":[{"type":"number"},{"type":"null"}]},"depth":{"anyOf":[{"type":"number"},{"type":"null"}]},"height":{"anyOf":[{"type":"number"},{"type":"null"}]}},"required":["width","depth","height"],"additionalProperties":false},"commerceId":{"anyOf":[{"type":"string"},{"type":"null"}]},"createdAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO 8601 creation timestamp."},"modifiedAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO 8601 last-modified timestamp."},"aliasCodes":{"type":"array","items":{"type":"object","properties":{"companyId":{"type":"string"},"companyName":{"anyOf":[{"type":"string"},{"type":"null"}]},"aliasCode":{"type":"string"}},"required":["companyId","companyName","aliasCode"],"additionalProperties":false}},"marketCostPrices":{"type":"array","items":{"type":"object","properties":{"market":{"anyOf":[{"type":"string"},{"type":"null"}]},"quantity":{"anyOf":[{"type":"number"},{"type":"null"}]},"cost":{"anyOf":[{"type":"number"},{"type":"null"}]},"rrp":{"anyOf":[{"type":"number"},{"type":"null"}]},"modifiedAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO 8601 last-modified timestamp."}},"required":["market","quantity","cost","rrp","modifiedAt"],"additionalProperties":false}}},"required":["itemMasterId","code","deliveryTime","m3","weight","weightUnit","dimensions","commerceId","createdAt","modifiedAt","aliasCodes","marketCostPrices"],"additionalProperties":false}},"required":["data"],"additionalProperties":false,"description":"Data schema used by Get Item Master (GET /v1/item-masters/{itemMasterId}). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"MarketCostPricesList":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"marketCostPriceId":{"type":"string","pattern":"^MCP-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Market cost price identifier (MCP-<uuid>).","examples":["MCP-123e4567-e89b-12d3-a456-426614174000"],"example":"MCP-123e4567-e89b-12d3-a456-426614174000"},"market":{"anyOf":[{"type":"string"},{"type":"null"}]},"code":{"anyOf":[{"type":"string"},{"type":"null"}]},"quantity":{"anyOf":[{"type":"number"},{"type":"null"}]},"cost":{"anyOf":[{"type":"number","minimum":0,"description":"Cost price in the market currency.","examples":[55.5],"example":55.5},{"type":"null"}]},"rrp":{"anyOf":[{"type":"number","minimum":0,"description":"Recommended retail price in the market currency.","examples":[150],"example":150},{"type":"null"}]},"currency":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Currency symbol derived from the market.","examples":["£"],"example":"£"},"createdAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO 8601 creation timestamp."},"modifiedAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO 8601 last-modified timestamp."}},"required":["marketCostPriceId","market","code","quantity","cost","rrp","currency","createdAt","modifiedAt"],"additionalProperties":false}},"page":{"type":"object","properties":{"limit":{"type":"number"},"nextCursor":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Cursor for the next page, or null on the last page."},"truncated":{"type":"boolean","description":"True when this query matched at least as many records as the API can return in one go, so records matching it may exist beyond the last page and paging to `nextCursor: null` would not reach them. Narrow the result set with `search` to bring them into range."},"totalRecords":{"type":"number","description":"Total market cost prices stored for your customer. Always the stored total, unaffected by `search` and `market`, so it is not the size of a filtered result set."}},"required":["limit","nextCursor","truncated","totalRecords"],"additionalProperties":false}},"required":["data","page"],"additionalProperties":false,"description":"Data schema used by List Market Cost Prices (GET /v1/market-cost-prices). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"MarketCostPricesBulkResponse":{"type":"object","properties":{"data":{"type":"object","properties":{"existingCount":{"type":"number","description":"Records already stored for the customer before the import."},"added":{"type":"number"},"updated":{"type":"number","description":"Existing rows re-written (UPSERT). Currently includes rows re-sent unchanged."},"unchanged":{"type":"number","description":"Existing rows re-sent with no change. Reserved: currently always 0 (such rows are counted under `updated`) until server-side change detection ships."},"processed":{"type":"number"},"invalidCodes":{"type":"array","items":{"type":"string"},"description":"Full codes rejected by validation."},"skippedCodes":{"type":"array","items":{"type":"string"},"description":"Full codes skipped because they already exist (CREATE mode; UPSERT updates them)."}},"required":["existingCount","added","updated","unchanged","processed","invalidCodes","skippedCodes"],"additionalProperties":false}},"required":["data"],"additionalProperties":false,"description":"Data schema used by Bulk upsert Market Cost Prices (POST /v1/market-cost-prices:bulk). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"MarketCostPricesBulkRequest":{"type":"object","properties":{"mode":{"default":"CREATE","description":"CREATE adds only (existing full codes are skipped); UPSERT updates them.","type":"string","enum":["CREATE","UPSERT"]},"items":{"minItems":1,"maxItems":5000,"type":"array","items":{"type":"object","properties":{"market":{"type":"string","minLength":1,"maxLength":255,"description":"Market the price applies to, as configured for the customer.","examples":["UK"],"example":"UK"},"code":{"type":"string","minLength":1,"maxLength":255,"pattern":"^[./\\\\_\\-\\w]+$","description":"Product/variant code.","examples":["A-TM1680/BE"],"example":"A-TM1680/BE"},"quantity":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Quantity tier the price applies to (integer ≥ 0).","examples":[1],"example":1},"cost":{"type":"number","minimum":0,"description":"Cost price in the market currency.","examples":[55.5],"example":55.5},"rrp":{"type":"number","minimum":0,"description":"Recommended retail price in the market currency.","examples":[150],"example":150}},"required":["market","code","quantity","cost"],"additionalProperties":false},"description":"1–5000 items."}},"required":["items"],"additionalProperties":false,"description":"Data schema used by Bulk upsert Market Cost Prices (POST /v1/market-cost-prices:bulk). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"MarketCostPricesMutation":{"type":"object","properties":{"data":{"type":"object","properties":{"marketCostPriceId":{"type":"string","pattern":"^MCP-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Market cost price identifier (MCP-<uuid>).","examples":["MCP-123e4567-e89b-12d3-a456-426614174000"],"example":"MCP-123e4567-e89b-12d3-a456-426614174000"}},"required":["marketCostPriceId"],"additionalProperties":false}},"required":["data"],"additionalProperties":false,"description":"Data schema used by Create Market Cost Price (POST /v1/market-cost-prices). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"MarketCostPricesCreateRequest":{"type":"object","properties":{"market":{"type":"string","minLength":1,"maxLength":255,"description":"Market the price applies to, as configured for the customer.","examples":["UK"],"example":"UK"},"code":{"type":"string","minLength":1,"maxLength":255,"pattern":"^[./\\\\_\\-\\w]+$","description":"Product/variant code.","examples":["A-TM1680/BE"],"example":"A-TM1680/BE"},"quantity":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Quantity tier the price applies to (integer ≥ 0).","examples":[1],"example":1},"cost":{"type":"number","minimum":0,"description":"Cost price in the market currency.","examples":[55.5],"example":55.5},"rrp":{"type":"number","minimum":0,"description":"Recommended retail price in the market currency.","examples":[150],"example":150}},"required":["market","code","quantity","cost"],"additionalProperties":false,"description":"Data schema used by Create Market Cost Price (POST /v1/market-cost-prices). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"PriceListsList":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"priceListId":{"type":"string","pattern":"^PL-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Price list identifier (PL-<uuid>).","examples":["PL-123e4567-e89b-12d3-a456-426614174000"],"example":"PL-123e4567-e89b-12d3-a456-426614174000"},"priceListName":{"type":"string"},"status":{"type":"string"},"currency":{"anyOf":[{"type":"string"},{"type":"null"}]},"validPeriod":{"type":"array","prefixItems":[{"anyOf":[{"type":"string"},{"type":"null"}]},{"anyOf":[{"type":"string"},{"type":"null"}]}]},"isPromotional":{"type":"boolean"},"createdAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO 8601 creation timestamp."},"modifiedAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO 8601 last-modified timestamp."},"mode":{"type":"string","enum":["FIXED","CALCULATED","LINKED"]},"market":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["priceListId","priceListName","status","currency","validPeriod","isPromotional","createdAt","modifiedAt","mode","market"],"additionalProperties":false}},"page":{"type":"object","properties":{"limit":{"type":"number"},"nextCursor":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["limit","nextCursor"],"additionalProperties":false}},"required":["data","page"],"additionalProperties":false,"description":"Data schema used by List Price Lists (GET /v1/price-lists). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"PriceListsMutation":{"type":"object","properties":{"data":{"anyOf":[{"oneOf":[{"type":"object","properties":{"priceListId":{"type":"string","pattern":"^PL-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Price list identifier (PL-<uuid>).","examples":["PL-123e4567-e89b-12d3-a456-426614174000"],"example":"PL-123e4567-e89b-12d3-a456-426614174000"},"priceListName":{"type":"string"},"status":{"type":"string"},"currency":{"anyOf":[{"type":"string"},{"type":"null"}]},"validPeriod":{"type":"array","prefixItems":[{"anyOf":[{"type":"string"},{"type":"null"}]},{"anyOf":[{"type":"string"},{"type":"null"}]}]},"isPromotional":{"type":"boolean"},"companies":{"type":"array","items":{"type":"object","properties":{"companyId":{"type":"string"},"companyName":{"type":"string"}},"required":["companyId","companyName"],"additionalProperties":false}},"createdAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO 8601 creation timestamp."},"modifiedAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO 8601 last-modified timestamp."},"mode":{"type":"string","const":"FIXED"},"market":{"anyOf":[{"type":"string"},{"type":"null"}]},"calculation":{"type":"object","properties":{"costMultiplier":{"anyOf":[{"type":"number"},{"type":"null"}]}},"required":["costMultiplier"],"additionalProperties":false},"body":{"type":"object","properties":{"codes":{"type":"array","items":{"type":"object","properties":{"priceCode":{"type":"string"},"quantity":{"anyOf":[{"type":"number"},{"type":"null"}]},"rrp":{"anyOf":[{"type":"number"},{"type":"null"}]},"sale":{"anyOf":[{"type":"number"},{"type":"null"}]}},"required":["priceCode","quantity","rrp","sale"],"additionalProperties":false}}},"required":["codes"],"additionalProperties":false}},"required":["priceListId","priceListName","status","currency","validPeriod","isPromotional","companies","createdAt","modifiedAt","mode","market","calculation","body"],"additionalProperties":false},{"type":"object","properties":{"priceListId":{"type":"string","pattern":"^PL-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Price list identifier (PL-<uuid>).","examples":["PL-123e4567-e89b-12d3-a456-426614174000"],"example":"PL-123e4567-e89b-12d3-a456-426614174000"},"priceListName":{"type":"string"},"status":{"type":"string"},"currency":{"anyOf":[{"type":"string"},{"type":"null"}]},"validPeriod":{"type":"array","prefixItems":[{"anyOf":[{"type":"string"},{"type":"null"}]},{"anyOf":[{"type":"string"},{"type":"null"}]}]},"isPromotional":{"type":"boolean"},"companies":{"type":"array","items":{"type":"object","properties":{"companyId":{"type":"string"},"companyName":{"type":"string"}},"required":["companyId","companyName"],"additionalProperties":false}},"createdAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO 8601 creation timestamp."},"modifiedAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO 8601 last-modified timestamp."},"mode":{"type":"string","const":"CALCULATED"},"market":{"anyOf":[{"type":"string"},{"type":"null"}]},"scope":{"anyOf":[{"type":"string"},{"type":"null"}]},"selectedCustomers":{"type":"array","items":{"type":"string"}},"selectedProducts":{"type":"array","items":{"type":"string"}},"calculation":{"type":"object","properties":{"costMultiplier":{"anyOf":[{"type":"number"},{"type":"null"}]},"rrp":{"anyOf":[{"type":"object","properties":{"method":{"anyOf":[{"type":"string"},{"type":"null"}]},"value":{"anyOf":[{"type":"number"},{"type":"null"}]},"rounding":{"type":"object","properties":{"mode":{"anyOf":[{"type":"string"},{"type":"null"}]},"increment":{"anyOf":[{"type":"number"},{"type":"null"}]}},"required":["mode","increment"],"additionalProperties":false}},"required":["method","value","rounding"],"additionalProperties":false},{"type":"null"}]},"sale":{"anyOf":[{"type":"object","properties":{"method":{"anyOf":[{"type":"string"},{"type":"null"}]},"value":{"anyOf":[{"type":"number"},{"type":"null"}]},"rounding":{"type":"object","properties":{"mode":{"anyOf":[{"type":"string"},{"type":"null"}]},"increment":{"anyOf":[{"type":"number"},{"type":"null"}]}},"required":["mode","increment"],"additionalProperties":false}},"required":["method","value","rounding"],"additionalProperties":false},{"type":"null"}]}},"required":["costMultiplier","rrp","sale"],"additionalProperties":false}},"required":["priceListId","priceListName","status","currency","validPeriod","isPromotional","companies","createdAt","modifiedAt","mode","market","scope","selectedCustomers","selectedProducts","calculation"],"additionalProperties":false},{"type":"object","properties":{"priceListId":{"type":"string","pattern":"^PL-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Price list identifier (PL-<uuid>).","examples":["PL-123e4567-e89b-12d3-a456-426614174000"],"example":"PL-123e4567-e89b-12d3-a456-426614174000"},"priceListName":{"type":"string"},"status":{"type":"string"},"currency":{"anyOf":[{"type":"string"},{"type":"null"}]},"validPeriod":{"type":"array","prefixItems":[{"anyOf":[{"type":"string"},{"type":"null"}]},{"anyOf":[{"type":"string"},{"type":"null"}]}]},"isPromotional":{"type":"boolean"},"companies":{"type":"array","items":{"type":"object","properties":{"companyId":{"type":"string"},"companyName":{"type":"string"}},"required":["companyId","companyName"],"additionalProperties":false}},"createdAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO 8601 creation timestamp."},"modifiedAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO 8601 last-modified timestamp."},"mode":{"type":"string","const":"LINKED"},"linkedPriceListId":{"anyOf":[{"type":"string"},{"type":"null"}]},"calculation":{"type":"object","properties":{"costMultiplier":{"anyOf":[{"type":"number"},{"type":"null"}]},"rrp":{"anyOf":[{"type":"object","properties":{"method":{"anyOf":[{"type":"string"},{"type":"null"}]},"value":{"anyOf":[{"type":"number"},{"type":"null"}]},"rounding":{"type":"object","properties":{"mode":{"anyOf":[{"type":"string"},{"type":"null"}]},"increment":{"anyOf":[{"type":"number"},{"type":"null"}]}},"required":["mode","increment"],"additionalProperties":false}},"required":["method","value","rounding"],"additionalProperties":false},{"type":"null"}]},"sale":{"anyOf":[{"type":"object","properties":{"method":{"anyOf":[{"type":"string"},{"type":"null"}]},"value":{"anyOf":[{"type":"number"},{"type":"null"}]},"rounding":{"type":"object","properties":{"mode":{"anyOf":[{"type":"string"},{"type":"null"}]},"increment":{"anyOf":[{"type":"number"},{"type":"null"}]}},"required":["mode","increment"],"additionalProperties":false}},"required":["method","value","rounding"],"additionalProperties":false},{"type":"null"}]}},"required":["costMultiplier","rrp","sale"],"additionalProperties":false}},"required":["priceListId","priceListName","status","currency","validPeriod","isPromotional","companies","createdAt","modifiedAt","mode","linkedPriceListId","calculation"],"additionalProperties":false}]},{"type":"object","properties":{"priceListId":{"type":"string","pattern":"^PL-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Price list identifier (PL-<uuid>).","examples":["PL-123e4567-e89b-12d3-a456-426614174000"],"example":"PL-123e4567-e89b-12d3-a456-426614174000"}},"required":["priceListId"],"additionalProperties":false}]}},"required":["data"],"additionalProperties":false,"description":"Data schema used by Create Price List (POST /v1/price-lists). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"PriceListsCreateRequest":{"oneOf":[{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":255},"status":{"type":"string","enum":["ACTIVE","INACTIVE"]},"currency":{"type":"string","minLength":1,"maxLength":255},"validPeriod":{"type":"array","prefixItems":[{"anyOf":[{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"}]},{"type":"null"}]},{"anyOf":[{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"}]},{"type":"null"}]}]},"isPromotional":{"type":"boolean"},"mode":{"type":"string","const":"FIXED"},"market":{"type":"string","minLength":1,"maxLength":255},"calculation":{"type":"object","properties":{"costMultiplier":{"type":"number","minimum":0}},"required":["costMultiplier"],"additionalProperties":false},"body":{"type":"object","properties":{"codes":{"type":"array","items":{"type":"object","properties":{"priceCode":{"type":"string","minLength":1,"maxLength":255},"quantity":{"type":"integer","minimum":0,"maximum":9007199254740991},"rrp":{"type":"number","minimum":0},"sale":{"type":"number","minimum":0}},"required":["priceCode","quantity","rrp","sale"],"additionalProperties":false}}},"required":["codes"],"additionalProperties":false}},"required":["name","status","currency","validPeriod","isPromotional","mode","market","calculation"],"additionalProperties":false},{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":255},"status":{"type":"string","enum":["ACTIVE","INACTIVE"]},"currency":{"type":"string","minLength":1,"maxLength":255},"validPeriod":{"type":"array","prefixItems":[{"anyOf":[{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"}]},{"type":"null"}]},{"anyOf":[{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"}]},{"type":"null"}]}]},"isPromotional":{"type":"boolean"},"mode":{"type":"string","const":"CALCULATED"},"market":{"type":"string","minLength":1,"maxLength":255},"scope":{"type":"string","enum":["ALL","SELECTED_CUSTOMERS","SELECTED_PRODUCTS"]},"selectedCustomers":{"type":"array","items":{"type":"string","pattern":"^CUST-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}},"selectedProducts":{"type":"array","items":{"type":"string","pattern":"^PROD-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}},"calculation":{"type":"object","properties":{"costMultiplier":{"type":"number","minimum":0},"rrp":{"anyOf":[{"type":"object","properties":{"method":{"type":"string","minLength":1,"maxLength":255},"value":{"type":"number"},"rounding":{"type":"object","properties":{"mode":{"type":"string","minLength":1,"maxLength":255},"increment":{"type":"number","minimum":0}},"required":["mode","increment"],"additionalProperties":false}},"required":["method","value","rounding"],"additionalProperties":false},{"type":"null"}]},"sale":{"anyOf":[{"type":"object","properties":{"method":{"type":"string","minLength":1,"maxLength":255},"value":{"type":"number"},"rounding":{"type":"object","properties":{"mode":{"type":"string","minLength":1,"maxLength":255},"increment":{"type":"number","minimum":0}},"required":["mode","increment"],"additionalProperties":false}},"required":["method","value","rounding"],"additionalProperties":false},{"type":"null"}]}},"required":["costMultiplier","rrp","sale"],"additionalProperties":false}},"required":["name","status","currency","validPeriod","isPromotional","mode","market","scope","selectedCustomers","selectedProducts","calculation"],"additionalProperties":false},{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":255},"status":{"type":"string","enum":["ACTIVE","INACTIVE"]},"currency":{"type":"string","minLength":1,"maxLength":255},"validPeriod":{"type":"array","prefixItems":[{"anyOf":[{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"}]},{"type":"null"}]},{"anyOf":[{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"}]},{"type":"null"}]}]},"isPromotional":{"type":"boolean"},"mode":{"type":"string","const":"LINKED"},"linkedPriceListId":{"type":"string","pattern":"^PL-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"},"calculation":{"type":"object","properties":{"costMultiplier":{"type":"number","minimum":0},"rrp":{"anyOf":[{"type":"object","properties":{"method":{"type":"string","minLength":1,"maxLength":255},"value":{"type":"number"},"rounding":{"type":"object","properties":{"mode":{"type":"string","minLength":1,"maxLength":255},"increment":{"type":"number","minimum":0}},"required":["mode","increment"],"additionalProperties":false}},"required":["method","value","rounding"],"additionalProperties":false},{"type":"null"}]},"sale":{"anyOf":[{"type":"object","properties":{"method":{"type":"string","minLength":1,"maxLength":255},"value":{"type":"number"},"rounding":{"type":"object","properties":{"mode":{"type":"string","minLength":1,"maxLength":255},"increment":{"type":"number","minimum":0}},"required":["mode","increment"],"additionalProperties":false}},"required":["method","value","rounding"],"additionalProperties":false},{"type":"null"}]}},"required":["costMultiplier","rrp","sale"],"additionalProperties":false}},"required":["name","status","currency","validPeriod","isPromotional","mode","linkedPriceListId","calculation"],"additionalProperties":false}],"description":"Data schema used by Create Price List (POST /v1/price-lists). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"PriceListsDetail":{"type":"object","properties":{"data":{"oneOf":[{"type":"object","properties":{"priceListId":{"type":"string","pattern":"^PL-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Price list identifier (PL-<uuid>).","examples":["PL-123e4567-e89b-12d3-a456-426614174000"],"example":"PL-123e4567-e89b-12d3-a456-426614174000"},"priceListName":{"type":"string"},"status":{"type":"string"},"currency":{"anyOf":[{"type":"string"},{"type":"null"}]},"validPeriod":{"type":"array","prefixItems":[{"anyOf":[{"type":"string"},{"type":"null"}]},{"anyOf":[{"type":"string"},{"type":"null"}]}]},"isPromotional":{"type":"boolean"},"companies":{"type":"array","items":{"type":"object","properties":{"companyId":{"type":"string"},"companyName":{"type":"string"}},"required":["companyId","companyName"],"additionalProperties":false}},"createdAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO 8601 creation timestamp."},"modifiedAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO 8601 last-modified timestamp."},"mode":{"type":"string","const":"FIXED"},"market":{"anyOf":[{"type":"string"},{"type":"null"}]},"calculation":{"type":"object","properties":{"costMultiplier":{"anyOf":[{"type":"number"},{"type":"null"}]}},"required":["costMultiplier"],"additionalProperties":false},"body":{"type":"object","properties":{"codes":{"type":"array","items":{"type":"object","properties":{"priceCode":{"type":"string"},"quantity":{"anyOf":[{"type":"number"},{"type":"null"}]},"rrp":{"anyOf":[{"type":"number"},{"type":"null"}]},"sale":{"anyOf":[{"type":"number"},{"type":"null"}]}},"required":["priceCode","quantity","rrp","sale"],"additionalProperties":false}}},"required":["codes"],"additionalProperties":false}},"required":["priceListId","priceListName","status","currency","validPeriod","isPromotional","companies","createdAt","modifiedAt","mode","market","calculation","body"],"additionalProperties":false},{"type":"object","properties":{"priceListId":{"type":"string","pattern":"^PL-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Price list identifier (PL-<uuid>).","examples":["PL-123e4567-e89b-12d3-a456-426614174000"],"example":"PL-123e4567-e89b-12d3-a456-426614174000"},"priceListName":{"type":"string"},"status":{"type":"string"},"currency":{"anyOf":[{"type":"string"},{"type":"null"}]},"validPeriod":{"type":"array","prefixItems":[{"anyOf":[{"type":"string"},{"type":"null"}]},{"anyOf":[{"type":"string"},{"type":"null"}]}]},"isPromotional":{"type":"boolean"},"companies":{"type":"array","items":{"type":"object","properties":{"companyId":{"type":"string"},"companyName":{"type":"string"}},"required":["companyId","companyName"],"additionalProperties":false}},"createdAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO 8601 creation timestamp."},"modifiedAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO 8601 last-modified timestamp."},"mode":{"type":"string","const":"CALCULATED"},"market":{"anyOf":[{"type":"string"},{"type":"null"}]},"scope":{"anyOf":[{"type":"string"},{"type":"null"}]},"selectedCustomers":{"type":"array","items":{"type":"string"}},"selectedProducts":{"type":"array","items":{"type":"string"}},"calculation":{"type":"object","properties":{"costMultiplier":{"anyOf":[{"type":"number"},{"type":"null"}]},"rrp":{"anyOf":[{"type":"object","properties":{"method":{"anyOf":[{"type":"string"},{"type":"null"}]},"value":{"anyOf":[{"type":"number"},{"type":"null"}]},"rounding":{"type":"object","properties":{"mode":{"anyOf":[{"type":"string"},{"type":"null"}]},"increment":{"anyOf":[{"type":"number"},{"type":"null"}]}},"required":["mode","increment"],"additionalProperties":false}},"required":["method","value","rounding"],"additionalProperties":false},{"type":"null"}]},"sale":{"anyOf":[{"type":"object","properties":{"method":{"anyOf":[{"type":"string"},{"type":"null"}]},"value":{"anyOf":[{"type":"number"},{"type":"null"}]},"rounding":{"type":"object","properties":{"mode":{"anyOf":[{"type":"string"},{"type":"null"}]},"increment":{"anyOf":[{"type":"number"},{"type":"null"}]}},"required":["mode","increment"],"additionalProperties":false}},"required":["method","value","rounding"],"additionalProperties":false},{"type":"null"}]}},"required":["costMultiplier","rrp","sale"],"additionalProperties":false}},"required":["priceListId","priceListName","status","currency","validPeriod","isPromotional","companies","createdAt","modifiedAt","mode","market","scope","selectedCustomers","selectedProducts","calculation"],"additionalProperties":false},{"type":"object","properties":{"priceListId":{"type":"string","pattern":"^PL-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Price list identifier (PL-<uuid>).","examples":["PL-123e4567-e89b-12d3-a456-426614174000"],"example":"PL-123e4567-e89b-12d3-a456-426614174000"},"priceListName":{"type":"string"},"status":{"type":"string"},"currency":{"anyOf":[{"type":"string"},{"type":"null"}]},"validPeriod":{"type":"array","prefixItems":[{"anyOf":[{"type":"string"},{"type":"null"}]},{"anyOf":[{"type":"string"},{"type":"null"}]}]},"isPromotional":{"type":"boolean"},"companies":{"type":"array","items":{"type":"object","properties":{"companyId":{"type":"string"},"companyName":{"type":"string"}},"required":["companyId","companyName"],"additionalProperties":false}},"createdAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO 8601 creation timestamp."},"modifiedAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO 8601 last-modified timestamp."},"mode":{"type":"string","const":"LINKED"},"linkedPriceListId":{"anyOf":[{"type":"string"},{"type":"null"}]},"calculation":{"type":"object","properties":{"costMultiplier":{"anyOf":[{"type":"number"},{"type":"null"}]},"rrp":{"anyOf":[{"type":"object","properties":{"method":{"anyOf":[{"type":"string"},{"type":"null"}]},"value":{"anyOf":[{"type":"number"},{"type":"null"}]},"rounding":{"type":"object","properties":{"mode":{"anyOf":[{"type":"string"},{"type":"null"}]},"increment":{"anyOf":[{"type":"number"},{"type":"null"}]}},"required":["mode","increment"],"additionalProperties":false}},"required":["method","value","rounding"],"additionalProperties":false},{"type":"null"}]},"sale":{"anyOf":[{"type":"object","properties":{"method":{"anyOf":[{"type":"string"},{"type":"null"}]},"value":{"anyOf":[{"type":"number"},{"type":"null"}]},"rounding":{"type":"object","properties":{"mode":{"anyOf":[{"type":"string"},{"type":"null"}]},"increment":{"anyOf":[{"type":"number"},{"type":"null"}]}},"required":["mode","increment"],"additionalProperties":false}},"required":["method","value","rounding"],"additionalProperties":false},{"type":"null"}]}},"required":["costMultiplier","rrp","sale"],"additionalProperties":false}},"required":["priceListId","priceListName","status","currency","validPeriod","isPromotional","companies","createdAt","modifiedAt","mode","linkedPriceListId","calculation"],"additionalProperties":false}]}},"required":["data"],"additionalProperties":false,"description":"Data schema used by Get Price List (GET /v1/price-lists/{priceListId}). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"PriceListsUpdateRequest":{"oneOf":[{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":255},"status":{"type":"string","enum":["ACTIVE","INACTIVE"]},"currency":{"type":"string","minLength":1,"maxLength":255},"validPeriod":{"type":"array","prefixItems":[{"anyOf":[{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"}]},{"type":"null"}]},{"anyOf":[{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"}]},{"type":"null"}]}]},"isPromotional":{"type":"boolean"},"mode":{"type":"string","const":"FIXED"},"market":{"type":"string","minLength":1,"maxLength":255},"calculation":{"type":"object","properties":{"costMultiplier":{"type":"number","minimum":0}},"required":["costMultiplier"],"additionalProperties":false}},"required":["name","status","currency","validPeriod","isPromotional","mode","market","calculation"],"additionalProperties":false},{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":255},"status":{"type":"string","enum":["ACTIVE","INACTIVE"]},"currency":{"type":"string","minLength":1,"maxLength":255},"validPeriod":{"type":"array","prefixItems":[{"anyOf":[{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"}]},{"type":"null"}]},{"anyOf":[{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"}]},{"type":"null"}]}]},"isPromotional":{"type":"boolean"},"mode":{"type":"string","const":"CALCULATED"},"market":{"type":"string","minLength":1,"maxLength":255},"scope":{"type":"string","enum":["ALL","SELECTED_CUSTOMERS","SELECTED_PRODUCTS"]},"selectedCustomers":{"type":"array","items":{"type":"string","pattern":"^CUST-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}},"selectedProducts":{"type":"array","items":{"type":"string","pattern":"^PROD-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"}},"calculation":{"type":"object","properties":{"costMultiplier":{"type":"number","minimum":0},"rrp":{"anyOf":[{"type":"object","properties":{"method":{"type":"string","minLength":1,"maxLength":255},"value":{"type":"number"},"rounding":{"type":"object","properties":{"mode":{"type":"string","minLength":1,"maxLength":255},"increment":{"type":"number","minimum":0}},"required":["mode","increment"],"additionalProperties":false}},"required":["method","value","rounding"],"additionalProperties":false},{"type":"null"}]},"sale":{"anyOf":[{"type":"object","properties":{"method":{"type":"string","minLength":1,"maxLength":255},"value":{"type":"number"},"rounding":{"type":"object","properties":{"mode":{"type":"string","minLength":1,"maxLength":255},"increment":{"type":"number","minimum":0}},"required":["mode","increment"],"additionalProperties":false}},"required":["method","value","rounding"],"additionalProperties":false},{"type":"null"}]}},"required":["costMultiplier","rrp","sale"],"additionalProperties":false}},"required":["name","status","currency","validPeriod","isPromotional","mode","market","scope","selectedCustomers","selectedProducts","calculation"],"additionalProperties":false},{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":255},"status":{"type":"string","enum":["ACTIVE","INACTIVE"]},"currency":{"type":"string","minLength":1,"maxLength":255},"validPeriod":{"type":"array","prefixItems":[{"anyOf":[{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"}]},{"type":"null"}]},{"anyOf":[{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"}]},{"type":"null"}]}]},"isPromotional":{"type":"boolean"},"mode":{"type":"string","const":"LINKED"},"linkedPriceListId":{"type":"string","pattern":"^PL-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"},"calculation":{"type":"object","properties":{"costMultiplier":{"type":"number","minimum":0},"rrp":{"anyOf":[{"type":"object","properties":{"method":{"type":"string","minLength":1,"maxLength":255},"value":{"type":"number"},"rounding":{"type":"object","properties":{"mode":{"type":"string","minLength":1,"maxLength":255},"increment":{"type":"number","minimum":0}},"required":["mode","increment"],"additionalProperties":false}},"required":["method","value","rounding"],"additionalProperties":false},{"type":"null"}]},"sale":{"anyOf":[{"type":"object","properties":{"method":{"type":"string","minLength":1,"maxLength":255},"value":{"type":"number"},"rounding":{"type":"object","properties":{"mode":{"type":"string","minLength":1,"maxLength":255},"increment":{"type":"number","minimum":0}},"required":["mode","increment"],"additionalProperties":false}},"required":["method","value","rounding"],"additionalProperties":false},{"type":"null"}]}},"required":["costMultiplier","rrp","sale"],"additionalProperties":false}},"required":["name","status","currency","validPeriod","isPromotional","mode","linkedPriceListId","calculation"],"additionalProperties":false}],"description":"Data schema used by Update Price List (PUT /v1/price-lists/{priceListId}). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"PriceListsPricesRequest":{"type":"object","properties":{"codes":{"type":"array","items":{"type":"object","properties":{"priceCode":{"type":"string","minLength":1,"maxLength":255},"quantity":{"type":"integer","minimum":0,"maximum":9007199254740991},"rrp":{"type":"number","minimum":0},"sale":{"type":"number","minimum":0}},"required":["priceCode","quantity","rrp","sale"],"additionalProperties":false}}},"required":["codes"],"additionalProperties":false,"description":"Data schema used by Update Price List Prices (PUT /v1/price-lists/{priceListId}/prices). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"ProductGroupsList":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"productGroupId":{"type":"string","pattern":"^PG-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Product group identifier (PG-<uuid>).","examples":["PG-123e4567-e89b-12d3-a456-426614174000"],"example":"PG-123e4567-e89b-12d3-a456-426614174000"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]},"type":{"anyOf":[{"type":"string","enum":["SHARED","EMBED"]},{"type":"null"}]},"status":{"anyOf":[{"type":"string","enum":["ACTIVE","INACTIVE"]},{"type":"null"}]},"numberOfProducts":{"type":"number"},"numberOfCompanies":{"type":"number","description":"Connected companies — applies to SHARED groups only; always 0 for EMBED."}},"required":["productGroupId","name","type","status","numberOfProducts","numberOfCompanies"],"additionalProperties":false}},"page":{"type":"object","properties":{"limit":{"type":"number"},"nextCursor":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["limit","nextCursor"],"additionalProperties":false}},"required":["data","page"],"additionalProperties":false,"description":"Data schema used by List Product Groups (GET /v1/product-groups). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"ProductGroupsDetail":{"type":"object","properties":{"data":{"type":"object","properties":{"productGroupId":{"type":"string","pattern":"^PG-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Product group identifier (PG-<uuid>).","examples":["PG-123e4567-e89b-12d3-a456-426614174000"],"example":"PG-123e4567-e89b-12d3-a456-426614174000"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]},"type":{"anyOf":[{"type":"string","enum":["SHARED","EMBED"]},{"type":"null"}]},"status":{"anyOf":[{"type":"string","enum":["ACTIVE","INACTIVE"]},{"type":"null"}]},"numberOfProducts":{"type":"number"},"numberOfCompanies":{"type":"number","description":"Connected companies — applies to SHARED groups only; always 0 for EMBED."},"manualSort":{"type":"boolean","description":"Whether products are sorted manually. Defaults to true."},"companyIds":{"type":"array","items":{"type":"string"},"description":"Connected company ids — applies to SHARED groups only; always empty for EMBED."},"connectedProducts":{"type":"array","items":{"type":"object","properties":{"productId":{"type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]},"status":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["productId","name","status"],"additionalProperties":false}}},"required":["productGroupId","name","type","status","numberOfProducts","numberOfCompanies","manualSort","companyIds","connectedProducts"],"additionalProperties":false}},"required":["data"],"additionalProperties":false,"description":"Data schema used by Get Product Group (GET /v1/product-groups/{productGroupId}). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"ProductGroupsMutation":{"type":"object","properties":{"data":{"type":"object","properties":{"productGroupId":{"type":"string","pattern":"^PG-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Product group identifier (PG-<uuid>).","examples":["PG-123e4567-e89b-12d3-a456-426614174000"],"example":"PG-123e4567-e89b-12d3-a456-426614174000"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]},"type":{"anyOf":[{"type":"string","enum":["SHARED","EMBED"]},{"type":"null"}]},"status":{"anyOf":[{"type":"string","enum":["ACTIVE","INACTIVE"]},{"type":"null"}]},"numberOfProducts":{"type":"number"},"numberOfCompanies":{"type":"number","description":"Connected companies — applies to SHARED groups only; always 0 for EMBED."},"manualSort":{"type":"boolean","description":"Whether products are sorted manually. Defaults to true."},"companyIds":{"type":"array","items":{"type":"string"},"description":"Connected company ids — applies to SHARED groups only; always empty for EMBED."},"connectedProducts":{"type":"array","items":{"type":"object","properties":{"productId":{"type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]},"status":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["productId","name","status"],"additionalProperties":false}}},"required":["productGroupId"],"additionalProperties":false}},"required":["data"],"additionalProperties":false,"description":"Data schema used by Create Product Group (POST /v1/product-groups). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"ProductGroupsCreateRequest":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":255,"description":"Product group name.","examples":["Chairs"],"example":"Chairs"},"type":{"type":"string","enum":["SHARED","EMBED"],"description":"SHARED (shareable with companies) or EMBED.","examples":["EMBED"],"example":"EMBED"},"status":{"type":"string","enum":["ACTIVE","INACTIVE"]},"manualSort":{"type":"boolean"},"productIds":{"type":"array","items":{"type":"string","pattern":"^PROD-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Product identifier (PROD-<uuid>).","examples":["PROD-123e4567-e89b-12d3-a456-426614174000"],"example":"PROD-123e4567-e89b-12d3-a456-426614174000"}},"companyIds":{"type":"array","items":{"type":"string","pattern":"^COMP-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Company identifier (COMP-<uuid>).","examples":["COMP-123e4567-e89b-12d3-a456-426614174000"],"example":"COMP-123e4567-e89b-12d3-a456-426614174000"}}},"required":["name","type"],"additionalProperties":false,"description":"Data schema used by Create Product Group (POST /v1/product-groups). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"ProductGroupsUpdateRequest":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":255,"description":"Product group name.","examples":["Chairs"],"example":"Chairs"},"manualSort":{"type":"boolean"},"status":{"type":"string","enum":["ACTIVE","INACTIVE"]}},"additionalProperties":false,"description":"Data schema used by Update Product Group (PUT /v1/product-groups/{productGroupId}). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"ProductGroupsProductsRequest":{"type":"object","properties":{"productIds":{"type":"array","items":{"type":"string","pattern":"^PROD-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Product identifier (PROD-<uuid>).","examples":["PROD-123e4567-e89b-12d3-a456-426614174000"],"example":"PROD-123e4567-e89b-12d3-a456-426614174000"}}},"required":["productIds"],"additionalProperties":false,"description":"Data schema used by Update Product Group Products (PUT /v1/product-groups/{productGroupId}/products). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"ProductGroupsProductsRequest2":{"type":"object","properties":{"productIds":{"minItems":1,"type":"array","items":{"type":"string","pattern":"^PROD-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Product identifier (PROD-<uuid>).","examples":["PROD-123e4567-e89b-12d3-a456-426614174000"],"example":"PROD-123e4567-e89b-12d3-a456-426614174000"}}},"required":["productIds"],"additionalProperties":false,"description":"Data schema used by Add Product Group Products (POST /v1/product-groups/{productGroupId}/products). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"ProductGroupsProductsRemoveRequest":{"type":"object","properties":{"productIds":{"minItems":1,"type":"array","items":{"type":"string","pattern":"^PROD-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Product identifier (PROD-<uuid>).","examples":["PROD-123e4567-e89b-12d3-a456-426614174000"],"example":"PROD-123e4567-e89b-12d3-a456-426614174000"}}},"required":["productIds"],"additionalProperties":false,"description":"Data schema used by Remove Product Group Products (POST /v1/product-groups/{productGroupId}/products:remove). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"ProductGroupsCompaniesRequest":{"type":"object","properties":{"companyIds":{"type":"array","items":{"type":"string","pattern":"^COMP-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Company identifier (COMP-<uuid>).","examples":["COMP-123e4567-e89b-12d3-a456-426614174000"],"example":"COMP-123e4567-e89b-12d3-a456-426614174000"}}},"required":["companyIds"],"additionalProperties":false,"description":"Data schema used by Update Product Group Companies (PUT /v1/product-groups/{productGroupId}/companies). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"ProductGroupsCompaniesRequest2":{"type":"object","properties":{"companyIds":{"minItems":1,"type":"array","items":{"type":"string","pattern":"^COMP-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Company identifier (COMP-<uuid>).","examples":["COMP-123e4567-e89b-12d3-a456-426614174000"],"example":"COMP-123e4567-e89b-12d3-a456-426614174000"}}},"required":["companyIds"],"additionalProperties":false,"description":"Data schema used by Add Product Group Companies (POST /v1/product-groups/{productGroupId}/companies). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"ProductGroupsCompaniesRemoveRequest":{"type":"object","properties":{"companyIds":{"minItems":1,"type":"array","items":{"type":"string","pattern":"^COMP-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Company identifier (COMP-<uuid>).","examples":["COMP-123e4567-e89b-12d3-a456-426614174000"],"example":"COMP-123e4567-e89b-12d3-a456-426614174000"}}},"required":["companyIds"],"additionalProperties":false,"description":"Data schema used by Remove Product Group Companies (POST /v1/product-groups/{productGroupId}/companies:remove). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"ProductCategoriesList":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"productCategoryId":{"type":"string","pattern":"^PC-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Product category identifier (PC-<uuid>).","examples":["PC-123e4567-e89b-12d3-a456-426614174000"],"example":"PC-123e4567-e89b-12d3-a456-426614174000"},"name":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}}]},{"type":"null"}],"description":"Translated text when `lang` is set, otherwise the full `{ language: text }` map. Languages with no text are omitted, and a field with no text at all is null.","examples":["Chair",{"en":"Chair","de":"Stuhl"}],"example":"Chair"},"code":{"anyOf":[{"type":"string"},{"type":"null"}]},"status":{"anyOf":[{"type":"string","enum":["ACTIVE","INACTIVE"]},{"type":"null"}]},"parentProductCategoryId":{"anyOf":[{"type":"string"},{"type":"null"}]},"numberOfProducts":{"type":"number"}},"required":["productCategoryId","name","code","status","parentProductCategoryId","numberOfProducts"],"additionalProperties":false}},"page":{"type":"object","properties":{"limit":{"type":"number"},"nextCursor":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["limit","nextCursor"],"additionalProperties":false}},"required":["data","page"],"additionalProperties":false,"description":"Data schema used by List Product Categories (GET /v1/product-categories). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"ProductCategoriesDetail":{"type":"object","properties":{"data":{"type":"object","properties":{"productCategoryId":{"type":"string","pattern":"^PC-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Product category identifier (PC-<uuid>).","examples":["PC-123e4567-e89b-12d3-a456-426614174000"],"example":"PC-123e4567-e89b-12d3-a456-426614174000"},"name":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}}]},{"type":"null"}],"description":"Translated text when `lang` is set, otherwise the full `{ language: text }` map. Languages with no text are omitted, and a field with no text at all is null.","examples":["Chair",{"en":"Chair","de":"Stuhl"}],"example":"Chair"},"code":{"anyOf":[{"type":"string"},{"type":"null"}]},"status":{"anyOf":[{"type":"string","enum":["ACTIVE","INACTIVE"]},{"type":"null"}]},"parentProductCategoryId":{"anyOf":[{"type":"string"},{"type":"null"}]},"numberOfProducts":{"type":"number"},"products":{"type":"array","items":{"type":"string"}}},"required":["productCategoryId","name","code","status","parentProductCategoryId","numberOfProducts","products"],"additionalProperties":false}},"required":["data"],"additionalProperties":false,"description":"Data schema used by Get Product Category (GET /v1/product-categories/{productCategoryId}). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"ProductCategoriesMutation":{"type":"object","properties":{"data":{"type":"object","properties":{"productCategoryId":{"type":"string","pattern":"^PC-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Product category identifier (PC-<uuid>).","examples":["PC-123e4567-e89b-12d3-a456-426614174000"],"example":"PC-123e4567-e89b-12d3-a456-426614174000"},"name":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}}]},{"type":"null"}],"description":"Translated text when `lang` is set, otherwise the full `{ language: text }` map. Languages with no text are omitted, and a field with no text at all is null.","examples":["Chair",{"en":"Chair","de":"Stuhl"}],"example":"Chair"},"code":{"anyOf":[{"type":"string"},{"type":"null"}]},"status":{"anyOf":[{"type":"string","enum":["ACTIVE","INACTIVE"]},{"type":"null"}]},"parentProductCategoryId":{"anyOf":[{"type":"string"},{"type":"null"}]},"numberOfProducts":{"type":"number"},"products":{"type":"array","items":{"type":"string"}}},"required":["productCategoryId"],"additionalProperties":false}},"required":["data"],"additionalProperties":false,"description":"Data schema used by Create Product Category (POST /v1/product-categories). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"ProductCategoriesCreateRequest":{"type":"object","properties":{"name":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"},"examples":[{"en":"Seating","de":"Sitzmöbel"}],"description":"Category name, keyed by language code.","example":{"en":"Seating","de":"Sitzmöbel"}},"code":{"type":"string","minLength":1,"maxLength":255,"description":"Unique category code within the account.","examples":["CHAIRS"],"example":"CHAIRS"},"parentProductCategoryId":{"anyOf":[{"type":"string","pattern":"^PC-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Product category identifier (PC-<uuid>).","examples":["PC-123e4567-e89b-12d3-a456-426614174000"],"example":"PC-123e4567-e89b-12d3-a456-426614174000"},{"type":"null"}]},"status":{"type":"string","enum":["ACTIVE","INACTIVE"]},"productIds":{"type":"array","items":{"type":"string","pattern":"^PROD-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Product identifier (PROD-<uuid>).","examples":["PROD-123e4567-e89b-12d3-a456-426614174000"],"example":"PROD-123e4567-e89b-12d3-a456-426614174000"}}},"required":["name","code"],"additionalProperties":false,"description":"Data schema used by Create Product Category (POST /v1/product-categories). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"ProductCategoriesUpdateRequest":{"type":"object","properties":{"name":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"},"examples":[{"en":"Seating","de":"Sitzmöbel"}],"description":"Category name, keyed by language code.","example":{"en":"Seating","de":"Sitzmöbel"}},"code":{"type":"string","minLength":1,"maxLength":255},"status":{"type":"string","enum":["ACTIVE","INACTIVE"]},"parentProductCategoryId":{"anyOf":[{"type":"string","pattern":"^PC-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Product category identifier (PC-<uuid>).","examples":["PC-123e4567-e89b-12d3-a456-426614174000"],"example":"PC-123e4567-e89b-12d3-a456-426614174000"},{"type":"null"}]}},"additionalProperties":false,"description":"Data schema used by Update Product Category (PUT /v1/product-categories/{productCategoryId}). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"ProductCategoriesProductsRequest":{"type":"object","properties":{"productIds":{"type":"array","items":{"type":"string","pattern":"^PROD-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Product identifier (PROD-<uuid>).","examples":["PROD-123e4567-e89b-12d3-a456-426614174000"],"example":"PROD-123e4567-e89b-12d3-a456-426614174000"}}},"required":["productIds"],"additionalProperties":false,"description":"Data schema used by Update Product Category Products (PUT /v1/product-categories/{productCategoryId}/products). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"ProductCategoriesProductsRequest2":{"type":"object","properties":{"productIds":{"minItems":1,"type":"array","items":{"type":"string","pattern":"^PROD-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Product identifier (PROD-<uuid>).","examples":["PROD-123e4567-e89b-12d3-a456-426614174000"],"example":"PROD-123e4567-e89b-12d3-a456-426614174000"}}},"required":["productIds"],"additionalProperties":false,"description":"Data schema used by Add Product Category Products (POST /v1/product-categories/{productCategoryId}/products). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"ProductCategoriesProductsRemoveRequest":{"type":"object","properties":{"productIds":{"minItems":1,"type":"array","items":{"type":"string","pattern":"^PROD-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Product identifier (PROD-<uuid>).","examples":["PROD-123e4567-e89b-12d3-a456-426614174000"],"example":"PROD-123e4567-e89b-12d3-a456-426614174000"}}},"required":["productIds"],"additionalProperties":false,"description":"Data schema used by Remove Product Category Products (POST /v1/product-categories/{productCategoryId}/products:remove). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"ProductsList":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"productId":{"type":"string","pattern":"^PROD-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Product identifier (PROD-<uuid>).","examples":["PROD-123e4567-e89b-12d3-a456-426614174000"],"example":"PROD-123e4567-e89b-12d3-a456-426614174000"},"variantCode":{"anyOf":[{"type":"string"},{"type":"null"}]},"name":{"anyOf":[{"type":"string"},{"type":"null"}]},"displayName":{"anyOf":[{"type":"string"},{"type":"null"}]},"status":{"anyOf":[{"type":"string","enum":["ACTIVE","INACTIVE"]},{"type":"null"}]},"visibility":{"type":"boolean"},"privacy":{"anyOf":[{"type":"string","enum":["PUBLIC","PRIVATE","RESTRICTED_TO"]},{"type":"null"}]},"type":{"anyOf":[{"type":"string","enum":["2D","3D"]},{"type":"null"}]},"mode":{"anyOf":[{"type":"string","enum":["STANDARD","VARIANT","MODULAR","COMPONENT"]},{"type":"null"}]},"variantType":{"anyOf":[{"type":"string","enum":["STANDARD","HYBRID"]},{"type":"null"}]},"previewImage":{"anyOf":[{"type":"string"},{"type":"null"}]},"isOwn":{"type":"boolean"},"isSharedWithOthers":{"type":"boolean"},"isBroken":{"type":"boolean"},"owner":{"anyOf":[{"type":"string"},{"type":"null"}]},"ownerCode":{"anyOf":[{"type":"string"},{"type":"null"}]},"createdAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO 8601 creation timestamp."},"modifiedAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO 8601 last-modified timestamp."}},"required":["productId","variantCode","name","displayName","status","visibility","privacy","type","mode","variantType","previewImage","isOwn","isSharedWithOthers","isBroken","owner","ownerCode","createdAt","modifiedAt"],"additionalProperties":false}},"page":{"type":"object","properties":{"limit":{"type":"number"},"nextCursor":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Cursor for the next page, or null on the last page."}},"required":["limit","nextCursor"],"additionalProperties":false}},"required":["data","page"],"additionalProperties":false,"description":"Data schema used by List Products (GET /v1/products). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"ProductsRelated":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"productId":{"anyOf":[{"type":"string"},{"type":"null"}]},"variantCode":{"anyOf":[{"type":"string"},{"type":"null"}]},"name":{"anyOf":[{"type":"string"},{"type":"null"}]},"status":{"anyOf":[{"type":"string"},{"type":"null"}]},"mode":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["productId","variantCode","name","status","mode"],"additionalProperties":false}}},"required":["data"],"additionalProperties":false,"description":"Data schema used by List Related Products (GET /v1/products/{productId}/related). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"ProductsDetail":{"type":"object","properties":{"data":{"type":"object","properties":{"productId":{"type":"string","pattern":"^PROD-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Product identifier (PROD-<uuid>).","examples":["PROD-123e4567-e89b-12d3-a456-426614174000"],"example":"PROD-123e4567-e89b-12d3-a456-426614174000"},"sourceId":{"anyOf":[{"type":"string"},{"type":"null"}]},"variantCode":{"anyOf":[{"type":"string"},{"type":"null"}]},"name":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}}]},{"type":"null"}],"description":"Translated text when `lang` is set, otherwise the full `{ language: text }` map. Languages with no text are omitted, and a field with no text at all is null.","examples":["Chair",{"en":"Chair","de":"Stuhl"}],"example":"Chair"},"displayName":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}}]},{"type":"null"}],"description":"Translated text when `lang` is set, otherwise the full `{ language: text }` map. Languages with no text are omitted, and a field with no text at all is null.","examples":["Chair",{"en":"Chair","de":"Stuhl"}],"example":"Chair"},"description":{"anyOf":[{"type":"object","properties":{"html":{"type":"string","description":"Draft.js content rendered as HTML."},"text":{"type":"string","description":"Plain text extracted from Draft.js blocks."}},"required":["html","text"],"additionalProperties":false},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"html":{"type":"string","description":"Draft.js content rendered as HTML."},"text":{"type":"string","description":"Plain text extracted from Draft.js blocks."}},"required":["html","text"],"additionalProperties":false}}],"description":"One rendered description when lang is set; otherwise descriptions by language."},"brand":{"anyOf":[{"type":"string"},{"type":"null"}]},"manufacturer":{"anyOf":[{"type":"string"},{"type":"null"}]},"designer":{"anyOf":[{"type":"string"},{"type":"null"}]},"status":{"anyOf":[{"type":"string","enum":["ACTIVE","INACTIVE"]},{"type":"null"}]},"visibility":{"type":"boolean"},"privacy":{"anyOf":[{"type":"string","enum":["PUBLIC","PRIVATE","RESTRICTED_TO"]},{"type":"null"}]},"type":{"anyOf":[{"type":"string","enum":["2D","3D"]},{"type":"null"}]},"mode":{"anyOf":[{"type":"string","enum":["STANDARD","VARIANT","MODULAR","COMPONENT"]},{"type":"null"}]},"variantType":{"anyOf":[{"type":"string","enum":["STANDARD","HYBRID"]},{"type":"null"}]},"previewImage":{"anyOf":[{"type":"string"},{"type":"null"}]},"categoryIds":{"type":"array","items":{}},"companyGroupIds":{"type":"array","items":{}},"productGroupIds":{"type":"array","items":{}},"tags":{"type":"array","items":{}},"isOwn":{"type":"boolean"},"isSharedWithOthers":{"type":"boolean"},"isBroken":{"type":"boolean"},"owner":{"anyOf":[{"type":"string"},{"type":"null"}]},"ownerCode":{"anyOf":[{"type":"string"},{"type":"null"}]},"sharingSettings":{},"modularSettings":{},"optionSets":{"type":"array","items":{}},"groups":{"type":"array","items":{}},"groupContainers":{"type":"array","items":{}},"groupsPreview":{},"businessLogic":{"type":"array","items":{}},"pricing":{},"bom":{"type":"array","items":{}},"bundleSettings":{},"sceneSettings":{},"models3dUrl":{"anyOf":[{"type":"string"},{"type":"null"}]},"meshesUrl":{"anyOf":[{"type":"string"},{"type":"null"}]},"animationGroupsUrl":{"anyOf":[{"type":"string"},{"type":"null"}]},"components3d":{"type":"array","items":{}},"products":{"type":"array","items":{}},"connectedProducts":{"type":"array","items":{}},"priceListsInScope":{"type":"array","items":{}},"sharingTab":{"type":"array","items":{}},"tabs":{"type":"array","items":{}},"createdAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO 8601 creation timestamp."},"modifiedAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO 8601 last-modified timestamp."}},"required":["productId","sourceId","variantCode","name","displayName","description","brand","manufacturer","designer","status","visibility","privacy","type","mode","variantType","previewImage","categoryIds","companyGroupIds","productGroupIds","tags","isOwn","isSharedWithOthers","isBroken","owner","ownerCode","sharingSettings","modularSettings","optionSets","groups","groupContainers","groupsPreview","businessLogic","pricing","bom","bundleSettings","sceneSettings","models3dUrl","meshesUrl","animationGroupsUrl","components3d","products","connectedProducts","priceListsInScope","sharingTab","tabs","createdAt","modifiedAt"],"additionalProperties":false}},"required":["data"],"additionalProperties":false,"description":"Data schema used by Get Product (GET /v1/products/{productId}). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"FilesCreateRequest":{"type":"object","properties":{"type":{"type":"string","const":"directory"},"directoryPath":{"type":"string","maxLength":1024},"name":{"type":"string","minLength":1,"maxLength":1024}},"required":["type","name"],"additionalProperties":false,"description":"Data schema used by Create Directory (POST /v1/files). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"FilesList":{"type":"object","properties":{"data":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","const":"directory"},"directoryPath":{"type":"string"},"name":{"type":"string"},"createdAt":{"anyOf":[{"type":"string"},{"type":"null"}]},"modifiedAt":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["type","directoryPath","name","createdAt","modifiedAt"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","const":"file"},"assetId":{"type":"string"},"directoryPath":{"type":"string"},"name":{"type":"string"},"extension":{"anyOf":[{"type":"string"},{"type":"null"}]},"mimeType":{"anyOf":[{"type":"string"},{"type":"null"}]},"sizeBytes":{"anyOf":[{"type":"integer","minimum":0,"maximum":9007199254740991},{"type":"null"}]},"url":{"anyOf":[{"type":"string"},{"type":"null"}]},"createdAt":{"anyOf":[{"type":"string"},{"type":"null"}]},"modifiedAt":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["type","assetId","directoryPath","name","extension","mimeType","sizeBytes","url","createdAt","modifiedAt"],"additionalProperties":false}]}},"page":{"type":"object","properties":{"limit":{"type":"number"},"nextCursor":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["limit","nextCursor"],"additionalProperties":false}},"required":["data","page"],"additionalProperties":false,"description":"Data schema used by List Files (GET /v1/files). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"FilesRequest":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","const":"file"},"assetId":{"type":"string","minLength":1,"maxLength":1024},"directoryPath":{"type":"string","maxLength":1024},"name":{"type":"string","minLength":1,"maxLength":1024}},"required":["type","assetId","directoryPath","name"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","const":"directory"},"directoryPath":{"type":"string","maxLength":1024},"name":{"type":"string","minLength":1,"maxLength":1024}},"required":["type","directoryPath","name"],"additionalProperties":false}],"description":"Data schema used by Rename File or Directory (PATCH /v1/files). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"FilesRequest2":{"type":"object","properties":{"items":{"minItems":1,"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","const":"file"},"assetId":{"type":"string","minLength":1,"maxLength":1024},"path":{"type":"string","maxLength":1024}},"required":["type","assetId","path"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","const":"directory"},"path":{"type":"string","maxLength":1024}},"required":["type","path"],"additionalProperties":false}]}}},"required":["items"],"additionalProperties":false,"description":"Data schema used by Delete File (DELETE /v1/files). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"FilesMoveRequest":{"type":"object","properties":{"targetDirectoryPath":{"type":"string","maxLength":1024},"items":{"minItems":1,"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","const":"file"},"assetId":{"type":"string","minLength":1,"maxLength":1024},"path":{"type":"string","maxLength":1024}},"required":["type","assetId","path"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","const":"directory"},"path":{"type":"string","maxLength":1024}},"required":["type","path"],"additionalProperties":false}]}}},"required":["targetDirectoryPath","items"],"additionalProperties":false,"description":"Data schema used by Move Files or Directories (POST /v1/files/move). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"FilesCopyRequest":{"type":"object","properties":{"targetDirectoryPath":{"type":"string","maxLength":1024},"items":{"minItems":1,"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","const":"file"},"assetId":{"type":"string","minLength":1,"maxLength":1024},"path":{"type":"string","maxLength":1024}},"required":["type","assetId","path"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","const":"directory"},"path":{"type":"string","maxLength":1024}},"required":["type","path"],"additionalProperties":false}]}}},"required":["targetDirectoryPath","items"],"additionalProperties":false,"description":"Data schema used by Copy Files or Directories (POST /v1/files/copy). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"FilesPodAssets":{"type":"object","properties":{"data":{"type":"object","properties":{"url":{"type":"string","format":"uri","description":"Signed URL of the ZIP with the configuration PoD artwork, valid for 24 hours."}},"required":["url"],"additionalProperties":false}},"required":["data"],"additionalProperties":false,"description":"Data schema used by Download PoD Assets (POST /v1/files/pod-assets). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"FilesPodAssetsRequest":{"type":"object","properties":{"shortCode":{"type":"string","minLength":1,"maxLength":10,"pattern":"^[A-Za-z0-9_-]+$","description":"Short code of the selected product configuration (for example `EUGMAF`), as returned in `shortCode` on cart items. Letters, digits, hyphens and underscores, up to 10 characters."}},"required":["shortCode"],"additionalProperties":false,"description":"Data schema used by Download PoD Assets (POST /v1/files/pod-assets). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"FilesDetail":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","const":"file"},"assetId":{"type":"string"},"directoryPath":{"type":"string"},"name":{"type":"string"},"extension":{"anyOf":[{"type":"string"},{"type":"null"}]},"mimeType":{"anyOf":[{"type":"string"},{"type":"null"}]},"sizeBytes":{"anyOf":[{"type":"integer","minimum":0,"maximum":9007199254740991},{"type":"null"}]},"url":{"anyOf":[{"type":"string"},{"type":"null"}]},"createdAt":{"anyOf":[{"type":"string"},{"type":"null"}]},"modifiedAt":{"anyOf":[{"type":"string"},{"type":"null"}]},"revisionsNumber":{"type":"integer","minimum":0,"maximum":9007199254740991},"width":{"type":"integer","minimum":0,"maximum":9007199254740991},"height":{"type":"integer","minimum":0,"maximum":9007199254740991},"aspectRatio":{"type":"string","minLength":1}},"required":["type","assetId","directoryPath","name","extension","mimeType","sizeBytes","url","createdAt","modifiedAt"],"additionalProperties":false}},"required":["data"],"additionalProperties":false,"description":"Data schema used by Upload File (POST /v1/files/upload). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"FilesDownload":{"type":"object","properties":{"data":{"type":"object","properties":{"url":{"type":"string","format":"uri"}},"required":["url"],"additionalProperties":false}},"required":["data"],"additionalProperties":false,"description":"Data schema used by Download Files as ZIP (POST /v1/files/download). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"FilesDownloadRequest":{"type":"object","properties":{"items":{"minItems":1,"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","const":"file"},"assetId":{"type":"string","minLength":1,"maxLength":1024},"path":{"type":"string","maxLength":1024}},"required":["type","assetId","path"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","const":"directory"},"path":{"type":"string","maxLength":1024}},"required":["type","path"],"additionalProperties":false}]}}},"required":["items"],"additionalProperties":false,"description":"Data schema used by Download Files as ZIP (POST /v1/files/download). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"QuotationsList":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"quotationId":{"type":"string","pattern":"^QUOT-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Quotation identifier (QUOT-<uuid>).","examples":["QUOT-123e4567-e89b-12d3-a456-426614174000"],"example":"QUOT-123e4567-e89b-12d3-a456-426614174000"},"quotationName":{"anyOf":[{"type":"string"},{"type":"null"}]},"quotationNumber":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"number"}]},{"type":"null"}]},"status":{"type":"string","enum":["OPEN","WON","LOST"]},"stageId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Raw configured stage identifier, or null when unset."},"stageName":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Resolved stage name, or null when unset/unconfigured."},"ownerId":{"anyOf":[{"type":"string"},{"type":"null"}]},"currency":{"anyOf":[{"type":"string"},{"type":"null"}]},"price":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Current quotation metadata price; use version.pricing.total for the selected version."},"currentVersionId":{"anyOf":[{"type":"string"},{"type":"null"}]},"numOfVersions":{"anyOf":[{"type":"number"},{"type":"null"}]},"validUntil":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO 8601 timestamp."},"expectedClose":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO 8601 timestamp."},"paymentTerms":{"anyOf":[{"type":"string"},{"type":"null"}]},"language":{"anyOf":[{"type":"string"},{"type":"null"}]},"lostReasonId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Raw configured lost-reason identifier, or null when unset."},"lostReasonName":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Resolved lost-reason name, or null when unset/unconfigured."},"lostComment":{"type":"object","properties":{"html":{"type":"string","description":"Draft.js content rendered as HTML."},"text":{"type":"string","description":"Plain text extracted from Draft.js blocks."}},"required":["html","text"],"additionalProperties":false},"isPrivate":{"type":"boolean"},"company":{"type":"object","properties":{"companyId":{"anyOf":[{"type":"string"},{"type":"null"}]},"companyName":{"anyOf":[{"type":"string"},{"type":"null"}]},"country":{"anyOf":[{"type":"string"},{"type":"null"}]},"city":{"anyOf":[{"type":"string"},{"type":"null"}]},"street":{"anyOf":[{"type":"string"},{"type":"null"}]},"postcode":{"anyOf":[{"type":"string"},{"type":"null"}]},"email":{"anyOf":[{"type":"string"},{"type":"null"}]},"workNumber":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["companyId","companyName","country","city","street","postcode","email","workNumber"],"additionalProperties":false},"createdAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO 8601 creation timestamp."},"modifiedAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO 8601 last-modified timestamp."}},"required":["quotationId","quotationName","quotationNumber","status","stageId","stageName","ownerId","currency","price","currentVersionId","numOfVersions","validUntil","expectedClose","paymentTerms","language","lostReasonId","lostReasonName","lostComment","isPrivate","company","createdAt","modifiedAt"],"additionalProperties":false}},"page":{"type":"object","properties":{"limit":{"type":"number"},"nextCursor":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Cursor for the next page, or null on the last page."}},"required":["limit","nextCursor"],"additionalProperties":false}},"required":["data","page"],"additionalProperties":false,"description":"Data schema used by List Quotations (GET /v1/quotations). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"QuotationsOwners":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"userId":{"type":"string"},"firstName":{"anyOf":[{"type":"string"},{"type":"null"}]},"lastName":{"anyOf":[{"type":"string"},{"type":"null"}]},"ownerName":{"type":"string"}},"required":["userId","firstName","lastName","ownerName"],"additionalProperties":false}}},"required":["data"],"additionalProperties":false,"description":"Data schema used by List Quotation Owners (GET /v1/quotations/owners). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"QuotationsSettings":{"type":"object","properties":{"data":{"type":"object","properties":{"stages":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"chance":{"type":"number"},"name":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}}]},{"type":"null"}],"description":"Translated text when `lang` is set, otherwise the full `{ language: text }` map. Languages with no text are omitted, and a field with no text at all is null.","examples":["Chair",{"en":"Chair","de":"Stuhl"}],"example":"Chair"}},"required":["id","chance","name"],"additionalProperties":false}},"lostReasons":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}}]},{"type":"null"}],"description":"Translated text when `lang` is set, otherwise the full `{ language: text }` map. Languages with no text are omitted, and a field with no text at all is null.","examples":["Chair",{"en":"Chair","de":"Stuhl"}],"example":"Chair"}},"required":["id","name"],"additionalProperties":false}}},"required":["stages","lostReasons"],"additionalProperties":false}},"required":["data"],"additionalProperties":false,"description":"Data schema used by List Quotation Settings (GET /v1/quotations/settings). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"QuotationsDetail":{"type":"object","properties":{"data":{"type":"object","properties":{"quotationId":{"type":"string","pattern":"^QUOT-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Quotation identifier (QUOT-<uuid>).","examples":["QUOT-123e4567-e89b-12d3-a456-426614174000"],"example":"QUOT-123e4567-e89b-12d3-a456-426614174000"},"quotationName":{"anyOf":[{"type":"string"},{"type":"null"}]},"quotationNumber":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"number"}]},{"type":"null"}]},"status":{"type":"string","enum":["OPEN","WON","LOST"]},"stageId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Raw configured stage identifier, or null when unset."},"stageName":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Resolved stage name, or null when unset/unconfigured."},"ownerId":{"anyOf":[{"type":"string"},{"type":"null"}]},"currency":{"anyOf":[{"type":"string"},{"type":"null"}]},"price":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Current quotation metadata price; use version.pricing.total for the selected version."},"currentVersionId":{"anyOf":[{"type":"string"},{"type":"null"}]},"numOfVersions":{"anyOf":[{"type":"number"},{"type":"null"}]},"validUntil":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO 8601 timestamp."},"expectedClose":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO 8601 timestamp."},"paymentTerms":{"anyOf":[{"type":"string"},{"type":"null"}]},"language":{"anyOf":[{"type":"string"},{"type":"null"}]},"lostReasonId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Raw configured lost-reason identifier, or null when unset."},"lostReasonName":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Resolved lost-reason name, or null when unset/unconfigured."},"lostComment":{"type":"object","properties":{"html":{"type":"string","description":"Draft.js content rendered as HTML."},"text":{"type":"string","description":"Plain text extracted from Draft.js blocks."}},"required":["html","text"],"additionalProperties":false},"isPrivate":{"type":"boolean"},"createdAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO 8601 creation timestamp."},"modifiedAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO 8601 last-modified timestamp."},"owner":{"type":"object","properties":{"ownerId":{"anyOf":[{"type":"string"},{"type":"null"}]},"firstName":{"anyOf":[{"type":"string"},{"type":"null"}]},"lastName":{"anyOf":[{"type":"string"},{"type":"null"}]},"email":{"anyOf":[{"type":"string"},{"type":"null"}]},"phoneNumber":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["ownerId","firstName","lastName","email","phoneNumber"],"additionalProperties":false},"shortCode":{"anyOf":[{"type":"string"},{"type":"null"}]},"addresses":{"type":"array","items":{},"description":"Quotation addresses; shape is quotation-defined (opaque)."},"contactId":{"anyOf":[{"type":"string"},{"type":"null"}]},"companyId":{"anyOf":[{"type":"string"},{"type":"null"}]},"version":{"type":"object","properties":{"versionId":{"type":"string"},"summary":{"type":"object","properties":{"description":{"type":"object","properties":{"html":{"type":"string","description":"Draft.js content rendered as HTML."},"text":{"type":"string","description":"Plain text extracted from Draft.js blocks."}},"required":["html","text"],"additionalProperties":false,"description":"Complete formatted summary, including any payment, bank, and delivery text entered on the quote."}},"required":["description"],"additionalProperties":false},"introduction":{"type":"object","properties":{"title":{"anyOf":[{"type":"string"},{"type":"null"}]},"description":{"type":"object","properties":{"html":{"type":"string","description":"Draft.js content rendered as HTML."},"text":{"type":"string","description":"Plain text extracted from Draft.js blocks."}},"required":["html","text"],"additionalProperties":false,"description":"Complete formatted introduction."}},"required":["title","description"],"additionalProperties":false},"pricing":{"type":"object","properties":{"products":{"type":"object","properties":{"salePrice":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Sale total for included products."},"regPrice":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Regular total for included products."},"totalQuantity":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Sum of included product row quantities across the version."},"discountPercentage":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Discount against the products regular total, in percentage points."}},"required":["salePrice","regPrice","totalQuantity","discountPercentage"],"additionalProperties":false},"additional":{"type":"array","items":{"type":"object","properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}]},"fixedAmount":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Signed fixed charge; null for percentage charges."},"percentageOfProductsTotal":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Percentage points applied to the products sale total; null for fixed charges."},"adjustmentAmount":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Signed amount added to the subtotal; percentages use the products sale total as their base."}},"required":["name","fixedAmount","percentageOfProductsTotal","adjustmentAmount"],"additionalProperties":false}},"subtotal":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Products plus additional selling charges, before final discount."},"finalDiscount":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Amount subtracted from the subtotal."},"total":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Authoritative selling total for this quotation version."}},"required":["products","additional","subtotal","finalDiscount","total"],"additionalProperties":false},"groups":{"type":"array","items":{"type":"object","properties":{"id":{"anyOf":[{"type":"string"},{"type":"null"}]},"title":{"anyOf":[{"type":"string"},{"type":"null"}]},"description":{"type":"object","properties":{"html":{"type":"string","description":"Draft.js content rendered as HTML."},"text":{"type":"string","description":"Plain text extracted from Draft.js blocks."}},"required":["html","text"],"additionalProperties":false,"description":"Formatted group description."},"pricing":{"type":"object","properties":{"salePrice":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Selling total for included rows in this group."},"regPrice":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Regular total for included rows in this group."},"totalQuantity":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Sum of included product row quantities in this group."},"discountPercentage":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Discount against the group regular total, in percentage points."}},"required":["salePrice","regPrice","totalQuantity","discountPercentage"],"additionalProperties":false},"settings":{"type":"object","properties":{"hideTitle":{"type":"boolean"},"newPage":{"type":"boolean","description":"Start this group on a new PDF page."}},"required":["hideTitle","newPage"],"additionalProperties":false},"blocks":{"type":"array","items":{"type":"object","properties":{"id":{"anyOf":[{"type":"string"},{"type":"null"}]},"blockType":{"anyOf":[{"type":"string"},{"type":"null"}]},"selectedLineId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Selected quotation row id in a PRODUCT_MULTI block."},"newPage":{"type":"boolean","description":"Page-break preference stored on the block."},"content":{"type":"object","properties":{"html":{"type":"string","description":"Draft.js content rendered as HTML."},"text":{"type":"string","description":"Plain text extracted from Draft.js blocks."}},"required":["html","text"],"additionalProperties":false,"description":"Formatted text-block content in quotation order; empty strings when the block has no text."},"products":{"type":"array","items":{"type":"object","properties":{"lineId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Unique quotation row id, distinct from catalogue productId."},"parentLineId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Parent quotation row id for a child row."},"optional":{"type":"boolean","description":"Whether this quotation row is optional."},"selectedOptional":{"type":"boolean","description":"Whether an optional row is selected."},"previewImage":{"anyOf":[{"type":"string"},{"type":"null"}]},"notes":{"anyOf":[{"type":"string"},{"type":"null"}]},"description":{"type":"object","properties":{"html":{"type":"string","description":"Draft.js content rendered as HTML."},"text":{"type":"string","description":"Plain text extracted from Draft.js blocks."}},"required":["html","text"],"additionalProperties":false,"description":"Formatted product description, separate from notes."},"productId":{"anyOf":[{"type":"string"},{"type":"null"}]},"configurationCode":{"anyOf":[{"type":"string"},{"type":"null"}]},"type":{"anyOf":[{"type":"string"},{"type":"null"}]},"variantCode":{"anyOf":[{"type":"string"},{"type":"null"}]},"quantity":{"anyOf":[{"type":"number"},{"type":"null"}]},"name":{"anyOf":[{"type":"string"},{"type":"null"}]},"options":{"type":"array","items":{"type":"object","properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}]},"hideOnSpecification":{"type":"boolean","description":"Omit this option from the customer-facing specification when true."},"value":{"anyOf":[{"type":"string"},{"type":"null"}]},"previewImage":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["name","hideOnSpecification","value","previewImage"],"additionalProperties":false}},"sku":{"anyOf":[{"type":"string"},{"type":"null"}]},"unitSalePrice":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Selling price per unit, before any one-time line charge."},"unitRegPrice":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Regular price per unit."},"oneTimeCharge":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Charge applied once to the line and included in both salePrice and regPrice."},"salePrice":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Selling total for the entire quotation row."},"regPrice":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Regular total for the entire quotation row."}},"required":["lineId","parentLineId","optional","selectedOptional","previewImage","notes","description","productId","configurationCode","type","variantCode","quantity","name","options","sku","unitSalePrice","unitRegPrice","oneTimeCharge","salePrice","regPrice"],"additionalProperties":false}},"gallery":{"anyOf":[{"type":"object","properties":{"numOfColumns":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"items":{"type":"array","items":{"type":"object","properties":{"mediaType":{"anyOf":[{"type":"string","enum":["IMAGE","VIDEO"]},{"type":"null"}]},"mediaSource":{"anyOf":[{"type":"string","enum":["CUSTOM","MEDIA_LIBRARY"]},{"type":"null"}]},"fileId":{"anyOf":[{"type":"string"},{"type":"null"}]},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Absolute media URL; null if the item has no file path or URL."},"caption":{"anyOf":[{"type":"string"},{"type":"null"}]},"autoplay":{"type":"boolean"},"loop":{"type":"boolean"}},"required":["mediaType","mediaSource","fileId","url","caption","autoplay","loop"],"additionalProperties":false},"description":"Gallery media in display order."}},"required":["numOfColumns","items"],"additionalProperties":false},{"type":"null"}]},"documents":{"type":"array","items":{"type":"object","properties":{"fileId":{"anyOf":[{"type":"string"},{"type":"null"}]},"directoryPath":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Source directory for resolving file details."}},"required":["fileId","directoryPath"],"additionalProperties":false}}},"required":["id","blockType","selectedLineId","newPage","content","products","gallery","documents"],"additionalProperties":false}}},"required":["id","title","description","pricing","settings","blocks"],"additionalProperties":false}}},"required":["versionId","summary","introduction","pricing","groups"],"additionalProperties":false}},"required":["quotationId","quotationName","quotationNumber","status","stageId","stageName","ownerId","currency","price","currentVersionId","numOfVersions","validUntil","expectedClose","paymentTerms","language","lostReasonId","lostReasonName","lostComment","isPrivate","createdAt","modifiedAt","owner","shortCode","addresses","contactId","companyId","version"],"additionalProperties":false}},"required":["data"],"additionalProperties":false,"description":"Data schema used by Get Quotation (GET /v1/quotations/{quotationId}). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"QuotationsMutation":{"type":"object","properties":{"data":{"type":"object","properties":{"quotationId":{"type":"string","pattern":"^QUOT-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Quotation identifier (QUOT-<uuid>).","examples":["QUOT-123e4567-e89b-12d3-a456-426614174000"],"example":"QUOT-123e4567-e89b-12d3-a456-426614174000"},"status":{"type":"string","enum":["OPEN","WON","LOST"]}},"required":["quotationId","status"],"additionalProperties":false}},"required":["data"],"additionalProperties":false,"description":"Data schema used by Set Quotation Status (POST /v1/quotations/{quotationId}/status). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"QuotationsStatusRequest":{"oneOf":[{"type":"object","properties":{"status":{"type":"string","const":"OPEN"}},"required":["status"],"additionalProperties":false},{"type":"object","properties":{"status":{"type":"string","const":"WON"},"versionId":{"type":"string","pattern":"^VERSION_\\d+$"},"acceptedByName":{"type":"string","minLength":1,"maxLength":255},"acceptNotes":{"type":"string","maxLength":5000}},"required":["status","versionId","acceptedByName"],"additionalProperties":false},{"type":"object","properties":{"status":{"type":"string","const":"LOST"},"lostReasonId":{"type":"string","minLength":1,"maxLength":255},"lostComment":{"type":"string","maxLength":5000}},"required":["status","lostReasonId"],"additionalProperties":false}],"description":"Data schema used by Set Quotation Status (POST /v1/quotations/{quotationId}/status). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"QuotationsMutation2":{"type":"object","properties":{"data":{"type":"object","properties":{"quotationId":{"type":"string","pattern":"^QUOT-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Quotation identifier (QUOT-<uuid>).","examples":["QUOT-123e4567-e89b-12d3-a456-426614174000"],"example":"QUOT-123e4567-e89b-12d3-a456-426614174000"},"stageId":{"type":"string"},"stageName":{"type":"string"}},"required":["quotationId","stageId","stageName"],"additionalProperties":false}},"required":["data"],"additionalProperties":false,"description":"Data schema used by Set Quotation Stage (POST /v1/quotations/{quotationId}/stage). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"QuotationsStageRequest":{"type":"object","properties":{"stageId":{"type":"string","minLength":1,"maxLength":255}},"required":["stageId"],"additionalProperties":false,"description":"Data schema used by Set Quotation Stage (POST /v1/quotations/{quotationId}/stage). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"QuotationsVersions":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"versionId":{"type":"string"},"status":{"anyOf":[{"type":"string"},{"type":"null"}]},"createdAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO 8601 timestamp."},"modifiedAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO 8601 timestamp."}},"required":["versionId","status","createdAt","modifiedAt"],"additionalProperties":false}}},"required":["data"],"additionalProperties":false,"description":"Data schema used by List Quotation Versions (GET /v1/quotations/{quotationId}/versions). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"QuotationsVersions2":{"type":"object","properties":{"data":{"type":"object","properties":{"versionId":{"type":"string"},"status":{"anyOf":[{"type":"string"},{"type":"null"}]},"createdAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO 8601 timestamp."},"modifiedAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO 8601 timestamp."},"summary":{"type":"object","properties":{"description":{"type":"object","properties":{"html":{"type":"string","description":"Draft.js content rendered as HTML."},"text":{"type":"string","description":"Plain text extracted from Draft.js blocks."}},"required":["html","text"],"additionalProperties":false,"description":"Complete formatted summary, including any payment, bank, and delivery text entered on the quote."}},"required":["description"],"additionalProperties":false},"introduction":{"type":"object","properties":{"title":{"anyOf":[{"type":"string"},{"type":"null"}]},"description":{"type":"object","properties":{"html":{"type":"string","description":"Draft.js content rendered as HTML."},"text":{"type":"string","description":"Plain text extracted from Draft.js blocks."}},"required":["html","text"],"additionalProperties":false,"description":"Complete formatted introduction."}},"required":["title","description"],"additionalProperties":false},"pricing":{"type":"object","properties":{"products":{"type":"object","properties":{"salePrice":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Sale total for included products."},"regPrice":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Regular total for included products."},"totalQuantity":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Sum of included product row quantities across the version."},"discountPercentage":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Discount against the products regular total, in percentage points."}},"required":["salePrice","regPrice","totalQuantity","discountPercentage"],"additionalProperties":false},"additional":{"type":"array","items":{"type":"object","properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}]},"fixedAmount":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Signed fixed charge; null for percentage charges."},"percentageOfProductsTotal":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Percentage points applied to the products sale total; null for fixed charges."},"adjustmentAmount":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Signed amount added to the subtotal; percentages use the products sale total as their base."}},"required":["name","fixedAmount","percentageOfProductsTotal","adjustmentAmount"],"additionalProperties":false}},"subtotal":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Products plus additional selling charges, before final discount."},"finalDiscount":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Amount subtracted from the subtotal."},"total":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Authoritative selling total for this quotation version."}},"required":["products","additional","subtotal","finalDiscount","total"],"additionalProperties":false},"groups":{"type":"array","items":{"type":"object","properties":{"id":{"anyOf":[{"type":"string"},{"type":"null"}]},"title":{"anyOf":[{"type":"string"},{"type":"null"}]},"description":{"type":"object","properties":{"html":{"type":"string","description":"Draft.js content rendered as HTML."},"text":{"type":"string","description":"Plain text extracted from Draft.js blocks."}},"required":["html","text"],"additionalProperties":false,"description":"Formatted group description."},"pricing":{"type":"object","properties":{"salePrice":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Selling total for included rows in this group."},"regPrice":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Regular total for included rows in this group."},"totalQuantity":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Sum of included product row quantities in this group."},"discountPercentage":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Discount against the group regular total, in percentage points."}},"required":["salePrice","regPrice","totalQuantity","discountPercentage"],"additionalProperties":false},"settings":{"type":"object","properties":{"hideTitle":{"type":"boolean"},"newPage":{"type":"boolean","description":"Start this group on a new PDF page."}},"required":["hideTitle","newPage"],"additionalProperties":false},"blocks":{"type":"array","items":{"type":"object","properties":{"id":{"anyOf":[{"type":"string"},{"type":"null"}]},"blockType":{"anyOf":[{"type":"string"},{"type":"null"}]},"selectedLineId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Selected quotation row id in a PRODUCT_MULTI block."},"newPage":{"type":"boolean","description":"Page-break preference stored on the block."},"content":{"type":"object","properties":{"html":{"type":"string","description":"Draft.js content rendered as HTML."},"text":{"type":"string","description":"Plain text extracted from Draft.js blocks."}},"required":["html","text"],"additionalProperties":false,"description":"Formatted text-block content in quotation order; empty strings when the block has no text."},"products":{"type":"array","items":{"type":"object","properties":{"lineId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Unique quotation row id, distinct from catalogue productId."},"parentLineId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Parent quotation row id for a child row."},"optional":{"type":"boolean","description":"Whether this quotation row is optional."},"selectedOptional":{"type":"boolean","description":"Whether an optional row is selected."},"previewImage":{"anyOf":[{"type":"string"},{"type":"null"}]},"notes":{"anyOf":[{"type":"string"},{"type":"null"}]},"description":{"type":"object","properties":{"html":{"type":"string","description":"Draft.js content rendered as HTML."},"text":{"type":"string","description":"Plain text extracted from Draft.js blocks."}},"required":["html","text"],"additionalProperties":false,"description":"Formatted product description, separate from notes."},"productId":{"anyOf":[{"type":"string"},{"type":"null"}]},"configurationCode":{"anyOf":[{"type":"string"},{"type":"null"}]},"type":{"anyOf":[{"type":"string"},{"type":"null"}]},"variantCode":{"anyOf":[{"type":"string"},{"type":"null"}]},"quantity":{"anyOf":[{"type":"number"},{"type":"null"}]},"name":{"anyOf":[{"type":"string"},{"type":"null"}]},"options":{"type":"array","items":{"type":"object","properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}]},"hideOnSpecification":{"type":"boolean","description":"Omit this option from the customer-facing specification when true."},"value":{"anyOf":[{"type":"string"},{"type":"null"}]},"previewImage":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["name","hideOnSpecification","value","previewImage"],"additionalProperties":false}},"sku":{"anyOf":[{"type":"string"},{"type":"null"}]},"unitSalePrice":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Selling price per unit, before any one-time line charge."},"unitRegPrice":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Regular price per unit."},"oneTimeCharge":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Charge applied once to the line and included in both salePrice and regPrice."},"salePrice":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Selling total for the entire quotation row."},"regPrice":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Regular total for the entire quotation row."}},"required":["lineId","parentLineId","optional","selectedOptional","previewImage","notes","description","productId","configurationCode","type","variantCode","quantity","name","options","sku","unitSalePrice","unitRegPrice","oneTimeCharge","salePrice","regPrice"],"additionalProperties":false}},"gallery":{"anyOf":[{"type":"object","properties":{"numOfColumns":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"items":{"type":"array","items":{"type":"object","properties":{"mediaType":{"anyOf":[{"type":"string","enum":["IMAGE","VIDEO"]},{"type":"null"}]},"mediaSource":{"anyOf":[{"type":"string","enum":["CUSTOM","MEDIA_LIBRARY"]},{"type":"null"}]},"fileId":{"anyOf":[{"type":"string"},{"type":"null"}]},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Absolute media URL; null if the item has no file path or URL."},"caption":{"anyOf":[{"type":"string"},{"type":"null"}]},"autoplay":{"type":"boolean"},"loop":{"type":"boolean"}},"required":["mediaType","mediaSource","fileId","url","caption","autoplay","loop"],"additionalProperties":false},"description":"Gallery media in display order."}},"required":["numOfColumns","items"],"additionalProperties":false},{"type":"null"}]},"documents":{"type":"array","items":{"type":"object","properties":{"fileId":{"anyOf":[{"type":"string"},{"type":"null"}]},"directoryPath":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Source directory for resolving file details."}},"required":["fileId","directoryPath"],"additionalProperties":false}}},"required":["id","blockType","selectedLineId","newPage","content","products","gallery","documents"],"additionalProperties":false}}},"required":["id","title","description","pricing","settings","blocks"],"additionalProperties":false}}},"required":["versionId","status","createdAt","modifiedAt","summary","introduction","pricing","groups"],"additionalProperties":false}},"required":["data"],"additionalProperties":false,"description":"Data schema used by Get Quotation Version (GET /v1/quotations/{quotationId}/versions/{versionId}). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."},"QuotationsNotes":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"noteId":{"anyOf":[{"type":"string"},{"type":"null"}]},"noteTitle":{"anyOf":[{"type":"string"},{"type":"null"}]},"noteContent":{"type":"object","properties":{"html":{"type":"string","description":"Draft.js content rendered as HTML."},"text":{"type":"string","description":"Plain text extracted from Draft.js blocks."}},"required":["html","text"],"additionalProperties":false},"attachments":{"type":"array","items":{"type":"object","properties":{"fileId":{"anyOf":[{"type":"string"},{"type":"null"}]},"label":{"anyOf":[{"type":"string"},{"type":"null"}]},"filePath":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["fileId","label","filePath"],"additionalProperties":false}},"createdAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO 8601 timestamp."},"modifiedAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO 8601 timestamp."}},"required":["noteId","noteTitle","noteContent","attachments","createdAt","modifiedAt"],"additionalProperties":false}}},"required":["data"],"additionalProperties":false,"description":"Data schema used by List Quotation Notes (GET /v1/quotations/{quotationId}/notes). Read that operation for usage, permissions and update rules. Required fields and allowed values are defined below; request and response shapes can differ."}}}}