{
  "info": {
    "name": "CompuDime Public API",
    "description": "The CompuDime Public API: read a store's products, prices, sales, customers and more from its point of sale, and send orders into it.\n\nGenerated from the live OpenAPI document (https://api.compudime.com/openapi.json, pricing version 2026-10-09.2), one folder per section of the API reference.\n\n1. Set the collection variable `apiKey` to your key (from https://account.compudime.com). Every request sends it as a bearer token.\n2. Send **Describe the calling key** (`GET /v1/me`) first: it is free and says which store the key reads and what it may do.\n3. Optional query parameters are listed, switched off; tick the ones you want.\n\nTwo order APIs share this address. `/v1/orders`, in this collection, is the CompuDime Public API: your app sends an order into a store's POS, then reads where it stands. `/api/v1/orders/...` is the CompuDime Orders API, where delivery and ordering services push orders into a store's queue; it is a separate API and not in this collection.\n\nDocs: https://api.compudime.com/docs. Help: support@compudime.com.",
    "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
  },
  "auth": {
    "type": "bearer",
    "bearer": [
      {
        "key": "token",
        "value": "{{apiKey}}",
        "type": "string"
      }
    ]
  },
  "variable": [
    {
      "key": "baseUrl",
      "value": "https://api.compudime.com",
      "type": "string",
      "description": "The API address. Every request but the status checks is sent to it."
    },
    {
      "key": "apiKey",
      "value": "",
      "type": "string",
      "description": "Your API key from account.compudime.com, sent as a bearer token on every request that needs one. Put it in the current value only, so it is never synced or shared. A test key (cc_test_ or cd_test_) uses the store's sandbox allowance, and its orders are simulated: they never reach the store."
    }
  ],
  "item": [
    {
      "name": "Catalog",
      "description": "Reference: https://api.compudime.com/docs/reference#family-catalog",
      "item": [
        {
          "name": "Get current catalog snapshot",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/catalog/snapshots/current",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "catalog",
                "snapshots",
                "current"
              ],
              "query": [
                {
                  "key": "fields",
                  "value": "",
                  "description": "Comma-separated catalog snapshot fields to include (see x-compudime-field-catalog), or * for every field the key may see. Omitted: a flat-priced endpoint returns every field; once IT prices the endpoint by field count (includedFields in x-compudime-pricing), an omitted fields returns the standard set at the base price and each field beyond the included count adds extraFieldCost. An unknown or denied field is a free 400 field_not_allowed.",
                  "disabled": true
                },
                {
                  "key": "estimate",
                  "value": "true",
                  "description": "When true, returns EstimateResponse instead of the normal body and never reserves credits: the request is authenticated, authorized and field-resolved exactly like a real call, then priced by billing (base cost plus extra-field credits for the resolved fields) and returned without dispatching to the store. Free of charge.",
                  "disabled": true
                }
              ]
            },
            "description": "- **Price:** 1 credit, per call (the list price).\n- **Estimate:** add `estimate=true` for a free quote at your key's price.\n- **Capability:** `catalog-feed`.\n- **Reference:** https://api.compudime.com/docs/reference/catalog.snapshots.current"
          },
          "response": []
        },
        {
          "name": "List catalog products",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/products",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "products"
              ],
              "query": [
                {
                  "key": "fields",
                  "value": "",
                  "description": "Comma-separated catalog products fields to include (see x-compudime-field-catalog), or * for every field the key may see. Omitted: a flat-priced endpoint returns every field; once IT prices the endpoint by field count (includedFields in x-compudime-pricing), an omitted fields returns the standard set at the base price and each field beyond the included count adds extraFieldCost. An unknown or denied field is a free 400 field_not_allowed.",
                  "disabled": true
                },
                {
                  "key": "cursor",
                  "value": "",
                  "description": "Cursor returned from the previous product page.",
                  "disabled": true
                },
                {
                  "key": "limit",
                  "value": "100",
                  "description": "How many products to return: any whole number of 1 or more; default 100 (one page). One answer carries at most 10,000 (a safeguard on the size of one answer, not a limit on the listing): a larger limit answers 10,000 and nextCursor. A page can hold fewer rows than limit while nextCursor is set: keep following nextCursor until it is empty.",
                  "disabled": true
                },
                {
                  "key": "modifiedSince",
                  "value": "",
                  "description": "Only return products modified at or after this timestamp (compared with lastModifiedUtc), plus every product whose modification time is unknown (lastModifiedUtc empty), which is always returned: it cannot be shown unchanged, so an incremental sync reads it again. Rows are keyed by productCode, so reading one again is harmless. For the next call pass the largest lastModifiedUtc you have received minus one hour, not your own clock: lastModifiedUtc runs on the store's own clock, so no clock difference can skip a change, and the hour covers the hour the store's clocks go back in the fall.",
                  "disabled": true
                },
                {
                  "key": "includeInactive",
                  "value": "true",
                  "description": "Whether to list products the product file flags inactive (inactive: true). Default false: the list leaves them out, and a product whose flag the store's agent has not reported yet (inactive: null) is listed. true lists every product, inactive ones included (the list's default until 2026-10-07). Pass the same value on every page of one listing (or leave it out on every page), as with modifiedSince: the cursor continues the listing it came from. With the default, a product that becomes inactive stops appearing, even with modifiedSince; to see the change, read with includeInactive=true. true or false only; anything else is a free 400.",
                  "disabled": true
                },
                {
                  "key": "estimate",
                  "value": "true",
                  "description": "When true, returns EstimateResponse instead of the normal body and never reserves credits: the request is authenticated, authorized and field-resolved exactly like a real call, then priced by billing (base cost plus extra-field credits for the resolved fields) and returned without dispatching to the store. Free of charge.",
                  "disabled": true
                }
              ]
            },
            "description": "- **Price:** 1 credit; 5 fields included, 1 more per extra field, per page of 100 rows returned (the list price).\n- **Estimate:** add `estimate=true` for a free quote at your key's price.\n- **Capability:** `catalog-feed`.\n- **Paging:** send `nextCursor` back as `cursor` until it is empty.\n- **Reference:** https://api.compudime.com/docs/reference/catalog.products.list"
          },
          "response": []
        },
        {
          "name": "Look up a product live by any code",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/products/lookup/:code",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "products",
                "lookup",
                ":code"
              ],
              "query": [
                {
                  "key": "fields",
                  "value": "",
                  "description": "Comma-separated live products fields to include (see x-compudime-field-catalog), or * for every field the key may see. Omitted: a flat-priced endpoint returns every field; once IT prices the endpoint by field count (includedFields in x-compudime-pricing), an omitted fields returns the standard set at the base price and each field beyond the included count adds extraFieldCost. An unknown or denied field is a free 400 field_not_allowed.",
                  "disabled": true
                },
                {
                  "key": "estimate",
                  "value": "true",
                  "description": "When true, returns EstimateResponse instead of the normal body and never reserves credits: the request is authenticated, authorized and field-resolved exactly like a real call, then priced by billing (base cost plus extra-field credits for the resolved fields) and returned without dispatching to the store. Free of charge.",
                  "disabled": true
                }
              ],
              "variable": [
                {
                  "key": "code",
                  "value": "",
                  "description": "Any code the register resolves: the product code, a UPC with or without check digit, an alias, a case code or a price/weight-embedded barcode. 1-40 letters, digits or dashes; anything else is a free 400 before billing."
                }
              ]
            },
            "description": "- **Price:** 5 credits; 5 fields included, 1 more per extra field, per call (the list price).\n- **Estimate:** add `estimate=true` for a free quote at your key's price.\n- **Capability:** `catalog-feed`.\n- **Reference:** https://api.compudime.com/docs/reference/catalog.products.lookup"
          },
          "response": []
        },
        {
          "name": "Get catalog product",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/products/:productCode",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "products",
                ":productCode"
              ],
              "query": [
                {
                  "key": "fields",
                  "value": "",
                  "description": "Comma-separated catalog products fields to include (see x-compudime-field-catalog), or * for every field the key may see. Omitted: a flat-priced endpoint returns every field; once IT prices the endpoint by field count (includedFields in x-compudime-pricing), an omitted fields returns the standard set at the base price and each field beyond the included count adds extraFieldCost. An unknown or denied field is a free 400 field_not_allowed.",
                  "disabled": true
                },
                {
                  "key": "estimate",
                  "value": "true",
                  "description": "When true, returns EstimateResponse instead of the normal body and never reserves credits: the request is authenticated, authorized and field-resolved exactly like a real call, then priced by billing (base cost plus extra-field credits for the resolved fields) and returned without dispatching to the store. Free of charge.",
                  "disabled": true
                }
              ],
              "variable": [
                {
                  "key": "productCode",
                  "value": "",
                  "description": "Store product code."
                }
              ]
            },
            "description": "- **Price:** 1 credit; 5 fields included, 1 more per extra field, per call (the list price).\n- **Estimate:** add `estimate=true` for a free quote at your key's price.\n- **Capability:** `catalog-feed`.\n- **Reference:** https://api.compudime.com/docs/reference/catalog.products.get"
          },
          "response": []
        }
      ]
    },
    {
      "name": "Store lists and profile",
      "description": "Reference: https://api.compudime.com/docs/reference#family-reference",
      "item": [
        {
          "name": "List the store's brands live",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/brands",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "brands"
              ],
              "query": [
                {
                  "key": "fields",
                  "value": "",
                  "description": "Comma-separated brands fields to include (see x-compudime-field-catalog), or * for every field the key may see. Omitted: a flat-priced endpoint returns every field; once IT prices the endpoint by field count (includedFields in x-compudime-pricing), an omitted fields returns the standard set at the base price and each field beyond the included count adds extraFieldCost. An unknown or denied field is a free 400 field_not_allowed.",
                  "disabled": true
                },
                {
                  "key": "limit",
                  "value": "100",
                  "description": "How many brands to return: any whole number of 1 or more; default 100 (one page). The store is read 500 at a time, so a larger limit is read from the store in several reads, one after another, and answered at once. One answer carries at most 10,000 (a safeguard on the size of one answer, not a limit on the listing); a larger limit ends with nextCursor. There is no time limit on reading: an answer that needs several reads keeps reading until it holds limit rows (at most 10,000) or the listing ends. While it reads, the response is already open: its body starts with spaces (legal JSON whitespace, sent every few seconds so no proxy closes an idle connection), and X-Credits-Charged and X-Credits-Remaining are not response headers but HTTP trailers, which reach HTTP/2 clients (on api.compudime.com and compudime-public-api.fly.dev alike) and are dropped over HTTP/1.1. The billing block in the body always says what the call cost (totalCredits per unit times quantity); /v1/usage/current gives the balance. When this API or the store is busy with other long answers, an answer may end after its first read with nextCursor instead. A page can hold fewer rows than limit while nextCursor is set: keep following nextCursor until it is empty.",
                  "disabled": true
                },
                {
                  "key": "cursor",
                  "value": "",
                  "description": "nextCursor from the previous page, verbatim, with the same filters. Omit for the first page; an empty nextCursor means the last page.",
                  "disabled": true
                },
                {
                  "key": "modifiedSince",
                  "value": "",
                  "description": "Only the brands the POS changed at or after this RFC3339 timestamp (incremental sync; compare with modifiedAt). A row changes whenever a product gains or loses its value, because its productCount changes; on a list built from the products it also changes whenever a product carrying the value changes. A store whose list keeps no modification time answers 422 modified_since_unsupported.",
                  "disabled": true
                },
                {
                  "key": "estimate",
                  "value": "true",
                  "description": "When true, returns EstimateResponse instead of the normal body and never reserves credits: the request is authenticated, authorized and field-resolved exactly like a real call, then priced by billing (base cost plus extra-field credits for the resolved fields) and returned without dispatching to the store. Free of charge.",
                  "disabled": true
                }
              ]
            },
            "description": "- **Price:** 1 credit, per page of 100 rows returned (the list price).\n- **Estimate:** add `estimate=true` for a free quote at your key's price.\n- **Capability:** `catalog-feed`.\n- **Paging:** send `nextCursor` back as `cursor` until it is empty.\n- **Reference:** https://api.compudime.com/docs/reference/catalog.brands.list"
          },
          "response": []
        },
        {
          "name": "List the store's departments, categories and sub-categories live",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/categories",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "categories"
              ],
              "query": [
                {
                  "key": "fields",
                  "value": "",
                  "description": "Comma-separated categories fields to include (see x-compudime-field-catalog), or * for every field the key may see. Omitted: a flat-priced endpoint returns every field; once IT prices the endpoint by field count (includedFields in x-compudime-pricing), an omitted fields returns the standard set at the base price and each field beyond the included count adds extraFieldCost. An unknown or denied field is a free 400 field_not_allowed.",
                  "disabled": true
                },
                {
                  "key": "limit",
                  "value": "100",
                  "description": "How many rows to return: any whole number of 1 or more; default 100 (one page). The store is read 500 at a time, so a larger limit is read from the store in several reads, one after another, and answered at once. One answer carries at most 10,000 (a safeguard on the size of one answer, not a limit on the listing); a larger limit ends with nextCursor. There is no time limit on reading: an answer that needs several reads keeps reading until it holds limit rows (at most 10,000) or the listing ends. While it reads, the response is already open: its body starts with spaces (legal JSON whitespace, sent every few seconds so no proxy closes an idle connection), and X-Credits-Charged and X-Credits-Remaining are not response headers but HTTP trailers, which reach HTTP/2 clients (on api.compudime.com and compudime-public-api.fly.dev alike) and are dropped over HTTP/1.1. The billing block in the body always says what the call cost (totalCredits per unit times quantity); /v1/usage/current gives the balance. When this API or the store is busy with other long answers, an answer may end after its first read with nextCursor instead. A page can hold fewer rows than limit while nextCursor is set: keep following nextCursor until it is empty.",
                  "disabled": true
                },
                {
                  "key": "cursor",
                  "value": "",
                  "description": "nextCursor from the previous page, verbatim, with the same filters. Omit for the first page; an empty nextCursor means the last page.",
                  "disabled": true
                },
                {
                  "key": "type",
                  "value": "department",
                  "description": "Only one list: department (the product field department), category (category) or subCategory (subCategory, each row naming its category in parent). Omit for all three, which come in that order.",
                  "disabled": true
                },
                {
                  "key": "modifiedSince",
                  "value": "",
                  "description": "Only the rows the POS changed at or after this RFC3339 timestamp (incremental sync; compare with modifiedAt). A row changes whenever a product gains or loses its value, because its productCount changes; on a list built from the products it also changes whenever a product carrying the value changes. A store whose list keeps no modification time answers 422 modified_since_unsupported.",
                  "disabled": true
                },
                {
                  "key": "estimate",
                  "value": "true",
                  "description": "When true, returns EstimateResponse instead of the normal body and never reserves credits: the request is authenticated, authorized and field-resolved exactly like a real call, then priced by billing (base cost plus extra-field credits for the resolved fields) and returned without dispatching to the store. Free of charge.",
                  "disabled": true
                }
              ]
            },
            "description": "- **Price:** 1 credit, per page of 100 rows returned (the list price).\n- **Estimate:** add `estimate=true` for a free quote at your key's price.\n- **Capability:** `catalog-feed`.\n- **Paging:** send `nextCursor` back as `cursor` until it is empty.\n- **Reference:** https://api.compudime.com/docs/reference/catalog.categories.list"
          },
          "response": []
        },
        {
          "name": "List the register's discount and return reasons live",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/reasons",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "reasons"
              ],
              "query": [
                {
                  "key": "fields",
                  "value": "",
                  "description": "Comma-separated reasons fields to include (see x-compudime-field-catalog), or * for every field the key may see. Omitted: a flat-priced endpoint returns every field; once IT prices the endpoint by field count (includedFields in x-compudime-pricing), an omitted fields returns the standard set at the base price and each field beyond the included count adds extraFieldCost. An unknown or denied field is a free 400 field_not_allowed.",
                  "disabled": true
                },
                {
                  "key": "type",
                  "value": "discount",
                  "description": "Only one list: discount (the reasons the register offers for a register or customer discount) or return (the reasons it offers when a return is rung). Omit for both, which come in that order.",
                  "disabled": true
                },
                {
                  "key": "estimate",
                  "value": "true",
                  "description": "When true, returns EstimateResponse instead of the normal body and never reserves credits: the request is authenticated, authorized and field-resolved exactly like a real call, then priced by billing (base cost plus extra-field credits for the resolved fields) and returned without dispatching to the store. Free of charge.",
                  "disabled": true
                }
              ]
            },
            "description": "- **Price:** 1 credit, per call (the list price).\n- **Estimate:** add `estimate=true` for a free quote at your key's price.\n- **Capability:** `catalog-feed`.\n- **Reference:** https://api.compudime.com/docs/reference/store.reasons.list"
          },
          "response": []
        },
        {
          "name": "Get the store's business profile live",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/store",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "store"
              ],
              "query": [
                {
                  "key": "fields",
                  "value": "",
                  "description": "Comma-separated store profile fields to include (see x-compudime-field-catalog), or * for every field the key may see. Omitted: a flat-priced endpoint returns every field; once IT prices the endpoint by field count (includedFields in x-compudime-pricing), an omitted fields returns the standard set at the base price and each field beyond the included count adds extraFieldCost. An unknown or denied field is a free 400 field_not_allowed.",
                  "disabled": true
                },
                {
                  "key": "estimate",
                  "value": "true",
                  "description": "When true, returns EstimateResponse instead of the normal body and never reserves credits: the request is authenticated, authorized and field-resolved exactly like a real call, then priced by billing (base cost plus extra-field credits for the resolved fields) and returned without dispatching to the store. Free of charge.",
                  "disabled": true
                }
              ]
            },
            "description": "- **Price:** 1 credit, per call (the list price).\n- **Estimate:** add `estimate=true` for a free quote at your key's price.\n- **Capability:** `catalog-feed`.\n- **Reference:** https://api.compudime.com/docs/reference/store.profile.get"
          },
          "response": []
        },
        {
          "name": "List the store's product tags live",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/tags",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "tags"
              ],
              "query": [
                {
                  "key": "fields",
                  "value": "",
                  "description": "Comma-separated tags fields to include (see x-compudime-field-catalog), or * for every field the key may see. Omitted: a flat-priced endpoint returns every field; once IT prices the endpoint by field count (includedFields in x-compudime-pricing), an omitted fields returns the standard set at the base price and each field beyond the included count adds extraFieldCost. An unknown or denied field is a free 400 field_not_allowed.",
                  "disabled": true
                },
                {
                  "key": "limit",
                  "value": "100",
                  "description": "How many tags to return: any whole number of 1 or more; default 100 (one page). The store is read 500 at a time, so a larger limit is read from the store in several reads, one after another, and answered at once. One answer carries at most 10,000 (a safeguard on the size of one answer, not a limit on the listing); a larger limit ends with nextCursor. There is no time limit on reading: an answer that needs several reads keeps reading until it holds limit rows (at most 10,000) or the listing ends. While it reads, the response is already open: its body starts with spaces (legal JSON whitespace, sent every few seconds so no proxy closes an idle connection), and X-Credits-Charged and X-Credits-Remaining are not response headers but HTTP trailers, which reach HTTP/2 clients (on api.compudime.com and compudime-public-api.fly.dev alike) and are dropped over HTTP/1.1. The billing block in the body always says what the call cost (totalCredits per unit times quantity); /v1/usage/current gives the balance. When this API or the store is busy with other long answers, an answer may end after its first read with nextCursor instead. A page can hold fewer rows than limit while nextCursor is set: keep following nextCursor until it is empty.",
                  "disabled": true
                },
                {
                  "key": "cursor",
                  "value": "",
                  "description": "nextCursor from the previous page, verbatim, with the same filters. Omit for the first page; an empty nextCursor means the last page.",
                  "disabled": true
                },
                {
                  "key": "modifiedSince",
                  "value": "",
                  "description": "Only the tags the POS changed at or after this RFC3339 timestamp (incremental sync; compare with modifiedAt). A row changes whenever a product gains or loses its value, because its productCount changes; on a list built from the products it also changes whenever a product carrying the value changes. A store whose list keeps no modification time answers 422 modified_since_unsupported.",
                  "disabled": true
                },
                {
                  "key": "estimate",
                  "value": "true",
                  "description": "When true, returns EstimateResponse instead of the normal body and never reserves credits: the request is authenticated, authorized and field-resolved exactly like a real call, then priced by billing (base cost plus extra-field credits for the resolved fields) and returned without dispatching to the store. Free of charge.",
                  "disabled": true
                }
              ]
            },
            "description": "- **Price:** 1 credit, per page of 100 rows returned (the list price).\n- **Estimate:** add `estimate=true` for a free quote at your key's price.\n- **Capability:** `catalog-feed`.\n- **Paging:** send `nextCursor` back as `cursor` until it is empty.\n- **Reference:** https://api.compudime.com/docs/reference/catalog.tags.list"
          },
          "response": []
        }
      ]
    },
    {
      "name": "Promotions",
      "description": "Reference: https://api.compudime.com/docs/reference#family-promotions",
      "item": [
        {
          "name": "List the store's promotions live",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/promotions",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "promotions"
              ],
              "query": [
                {
                  "key": "fields",
                  "value": "",
                  "description": "Comma-separated promotions fields to include (see x-compudime-field-catalog), or * for every field the key may see. Omitted: a flat-priced endpoint returns every field; once IT prices the endpoint by field count (includedFields in x-compudime-pricing), an omitted fields returns the standard set at the base price and each field beyond the included count adds extraFieldCost. An unknown or denied field is a free 400 field_not_allowed.",
                  "disabled": true
                },
                {
                  "key": "limit",
                  "value": "100",
                  "description": "How many promotions to return: any whole number of 1 or more; default 100 (one page). The store is read 200 at a time, so a larger limit is read from the store in several reads, one after another, and answered at once. One answer carries at most 10,000 (a safeguard on the size of one answer, not a limit on the listing); a larger limit ends with nextCursor. There is no time limit on reading: an answer that needs several reads keeps reading until it holds limit rows (at most 10,000) or the listing ends. While it reads, the response is already open: its body starts with spaces (legal JSON whitespace, sent every few seconds so no proxy closes an idle connection), and X-Credits-Charged and X-Credits-Remaining are not response headers but HTTP trailers, which reach HTTP/2 clients (on api.compudime.com and compudime-public-api.fly.dev alike) and are dropped over HTTP/1.1. The billing block in the body always says what the call cost (totalCredits per unit times quantity); /v1/usage/current gives the balance. When this API or the store is busy with other long answers, an answer may end after its first read with nextCursor instead. A page can hold fewer rows than limit while nextCursor is set: keep following nextCursor until it is empty.",
                  "disabled": true
                },
                {
                  "key": "cursor",
                  "value": "",
                  "description": "nextCursor from the previous page, verbatim, with the same filters. Omit for the first page; an empty nextCursor means the last page. A page can hold fewer promotions than limit, even none, while nextCursor is set: keep paging until it is empty.",
                  "disabled": true
                },
                {
                  "key": "status",
                  "value": "current",
                  "description": "current (the default): every promotion that has not ended, running now or not; running: only those the register applies right now (runningNow true); upcoming: only those whose begin date is after today. A promotion a store rule decides is never running or on a day: list with current to see it. Not together with activeOn.",
                  "disabled": true
                },
                {
                  "key": "activeOn",
                  "value": "",
                  "description": "A store day (YYYY-MM-DD): only the promotions the register applies at some time of that day, by the same rules as runningNow. Not together with status.",
                  "disabled": true
                },
                {
                  "key": "productCode",
                  "value": "",
                  "description": "Only the promotions of this POS product code: its own deals and mix and match membership, and the scheduled prices of the product, its category and its brand. 1-40 characters: a letter, digit or dot, then letters, digits, spaces or . _ # & + @ / = -",
                  "disabled": true
                },
                {
                  "key": "type",
                  "value": "",
                  "description": "Only these types, comma-separated: sale, package, packageSale, caseSale, mixMatch, scheduledPrice. A percent sale is a sale (or package sale, case sale, scheduled price) whose mode is percent.",
                  "disabled": true
                },
                {
                  "key": "estimate",
                  "value": "true",
                  "description": "When true, returns EstimateResponse instead of the normal body and never reserves credits: the request is authenticated, authorized and field-resolved exactly like a real call, then priced by billing (base cost plus extra-field credits for the resolved fields) and returned without dispatching to the store. Free of charge.",
                  "disabled": true
                }
              ]
            },
            "description": "- **Price:** 1 credit, per page of 100 rows returned (the list price).\n- **Estimate:** add `estimate=true` for a free quote at your key's price.\n- **Capability:** `catalog-feed`.\n- **Paging:** send `nextCursor` back as `cursor` until it is empty.\n- **Reference:** https://api.compudime.com/docs/reference/promotions.list"
          },
          "response": []
        },
        {
          "name": "Get a mix and match group live",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/promotions/mix-match/:groupId",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "promotions",
                "mix-match",
                ":groupId"
              ],
              "query": [
                {
                  "key": "fields",
                  "value": "",
                  "description": "Comma-separated mix and match group fields to include (see x-compudime-field-catalog), or * for every field the key may see. Omitted: a flat-priced endpoint returns every field; once IT prices the endpoint by field count (includedFields in x-compudime-pricing), an omitted fields returns the standard set at the base price and each field beyond the included count adds extraFieldCost. An unknown or denied field is a free 400 field_not_allowed.",
                  "disabled": true
                },
                {
                  "key": "estimate",
                  "value": "true",
                  "description": "When true, returns EstimateResponse instead of the normal body and never reserves credits: the request is authenticated, authorized and field-resolved exactly like a real call, then priced by billing (base cost plus extra-field credits for the resolved fields) and returned without dispatching to the store. Free of charge.",
                  "disabled": true
                }
              ],
              "variable": [
                {
                  "key": "groupId",
                  "value": "",
                  "description": "The mix and match group id (mixMatch.groupId on a promotion), percent-encoded as ONE path segment: a / inside the id must be sent as %2F. 1-40 characters: a letter or digit, then letters, digits, spaces or . _ # & + @ / = -; anything else, and an unencoded /, is a free 400 before billing."
                }
              ]
            },
            "description": "- **Price:** 1 credit, per call (the list price).\n- **Estimate:** add `estimate=true` for a free quote at your key's price.\n- **Capability:** `catalog-feed`.\n- **Reference:** https://api.compudime.com/docs/reference/promotions.mixmatch.get"
          },
          "response": []
        }
      ]
    },
    {
      "name": "Inventory",
      "description": "Reference: https://api.compudime.com/docs/reference#family-inventory",
      "item": [
        {
          "name": "List on-hand quantities live",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/inventory/onhand",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "inventory",
                "onhand"
              ],
              "query": [
                {
                  "key": "fields",
                  "value": "",
                  "description": "Comma-separated inventory on-hand fields to include (see x-compudime-field-catalog), or * for every field the key may see. Omitted: a flat-priced endpoint returns every field; once IT prices the endpoint by field count (includedFields in x-compudime-pricing), an omitted fields returns the standard set at the base price and each field beyond the included count adds extraFieldCost. An unknown or denied field is a free 400 field_not_allowed.",
                  "disabled": true
                },
                {
                  "key": "codes",
                  "value": "",
                  "description": "Only these product codes: a comma-separated list of at most 200, each 1-40 letters, digits or dashes. Omitted: every product with an on-hand row. A key with a product-code row scope reads only codes inside it (codes outside it are dropped without a trace), and a key whose scope is not a plain code list must name codes.",
                  "disabled": true
                },
                {
                  "key": "location",
                  "value": "",
                  "description": "An inventory location name (1-20 letters, digits, spaces or . _ -). Omitted: the store totals, whose rows carry location \"\". A name the store does not have answers 404 location_not_found; a store that keeps no on-hand per location answers 422 locations_unsupported.",
                  "disabled": true
                },
                {
                  "key": "limit",
                  "value": "100",
                  "description": "How many rows to return: any whole number of 1 or more; default 100 (one page). The store is read 500 at a time, so a larger limit is read from the store in several reads, one after another, and answered at once. One answer carries at most 10,000 (a safeguard on the size of one answer, not a limit on the listing); a larger limit ends with nextCursor. There is no time limit on reading: an answer that needs several reads keeps reading until it holds limit rows (at most 10,000) or the listing ends. While it reads, the response is already open: its body starts with spaces (legal JSON whitespace, sent every few seconds so no proxy closes an idle connection), and X-Credits-Charged and X-Credits-Remaining are not response headers but HTTP trailers, which reach HTTP/2 clients (on api.compudime.com and compudime-public-api.fly.dev alike) and are dropped over HTTP/1.1. The billing block in the body always says what the call cost (totalCredits per unit times quantity); /v1/usage/current gives the balance. When this API or the store is busy with other long answers, an answer may end after its first read with nextCursor instead. A page can hold fewer rows than limit while nextCursor is set: keep following nextCursor until it is empty.",
                  "disabled": true
                },
                {
                  "key": "cursor",
                  "value": "",
                  "description": "nextCursor from the previous page, verbatim, with the same codes and location. Omit for the first page; an empty nextCursor means the last page.",
                  "disabled": true
                },
                {
                  "key": "estimate",
                  "value": "true",
                  "description": "When true, returns EstimateResponse instead of the normal body and never reserves credits: the request is authenticated, authorized and field-resolved exactly like a real call, then priced by billing (base cost plus extra-field credits for the resolved fields) and returned without dispatching to the store. Free of charge.",
                  "disabled": true
                }
              ]
            },
            "description": "- **Price:** 1 credit, per page of 100 rows returned (the list price).\n- **Estimate:** add `estimate=true` for a free quote at your key's price.\n- **Capability:** `sales-data`.\n- **Paging:** send `nextCursor` back as `cursor` until it is empty.\n- **Reference:** https://api.compudime.com/docs/reference/inventory.onhand.list"
          },
          "response": []
        }
      ]
    },
    {
      "name": "Sales",
      "description": "Reference: https://api.compudime.com/docs/reference#family-sales",
      "item": [
        {
          "name": "List daily register totals",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/sales/daily?from=&to=",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "sales",
                "daily"
              ],
              "query": [
                {
                  "key": "from",
                  "value": "",
                  "description": "Inclusive start business day (YYYY-MM-DD)."
                },
                {
                  "key": "to",
                  "value": "",
                  "description": "Inclusive end business day (YYYY-MM-DD). Must not be before from or after today (UTC). Any span: one row per business day the platform holds in the range (coveredFrom and coveredTo on the answer say which days)."
                },
                {
                  "key": "fields",
                  "value": "",
                  "description": "Comma-separated sales daily totals fields to include (see x-compudime-field-catalog), or * for every field the key may see. Omitted: a flat-priced endpoint returns every field; once IT prices the endpoint by field count (includedFields in x-compudime-pricing), an omitted fields returns the standard set at the base price and each field beyond the included count adds extraFieldCost. An unknown or denied field is a free 400 field_not_allowed.",
                  "disabled": true
                },
                {
                  "key": "estimate",
                  "value": "true",
                  "description": "When true, returns EstimateResponse instead of the normal body and never reserves credits: the request is authenticated, authorized and field-resolved exactly like a real call, then priced by billing (base cost plus extra-field credits for the resolved fields) and returned without dispatching to the store. Free of charge.",
                  "disabled": true
                }
              ]
            },
            "description": "- **Price:** 1 credit, per page of 100 rows returned (the list price).\n- **Estimate:** add `estimate=true` for a free quote at your key's price.\n- **Capability:** `customer-access`.\n- **Reference:** https://api.compudime.com/docs/reference/sales.daily.list"
          },
          "response": []
        },
        {
          "name": "List sales movement",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/sales/movement?from=&to=",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "sales",
                "movement"
              ],
              "query": [
                {
                  "key": "type",
                  "value": "register",
                  "description": "Movement universe: 'register' (till sales, default) or 'delivery' (order / on-account sales).",
                  "disabled": true
                },
                {
                  "key": "from",
                  "value": "",
                  "description": "Inclusive start business day (YYYY-MM-DD)."
                },
                {
                  "key": "to",
                  "value": "",
                  "description": "Inclusive end business day (YYYY-MM-DD), not before from. Any span: the rows come from what the platform holds (coveredFrom and coveredTo on the answer say which days)."
                },
                {
                  "key": "fields",
                  "value": "",
                  "description": "Comma-separated sales movement fields to include (see x-compudime-field-catalog), or * for every field the key may see. Omitted: a flat-priced endpoint returns every field; once IT prices the endpoint by field count (includedFields in x-compudime-pricing), an omitted fields returns the standard set at the base price and each field beyond the included count adds extraFieldCost. An unknown or denied field is a free 400 field_not_allowed.",
                  "disabled": true
                },
                {
                  "key": "cursor",
                  "value": "",
                  "description": "Cursor returned from the previous movement page.",
                  "disabled": true
                },
                {
                  "key": "limit",
                  "value": "100",
                  "description": "How many rows to return: any whole number of 1 or more; default 100 (one page). One answer carries at most 10,000 (a safeguard on the size of one answer, not a limit on the listing): a larger limit answers 10,000 and nextCursor. A page can hold fewer rows than limit while nextCursor is set: keep following nextCursor until it is empty.",
                  "disabled": true
                },
                {
                  "key": "estimate",
                  "value": "true",
                  "description": "When true, returns EstimateResponse instead of the normal body and never reserves credits: the request is authenticated, authorized and field-resolved exactly like a real call, then priced by billing (base cost plus extra-field credits for the resolved fields) and returned without dispatching to the store. Free of charge.",
                  "disabled": true
                }
              ]
            },
            "description": "- **Price:** 1 credit; 5 fields included, 1 more per extra field, per page of 100 rows returned (the list price).\n- **Estimate:** add `estimate=true` for a free quote at your key's price.\n- **Capability:** `sales-data`.\n- **Paging:** send `nextCursor` back as `cursor` until it is empty.\n- **Reference:** https://api.compudime.com/docs/reference/sales.movement.list"
          },
          "response": []
        },
        {
          "name": "Get the register Z reports of a business day live",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/sales/zreport?businessDay=",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "sales",
                "zreport"
              ],
              "query": [
                {
                  "key": "businessDay",
                  "value": "",
                  "description": "The business day (YYYY-MM-DD, the store's calendar). Required. A register log belongs to the business day the POS recorded on it, else the day it started, the grouping TisWin3's register log dashboard uses."
                },
                {
                  "key": "register",
                  "value": "",
                  "description": "Only the logs of this register: its code as the rows show it (register), 1-2 letters or digits. A one-digit code and the same digit with a leading 0 name the same register (1 and 01), as the register itself treats them.",
                  "disabled": true
                },
                {
                  "key": "fields",
                  "value": "",
                  "description": "Comma-separated register z report fields to include (see x-compudime-field-catalog), or * for every field the key may see. Omitted: a flat-priced endpoint returns every field; once IT prices the endpoint by field count (includedFields in x-compudime-pricing), an omitted fields returns the standard set at the base price and each field beyond the included count adds extraFieldCost. An unknown or denied field is a free 400 field_not_allowed.",
                  "disabled": true
                },
                {
                  "key": "estimate",
                  "value": "true",
                  "description": "When true, returns EstimateResponse instead of the normal body and never reserves credits: the request is authenticated, authorized and field-resolved exactly like a real call, then priced by billing (base cost plus extra-field credits for the resolved fields) and returned without dispatching to the store. Free of charge.",
                  "disabled": true
                }
              ]
            },
            "description": "- **Price:** 1 credit, per call (the list price).\n- **Estimate:** add `estimate=true` for a free quote at your key's price.\n- **Capability:** `sales-data`.\n- **Reference:** https://api.compudime.com/docs/reference/sales.zreport.get"
          },
          "response": []
        }
      ]
    },
    {
      "name": "Register tickets",
      "description": "Reference: https://api.compudime.com/docs/reference#family-tickets",
      "item": [
        {
          "name": "List the store's register tickets live",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/tickets?from=&to=",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "tickets"
              ],
              "query": [
                {
                  "key": "fields",
                  "value": "",
                  "description": "Comma-separated register tickets fields to include (see x-compudime-field-catalog), or * for every field the key may see. Omitted: a flat-priced endpoint returns every field; once IT prices the endpoint by field count (includedFields in x-compudime-pricing), an omitted fields returns the standard set at the base price and each field beyond the included count adds extraFieldCost. An unknown or denied field is a free 400 field_not_allowed.",
                  "disabled": true
                },
                {
                  "key": "from",
                  "value": "",
                  "description": "First business day to read (YYYY-MM-DD, the store's calendar), inclusive. Required. A ticket's business day is the day the POS assigned it (a ticket rung after midnight, before the register's close time, belongs to the day before), else its date."
                },
                {
                  "key": "to",
                  "value": "",
                  "description": "Last business day to read (YYYY-MM-DD), inclusive. Required; not before from. Any span. The store reads tickets 31 days at a time, so a longer range is read in 31-day stretches counted from from, in date order (the tickets of each stretch in ticket id order), one after another until the answer holds limit tickets or the range ends (there is no time limit on reading, PAPI-PAGE-007); a page can still end early while nextCursor is set, when this API or the store is busy with other long answers. Keep following nextCursor until it is empty."
                },
                {
                  "key": "register",
                  "value": "",
                  "description": "Only the tickets of this register: its code as the rows show it (register), 1-2 letters or digits. A one-digit code and the same digit with a leading 0 name the same register (1 and 01), as the register itself treats them.",
                  "disabled": true
                },
                {
                  "key": "type",
                  "value": "",
                  "description": "Ticket types to read: a comma-separated list of the TicketHD type letters S, O, V, T, R, G, H and A (either case), each at most once. Omitted: the sale types S and O. Only the two sale types are read unless type names others: S (a completed register sale) and O (a direct account charge or payment, which normally carries a sale of 0). The other types are not sales and must never be summed as revenue: V a voided sale (its sale total is still filled in), T calculate-only or a transfer whose value already landed on another ticket (it would double-count), R a transfer ticket not yet paid, G training mode, H a held sale and A a sale still being rung. Compare with type and sale on a row.",
                  "disabled": true
                },
                {
                  "key": "limit",
                  "value": "100",
                  "description": "How many tickets to return: any whole number of 1 or more; default 100 (one page). The store is read 200 at a time, so a larger limit is read from the store in several reads, one after another, and answered at once. One answer carries at most 10,000 (a safeguard on the size of one answer, not a limit on the listing); a larger limit ends with nextCursor. There is no time limit on reading: an answer that needs several reads keeps reading until it holds limit rows (at most 10,000) or the listing ends. While it reads, the response is already open: its body starts with spaces (legal JSON whitespace, sent every few seconds so no proxy closes an idle connection), and X-Credits-Charged and X-Credits-Remaining are not response headers but HTTP trailers, which reach HTTP/2 clients (on api.compudime.com and compudime-public-api.fly.dev alike) and are dropped over HTTP/1.1. The billing block in the body always says what the call cost (totalCredits per unit times quantity); /v1/usage/current gives the balance. When this API or the store is busy with other long answers, an answer may end after its first read with nextCursor instead. A page can hold fewer rows than limit while nextCursor is set: keep following nextCursor until it is empty.",
                  "disabled": true
                },
                {
                  "key": "cursor",
                  "value": "",
                  "description": "nextCursor from the previous page, verbatim, with the same from, to, register and type: a cursor continues only the listing it came from, and any other is a free 400. Omit for the first page; an empty nextCursor means the last page.",
                  "disabled": true
                },
                {
                  "key": "estimate",
                  "value": "true",
                  "description": "When true, returns EstimateResponse instead of the normal body and never reserves credits: the request is authenticated, authorized and field-resolved exactly like a real call, then priced by billing (base cost plus extra-field credits for the resolved fields) and returned without dispatching to the store. Free of charge.",
                  "disabled": true
                }
              ]
            },
            "description": "- **Price:** 1 credit, per page of 100 rows returned (the list price).\n- **Estimate:** add `estimate=true` for a free quote at your key's price.\n- **Capability:** `sales-data`.\n- **Paging:** send `nextCursor` back as `cursor` until it is empty.\n- **Reference:** https://api.compudime.com/docs/reference/tickets.list"
          },
          "response": []
        },
        {
          "name": "Get a register ticket live with its lines and tenders",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/tickets/:ticketId",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "tickets",
                ":ticketId"
              ],
              "query": [
                {
                  "key": "type",
                  "value": "",
                  "description": "Ticket types to read: a comma-separated list of the TicketHD type letters S, O, V, T, R, G, H and A (either case), each at most once. Omitted: the sale types S and O. Only the two sale types are read unless type names others: S (a completed register sale) and O (a direct account charge or payment, which normally carries a sale of 0). The other types are not sales and must never be summed as revenue: V a voided sale (its sale total is still filled in), T calculate-only or a transfer whose value already landed on another ticket (it would double-count), R a transfer ticket not yet paid, G training mode, H a held sale and A a sale still being rung. Compare with type and sale on a row.",
                  "disabled": true
                },
                {
                  "key": "fields",
                  "value": "",
                  "description": "Comma-separated register ticket detail fields to include (see x-compudime-field-catalog), or * for every field the key may see. Omitted: a flat-priced endpoint returns every field; once IT prices the endpoint by field count (includedFields in x-compudime-pricing), an omitted fields returns the standard set at the base price and each field beyond the included count adds extraFieldCost. An unknown or denied field is a free 400 field_not_allowed.",
                  "disabled": true
                },
                {
                  "key": "estimate",
                  "value": "true",
                  "description": "When true, returns EstimateResponse instead of the normal body and never reserves credits: the request is authenticated, authorized and field-resolved exactly like a real call, then priced by billing (base cost plus extra-field credits for the resolved fields) and returned without dispatching to the store. Free of charge.",
                  "disabled": true
                }
              ],
              "variable": [
                {
                  "key": "ticketId",
                  "value": "",
                  "description": "The POS ticket id (ticketId on any ticket row): 1-13 letters or digits. Anything else is a free 400 before billing."
                }
              ]
            },
            "description": "- **Price:** 1 credit, per call (the list price).\n- **Estimate:** add `estimate=true` for a free quote at your key's price.\n- **Capability:** `sales-data`.\n- **Reference:** https://api.compudime.com/docs/reference/tickets.get"
          },
          "response": []
        }
      ]
    },
    {
      "name": "Invoices",
      "description": "Reference: https://api.compudime.com/docs/reference#family-invoices",
      "item": [
        {
          "name": "List the store's POS invoices live",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/invoices",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "invoices"
              ],
              "query": [
                {
                  "key": "fields",
                  "value": "",
                  "description": "Comma-separated invoices fields to include (see x-compudime-field-catalog), or * for every field the key may see. Omitted: a flat-priced endpoint returns every field; once IT prices the endpoint by field count (includedFields in x-compudime-pricing), an omitted fields returns the standard set at the base price and each field beyond the included count adds extraFieldCost. An unknown or denied field is a free 400 field_not_allowed.",
                  "disabled": true
                },
                {
                  "key": "limit",
                  "value": "100",
                  "description": "How many invoices to return: any whole number of 1 or more; default 100 (one page). The store is read 200 at a time, so a larger limit is read from the store in several reads, one after another, and answered at once. One answer carries at most 10,000 (a safeguard on the size of one answer, not a limit on the listing); a larger limit ends with nextCursor. There is no time limit on reading: an answer that needs several reads keeps reading until it holds limit rows (at most 10,000) or the listing ends. While it reads, the response is already open: its body starts with spaces (legal JSON whitespace, sent every few seconds so no proxy closes an idle connection), and X-Credits-Charged and X-Credits-Remaining are not response headers but HTTP trailers, which reach HTTP/2 clients (on api.compudime.com and compudime-public-api.fly.dev alike) and are dropped over HTTP/1.1. The billing block in the body always says what the call cost (totalCredits per unit times quantity); /v1/usage/current gives the balance. When this API or the store is busy with other long answers, an answer may end after its first read with nextCursor instead. A page can hold fewer rows than limit while nextCursor is set: keep following nextCursor until it is empty.",
                  "disabled": true
                },
                {
                  "key": "cursor",
                  "value": "",
                  "description": "nextCursor from the previous page, verbatim, with the same filters. Omit for the first page; an empty nextCursor means the last page.",
                  "disabled": true
                },
                {
                  "key": "modifiedSince",
                  "value": "",
                  "description": "Only invoices modified at or after this RFC3339 timestamp (incremental sync; compare with modifiedAt). A store whose POS keeps no invoice modification time answers 422 modified_since_unsupported.",
                  "disabled": true
                },
                {
                  "key": "dueFrom",
                  "value": "",
                  "description": "Only invoices due on or after this day (YYYY-MM-DD, the store's calendar). Must not be after dueTo.",
                  "disabled": true
                },
                {
                  "key": "dueTo",
                  "value": "",
                  "description": "Only invoices due on or before this day (YYYY-MM-DD, inclusive: a due time of day on that day still counts).",
                  "disabled": true
                },
                {
                  "key": "status",
                  "value": "",
                  "description": "Only invoices with exactly this POS status, matched without regard to case (the POS writes Created, Picked, Completed and Processed; a store may use others). 1-25 letters, digits, spaces or . _ -",
                  "disabled": true
                },
                {
                  "key": "externalId",
                  "value": "",
                  "description": "Only invoices carrying exactly this external order id (the placing system's own id, as the POS stored it; the POS strips leading zeros). Stores below TisWin3 database version 1.324 keep no external id and answer 422 filter_unsupported.",
                  "disabled": true
                },
                {
                  "key": "processorCode",
                  "value": "",
                  "description": "Only invoices placed by this system, matched without regard to case; orders placed through POST /v1/orders carry CDAPI:<integration id>. The POS keeps only the first characters of each value (10 of the processor code and 25 of the external id on current TisWin3 databases); the store compares what you send the way the POS stored it, so the full values you sent at intake work. Stores below TisWin3 database version 1.324 answer 422 filter_unsupported.",
                  "disabled": true
                },
                {
                  "key": "estimate",
                  "value": "true",
                  "description": "When true, returns EstimateResponse instead of the normal body and never reserves credits: the request is authenticated, authorized and field-resolved exactly like a real call, then priced by billing (base cost plus extra-field credits for the resolved fields) and returned without dispatching to the store. Free of charge.",
                  "disabled": true
                }
              ]
            },
            "description": "- **Price:** 1 credit, per page of 100 rows returned (the list price).\n- **Estimate:** add `estimate=true` for a free quote at your key's price.\n- **Capability:** `sales-data`.\n- **Paging:** send `nextCursor` back as `cursor` until it is empty.\n- **Reference:** https://api.compudime.com/docs/reference/invoices.list"
          },
          "response": []
        },
        {
          "name": "Get an invoice live by the placing system's order id",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/invoices/external/:externalId?processorCode=",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "invoices",
                "external",
                ":externalId"
              ],
              "query": [
                {
                  "key": "processorCode",
                  "value": "",
                  "description": "Required. The code of the system that placed the order (processorCode on an invoice row), matched without regard to case; orders placed through POST /v1/orders carry CDAPI:<integration id>. 1-50 characters: a letter or digit, then letters, digits, spaces or . _ : # & + @ -. Missing or malformed is a free 400 before billing. The POS keeps only the first characters of each value (10 of the processor code and 25 of the external id on current TisWin3 databases); the store compares what you send the way the POS stored it, so the full values you sent at intake work."
                },
                {
                  "key": "fields",
                  "value": "",
                  "description": "Comma-separated invoice detail fields to include (see x-compudime-field-catalog), or * for every field the key may see. Omitted: a flat-priced endpoint returns every field; once IT prices the endpoint by field count (includedFields in x-compudime-pricing), an omitted fields returns the standard set at the base price and each field beyond the included count adds extraFieldCost. An unknown or denied field is a free 400 field_not_allowed.",
                  "disabled": true
                },
                {
                  "key": "estimate",
                  "value": "true",
                  "description": "When true, returns EstimateResponse instead of the normal body and never reserves credits: the request is authenticated, authorized and field-resolved exactly like a real call, then priced by billing (base cost plus extra-field credits for the resolved fields) and returned without dispatching to the store. Free of charge.",
                  "disabled": true
                }
              ],
              "variable": [
                {
                  "key": "externalId",
                  "value": "",
                  "description": "The placing system's own order id as the POS stored it (externalId on an invoice row), matched exactly, percent-encoded. Note the POS strips leading zeros from a feed's order id. 1-128 characters: a letter or digit, then letters, digits or . _ : # @ + -; anything else is a free 400 before billing. The POS keeps only the first characters of each value (10 of the processor code and 25 of the external id on current TisWin3 databases); the store compares what you send the way the POS stored it, so the full values you sent at intake work. When more than one invoice carries the pair as the POS keeps it (the POS does not enforce uniqueness), the read answers 409 invoice_ambiguous instead of choosing one."
                }
              ]
            },
            "description": "- **Price:** 1 credit, per call (the list price).\n- **Estimate:** add `estimate=true` for a free quote at your key's price.\n- **Capability:** `sales-data`.\n- **Reference:** https://api.compudime.com/docs/reference/invoices.get_by_external"
          },
          "response": []
        },
        {
          "name": "Get an invoice live by POS invoice id",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/invoices/:posInvoiceId",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "invoices",
                ":posInvoiceId"
              ],
              "query": [
                {
                  "key": "fields",
                  "value": "",
                  "description": "Comma-separated invoice detail fields to include (see x-compudime-field-catalog), or * for every field the key may see. Omitted: a flat-priced endpoint returns every field; once IT prices the endpoint by field count (includedFields in x-compudime-pricing), an omitted fields returns the standard set at the base price and each field beyond the included count adds extraFieldCost. An unknown or denied field is a free 400 field_not_allowed.",
                  "disabled": true
                },
                {
                  "key": "estimate",
                  "value": "true",
                  "description": "When true, returns EstimateResponse instead of the normal body and never reserves credits: the request is authenticated, authorized and field-resolved exactly like a real call, then priced by billing (base cost plus extra-field credits for the resolved fields) and returned without dispatching to the store. Free of charge.",
                  "disabled": true
                }
              ],
              "variable": [
                {
                  "key": "posInvoiceId",
                  "value": "",
                  "description": "The POS invoice id (invoiceId on any invoice row), percent-encoded as ONE path segment: a / inside the id must be sent as %2F. 1-40 characters: a letter or digit, then letters, digits, spaces or . _ # & + @ / = -; anything else, and an unencoded /, is a free 400 before billing. The id alone addresses the invoice (no customer id is needed or accepted). The literal id external is not addressable here (it is the lookup-by-feed-identity route)."
                }
              ]
            },
            "description": "- **Price:** 1 credit, per call (the list price).\n- **Estimate:** add `estimate=true` for a free quote at your key's price.\n- **Capability:** `sales-data`.\n- **Reference:** https://api.compudime.com/docs/reference/invoices.get"
          },
          "response": []
        }
      ]
    },
    {
      "name": "Delivery routes",
      "description": "Reference: https://api.compudime.com/docs/reference#family-delivery",
      "item": [
        {
          "name": "List the store's delivery routes live",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/delivery/routes",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "delivery",
                "routes"
              ],
              "query": [
                {
                  "key": "fields",
                  "value": "",
                  "description": "Comma-separated delivery routes fields to include (see x-compudime-field-catalog), or * for every field the key may see. Omitted: a flat-priced endpoint returns every field; once IT prices the endpoint by field count (includedFields in x-compudime-pricing), an omitted fields returns the standard set at the base price and each field beyond the included count adds extraFieldCost. An unknown or denied field is a free 400 field_not_allowed.",
                  "disabled": true
                },
                {
                  "key": "estimate",
                  "value": "true",
                  "description": "When true, returns EstimateResponse instead of the normal body and never reserves credits: the request is authenticated, authorized and field-resolved exactly like a real call, then priced by billing (base cost plus extra-field credits for the resolved fields) and returned without dispatching to the store. Free of charge.",
                  "disabled": true
                }
              ]
            },
            "description": "- **Price:** 1 credit, per call (the list price).\n- **Estimate:** add `estimate=true` for a free quote at your key's price.\n- **Capability:** `sales-data`.\n- **Reference:** https://api.compudime.com/docs/reference/delivery.routes.list"
          },
          "response": []
        }
      ]
    },
    {
      "name": "Purchasing and receiving",
      "description": "Reference: https://api.compudime.com/docs/reference#family-purchasing",
      "item": [
        {
          "name": "List the store's vendor purchase orders live",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/purchase-orders",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "purchase-orders"
              ],
              "query": [
                {
                  "key": "fields",
                  "value": "",
                  "description": "Comma-separated purchase orders fields to include (see x-compudime-field-catalog), or * for every field the key may see. Omitted: a flat-priced endpoint returns every field; once IT prices the endpoint by field count (includedFields in x-compudime-pricing), an omitted fields returns the standard set at the base price and each field beyond the included count adds extraFieldCost. An unknown or denied field is a free 400 field_not_allowed.",
                  "disabled": true
                },
                {
                  "key": "limit",
                  "value": "100",
                  "description": "How many purchase orders to return: any whole number of 1 or more; default 100 (one page). The store is read 200 at a time, so a larger limit is read from the store in several reads, one after another, and answered at once. One answer carries at most 10,000 (a safeguard on the size of one answer, not a limit on the listing); a larger limit ends with nextCursor. There is no time limit on reading: an answer that needs several reads keeps reading until it holds limit rows (at most 10,000) or the listing ends. While it reads, the response is already open: its body starts with spaces (legal JSON whitespace, sent every few seconds so no proxy closes an idle connection), and X-Credits-Charged and X-Credits-Remaining are not response headers but HTTP trailers, which reach HTTP/2 clients (on api.compudime.com and compudime-public-api.fly.dev alike) and are dropped over HTTP/1.1. The billing block in the body always says what the call cost (totalCredits per unit times quantity); /v1/usage/current gives the balance. When this API or the store is busy with other long answers, an answer may end after its first read with nextCursor instead. A page can hold fewer rows than limit while nextCursor is set: keep following nextCursor until it is empty.",
                  "disabled": true
                },
                {
                  "key": "cursor",
                  "value": "",
                  "description": "nextCursor from the previous page, verbatim, with the same filters. Omit for the first page; an empty nextCursor means the last page.",
                  "disabled": true
                },
                {
                  "key": "status",
                  "value": "open",
                  "description": "A status CLASS, never a stored POS status: open (the POS status is New, Open or Sent: still to be received), received (Complete: the order was imported into a receiving document), canceled (Canceled) or all (the same as omitting it). Compare with statusClass on a row. The POS has no partly-received status.",
                  "disabled": true
                },
                {
                  "key": "vendorId",
                  "value": "",
                  "description": "Only purchase orders of exactly this POS vendor id (vendorId on a row). 1-40 characters: a letter or digit, then letters, digits, spaces or . _ # & + @ / = -",
                  "disabled": true
                },
                {
                  "key": "dateFrom",
                  "value": "",
                  "description": "Only purchase orders dated on or after this day (YYYY-MM-DD, the store's calendar). Must not be after dateTo.",
                  "disabled": true
                },
                {
                  "key": "dateTo",
                  "value": "",
                  "description": "Only purchase orders dated on or before this day (YYYY-MM-DD, inclusive).",
                  "disabled": true
                },
                {
                  "key": "estimate",
                  "value": "true",
                  "description": "When true, returns EstimateResponse instead of the normal body and never reserves credits: the request is authenticated, authorized and field-resolved exactly like a real call, then priced by billing (base cost plus extra-field credits for the resolved fields) and returned without dispatching to the store. Free of charge.",
                  "disabled": true
                }
              ]
            },
            "description": "- **Price:** 1 credit, per page of 100 rows returned (the list price).\n- **Estimate:** add `estimate=true` for a free quote at your key's price.\n- **Capability:** `purchasing-data`.\n- **Paging:** send `nextCursor` back as `cursor` until it is empty.\n- **Reference:** https://api.compudime.com/docs/reference/purchaseorders.list"
          },
          "response": []
        },
        {
          "name": "Get a purchase order live by POS purchase order id",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/purchase-orders/:posPurchaseOrderId",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "purchase-orders",
                ":posPurchaseOrderId"
              ],
              "query": [
                {
                  "key": "fields",
                  "value": "",
                  "description": "Comma-separated purchase order detail fields to include (see x-compudime-field-catalog), or * for every field the key may see. Omitted: a flat-priced endpoint returns every field; once IT prices the endpoint by field count (includedFields in x-compudime-pricing), an omitted fields returns the standard set at the base price and each field beyond the included count adds extraFieldCost. An unknown or denied field is a free 400 field_not_allowed.",
                  "disabled": true
                },
                {
                  "key": "estimate",
                  "value": "true",
                  "description": "When true, returns EstimateResponse instead of the normal body and never reserves credits: the request is authenticated, authorized and field-resolved exactly like a real call, then priced by billing (base cost plus extra-field credits for the resolved fields) and returned without dispatching to the store. Free of charge.",
                  "disabled": true
                }
              ],
              "variable": [
                {
                  "key": "posPurchaseOrderId",
                  "value": "",
                  "description": "The POS purchase order id (purchaseOrderId on any purchase-order row, and on a receiving document that received one), percent-encoded as ONE path segment: a / inside the id must be sent as %2F. 1-40 characters: a letter or digit, then letters, digits, spaces or . _ # & + @ / = -; anything else, and an unencoded /, is a free 400 before billing."
                }
              ]
            },
            "description": "- **Price:** 1 credit, per call (the list price).\n- **Estimate:** add `estimate=true` for a free quote at your key's price.\n- **Capability:** `purchasing-data`.\n- **Reference:** https://api.compudime.com/docs/reference/purchaseorders.get"
          },
          "response": []
        },
        {
          "name": "List the store's receiving documents live",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/receiving",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "receiving"
              ],
              "query": [
                {
                  "key": "fields",
                  "value": "",
                  "description": "Comma-separated receiving fields to include (see x-compudime-field-catalog), or * for every field the key may see. Omitted: a flat-priced endpoint returns every field; once IT prices the endpoint by field count (includedFields in x-compudime-pricing), an omitted fields returns the standard set at the base price and each field beyond the included count adds extraFieldCost. An unknown or denied field is a free 400 field_not_allowed.",
                  "disabled": true
                },
                {
                  "key": "limit",
                  "value": "100",
                  "description": "How many receiving documents to return: any whole number of 1 or more; default 100 (one page). The store is read 200 at a time, so a larger limit is read from the store in several reads, one after another, and answered at once. One answer carries at most 10,000 (a safeguard on the size of one answer, not a limit on the listing); a larger limit ends with nextCursor. There is no time limit on reading: an answer that needs several reads keeps reading until it holds limit rows (at most 10,000) or the listing ends. While it reads, the response is already open: its body starts with spaces (legal JSON whitespace, sent every few seconds so no proxy closes an idle connection), and X-Credits-Charged and X-Credits-Remaining are not response headers but HTTP trailers, which reach HTTP/2 clients (on api.compudime.com and compudime-public-api.fly.dev alike) and are dropped over HTTP/1.1. The billing block in the body always says what the call cost (totalCredits per unit times quantity); /v1/usage/current gives the balance. When this API or the store is busy with other long answers, an answer may end after its first read with nextCursor instead. A page can hold fewer rows than limit while nextCursor is set: keep following nextCursor until it is empty.",
                  "disabled": true
                },
                {
                  "key": "cursor",
                  "value": "",
                  "description": "nextCursor from the previous page, verbatim, with the same filters. Omit for the first page; an empty nextCursor means the last page.",
                  "disabled": true
                },
                {
                  "key": "modifiedSince",
                  "value": "",
                  "description": "Only receiving documents modified at or after this RFC3339 timestamp (incremental sync; compare with modifiedAt). A store whose POS keeps no modification time on them answers 422 modified_since_unsupported.",
                  "disabled": true
                },
                {
                  "key": "dateFrom",
                  "value": "",
                  "description": "Only receiving documents dated on or after this day (YYYY-MM-DD, the store's calendar). Must not be after dateTo.",
                  "disabled": true
                },
                {
                  "key": "dateTo",
                  "value": "",
                  "description": "Only receiving documents dated on or before this day (YYYY-MM-DD, inclusive).",
                  "disabled": true
                },
                {
                  "key": "vendorId",
                  "value": "",
                  "description": "Only receiving documents of exactly this POS vendor id (vendorId on a row). 1-40 characters: a letter or digit, then letters, digits, spaces or . _ # & + @ / = -",
                  "disabled": true
                },
                {
                  "key": "purchaseOrderId",
                  "value": "",
                  "description": "Only the receiving documents that received exactly this purchase order (purchaseOrderId on a purchase-order row). A store whose POS keeps no purchase order on a receiving document answers 422 filter_unsupported.",
                  "disabled": true
                },
                {
                  "key": "estimate",
                  "value": "true",
                  "description": "When true, returns EstimateResponse instead of the normal body and never reserves credits: the request is authenticated, authorized and field-resolved exactly like a real call, then priced by billing (base cost plus extra-field credits for the resolved fields) and returned without dispatching to the store. Free of charge.",
                  "disabled": true
                }
              ]
            },
            "description": "- **Price:** 1 credit, per page of 100 rows returned (the list price).\n- **Estimate:** add `estimate=true` for a free quote at your key's price.\n- **Capability:** `purchasing-data`.\n- **Paging:** send `nextCursor` back as `cursor` until it is empty.\n- **Reference:** https://api.compudime.com/docs/reference/receiving.list"
          },
          "response": []
        },
        {
          "name": "Get a receiving document live by POS receiving id",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/receiving/:posReceivingId",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "receiving",
                ":posReceivingId"
              ],
              "query": [
                {
                  "key": "fields",
                  "value": "",
                  "description": "Comma-separated receiving detail fields to include (see x-compudime-field-catalog), or * for every field the key may see. Omitted: a flat-priced endpoint returns every field; once IT prices the endpoint by field count (includedFields in x-compudime-pricing), an omitted fields returns the standard set at the base price and each field beyond the included count adds extraFieldCost. An unknown or denied field is a free 400 field_not_allowed.",
                  "disabled": true
                },
                {
                  "key": "estimate",
                  "value": "true",
                  "description": "When true, returns EstimateResponse instead of the normal body and never reserves credits: the request is authenticated, authorized and field-resolved exactly like a real call, then priced by billing (base cost plus extra-field credits for the resolved fields) and returned without dispatching to the store. Free of charge.",
                  "disabled": true
                }
              ],
              "variable": [
                {
                  "key": "posReceivingId",
                  "value": "",
                  "description": "The POS receiving id (receivingId on any receiving row), percent-encoded as ONE path segment: a / inside the id must be sent as %2F. 1-40 characters: a letter or digit, then letters, digits, spaces or . _ # & + @ / = -; anything else, and an unencoded /, is a free 400 before billing."
                }
              ]
            },
            "description": "- **Price:** 1 credit, per call (the list price).\n- **Estimate:** add `estimate=true` for a free quote at your key's price.\n- **Capability:** `purchasing-data`.\n- **Reference:** https://api.compudime.com/docs/reference/receiving.get"
          },
          "response": []
        }
      ]
    },
    {
      "name": "Accounting export",
      "description": "Reference: https://api.compudime.com/docs/reference#family-accounting",
      "item": [
        {
          "name": "List mapped journal entries by store-day live",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/accounting/journal-entries?from=&to=",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "accounting",
                "journal-entries"
              ],
              "query": [
                {
                  "key": "fields",
                  "value": "",
                  "description": "Comma-separated accounting journal entries fields to include (see x-compudime-field-catalog), or * for every field the key may see. Omitted: a flat-priced endpoint returns every field; once IT prices the endpoint by field count (includedFields in x-compudime-pricing), an omitted fields returns the standard set at the base price and each field beyond the included count adds extraFieldCost. An unknown or denied field is a free 400 field_not_allowed.",
                  "disabled": true
                },
                {
                  "key": "from",
                  "value": "",
                  "description": "First business day (YYYY-MM-DD, the store's calendar), inclusive. Required. A register log belongs to the business day the POS recorded on it, else the day it started (a log that closes after midnight belongs to the day it started)."
                },
                {
                  "key": "to",
                  "value": "",
                  "description": "Last business day (YYYY-MM-DD), inclusive. Required; not before from and not after today. There is no limit on the span."
                },
                {
                  "key": "limit",
                  "value": "100",
                  "description": "How many store-days to return: any whole number of 1 or more; default 100 (one page). The store is read up to a quarter at a time, so a longer range is read in several reads, one after another, and answered at once. One answer carries at most 10,000 store-days (a safeguard on the size of one answer, not a limit on the range); a longer range ends with nextCursor. There is no time limit on reading: an answer that needs several reads keeps reading until it holds limit rows (at most 10,000) or the listing ends. While it reads, the response is already open: its body starts with spaces (legal JSON whitespace, sent every few seconds so no proxy closes an idle connection), and X-Credits-Charged and X-Credits-Remaining are not response headers but HTTP trailers, which reach HTTP/2 clients (on api.compudime.com and compudime-public-api.fly.dev alike) and are dropped over HTTP/1.1. The billing block in the body always says what the call cost (totalCredits per unit times quantity); /v1/usage/current gives the balance. When this API or the store is busy with other long answers, an answer may end after its first read with nextCursor instead. With format=csv the answer is written whole once read (no leading spaces, no trailers; X-Next-Cursor names the cursor). A page can hold fewer rows than limit while nextCursor is set: keep following nextCursor until it is empty. Priced by the pages of 100 store-days returned once the endpoint's meter is priced by the page.",
                  "disabled": true
                },
                {
                  "key": "cursor",
                  "value": "",
                  "description": "nextCursor from the previous answer, verbatim, with the same from and to. Omit for the first page; an empty nextCursor means the range is done.",
                  "disabled": true
                },
                {
                  "key": "format",
                  "value": "json",
                  "description": "json (default) or csv. The CSV is one row per journal line with the entry's header on every row (UTF-8 without a byte order mark, RFC 4180 quoting, CRLF line ends); fields does not apply to it; its billing is in the X-Credits-* headers and its next page's cursor in X-Next-Cursor.",
                  "disabled": true
                },
                {
                  "key": "maxAdjustment",
                  "value": "1",
                  "description": "The largest rounding difference, in dollars, a ready entry may post to Sales/Adjustment. Default 1.00; 0 to 100.00, at most two decimals.",
                  "disabled": true
                },
                {
                  "key": "estimate",
                  "value": "true",
                  "description": "When true, returns EstimateResponse instead of the normal body and never reserves credits: the request is authenticated, authorized and field-resolved exactly like a real call, then priced by billing (base cost plus extra-field credits for the resolved fields) and returned without dispatching to the store. Free of charge.",
                  "disabled": true
                }
              ]
            },
            "description": "- **Price:** 1 credit, per page of 100 rows returned (the list price).\n- **Estimate:** add `estimate=true` for a free quote at your key's price.\n- **Capability:** `accounting-data`.\n- **Paging:** send `nextCursor` back as `cursor` until it is empty.\n- **Reference:** https://api.compudime.com/docs/reference/accounting.journal.list"
          },
          "response": []
        },
        {
          "name": "Get the store's account mapping keys live",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/accounting/mapping",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "accounting",
                "mapping"
              ],
              "query": [
                {
                  "key": "fields",
                  "value": "",
                  "description": "Comma-separated accounting mapping fields to include (see x-compudime-field-catalog), or * for every field the key may see. Omitted: a flat-priced endpoint returns every field; once IT prices the endpoint by field count (includedFields in x-compudime-pricing), an omitted fields returns the standard set at the base price and each field beyond the included count adds extraFieldCost. An unknown or denied field is a free 400 field_not_allowed.",
                  "disabled": true
                },
                {
                  "key": "estimate",
                  "value": "true",
                  "description": "When true, returns EstimateResponse instead of the normal body and never reserves credits: the request is authenticated, authorized and field-resolved exactly like a real call, then priced by billing (base cost plus extra-field credits for the resolved fields) and returned without dispatching to the store. Free of charge.",
                  "disabled": true
                }
              ]
            },
            "description": "- **Price:** 1 credit, per call (the list price).\n- **Estimate:** add `estimate=true` for a free quote at your key's price.\n- **Capability:** `accounting-data`.\n- **Reference:** https://api.compudime.com/docs/reference/accounting.mapping.get"
          },
          "response": []
        },
        {
          "name": "List register-log sales summaries by store-day live",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/accounting/sales-summaries?from=&to=",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "accounting",
                "sales-summaries"
              ],
              "query": [
                {
                  "key": "fields",
                  "value": "",
                  "description": "Comma-separated accounting sales summaries fields to include (see x-compudime-field-catalog), or * for every field the key may see. Omitted: a flat-priced endpoint returns every field; once IT prices the endpoint by field count (includedFields in x-compudime-pricing), an omitted fields returns the standard set at the base price and each field beyond the included count adds extraFieldCost. An unknown or denied field is a free 400 field_not_allowed.",
                  "disabled": true
                },
                {
                  "key": "from",
                  "value": "",
                  "description": "First business day (YYYY-MM-DD, the store's calendar), inclusive. Required. A register log belongs to the business day the POS recorded on it, else the day it started (a log that closes after midnight belongs to the day it started)."
                },
                {
                  "key": "to",
                  "value": "",
                  "description": "Last business day (YYYY-MM-DD), inclusive. Required; not before from and not after today. There is no limit on the span."
                },
                {
                  "key": "limit",
                  "value": "100",
                  "description": "How many store-days to return: any whole number of 1 or more; default 100 (one page). The store is read up to a quarter at a time, so a longer range is read in several reads, one after another, and answered at once. One answer carries at most 10,000 store-days (a safeguard on the size of one answer, not a limit on the range); a longer range ends with nextCursor. There is no time limit on reading: an answer that needs several reads keeps reading until it holds limit rows (at most 10,000) or the listing ends. While it reads, the response is already open: its body starts with spaces (legal JSON whitespace, sent every few seconds so no proxy closes an idle connection), and X-Credits-Charged and X-Credits-Remaining are not response headers but HTTP trailers, which reach HTTP/2 clients (on api.compudime.com and compudime-public-api.fly.dev alike) and are dropped over HTTP/1.1. The billing block in the body always says what the call cost (totalCredits per unit times quantity); /v1/usage/current gives the balance. When this API or the store is busy with other long answers, an answer may end after its first read with nextCursor instead. With format=csv the answer is written whole once read (no leading spaces, no trailers; X-Next-Cursor names the cursor). A page can hold fewer rows than limit while nextCursor is set: keep following nextCursor until it is empty. Priced by the pages of 100 store-days returned once the endpoint's meter is priced by the page.",
                  "disabled": true
                },
                {
                  "key": "cursor",
                  "value": "",
                  "description": "nextCursor from the previous answer, verbatim, with the same from and to. Omit for the first page; an empty nextCursor means the range is done.",
                  "disabled": true
                },
                {
                  "key": "estimate",
                  "value": "true",
                  "description": "When true, returns EstimateResponse instead of the normal body and never reserves credits: the request is authenticated, authorized and field-resolved exactly like a real call, then priced by billing (base cost plus extra-field credits for the resolved fields) and returned without dispatching to the store. Free of charge.",
                  "disabled": true
                }
              ]
            },
            "description": "- **Price:** 1 credit, per page of 100 rows returned (the list price).\n- **Estimate:** add `estimate=true` for a free quote at your key's price.\n- **Capability:** `accounting-data`.\n- **Paging:** send `nextCursor` back as `cursor` until it is empty.\n- **Reference:** https://api.compudime.com/docs/reference/accounting.summaries.list"
          },
          "response": []
        }
      ]
    },
    {
      "name": "Customers",
      "description": "Reference: https://api.compudime.com/docs/reference#family-customers",
      "item": [
        {
          "name": "List the store's customers live",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/customers",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "customers"
              ],
              "query": [
                {
                  "key": "fields",
                  "value": "",
                  "description": "Comma-separated customers fields to include (see x-compudime-field-catalog), or * for every field the key may see. Omitted: a flat-priced endpoint returns every field; once IT prices the endpoint by field count (includedFields in x-compudime-pricing), an omitted fields returns the standard set at the base price and each field beyond the included count adds extraFieldCost. An unknown or denied field is a free 400 field_not_allowed.",
                  "disabled": true
                },
                {
                  "key": "limit",
                  "value": "100",
                  "description": "How many customers to return: any whole number of 1 or more; default 100 (one page). The store is read 200 at a time, so a larger limit is read from the store in several reads, one after another, and answered at once. One answer carries at most 10,000 (a safeguard on the size of one answer, not a limit on the listing); a larger limit ends with nextCursor. There is no time limit on reading: an answer that needs several reads keeps reading until it holds limit rows (at most 10,000) or the listing ends. While it reads, the response is already open: its body starts with spaces (legal JSON whitespace, sent every few seconds so no proxy closes an idle connection), and X-Credits-Charged and X-Credits-Remaining are not response headers but HTTP trailers, which reach HTTP/2 clients (on api.compudime.com and compudime-public-api.fly.dev alike) and are dropped over HTTP/1.1. The billing block in the body always says what the call cost (totalCredits per unit times quantity); /v1/usage/current gives the balance. When this API or the store is busy with other long answers, an answer may end after its first read with nextCursor instead. A page can hold fewer rows than limit while nextCursor is set: keep following nextCursor until it is empty. At access level own a page holds at most 25 customers whatever limit asks (x-compudime-access-level).",
                  "disabled": true
                },
                {
                  "key": "cursor",
                  "value": "",
                  "description": "nextCursor from the previous page, verbatim. Omit for the first page; an empty nextCursor means the last page.",
                  "disabled": true
                },
                {
                  "key": "modifiedSince",
                  "value": "",
                  "description": "Only customers modified at or after this RFC3339 timestamp (incremental sync; compare with modifiedAt). A store whose POS keeps no customer modification time answers 422 modified_since_unsupported.",
                  "disabled": true
                },
                {
                  "key": "estimate",
                  "value": "true",
                  "description": "When true, returns EstimateResponse instead of the normal body and never reserves credits: the request is authenticated, authorized and field-resolved exactly like a real call, then priced by billing (base cost plus extra-field credits for the resolved fields) and returned without dispatching to the store. Free of charge.",
                  "disabled": true
                }
              ]
            },
            "description": "- **Price:** 1 credit, per page of 100 rows returned (the list price).\n- **Estimate:** add `estimate=true` for a free quote at your key's price.\n- **Capability:** `customer-access`.\n- **Paging:** send `nextCursor` back as `cursor` until it is empty.\n- **Reference:** https://api.compudime.com/docs/reference/customers.list"
          },
          "response": []
        },
        {
          "name": "Look up POS customers by phone",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/customers/lookup?phone=",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "customers",
                "lookup"
              ],
              "query": [
                {
                  "key": "phone",
                  "value": "",
                  "description": "10-digit US phone number; formatting characters and a leading +1 are accepted."
                },
                {
                  "key": "fields",
                  "value": "",
                  "description": "Comma-separated customers fields to include (see x-compudime-field-catalog), or * for every field the key may see. Omitted: a flat-priced endpoint returns every field; once IT prices the endpoint by field count (includedFields in x-compudime-pricing), an omitted fields returns the standard set at the base price and each field beyond the included count adds extraFieldCost. An unknown or denied field is a free 400 field_not_allowed.",
                  "disabled": true
                },
                {
                  "key": "estimate",
                  "value": "true",
                  "description": "When true, returns EstimateResponse instead of the normal body and never reserves credits: the request is authenticated, authorized and field-resolved exactly like a real call, then priced by billing (base cost plus extra-field credits for the resolved fields) and returned without dispatching to the store. Free of charge.",
                  "disabled": true
                }
              ]
            },
            "description": "- **Price:** 1 credit, per call (the list price).\n- **Estimate:** add `estimate=true` for a free quote at your key's price.\n- **Capability:** `customer-access`.\n- **Reference:** https://api.compudime.com/docs/reference/customers.lookup"
          },
          "response": []
        },
        {
          "name": "Get a customer live by POS customer id",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/customers/:posCustomerId",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "customers",
                ":posCustomerId"
              ],
              "query": [
                {
                  "key": "fields",
                  "value": "",
                  "description": "Comma-separated customers fields to include (see x-compudime-field-catalog), or * for every field the key may see. Omitted: a flat-priced endpoint returns every field; once IT prices the endpoint by field count (includedFields in x-compudime-pricing), an omitted fields returns the standard set at the base price and each field beyond the included count adds extraFieldCost. An unknown or denied field is a free 400 field_not_allowed.",
                  "disabled": true
                },
                {
                  "key": "estimate",
                  "value": "true",
                  "description": "When true, returns EstimateResponse instead of the normal body and never reserves credits: the request is authenticated, authorized and field-resolved exactly like a real call, then priced by billing (base cost plus extra-field credits for the resolved fields) and returned without dispatching to the store. Free of charge.",
                  "disabled": true
                }
              ],
              "variable": [
                {
                  "key": "posCustomerId",
                  "value": "",
                  "description": "The POS customer id (posCustomerId on any customer row), percent-encoded. 1-40 characters: a letter or digit, then letters, digits, spaces or . _ # & + @ -; anything else is a free 400 before billing. The literal id lookup is not addressable here (it is the phone lookup route)."
                }
              ]
            },
            "description": "- **Price:** 1 credit, per call (the list price).\n- **Estimate:** add `estimate=true` for a free quote at your key's price.\n- **Capability:** `customer-access`.\n- **Reference:** https://api.compudime.com/docs/reference/customers.get"
          },
          "response": []
        }
      ]
    },
    {
      "name": "Tenders",
      "description": "Reference: https://api.compudime.com/docs/reference#family-tenders",
      "item": [
        {
          "name": "List the register's tender types",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/tenders",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "tenders"
              ],
              "query": [
                {
                  "key": "fields",
                  "value": "",
                  "description": "Comma-separated tenders fields to include (see x-compudime-field-catalog), or * for every field the key may see. Omitted: a flat-priced endpoint returns every field; once IT prices the endpoint by field count (includedFields in x-compudime-pricing), an omitted fields returns the standard set at the base price and each field beyond the included count adds extraFieldCost. An unknown or denied field is a free 400 field_not_allowed.",
                  "disabled": true
                },
                {
                  "key": "estimate",
                  "value": "true",
                  "description": "When true, returns EstimateResponse instead of the normal body and never reserves credits: the request is authenticated, authorized and field-resolved exactly like a real call, then priced by billing (base cost plus extra-field credits for the resolved fields) and returned without dispatching to the store. Free of charge.",
                  "disabled": true
                }
              ]
            },
            "description": "- **Price:** 1 credit, per call (the list price).\n- **Estimate:** add `estimate=true` for a free quote at your key's price.\n- **Capability:** `customer-access`.\n- **Reference:** https://api.compudime.com/docs/reference/tenders.list"
          },
          "response": []
        }
      ]
    },
    {
      "name": "Orders",
      "description": "Reference: https://api.compudime.com/docs/reference#family-orders",
      "item": [
        {
          "name": "Create order intake request",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "type": "text",
                "description": "Safe caller-generated identifier used to prevent duplicate order intake and duplicate billing on retries."
              },
              {
                "key": "Content-Type",
                "value": "application/json",
                "type": "text"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"externalOrderId\": \"web-1001\",\n  \"customer\": \"Pickup customer\",\n  \"notes\": \"Paid online\",\n  \"orderMethod\": \"pickup\",\n  \"lines\": [\n    {\n      \"productCode\": \"SKU-100\",\n      \"quantity\": 2,\n      \"unitPrice\": \"3.99\"\n    }\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/v1/orders",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "orders"
              ]
            },
            "description": "Sends an order into the store's POS. A live key's order is answered 202 once it is accepted into the queue (dispatchState pending_pos_adapter); it then reads dispatched when it landed in the POS, or parked when it could not. A test key's order (a key that starts with cc_test_ or cd_test_) is validated exactly like a live key's and answered with the same 202 and body, but it is simulated and never reaches the store: its orderId starts with test_, its dispatchState is simulated (final: it never changes), the billing block says mode test, and no webhook is sent for it. The checks only the store itself makes (each productCode looked up in its POS, the price it charges, the store agent's support for shipTo and for lines without a unitPrice) are not run for a test order. Sending the same Idempotency-Key or externalOrderId again returns the same simulated order. A test key reads only its integration's simulated orders and a live key only its live ones: an order of the other mode is 404 order_not_found.\n\n- **Price:** 16 credits, per call (the list price).\n- **Capability:** `order-intake`.\n- **Reference:** https://api.compudime.com/docs/reference/orders.create"
          },
          "response": []
        },
        {
          "name": "Get order intake status by external order id",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/orders/external/:externalOrderId",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "orders",
                "external",
                ":externalOrderId"
              ],
              "query": [
                {
                  "key": "fields",
                  "value": "",
                  "description": "Comma-separated orders fields to include (see x-compudime-field-catalog), or * for every field the key may see. Omitted: a flat-priced endpoint returns every field; once IT prices the endpoint by field count (includedFields in x-compudime-pricing), an omitted fields returns the standard set at the base price and each field beyond the included count adds extraFieldCost. An unknown or denied field is a free 400 field_not_allowed.",
                  "disabled": true
                },
                {
                  "key": "estimate",
                  "value": "true",
                  "description": "When true, returns EstimateResponse instead of the normal body and never reserves credits: the request is authenticated, authorized and field-resolved exactly like a real call, then priced by billing (base cost plus extra-field credits for the resolved fields) and returned without dispatching to the store. Free of charge.",
                  "disabled": true
                }
              ],
              "variable": [
                {
                  "key": "externalOrderId",
                  "value": "",
                  "description": "The externalOrderId the order was created with, exactly as sent on POST /v1/orders. 1-128 characters: a letter or digit, then letters, digits, dots, underscores or dashes (the Idempotency-Key shape); anything else is a free 400 before billing. The lookup is scoped to the calling integration. An order whose externalOrderId is outside this shape is readable by orderId only."
                }
              ]
            },
            "description": "Where an order your integration sent stands. A test key reads only its integration's simulated orders and a live key only its live ones: an order of the other mode is 404 order_not_found.\n\n- **Price:** 1 credit, per call (the list price).\n- **Estimate:** add `estimate=true` for a free quote at your key's price.\n- **Capability:** `order-intake`.\n- **Reference:** https://api.compudime.com/docs/reference/orders.get_by_external"
          },
          "response": []
        },
        {
          "name": "Get order intake status",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/orders/:orderId",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "orders",
                ":orderId"
              ],
              "query": [
                {
                  "key": "fields",
                  "value": "",
                  "description": "Comma-separated orders fields to include (see x-compudime-field-catalog), or * for every field the key may see. Omitted: a flat-priced endpoint returns every field; once IT prices the endpoint by field count (includedFields in x-compudime-pricing), an omitted fields returns the standard set at the base price and each field beyond the included count adds extraFieldCost. An unknown or denied field is a free 400 field_not_allowed.",
                  "disabled": true
                },
                {
                  "key": "estimate",
                  "value": "true",
                  "description": "When true, returns EstimateResponse instead of the normal body and never reserves credits: the request is authenticated, authorized and field-resolved exactly like a real call, then priced by billing (base cost plus extra-field credits for the resolved fields) and returned without dispatching to the store. Free of charge.",
                  "disabled": true
                }
              ],
              "variable": [
                {
                  "key": "orderId",
                  "value": "",
                  "description": "The orderId returned by POST /v1/orders."
                }
              ]
            },
            "description": "Where an order your integration sent stands. A test key reads only its integration's simulated orders and a live key only its live ones: an order of the other mode is 404 order_not_found.\n\n- **Price:** 1 credit, per call (the list price).\n- **Estimate:** add `estimate=true` for a free quote at your key's price.\n- **Capability:** `order-intake`.\n- **Reference:** https://api.compudime.com/docs/reference/orders.get"
          },
          "response": []
        }
      ]
    },
    {
      "name": "Webhook receivers",
      "description": "Reference: https://api.compudime.com/docs/reference#family-webhooks",
      "item": [
        {
          "name": "List your webhook receivers",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/webhooks",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "webhooks"
              ]
            },
            "description": "Your integration's receivers for the calling key's mode, oldest first, each with its latest delivery. Never a secret: secretPrefix is its first characters, enough to tell secrets apart. Free, and needs only a valid key (a key without order intake has none). Receivers belong to the calling key's integration and mode. A live key's receivers get the order events they subscribe to; a test key's receivers get only the test events you send them, because a test key's orders are simulated and never send a webhook. A test key never sees a live receiver and a live key never sees a test one. Receivers CompuDime staff registered for your integration are live receivers.\n\n- **Price:** free.\n- **Reference:** https://api.compudime.com/docs/reference/webhooks.list"
          },
          "response": [
            {
              "name": "200 OK",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/webhooks",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "webhooks"
                  ]
                },
                "description": "Your integration's receivers for the calling key's mode, oldest first, each with its latest delivery. Never a secret: secretPrefix is its first characters, enough to tell secrets apart. Free, and needs only a valid key (a key without order intake has none). Receivers belong to the calling key's integration and mode. A live key's receivers get the order events they subscribe to; a test key's receivers get only the test events you send them, because a test key's orders are simulated and never send a webhook. A test key never sees a live receiver and a live key never sees a test one. Receivers CompuDime staff registered for your integration are live receivers.\n\n- **Price:** free.\n- **Reference:** https://api.compudime.com/docs/reference/webhooks.list"
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json; charset=utf-8",
                  "type": "text"
                }
              ],
              "cookie": [],
              "body": "{\n  \"requestId\": \"req_0123456789abcdef\",\n  \"webhooks\": [\n    {\n      \"id\": \"7b0c9a1e-3f52-4c1d-9a7e-2d4f6b8c0e13\",\n      \"url\": \"https://hooks.example.com/compudime/orders\",\n      \"events\": [\n        \"order.dispatched\",\n        \"order.parked\"\n      ],\n      \"active\": true,\n      \"mode\": \"live\",\n      \"secretPrefix\": \"whsec_3f9a1c\",\n      \"createdAt\": \"2026-10-13T15:00:00Z\",\n      \"updatedAt\": \"2026-10-13T15:00:00Z\",\n      \"lastDelivery\": {\n        \"id\": \"c2e8f4a0-6b1d-4e3f-8a9c-0d2e4f6a8b1c\",\n        \"event\": \"webhook.test\",\n        \"state\": \"delivered\",\n        \"attempts\": 1,\n        \"lastStatus\": 204,\n        \"createdAt\": \"2026-10-13T15:01:00Z\",\n        \"updatedAt\": \"2026-10-13T15:01:21Z\",\n        \"deliveredAt\": \"2026-10-13T15:01:21Z\"\n      }\n    }\n  ],\n  \"limit\": 5\n}"
            }
          ]
        },
        {
          "name": "Register a webhook receiver",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json",
                "type": "text"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"url\": \"https://hooks.example.com/compudime/orders\",\n  \"events\": [\n    \"order.dispatched\",\n    \"order.parked\"\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/v1/webhooks",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "webhooks"
              ]
            },
            "description": "Registers an HTTPS receiver for the order events of your integration and answers 201 with it and its signing secret. This signing secret is shown once, in this answer, and never again: store it now, like a password. If you lose it, rotate it (POST /v1/webhooks/{webhookId}/rotate-secret). url must start with https://, reach a public address (private, loopback, link-local and other reserved addresses are refused as typed, and again when CompuDime connects), carry no user name or password, and be at most 2048 characters long. events names at least one order event (see the top-level webhooks); webhook.test is not one, every receiver gets the test events you send it. Your integration may keep at most 5 receivers per key mode (409 webhook_limit_reached), and a URL it already has is 409 webhook_exists naming that receiver, so retrying after a lost answer never registers twice. Needs a key with the order-intake capability. Free. Receivers belong to the calling key's integration and mode. A live key's receivers get the order events they subscribe to; a test key's receivers get only the test events you send them, because a test key's orders are simulated and never send a webhook. A test key never sees a live receiver and a live key never sees a test one. Receivers CompuDime staff registered for your integration are live receivers.\n\n- **Price:** free.\n- **Capability:** `order-intake`.\n- **Reference:** https://api.compudime.com/docs/reference/webhooks.create"
          },
          "response": [
            {
              "name": "201 Created",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"url\": \"https://hooks.example.com/compudime/orders\",\n  \"events\": [\n    \"order.dispatched\",\n    \"order.parked\"\n  ]\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/v1/webhooks",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "webhooks"
                  ]
                },
                "description": "Registers an HTTPS receiver for the order events of your integration and answers 201 with it and its signing secret. This signing secret is shown once, in this answer, and never again: store it now, like a password. If you lose it, rotate it (POST /v1/webhooks/{webhookId}/rotate-secret). url must start with https://, reach a public address (private, loopback, link-local and other reserved addresses are refused as typed, and again when CompuDime connects), carry no user name or password, and be at most 2048 characters long. events names at least one order event (see the top-level webhooks); webhook.test is not one, every receiver gets the test events you send it. Your integration may keep at most 5 receivers per key mode (409 webhook_limit_reached), and a URL it already has is 409 webhook_exists naming that receiver, so retrying after a lost answer never registers twice. Needs a key with the order-intake capability. Free. Receivers belong to the calling key's integration and mode. A live key's receivers get the order events they subscribe to; a test key's receivers get only the test events you send them, because a test key's orders are simulated and never send a webhook. A test key never sees a live receiver and a live key never sees a test one. Receivers CompuDime staff registered for your integration are live receivers.\n\n- **Price:** free.\n- **Capability:** `order-intake`.\n- **Reference:** https://api.compudime.com/docs/reference/webhooks.create"
              },
              "status": "Created",
              "code": 201,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json; charset=utf-8",
                  "type": "text"
                }
              ],
              "cookie": [],
              "body": "{\n  \"requestId\": \"req_0123456789abcdef\",\n  \"webhook\": {\n    \"id\": \"7b0c9a1e-3f52-4c1d-9a7e-2d4f6b8c0e13\",\n    \"url\": \"https://hooks.example.com/compudime/orders\",\n    \"events\": [\n      \"order.dispatched\",\n      \"order.parked\"\n    ],\n    \"active\": true,\n    \"mode\": \"live\",\n    \"secretPrefix\": \"whsec_3f9a1c\",\n    \"createdAt\": \"2026-10-13T15:00:00Z\",\n    \"updatedAt\": \"2026-10-13T15:00:00Z\"\n  },\n  \"secret\": \"whsec_3f9a1c\\u003c58 more hex digits\\u003e\",\n  \"secretNote\": \"This signing secret is shown once, in this answer, and never again: store it now, like a password. If you lose it, rotate it (POST /v1/webhooks/{webhookId}/rotate-secret).\"\n}"
            }
          ]
        },
        {
          "name": "Remove a webhook receiver",
          "request": {
            "method": "DELETE",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/webhooks/:webhookId",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "webhooks",
                ":webhookId"
              ],
              "variable": [
                {
                  "key": "webhookId",
                  "value": "",
                  "description": "The receiver's id (id in the answer of POST /v1/webhooks or GET /v1/webhooks). An id your key has no receiver under is 404 webhook_not_found."
                }
              ]
            },
            "description": "Removes one of your receivers: nothing is sent to it again, including deliveries still waiting for a retry, and it no longer appears in your list. The store owner still sees it in the console, marked removed. Free, and needs only a valid key.\n\n- **Price:** free.\n- **Reference:** https://api.compudime.com/docs/reference/webhooks.delete"
          },
          "response": []
        },
        {
          "name": "Get a webhook receiver",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/webhooks/:webhookId",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "webhooks",
                ":webhookId"
              ],
              "variable": [
                {
                  "key": "webhookId",
                  "value": "",
                  "description": "The receiver's id (id in the answer of POST /v1/webhooks or GET /v1/webhooks). An id your key has no receiver under is 404 webhook_not_found."
                }
              ]
            },
            "description": "One of your receivers with its latest delivery; never its secret. A receiver of another integration, of the other key mode, or one you removed is 404 webhook_not_found. Free.\n\n- **Price:** free.\n- **Reference:** https://api.compudime.com/docs/reference/webhooks.get"
          },
          "response": []
        },
        {
          "name": "List a receiver's recent deliveries",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/webhooks/:webhookId/deliveries",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "webhooks",
                ":webhookId",
                "deliveries"
              ],
              "query": [
                {
                  "key": "limit",
                  "value": "",
                  "description": "How many deliveries to return, newest first: 1 to 100; omitted, 20. Anything else is 400 bad_request.",
                  "disabled": true
                }
              ],
              "variable": [
                {
                  "key": "webhookId",
                  "value": "",
                  "description": "The receiver's id (id in the answer of POST /v1/webhooks or GET /v1/webhooks). An id your key has no receiver under is 404 webhook_not_found."
                }
              ]
            },
            "description": "The receiver's newest deliveries, order events and test events, newest first: state (pending, failed, delivered, dead), attempts, the last HTTP status and error. Use it to see why your receiver is not getting events. Free.\n\n- **Price:** free.\n- **Reference:** https://api.compudime.com/docs/reference/webhooks.deliveries.list"
          },
          "response": []
        },
        {
          "name": "Rotate a receiver's signing secret",
          "request": {
            "method": "POST",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/webhooks/:webhookId/rotate-secret",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "webhooks",
                ":webhookId",
                "rotate-secret"
              ],
              "variable": [
                {
                  "key": "webhookId",
                  "value": "",
                  "description": "The receiver's id (id in the answer of POST /v1/webhooks or GET /v1/webhooks). An id your key has no receiver under is 404 webhook_not_found."
                }
              ]
            },
            "description": "Replaces the receiver's signing secret and answers the new one. This signing secret is shown once, in this answer, and never again: store it now, like a password. If you lose it, rotate it (POST /v1/webhooks/{webhookId}/rotate-secret). The old secret stops verifying from the next delivery attempt, retries of earlier events included, so switch your receiver to the new secret at once. Needs a key with the order-intake capability. Free.\n\n- **Price:** free.\n- **Capability:** `order-intake`.\n- **Reference:** https://api.compudime.com/docs/reference/webhooks.rotate_secret"
          },
          "response": []
        },
        {
          "name": "Send a test event to a receiver",
          "request": {
            "method": "POST",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/webhooks/:webhookId/test",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "webhooks",
                ":webhookId",
                "test"
              ],
              "variable": [
                {
                  "key": "webhookId",
                  "value": "",
                  "description": "The receiver's id (id in the answer of POST /v1/webhooks or GET /v1/webhooks). An id your key has no receiver under is 404 webhook_not_found."
                }
              ]
            },
            "description": "Queues one signed webhook.test event to the receiver and answers 202 with its delivery. CompuDime posts it within about a minute, through the same path, headers and signature as the order events, and retries a failure on the same schedule; follow it on GET /v1/webhooks/{webhookId}/deliveries. Use it to check your signature verification before the first order. At most 10 test events per receiver in an hour (429 rate_limited with Retry-After). A disabled receiver is 409 webhook_inactive. Works with test keys too: it is the only event a test key's receiver gets. Needs a key with the order-intake capability. Free.\n\n- **Price:** free.\n- **Capability:** `order-intake`.\n- **Reference:** https://api.compudime.com/docs/reference/webhooks.test"
          },
          "response": [
            {
              "name": "202 Accepted",
              "originalRequest": {
                "method": "POST",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/webhooks/:webhookId/test",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "webhooks",
                    ":webhookId",
                    "test"
                  ],
                  "variable": [
                    {
                      "key": "webhookId",
                      "value": "",
                      "description": "The receiver's id (id in the answer of POST /v1/webhooks or GET /v1/webhooks). An id your key has no receiver under is 404 webhook_not_found."
                    }
                  ]
                },
                "description": "Queues one signed webhook.test event to the receiver and answers 202 with its delivery. CompuDime posts it within about a minute, through the same path, headers and signature as the order events, and retries a failure on the same schedule; follow it on GET /v1/webhooks/{webhookId}/deliveries. Use it to check your signature verification before the first order. At most 10 test events per receiver in an hour (429 rate_limited with Retry-After). A disabled receiver is 409 webhook_inactive. Works with test keys too: it is the only event a test key's receiver gets. Needs a key with the order-intake capability. Free.\n\n- **Price:** free.\n- **Capability:** `order-intake`.\n- **Reference:** https://api.compudime.com/docs/reference/webhooks.test"
              },
              "status": "Accepted",
              "code": 202,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json; charset=utf-8",
                  "type": "text"
                }
              ],
              "cookie": [],
              "body": "{\n  \"requestId\": \"req_0123456789abcdef\",\n  \"delivery\": {\n    \"id\": \"c2e8f4a0-6b1d-4e3f-8a9c-0d2e4f6a8b1c\",\n    \"event\": \"webhook.test\",\n    \"state\": \"pending\",\n    \"attempts\": 0,\n    \"nextAttemptAt\": \"2026-10-13T15:01:00Z\",\n    \"createdAt\": \"2026-10-13T15:01:00Z\",\n    \"updatedAt\": \"2026-10-13T15:01:00Z\"\n  },\n  \"note\": \"Queued. CompuDime posts it within about a minute; follow it on GET /v1/webhooks/{webhookId}/deliveries.\"\n}"
            }
          ]
        }
      ]
    },
    {
      "name": "Your key and usage",
      "description": "Reference: https://api.compudime.com/docs/reference#family-platform",
      "item": [
        {
          "name": "List public API capabilities",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/capabilities",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "capabilities"
              ]
            },
            "description": "- **Price:** free.\n- **Reference:** https://api.compudime.com/docs/reference/platform.capabilities.list"
          },
          "response": []
        },
        {
          "name": "Describe the calling key",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/me",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "me"
              ]
            },
            "description": "- **Price:** free.\n- **Reference:** https://api.compudime.com/docs/reference/platform.me.get"
          },
          "response": [
            {
              "name": "200 OK",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/v1/me",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "me"
                  ]
                },
                "description": "- **Price:** free.\n- **Reference:** https://api.compudime.com/docs/reference/platform.me.get"
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json; charset=utf-8",
                  "type": "text"
                }
              ],
              "cookie": [],
              "body": "{\n  \"requestId\": \"req_0123456789abcdef\",\n  \"key\": {\n    \"prefix\": \"cd_live_\",\n    \"mode\": \"live\",\n    \"kind\": \"genie\"\n  },\n  \"integration\": {\n    \"integrationId\": \"5f1c2d3e-4a5b-4c6d-8e7f-90a1b2c3d4e5\",\n    \"displayName\": \"Shelf labels\",\n    \"capabilityId\": \"catalog-feed\",\n    \"capabilities\": [\n      \"catalog-feed\"\n    ],\n    \"accessLevel\": \"own\",\n    \"billingClass\": \"charged\"\n  },\n  \"store\": {\n    \"storeId\": \"corner_market\",\n    \"displayName\": \"Corner Market\"\n  },\n  \"fieldPolicy\": {\n    \"policyId\": \"corner_market:catalog.products.default:v1\",\n    \"version\": 1,\n    \"resources\": [\n      {\n        \"resource\": \"catalog.products.default\",\n        \"endpoints\": [\n          \"catalog.products.list\",\n          \"catalog.products.get\"\n        ],\n        \"source\": \"policy\",\n        \"fields\": [\n          \"productCode\",\n          \"upc\",\n          \"unitsPerCase\",\n          \"description\",\n          \"smallDescription\",\n          \"brand\",\n          \"department\",\n          \"category\",\n          \"size\",\n          \"pack\",\n          \"price\",\n          \"priceQty\",\n          \"taxable\",\n          \"active\",\n          \"lastModifiedUtc\",\n          \"inactive\",\n          \"lastSold\"\n        ],\n        \"defaultFields\": [\n          \"productCode\",\n          \"upc\",\n          \"description\",\n          \"brand\",\n          \"price\"\n        ]\n      },\n      {\n        \"resource\": \"catalog.products.live\",\n        \"endpoints\": [\n          \"catalog.products.lookup\"\n        ],\n        \"source\": \"catalog\",\n        \"fields\": [\n          \"productCode\",\n          \"description\",\n          \"price\",\n          \"activePrice\",\n          \"onHand\",\n          \"upc\",\n          \"unitsPerCase\",\n          \"smallDescription\",\n          \"brand\",\n          \"department\",\n          \"category\",\n          \"subCategory\",\n          \"size\",\n          \"pack\",\n          \"casePrice\",\n          \"packagePrice\",\n          \"packageQty\",\n          \"salePrice\",\n          \"saleActive\",\n          \"caseSalePrice\",\n          \"caseSaleActive\",\n          \"packageSalePrice\",\n          \"packageSaleQty\",\n          \"packageSaleActive\",\n          \"priceEmbedded\",\n          \"scale\",\n          \"autoTare\",\n          \"tare\",\n          \"noSale\",\n          \"inactive\",\n          \"taxable\",\n          \"foodStamp\",\n          \"wic\",\n          \"matchType\",\n          \"matchField\",\n          \"matchedCode\",\n          \"lastSold\",\n          \"lastModifiedUtc\"\n        ],\n        \"defaultFields\": [\n          \"productCode\",\n          \"description\",\n          \"price\",\n          \"activePrice\",\n          \"onHand\"\n        ]\n      }\n    ]\n  },\n  \"rateLimit\": {\n    \"requestsPerMinute\": 120,\n    \"burst\": 120\n  },\n  \"credits\": {\n    \"storeId\": \"corner_market\",\n    \"planId\": \"starter\",\n    \"state\": \"active\",\n    \"cardState\": \"valid\",\n    \"overageEnabled\": false,\n    \"overageCapCredits\": 0,\n    \"currentPeriod\": \"2026-10\",\n    \"billingMode\": \"manual\",\n    \"usedCredits\": 212,\n    \"includedCredits\": 1000,\n    \"overageCredits\": 0,\n    \"baseCredits\": 212,\n    \"extraFieldCredits\": 0,\n    \"pendingCredits\": 0,\n    \"sandboxUsedCredits\": 0,\n    \"sandboxIncludedCredits\": 500\n  }\n}"
            }
          ]
        },
        {
          "name": "Get current API usage",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/usage/current",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "usage",
                "current"
              ]
            },
            "description": "The store's month so far on the API meter: its plan, card state, overage and its cap, the credits used and included, and the calls per endpoint. Only the store's own keys read it. A key your organization holds for a store (a developer's key under the owner's approval, for instance) is billed to your organization and is not shown the store's billing: it gets 403 usage_not_available_for_key, and your organization's usage is at https://account.compudime.com/usage. Free.\n\n- **Price:** free.\n- **Reference:** https://api.compudime.com/docs/reference/platform.usage.current"
          },
          "response": []
        }
      ]
    },
    {
      "name": "Status and the document",
      "description": "Reference: https://api.compudime.com/docs/reference#family-status",
      "item": [
        {
          "name": "Check API Edge health",
          "request": {
            "auth": {
              "type": "noauth"
            },
            "method": "GET",
            "header": [],
            "url": {
              "raw": "https://compudime-public-api.fly.dev/healthz",
              "protocol": "https",
              "host": [
                "compudime-public-api",
                "fly",
                "dev"
              ],
              "path": [
                "healthz"
              ]
            },
            "description": "- **Price:** free.\n- **Key:** not needed.\n- **Reference:** https://api.compudime.com/docs/reference/platform.healthz"
          },
          "response": []
        },
        {
          "name": "Fetch OpenAPI document",
          "request": {
            "auth": {
              "type": "noauth"
            },
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/openapi.json",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "openapi.json"
              ]
            },
            "description": "- **Price:** free.\n- **Key:** not needed.\n- **Reference:** https://api.compudime.com/docs/reference/platform.openapi"
          },
          "response": []
        },
        {
          "name": "Check API Edge readiness",
          "request": {
            "auth": {
              "type": "noauth"
            },
            "method": "GET",
            "header": [],
            "url": {
              "raw": "https://compudime-public-api.fly.dev/readyz",
              "protocol": "https",
              "host": [
                "compudime-public-api",
                "fly",
                "dev"
              ],
              "path": [
                "readyz"
              ]
            },
            "description": "- **Price:** free.\n- **Key:** not needed.\n- **Reference:** https://api.compudime.com/docs/reference/platform.readyz"
          },
          "response": []
        }
      ]
    }
  ]
}
