{
  "info": {
    "name": "Acenda API",
    "description": "Curated public integration API. Use a private Postman environment for credentials and never share populated secrets.",
    "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
  },
  "auth": {
    "type": "bearer",
    "bearer": [
      {
        "key": "token",
        "value": "{{access_token}}",
        "type": "string"
      }
    ]
  },
  "variable": [
    {
      "key": "base_url",
      "value": "https://api.acenda.io/v1",
      "type": "string"
    },
    {
      "key": "token_url",
      "value": "https://login.acenda.io/auth/realms/acenda/protocol/openid-connect/token",
      "type": "string"
    },
    {
      "key": "organization",
      "value": "example-store",
      "type": "string"
    },
    {
      "key": "client_id",
      "value": "",
      "type": "string"
    },
    {
      "key": "client_secret",
      "value": "",
      "type": "string"
    },
    {
      "key": "access_token",
      "value": "",
      "type": "string"
    }
  ],
  "item": [
    {
      "name": "Authentication",
      "item": [
        {
          "name": "Get an access token",
          "request": {
            "auth": {
              "type": "noauth"
            },
            "method": "POST",
            "header": [],
            "url": "{{token_url}}",
            "body": {
              "mode": "urlencoded",
              "urlencoded": [
                {
                  "key": "grant_type",
                  "value": "client_credentials"
                },
                {
                  "key": "client_id",
                  "value": "{{client_id}}"
                },
                {
                  "key": "client_secret",
                  "value": "{{client_secret}}"
                },
                {
                  "key": "scope",
                  "value": "openid"
                }
              ]
            },
            "description": "Use credentials issued by your organization for the public API. Copy access_token from the response into a private Postman environment variable. Never share a populated environment or collection."
          }
        }
      ]
    },
    {
      "name": "Catalog",
      "item": [
        {
          "name": "List catalog items",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              },
              {
                "key": "X-Astur-Organization",
                "value": "{{organization}}"
              }
            ],
            "url": {
              "raw": "{{base_url}}/catalog?limit=20&page=1",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "catalog"
              ],
              "query": [
                {
                  "key": "limit",
                  "value": "20",
                  "description": "Maximum records returned per page: 1 to 1000, with a default of 100. A page can contain fewer records.",
                  "disabled": false
                },
                {
                  "key": "page",
                  "value": "1",
                  "description": "Page number, starting at 1. Keep the same query, sort, and limit when requesting later pages. Stop when result is empty or null.",
                  "disabled": false
                },
                {
                  "key": "sort",
                  "value": "updated_at:-1,id:1",
                  "description": "Comma-separated field:direction entries, applied from left to right. Use field:1 for ascending order and field:-1 for descending order. For example, updated_at:-1,id:1 returns the newest updates first, then the lowest ID for equal timestamps. Add a unique ID as the final tie-breaker when paging.",
                  "disabled": true
                },
                {
                  "key": "query",
                  "value": "{\"sku\":\"TRAIL-MUG\"}",
                  "description": "A URL-encoded JSON object filtering supported top-level fields on this resource. Multiple fields in one object are combined with AND. Use JSON strings for text and JSON numbers for numeric IDs, and let your HTTP library encode the complete value.",
                  "disabled": true
                }
              ],
              "variable": []
            },
            "description": "Read products, variants, and kits through one catalog endpoint. The group field identifies the item kind.\n\nRequired permission: `product:read`."
          }
        },
        {
          "name": "Create a catalog item",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              },
              {
                "key": "X-Astur-Organization",
                "value": "{{organization}}"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/catalog",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "catalog"
              ],
              "query": [],
              "variable": []
            },
            "description": "Create a standalone product with a unique SKU. Use an existing catalog record for variants and kits; advanced composition is outside this guide.\n\nRequired permission: `product:create`.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"sku\": \"TRAIL-MUG\",\n  \"name\": \"Trail mug\",\n  \"group\": \"product\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          }
        },
        {
          "name": "Get a catalog item",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              },
              {
                "key": "X-Astur-Organization",
                "value": "{{organization}}"
              },
              {
                "key": "If-None-Match",
                "value": "\"<saved-etag>\"",
                "description": "For a conditional single-record GET, send the exact single ETag copied from a previous 200 response, including its quotes. Reuse it only for the same URL, query, organization, and API identity.",
                "disabled": true
              }
            ],
            "url": {
              "raw": "{{base_url}}/catalog/:product",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "catalog",
                ":product"
              ],
              "query": [],
              "variable": [
                {
                  "key": "product",
                  "value": "101"
                }
              ]
            },
            "description": "Retrieve a catalog record using its Acenda ID. Filter the list by sku if you only know the SKU. This single-record GET supports If-None-Match with a previously saved ETag. A 304 response has no body; reuse the cached result. A 200 response supplies the current result and ETag.\n\nRequired permission: `product:read`."
          }
        },
        {
          "name": "Update a catalog item",
          "request": {
            "method": "PATCH",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              },
              {
                "key": "X-Astur-Organization",
                "value": "{{organization}}"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/catalog/:product",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "catalog",
                ":product"
              ],
              "query": [],
              "variable": [
                {
                  "key": "product",
                  "value": "101"
                }
              ]
            },
            "description": "Change the documented fields of an existing item. Fields not sent remain on the loaded record.\n\nRequired permission: `product:update`.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"name\": \"Trail mug \\u2014 12 oz\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          }
        },
        {
          "name": "Count catalog items",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              },
              {
                "key": "X-Astur-Organization",
                "value": "{{organization}}"
              }
            ],
            "url": {
              "raw": "{{base_url}}/catalog/count",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "catalog",
                "count"
              ],
              "query": [
                {
                  "key": "query",
                  "value": "{\"sku\":\"TRAIL-MUG\"}",
                  "description": "A URL-encoded JSON object filtering supported top-level fields on this resource. Multiple fields in one object are combined with AND. Use JSON strings for text and JSON numbers for numeric IDs, and let your HTTP library encode the complete value.",
                  "disabled": true
                }
              ],
              "variable": []
            },
            "description": "Count catalog records matching an optional query filter.\n\nRequired permission: `product:read`."
          }
        }
      ]
    },
    {
      "name": "Inventory",
      "item": [
        {
          "name": "List inventory",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              },
              {
                "key": "X-Astur-Organization",
                "value": "{{organization}}"
              }
            ],
            "url": {
              "raw": "{{base_url}}/inventory_detail?limit=20&page=1",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "inventory_detail"
              ],
              "query": [
                {
                  "key": "limit",
                  "value": "20",
                  "description": "Maximum records returned per page: 1 to 1000, with a default of 100. A page can contain fewer records.",
                  "disabled": false
                },
                {
                  "key": "page",
                  "value": "1",
                  "description": "Page number, starting at 1. Keep the same query, sort, and limit when requesting later pages. Stop when result is empty or null.",
                  "disabled": false
                },
                {
                  "key": "sort",
                  "value": "updated_at:-1,id:1",
                  "description": "Comma-separated field:direction entries, applied from left to right. Use field:1 for ascending order and field:-1 for descending order. For example, updated_at:-1,id:1 returns the newest updates first, then the lowest ID for equal timestamps. Add a unique ID as the final tie-breaker when paging.",
                  "disabled": true
                },
                {
                  "key": "query",
                  "value": "{\"sku\":\"TRAIL-MUG\"}",
                  "description": "A URL-encoded JSON object filtering supported top-level fields on this resource. Multiple fields in one object are combined with AND. Use JSON strings for text and JSON numbers for numeric IDs, and let your HTTP library encode the complete value.",
                  "disabled": true
                }
              ],
              "variable": []
            },
            "description": "Read stock by product and warehouse. Filter by sku or warehouse_id. on_hand is calculated by the read view. A missing inventory record can return HTTP 200 with result: null and num_results: 0.\n\nRequired permission: `inventory:read`."
          }
        },
        {
          "name": "Set inventory for a SKU",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              },
              {
                "key": "X-Astur-Organization",
                "value": "{{organization}}"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/inventory_detail",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "inventory_detail"
              ],
              "query": [],
              "variable": []
            },
            "description": "Create inventory for an existing SKU and warehouse. The stored product/warehouse pair is unique; saving can update an existing pair. Send an absolute quantity, not a stock adjustment. Kit inventory is calculated and cannot be manually set.\n\nRequired permission: `inventory:create`.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"sku\": \"TRAIL-MUG\",\n  \"warehouse_id\": 20,\n  \"quantity\": 50,\n  \"tracking\": \"basic\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          }
        },
        {
          "name": "Get an inventory record",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              },
              {
                "key": "X-Astur-Organization",
                "value": "{{organization}}"
              },
              {
                "key": "If-None-Match",
                "value": "\"<saved-etag>\"",
                "description": "For a conditional single-record GET, send the exact single ETag copied from a previous 200 response, including its quotes. Reuse it only for the same URL, query, organization, and API identity.",
                "disabled": true
              }
            ],
            "url": {
              "raw": "{{base_url}}/inventory_detail/:inventorydetail",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "inventory_detail",
                ":inventorydetail"
              ],
              "query": [],
              "variable": [
                {
                  "key": "inventorydetail",
                  "value": "301"
                }
              ]
            },
            "description": "Look up one inventory record by its Acenda ID. A missing inventory record can return HTTP 200 with result: null and num_results: 0. This single-record GET supports If-None-Match with a previously saved ETag. A 304 response has no body; reuse the cached result. A 200 response supplies the current result and ETag.\n\nRequired permission: `inventory:read`."
          }
        },
        {
          "name": "Update inventory quantity",
          "request": {
            "method": "PATCH",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              },
              {
                "key": "X-Astur-Organization",
                "value": "{{organization}}"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/inventory_detail/:inventorydetail",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "inventory_detail",
                ":inventorydetail"
              ],
              "query": [],
              "variable": [
                {
                  "key": "inventorydetail",
                  "value": "301"
                }
              ]
            },
            "description": "Set the absolute stock quantity on an existing inventory record. Only send the fields you intend to change. Kit inventory is calculated and cannot be manually set.\n\nRequired permission: `inventory:update`.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"quantity\": 60\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          }
        },
        {
          "name": "Count inventory records",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              },
              {
                "key": "X-Astur-Organization",
                "value": "{{organization}}"
              }
            ],
            "url": {
              "raw": "{{base_url}}/inventory_detail/count",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "inventory_detail",
                "count"
              ],
              "query": [
                {
                  "key": "query",
                  "value": "{\"product_id\":101}",
                  "description": "A URL-encoded JSON object filtering supported top-level fields on this resource. Multiple fields in one object are combined with AND. Use JSON strings for text and JSON numbers for numeric IDs, and let your HTTP library encode the complete value.",
                  "disabled": true
                }
              ],
              "variable": []
            },
            "description": "Count stored inventory records matching an optional query filter. A missing inventory record can return HTTP 200 with result: null and num_results: 0.\n\nRequired permission: `inventory:read`."
          }
        },
        {
          "name": "Read inventory summaries",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              },
              {
                "key": "X-Astur-Organization",
                "value": "{{organization}}"
              }
            ],
            "url": {
              "raw": "{{base_url}}/inventory?limit=20&page=1",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "inventory"
              ],
              "query": [
                {
                  "key": "limit",
                  "value": "20",
                  "description": "Limit underlying inventory-detail rows before grouping, not returned products.",
                  "disabled": false
                },
                {
                  "key": "page",
                  "value": "1",
                  "description": "Page underlying warehouse rows before grouping. Never stop simply because fewer product summaries than limit are returned.",
                  "disabled": false
                },
                {
                  "key": "sort",
                  "value": "updated_at:-1,id:1",
                  "description": "Comma-separated field:direction entries, applied from left to right. Use field:1 for ascending order and field:-1 for descending order. For example, updated_at:-1,id:1 returns the newest updates first, then the lowest ID for equal timestamps. Add a unique ID as the final tie-breaker when paging.",
                  "disabled": true
                },
                {
                  "key": "query",
                  "value": "{\"sku\":\"TRAIL-MUG\"}",
                  "description": "A URL-encoded JSON object filtering supported top-level fields on this resource. Multiple fields in one object are combined with AND. Use JSON strings for text and JSON numbers for numeric IDs, and let your HTTP library encode the complete value.",
                  "disabled": true
                }
              ],
              "variable": []
            },
            "description": "Read product summaries assembled from inventory-detail rows in active warehouses. Filtering, sorting, limit, and page apply to warehouse rows BEFORE grouping by product_id; returned product summaries are then ordered by product_id. A product spanning pages can have partial totals on each page. Use inventory_detail for a complete warehouse-level sync and aggregate only after reading every page. Do not use the number of product summaries as a page-size signal.\n\nRequired permission: `inventory:read`."
          }
        },
        {
          "name": "Bulk update inventory",
          "request": {
            "method": "PUT",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              },
              {
                "key": "X-Astur-Organization",
                "value": "{{organization}}"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/inventory_detail/bulk",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "inventory_detail",
                "bulk"
              ],
              "query": [],
              "variable": []
            },
            "description": "Set absolute stock for existing products and warehouses; missing stock rows are created. Send a JSON array with one row per product and warehouse, identified by product_id or sku plus warehouse_id, not by inventory-record id. Each row must include a positive product_id or a non-empty sku. Either identifier is sufficient; if both are supplied, product_id takes precedence. Do not submit derived kit stock. This bulk write overwrites quantity, allocated, cost, date_received, and expiration_date: omitted allocated becomes zero, omitted cost becomes zero, and omitted dates are cleared. Include the intended current metadata and coordinate concurrent writers. HTTP 201 can contain partial results. Inspect errors and re-read affected stock; summary counters are not individual row receipts.\n\nRequired permission: `inventory:update`.",
            "body": {
              "mode": "raw",
              "raw": "[\n  {\n    \"sku\": \"TRAIL-MUG\",\n    \"warehouse_id\": 20,\n    \"quantity\": 50,\n    \"allocated\": 2,\n    \"cost\": \"12.50\",\n    \"date_received\": \"2026-11-01T00:00:00Z\",\n    \"expiration_date\": null\n  }\n]",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          }
        }
      ]
    },
    {
      "name": "Pricing",
      "item": [
        {
          "name": "List pricing items",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              },
              {
                "key": "X-Astur-Organization",
                "value": "{{organization}}"
              }
            ],
            "url": {
              "raw": "{{base_url}}/pricing_item?limit=20&page=1",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "pricing_item"
              ],
              "query": [
                {
                  "key": "limit",
                  "value": "20",
                  "description": "Maximum records returned per page: 1 to 1000, with a default of 100. A page can contain fewer records.",
                  "disabled": false
                },
                {
                  "key": "page",
                  "value": "1",
                  "description": "Page number, starting at 1. Keep the same query, sort, and limit when requesting later pages. Stop when result is empty or null.",
                  "disabled": false
                },
                {
                  "key": "sort",
                  "value": "updated_at:-1,id:1",
                  "description": "Comma-separated field:direction entries, applied from left to right. Use field:1 for ascending order and field:-1 for descending order. For example, updated_at:-1,id:1 returns the newest updates first, then the lowest ID for equal timestamps. Add a unique ID as the final tie-breaker when paging.",
                  "disabled": true
                },
                {
                  "key": "query",
                  "value": "{\"product_id\":101}",
                  "description": "A URL-encoded JSON object filtering supported top-level fields on this resource. Multiple fields in one object are combined with AND. Use JSON strings for text and JSON numbers for numeric IDs, and let your HTTP library encode the complete value.",
                  "disabled": true
                }
              ],
              "variable": []
            },
            "description": "Read the stored base price, MSRP, and minimum advertised price for a catalog record. These amounts are not a promise of the final order price after channel pricing or promotions. Filter list requests by product_id to find the pricing record for a catalog item.\n\nRequired permission: `pricing:read`."
          }
        },
        {
          "name": "Get a pricing item",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              },
              {
                "key": "X-Astur-Organization",
                "value": "{{organization}}"
              },
              {
                "key": "If-None-Match",
                "value": "\"<saved-etag>\"",
                "description": "For a conditional single-record GET, send the exact single ETag copied from a previous 200 response, including its quotes. Reuse it only for the same URL, query, organization, and API identity.",
                "disabled": true
              }
            ],
            "url": {
              "raw": "{{base_url}}/pricing_item/:pricingitem",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "pricing_item",
                ":pricingitem"
              ],
              "query": [],
              "variable": [
                {
                  "key": "pricingitem",
                  "value": "401"
                }
              ]
            },
            "description": "Read the stored base price, MSRP, and minimum advertised price for a catalog record. These amounts are not a promise of the final order price after channel pricing or promotions. Filter list requests by product_id to find the pricing record for a catalog item. This single-record GET supports If-None-Match with a previously saved ETag. A 304 response has no body; reuse the cached result. A 200 response supplies the current result and ETag.\n\nRequired permission: `pricing:read`."
          }
        },
        {
          "name": "Bulk update base prices",
          "request": {
            "method": "PUT",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              },
              {
                "key": "X-Astur-Organization",
                "value": "{{organization}}"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/pricing_item/bulk",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "pricing_item",
                "bulk"
              ],
              "query": [],
              "variable": []
            },
            "description": "Update stored base prices, MSRP, and minimum advertised prices for existing products; missing pricing rows are created. Send a JSON array with one row per product, identified by product_id or sku, not by pricing-record id. Each row must include a positive product_id or a non-empty sku. Either identifier is sufficient; if both are supplied, product_id takes precedence. Omitted or null price columns retain their values; this is not a way to clear them. Supply currencies explicitly for new amounts. This route does not update promotions or custom prices. HTTP 200 can contain partial results: inspect errors and re-read affected prices before retrying. Summary counters are not individual row receipts.\n\nRequired permission: `pricing:update`.",
            "body": {
              "mode": "raw",
              "raw": "[\n  {\n    \"sku\": \"TRAIL-MUG\",\n    \"price\": {\n      \"amount\": \"29.00\",\n      \"currency\": \"USD\"\n    },\n    \"msrp\": {\n      \"amount\": \"35.00\",\n      \"currency\": \"USD\"\n    }\n  }\n]",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          }
        }
      ]
    },
    {
      "name": "Warehouses",
      "item": [
        {
          "name": "List warehouses",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              },
              {
                "key": "X-Astur-Organization",
                "value": "{{organization}}"
              }
            ],
            "url": {
              "raw": "{{base_url}}/warehouse?limit=20&page=1",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "warehouse"
              ],
              "query": [
                {
                  "key": "limit",
                  "value": "20",
                  "description": "Maximum records returned per page: 1 to 1000, with a default of 100. A page can contain fewer records.",
                  "disabled": false
                },
                {
                  "key": "page",
                  "value": "1",
                  "description": "Page number, starting at 1. Keep the same query, sort, and limit when requesting later pages. Stop when result is empty or null.",
                  "disabled": false
                },
                {
                  "key": "sort",
                  "value": "updated_at:-1,id:1",
                  "description": "Comma-separated field:direction entries, applied from left to right. Use field:1 for ascending order and field:-1 for descending order. For example, updated_at:-1,id:1 returns the newest updates first, then the lowest ID for equal timestamps. Add a unique ID as the final tie-breaker when paging.",
                  "disabled": true
                },
                {
                  "key": "query",
                  "value": "{\"active\":true}",
                  "description": "A URL-encoded JSON object filtering supported top-level fields on this resource. Multiple fields in one object are combined with AND. Use JSON strings for text and JSON numbers for numeric IDs, and let your HTTP library encode the complete value.",
                  "disabled": true
                }
              ],
              "variable": []
            },
            "description": "Find existing warehouse IDs before reading or setting inventory.\n\nRequired permission: `warehouse:read`."
          }
        },
        {
          "name": "Get a warehouse",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              },
              {
                "key": "X-Astur-Organization",
                "value": "{{organization}}"
              },
              {
                "key": "If-None-Match",
                "value": "\"<saved-etag>\"",
                "description": "For a conditional single-record GET, send the exact single ETag copied from a previous 200 response, including its quotes. Reuse it only for the same URL, query, organization, and API identity.",
                "disabled": true
              }
            ],
            "url": {
              "raw": "{{base_url}}/warehouse/:warehouse",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "warehouse",
                ":warehouse"
              ],
              "query": [],
              "variable": [
                {
                  "key": "warehouse",
                  "value": "20"
                }
              ]
            },
            "description": "Read a warehouse and its fulfillment-provider ID. This single-record GET supports If-None-Match with a previously saved ETag. A 304 response has no body; reuse the cached result. A 200 response supplies the current result and ETag.\n\nRequired permission: `warehouse:read`."
          }
        }
      ]
    },
    {
      "name": "Fulfillment providers",
      "item": [
        {
          "name": "List fulfillment providers",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              },
              {
                "key": "X-Astur-Organization",
                "value": "{{organization}}"
              }
            ],
            "url": {
              "raw": "{{base_url}}/fulfillment_provider?limit=20&page=1",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "fulfillment_provider"
              ],
              "query": [
                {
                  "key": "limit",
                  "value": "20",
                  "description": "Maximum records returned per page: 1 to 1000, with a default of 100. A page can contain fewer records.",
                  "disabled": false
                },
                {
                  "key": "page",
                  "value": "1",
                  "description": "Page number, starting at 1. Keep the same query, sort, and limit when requesting later pages. Stop when result is empty or null.",
                  "disabled": false
                },
                {
                  "key": "sort",
                  "value": "updated_at:-1,id:1",
                  "description": "Comma-separated field:direction entries, applied from left to right. Use field:1 for ascending order and field:-1 for descending order. For example, updated_at:-1,id:1 returns the newest updates first, then the lowest ID for equal timestamps. Add a unique ID as the final tie-breaker when paging.",
                  "disabled": true
                },
                {
                  "key": "query",
                  "value": "{\"active\":true}",
                  "description": "A URL-encoded JSON object filtering supported top-level fields on this resource. Multiple fields in one object are combined with AND. Use JSON strings for text and JSON numbers for numeric IDs, and let your HTTP library encode the complete value.",
                  "disabled": true
                }
              ],
              "variable": []
            },
            "description": "Look up providers and their IDs. Match a provider ID to warehouse.fulfillment_provider_id when working with warehouse inventory or routing.\n\nRequired permission: `fulfillment_provider:read`."
          }
        },
        {
          "name": "Get a fulfillment provider",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              },
              {
                "key": "X-Astur-Organization",
                "value": "{{organization}}"
              },
              {
                "key": "If-None-Match",
                "value": "\"<saved-etag>\"",
                "description": "For a conditional single-record GET, send the exact single ETag copied from a previous 200 response, including its quotes. Reuse it only for the same URL, query, organization, and API identity.",
                "disabled": true
              }
            ],
            "url": {
              "raw": "{{base_url}}/fulfillment_provider/:fulfillmentprovider",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "fulfillment_provider",
                ":fulfillmentprovider"
              ],
              "query": [],
              "variable": [
                {
                  "key": "fulfillmentprovider",
                  "value": "6"
                }
              ]
            },
            "description": "Read one provider by its Acenda ID. Warehouse records are read separately from /warehouse. This single-record GET supports If-None-Match with a previously saved ETag. A 304 response has no body; reuse the cached result. A 200 response supplies the current result and ETag.\n\nRequired permission: `fulfillment_provider:read`."
          }
        }
      ]
    },
    {
      "name": "Sales channels",
      "item": [
        {
          "name": "List sales channels",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              },
              {
                "key": "X-Astur-Organization",
                "value": "{{organization}}"
              }
            ],
            "url": {
              "raw": "{{base_url}}/sales_channel?limit=20&page=1",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "sales_channel"
              ],
              "query": [
                {
                  "key": "limit",
                  "value": "20",
                  "description": "Maximum records returned per page: 1 to 1000, with a default of 100. A page can contain fewer records.",
                  "disabled": false
                },
                {
                  "key": "page",
                  "value": "1",
                  "description": "Page number, starting at 1. Keep the same query, sort, and limit when requesting later pages. Stop when result is empty or null.",
                  "disabled": false
                },
                {
                  "key": "sort",
                  "value": "updated_at:-1,id:1",
                  "description": "Comma-separated field:direction entries, applied from left to right. Use field:1 for ascending order and field:-1 for descending order. For example, updated_at:-1,id:1 returns the newest updates first, then the lowest ID for equal timestamps. Add a unique ID as the final tie-breaker when paging.",
                  "disabled": true
                },
                {
                  "key": "query",
                  "value": "{\"country\":\"US\"}",
                  "description": "A URL-encoded JSON object filtering supported top-level fields on this resource. Multiple fields in one object are combined with AND. Use JSON strings for text and JSON numbers for numeric IDs, and let your HTTP library encode the complete value.",
                  "disabled": true
                }
              ],
              "variable": []
            },
            "description": "Find the existing sales channel ID used when creating orders.\n\nRequired permission: `sales_channel:read`."
          }
        },
        {
          "name": "Get a sales channel",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              },
              {
                "key": "X-Astur-Organization",
                "value": "{{organization}}"
              },
              {
                "key": "If-None-Match",
                "value": "\"<saved-etag>\"",
                "description": "For a conditional single-record GET, send the exact single ETag copied from a previous 200 response, including its quotes. Reuse it only for the same URL, query, organization, and API identity.",
                "disabled": true
              }
            ],
            "url": {
              "raw": "{{base_url}}/sales_channel/:saleschannel",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "sales_channel",
                ":saleschannel"
              ],
              "query": [],
              "variable": [
                {
                  "key": "saleschannel",
                  "value": "7"
                }
              ]
            },
            "description": "Read the channel used by an order source. Sales-channel configuration is managed by your organization. This single-record GET supports If-None-Match with a previously saved ETag. A 304 response has no body; reuse the cached result. A 200 response supplies the current result and ETag.\n\nRequired permission: `sales_channel:read`."
          }
        }
      ]
    },
    {
      "name": "Ship advice",
      "item": [
        {
          "name": "Create a routing assignment",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              },
              {
                "key": "X-Astur-Organization",
                "value": "{{organization}}"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/order/:order/ship_advice",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "order",
                ":order",
                "ship_advice"
              ],
              "query": [],
              "variable": [
                {
                  "key": "order",
                  "value": "10042"
                }
              ]
            },
            "description": "Use this reassignment workflow only for non-kit order items. Contact Acenda before releasing or reassigning kit items. Assign unrouted units from an existing order to a warehouse. Use order_item_id from that order. The new ship advice inherits order prices, addresses, shipping method, and requested dates; this request does not change those details. After releasing an old assignment, re-read quantities before creating its replacement. Creation is not generally idempotent: reconcile existing assignments after an ambiguous response before retrying.\n\nRequired permission: `ship_advice:create`.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"warehouse_id\": 8,\n  \"ship_advice_item\": [\n    {\n      \"order_item_id\": 20081,\n      \"quantity\": 1\n    }\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          }
        },
        {
          "name": "List ship advice",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              },
              {
                "key": "X-Astur-Organization",
                "value": "{{organization}}"
              }
            ],
            "url": {
              "raw": "{{base_url}}/ship_advice?limit=20&page=1",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "ship_advice"
              ],
              "query": [
                {
                  "key": "limit",
                  "value": "20",
                  "description": "Maximum records returned per page: 1 to 1000, with a default of 100. A page can contain fewer records.",
                  "disabled": false
                },
                {
                  "key": "page",
                  "value": "1",
                  "description": "Page number, starting at 1. Keep the same query, sort, and limit when requesting later pages. Stop when result is empty or null.",
                  "disabled": false
                },
                {
                  "key": "sort",
                  "value": "updated_at:-1,id:1",
                  "description": "Comma-separated field:direction entries, applied from left to right. Use field:1 for ascending order and field:-1 for descending order. For example, updated_at:-1,id:1 returns the newest updates first, then the lowest ID for equal timestamps. Add a unique ID as the final tie-breaker when paging.",
                  "disabled": true
                },
                {
                  "key": "query",
                  "value": "{\"order_id\":10042}",
                  "description": "A URL-encoded JSON object filtering supported top-level fields on this resource. Multiple fields in one object are combined with AND. Use JSON strings for text and JSON numbers for numeric IDs, and let your HTTP library encode the complete value.",
                  "disabled": true
                },
                {
                  "key": "unacked",
                  "value": "True",
                  "description": "Return only records not acknowledged by this API identity. Use page=1 while draining this changing queue. Fetching does not reserve records.",
                  "disabled": true
                }
              ],
              "variable": []
            },
            "description": "Read warehouse work snapshots created by order routing. Filter by order_id or warehouse_id. Core ship-advice details are immutable; per-record custom-field values can be updated separately. Use explicit routing, rerouting, fulfillment, and cancellation operations for lifecycle changes.\n\nRequired permission: `ship_advice:read`."
          }
        },
        {
          "name": "Get ship advice",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              },
              {
                "key": "X-Astur-Organization",
                "value": "{{organization}}"
              },
              {
                "key": "If-None-Match",
                "value": "\"<saved-etag>\"",
                "description": "For a conditional single-record GET, send the exact single ETag copied from a previous 200 response, including its quotes. Reuse it only for the same URL, query, organization, and API identity.",
                "disabled": true
              }
            ],
            "url": {
              "raw": "{{base_url}}/ship_advice/:shipadvice",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "ship_advice",
                ":shipadvice"
              ],
              "query": [],
              "variable": [
                {
                  "key": "shipadvice",
                  "value": "5001"
                }
              ]
            },
            "description": "Retrieve a warehouse work snapshot and its item quantities before fulfillment, cancellation, or rerouting. Use the routed item ID for those operations. Core ship-advice details are immutable; only per-record custom-field values can be edited through the supported PATCH operation. This single-record GET supports If-None-Match with a previously saved ETag. A 304 response has no body; reuse the cached result. A 200 response supplies the current result and ETag.\n\nRequired permission: `ship_advice:read`."
          }
        },
        {
          "name": "Update ship advice custom fields",
          "request": {
            "method": "PATCH",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              },
              {
                "key": "X-Astur-Organization",
                "value": "{{organization}}"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/ship_advice/:shipadvice",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "ship_advice",
                ":shipadvice"
              ],
              "query": [],
              "variable": [
                {
                  "key": "shipadvice",
                  "value": "5001"
                }
              ]
            },
            "description": "Update only per-record custom-field values on an existing ship advice. Send a fields object with values compatible with the custom-field types configured by your organization. Other top-level properties are ignored and do not change the ship advice. Omitted custom fields retain their existing values; null or an empty string removes a stored value. This operation does not create or edit custom-field definitions. Use explicit routing, fulfillment, and cancellation operations for lifecycle changes.\n\nRequired permission: `ship_advice:update`.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"fields\": {\n    \"exported_to_erp\": true\n  }\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          }
        },
        {
          "name": "Release a routing assignment",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              },
              {
                "key": "X-Astur-Organization",
                "value": "{{organization}}"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/ship_advice_item_reroute",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "ship_advice_item_reroute"
              ],
              "query": [],
              "variable": []
            },
            "description": "Use this reassignment workflow only for non-kit order items. Contact Acenda before releasing or reassigning kit items. Release remaining units from an existing ship advice item. This creates a reroute record and updates routing quantities; it does not select another warehouse or create replacement ship advice. Choose only unfulfilled, uncanceled, not-already-rerouted units. Re-read the order and ship advice after this step, then create the replacement assignment. After an ambiguous response, reconcile quantities before retrying.\n\nRequired permission: `ship_advice:create`.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"ship_advice_item_id\": 6001,\n  \"quantity_rerouted\": 1\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          }
        }
      ]
    },
    {
      "name": "Orders",
      "item": [
        {
          "name": "List orders",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              },
              {
                "key": "X-Astur-Organization",
                "value": "{{organization}}"
              }
            ],
            "url": {
              "raw": "{{base_url}}/order?limit=20&page=1",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "order"
              ],
              "query": [
                {
                  "key": "limit",
                  "value": "20",
                  "description": "Maximum records returned per page: 1 to 1000, with a default of 100. A page can contain fewer records.",
                  "disabled": false
                },
                {
                  "key": "page",
                  "value": "1",
                  "description": "Page number, starting at 1. Keep the same query, sort, and limit when requesting later pages. Stop when result is empty or null.",
                  "disabled": false
                },
                {
                  "key": "sort",
                  "value": "updated_at:-1,id:1",
                  "description": "Comma-separated field:direction entries, applied from left to right. Use field:1 for ascending order and field:-1 for descending order. For example, updated_at:-1,id:1 returns the newest updates first, then the lowest ID for equal timestamps. Add a unique ID as the final tie-breaker when paging.",
                  "disabled": true
                },
                {
                  "key": "query",
                  "value": "{\"status\":\"pending\"}",
                  "description": "A URL-encoded JSON object filtering supported top-level fields on this resource. Multiple fields in one object are combined with AND. Use JSON strings for text and JSON numbers for numeric IDs, and let your HTTP library encode the complete value.",
                  "disabled": true
                },
                {
                  "key": "unacked",
                  "value": "True",
                  "description": "Return only records not acknowledged by this API identity. Use page=1 while draining this changing queue. Fetching does not reserve records.",
                  "disabled": true
                }
              ],
              "variable": []
            },
            "description": "Read orders and their order_item arrays. Use this resource for line items instead of making separate order-item requests.\n\nRequired permission: `order:read`."
          }
        },
        {
          "name": "Create an order",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              },
              {
                "key": "X-Astur-Organization",
                "value": "{{organization}}"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/order",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "order"
              ],
              "query": [],
              "variable": []
            },
            "description": "Create an order snapshot using an existing sales channel and catalog items. Order details cannot be updated after creation through the supported API. This example disables automatic routing; an order without ship advice has no cancellation path in this reference. The pair external_order_id + sales_channel_id remains unique after cancellation. Contact Acenda for corrections that require deletion or preserving the original source ID.\n\nRequired permission: `order:create`.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"purchase_order\": \"PO-10042\",\n  \"external_order_id\": \"WEB-10042\",\n  \"sales_channel_id\": 7,\n  \"create_routings\": false,\n  \"shipping_information\": {\n    \"first_name\": \"Alex\",\n    \"last_name\": \"Morgan\",\n    \"address_1\": \"123 Example Street\",\n    \"city\": \"San Diego\",\n    \"state\": \"CA\",\n    \"postal_code\": \"92101\",\n    \"country\": \"US\"\n  },\n  \"billing_information\": {\n    \"first_name\": \"Alex\",\n    \"last_name\": \"Morgan\",\n    \"address_1\": \"123 Example Street\",\n    \"city\": \"San Diego\",\n    \"state\": \"CA\",\n    \"postal_code\": \"92101\",\n    \"country\": \"US\"\n  },\n  \"order_item\": [\n    {\n      \"external_sku\": \"TRAIL-MUG\",\n      \"sku\": \"TRAIL-MUG\",\n      \"product_id\": 101,\n      \"line_id\": \"1\",\n      \"quantity\": 2,\n      \"unit_price\": \"29.00\"\n    }\n  ],\n  \"item_tax\": \"0.00\",\n  \"ship_tax\": \"0.00\",\n  \"shipping\": \"0.00\",\n  \"total_item_discount\": \"0.00\",\n  \"total_shipping_discount\": \"0.00\",\n  \"subtotal\": \"58.00\",\n  \"total\": \"58.00\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          }
        },
        {
          "name": "Get an order",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              },
              {
                "key": "X-Astur-Organization",
                "value": "{{organization}}"
              },
              {
                "key": "If-None-Match",
                "value": "\"<saved-etag>\"",
                "description": "For a conditional single-record GET, send the exact single ETag copied from a previous 200 response, including its quotes. Reuse it only for the same URL, query, organization, and API identity.",
                "disabled": true
              }
            ],
            "url": {
              "raw": "{{base_url}}/order/:order",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "order",
                ":order"
              ],
              "query": [],
              "variable": [
                {
                  "key": "order",
                  "value": "10042"
                }
              ]
            },
            "description": "Retrieve an order snapshot, including its order_item records. Order details are immutable through the supported API; fulfillment and cancellation still update lifecycle state. Use ship advice for warehouse work generated by routing. This single-record GET supports If-None-Match with a previously saved ETag. A 304 response has no body; reuse the cached result. A 200 response supplies the current result and ETag.\n\nRequired permission: `order:read`."
          }
        },
        {
          "name": "Count orders",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              },
              {
                "key": "X-Astur-Organization",
                "value": "{{organization}}"
              }
            ],
            "url": {
              "raw": "{{base_url}}/order/count",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "order",
                "count"
              ],
              "query": [
                {
                  "key": "query",
                  "value": "{\"status\":\"pending\"}",
                  "description": "A URL-encoded JSON object filtering supported top-level fields on this resource. Multiple fields in one object are combined with AND. Use JSON strings for text and JSON numbers for numeric IDs, and let your HTTP library encode the complete value.",
                  "disabled": true
                }
              ],
              "variable": []
            },
            "description": "Count orders matching an optional query filter.\n\nRequired permission: `order:read`."
          }
        }
      ]
    },
    {
      "name": "Acknowledgments",
      "item": [
        {
          "name": "Find acknowledgments",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              },
              {
                "key": "X-Astur-Organization",
                "value": "{{organization}}"
              }
            ],
            "url": {
              "raw": "{{base_url}}/acknowledge/:resource?limit=20&page=1",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "acknowledge",
                ":resource"
              ],
              "query": [
                {
                  "key": "limit",
                  "value": "20",
                  "description": "Maximum records returned per page: 1 to 1000, with a default of 100. A page can contain fewer records.",
                  "disabled": false
                },
                {
                  "key": "page",
                  "value": "1",
                  "description": "Page number, starting at 1. Keep the same query, sort, and limit when requesting later pages. Stop when result is empty or null.",
                  "disabled": false
                },
                {
                  "key": "query",
                  "value": "{\"ref_id\":5001}",
                  "description": "Filter by resource reference; ref_id is the order or ship advice ID.",
                  "disabled": true
                }
              ],
              "variable": [
                {
                  "key": "resource",
                  "value": "ship_advice"
                }
              ]
            },
            "description": "List acknowledgment records for the current API identity. Filter query by ref_id to check whether your order or ship advice has already been acknowledged. An empty result can be null. Use this lookup after an ambiguous POST result, before deciding whether to retry.\n\nRequired permission: `order:read`."
          }
        },
        {
          "name": "Acknowledge a record",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              },
              {
                "key": "X-Astur-Organization",
                "value": "{{organization}}"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/acknowledge/:resource/:ref_id",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "acknowledge",
                ":resource",
                ":ref_id"
              ],
              "query": [],
              "variable": [
                {
                  "key": "resource",
                  "value": "ship_advice"
                },
                {
                  "key": "ref_id",
                  "value": "5001"
                }
              ]
            },
            "description": "Mark an order or ship advice as received by your API identity after you have durably processed it. This is a create operation, not an idempotent upsert: sending it twice can fail with a duplicate-record error. It does not mark an order shipped. The permission for either resource is order:create.\n\nRequired permission: `order:create`.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"external_id\": \"WMS-5001\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          }
        }
      ]
    },
    {
      "name": "Fulfillments",
      "item": [
        {
          "name": "List fulfillments",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              },
              {
                "key": "X-Astur-Organization",
                "value": "{{organization}}"
              }
            ],
            "url": {
              "raw": "{{base_url}}/fulfillment?limit=20&page=1",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "fulfillment"
              ],
              "query": [
                {
                  "key": "limit",
                  "value": "20",
                  "description": "Maximum records returned per page: 1 to 1000, with a default of 100. A page can contain fewer records.",
                  "disabled": false
                },
                {
                  "key": "page",
                  "value": "1",
                  "description": "Page number, starting at 1. Keep the same query, sort, and limit when requesting later pages. Stop when result is empty or null.",
                  "disabled": false
                },
                {
                  "key": "sort",
                  "value": "updated_at:-1,id:1",
                  "description": "Comma-separated field:direction entries, applied from left to right. Use field:1 for ascending order and field:-1 for descending order. For example, updated_at:-1,id:1 returns the newest updates first, then the lowest ID for equal timestamps. Add a unique ID as the final tie-breaker when paging.",
                  "disabled": true
                },
                {
                  "key": "query",
                  "value": "{\"ship_advice_id\":5001}",
                  "description": "A URL-encoded JSON object filtering supported top-level fields on this resource. Multiple fields in one object are combined with AND. Use JSON strings for text and JSON numbers for numeric IDs, and let your HTTP library encode the complete value.",
                  "disabled": true
                }
              ],
              "variable": []
            },
            "description": "Read shipment confirmations. Filter by ship_advice_id or external_id to reconcile your shipment source.\n\nRequired permission: `fulfillment:read`."
          }
        },
        {
          "name": "Get a fulfillment",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              },
              {
                "key": "X-Astur-Organization",
                "value": "{{organization}}"
              },
              {
                "key": "If-None-Match",
                "value": "\"<saved-etag>\"",
                "description": "For a conditional single-record GET, send the exact single ETag copied from a previous 200 response, including its quotes. Reuse it only for the same URL, query, organization, and API identity.",
                "disabled": true
              }
            ],
            "url": {
              "raw": "{{base_url}}/fulfillment/:fulfillment",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "fulfillment",
                ":fulfillment"
              ],
              "query": [],
              "variable": [
                {
                  "key": "fulfillment",
                  "value": "7001"
                }
              ]
            },
            "description": "Retrieve a recorded shipment and tracking information. This single-record GET supports If-None-Match with a previously saved ETag. A 304 response has no body; reuse the cached result. A 200 response supplies the current result and ETag.\n\nRequired permission: `fulfillment:read`."
          }
        },
        {
          "name": "Create fulfillment",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              },
              {
                "key": "X-Astur-Organization",
                "value": "{{organization}}"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/ship_advice/:shipadvice/fulfillment",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "ship_advice",
                ":shipadvice",
                "fulfillment"
              ],
              "query": [],
              "variable": [
                {
                  "key": "shipadvice",
                  "value": "5001"
                }
              ]
            },
            "description": "Confirm shipment against an existing ship advice. Use ship_advice_item_id, not order_item_id or sku, in fulfillment_items. Each quantity must fit the remaining fulfillable amount. Confirmation updates fulfillment state; external_id does not guarantee idempotency.\n\nRequired permission: `fulfillment:create`.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"carrier\": \"UPS\",\n  \"date_shipped\": \"2026-10-02T14:30:00Z\",\n  \"tracking_info\": [\n    {\n      \"number\": \"EXAMPLE-TRACKING-001\"\n    }\n  ],\n  \"fulfillment_items\": [\n    {\n      \"ship_advice_item_id\": 6001,\n      \"quantity\": 2\n    }\n  ],\n  \"external_id\": \"SHIP-10042-1\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          }
        }
      ]
    },
    {
      "name": "Returns",
      "item": [
        {
          "name": "List returns",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              },
              {
                "key": "X-Astur-Organization",
                "value": "{{organization}}"
              }
            ],
            "url": {
              "raw": "{{base_url}}/return?limit=20&page=1",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "return"
              ],
              "query": [
                {
                  "key": "limit",
                  "value": "20",
                  "description": "Maximum records returned per page: 1 to 1000, with a default of 100. A page can contain fewer records.",
                  "disabled": false
                },
                {
                  "key": "page",
                  "value": "1",
                  "description": "Page number, starting at 1. Keep the same query, sort, and limit when requesting later pages. Stop when result is empty or null.",
                  "disabled": false
                },
                {
                  "key": "sort",
                  "value": "updated_at:-1,id:1",
                  "description": "Comma-separated field:direction entries, applied from left to right. Use field:1 for ascending order and field:-1 for descending order. For example, updated_at:-1,id:1 returns the newest updates first, then the lowest ID for equal timestamps. Add a unique ID as the final tie-breaker when paging.",
                  "disabled": true
                },
                {
                  "key": "query",
                  "value": "{\"order_id\":10042}",
                  "description": "A URL-encoded JSON object filtering supported top-level fields on this resource. Multiple fields in one object are combined with AND. Use JSON strings for text and JSON numbers for numeric IDs, and let your HTTP library encode the complete value.",
                  "disabled": true
                }
              ],
              "variable": []
            },
            "description": "Read return records and return-shipment tracking. Filter by order_id or status. These reads report return state; they do not create a return or issue a refund.\n\nRequired permission: `return:read`."
          }
        },
        {
          "name": "Get a return",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              },
              {
                "key": "X-Astur-Organization",
                "value": "{{organization}}"
              },
              {
                "key": "If-None-Match",
                "value": "\"<saved-etag>\"",
                "description": "For a conditional single-record GET, send the exact single ETag copied from a previous 200 response, including its quotes. Reuse it only for the same URL, query, organization, and API identity.",
                "disabled": true
              }
            ],
            "url": {
              "raw": "{{base_url}}/return/:return",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "return",
                ":return"
              ],
              "query": [],
              "variable": [
                {
                  "key": "return",
                  "value": "801"
                }
              ]
            },
            "description": "Read one return record, including return-shipment tracking, by its Acenda return ID. This single-record GET supports If-None-Match with a previously saved ETag. A 304 response has no body; reuse the cached result. A 200 response supplies the current result and ETag.\n\nRequired permission: `return:read`."
          }
        },
        {
          "name": "List extended returns",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              },
              {
                "key": "X-Astur-Organization",
                "value": "{{organization}}"
              }
            ],
            "url": {
              "raw": "{{base_url}}/return_extended?limit=20&page=1",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "return_extended"
              ],
              "query": [
                {
                  "key": "limit",
                  "value": "20",
                  "description": "Maximum records returned per page: 1 to 1000, with a default of 100. A page can contain fewer records.",
                  "disabled": false
                },
                {
                  "key": "page",
                  "value": "1",
                  "description": "Page number, starting at 1. Keep the same query, sort, and limit when requesting later pages. Stop when result is empty or null.",
                  "disabled": false
                },
                {
                  "key": "sort",
                  "value": "updated_at:-1,id:1",
                  "description": "Comma-separated field:direction entries, applied from left to right. Use field:1 for ascending order and field:-1 for descending order. For example, updated_at:-1,id:1 returns the newest updates first, then the lowest ID for equal timestamps. Add a unique ID as the final tie-breaker when paging.",
                  "disabled": true
                },
                {
                  "key": "query",
                  "value": "{\"sku\":\"TRAIL-MUG\"}",
                  "description": "A URL-encoded JSON object filtering supported top-level fields on this resource. Multiple fields in one object are combined with AND. Use JSON strings for text and JSON numbers for numeric IDs, and let your HTTP library encode the complete value.",
                  "disabled": true
                }
              ],
              "variable": []
            },
            "description": "Read returns with product, SKU, and original-order context. Each id is the same return-record ID used by /return. Filter by top-level fields such as sku, order_id, or status. num_results is the number of records on the current page, not a total count.\n\nRequired permission: `return:read`."
          }
        },
        {
          "name": "Get an extended return",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              },
              {
                "key": "X-Astur-Organization",
                "value": "{{organization}}"
              },
              {
                "key": "If-None-Match",
                "value": "\"<saved-etag>\"",
                "description": "For a conditional single-record GET, send the exact single ETag copied from a previous 200 response, including its quotes. Reuse it only for the same URL, query, organization, and API identity.",
                "disabled": true
              }
            ],
            "url": {
              "raw": "{{base_url}}/return_extended/:id",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "return_extended",
                ":id"
              ],
              "query": [],
              "variable": [
                {
                  "key": "id",
                  "value": "801"
                }
              ]
            },
            "description": "Read one return with product and original-order context. The ID is the Acenda return-record ID, not a product, order, or order-item ID. If no record matches, this endpoint currently returns HTTP 200 with a default-valued record; verify that result.id matches the requested ID before using it. This single-record GET supports If-None-Match with a previously saved ETag. A 304 response has no body; reuse the cached result. A 200 response supplies the current result and ETag.\n\nRequired permission: `return:read`."
          }
        }
      ]
    },
    {
      "name": "Cancellations",
      "item": [
        {
          "name": "List ship advice cancellations",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              },
              {
                "key": "X-Astur-Organization",
                "value": "{{organization}}"
              }
            ],
            "url": {
              "raw": "{{base_url}}/ship_advice/:shipadvice/cancellation?limit=20&page=1",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "ship_advice",
                ":shipadvice",
                "cancellation"
              ],
              "query": [
                {
                  "key": "limit",
                  "value": "20",
                  "description": "Maximum records returned per page: 1 to 1000, with a default of 100. A page can contain fewer records.",
                  "disabled": false
                },
                {
                  "key": "page",
                  "value": "1",
                  "description": "Page number, starting at 1. Keep the same query, sort, and limit when requesting later pages. Stop when result is empty or null.",
                  "disabled": false
                },
                {
                  "key": "sort",
                  "value": "updated_at:-1,id:1",
                  "description": "Comma-separated field:direction entries, applied from left to right. Use field:1 for ascending order and field:-1 for descending order. For example, updated_at:-1,id:1 returns the newest updates first, then the lowest ID for equal timestamps. Add a unique ID as the final tie-breaker when paging.",
                  "disabled": true
                }
              ],
              "variable": [
                {
                  "key": "shipadvice",
                  "value": "5001"
                }
              ]
            },
            "description": "Read cancellation records for this ship advice. Use these records and current ship advice item quantities to reconcile an ambiguous cancellation response.\n\nRequired permission: `cancellation:read`."
          }
        },
        {
          "name": "Cancel unfulfilled items",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              },
              {
                "key": "X-Astur-Organization",
                "value": "{{organization}}"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/ship_advice/:shipadvice/cancellation",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "ship_advice",
                ":shipadvice",
                "cancellation"
              ],
              "query": [],
              "variable": [
                {
                  "key": "shipadvice",
                  "value": "5001"
                }
              ]
            },
            "description": "Cancel remaining units on an existing ship advice using ship_advice_item_id and quantity. Cancellation records are immutable. New cancellation records return 201. A canonical retry for an already fully canceled item returns 200 with a null result; this narrow behavior is not a general idempotency guarantee for partial cancellations. Re-read state after an ambiguous response. Cancellation retains the original order and its external_order_id. It does not make that ID reusable within the same sales_channel_id. It cannot cancel quantities already fulfilled.\n\nRequired permission: `cancellation:create`.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"reason\": \"Unable to fulfill\",\n  \"cancellation_items\": [\n    {\n      \"ship_advice_item_id\": 6001,\n      \"quantity\": 1\n    }\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          }
        }
      ]
    }
  ]
}
