{
 "info": {
  "_postman_id": "indigo-apple-store-seller-api-v1",
  "name": "Indigo Apple Store - Seller Integration API (i-planet)",
  "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json",
  "description": "Indigo Apple Store - Seller Integration API, for the i-planet ERP. Generated from openapi.yaml by tools/partner/gen_seller_postman.py - every request carries an example body and saved example responses (success and failure).\n\n## Start here\n\n1. Set `apiKey` and `apiSecret` in the collection **Variables** tab (never commit them).\n2. Run **Authentication -> Exchange your API key...** - it stores `accessToken` automatically.\n3. Tokens last 15 minutes; run it again when calls start returning 401.\n4. Calls must come from an IP on your allowlist.\n\n## Remember\n\n- Business refusals are HTTP 200 with `\"status\": \"FAIL\"` - read the envelope.\n- Status calls take SUB-ORDER numbers (`grouporderid`, e.g. IASG1216) and answer per sub-order in `successMap` / `errorMap`.\n- Stock `quantity` is ABSOLUTE (it replaces the current stock). Prices wait for store approval.\n- Status, stock and price requests change REAL data.\n\nFull reference: https://indigoappleshop-partnerapi.dealyug.com/docs/\n"
 },
 "variable": [
  {
   "key": "baseUrl",
   "value": "https://indigoappleshop-partnerapi.dealyug.com/v1",
   "type": "string"
  },
  {
   "key": "apiKey",
   "value": "",
   "type": "string"
  },
  {
   "key": "apiSecret",
   "value": "",
   "type": "string"
  },
  {
   "key": "accessToken",
   "value": "",
   "type": "string"
  },
  {
   "key": "orderId",
   "value": "IA1216",
   "type": "string"
  },
  {
   "key": "subOrderId",
   "value": "IASG1216",
   "type": "string"
  },
  {
   "key": "orderDateAndTime",
   "value": "2026-10-14 15:30:00",
   "type": "string"
  }
 ],
 "item": [
  {
   "name": "1. Authentication",
   "item": [
    {
     "name": "Exchange your API key + secret for a 15-minute access token",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "Content-Type",
        "value": "application/json"
       }
      ],
      "url": {
       "raw": "{{baseUrl}}/auth/token",
       "host": [
        "{{baseUrl}}"
       ],
       "path": [
        "auth",
        "token"
       ]
      },
      "description": "Exchange your API key + secret for a 15-minute access token\n\nThe only call that takes no token - it mints the one every other call presents in\n`Authorization: Bearer <accessToken>`. The token lives `expiresIn` seconds (900 = 15 minutes) and\nthere is **no refresh token**: call this again when it expires or on the first `401`.\n\n- Every failure (unknown key, wrong secret, suspended or expired credential) answers the **same**\n  `401 \"Request could not be authorized.\"` - the real reason is recorded on our side.\n- Throttled per source IP and API key: after repeated failures you get\n  `429 \"Too many login attempts. Please try again later.\"` for about a minute.\n- `scopes` lists what this credential may call.\n",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"apiKey\": \"{{apiKey}}\",\n  \"apiSecret\": \"{{apiSecret}}\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     },
     "response": [
      {
       "name": "Token issued",
       "originalRequest": {
        "method": "POST",
        "header": [
         {
          "key": "Content-Type",
          "value": "application/json"
         }
        ],
        "url": {
         "raw": "{{baseUrl}}/auth/token",
         "host": [
          "{{baseUrl}}"
         ],
         "path": [
          "auth",
          "token"
         ]
        },
        "description": "Exchange your API key + secret for a 15-minute access token\n\nThe only call that takes no token - it mints the one every other call presents in\n`Authorization: Bearer <accessToken>`. The token lives `expiresIn` seconds (900 = 15 minutes) and\nthere is **no refresh token**: call this again when it expires or on the first `401`.\n\n- Every failure (unknown key, wrong secret, suspended or expired credential) answers the **same**\n  `401 \"Request could not be authorized.\"` - the real reason is recorded on our side.\n- Throttled per source IP and API key: after repeated failures you get\n  `429 \"Too many login attempts. Please try again later.\"` for about a minute.\n- `scopes` lists what this credential may call.\n",
        "body": {
         "mode": "raw",
         "raw": "{\n  \"apiKey\": \"{{apiKey}}\",\n  \"apiSecret\": \"{{apiSecret}}\"\n}",
         "options": {
          "raw": {
           "language": "json"
          }
         }
        }
       },
       "status": "OK",
       "code": 200,
       "_postman_previewlanguage": "json",
       "header": [
        {
         "key": "Content-Type",
         "value": "application/json"
        }
       ],
       "cookie": [],
       "body": "{\n  \"status\": \"SUCCESS\",\n  \"message\": \"Token issued.\",\n  \"response\": {\n    \"accessToken\": \"eyJhbGciOiJIUzI1NiJ9.<redacted>.<redacted>\",\n    \"tokenType\": \"Bearer\",\n    \"expiresIn\": 900,\n    \"scopes\": [\n      \"seller:orders:read\",\n      \"seller:orders:write\",\n      \"seller:sku:write\"\n    ]\n  }\n}"
      },
      {
       "name": "401 - Rejected",
       "originalRequest": {
        "method": "POST",
        "header": [
         {
          "key": "Content-Type",
          "value": "application/json"
         }
        ],
        "url": {
         "raw": "{{baseUrl}}/auth/token",
         "host": [
          "{{baseUrl}}"
         ],
         "path": [
          "auth",
          "token"
         ]
        },
        "description": "Exchange your API key + secret for a 15-minute access token\n\nThe only call that takes no token - it mints the one every other call presents in\n`Authorization: Bearer <accessToken>`. The token lives `expiresIn` seconds (900 = 15 minutes) and\nthere is **no refresh token**: call this again when it expires or on the first `401`.\n\n- Every failure (unknown key, wrong secret, suspended or expired credential) answers the **same**\n  `401 \"Request could not be authorized.\"` - the real reason is recorded on our side.\n- Throttled per source IP and API key: after repeated failures you get\n  `429 \"Too many login attempts. Please try again later.\"` for about a minute.\n- `scopes` lists what this credential may call.\n",
        "body": {
         "mode": "raw",
         "raw": "{\n  \"apiKey\": \"{{apiKey}}\",\n  \"apiSecret\": \"{{apiSecret}}\"\n}",
         "options": {
          "raw": {
           "language": "json"
          }
         }
        }
       },
       "status": "Unauthorized",
       "code": 401,
       "_postman_previewlanguage": "json",
       "header": [
        {
         "key": "Content-Type",
         "value": "application/json"
        }
       ],
       "cookie": [],
       "body": "{\n  \"status\": \"FAIL\",\n  \"message\": \"Request could not be authorized.\",\n  \"response\": null\n}"
      }
     ],
     "event": [
      {
       "listen": "test",
       "script": {
        "type": "text/javascript",
        "exec": [
         "const b = pm.response.json();",
         "pm.test('token issued', () => pm.expect(b.status).to.eql('SUCCESS'));",
         "if (b.status === 'SUCCESS') {",
         "  // Collection variable, so the collection is self-contained: set apiKey/apiSecret and go.",
         "  pm.collectionVariables.set('accessToken', b.response.accessToken);",
         "  console.log('Token stored; scopes granted:', b.response.scopes, 'expires in', b.response.expiresIn, 's');",
         "} else {",
         "  console.error('Auth failed (one message for every cause; quote X-Request-Id to support):',",
         "                pm.response.headers.get('X-Request-Id'));",
         "}"
        ]
       }
      }
     ]
    }
   ]
  },
  {
   "name": "2. Orders  (scope: seller:orders:read)",
   "item": [
    {
     "name": "List orders that became ready for you (Order Confirm) in a 24-hour window",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "X-Api-Key",
        "value": "{{apiKey}}"
       },
       {
        "key": "Authorization",
        "value": "Bearer {{accessToken}}"
       },
       {
        "key": "Content-Type",
        "value": "application/json"
       }
      ],
      "url": {
       "raw": "{{baseUrl}}/seller/orders/sync",
       "host": [
        "{{baseUrl}}"
       ],
       "path": [
        "seller",
        "orders",
        "sync"
       ],
       "query": [
        {
         "key": "orderDateAndTime",
         "value": "{{orderDateAndTime}}",
         "description": "END of the 24-hour window, IST. `yyyy-MM-dd HH:mm:ss`, or `yyyy-MM-dd` (= that day 00:00:00, so the window is the whole previous day). Default: now.",
         "disabled": true
        }
       ]
      },
      "description": "List orders that became ready for you (Order Confirm) in a 24-hour window\n\n**Scope `seller:orders:read`.** Returns the **orders** (`orderId` = payment order number) that contain\nat least one of **your** sub-orders which **reached status 110 \"Order Confirm\"** in the **24 hours\nending at `orderDateAndTime`** (IST). Omit `orderDateAndTime` to mean \"now\".\n\nUse it as an inbox: for each `orderId`, call `POST /seller/orders/detail?orderId=...` to get your\nsub-orders with the delivery address and amounts.\n\n- **One entry per order.** `subOrderId` is **one** of your sub-orders in that order, given as a\n  hint only - an order can hold several of your sub-orders, so always import from\n  `/seller/orders/detail`, which returns **all** of them.\n- The same order is returned by every call whose window covers the moment it reached 110, so\n  **de-duplicate on `grouporderid`** (from the detail) in your ERP.\n- An order reaching 110 more than 24 hours before `orderDateAndTime` is not returned; to catch up\n  after an outage, call again with earlier `orderDateAndTime` values in 24-hour steps.\n- Only orders of the store this credential is bound to are returned.\n- Send `orderDateAndTime` in the **query string**.\n\n**`\"status\": \"FAIL\"` with `\"The record not found\"` means \"no new orders in this window\" - it is\nnot an error.** Treat it as an empty list.\n\nBusiness messages (HTTP 200, `\"status\": \"FAIL\"`):\n\n| Message | Meaning |\n|---|---|\n| `The record not found` | No orders in the window. Normal. |\n| `orderDateAndTime must be yyyy-MM-dd or yyyy-MM-dd HH:mm:ss` | Bad date format. |\n| `Seller not found for authenticated user.` | Your credential is linked to more than one seller account - contact us. |\n| `Error` | Unexpected server error - retry later and quote `X-Request-Id`. |\n"
     },
     "response": [
      {
       "name": "Orders found",
       "originalRequest": {
        "method": "POST",
        "header": [
         {
          "key": "X-Api-Key",
          "value": "{{apiKey}}"
         },
         {
          "key": "Authorization",
          "value": "Bearer {{accessToken}}"
         },
         {
          "key": "Content-Type",
          "value": "application/json"
         }
        ],
        "url": {
         "raw": "{{baseUrl}}/seller/orders/sync",
         "host": [
          "{{baseUrl}}"
         ],
         "path": [
          "seller",
          "orders",
          "sync"
         ],
         "query": [
          {
           "key": "orderDateAndTime",
           "value": "{{orderDateAndTime}}",
           "description": "END of the 24-hour window, IST. `yyyy-MM-dd HH:mm:ss`, or `yyyy-MM-dd` (= that day 00:00:00, so the window is the whole previous day). Default: now.",
           "disabled": true
          }
         ]
        },
        "description": "List orders that became ready for you (Order Confirm) in a 24-hour window\n\n**Scope `seller:orders:read`.** Returns the **orders** (`orderId` = payment order number) that contain\nat least one of **your** sub-orders which **reached status 110 \"Order Confirm\"** in the **24 hours\nending at `orderDateAndTime`** (IST). Omit `orderDateAndTime` to mean \"now\".\n\nUse it as an inbox: for each `orderId`, call `POST /seller/orders/detail?orderId=...` to get your\nsub-orders with the delivery address and amounts.\n\n- **One entry per order.** `subOrderId` is **one** of your sub-orders in that order, given as a\n  hint only - an order can hold several of your sub-orders, so always import from\n  `/seller/orders/detail`, which returns **all** of them.\n- The same order is returned by every call whose window covers the moment it reached 110, so\n  **de-duplicate on `grouporderid`** (from the detail) in your ERP.\n- An order reaching 110 more than 24 hours before `orderDateAndTime` is not returned; to catch up\n  after an outage, call again with earlier `orderDateAndTime` values in 24-hour steps.\n- Only orders of the store this credential is bound to are returned.\n- Send `orderDateAndTime` in the **query string**.\n\n**`\"status\": \"FAIL\"` with `\"The record not found\"` means \"no new orders in this window\" - it is\nnot an error.** Treat it as an empty list.\n\nBusiness messages (HTTP 200, `\"status\": \"FAIL\"`):\n\n| Message | Meaning |\n|---|---|\n| `The record not found` | No orders in the window. Normal. |\n| `orderDateAndTime must be yyyy-MM-dd or yyyy-MM-dd HH:mm:ss` | Bad date format. |\n| `Seller not found for authenticated user.` | Your credential is linked to more than one seller account - contact us. |\n| `Error` | Unexpected server error - retry later and quote `X-Request-Id`. |\n"
       },
       "status": "OK",
       "code": 200,
       "_postman_previewlanguage": "json",
       "header": [
        {
         "key": "Content-Type",
         "value": "application/json"
        }
       ],
       "cookie": [],
       "body": "{\n  \"status\": \"SUCCESS\",\n  \"message\": \"Record found successfully\",\n  \"response\": {\n    \"orderIdList\": [\n      {\n        \"orderId\": \"IA1216\",\n        \"subOrderId\": \"IASG1216\"\n      },\n      {\n        \"orderId\": \"IA1219\",\n        \"subOrderId\": \"IASG1220\"\n      }\n    ]\n  }\n}"
      },
      {
       "name": "No new orders in the window (normal - treat as empty)",
       "originalRequest": {
        "method": "POST",
        "header": [
         {
          "key": "X-Api-Key",
          "value": "{{apiKey}}"
         },
         {
          "key": "Authorization",
          "value": "Bearer {{accessToken}}"
         },
         {
          "key": "Content-Type",
          "value": "application/json"
         }
        ],
        "url": {
         "raw": "{{baseUrl}}/seller/orders/sync",
         "host": [
          "{{baseUrl}}"
         ],
         "path": [
          "seller",
          "orders",
          "sync"
         ],
         "query": [
          {
           "key": "orderDateAndTime",
           "value": "{{orderDateAndTime}}",
           "description": "END of the 24-hour window, IST. `yyyy-MM-dd HH:mm:ss`, or `yyyy-MM-dd` (= that day 00:00:00, so the window is the whole previous day). Default: now.",
           "disabled": true
          }
         ]
        },
        "description": "List orders that became ready for you (Order Confirm) in a 24-hour window\n\n**Scope `seller:orders:read`.** Returns the **orders** (`orderId` = payment order number) that contain\nat least one of **your** sub-orders which **reached status 110 \"Order Confirm\"** in the **24 hours\nending at `orderDateAndTime`** (IST). Omit `orderDateAndTime` to mean \"now\".\n\nUse it as an inbox: for each `orderId`, call `POST /seller/orders/detail?orderId=...` to get your\nsub-orders with the delivery address and amounts.\n\n- **One entry per order.** `subOrderId` is **one** of your sub-orders in that order, given as a\n  hint only - an order can hold several of your sub-orders, so always import from\n  `/seller/orders/detail`, which returns **all** of them.\n- The same order is returned by every call whose window covers the moment it reached 110, so\n  **de-duplicate on `grouporderid`** (from the detail) in your ERP.\n- An order reaching 110 more than 24 hours before `orderDateAndTime` is not returned; to catch up\n  after an outage, call again with earlier `orderDateAndTime` values in 24-hour steps.\n- Only orders of the store this credential is bound to are returned.\n- Send `orderDateAndTime` in the **query string**.\n\n**`\"status\": \"FAIL\"` with `\"The record not found\"` means \"no new orders in this window\" - it is\nnot an error.** Treat it as an empty list.\n\nBusiness messages (HTTP 200, `\"status\": \"FAIL\"`):\n\n| Message | Meaning |\n|---|---|\n| `The record not found` | No orders in the window. Normal. |\n| `orderDateAndTime must be yyyy-MM-dd or yyyy-MM-dd HH:mm:ss` | Bad date format. |\n| `Seller not found for authenticated user.` | Your credential is linked to more than one seller account - contact us. |\n| `Error` | Unexpected server error - retry later and quote `X-Request-Id`. |\n"
       },
       "status": "OK",
       "code": 200,
       "_postman_previewlanguage": "json",
       "header": [
        {
         "key": "Content-Type",
         "value": "application/json"
        }
       ],
       "cookie": [],
       "body": "{\n  \"status\": \"FAIL\",\n  \"message\": \"The record not found\",\n  \"response\": null\n}"
      },
      {
       "name": "Bad orderDateAndTime format",
       "originalRequest": {
        "method": "POST",
        "header": [
         {
          "key": "X-Api-Key",
          "value": "{{apiKey}}"
         },
         {
          "key": "Authorization",
          "value": "Bearer {{accessToken}}"
         },
         {
          "key": "Content-Type",
          "value": "application/json"
         }
        ],
        "url": {
         "raw": "{{baseUrl}}/seller/orders/sync",
         "host": [
          "{{baseUrl}}"
         ],
         "path": [
          "seller",
          "orders",
          "sync"
         ],
         "query": [
          {
           "key": "orderDateAndTime",
           "value": "{{orderDateAndTime}}",
           "description": "END of the 24-hour window, IST. `yyyy-MM-dd HH:mm:ss`, or `yyyy-MM-dd` (= that day 00:00:00, so the window is the whole previous day). Default: now.",
           "disabled": true
          }
         ]
        },
        "description": "List orders that became ready for you (Order Confirm) in a 24-hour window\n\n**Scope `seller:orders:read`.** Returns the **orders** (`orderId` = payment order number) that contain\nat least one of **your** sub-orders which **reached status 110 \"Order Confirm\"** in the **24 hours\nending at `orderDateAndTime`** (IST). Omit `orderDateAndTime` to mean \"now\".\n\nUse it as an inbox: for each `orderId`, call `POST /seller/orders/detail?orderId=...` to get your\nsub-orders with the delivery address and amounts.\n\n- **One entry per order.** `subOrderId` is **one** of your sub-orders in that order, given as a\n  hint only - an order can hold several of your sub-orders, so always import from\n  `/seller/orders/detail`, which returns **all** of them.\n- The same order is returned by every call whose window covers the moment it reached 110, so\n  **de-duplicate on `grouporderid`** (from the detail) in your ERP.\n- An order reaching 110 more than 24 hours before `orderDateAndTime` is not returned; to catch up\n  after an outage, call again with earlier `orderDateAndTime` values in 24-hour steps.\n- Only orders of the store this credential is bound to are returned.\n- Send `orderDateAndTime` in the **query string**.\n\n**`\"status\": \"FAIL\"` with `\"The record not found\"` means \"no new orders in this window\" - it is\nnot an error.** Treat it as an empty list.\n\nBusiness messages (HTTP 200, `\"status\": \"FAIL\"`):\n\n| Message | Meaning |\n|---|---|\n| `The record not found` | No orders in the window. Normal. |\n| `orderDateAndTime must be yyyy-MM-dd or yyyy-MM-dd HH:mm:ss` | Bad date format. |\n| `Seller not found for authenticated user.` | Your credential is linked to more than one seller account - contact us. |\n| `Error` | Unexpected server error - retry later and quote `X-Request-Id`. |\n"
       },
       "status": "OK",
       "code": 200,
       "_postman_previewlanguage": "json",
       "header": [
        {
         "key": "Content-Type",
         "value": "application/json"
        }
       ],
       "cookie": [],
       "body": "{\n  \"status\": \"FAIL\",\n  \"message\": \"orderDateAndTime must be yyyy-MM-dd or yyyy-MM-dd HH:mm:ss\",\n  \"response\": null\n}"
      },
      {
       "name": "401 - E_AUTH",
       "originalRequest": {
        "method": "POST",
        "header": [
         {
          "key": "X-Api-Key",
          "value": "{{apiKey}}"
         },
         {
          "key": "Authorization",
          "value": "Bearer {{accessToken}}"
         },
         {
          "key": "Content-Type",
          "value": "application/json"
         }
        ],
        "url": {
         "raw": "{{baseUrl}}/seller/orders/sync",
         "host": [
          "{{baseUrl}}"
         ],
         "path": [
          "seller",
          "orders",
          "sync"
         ],
         "query": [
          {
           "key": "orderDateAndTime",
           "value": "{{orderDateAndTime}}",
           "description": "END of the 24-hour window, IST. `yyyy-MM-dd HH:mm:ss`, or `yyyy-MM-dd` (= that day 00:00:00, so the window is the whole previous day). Default: now.",
           "disabled": true
          }
         ]
        },
        "description": "List orders that became ready for you (Order Confirm) in a 24-hour window\n\n**Scope `seller:orders:read`.** Returns the **orders** (`orderId` = payment order number) that contain\nat least one of **your** sub-orders which **reached status 110 \"Order Confirm\"** in the **24 hours\nending at `orderDateAndTime`** (IST). Omit `orderDateAndTime` to mean \"now\".\n\nUse it as an inbox: for each `orderId`, call `POST /seller/orders/detail?orderId=...` to get your\nsub-orders with the delivery address and amounts.\n\n- **One entry per order.** `subOrderId` is **one** of your sub-orders in that order, given as a\n  hint only - an order can hold several of your sub-orders, so always import from\n  `/seller/orders/detail`, which returns **all** of them.\n- The same order is returned by every call whose window covers the moment it reached 110, so\n  **de-duplicate on `grouporderid`** (from the detail) in your ERP.\n- An order reaching 110 more than 24 hours before `orderDateAndTime` is not returned; to catch up\n  after an outage, call again with earlier `orderDateAndTime` values in 24-hour steps.\n- Only orders of the store this credential is bound to are returned.\n- Send `orderDateAndTime` in the **query string**.\n\n**`\"status\": \"FAIL\"` with `\"The record not found\"` means \"no new orders in this window\" - it is\nnot an error.** Treat it as an empty list.\n\nBusiness messages (HTTP 200, `\"status\": \"FAIL\"`):\n\n| Message | Meaning |\n|---|---|\n| `The record not found` | No orders in the window. Normal. |\n| `orderDateAndTime must be yyyy-MM-dd or yyyy-MM-dd HH:mm:ss` | Bad date format. |\n| `Seller not found for authenticated user.` | Your credential is linked to more than one seller account - contact us. |\n| `Error` | Unexpected server error - retry later and quote `X-Request-Id`. |\n"
       },
       "status": "Unauthorized",
       "code": 401,
       "_postman_previewlanguage": "json",
       "header": [
        {
         "key": "Content-Type",
         "value": "application/json"
        }
       ],
       "cookie": [],
       "body": "{\n  \"status\": \"FAIL\",\n  \"message\": \"Request could not be authorized.\",\n  \"response\": {\n    \"code\": \"E_AUTH\",\n    \"requestId\": \"0d6f4f2e-3c1a-4a43-9f63-1f2a7c9b8e10\"\n  }\n}"
      }
     ],
     "event": [
      {
       "listen": "test",
       "script": {
        "type": "text/javascript",
        "exec": [
         "// Business refusals are HTTP 200 with status FAIL - always look at the envelope.",
         "const b = pm.response.json();",
         "pm.test('envelope present', () => pm.expect(b).to.have.property('status'));",
         "if (b.status !== 'SUCCESS') { console.warn('FAIL:', b.message, 'X-Request-Id', pm.response.headers.get('X-Request-Id')); }"
        ]
       }
      }
     ]
    },
    {
     "name": "Full detail of one order - your sub-orders only",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "X-Api-Key",
        "value": "{{apiKey}}"
       },
       {
        "key": "Authorization",
        "value": "Bearer {{accessToken}}"
       },
       {
        "key": "Content-Type",
        "value": "application/json"
       }
      ],
      "url": {
       "raw": "{{baseUrl}}/seller/orders/detail?orderId={{orderId}}",
       "host": [
        "{{baseUrl}}"
       ],
       "path": [
        "seller",
        "orders",
        "detail"
       ],
       "query": [
        {
         "key": "orderId",
         "value": "{{orderId}}",
         "description": "The order number (`orderId` from the order sync / `paymentorderid`). Letters, digits, `-`, `_`; max 64."
        }
       ]
      },
      "description": "Full detail of one order - your sub-orders only\n\n**Scope `seller:orders:read`.** Pass the `orderId` returned by `/seller/orders/sync` (the payment\norder number, e.g. `IA1216` - **not** a sub-order number). Returns `orderDetails`: one entry per\n**your** sub-order in that order (other sellers' items are never included). Each sub-order is one\nSKU line with its quantity.\n\nWhat to use for fulfilment:\n\n| Need | Field(s) |\n|---|---|\n| Sub-order number for every status call | `grouporderid` |\n| Order number | `paymentorderid` |\n| What to ship | `skuName`, `skuCode` (the **store's** SKU code), `quantity` |\n| Ship to | `consigneeName`, `consigneeAddress`, `consigneeLandmark`, `consigneeCity`, `consigneeState`, `consigneePincode`, `countryName`, `consigneeMobilenNo`, `consigneeAltPhoneNo` |\n| Where it is in the flow - and which status API is next | `statusId`, `statusName` (110 -> confirm, 106 -> dispatch, 116 -> deliver or rto, 120/125 -> done) |\n| Cash to collect | `paymentMode` = `PREPAID` (paid online) or `POSTPAID` (**cash on delivery**), `balanceDue` (amount still to collect), `paymentOptionName` |\n| Prices | `mrp`, `offerprice`, `shippingcost`, `totalamount`, `totalpayable`, `amountpaid` |\n\nNotes:\n\n- The order detail returns your sub-orders **in every status** (not only 110), so it also works to\n  re-read where a sub-order stands.\n- `skuCode` is the store's SKU code, not your `sellerskucode`; map it in your ERP (we can send you\n  the mapping list).\n- `orderDate` is `dd/MM/yyyy`, `orderDateTime` is `dd/MM/yyyy hh:mm a`-style, both IST.\n- `awbNo` is an AWB assigned **by the store's own logistics**, if any. The courier/AWB you send with\n  `/seller/orders/dispatch` is recorded in the order's status history and is not echoed here.\n- `taxamount` is currently always `null` in this response.\n- The customer's personal data is given to you **only to fulfil the order**; do not use it for\n  anything else.\n\nBusiness messages (HTTP 200, `\"status\": \"FAIL\"`):\n\n| Message | Meaning |\n|---|---|\n| `The record not found` | No sub-order of yours in that order (unknown number, another seller's order, or a sub-order number was sent). |\n| `orderId is required (the order number returned by the order sync).` | `orderId` missing or not alphanumeric. |\n| `Seller not found for authenticated user.` | Your credential is linked to more than one seller account - contact us. |\n"
     },
     "response": [
      {
       "name": "Two of your sub-orders: one prepaid, one cash on delivery",
       "originalRequest": {
        "method": "POST",
        "header": [
         {
          "key": "X-Api-Key",
          "value": "{{apiKey}}"
         },
         {
          "key": "Authorization",
          "value": "Bearer {{accessToken}}"
         },
         {
          "key": "Content-Type",
          "value": "application/json"
         }
        ],
        "url": {
         "raw": "{{baseUrl}}/seller/orders/detail?orderId={{orderId}}",
         "host": [
          "{{baseUrl}}"
         ],
         "path": [
          "seller",
          "orders",
          "detail"
         ],
         "query": [
          {
           "key": "orderId",
           "value": "{{orderId}}",
           "description": "The order number (`orderId` from the order sync / `paymentorderid`). Letters, digits, `-`, `_`; max 64."
          }
         ]
        },
        "description": "Full detail of one order - your sub-orders only\n\n**Scope `seller:orders:read`.** Pass the `orderId` returned by `/seller/orders/sync` (the payment\norder number, e.g. `IA1216` - **not** a sub-order number). Returns `orderDetails`: one entry per\n**your** sub-order in that order (other sellers' items are never included). Each sub-order is one\nSKU line with its quantity.\n\nWhat to use for fulfilment:\n\n| Need | Field(s) |\n|---|---|\n| Sub-order number for every status call | `grouporderid` |\n| Order number | `paymentorderid` |\n| What to ship | `skuName`, `skuCode` (the **store's** SKU code), `quantity` |\n| Ship to | `consigneeName`, `consigneeAddress`, `consigneeLandmark`, `consigneeCity`, `consigneeState`, `consigneePincode`, `countryName`, `consigneeMobilenNo`, `consigneeAltPhoneNo` |\n| Where it is in the flow - and which status API is next | `statusId`, `statusName` (110 -> confirm, 106 -> dispatch, 116 -> deliver or rto, 120/125 -> done) |\n| Cash to collect | `paymentMode` = `PREPAID` (paid online) or `POSTPAID` (**cash on delivery**), `balanceDue` (amount still to collect), `paymentOptionName` |\n| Prices | `mrp`, `offerprice`, `shippingcost`, `totalamount`, `totalpayable`, `amountpaid` |\n\nNotes:\n\n- The order detail returns your sub-orders **in every status** (not only 110), so it also works to\n  re-read where a sub-order stands.\n- `skuCode` is the store's SKU code, not your `sellerskucode`; map it in your ERP (we can send you\n  the mapping list).\n- `orderDate` is `dd/MM/yyyy`, `orderDateTime` is `dd/MM/yyyy hh:mm a`-style, both IST.\n- `awbNo` is an AWB assigned **by the store's own logistics**, if any. The courier/AWB you send with\n  `/seller/orders/dispatch` is recorded in the order's status history and is not echoed here.\n- `taxamount` is currently always `null` in this response.\n- The customer's personal data is given to you **only to fulfil the order**; do not use it for\n  anything else.\n\nBusiness messages (HTTP 200, `\"status\": \"FAIL\"`):\n\n| Message | Meaning |\n|---|---|\n| `The record not found` | No sub-order of yours in that order (unknown number, another seller's order, or a sub-order number was sent). |\n| `orderId is required (the order number returned by the order sync).` | `orderId` missing or not alphanumeric. |\n| `Seller not found for authenticated user.` | Your credential is linked to more than one seller account - contact us. |\n"
       },
       "status": "OK",
       "code": 200,
       "_postman_previewlanguage": "json",
       "header": [
        {
         "key": "Content-Type",
         "value": "application/json"
        }
       ],
       "cookie": [],
       "body": "{\n  \"status\": \"SUCCESS\",\n  \"message\": \"Record found successfully\",\n  \"response\": {\n    \"orderDetails\": [\n      {\n        \"id\": 5123,\n        \"grouporderid\": \"IASG1216\",\n        \"paymentorderid\": \"IA1216\",\n        \"offername\": \"Apple iPhone 16 Pro 256GB Natural Titanium\",\n        \"sellerName\": \"i-planet\",\n        \"skuParentId\": 4410,\n        \"skuId\": 4412,\n        \"skuName\": \"Apple iPhone 16 Pro 256GB Natural Titanium\",\n        \"skuCode\": \"IAS-IPH16P-256-NT\",\n        \"statusName\": \"Order Confirm\",\n        \"whName\": \"i-planet Warehouse\",\n        \"consigneeName\": \"Test Customer\",\n        \"consigneeMobilenNo\": \"9876500000\",\n        \"consigneeAddress\": \"12 Example Street\",\n        \"consigneeLandmark\": \"Near Example Park\",\n        \"consigneeCity\": \"Mumbai\",\n        \"consigneeState\": \"Maharashtra\",\n        \"quantity\": 1,\n        \"mrp\": 129900.0,\n        \"offerprice\": 119900.0,\n        \"shippingcost\": 0.0,\n        \"totalamount\": 119900.0,\n        \"taxamount\": null,\n        \"cv\": null,\n        \"cvamount\": 0.0,\n        \"rewardPoint\": 0.0,\n        \"rewardPointAmount\": 0.0,\n        \"totalpayable\": 119900.0,\n        \"amountpaid\": 119900.0,\n        \"orderDate\": \"14/10/2026\",\n        \"customerViewDate\": \"Tue 14 Oct 2026\",\n        \"countryName\": \"India\",\n        \"countryCode\": \"IN\",\n        \"customerType\": null,\n        \"snapSkuId\": 4412,\n        \"snapSkuParentId\": 4410,\n        \"orderDateTime\": \"14/10/2026 15:05 PM\",\n        \"consigneePincode\": \"400001\",\n        \"consigneeAltPhoneNo\": null,\n        \"statusId\": 110,\n        \"paymentMode\": \"PREPAID\",\n        \"paymentOptionName\": \"Online Payment\",\n        \"awbNo\": null,\n        \"balanceDue\": 0.0\n      },\n      {\n        \"id\": 5124,\n        \"grouporderid\": \"IASG1217\",\n        \"paymentorderid\": \"IA1216\",\n        \"offername\": \"Apple AirPods Pro (2nd generation) USB-C\",\n        \"sellerName\": \"i-planet\",\n        \"skuParentId\": 4501,\n        \"skuId\": 4501,\n        \"skuName\": \"Apple AirPods Pro (2nd generation) USB-C\",\n        \"skuCode\": \"IAS-APP2-USBC\",\n        \"statusName\": \"Order Confirm\",\n        \"whName\": \"i-planet Warehouse\",\n        \"consigneeName\": \"Test Customer\",\n        \"consigneeMobilenNo\": \"9876500000\",\n        \"consigneeAddress\": \"12 Example Street\",\n        \"consigneeLandmark\": \"Near Example Park\",\n        \"consigneeCity\": \"Mumbai\",\n        \"consigneeState\": \"Maharashtra\",\n        \"quantity\": 1,\n        \"mrp\": 24900.0,\n        \"offerprice\": 22900.0,\n        \"shippingcost\": 0.0,\n        \"totalamount\": 22900.0,\n        \"taxamount\": null,\n        \"cv\": null,\n        \"cvamount\": 0.0,\n        \"rewardPoint\": 0.0,\n        \"rewardPointAmount\": 0.0,\n        \"totalpayable\": 22900.0,\n        \"amountpaid\": 0.0,\n        \"orderDate\": \"14/10/2026\",\n        \"customerViewDate\": \"Tue 14 Oct 2026\",\n        \"countryName\": \"India\",\n        \"countryCode\": \"IN\",\n        \"customerType\": null,\n        \"snapSkuId\": 4501,\n        \"snapSkuParentId\": 4501,\n        \"orderDateTime\": \"14/10/2026 15:05 PM\",\n        \"consigneePincode\": \"400001\",\n        \"consigneeAltPhoneNo\": null,\n        \"statusId\": 110,\n        \"paymentMode\": \"POSTPAID\",\n        \"paymentOptionName\": \"Cash On Delivery\",\n        \"awbNo\": null,\n        \"balanceDue\": 22900.0\n      }\n    ]\n  }\n}"
      },
      {
       "name": "Not your order / unknown number",
       "originalRequest": {
        "method": "POST",
        "header": [
         {
          "key": "X-Api-Key",
          "value": "{{apiKey}}"
         },
         {
          "key": "Authorization",
          "value": "Bearer {{accessToken}}"
         },
         {
          "key": "Content-Type",
          "value": "application/json"
         }
        ],
        "url": {
         "raw": "{{baseUrl}}/seller/orders/detail?orderId={{orderId}}",
         "host": [
          "{{baseUrl}}"
         ],
         "path": [
          "seller",
          "orders",
          "detail"
         ],
         "query": [
          {
           "key": "orderId",
           "value": "{{orderId}}",
           "description": "The order number (`orderId` from the order sync / `paymentorderid`). Letters, digits, `-`, `_`; max 64."
          }
         ]
        },
        "description": "Full detail of one order - your sub-orders only\n\n**Scope `seller:orders:read`.** Pass the `orderId` returned by `/seller/orders/sync` (the payment\norder number, e.g. `IA1216` - **not** a sub-order number). Returns `orderDetails`: one entry per\n**your** sub-order in that order (other sellers' items are never included). Each sub-order is one\nSKU line with its quantity.\n\nWhat to use for fulfilment:\n\n| Need | Field(s) |\n|---|---|\n| Sub-order number for every status call | `grouporderid` |\n| Order number | `paymentorderid` |\n| What to ship | `skuName`, `skuCode` (the **store's** SKU code), `quantity` |\n| Ship to | `consigneeName`, `consigneeAddress`, `consigneeLandmark`, `consigneeCity`, `consigneeState`, `consigneePincode`, `countryName`, `consigneeMobilenNo`, `consigneeAltPhoneNo` |\n| Where it is in the flow - and which status API is next | `statusId`, `statusName` (110 -> confirm, 106 -> dispatch, 116 -> deliver or rto, 120/125 -> done) |\n| Cash to collect | `paymentMode` = `PREPAID` (paid online) or `POSTPAID` (**cash on delivery**), `balanceDue` (amount still to collect), `paymentOptionName` |\n| Prices | `mrp`, `offerprice`, `shippingcost`, `totalamount`, `totalpayable`, `amountpaid` |\n\nNotes:\n\n- The order detail returns your sub-orders **in every status** (not only 110), so it also works to\n  re-read where a sub-order stands.\n- `skuCode` is the store's SKU code, not your `sellerskucode`; map it in your ERP (we can send you\n  the mapping list).\n- `orderDate` is `dd/MM/yyyy`, `orderDateTime` is `dd/MM/yyyy hh:mm a`-style, both IST.\n- `awbNo` is an AWB assigned **by the store's own logistics**, if any. The courier/AWB you send with\n  `/seller/orders/dispatch` is recorded in the order's status history and is not echoed here.\n- `taxamount` is currently always `null` in this response.\n- The customer's personal data is given to you **only to fulfil the order**; do not use it for\n  anything else.\n\nBusiness messages (HTTP 200, `\"status\": \"FAIL\"`):\n\n| Message | Meaning |\n|---|---|\n| `The record not found` | No sub-order of yours in that order (unknown number, another seller's order, or a sub-order number was sent). |\n| `orderId is required (the order number returned by the order sync).` | `orderId` missing or not alphanumeric. |\n| `Seller not found for authenticated user.` | Your credential is linked to more than one seller account - contact us. |\n"
       },
       "status": "OK",
       "code": 200,
       "_postman_previewlanguage": "json",
       "header": [
        {
         "key": "Content-Type",
         "value": "application/json"
        }
       ],
       "cookie": [],
       "body": "{\n  \"status\": \"FAIL\",\n  \"message\": \"The record not found\",\n  \"response\": null\n}"
      },
      {
       "name": "orderId missing or invalid",
       "originalRequest": {
        "method": "POST",
        "header": [
         {
          "key": "X-Api-Key",
          "value": "{{apiKey}}"
         },
         {
          "key": "Authorization",
          "value": "Bearer {{accessToken}}"
         },
         {
          "key": "Content-Type",
          "value": "application/json"
         }
        ],
        "url": {
         "raw": "{{baseUrl}}/seller/orders/detail?orderId={{orderId}}",
         "host": [
          "{{baseUrl}}"
         ],
         "path": [
          "seller",
          "orders",
          "detail"
         ],
         "query": [
          {
           "key": "orderId",
           "value": "{{orderId}}",
           "description": "The order number (`orderId` from the order sync / `paymentorderid`). Letters, digits, `-`, `_`; max 64."
          }
         ]
        },
        "description": "Full detail of one order - your sub-orders only\n\n**Scope `seller:orders:read`.** Pass the `orderId` returned by `/seller/orders/sync` (the payment\norder number, e.g. `IA1216` - **not** a sub-order number). Returns `orderDetails`: one entry per\n**your** sub-order in that order (other sellers' items are never included). Each sub-order is one\nSKU line with its quantity.\n\nWhat to use for fulfilment:\n\n| Need | Field(s) |\n|---|---|\n| Sub-order number for every status call | `grouporderid` |\n| Order number | `paymentorderid` |\n| What to ship | `skuName`, `skuCode` (the **store's** SKU code), `quantity` |\n| Ship to | `consigneeName`, `consigneeAddress`, `consigneeLandmark`, `consigneeCity`, `consigneeState`, `consigneePincode`, `countryName`, `consigneeMobilenNo`, `consigneeAltPhoneNo` |\n| Where it is in the flow - and which status API is next | `statusId`, `statusName` (110 -> confirm, 106 -> dispatch, 116 -> deliver or rto, 120/125 -> done) |\n| Cash to collect | `paymentMode` = `PREPAID` (paid online) or `POSTPAID` (**cash on delivery**), `balanceDue` (amount still to collect), `paymentOptionName` |\n| Prices | `mrp`, `offerprice`, `shippingcost`, `totalamount`, `totalpayable`, `amountpaid` |\n\nNotes:\n\n- The order detail returns your sub-orders **in every status** (not only 110), so it also works to\n  re-read where a sub-order stands.\n- `skuCode` is the store's SKU code, not your `sellerskucode`; map it in your ERP (we can send you\n  the mapping list).\n- `orderDate` is `dd/MM/yyyy`, `orderDateTime` is `dd/MM/yyyy hh:mm a`-style, both IST.\n- `awbNo` is an AWB assigned **by the store's own logistics**, if any. The courier/AWB you send with\n  `/seller/orders/dispatch` is recorded in the order's status history and is not echoed here.\n- `taxamount` is currently always `null` in this response.\n- The customer's personal data is given to you **only to fulfil the order**; do not use it for\n  anything else.\n\nBusiness messages (HTTP 200, `\"status\": \"FAIL\"`):\n\n| Message | Meaning |\n|---|---|\n| `The record not found` | No sub-order of yours in that order (unknown number, another seller's order, or a sub-order number was sent). |\n| `orderId is required (the order number returned by the order sync).` | `orderId` missing or not alphanumeric. |\n| `Seller not found for authenticated user.` | Your credential is linked to more than one seller account - contact us. |\n"
       },
       "status": "OK",
       "code": 200,
       "_postman_previewlanguage": "json",
       "header": [
        {
         "key": "Content-Type",
         "value": "application/json"
        }
       ],
       "cookie": [],
       "body": "{\n  \"status\": \"FAIL\",\n  \"message\": \"orderId is required (the order number returned by the order sync).\",\n  \"response\": null\n}"
      },
      {
       "name": "401 - E_AUTH",
       "originalRequest": {
        "method": "POST",
        "header": [
         {
          "key": "X-Api-Key",
          "value": "{{apiKey}}"
         },
         {
          "key": "Authorization",
          "value": "Bearer {{accessToken}}"
         },
         {
          "key": "Content-Type",
          "value": "application/json"
         }
        ],
        "url": {
         "raw": "{{baseUrl}}/seller/orders/detail?orderId={{orderId}}",
         "host": [
          "{{baseUrl}}"
         ],
         "path": [
          "seller",
          "orders",
          "detail"
         ],
         "query": [
          {
           "key": "orderId",
           "value": "{{orderId}}",
           "description": "The order number (`orderId` from the order sync / `paymentorderid`). Letters, digits, `-`, `_`; max 64."
          }
         ]
        },
        "description": "Full detail of one order - your sub-orders only\n\n**Scope `seller:orders:read`.** Pass the `orderId` returned by `/seller/orders/sync` (the payment\norder number, e.g. `IA1216` - **not** a sub-order number). Returns `orderDetails`: one entry per\n**your** sub-order in that order (other sellers' items are never included). Each sub-order is one\nSKU line with its quantity.\n\nWhat to use for fulfilment:\n\n| Need | Field(s) |\n|---|---|\n| Sub-order number for every status call | `grouporderid` |\n| Order number | `paymentorderid` |\n| What to ship | `skuName`, `skuCode` (the **store's** SKU code), `quantity` |\n| Ship to | `consigneeName`, `consigneeAddress`, `consigneeLandmark`, `consigneeCity`, `consigneeState`, `consigneePincode`, `countryName`, `consigneeMobilenNo`, `consigneeAltPhoneNo` |\n| Where it is in the flow - and which status API is next | `statusId`, `statusName` (110 -> confirm, 106 -> dispatch, 116 -> deliver or rto, 120/125 -> done) |\n| Cash to collect | `paymentMode` = `PREPAID` (paid online) or `POSTPAID` (**cash on delivery**), `balanceDue` (amount still to collect), `paymentOptionName` |\n| Prices | `mrp`, `offerprice`, `shippingcost`, `totalamount`, `totalpayable`, `amountpaid` |\n\nNotes:\n\n- The order detail returns your sub-orders **in every status** (not only 110), so it also works to\n  re-read where a sub-order stands.\n- `skuCode` is the store's SKU code, not your `sellerskucode`; map it in your ERP (we can send you\n  the mapping list).\n- `orderDate` is `dd/MM/yyyy`, `orderDateTime` is `dd/MM/yyyy hh:mm a`-style, both IST.\n- `awbNo` is an AWB assigned **by the store's own logistics**, if any. The courier/AWB you send with\n  `/seller/orders/dispatch` is recorded in the order's status history and is not echoed here.\n- `taxamount` is currently always `null` in this response.\n- The customer's personal data is given to you **only to fulfil the order**; do not use it for\n  anything else.\n\nBusiness messages (HTTP 200, `\"status\": \"FAIL\"`):\n\n| Message | Meaning |\n|---|---|\n| `The record not found` | No sub-order of yours in that order (unknown number, another seller's order, or a sub-order number was sent). |\n| `orderId is required (the order number returned by the order sync).` | `orderId` missing or not alphanumeric. |\n| `Seller not found for authenticated user.` | Your credential is linked to more than one seller account - contact us. |\n"
       },
       "status": "Unauthorized",
       "code": 401,
       "_postman_previewlanguage": "json",
       "header": [
        {
         "key": "Content-Type",
         "value": "application/json"
        }
       ],
       "cookie": [],
       "body": "{\n  \"status\": \"FAIL\",\n  \"message\": \"Request could not be authorized.\",\n  \"response\": {\n    \"code\": \"E_AUTH\",\n    \"requestId\": \"0d6f4f2e-3c1a-4a43-9f63-1f2a7c9b8e10\"\n  }\n}"
      }
     ],
     "event": [
      {
       "listen": "test",
       "script": {
        "type": "text/javascript",
        "exec": [
         "// Business refusals are HTTP 200 with status FAIL - always look at the envelope.",
         "const b = pm.response.json();",
         "pm.test('envelope present', () => pm.expect(b).to.have.property('status'));",
         "if (b.status !== 'SUCCESS') { console.warn('FAIL:', b.message, 'X-Request-Id', pm.response.headers.get('X-Request-Id')); }"
        ]
       }
      }
     ]
    }
   ]
  },
  {
   "name": "3. Order Status  (scope: seller:orders:write)",
   "item": [
    {
     "name": "Confirm order (transition 880: 110 Order Confirm -> 106 Order Confirmed by Supplier)",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "X-Api-Key",
        "value": "{{apiKey}}"
       },
       {
        "key": "Authorization",
        "value": "Bearer {{accessToken}}"
       },
       {
        "key": "Content-Type",
        "value": "application/json"
       }
      ],
      "url": {
       "raw": "{{baseUrl}}/seller/orders/confirm",
       "host": [
        "{{baseUrl}}"
       ],
       "path": [
        "seller",
        "orders",
        "confirm"
       ]
      },
      "description": "Confirm order (transition 880: 110 Order Confirm -> 106 Order Confirmed by Supplier)\n\n**Scope `seller:orders:write`.** You accept the sub-orders for fulfilment.\n\nPerforms **only** status_transition **880** on the drop-ship engine (5, VENDORLOGISTIC), granted to the seller role (Supplier Admin, roles_master 17) in status_rolestatustransitioin. Each sub-order must currently be **110 Order Confirm**; it moves to **106 Order Confirmed by Supplier**. Do not send a status id - a `statusId` in the body is ignored. Up to 100 sub-order numbers (`grouporderid`) per call.\n\n| API | status_transition id | Transition name | From status (status_master id, displayname, *description*) | To status (status_master id, displayname, *description*) |\n|---|---|---|---|---|\n| `POST /seller/orders/confirm` | 880 | VL - Order Confirm to Order Confirm by Supplier | **110** Order Confirm (*Order Confirmed*) | **106** Order Confirmed by Supplier (*Order Processing*) |\n\n**Read both maps.** The call answers `\"status\": \"SUCCESS\"` when it processed the batch, even if some\nsub-orders were refused:\n\n- `response.successMap` - sub-order number -> `\"Status updated.\"`\n- `response.errorMap` - sub-order number -> reason. Either map is **absent** when empty.\n- `response.transition` - the transition this call performed (always present on `SUCCESS`).\n\n| `errorMap` reason | Meaning |\n|---|---|\n| `Order is in status <displayname> (<id>); this API moves orders from <from displayname> (<from id>) only.` | The sub-order is not in this API's FROM status (or not on the drop-ship engine) - it was not moved. If `<displayname>` is already this API's TO status, the update was done earlier. |\n| `Order not avilable in vendor.` | Not your sub-order, unknown number, another store's order, or an order number (not a sub-order number) was sent. (Spelling as returned.) |\n| `Error` or any other text | The order engine refused or failed the move for that sub-order - re-read its `statusId` via `/seller/orders/detail` before retrying. |\n\nWhole-call refusals (HTTP 200, `\"status\": \"FAIL\"`, `response: null`, nothing changed):\n\n| Message | Meaning |\n|---|---|\n| `This status change is not enabled for sellers.` | The store has switched this transition off for the seller role. Contact the store team. |\n| `Order not avilable in vendor.` | **None** of the ids is one of your sub-orders. |\n| `orderIdList not found` | `orderIdList` missing or empty. |\n| `orderIdList exceeds the maximum of 100 per request` | Split the batch. |\n| `Invalid orderIdList` | An id is not 1-64 letters/digits/`-`/`_`. |\n| `remark must be at most 1000 characters` / `Invalid remark` | `remark` too long, or not single-line plain text (line breaks, control characters and `<` `>` are refused, as are HTML/script or SQL-like fragments such as `--`). |\n| `Invalid awbNo` / `Invalid logisticName` / `Invalid statusCode` / `Invalid shipmentDate` | Same plain-text rule for `shipmentList` fields. |\n| `every shipmentList entry needs a groupOrderId that is one of the orderIdList values` | A `shipmentList` entry has no `groupOrderId`, or names a sub-order not in `orderIdList`. |\n| `Request body is required.` | Empty body. |\n",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"orderIdList\": [\n    \"IASG1216\",\n    \"IASG1217\"\n  ],\n  \"remark\": \"Accepted by i-planet\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     },
     "response": [
      {
       "name": "Moved",
       "originalRequest": {
        "method": "POST",
        "header": [
         {
          "key": "X-Api-Key",
          "value": "{{apiKey}}"
         },
         {
          "key": "Authorization",
          "value": "Bearer {{accessToken}}"
         },
         {
          "key": "Content-Type",
          "value": "application/json"
         }
        ],
        "url": {
         "raw": "{{baseUrl}}/seller/orders/confirm",
         "host": [
          "{{baseUrl}}"
         ],
         "path": [
          "seller",
          "orders",
          "confirm"
         ]
        },
        "description": "Confirm order (transition 880: 110 Order Confirm -> 106 Order Confirmed by Supplier)\n\n**Scope `seller:orders:write`.** You accept the sub-orders for fulfilment.\n\nPerforms **only** status_transition **880** on the drop-ship engine (5, VENDORLOGISTIC), granted to the seller role (Supplier Admin, roles_master 17) in status_rolestatustransitioin. Each sub-order must currently be **110 Order Confirm**; it moves to **106 Order Confirmed by Supplier**. Do not send a status id - a `statusId` in the body is ignored. Up to 100 sub-order numbers (`grouporderid`) per call.\n\n| API | status_transition id | Transition name | From status (status_master id, displayname, *description*) | To status (status_master id, displayname, *description*) |\n|---|---|---|---|---|\n| `POST /seller/orders/confirm` | 880 | VL - Order Confirm to Order Confirm by Supplier | **110** Order Confirm (*Order Confirmed*) | **106** Order Confirmed by Supplier (*Order Processing*) |\n\n**Read both maps.** The call answers `\"status\": \"SUCCESS\"` when it processed the batch, even if some\nsub-orders were refused:\n\n- `response.successMap` - sub-order number -> `\"Status updated.\"`\n- `response.errorMap` - sub-order number -> reason. Either map is **absent** when empty.\n- `response.transition` - the transition this call performed (always present on `SUCCESS`).\n\n| `errorMap` reason | Meaning |\n|---|---|\n| `Order is in status <displayname> (<id>); this API moves orders from <from displayname> (<from id>) only.` | The sub-order is not in this API's FROM status (or not on the drop-ship engine) - it was not moved. If `<displayname>` is already this API's TO status, the update was done earlier. |\n| `Order not avilable in vendor.` | Not your sub-order, unknown number, another store's order, or an order number (not a sub-order number) was sent. (Spelling as returned.) |\n| `Error` or any other text | The order engine refused or failed the move for that sub-order - re-read its `statusId` via `/seller/orders/detail` before retrying. |\n\nWhole-call refusals (HTTP 200, `\"status\": \"FAIL\"`, `response: null`, nothing changed):\n\n| Message | Meaning |\n|---|---|\n| `This status change is not enabled for sellers.` | The store has switched this transition off for the seller role. Contact the store team. |\n| `Order not avilable in vendor.` | **None** of the ids is one of your sub-orders. |\n| `orderIdList not found` | `orderIdList` missing or empty. |\n| `orderIdList exceeds the maximum of 100 per request` | Split the batch. |\n| `Invalid orderIdList` | An id is not 1-64 letters/digits/`-`/`_`. |\n| `remark must be at most 1000 characters` / `Invalid remark` | `remark` too long, or not single-line plain text (line breaks, control characters and `<` `>` are refused, as are HTML/script or SQL-like fragments such as `--`). |\n| `Invalid awbNo` / `Invalid logisticName` / `Invalid statusCode` / `Invalid shipmentDate` | Same plain-text rule for `shipmentList` fields. |\n| `every shipmentList entry needs a groupOrderId that is one of the orderIdList values` | A `shipmentList` entry has no `groupOrderId`, or names a sub-order not in `orderIdList`. |\n| `Request body is required.` | Empty body. |\n",
        "body": {
         "mode": "raw",
         "raw": "{\n  \"orderIdList\": [\n    \"IASG1216\",\n    \"IASG1217\"\n  ],\n  \"remark\": \"Accepted by i-planet\"\n}",
         "options": {
          "raw": {
           "language": "json"
          }
         }
        }
       },
       "status": "OK",
       "code": 200,
       "_postman_previewlanguage": "json",
       "header": [
        {
         "key": "Content-Type",
         "value": "application/json"
        }
       ],
       "cookie": [],
       "body": "{\n  \"status\": \"SUCCESS\",\n  \"message\": \"Success\",\n  \"response\": {\n    \"successMap\": {\n      \"IASG1216\": \"Status updated.\"\n    },\n    \"transition\": {\n      \"transitionId\": 880,\n      \"fromStatusId\": 110,\n      \"fromStatus\": \"Order Confirm\",\n      \"toStatusId\": 106,\n      \"toStatus\": \"Order Confirmed by Supplier\"\n    }\n  }\n}"
      },
      {
       "name": "One sub-order not yours - read errorMap",
       "originalRequest": {
        "method": "POST",
        "header": [
         {
          "key": "X-Api-Key",
          "value": "{{apiKey}}"
         },
         {
          "key": "Authorization",
          "value": "Bearer {{accessToken}}"
         },
         {
          "key": "Content-Type",
          "value": "application/json"
         }
        ],
        "url": {
         "raw": "{{baseUrl}}/seller/orders/confirm",
         "host": [
          "{{baseUrl}}"
         ],
         "path": [
          "seller",
          "orders",
          "confirm"
         ]
        },
        "description": "Confirm order (transition 880: 110 Order Confirm -> 106 Order Confirmed by Supplier)\n\n**Scope `seller:orders:write`.** You accept the sub-orders for fulfilment.\n\nPerforms **only** status_transition **880** on the drop-ship engine (5, VENDORLOGISTIC), granted to the seller role (Supplier Admin, roles_master 17) in status_rolestatustransitioin. Each sub-order must currently be **110 Order Confirm**; it moves to **106 Order Confirmed by Supplier**. Do not send a status id - a `statusId` in the body is ignored. Up to 100 sub-order numbers (`grouporderid`) per call.\n\n| API | status_transition id | Transition name | From status (status_master id, displayname, *description*) | To status (status_master id, displayname, *description*) |\n|---|---|---|---|---|\n| `POST /seller/orders/confirm` | 880 | VL - Order Confirm to Order Confirm by Supplier | **110** Order Confirm (*Order Confirmed*) | **106** Order Confirmed by Supplier (*Order Processing*) |\n\n**Read both maps.** The call answers `\"status\": \"SUCCESS\"` when it processed the batch, even if some\nsub-orders were refused:\n\n- `response.successMap` - sub-order number -> `\"Status updated.\"`\n- `response.errorMap` - sub-order number -> reason. Either map is **absent** when empty.\n- `response.transition` - the transition this call performed (always present on `SUCCESS`).\n\n| `errorMap` reason | Meaning |\n|---|---|\n| `Order is in status <displayname> (<id>); this API moves orders from <from displayname> (<from id>) only.` | The sub-order is not in this API's FROM status (or not on the drop-ship engine) - it was not moved. If `<displayname>` is already this API's TO status, the update was done earlier. |\n| `Order not avilable in vendor.` | Not your sub-order, unknown number, another store's order, or an order number (not a sub-order number) was sent. (Spelling as returned.) |\n| `Error` or any other text | The order engine refused or failed the move for that sub-order - re-read its `statusId` via `/seller/orders/detail` before retrying. |\n\nWhole-call refusals (HTTP 200, `\"status\": \"FAIL\"`, `response: null`, nothing changed):\n\n| Message | Meaning |\n|---|---|\n| `This status change is not enabled for sellers.` | The store has switched this transition off for the seller role. Contact the store team. |\n| `Order not avilable in vendor.` | **None** of the ids is one of your sub-orders. |\n| `orderIdList not found` | `orderIdList` missing or empty. |\n| `orderIdList exceeds the maximum of 100 per request` | Split the batch. |\n| `Invalid orderIdList` | An id is not 1-64 letters/digits/`-`/`_`. |\n| `remark must be at most 1000 characters` / `Invalid remark` | `remark` too long, or not single-line plain text (line breaks, control characters and `<` `>` are refused, as are HTML/script or SQL-like fragments such as `--`). |\n| `Invalid awbNo` / `Invalid logisticName` / `Invalid statusCode` / `Invalid shipmentDate` | Same plain-text rule for `shipmentList` fields. |\n| `every shipmentList entry needs a groupOrderId that is one of the orderIdList values` | A `shipmentList` entry has no `groupOrderId`, or names a sub-order not in `orderIdList`. |\n| `Request body is required.` | Empty body. |\n",
        "body": {
         "mode": "raw",
         "raw": "{\n  \"orderIdList\": [\n    \"IASG1216\",\n    \"IASG1217\"\n  ],\n  \"remark\": \"Accepted by i-planet\"\n}",
         "options": {
          "raw": {
           "language": "json"
          }
         }
        }
       },
       "status": "OK",
       "code": 200,
       "_postman_previewlanguage": "json",
       "header": [
        {
         "key": "Content-Type",
         "value": "application/json"
        }
       ],
       "cookie": [],
       "body": "{\n  \"status\": \"SUCCESS\",\n  \"message\": \"Success\",\n  \"response\": {\n    \"successMap\": {\n      \"IASG1216\": \"Status updated.\"\n    },\n    \"errorMap\": {\n      \"IASG9999\": \"Order not avilable in vendor.\"\n    },\n    \"transition\": {\n      \"transitionId\": 880,\n      \"fromStatusId\": 110,\n      \"fromStatus\": \"Order Confirm\",\n      \"toStatusId\": 106,\n      \"toStatus\": \"Order Confirmed by Supplier\"\n    }\n  }\n}"
      },
      {
       "name": "Already confirmed (not in 110)",
       "originalRequest": {
        "method": "POST",
        "header": [
         {
          "key": "X-Api-Key",
          "value": "{{apiKey}}"
         },
         {
          "key": "Authorization",
          "value": "Bearer {{accessToken}}"
         },
         {
          "key": "Content-Type",
          "value": "application/json"
         }
        ],
        "url": {
         "raw": "{{baseUrl}}/seller/orders/confirm",
         "host": [
          "{{baseUrl}}"
         ],
         "path": [
          "seller",
          "orders",
          "confirm"
         ]
        },
        "description": "Confirm order (transition 880: 110 Order Confirm -> 106 Order Confirmed by Supplier)\n\n**Scope `seller:orders:write`.** You accept the sub-orders for fulfilment.\n\nPerforms **only** status_transition **880** on the drop-ship engine (5, VENDORLOGISTIC), granted to the seller role (Supplier Admin, roles_master 17) in status_rolestatustransitioin. Each sub-order must currently be **110 Order Confirm**; it moves to **106 Order Confirmed by Supplier**. Do not send a status id - a `statusId` in the body is ignored. Up to 100 sub-order numbers (`grouporderid`) per call.\n\n| API | status_transition id | Transition name | From status (status_master id, displayname, *description*) | To status (status_master id, displayname, *description*) |\n|---|---|---|---|---|\n| `POST /seller/orders/confirm` | 880 | VL - Order Confirm to Order Confirm by Supplier | **110** Order Confirm (*Order Confirmed*) | **106** Order Confirmed by Supplier (*Order Processing*) |\n\n**Read both maps.** The call answers `\"status\": \"SUCCESS\"` when it processed the batch, even if some\nsub-orders were refused:\n\n- `response.successMap` - sub-order number -> `\"Status updated.\"`\n- `response.errorMap` - sub-order number -> reason. Either map is **absent** when empty.\n- `response.transition` - the transition this call performed (always present on `SUCCESS`).\n\n| `errorMap` reason | Meaning |\n|---|---|\n| `Order is in status <displayname> (<id>); this API moves orders from <from displayname> (<from id>) only.` | The sub-order is not in this API's FROM status (or not on the drop-ship engine) - it was not moved. If `<displayname>` is already this API's TO status, the update was done earlier. |\n| `Order not avilable in vendor.` | Not your sub-order, unknown number, another store's order, or an order number (not a sub-order number) was sent. (Spelling as returned.) |\n| `Error` or any other text | The order engine refused or failed the move for that sub-order - re-read its `statusId` via `/seller/orders/detail` before retrying. |\n\nWhole-call refusals (HTTP 200, `\"status\": \"FAIL\"`, `response: null`, nothing changed):\n\n| Message | Meaning |\n|---|---|\n| `This status change is not enabled for sellers.` | The store has switched this transition off for the seller role. Contact the store team. |\n| `Order not avilable in vendor.` | **None** of the ids is one of your sub-orders. |\n| `orderIdList not found` | `orderIdList` missing or empty. |\n| `orderIdList exceeds the maximum of 100 per request` | Split the batch. |\n| `Invalid orderIdList` | An id is not 1-64 letters/digits/`-`/`_`. |\n| `remark must be at most 1000 characters` / `Invalid remark` | `remark` too long, or not single-line plain text (line breaks, control characters and `<` `>` are refused, as are HTML/script or SQL-like fragments such as `--`). |\n| `Invalid awbNo` / `Invalid logisticName` / `Invalid statusCode` / `Invalid shipmentDate` | Same plain-text rule for `shipmentList` fields. |\n| `every shipmentList entry needs a groupOrderId that is one of the orderIdList values` | A `shipmentList` entry has no `groupOrderId`, or names a sub-order not in `orderIdList`. |\n| `Request body is required.` | Empty body. |\n",
        "body": {
         "mode": "raw",
         "raw": "{\n  \"orderIdList\": [\n    \"IASG1216\",\n    \"IASG1217\"\n  ],\n  \"remark\": \"Accepted by i-planet\"\n}",
         "options": {
          "raw": {
           "language": "json"
          }
         }
        }
       },
       "status": "OK",
       "code": 200,
       "_postman_previewlanguage": "json",
       "header": [
        {
         "key": "Content-Type",
         "value": "application/json"
        }
       ],
       "cookie": [],
       "body": "{\n  \"status\": \"SUCCESS\",\n  \"message\": \"Success\",\n  \"response\": {\n    \"errorMap\": {\n      \"IASG1216\": \"Order is in status Order Confirmed by Supplier (106); this API moves orders from Order Confirm (110) only.\"\n    },\n    \"transition\": {\n      \"transitionId\": 880,\n      \"fromStatusId\": 110,\n      \"fromStatus\": \"Order Confirm\",\n      \"toStatusId\": 106,\n      \"toStatus\": \"Order Confirmed by Supplier\"\n    }\n  }\n}"
      },
      {
       "name": "Transition switched off for sellers",
       "originalRequest": {
        "method": "POST",
        "header": [
         {
          "key": "X-Api-Key",
          "value": "{{apiKey}}"
         },
         {
          "key": "Authorization",
          "value": "Bearer {{accessToken}}"
         },
         {
          "key": "Content-Type",
          "value": "application/json"
         }
        ],
        "url": {
         "raw": "{{baseUrl}}/seller/orders/confirm",
         "host": [
          "{{baseUrl}}"
         ],
         "path": [
          "seller",
          "orders",
          "confirm"
         ]
        },
        "description": "Confirm order (transition 880: 110 Order Confirm -> 106 Order Confirmed by Supplier)\n\n**Scope `seller:orders:write`.** You accept the sub-orders for fulfilment.\n\nPerforms **only** status_transition **880** on the drop-ship engine (5, VENDORLOGISTIC), granted to the seller role (Supplier Admin, roles_master 17) in status_rolestatustransitioin. Each sub-order must currently be **110 Order Confirm**; it moves to **106 Order Confirmed by Supplier**. Do not send a status id - a `statusId` in the body is ignored. Up to 100 sub-order numbers (`grouporderid`) per call.\n\n| API | status_transition id | Transition name | From status (status_master id, displayname, *description*) | To status (status_master id, displayname, *description*) |\n|---|---|---|---|---|\n| `POST /seller/orders/confirm` | 880 | VL - Order Confirm to Order Confirm by Supplier | **110** Order Confirm (*Order Confirmed*) | **106** Order Confirmed by Supplier (*Order Processing*) |\n\n**Read both maps.** The call answers `\"status\": \"SUCCESS\"` when it processed the batch, even if some\nsub-orders were refused:\n\n- `response.successMap` - sub-order number -> `\"Status updated.\"`\n- `response.errorMap` - sub-order number -> reason. Either map is **absent** when empty.\n- `response.transition` - the transition this call performed (always present on `SUCCESS`).\n\n| `errorMap` reason | Meaning |\n|---|---|\n| `Order is in status <displayname> (<id>); this API moves orders from <from displayname> (<from id>) only.` | The sub-order is not in this API's FROM status (or not on the drop-ship engine) - it was not moved. If `<displayname>` is already this API's TO status, the update was done earlier. |\n| `Order not avilable in vendor.` | Not your sub-order, unknown number, another store's order, or an order number (not a sub-order number) was sent. (Spelling as returned.) |\n| `Error` or any other text | The order engine refused or failed the move for that sub-order - re-read its `statusId` via `/seller/orders/detail` before retrying. |\n\nWhole-call refusals (HTTP 200, `\"status\": \"FAIL\"`, `response: null`, nothing changed):\n\n| Message | Meaning |\n|---|---|\n| `This status change is not enabled for sellers.` | The store has switched this transition off for the seller role. Contact the store team. |\n| `Order not avilable in vendor.` | **None** of the ids is one of your sub-orders. |\n| `orderIdList not found` | `orderIdList` missing or empty. |\n| `orderIdList exceeds the maximum of 100 per request` | Split the batch. |\n| `Invalid orderIdList` | An id is not 1-64 letters/digits/`-`/`_`. |\n| `remark must be at most 1000 characters` / `Invalid remark` | `remark` too long, or not single-line plain text (line breaks, control characters and `<` `>` are refused, as are HTML/script or SQL-like fragments such as `--`). |\n| `Invalid awbNo` / `Invalid logisticName` / `Invalid statusCode` / `Invalid shipmentDate` | Same plain-text rule for `shipmentList` fields. |\n| `every shipmentList entry needs a groupOrderId that is one of the orderIdList values` | A `shipmentList` entry has no `groupOrderId`, or names a sub-order not in `orderIdList`. |\n| `Request body is required.` | Empty body. |\n",
        "body": {
         "mode": "raw",
         "raw": "{\n  \"orderIdList\": [\n    \"IASG1216\",\n    \"IASG1217\"\n  ],\n  \"remark\": \"Accepted by i-planet\"\n}",
         "options": {
          "raw": {
           "language": "json"
          }
         }
        }
       },
       "status": "OK",
       "code": 200,
       "_postman_previewlanguage": "json",
       "header": [
        {
         "key": "Content-Type",
         "value": "application/json"
        }
       ],
       "cookie": [],
       "body": "{\n  \"status\": \"FAIL\",\n  \"message\": \"This status change is not enabled for sellers.\",\n  \"response\": null\n}"
      },
      {
       "name": "None of the ids is your sub-order",
       "originalRequest": {
        "method": "POST",
        "header": [
         {
          "key": "X-Api-Key",
          "value": "{{apiKey}}"
         },
         {
          "key": "Authorization",
          "value": "Bearer {{accessToken}}"
         },
         {
          "key": "Content-Type",
          "value": "application/json"
         }
        ],
        "url": {
         "raw": "{{baseUrl}}/seller/orders/confirm",
         "host": [
          "{{baseUrl}}"
         ],
         "path": [
          "seller",
          "orders",
          "confirm"
         ]
        },
        "description": "Confirm order (transition 880: 110 Order Confirm -> 106 Order Confirmed by Supplier)\n\n**Scope `seller:orders:write`.** You accept the sub-orders for fulfilment.\n\nPerforms **only** status_transition **880** on the drop-ship engine (5, VENDORLOGISTIC), granted to the seller role (Supplier Admin, roles_master 17) in status_rolestatustransitioin. Each sub-order must currently be **110 Order Confirm**; it moves to **106 Order Confirmed by Supplier**. Do not send a status id - a `statusId` in the body is ignored. Up to 100 sub-order numbers (`grouporderid`) per call.\n\n| API | status_transition id | Transition name | From status (status_master id, displayname, *description*) | To status (status_master id, displayname, *description*) |\n|---|---|---|---|---|\n| `POST /seller/orders/confirm` | 880 | VL - Order Confirm to Order Confirm by Supplier | **110** Order Confirm (*Order Confirmed*) | **106** Order Confirmed by Supplier (*Order Processing*) |\n\n**Read both maps.** The call answers `\"status\": \"SUCCESS\"` when it processed the batch, even if some\nsub-orders were refused:\n\n- `response.successMap` - sub-order number -> `\"Status updated.\"`\n- `response.errorMap` - sub-order number -> reason. Either map is **absent** when empty.\n- `response.transition` - the transition this call performed (always present on `SUCCESS`).\n\n| `errorMap` reason | Meaning |\n|---|---|\n| `Order is in status <displayname> (<id>); this API moves orders from <from displayname> (<from id>) only.` | The sub-order is not in this API's FROM status (or not on the drop-ship engine) - it was not moved. If `<displayname>` is already this API's TO status, the update was done earlier. |\n| `Order not avilable in vendor.` | Not your sub-order, unknown number, another store's order, or an order number (not a sub-order number) was sent. (Spelling as returned.) |\n| `Error` or any other text | The order engine refused or failed the move for that sub-order - re-read its `statusId` via `/seller/orders/detail` before retrying. |\n\nWhole-call refusals (HTTP 200, `\"status\": \"FAIL\"`, `response: null`, nothing changed):\n\n| Message | Meaning |\n|---|---|\n| `This status change is not enabled for sellers.` | The store has switched this transition off for the seller role. Contact the store team. |\n| `Order not avilable in vendor.` | **None** of the ids is one of your sub-orders. |\n| `orderIdList not found` | `orderIdList` missing or empty. |\n| `orderIdList exceeds the maximum of 100 per request` | Split the batch. |\n| `Invalid orderIdList` | An id is not 1-64 letters/digits/`-`/`_`. |\n| `remark must be at most 1000 characters` / `Invalid remark` | `remark` too long, or not single-line plain text (line breaks, control characters and `<` `>` are refused, as are HTML/script or SQL-like fragments such as `--`). |\n| `Invalid awbNo` / `Invalid logisticName` / `Invalid statusCode` / `Invalid shipmentDate` | Same plain-text rule for `shipmentList` fields. |\n| `every shipmentList entry needs a groupOrderId that is one of the orderIdList values` | A `shipmentList` entry has no `groupOrderId`, or names a sub-order not in `orderIdList`. |\n| `Request body is required.` | Empty body. |\n",
        "body": {
         "mode": "raw",
         "raw": "{\n  \"orderIdList\": [\n    \"IASG1216\",\n    \"IASG1217\"\n  ],\n  \"remark\": \"Accepted by i-planet\"\n}",
         "options": {
          "raw": {
           "language": "json"
          }
         }
        }
       },
       "status": "OK",
       "code": 200,
       "_postman_previewlanguage": "json",
       "header": [
        {
         "key": "Content-Type",
         "value": "application/json"
        }
       ],
       "cookie": [],
       "body": "{\n  \"status\": \"FAIL\",\n  \"message\": \"Order not avilable in vendor.\",\n  \"response\": null\n}"
      },
      {
       "name": "remark not plain text",
       "originalRequest": {
        "method": "POST",
        "header": [
         {
          "key": "X-Api-Key",
          "value": "{{apiKey}}"
         },
         {
          "key": "Authorization",
          "value": "Bearer {{accessToken}}"
         },
         {
          "key": "Content-Type",
          "value": "application/json"
         }
        ],
        "url": {
         "raw": "{{baseUrl}}/seller/orders/confirm",
         "host": [
          "{{baseUrl}}"
         ],
         "path": [
          "seller",
          "orders",
          "confirm"
         ]
        },
        "description": "Confirm order (transition 880: 110 Order Confirm -> 106 Order Confirmed by Supplier)\n\n**Scope `seller:orders:write`.** You accept the sub-orders for fulfilment.\n\nPerforms **only** status_transition **880** on the drop-ship engine (5, VENDORLOGISTIC), granted to the seller role (Supplier Admin, roles_master 17) in status_rolestatustransitioin. Each sub-order must currently be **110 Order Confirm**; it moves to **106 Order Confirmed by Supplier**. Do not send a status id - a `statusId` in the body is ignored. Up to 100 sub-order numbers (`grouporderid`) per call.\n\n| API | status_transition id | Transition name | From status (status_master id, displayname, *description*) | To status (status_master id, displayname, *description*) |\n|---|---|---|---|---|\n| `POST /seller/orders/confirm` | 880 | VL - Order Confirm to Order Confirm by Supplier | **110** Order Confirm (*Order Confirmed*) | **106** Order Confirmed by Supplier (*Order Processing*) |\n\n**Read both maps.** The call answers `\"status\": \"SUCCESS\"` when it processed the batch, even if some\nsub-orders were refused:\n\n- `response.successMap` - sub-order number -> `\"Status updated.\"`\n- `response.errorMap` - sub-order number -> reason. Either map is **absent** when empty.\n- `response.transition` - the transition this call performed (always present on `SUCCESS`).\n\n| `errorMap` reason | Meaning |\n|---|---|\n| `Order is in status <displayname> (<id>); this API moves orders from <from displayname> (<from id>) only.` | The sub-order is not in this API's FROM status (or not on the drop-ship engine) - it was not moved. If `<displayname>` is already this API's TO status, the update was done earlier. |\n| `Order not avilable in vendor.` | Not your sub-order, unknown number, another store's order, or an order number (not a sub-order number) was sent. (Spelling as returned.) |\n| `Error` or any other text | The order engine refused or failed the move for that sub-order - re-read its `statusId` via `/seller/orders/detail` before retrying. |\n\nWhole-call refusals (HTTP 200, `\"status\": \"FAIL\"`, `response: null`, nothing changed):\n\n| Message | Meaning |\n|---|---|\n| `This status change is not enabled for sellers.` | The store has switched this transition off for the seller role. Contact the store team. |\n| `Order not avilable in vendor.` | **None** of the ids is one of your sub-orders. |\n| `orderIdList not found` | `orderIdList` missing or empty. |\n| `orderIdList exceeds the maximum of 100 per request` | Split the batch. |\n| `Invalid orderIdList` | An id is not 1-64 letters/digits/`-`/`_`. |\n| `remark must be at most 1000 characters` / `Invalid remark` | `remark` too long, or not single-line plain text (line breaks, control characters and `<` `>` are refused, as are HTML/script or SQL-like fragments such as `--`). |\n| `Invalid awbNo` / `Invalid logisticName` / `Invalid statusCode` / `Invalid shipmentDate` | Same plain-text rule for `shipmentList` fields. |\n| `every shipmentList entry needs a groupOrderId that is one of the orderIdList values` | A `shipmentList` entry has no `groupOrderId`, or names a sub-order not in `orderIdList`. |\n| `Request body is required.` | Empty body. |\n",
        "body": {
         "mode": "raw",
         "raw": "{\n  \"orderIdList\": [\n    \"IASG1216\",\n    \"IASG1217\"\n  ],\n  \"remark\": \"Accepted by i-planet\"\n}",
         "options": {
          "raw": {
           "language": "json"
          }
         }
        }
       },
       "status": "OK",
       "code": 200,
       "_postman_previewlanguage": "json",
       "header": [
        {
         "key": "Content-Type",
         "value": "application/json"
        }
       ],
       "cookie": [],
       "body": "{\n  \"status\": \"FAIL\",\n  \"message\": \"Invalid remark\",\n  \"response\": null\n}"
      },
      {
       "name": "More than 100 ids",
       "originalRequest": {
        "method": "POST",
        "header": [
         {
          "key": "X-Api-Key",
          "value": "{{apiKey}}"
         },
         {
          "key": "Authorization",
          "value": "Bearer {{accessToken}}"
         },
         {
          "key": "Content-Type",
          "value": "application/json"
         }
        ],
        "url": {
         "raw": "{{baseUrl}}/seller/orders/confirm",
         "host": [
          "{{baseUrl}}"
         ],
         "path": [
          "seller",
          "orders",
          "confirm"
         ]
        },
        "description": "Confirm order (transition 880: 110 Order Confirm -> 106 Order Confirmed by Supplier)\n\n**Scope `seller:orders:write`.** You accept the sub-orders for fulfilment.\n\nPerforms **only** status_transition **880** on the drop-ship engine (5, VENDORLOGISTIC), granted to the seller role (Supplier Admin, roles_master 17) in status_rolestatustransitioin. Each sub-order must currently be **110 Order Confirm**; it moves to **106 Order Confirmed by Supplier**. Do not send a status id - a `statusId` in the body is ignored. Up to 100 sub-order numbers (`grouporderid`) per call.\n\n| API | status_transition id | Transition name | From status (status_master id, displayname, *description*) | To status (status_master id, displayname, *description*) |\n|---|---|---|---|---|\n| `POST /seller/orders/confirm` | 880 | VL - Order Confirm to Order Confirm by Supplier | **110** Order Confirm (*Order Confirmed*) | **106** Order Confirmed by Supplier (*Order Processing*) |\n\n**Read both maps.** The call answers `\"status\": \"SUCCESS\"` when it processed the batch, even if some\nsub-orders were refused:\n\n- `response.successMap` - sub-order number -> `\"Status updated.\"`\n- `response.errorMap` - sub-order number -> reason. Either map is **absent** when empty.\n- `response.transition` - the transition this call performed (always present on `SUCCESS`).\n\n| `errorMap` reason | Meaning |\n|---|---|\n| `Order is in status <displayname> (<id>); this API moves orders from <from displayname> (<from id>) only.` | The sub-order is not in this API's FROM status (or not on the drop-ship engine) - it was not moved. If `<displayname>` is already this API's TO status, the update was done earlier. |\n| `Order not avilable in vendor.` | Not your sub-order, unknown number, another store's order, or an order number (not a sub-order number) was sent. (Spelling as returned.) |\n| `Error` or any other text | The order engine refused or failed the move for that sub-order - re-read its `statusId` via `/seller/orders/detail` before retrying. |\n\nWhole-call refusals (HTTP 200, `\"status\": \"FAIL\"`, `response: null`, nothing changed):\n\n| Message | Meaning |\n|---|---|\n| `This status change is not enabled for sellers.` | The store has switched this transition off for the seller role. Contact the store team. |\n| `Order not avilable in vendor.` | **None** of the ids is one of your sub-orders. |\n| `orderIdList not found` | `orderIdList` missing or empty. |\n| `orderIdList exceeds the maximum of 100 per request` | Split the batch. |\n| `Invalid orderIdList` | An id is not 1-64 letters/digits/`-`/`_`. |\n| `remark must be at most 1000 characters` / `Invalid remark` | `remark` too long, or not single-line plain text (line breaks, control characters and `<` `>` are refused, as are HTML/script or SQL-like fragments such as `--`). |\n| `Invalid awbNo` / `Invalid logisticName` / `Invalid statusCode` / `Invalid shipmentDate` | Same plain-text rule for `shipmentList` fields. |\n| `every shipmentList entry needs a groupOrderId that is one of the orderIdList values` | A `shipmentList` entry has no `groupOrderId`, or names a sub-order not in `orderIdList`. |\n| `Request body is required.` | Empty body. |\n",
        "body": {
         "mode": "raw",
         "raw": "{\n  \"orderIdList\": [\n    \"IASG1216\",\n    \"IASG1217\"\n  ],\n  \"remark\": \"Accepted by i-planet\"\n}",
         "options": {
          "raw": {
           "language": "json"
          }
         }
        }
       },
       "status": "OK",
       "code": 200,
       "_postman_previewlanguage": "json",
       "header": [
        {
         "key": "Content-Type",
         "value": "application/json"
        }
       ],
       "cookie": [],
       "body": "{\n  \"status\": \"FAIL\",\n  \"message\": \"orderIdList exceeds the maximum of 100 per request\",\n  \"response\": null\n}"
      },
      {
       "name": "401 - E_AUTH",
       "originalRequest": {
        "method": "POST",
        "header": [
         {
          "key": "X-Api-Key",
          "value": "{{apiKey}}"
         },
         {
          "key": "Authorization",
          "value": "Bearer {{accessToken}}"
         },
         {
          "key": "Content-Type",
          "value": "application/json"
         }
        ],
        "url": {
         "raw": "{{baseUrl}}/seller/orders/confirm",
         "host": [
          "{{baseUrl}}"
         ],
         "path": [
          "seller",
          "orders",
          "confirm"
         ]
        },
        "description": "Confirm order (transition 880: 110 Order Confirm -> 106 Order Confirmed by Supplier)\n\n**Scope `seller:orders:write`.** You accept the sub-orders for fulfilment.\n\nPerforms **only** status_transition **880** on the drop-ship engine (5, VENDORLOGISTIC), granted to the seller role (Supplier Admin, roles_master 17) in status_rolestatustransitioin. Each sub-order must currently be **110 Order Confirm**; it moves to **106 Order Confirmed by Supplier**. Do not send a status id - a `statusId` in the body is ignored. Up to 100 sub-order numbers (`grouporderid`) per call.\n\n| API | status_transition id | Transition name | From status (status_master id, displayname, *description*) | To status (status_master id, displayname, *description*) |\n|---|---|---|---|---|\n| `POST /seller/orders/confirm` | 880 | VL - Order Confirm to Order Confirm by Supplier | **110** Order Confirm (*Order Confirmed*) | **106** Order Confirmed by Supplier (*Order Processing*) |\n\n**Read both maps.** The call answers `\"status\": \"SUCCESS\"` when it processed the batch, even if some\nsub-orders were refused:\n\n- `response.successMap` - sub-order number -> `\"Status updated.\"`\n- `response.errorMap` - sub-order number -> reason. Either map is **absent** when empty.\n- `response.transition` - the transition this call performed (always present on `SUCCESS`).\n\n| `errorMap` reason | Meaning |\n|---|---|\n| `Order is in status <displayname> (<id>); this API moves orders from <from displayname> (<from id>) only.` | The sub-order is not in this API's FROM status (or not on the drop-ship engine) - it was not moved. If `<displayname>` is already this API's TO status, the update was done earlier. |\n| `Order not avilable in vendor.` | Not your sub-order, unknown number, another store's order, or an order number (not a sub-order number) was sent. (Spelling as returned.) |\n| `Error` or any other text | The order engine refused or failed the move for that sub-order - re-read its `statusId` via `/seller/orders/detail` before retrying. |\n\nWhole-call refusals (HTTP 200, `\"status\": \"FAIL\"`, `response: null`, nothing changed):\n\n| Message | Meaning |\n|---|---|\n| `This status change is not enabled for sellers.` | The store has switched this transition off for the seller role. Contact the store team. |\n| `Order not avilable in vendor.` | **None** of the ids is one of your sub-orders. |\n| `orderIdList not found` | `orderIdList` missing or empty. |\n| `orderIdList exceeds the maximum of 100 per request` | Split the batch. |\n| `Invalid orderIdList` | An id is not 1-64 letters/digits/`-`/`_`. |\n| `remark must be at most 1000 characters` / `Invalid remark` | `remark` too long, or not single-line plain text (line breaks, control characters and `<` `>` are refused, as are HTML/script or SQL-like fragments such as `--`). |\n| `Invalid awbNo` / `Invalid logisticName` / `Invalid statusCode` / `Invalid shipmentDate` | Same plain-text rule for `shipmentList` fields. |\n| `every shipmentList entry needs a groupOrderId that is one of the orderIdList values` | A `shipmentList` entry has no `groupOrderId`, or names a sub-order not in `orderIdList`. |\n| `Request body is required.` | Empty body. |\n",
        "body": {
         "mode": "raw",
         "raw": "{\n  \"orderIdList\": [\n    \"IASG1216\",\n    \"IASG1217\"\n  ],\n  \"remark\": \"Accepted by i-planet\"\n}",
         "options": {
          "raw": {
           "language": "json"
          }
         }
        }
       },
       "status": "Unauthorized",
       "code": 401,
       "_postman_previewlanguage": "json",
       "header": [
        {
         "key": "Content-Type",
         "value": "application/json"
        }
       ],
       "cookie": [],
       "body": "{\n  \"status\": \"FAIL\",\n  \"message\": \"Request could not be authorized.\",\n  \"response\": {\n    \"code\": \"E_AUTH\",\n    \"requestId\": \"0d6f4f2e-3c1a-4a43-9f63-1f2a7c9b8e10\"\n  }\n}"
      }
     ],
     "event": [
      {
       "listen": "test",
       "script": {
        "type": "text/javascript",
        "exec": [
         "// Business refusals are HTTP 200 with status FAIL - always look at the envelope.",
         "const b = pm.response.json();",
         "pm.test('envelope present', () => pm.expect(b).to.have.property('status'));",
         "if (b.status !== 'SUCCESS') { console.warn('FAIL:', b.message, 'X-Request-Id', pm.response.headers.get('X-Request-Id')); }"
        ]
       }
      }
     ]
    },
    {
     "name": "Dispatch order (transition 895: 106 Order Confirmed by Supplier -> 116 Order Dispatched)",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "X-Api-Key",
        "value": "{{apiKey}}"
       },
       {
        "key": "Authorization",
        "value": "Bearer {{accessToken}}"
       },
       {
        "key": "Content-Type",
        "value": "application/json"
       }
      ],
      "url": {
       "raw": "{{baseUrl}}/seller/orders/dispatch",
       "host": [
        "{{baseUrl}}"
       ],
       "path": [
        "seller",
        "orders",
        "dispatch"
       ]
      },
      "description": "Dispatch order (transition 895: 106 Order Confirmed by Supplier -> 116 Order Dispatched)\n\n**Scope `seller:orders:write`.** The parcel is handed to the courier.\n\nPerforms **only** status_transition **895** on the drop-ship engine (5, VENDORLOGISTIC), granted to the seller role (Supplier Admin, roles_master 17) in status_rolestatustransitioin. Each sub-order must currently be **106 Order Confirmed by Supplier**; it moves to **116 Order Dispatched**. Do not send a status id - a `statusId` in the body is ignored. Up to 100 sub-order numbers (`grouporderid`) per call.\n\n| API | status_transition id | Transition name | From status (status_master id, displayname, *description*) | To status (status_master id, displayname, *description*) |\n|---|---|---|---|---|\n| `POST /seller/orders/dispatch` | 895 | VL- Order Confirm by Supplier to Order Dispatched | **106** Order Confirmed by Supplier (*Order Processing*) | **116** Order Dispatched (*Order Shipped*) |\n\n`shipmentList`: one entry per sub-order with `groupOrderId` (**required**, and it must be one of the\n`orderIdList` values of the same request), `logisticName` (courier), `awbNo`, `statusCode` (your/courier\nstatus code) and `shipmentDate` (`yyyy-MM-dd HH:mm:ss` IST recommended). They are recorded on the\nsub-order's **Order Dispatched** history record (shown to store staff) **only when the move to\nDispatched succeeds**. Single-line plain text only.\n\n**Read both maps.** The call answers `\"status\": \"SUCCESS\"` when it processed the batch, even if some\nsub-orders were refused:\n\n- `response.successMap` - sub-order number -> `\"Status updated.\"`\n- `response.errorMap` - sub-order number -> reason. Either map is **absent** when empty.\n- `response.transition` - the transition this call performed (always present on `SUCCESS`).\n\n| `errorMap` reason | Meaning |\n|---|---|\n| `Order is in status <displayname> (<id>); this API moves orders from <from displayname> (<from id>) only.` | The sub-order is not in this API's FROM status (or not on the drop-ship engine) - it was not moved. If `<displayname>` is already this API's TO status, the update was done earlier. |\n| `Order not avilable in vendor.` | Not your sub-order, unknown number, another store's order, or an order number (not a sub-order number) was sent. (Spelling as returned.) |\n| `Error` or any other text | The order engine refused or failed the move for that sub-order - re-read its `statusId` via `/seller/orders/detail` before retrying. |\n\nWhole-call refusals (HTTP 200, `\"status\": \"FAIL\"`, `response: null`, nothing changed):\n\n| Message | Meaning |\n|---|---|\n| `This status change is not enabled for sellers.` | The store has switched this transition off for the seller role. Contact the store team. |\n| `Order not avilable in vendor.` | **None** of the ids is one of your sub-orders. |\n| `orderIdList not found` | `orderIdList` missing or empty. |\n| `orderIdList exceeds the maximum of 100 per request` | Split the batch. |\n| `Invalid orderIdList` | An id is not 1-64 letters/digits/`-`/`_`. |\n| `remark must be at most 1000 characters` / `Invalid remark` | `remark` too long, or not single-line plain text (line breaks, control characters and `<` `>` are refused, as are HTML/script or SQL-like fragments such as `--`). |\n| `Invalid awbNo` / `Invalid logisticName` / `Invalid statusCode` / `Invalid shipmentDate` | Same plain-text rule for `shipmentList` fields. |\n| `every shipmentList entry needs a groupOrderId that is one of the orderIdList values` | A `shipmentList` entry has no `groupOrderId`, or names a sub-order not in `orderIdList`. |\n| `Request body is required.` | Empty body. |\n\n\n## Other request body examples\n\n**Dispatch two sub-orders in one parcel**\n\n```json\n{\n  \"orderIdList\": [\n    \"IASG1216\",\n    \"IASG1217\"\n  ],\n  \"remark\": \"One box\",\n  \"shipmentList\": [\n    {\n      \"groupOrderId\": \"IASG1216\",\n      \"logisticName\": \"Blue Dart\",\n      \"awbNo\": \"BD123456789IN\",\n      \"statusCode\": \"DISPATCHED\",\n      \"shipmentDate\": \"2026-10-14 15:30:00\"\n    },\n    {\n      \"groupOrderId\": \"IASG1217\",\n      \"logisticName\": \"Blue Dart\",\n      \"awbNo\": \"BD123456789IN\",\n      \"statusCode\": \"DISPATCHED\",\n      \"shipmentDate\": \"2026-10-14 15:30:00\"\n    }\n  ]\n}\n```",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"orderIdList\": [\n    \"IASG1216\"\n  ],\n  \"remark\": \"Shipped via Blue Dart\",\n  \"shipmentList\": [\n    {\n      \"groupOrderId\": \"IASG1216\",\n      \"logisticName\": \"Blue Dart\",\n      \"awbNo\": \"BD123456789IN\",\n      \"statusCode\": \"DISPATCHED\",\n      \"shipmentDate\": \"2026-10-14 15:30:00\"\n    }\n  ]\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     },
     "response": [
      {
       "name": "Moved",
       "originalRequest": {
        "method": "POST",
        "header": [
         {
          "key": "X-Api-Key",
          "value": "{{apiKey}}"
         },
         {
          "key": "Authorization",
          "value": "Bearer {{accessToken}}"
         },
         {
          "key": "Content-Type",
          "value": "application/json"
         }
        ],
        "url": {
         "raw": "{{baseUrl}}/seller/orders/dispatch",
         "host": [
          "{{baseUrl}}"
         ],
         "path": [
          "seller",
          "orders",
          "dispatch"
         ]
        },
        "description": "Dispatch order (transition 895: 106 Order Confirmed by Supplier -> 116 Order Dispatched)\n\n**Scope `seller:orders:write`.** The parcel is handed to the courier.\n\nPerforms **only** status_transition **895** on the drop-ship engine (5, VENDORLOGISTIC), granted to the seller role (Supplier Admin, roles_master 17) in status_rolestatustransitioin. Each sub-order must currently be **106 Order Confirmed by Supplier**; it moves to **116 Order Dispatched**. Do not send a status id - a `statusId` in the body is ignored. Up to 100 sub-order numbers (`grouporderid`) per call.\n\n| API | status_transition id | Transition name | From status (status_master id, displayname, *description*) | To status (status_master id, displayname, *description*) |\n|---|---|---|---|---|\n| `POST /seller/orders/dispatch` | 895 | VL- Order Confirm by Supplier to Order Dispatched | **106** Order Confirmed by Supplier (*Order Processing*) | **116** Order Dispatched (*Order Shipped*) |\n\n`shipmentList`: one entry per sub-order with `groupOrderId` (**required**, and it must be one of the\n`orderIdList` values of the same request), `logisticName` (courier), `awbNo`, `statusCode` (your/courier\nstatus code) and `shipmentDate` (`yyyy-MM-dd HH:mm:ss` IST recommended). They are recorded on the\nsub-order's **Order Dispatched** history record (shown to store staff) **only when the move to\nDispatched succeeds**. Single-line plain text only.\n\n**Read both maps.** The call answers `\"status\": \"SUCCESS\"` when it processed the batch, even if some\nsub-orders were refused:\n\n- `response.successMap` - sub-order number -> `\"Status updated.\"`\n- `response.errorMap` - sub-order number -> reason. Either map is **absent** when empty.\n- `response.transition` - the transition this call performed (always present on `SUCCESS`).\n\n| `errorMap` reason | Meaning |\n|---|---|\n| `Order is in status <displayname> (<id>); this API moves orders from <from displayname> (<from id>) only.` | The sub-order is not in this API's FROM status (or not on the drop-ship engine) - it was not moved. If `<displayname>` is already this API's TO status, the update was done earlier. |\n| `Order not avilable in vendor.` | Not your sub-order, unknown number, another store's order, or an order number (not a sub-order number) was sent. (Spelling as returned.) |\n| `Error` or any other text | The order engine refused or failed the move for that sub-order - re-read its `statusId` via `/seller/orders/detail` before retrying. |\n\nWhole-call refusals (HTTP 200, `\"status\": \"FAIL\"`, `response: null`, nothing changed):\n\n| Message | Meaning |\n|---|---|\n| `This status change is not enabled for sellers.` | The store has switched this transition off for the seller role. Contact the store team. |\n| `Order not avilable in vendor.` | **None** of the ids is one of your sub-orders. |\n| `orderIdList not found` | `orderIdList` missing or empty. |\n| `orderIdList exceeds the maximum of 100 per request` | Split the batch. |\n| `Invalid orderIdList` | An id is not 1-64 letters/digits/`-`/`_`. |\n| `remark must be at most 1000 characters` / `Invalid remark` | `remark` too long, or not single-line plain text (line breaks, control characters and `<` `>` are refused, as are HTML/script or SQL-like fragments such as `--`). |\n| `Invalid awbNo` / `Invalid logisticName` / `Invalid statusCode` / `Invalid shipmentDate` | Same plain-text rule for `shipmentList` fields. |\n| `every shipmentList entry needs a groupOrderId that is one of the orderIdList values` | A `shipmentList` entry has no `groupOrderId`, or names a sub-order not in `orderIdList`. |\n| `Request body is required.` | Empty body. |\n\n\n## Other request body examples\n\n**Dispatch two sub-orders in one parcel**\n\n```json\n{\n  \"orderIdList\": [\n    \"IASG1216\",\n    \"IASG1217\"\n  ],\n  \"remark\": \"One box\",\n  \"shipmentList\": [\n    {\n      \"groupOrderId\": \"IASG1216\",\n      \"logisticName\": \"Blue Dart\",\n      \"awbNo\": \"BD123456789IN\",\n      \"statusCode\": \"DISPATCHED\",\n      \"shipmentDate\": \"2026-10-14 15:30:00\"\n    },\n    {\n      \"groupOrderId\": \"IASG1217\",\n      \"logisticName\": \"Blue Dart\",\n      \"awbNo\": \"BD123456789IN\",\n      \"statusCode\": \"DISPATCHED\",\n      \"shipmentDate\": \"2026-10-14 15:30:00\"\n    }\n  ]\n}\n```",
        "body": {
         "mode": "raw",
         "raw": "{\n  \"orderIdList\": [\n    \"IASG1216\"\n  ],\n  \"remark\": \"Shipped via Blue Dart\",\n  \"shipmentList\": [\n    {\n      \"groupOrderId\": \"IASG1216\",\n      \"logisticName\": \"Blue Dart\",\n      \"awbNo\": \"BD123456789IN\",\n      \"statusCode\": \"DISPATCHED\",\n      \"shipmentDate\": \"2026-10-14 15:30:00\"\n    }\n  ]\n}",
         "options": {
          "raw": {
           "language": "json"
          }
         }
        }
       },
       "status": "OK",
       "code": 200,
       "_postman_previewlanguage": "json",
       "header": [
        {
         "key": "Content-Type",
         "value": "application/json"
        }
       ],
       "cookie": [],
       "body": "{\n  \"status\": \"SUCCESS\",\n  \"message\": \"Success\",\n  \"response\": {\n    \"successMap\": {\n      \"IASG1216\": \"Status updated.\"\n    },\n    \"transition\": {\n      \"transitionId\": 895,\n      \"fromStatusId\": 106,\n      \"fromStatus\": \"Order Confirmed by Supplier\",\n      \"toStatusId\": 116,\n      \"toStatus\": \"Order Dispatched\"\n    }\n  }\n}"
      },
      {
       "name": "One sub-order not yours - read errorMap",
       "originalRequest": {
        "method": "POST",
        "header": [
         {
          "key": "X-Api-Key",
          "value": "{{apiKey}}"
         },
         {
          "key": "Authorization",
          "value": "Bearer {{accessToken}}"
         },
         {
          "key": "Content-Type",
          "value": "application/json"
         }
        ],
        "url": {
         "raw": "{{baseUrl}}/seller/orders/dispatch",
         "host": [
          "{{baseUrl}}"
         ],
         "path": [
          "seller",
          "orders",
          "dispatch"
         ]
        },
        "description": "Dispatch order (transition 895: 106 Order Confirmed by Supplier -> 116 Order Dispatched)\n\n**Scope `seller:orders:write`.** The parcel is handed to the courier.\n\nPerforms **only** status_transition **895** on the drop-ship engine (5, VENDORLOGISTIC), granted to the seller role (Supplier Admin, roles_master 17) in status_rolestatustransitioin. Each sub-order must currently be **106 Order Confirmed by Supplier**; it moves to **116 Order Dispatched**. Do not send a status id - a `statusId` in the body is ignored. Up to 100 sub-order numbers (`grouporderid`) per call.\n\n| API | status_transition id | Transition name | From status (status_master id, displayname, *description*) | To status (status_master id, displayname, *description*) |\n|---|---|---|---|---|\n| `POST /seller/orders/dispatch` | 895 | VL- Order Confirm by Supplier to Order Dispatched | **106** Order Confirmed by Supplier (*Order Processing*) | **116** Order Dispatched (*Order Shipped*) |\n\n`shipmentList`: one entry per sub-order with `groupOrderId` (**required**, and it must be one of the\n`orderIdList` values of the same request), `logisticName` (courier), `awbNo`, `statusCode` (your/courier\nstatus code) and `shipmentDate` (`yyyy-MM-dd HH:mm:ss` IST recommended). They are recorded on the\nsub-order's **Order Dispatched** history record (shown to store staff) **only when the move to\nDispatched succeeds**. Single-line plain text only.\n\n**Read both maps.** The call answers `\"status\": \"SUCCESS\"` when it processed the batch, even if some\nsub-orders were refused:\n\n- `response.successMap` - sub-order number -> `\"Status updated.\"`\n- `response.errorMap` - sub-order number -> reason. Either map is **absent** when empty.\n- `response.transition` - the transition this call performed (always present on `SUCCESS`).\n\n| `errorMap` reason | Meaning |\n|---|---|\n| `Order is in status <displayname> (<id>); this API moves orders from <from displayname> (<from id>) only.` | The sub-order is not in this API's FROM status (or not on the drop-ship engine) - it was not moved. If `<displayname>` is already this API's TO status, the update was done earlier. |\n| `Order not avilable in vendor.` | Not your sub-order, unknown number, another store's order, or an order number (not a sub-order number) was sent. (Spelling as returned.) |\n| `Error` or any other text | The order engine refused or failed the move for that sub-order - re-read its `statusId` via `/seller/orders/detail` before retrying. |\n\nWhole-call refusals (HTTP 200, `\"status\": \"FAIL\"`, `response: null`, nothing changed):\n\n| Message | Meaning |\n|---|---|\n| `This status change is not enabled for sellers.` | The store has switched this transition off for the seller role. Contact the store team. |\n| `Order not avilable in vendor.` | **None** of the ids is one of your sub-orders. |\n| `orderIdList not found` | `orderIdList` missing or empty. |\n| `orderIdList exceeds the maximum of 100 per request` | Split the batch. |\n| `Invalid orderIdList` | An id is not 1-64 letters/digits/`-`/`_`. |\n| `remark must be at most 1000 characters` / `Invalid remark` | `remark` too long, or not single-line plain text (line breaks, control characters and `<` `>` are refused, as are HTML/script or SQL-like fragments such as `--`). |\n| `Invalid awbNo` / `Invalid logisticName` / `Invalid statusCode` / `Invalid shipmentDate` | Same plain-text rule for `shipmentList` fields. |\n| `every shipmentList entry needs a groupOrderId that is one of the orderIdList values` | A `shipmentList` entry has no `groupOrderId`, or names a sub-order not in `orderIdList`. |\n| `Request body is required.` | Empty body. |\n\n\n## Other request body examples\n\n**Dispatch two sub-orders in one parcel**\n\n```json\n{\n  \"orderIdList\": [\n    \"IASG1216\",\n    \"IASG1217\"\n  ],\n  \"remark\": \"One box\",\n  \"shipmentList\": [\n    {\n      \"groupOrderId\": \"IASG1216\",\n      \"logisticName\": \"Blue Dart\",\n      \"awbNo\": \"BD123456789IN\",\n      \"statusCode\": \"DISPATCHED\",\n      \"shipmentDate\": \"2026-10-14 15:30:00\"\n    },\n    {\n      \"groupOrderId\": \"IASG1217\",\n      \"logisticName\": \"Blue Dart\",\n      \"awbNo\": \"BD123456789IN\",\n      \"statusCode\": \"DISPATCHED\",\n      \"shipmentDate\": \"2026-10-14 15:30:00\"\n    }\n  ]\n}\n```",
        "body": {
         "mode": "raw",
         "raw": "{\n  \"orderIdList\": [\n    \"IASG1216\"\n  ],\n  \"remark\": \"Shipped via Blue Dart\",\n  \"shipmentList\": [\n    {\n      \"groupOrderId\": \"IASG1216\",\n      \"logisticName\": \"Blue Dart\",\n      \"awbNo\": \"BD123456789IN\",\n      \"statusCode\": \"DISPATCHED\",\n      \"shipmentDate\": \"2026-10-14 15:30:00\"\n    }\n  ]\n}",
         "options": {
          "raw": {
           "language": "json"
          }
         }
        }
       },
       "status": "OK",
       "code": 200,
       "_postman_previewlanguage": "json",
       "header": [
        {
         "key": "Content-Type",
         "value": "application/json"
        }
       ],
       "cookie": [],
       "body": "{\n  \"status\": \"SUCCESS\",\n  \"message\": \"Success\",\n  \"response\": {\n    \"successMap\": {\n      \"IASG1216\": \"Status updated.\"\n    },\n    \"errorMap\": {\n      \"IASG9999\": \"Order not avilable in vendor.\"\n    },\n    \"transition\": {\n      \"transitionId\": 895,\n      \"fromStatusId\": 106,\n      \"fromStatus\": \"Order Confirmed by Supplier\",\n      \"toStatusId\": 116,\n      \"toStatus\": \"Order Dispatched\"\n    }\n  }\n}"
      },
      {
       "name": "Not yet confirmed (still 110)",
       "originalRequest": {
        "method": "POST",
        "header": [
         {
          "key": "X-Api-Key",
          "value": "{{apiKey}}"
         },
         {
          "key": "Authorization",
          "value": "Bearer {{accessToken}}"
         },
         {
          "key": "Content-Type",
          "value": "application/json"
         }
        ],
        "url": {
         "raw": "{{baseUrl}}/seller/orders/dispatch",
         "host": [
          "{{baseUrl}}"
         ],
         "path": [
          "seller",
          "orders",
          "dispatch"
         ]
        },
        "description": "Dispatch order (transition 895: 106 Order Confirmed by Supplier -> 116 Order Dispatched)\n\n**Scope `seller:orders:write`.** The parcel is handed to the courier.\n\nPerforms **only** status_transition **895** on the drop-ship engine (5, VENDORLOGISTIC), granted to the seller role (Supplier Admin, roles_master 17) in status_rolestatustransitioin. Each sub-order must currently be **106 Order Confirmed by Supplier**; it moves to **116 Order Dispatched**. Do not send a status id - a `statusId` in the body is ignored. Up to 100 sub-order numbers (`grouporderid`) per call.\n\n| API | status_transition id | Transition name | From status (status_master id, displayname, *description*) | To status (status_master id, displayname, *description*) |\n|---|---|---|---|---|\n| `POST /seller/orders/dispatch` | 895 | VL- Order Confirm by Supplier to Order Dispatched | **106** Order Confirmed by Supplier (*Order Processing*) | **116** Order Dispatched (*Order Shipped*) |\n\n`shipmentList`: one entry per sub-order with `groupOrderId` (**required**, and it must be one of the\n`orderIdList` values of the same request), `logisticName` (courier), `awbNo`, `statusCode` (your/courier\nstatus code) and `shipmentDate` (`yyyy-MM-dd HH:mm:ss` IST recommended). They are recorded on the\nsub-order's **Order Dispatched** history record (shown to store staff) **only when the move to\nDispatched succeeds**. Single-line plain text only.\n\n**Read both maps.** The call answers `\"status\": \"SUCCESS\"` when it processed the batch, even if some\nsub-orders were refused:\n\n- `response.successMap` - sub-order number -> `\"Status updated.\"`\n- `response.errorMap` - sub-order number -> reason. Either map is **absent** when empty.\n- `response.transition` - the transition this call performed (always present on `SUCCESS`).\n\n| `errorMap` reason | Meaning |\n|---|---|\n| `Order is in status <displayname> (<id>); this API moves orders from <from displayname> (<from id>) only.` | The sub-order is not in this API's FROM status (or not on the drop-ship engine) - it was not moved. If `<displayname>` is already this API's TO status, the update was done earlier. |\n| `Order not avilable in vendor.` | Not your sub-order, unknown number, another store's order, or an order number (not a sub-order number) was sent. (Spelling as returned.) |\n| `Error` or any other text | The order engine refused or failed the move for that sub-order - re-read its `statusId` via `/seller/orders/detail` before retrying. |\n\nWhole-call refusals (HTTP 200, `\"status\": \"FAIL\"`, `response: null`, nothing changed):\n\n| Message | Meaning |\n|---|---|\n| `This status change is not enabled for sellers.` | The store has switched this transition off for the seller role. Contact the store team. |\n| `Order not avilable in vendor.` | **None** of the ids is one of your sub-orders. |\n| `orderIdList not found` | `orderIdList` missing or empty. |\n| `orderIdList exceeds the maximum of 100 per request` | Split the batch. |\n| `Invalid orderIdList` | An id is not 1-64 letters/digits/`-`/`_`. |\n| `remark must be at most 1000 characters` / `Invalid remark` | `remark` too long, or not single-line plain text (line breaks, control characters and `<` `>` are refused, as are HTML/script or SQL-like fragments such as `--`). |\n| `Invalid awbNo` / `Invalid logisticName` / `Invalid statusCode` / `Invalid shipmentDate` | Same plain-text rule for `shipmentList` fields. |\n| `every shipmentList entry needs a groupOrderId that is one of the orderIdList values` | A `shipmentList` entry has no `groupOrderId`, or names a sub-order not in `orderIdList`. |\n| `Request body is required.` | Empty body. |\n\n\n## Other request body examples\n\n**Dispatch two sub-orders in one parcel**\n\n```json\n{\n  \"orderIdList\": [\n    \"IASG1216\",\n    \"IASG1217\"\n  ],\n  \"remark\": \"One box\",\n  \"shipmentList\": [\n    {\n      \"groupOrderId\": \"IASG1216\",\n      \"logisticName\": \"Blue Dart\",\n      \"awbNo\": \"BD123456789IN\",\n      \"statusCode\": \"DISPATCHED\",\n      \"shipmentDate\": \"2026-10-14 15:30:00\"\n    },\n    {\n      \"groupOrderId\": \"IASG1217\",\n      \"logisticName\": \"Blue Dart\",\n      \"awbNo\": \"BD123456789IN\",\n      \"statusCode\": \"DISPATCHED\",\n      \"shipmentDate\": \"2026-10-14 15:30:00\"\n    }\n  ]\n}\n```",
        "body": {
         "mode": "raw",
         "raw": "{\n  \"orderIdList\": [\n    \"IASG1216\"\n  ],\n  \"remark\": \"Shipped via Blue Dart\",\n  \"shipmentList\": [\n    {\n      \"groupOrderId\": \"IASG1216\",\n      \"logisticName\": \"Blue Dart\",\n      \"awbNo\": \"BD123456789IN\",\n      \"statusCode\": \"DISPATCHED\",\n      \"shipmentDate\": \"2026-10-14 15:30:00\"\n    }\n  ]\n}",
         "options": {
          "raw": {
           "language": "json"
          }
         }
        }
       },
       "status": "OK",
       "code": 200,
       "_postman_previewlanguage": "json",
       "header": [
        {
         "key": "Content-Type",
         "value": "application/json"
        }
       ],
       "cookie": [],
       "body": "{\n  \"status\": \"SUCCESS\",\n  \"message\": \"Success\",\n  \"response\": {\n    \"errorMap\": {\n      \"IASG1216\": \"Order is in status Order Confirm (110); this API moves orders from Order Confirmed by Supplier (106) only.\"\n    },\n    \"transition\": {\n      \"transitionId\": 895,\n      \"fromStatusId\": 106,\n      \"fromStatus\": \"Order Confirmed by Supplier\",\n      \"toStatusId\": 116,\n      \"toStatus\": \"Order Dispatched\"\n    }\n  }\n}"
      },
      {
       "name": "shipmentList entry for a sub-order not in orderIdList",
       "originalRequest": {
        "method": "POST",
        "header": [
         {
          "key": "X-Api-Key",
          "value": "{{apiKey}}"
         },
         {
          "key": "Authorization",
          "value": "Bearer {{accessToken}}"
         },
         {
          "key": "Content-Type",
          "value": "application/json"
         }
        ],
        "url": {
         "raw": "{{baseUrl}}/seller/orders/dispatch",
         "host": [
          "{{baseUrl}}"
         ],
         "path": [
          "seller",
          "orders",
          "dispatch"
         ]
        },
        "description": "Dispatch order (transition 895: 106 Order Confirmed by Supplier -> 116 Order Dispatched)\n\n**Scope `seller:orders:write`.** The parcel is handed to the courier.\n\nPerforms **only** status_transition **895** on the drop-ship engine (5, VENDORLOGISTIC), granted to the seller role (Supplier Admin, roles_master 17) in status_rolestatustransitioin. Each sub-order must currently be **106 Order Confirmed by Supplier**; it moves to **116 Order Dispatched**. Do not send a status id - a `statusId` in the body is ignored. Up to 100 sub-order numbers (`grouporderid`) per call.\n\n| API | status_transition id | Transition name | From status (status_master id, displayname, *description*) | To status (status_master id, displayname, *description*) |\n|---|---|---|---|---|\n| `POST /seller/orders/dispatch` | 895 | VL- Order Confirm by Supplier to Order Dispatched | **106** Order Confirmed by Supplier (*Order Processing*) | **116** Order Dispatched (*Order Shipped*) |\n\n`shipmentList`: one entry per sub-order with `groupOrderId` (**required**, and it must be one of the\n`orderIdList` values of the same request), `logisticName` (courier), `awbNo`, `statusCode` (your/courier\nstatus code) and `shipmentDate` (`yyyy-MM-dd HH:mm:ss` IST recommended). They are recorded on the\nsub-order's **Order Dispatched** history record (shown to store staff) **only when the move to\nDispatched succeeds**. Single-line plain text only.\n\n**Read both maps.** The call answers `\"status\": \"SUCCESS\"` when it processed the batch, even if some\nsub-orders were refused:\n\n- `response.successMap` - sub-order number -> `\"Status updated.\"`\n- `response.errorMap` - sub-order number -> reason. Either map is **absent** when empty.\n- `response.transition` - the transition this call performed (always present on `SUCCESS`).\n\n| `errorMap` reason | Meaning |\n|---|---|\n| `Order is in status <displayname> (<id>); this API moves orders from <from displayname> (<from id>) only.` | The sub-order is not in this API's FROM status (or not on the drop-ship engine) - it was not moved. If `<displayname>` is already this API's TO status, the update was done earlier. |\n| `Order not avilable in vendor.` | Not your sub-order, unknown number, another store's order, or an order number (not a sub-order number) was sent. (Spelling as returned.) |\n| `Error` or any other text | The order engine refused or failed the move for that sub-order - re-read its `statusId` via `/seller/orders/detail` before retrying. |\n\nWhole-call refusals (HTTP 200, `\"status\": \"FAIL\"`, `response: null`, nothing changed):\n\n| Message | Meaning |\n|---|---|\n| `This status change is not enabled for sellers.` | The store has switched this transition off for the seller role. Contact the store team. |\n| `Order not avilable in vendor.` | **None** of the ids is one of your sub-orders. |\n| `orderIdList not found` | `orderIdList` missing or empty. |\n| `orderIdList exceeds the maximum of 100 per request` | Split the batch. |\n| `Invalid orderIdList` | An id is not 1-64 letters/digits/`-`/`_`. |\n| `remark must be at most 1000 characters` / `Invalid remark` | `remark` too long, or not single-line plain text (line breaks, control characters and `<` `>` are refused, as are HTML/script or SQL-like fragments such as `--`). |\n| `Invalid awbNo` / `Invalid logisticName` / `Invalid statusCode` / `Invalid shipmentDate` | Same plain-text rule for `shipmentList` fields. |\n| `every shipmentList entry needs a groupOrderId that is one of the orderIdList values` | A `shipmentList` entry has no `groupOrderId`, or names a sub-order not in `orderIdList`. |\n| `Request body is required.` | Empty body. |\n\n\n## Other request body examples\n\n**Dispatch two sub-orders in one parcel**\n\n```json\n{\n  \"orderIdList\": [\n    \"IASG1216\",\n    \"IASG1217\"\n  ],\n  \"remark\": \"One box\",\n  \"shipmentList\": [\n    {\n      \"groupOrderId\": \"IASG1216\",\n      \"logisticName\": \"Blue Dart\",\n      \"awbNo\": \"BD123456789IN\",\n      \"statusCode\": \"DISPATCHED\",\n      \"shipmentDate\": \"2026-10-14 15:30:00\"\n    },\n    {\n      \"groupOrderId\": \"IASG1217\",\n      \"logisticName\": \"Blue Dart\",\n      \"awbNo\": \"BD123456789IN\",\n      \"statusCode\": \"DISPATCHED\",\n      \"shipmentDate\": \"2026-10-14 15:30:00\"\n    }\n  ]\n}\n```",
        "body": {
         "mode": "raw",
         "raw": "{\n  \"orderIdList\": [\n    \"IASG1216\"\n  ],\n  \"remark\": \"Shipped via Blue Dart\",\n  \"shipmentList\": [\n    {\n      \"groupOrderId\": \"IASG1216\",\n      \"logisticName\": \"Blue Dart\",\n      \"awbNo\": \"BD123456789IN\",\n      \"statusCode\": \"DISPATCHED\",\n      \"shipmentDate\": \"2026-10-14 15:30:00\"\n    }\n  ]\n}",
         "options": {
          "raw": {
           "language": "json"
          }
         }
        }
       },
       "status": "OK",
       "code": 200,
       "_postman_previewlanguage": "json",
       "header": [
        {
         "key": "Content-Type",
         "value": "application/json"
        }
       ],
       "cookie": [],
       "body": "{\n  \"status\": \"FAIL\",\n  \"message\": \"every shipmentList entry needs a groupOrderId that is one of the orderIdList values\",\n  \"response\": null\n}"
      },
      {
       "name": "Unsafe text in shipmentList",
       "originalRequest": {
        "method": "POST",
        "header": [
         {
          "key": "X-Api-Key",
          "value": "{{apiKey}}"
         },
         {
          "key": "Authorization",
          "value": "Bearer {{accessToken}}"
         },
         {
          "key": "Content-Type",
          "value": "application/json"
         }
        ],
        "url": {
         "raw": "{{baseUrl}}/seller/orders/dispatch",
         "host": [
          "{{baseUrl}}"
         ],
         "path": [
          "seller",
          "orders",
          "dispatch"
         ]
        },
        "description": "Dispatch order (transition 895: 106 Order Confirmed by Supplier -> 116 Order Dispatched)\n\n**Scope `seller:orders:write`.** The parcel is handed to the courier.\n\nPerforms **only** status_transition **895** on the drop-ship engine (5, VENDORLOGISTIC), granted to the seller role (Supplier Admin, roles_master 17) in status_rolestatustransitioin. Each sub-order must currently be **106 Order Confirmed by Supplier**; it moves to **116 Order Dispatched**. Do not send a status id - a `statusId` in the body is ignored. Up to 100 sub-order numbers (`grouporderid`) per call.\n\n| API | status_transition id | Transition name | From status (status_master id, displayname, *description*) | To status (status_master id, displayname, *description*) |\n|---|---|---|---|---|\n| `POST /seller/orders/dispatch` | 895 | VL- Order Confirm by Supplier to Order Dispatched | **106** Order Confirmed by Supplier (*Order Processing*) | **116** Order Dispatched (*Order Shipped*) |\n\n`shipmentList`: one entry per sub-order with `groupOrderId` (**required**, and it must be one of the\n`orderIdList` values of the same request), `logisticName` (courier), `awbNo`, `statusCode` (your/courier\nstatus code) and `shipmentDate` (`yyyy-MM-dd HH:mm:ss` IST recommended). They are recorded on the\nsub-order's **Order Dispatched** history record (shown to store staff) **only when the move to\nDispatched succeeds**. Single-line plain text only.\n\n**Read both maps.** The call answers `\"status\": \"SUCCESS\"` when it processed the batch, even if some\nsub-orders were refused:\n\n- `response.successMap` - sub-order number -> `\"Status updated.\"`\n- `response.errorMap` - sub-order number -> reason. Either map is **absent** when empty.\n- `response.transition` - the transition this call performed (always present on `SUCCESS`).\n\n| `errorMap` reason | Meaning |\n|---|---|\n| `Order is in status <displayname> (<id>); this API moves orders from <from displayname> (<from id>) only.` | The sub-order is not in this API's FROM status (or not on the drop-ship engine) - it was not moved. If `<displayname>` is already this API's TO status, the update was done earlier. |\n| `Order not avilable in vendor.` | Not your sub-order, unknown number, another store's order, or an order number (not a sub-order number) was sent. (Spelling as returned.) |\n| `Error` or any other text | The order engine refused or failed the move for that sub-order - re-read its `statusId` via `/seller/orders/detail` before retrying. |\n\nWhole-call refusals (HTTP 200, `\"status\": \"FAIL\"`, `response: null`, nothing changed):\n\n| Message | Meaning |\n|---|---|\n| `This status change is not enabled for sellers.` | The store has switched this transition off for the seller role. Contact the store team. |\n| `Order not avilable in vendor.` | **None** of the ids is one of your sub-orders. |\n| `orderIdList not found` | `orderIdList` missing or empty. |\n| `orderIdList exceeds the maximum of 100 per request` | Split the batch. |\n| `Invalid orderIdList` | An id is not 1-64 letters/digits/`-`/`_`. |\n| `remark must be at most 1000 characters` / `Invalid remark` | `remark` too long, or not single-line plain text (line breaks, control characters and `<` `>` are refused, as are HTML/script or SQL-like fragments such as `--`). |\n| `Invalid awbNo` / `Invalid logisticName` / `Invalid statusCode` / `Invalid shipmentDate` | Same plain-text rule for `shipmentList` fields. |\n| `every shipmentList entry needs a groupOrderId that is one of the orderIdList values` | A `shipmentList` entry has no `groupOrderId`, or names a sub-order not in `orderIdList`. |\n| `Request body is required.` | Empty body. |\n\n\n## Other request body examples\n\n**Dispatch two sub-orders in one parcel**\n\n```json\n{\n  \"orderIdList\": [\n    \"IASG1216\",\n    \"IASG1217\"\n  ],\n  \"remark\": \"One box\",\n  \"shipmentList\": [\n    {\n      \"groupOrderId\": \"IASG1216\",\n      \"logisticName\": \"Blue Dart\",\n      \"awbNo\": \"BD123456789IN\",\n      \"statusCode\": \"DISPATCHED\",\n      \"shipmentDate\": \"2026-10-14 15:30:00\"\n    },\n    {\n      \"groupOrderId\": \"IASG1217\",\n      \"logisticName\": \"Blue Dart\",\n      \"awbNo\": \"BD123456789IN\",\n      \"statusCode\": \"DISPATCHED\",\n      \"shipmentDate\": \"2026-10-14 15:30:00\"\n    }\n  ]\n}\n```",
        "body": {
         "mode": "raw",
         "raw": "{\n  \"orderIdList\": [\n    \"IASG1216\"\n  ],\n  \"remark\": \"Shipped via Blue Dart\",\n  \"shipmentList\": [\n    {\n      \"groupOrderId\": \"IASG1216\",\n      \"logisticName\": \"Blue Dart\",\n      \"awbNo\": \"BD123456789IN\",\n      \"statusCode\": \"DISPATCHED\",\n      \"shipmentDate\": \"2026-10-14 15:30:00\"\n    }\n  ]\n}",
         "options": {
          "raw": {
           "language": "json"
          }
         }
        }
       },
       "status": "OK",
       "code": 200,
       "_postman_previewlanguage": "json",
       "header": [
        {
         "key": "Content-Type",
         "value": "application/json"
        }
       ],
       "cookie": [],
       "body": "{\n  \"status\": \"FAIL\",\n  \"message\": \"Invalid awbNo\",\n  \"response\": null\n}"
      },
      {
       "name": "Transition switched off for sellers",
       "originalRequest": {
        "method": "POST",
        "header": [
         {
          "key": "X-Api-Key",
          "value": "{{apiKey}}"
         },
         {
          "key": "Authorization",
          "value": "Bearer {{accessToken}}"
         },
         {
          "key": "Content-Type",
          "value": "application/json"
         }
        ],
        "url": {
         "raw": "{{baseUrl}}/seller/orders/dispatch",
         "host": [
          "{{baseUrl}}"
         ],
         "path": [
          "seller",
          "orders",
          "dispatch"
         ]
        },
        "description": "Dispatch order (transition 895: 106 Order Confirmed by Supplier -> 116 Order Dispatched)\n\n**Scope `seller:orders:write`.** The parcel is handed to the courier.\n\nPerforms **only** status_transition **895** on the drop-ship engine (5, VENDORLOGISTIC), granted to the seller role (Supplier Admin, roles_master 17) in status_rolestatustransitioin. Each sub-order must currently be **106 Order Confirmed by Supplier**; it moves to **116 Order Dispatched**. Do not send a status id - a `statusId` in the body is ignored. Up to 100 sub-order numbers (`grouporderid`) per call.\n\n| API | status_transition id | Transition name | From status (status_master id, displayname, *description*) | To status (status_master id, displayname, *description*) |\n|---|---|---|---|---|\n| `POST /seller/orders/dispatch` | 895 | VL- Order Confirm by Supplier to Order Dispatched | **106** Order Confirmed by Supplier (*Order Processing*) | **116** Order Dispatched (*Order Shipped*) |\n\n`shipmentList`: one entry per sub-order with `groupOrderId` (**required**, and it must be one of the\n`orderIdList` values of the same request), `logisticName` (courier), `awbNo`, `statusCode` (your/courier\nstatus code) and `shipmentDate` (`yyyy-MM-dd HH:mm:ss` IST recommended). They are recorded on the\nsub-order's **Order Dispatched** history record (shown to store staff) **only when the move to\nDispatched succeeds**. Single-line plain text only.\n\n**Read both maps.** The call answers `\"status\": \"SUCCESS\"` when it processed the batch, even if some\nsub-orders were refused:\n\n- `response.successMap` - sub-order number -> `\"Status updated.\"`\n- `response.errorMap` - sub-order number -> reason. Either map is **absent** when empty.\n- `response.transition` - the transition this call performed (always present on `SUCCESS`).\n\n| `errorMap` reason | Meaning |\n|---|---|\n| `Order is in status <displayname> (<id>); this API moves orders from <from displayname> (<from id>) only.` | The sub-order is not in this API's FROM status (or not on the drop-ship engine) - it was not moved. If `<displayname>` is already this API's TO status, the update was done earlier. |\n| `Order not avilable in vendor.` | Not your sub-order, unknown number, another store's order, or an order number (not a sub-order number) was sent. (Spelling as returned.) |\n| `Error` or any other text | The order engine refused or failed the move for that sub-order - re-read its `statusId` via `/seller/orders/detail` before retrying. |\n\nWhole-call refusals (HTTP 200, `\"status\": \"FAIL\"`, `response: null`, nothing changed):\n\n| Message | Meaning |\n|---|---|\n| `This status change is not enabled for sellers.` | The store has switched this transition off for the seller role. Contact the store team. |\n| `Order not avilable in vendor.` | **None** of the ids is one of your sub-orders. |\n| `orderIdList not found` | `orderIdList` missing or empty. |\n| `orderIdList exceeds the maximum of 100 per request` | Split the batch. |\n| `Invalid orderIdList` | An id is not 1-64 letters/digits/`-`/`_`. |\n| `remark must be at most 1000 characters` / `Invalid remark` | `remark` too long, or not single-line plain text (line breaks, control characters and `<` `>` are refused, as are HTML/script or SQL-like fragments such as `--`). |\n| `Invalid awbNo` / `Invalid logisticName` / `Invalid statusCode` / `Invalid shipmentDate` | Same plain-text rule for `shipmentList` fields. |\n| `every shipmentList entry needs a groupOrderId that is one of the orderIdList values` | A `shipmentList` entry has no `groupOrderId`, or names a sub-order not in `orderIdList`. |\n| `Request body is required.` | Empty body. |\n\n\n## Other request body examples\n\n**Dispatch two sub-orders in one parcel**\n\n```json\n{\n  \"orderIdList\": [\n    \"IASG1216\",\n    \"IASG1217\"\n  ],\n  \"remark\": \"One box\",\n  \"shipmentList\": [\n    {\n      \"groupOrderId\": \"IASG1216\",\n      \"logisticName\": \"Blue Dart\",\n      \"awbNo\": \"BD123456789IN\",\n      \"statusCode\": \"DISPATCHED\",\n      \"shipmentDate\": \"2026-10-14 15:30:00\"\n    },\n    {\n      \"groupOrderId\": \"IASG1217\",\n      \"logisticName\": \"Blue Dart\",\n      \"awbNo\": \"BD123456789IN\",\n      \"statusCode\": \"DISPATCHED\",\n      \"shipmentDate\": \"2026-10-14 15:30:00\"\n    }\n  ]\n}\n```",
        "body": {
         "mode": "raw",
         "raw": "{\n  \"orderIdList\": [\n    \"IASG1216\"\n  ],\n  \"remark\": \"Shipped via Blue Dart\",\n  \"shipmentList\": [\n    {\n      \"groupOrderId\": \"IASG1216\",\n      \"logisticName\": \"Blue Dart\",\n      \"awbNo\": \"BD123456789IN\",\n      \"statusCode\": \"DISPATCHED\",\n      \"shipmentDate\": \"2026-10-14 15:30:00\"\n    }\n  ]\n}",
         "options": {
          "raw": {
           "language": "json"
          }
         }
        }
       },
       "status": "OK",
       "code": 200,
       "_postman_previewlanguage": "json",
       "header": [
        {
         "key": "Content-Type",
         "value": "application/json"
        }
       ],
       "cookie": [],
       "body": "{\n  \"status\": \"FAIL\",\n  \"message\": \"This status change is not enabled for sellers.\",\n  \"response\": null\n}"
      },
      {
       "name": "None of the ids is your sub-order",
       "originalRequest": {
        "method": "POST",
        "header": [
         {
          "key": "X-Api-Key",
          "value": "{{apiKey}}"
         },
         {
          "key": "Authorization",
          "value": "Bearer {{accessToken}}"
         },
         {
          "key": "Content-Type",
          "value": "application/json"
         }
        ],
        "url": {
         "raw": "{{baseUrl}}/seller/orders/dispatch",
         "host": [
          "{{baseUrl}}"
         ],
         "path": [
          "seller",
          "orders",
          "dispatch"
         ]
        },
        "description": "Dispatch order (transition 895: 106 Order Confirmed by Supplier -> 116 Order Dispatched)\n\n**Scope `seller:orders:write`.** The parcel is handed to the courier.\n\nPerforms **only** status_transition **895** on the drop-ship engine (5, VENDORLOGISTIC), granted to the seller role (Supplier Admin, roles_master 17) in status_rolestatustransitioin. Each sub-order must currently be **106 Order Confirmed by Supplier**; it moves to **116 Order Dispatched**. Do not send a status id - a `statusId` in the body is ignored. Up to 100 sub-order numbers (`grouporderid`) per call.\n\n| API | status_transition id | Transition name | From status (status_master id, displayname, *description*) | To status (status_master id, displayname, *description*) |\n|---|---|---|---|---|\n| `POST /seller/orders/dispatch` | 895 | VL- Order Confirm by Supplier to Order Dispatched | **106** Order Confirmed by Supplier (*Order Processing*) | **116** Order Dispatched (*Order Shipped*) |\n\n`shipmentList`: one entry per sub-order with `groupOrderId` (**required**, and it must be one of the\n`orderIdList` values of the same request), `logisticName` (courier), `awbNo`, `statusCode` (your/courier\nstatus code) and `shipmentDate` (`yyyy-MM-dd HH:mm:ss` IST recommended). They are recorded on the\nsub-order's **Order Dispatched** history record (shown to store staff) **only when the move to\nDispatched succeeds**. Single-line plain text only.\n\n**Read both maps.** The call answers `\"status\": \"SUCCESS\"` when it processed the batch, even if some\nsub-orders were refused:\n\n- `response.successMap` - sub-order number -> `\"Status updated.\"`\n- `response.errorMap` - sub-order number -> reason. Either map is **absent** when empty.\n- `response.transition` - the transition this call performed (always present on `SUCCESS`).\n\n| `errorMap` reason | Meaning |\n|---|---|\n| `Order is in status <displayname> (<id>); this API moves orders from <from displayname> (<from id>) only.` | The sub-order is not in this API's FROM status (or not on the drop-ship engine) - it was not moved. If `<displayname>` is already this API's TO status, the update was done earlier. |\n| `Order not avilable in vendor.` | Not your sub-order, unknown number, another store's order, or an order number (not a sub-order number) was sent. (Spelling as returned.) |\n| `Error` or any other text | The order engine refused or failed the move for that sub-order - re-read its `statusId` via `/seller/orders/detail` before retrying. |\n\nWhole-call refusals (HTTP 200, `\"status\": \"FAIL\"`, `response: null`, nothing changed):\n\n| Message | Meaning |\n|---|---|\n| `This status change is not enabled for sellers.` | The store has switched this transition off for the seller role. Contact the store team. |\n| `Order not avilable in vendor.` | **None** of the ids is one of your sub-orders. |\n| `orderIdList not found` | `orderIdList` missing or empty. |\n| `orderIdList exceeds the maximum of 100 per request` | Split the batch. |\n| `Invalid orderIdList` | An id is not 1-64 letters/digits/`-`/`_`. |\n| `remark must be at most 1000 characters` / `Invalid remark` | `remark` too long, or not single-line plain text (line breaks, control characters and `<` `>` are refused, as are HTML/script or SQL-like fragments such as `--`). |\n| `Invalid awbNo` / `Invalid logisticName` / `Invalid statusCode` / `Invalid shipmentDate` | Same plain-text rule for `shipmentList` fields. |\n| `every shipmentList entry needs a groupOrderId that is one of the orderIdList values` | A `shipmentList` entry has no `groupOrderId`, or names a sub-order not in `orderIdList`. |\n| `Request body is required.` | Empty body. |\n\n\n## Other request body examples\n\n**Dispatch two sub-orders in one parcel**\n\n```json\n{\n  \"orderIdList\": [\n    \"IASG1216\",\n    \"IASG1217\"\n  ],\n  \"remark\": \"One box\",\n  \"shipmentList\": [\n    {\n      \"groupOrderId\": \"IASG1216\",\n      \"logisticName\": \"Blue Dart\",\n      \"awbNo\": \"BD123456789IN\",\n      \"statusCode\": \"DISPATCHED\",\n      \"shipmentDate\": \"2026-10-14 15:30:00\"\n    },\n    {\n      \"groupOrderId\": \"IASG1217\",\n      \"logisticName\": \"Blue Dart\",\n      \"awbNo\": \"BD123456789IN\",\n      \"statusCode\": \"DISPATCHED\",\n      \"shipmentDate\": \"2026-10-14 15:30:00\"\n    }\n  ]\n}\n```",
        "body": {
         "mode": "raw",
         "raw": "{\n  \"orderIdList\": [\n    \"IASG1216\"\n  ],\n  \"remark\": \"Shipped via Blue Dart\",\n  \"shipmentList\": [\n    {\n      \"groupOrderId\": \"IASG1216\",\n      \"logisticName\": \"Blue Dart\",\n      \"awbNo\": \"BD123456789IN\",\n      \"statusCode\": \"DISPATCHED\",\n      \"shipmentDate\": \"2026-10-14 15:30:00\"\n    }\n  ]\n}",
         "options": {
          "raw": {
           "language": "json"
          }
         }
        }
       },
       "status": "OK",
       "code": 200,
       "_postman_previewlanguage": "json",
       "header": [
        {
         "key": "Content-Type",
         "value": "application/json"
        }
       ],
       "cookie": [],
       "body": "{\n  \"status\": \"FAIL\",\n  \"message\": \"Order not avilable in vendor.\",\n  \"response\": null\n}"
      },
      {
       "name": "remark not plain text",
       "originalRequest": {
        "method": "POST",
        "header": [
         {
          "key": "X-Api-Key",
          "value": "{{apiKey}}"
         },
         {
          "key": "Authorization",
          "value": "Bearer {{accessToken}}"
         },
         {
          "key": "Content-Type",
          "value": "application/json"
         }
        ],
        "url": {
         "raw": "{{baseUrl}}/seller/orders/dispatch",
         "host": [
          "{{baseUrl}}"
         ],
         "path": [
          "seller",
          "orders",
          "dispatch"
         ]
        },
        "description": "Dispatch order (transition 895: 106 Order Confirmed by Supplier -> 116 Order Dispatched)\n\n**Scope `seller:orders:write`.** The parcel is handed to the courier.\n\nPerforms **only** status_transition **895** on the drop-ship engine (5, VENDORLOGISTIC), granted to the seller role (Supplier Admin, roles_master 17) in status_rolestatustransitioin. Each sub-order must currently be **106 Order Confirmed by Supplier**; it moves to **116 Order Dispatched**. Do not send a status id - a `statusId` in the body is ignored. Up to 100 sub-order numbers (`grouporderid`) per call.\n\n| API | status_transition id | Transition name | From status (status_master id, displayname, *description*) | To status (status_master id, displayname, *description*) |\n|---|---|---|---|---|\n| `POST /seller/orders/dispatch` | 895 | VL- Order Confirm by Supplier to Order Dispatched | **106** Order Confirmed by Supplier (*Order Processing*) | **116** Order Dispatched (*Order Shipped*) |\n\n`shipmentList`: one entry per sub-order with `groupOrderId` (**required**, and it must be one of the\n`orderIdList` values of the same request), `logisticName` (courier), `awbNo`, `statusCode` (your/courier\nstatus code) and `shipmentDate` (`yyyy-MM-dd HH:mm:ss` IST recommended). They are recorded on the\nsub-order's **Order Dispatched** history record (shown to store staff) **only when the move to\nDispatched succeeds**. Single-line plain text only.\n\n**Read both maps.** The call answers `\"status\": \"SUCCESS\"` when it processed the batch, even if some\nsub-orders were refused:\n\n- `response.successMap` - sub-order number -> `\"Status updated.\"`\n- `response.errorMap` - sub-order number -> reason. Either map is **absent** when empty.\n- `response.transition` - the transition this call performed (always present on `SUCCESS`).\n\n| `errorMap` reason | Meaning |\n|---|---|\n| `Order is in status <displayname> (<id>); this API moves orders from <from displayname> (<from id>) only.` | The sub-order is not in this API's FROM status (or not on the drop-ship engine) - it was not moved. If `<displayname>` is already this API's TO status, the update was done earlier. |\n| `Order not avilable in vendor.` | Not your sub-order, unknown number, another store's order, or an order number (not a sub-order number) was sent. (Spelling as returned.) |\n| `Error` or any other text | The order engine refused or failed the move for that sub-order - re-read its `statusId` via `/seller/orders/detail` before retrying. |\n\nWhole-call refusals (HTTP 200, `\"status\": \"FAIL\"`, `response: null`, nothing changed):\n\n| Message | Meaning |\n|---|---|\n| `This status change is not enabled for sellers.` | The store has switched this transition off for the seller role. Contact the store team. |\n| `Order not avilable in vendor.` | **None** of the ids is one of your sub-orders. |\n| `orderIdList not found` | `orderIdList` missing or empty. |\n| `orderIdList exceeds the maximum of 100 per request` | Split the batch. |\n| `Invalid orderIdList` | An id is not 1-64 letters/digits/`-`/`_`. |\n| `remark must be at most 1000 characters` / `Invalid remark` | `remark` too long, or not single-line plain text (line breaks, control characters and `<` `>` are refused, as are HTML/script or SQL-like fragments such as `--`). |\n| `Invalid awbNo` / `Invalid logisticName` / `Invalid statusCode` / `Invalid shipmentDate` | Same plain-text rule for `shipmentList` fields. |\n| `every shipmentList entry needs a groupOrderId that is one of the orderIdList values` | A `shipmentList` entry has no `groupOrderId`, or names a sub-order not in `orderIdList`. |\n| `Request body is required.` | Empty body. |\n\n\n## Other request body examples\n\n**Dispatch two sub-orders in one parcel**\n\n```json\n{\n  \"orderIdList\": [\n    \"IASG1216\",\n    \"IASG1217\"\n  ],\n  \"remark\": \"One box\",\n  \"shipmentList\": [\n    {\n      \"groupOrderId\": \"IASG1216\",\n      \"logisticName\": \"Blue Dart\",\n      \"awbNo\": \"BD123456789IN\",\n      \"statusCode\": \"DISPATCHED\",\n      \"shipmentDate\": \"2026-10-14 15:30:00\"\n    },\n    {\n      \"groupOrderId\": \"IASG1217\",\n      \"logisticName\": \"Blue Dart\",\n      \"awbNo\": \"BD123456789IN\",\n      \"statusCode\": \"DISPATCHED\",\n      \"shipmentDate\": \"2026-10-14 15:30:00\"\n    }\n  ]\n}\n```",
        "body": {
         "mode": "raw",
         "raw": "{\n  \"orderIdList\": [\n    \"IASG1216\"\n  ],\n  \"remark\": \"Shipped via Blue Dart\",\n  \"shipmentList\": [\n    {\n      \"groupOrderId\": \"IASG1216\",\n      \"logisticName\": \"Blue Dart\",\n      \"awbNo\": \"BD123456789IN\",\n      \"statusCode\": \"DISPATCHED\",\n      \"shipmentDate\": \"2026-10-14 15:30:00\"\n    }\n  ]\n}",
         "options": {
          "raw": {
           "language": "json"
          }
         }
        }
       },
       "status": "OK",
       "code": 200,
       "_postman_previewlanguage": "json",
       "header": [
        {
         "key": "Content-Type",
         "value": "application/json"
        }
       ],
       "cookie": [],
       "body": "{\n  \"status\": \"FAIL\",\n  \"message\": \"Invalid remark\",\n  \"response\": null\n}"
      },
      {
       "name": "More than 100 ids",
       "originalRequest": {
        "method": "POST",
        "header": [
         {
          "key": "X-Api-Key",
          "value": "{{apiKey}}"
         },
         {
          "key": "Authorization",
          "value": "Bearer {{accessToken}}"
         },
         {
          "key": "Content-Type",
          "value": "application/json"
         }
        ],
        "url": {
         "raw": "{{baseUrl}}/seller/orders/dispatch",
         "host": [
          "{{baseUrl}}"
         ],
         "path": [
          "seller",
          "orders",
          "dispatch"
         ]
        },
        "description": "Dispatch order (transition 895: 106 Order Confirmed by Supplier -> 116 Order Dispatched)\n\n**Scope `seller:orders:write`.** The parcel is handed to the courier.\n\nPerforms **only** status_transition **895** on the drop-ship engine (5, VENDORLOGISTIC), granted to the seller role (Supplier Admin, roles_master 17) in status_rolestatustransitioin. Each sub-order must currently be **106 Order Confirmed by Supplier**; it moves to **116 Order Dispatched**. Do not send a status id - a `statusId` in the body is ignored. Up to 100 sub-order numbers (`grouporderid`) per call.\n\n| API | status_transition id | Transition name | From status (status_master id, displayname, *description*) | To status (status_master id, displayname, *description*) |\n|---|---|---|---|---|\n| `POST /seller/orders/dispatch` | 895 | VL- Order Confirm by Supplier to Order Dispatched | **106** Order Confirmed by Supplier (*Order Processing*) | **116** Order Dispatched (*Order Shipped*) |\n\n`shipmentList`: one entry per sub-order with `groupOrderId` (**required**, and it must be one of the\n`orderIdList` values of the same request), `logisticName` (courier), `awbNo`, `statusCode` (your/courier\nstatus code) and `shipmentDate` (`yyyy-MM-dd HH:mm:ss` IST recommended). They are recorded on the\nsub-order's **Order Dispatched** history record (shown to store staff) **only when the move to\nDispatched succeeds**. Single-line plain text only.\n\n**Read both maps.** The call answers `\"status\": \"SUCCESS\"` when it processed the batch, even if some\nsub-orders were refused:\n\n- `response.successMap` - sub-order number -> `\"Status updated.\"`\n- `response.errorMap` - sub-order number -> reason. Either map is **absent** when empty.\n- `response.transition` - the transition this call performed (always present on `SUCCESS`).\n\n| `errorMap` reason | Meaning |\n|---|---|\n| `Order is in status <displayname> (<id>); this API moves orders from <from displayname> (<from id>) only.` | The sub-order is not in this API's FROM status (or not on the drop-ship engine) - it was not moved. If `<displayname>` is already this API's TO status, the update was done earlier. |\n| `Order not avilable in vendor.` | Not your sub-order, unknown number, another store's order, or an order number (not a sub-order number) was sent. (Spelling as returned.) |\n| `Error` or any other text | The order engine refused or failed the move for that sub-order - re-read its `statusId` via `/seller/orders/detail` before retrying. |\n\nWhole-call refusals (HTTP 200, `\"status\": \"FAIL\"`, `response: null`, nothing changed):\n\n| Message | Meaning |\n|---|---|\n| `This status change is not enabled for sellers.` | The store has switched this transition off for the seller role. Contact the store team. |\n| `Order not avilable in vendor.` | **None** of the ids is one of your sub-orders. |\n| `orderIdList not found` | `orderIdList` missing or empty. |\n| `orderIdList exceeds the maximum of 100 per request` | Split the batch. |\n| `Invalid orderIdList` | An id is not 1-64 letters/digits/`-`/`_`. |\n| `remark must be at most 1000 characters` / `Invalid remark` | `remark` too long, or not single-line plain text (line breaks, control characters and `<` `>` are refused, as are HTML/script or SQL-like fragments such as `--`). |\n| `Invalid awbNo` / `Invalid logisticName` / `Invalid statusCode` / `Invalid shipmentDate` | Same plain-text rule for `shipmentList` fields. |\n| `every shipmentList entry needs a groupOrderId that is one of the orderIdList values` | A `shipmentList` entry has no `groupOrderId`, or names a sub-order not in `orderIdList`. |\n| `Request body is required.` | Empty body. |\n\n\n## Other request body examples\n\n**Dispatch two sub-orders in one parcel**\n\n```json\n{\n  \"orderIdList\": [\n    \"IASG1216\",\n    \"IASG1217\"\n  ],\n  \"remark\": \"One box\",\n  \"shipmentList\": [\n    {\n      \"groupOrderId\": \"IASG1216\",\n      \"logisticName\": \"Blue Dart\",\n      \"awbNo\": \"BD123456789IN\",\n      \"statusCode\": \"DISPATCHED\",\n      \"shipmentDate\": \"2026-10-14 15:30:00\"\n    },\n    {\n      \"groupOrderId\": \"IASG1217\",\n      \"logisticName\": \"Blue Dart\",\n      \"awbNo\": \"BD123456789IN\",\n      \"statusCode\": \"DISPATCHED\",\n      \"shipmentDate\": \"2026-10-14 15:30:00\"\n    }\n  ]\n}\n```",
        "body": {
         "mode": "raw",
         "raw": "{\n  \"orderIdList\": [\n    \"IASG1216\"\n  ],\n  \"remark\": \"Shipped via Blue Dart\",\n  \"shipmentList\": [\n    {\n      \"groupOrderId\": \"IASG1216\",\n      \"logisticName\": \"Blue Dart\",\n      \"awbNo\": \"BD123456789IN\",\n      \"statusCode\": \"DISPATCHED\",\n      \"shipmentDate\": \"2026-10-14 15:30:00\"\n    }\n  ]\n}",
         "options": {
          "raw": {
           "language": "json"
          }
         }
        }
       },
       "status": "OK",
       "code": 200,
       "_postman_previewlanguage": "json",
       "header": [
        {
         "key": "Content-Type",
         "value": "application/json"
        }
       ],
       "cookie": [],
       "body": "{\n  \"status\": \"FAIL\",\n  \"message\": \"orderIdList exceeds the maximum of 100 per request\",\n  \"response\": null\n}"
      },
      {
       "name": "401 - E_AUTH",
       "originalRequest": {
        "method": "POST",
        "header": [
         {
          "key": "X-Api-Key",
          "value": "{{apiKey}}"
         },
         {
          "key": "Authorization",
          "value": "Bearer {{accessToken}}"
         },
         {
          "key": "Content-Type",
          "value": "application/json"
         }
        ],
        "url": {
         "raw": "{{baseUrl}}/seller/orders/dispatch",
         "host": [
          "{{baseUrl}}"
         ],
         "path": [
          "seller",
          "orders",
          "dispatch"
         ]
        },
        "description": "Dispatch order (transition 895: 106 Order Confirmed by Supplier -> 116 Order Dispatched)\n\n**Scope `seller:orders:write`.** The parcel is handed to the courier.\n\nPerforms **only** status_transition **895** on the drop-ship engine (5, VENDORLOGISTIC), granted to the seller role (Supplier Admin, roles_master 17) in status_rolestatustransitioin. Each sub-order must currently be **106 Order Confirmed by Supplier**; it moves to **116 Order Dispatched**. Do not send a status id - a `statusId` in the body is ignored. Up to 100 sub-order numbers (`grouporderid`) per call.\n\n| API | status_transition id | Transition name | From status (status_master id, displayname, *description*) | To status (status_master id, displayname, *description*) |\n|---|---|---|---|---|\n| `POST /seller/orders/dispatch` | 895 | VL- Order Confirm by Supplier to Order Dispatched | **106** Order Confirmed by Supplier (*Order Processing*) | **116** Order Dispatched (*Order Shipped*) |\n\n`shipmentList`: one entry per sub-order with `groupOrderId` (**required**, and it must be one of the\n`orderIdList` values of the same request), `logisticName` (courier), `awbNo`, `statusCode` (your/courier\nstatus code) and `shipmentDate` (`yyyy-MM-dd HH:mm:ss` IST recommended). They are recorded on the\nsub-order's **Order Dispatched** history record (shown to store staff) **only when the move to\nDispatched succeeds**. Single-line plain text only.\n\n**Read both maps.** The call answers `\"status\": \"SUCCESS\"` when it processed the batch, even if some\nsub-orders were refused:\n\n- `response.successMap` - sub-order number -> `\"Status updated.\"`\n- `response.errorMap` - sub-order number -> reason. Either map is **absent** when empty.\n- `response.transition` - the transition this call performed (always present on `SUCCESS`).\n\n| `errorMap` reason | Meaning |\n|---|---|\n| `Order is in status <displayname> (<id>); this API moves orders from <from displayname> (<from id>) only.` | The sub-order is not in this API's FROM status (or not on the drop-ship engine) - it was not moved. If `<displayname>` is already this API's TO status, the update was done earlier. |\n| `Order not avilable in vendor.` | Not your sub-order, unknown number, another store's order, or an order number (not a sub-order number) was sent. (Spelling as returned.) |\n| `Error` or any other text | The order engine refused or failed the move for that sub-order - re-read its `statusId` via `/seller/orders/detail` before retrying. |\n\nWhole-call refusals (HTTP 200, `\"status\": \"FAIL\"`, `response: null`, nothing changed):\n\n| Message | Meaning |\n|---|---|\n| `This status change is not enabled for sellers.` | The store has switched this transition off for the seller role. Contact the store team. |\n| `Order not avilable in vendor.` | **None** of the ids is one of your sub-orders. |\n| `orderIdList not found` | `orderIdList` missing or empty. |\n| `orderIdList exceeds the maximum of 100 per request` | Split the batch. |\n| `Invalid orderIdList` | An id is not 1-64 letters/digits/`-`/`_`. |\n| `remark must be at most 1000 characters` / `Invalid remark` | `remark` too long, or not single-line plain text (line breaks, control characters and `<` `>` are refused, as are HTML/script or SQL-like fragments such as `--`). |\n| `Invalid awbNo` / `Invalid logisticName` / `Invalid statusCode` / `Invalid shipmentDate` | Same plain-text rule for `shipmentList` fields. |\n| `every shipmentList entry needs a groupOrderId that is one of the orderIdList values` | A `shipmentList` entry has no `groupOrderId`, or names a sub-order not in `orderIdList`. |\n| `Request body is required.` | Empty body. |\n\n\n## Other request body examples\n\n**Dispatch two sub-orders in one parcel**\n\n```json\n{\n  \"orderIdList\": [\n    \"IASG1216\",\n    \"IASG1217\"\n  ],\n  \"remark\": \"One box\",\n  \"shipmentList\": [\n    {\n      \"groupOrderId\": \"IASG1216\",\n      \"logisticName\": \"Blue Dart\",\n      \"awbNo\": \"BD123456789IN\",\n      \"statusCode\": \"DISPATCHED\",\n      \"shipmentDate\": \"2026-10-14 15:30:00\"\n    },\n    {\n      \"groupOrderId\": \"IASG1217\",\n      \"logisticName\": \"Blue Dart\",\n      \"awbNo\": \"BD123456789IN\",\n      \"statusCode\": \"DISPATCHED\",\n      \"shipmentDate\": \"2026-10-14 15:30:00\"\n    }\n  ]\n}\n```",
        "body": {
         "mode": "raw",
         "raw": "{\n  \"orderIdList\": [\n    \"IASG1216\"\n  ],\n  \"remark\": \"Shipped via Blue Dart\",\n  \"shipmentList\": [\n    {\n      \"groupOrderId\": \"IASG1216\",\n      \"logisticName\": \"Blue Dart\",\n      \"awbNo\": \"BD123456789IN\",\n      \"statusCode\": \"DISPATCHED\",\n      \"shipmentDate\": \"2026-10-14 15:30:00\"\n    }\n  ]\n}",
         "options": {
          "raw": {
           "language": "json"
          }
         }
        }
       },
       "status": "Unauthorized",
       "code": 401,
       "_postman_previewlanguage": "json",
       "header": [
        {
         "key": "Content-Type",
         "value": "application/json"
        }
       ],
       "cookie": [],
       "body": "{\n  \"status\": \"FAIL\",\n  \"message\": \"Request could not be authorized.\",\n  \"response\": {\n    \"code\": \"E_AUTH\",\n    \"requestId\": \"0d6f4f2e-3c1a-4a43-9f63-1f2a7c9b8e10\"\n  }\n}"
      }
     ],
     "event": [
      {
       "listen": "test",
       "script": {
        "type": "text/javascript",
        "exec": [
         "// Business refusals are HTTP 200 with status FAIL - always look at the envelope.",
         "const b = pm.response.json();",
         "pm.test('envelope present', () => pm.expect(b).to.have.property('status'));",
         "if (b.status !== 'SUCCESS') { console.warn('FAIL:', b.message, 'X-Request-Id', pm.response.headers.get('X-Request-Id')); }"
        ]
       }
      }
     ]
    },
    {
     "name": "Mark order delivered (transition 896: 116 Order Dispatched -> 120 Order Delivered)",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "X-Api-Key",
        "value": "{{apiKey}}"
       },
       {
        "key": "Authorization",
        "value": "Bearer {{accessToken}}"
       },
       {
        "key": "Content-Type",
        "value": "application/json"
       }
      ],
      "url": {
       "raw": "{{baseUrl}}/seller/orders/deliver",
       "host": [
        "{{baseUrl}}"
       ],
       "path": [
        "seller",
        "orders",
        "deliver"
       ]
      },
      "description": "Mark order delivered (transition 896: 116 Order Dispatched -> 120 Order Delivered)\n\n**Scope `seller:orders:write`.** The customer received the parcel. For cash-on-delivery sub-orders, report delivery only after the cash is collected.\n\nPerforms **only** status_transition **896** on the drop-ship engine (5, VENDORLOGISTIC), granted to the seller role (Supplier Admin, roles_master 17) in status_rolestatustransitioin. Each sub-order must currently be **116 Order Dispatched**; it moves to **120 Order Delivered**. Do not send a status id - a `statusId` in the body is ignored. Up to 100 sub-order numbers (`grouporderid`) per call.\n\n| API | status_transition id | Transition name | From status (status_master id, displayname, *description*) | To status (status_master id, displayname, *description*) |\n|---|---|---|---|---|\n| `POST /seller/orders/deliver` | 896 | VL- Order Dispatched to Order Delivered | **116** Order Dispatched (*Order Shipped*) | **120** Order Delivered (*Order Delivered*) |\n\n**Read both maps.** The call answers `\"status\": \"SUCCESS\"` when it processed the batch, even if some\nsub-orders were refused:\n\n- `response.successMap` - sub-order number -> `\"Status updated.\"`\n- `response.errorMap` - sub-order number -> reason. Either map is **absent** when empty.\n- `response.transition` - the transition this call performed (always present on `SUCCESS`).\n\n| `errorMap` reason | Meaning |\n|---|---|\n| `Order is in status <displayname> (<id>); this API moves orders from <from displayname> (<from id>) only.` | The sub-order is not in this API's FROM status (or not on the drop-ship engine) - it was not moved. If `<displayname>` is already this API's TO status, the update was done earlier. |\n| `Order not avilable in vendor.` | Not your sub-order, unknown number, another store's order, or an order number (not a sub-order number) was sent. (Spelling as returned.) |\n| `Error` or any other text | The order engine refused or failed the move for that sub-order - re-read its `statusId` via `/seller/orders/detail` before retrying. |\n\nWhole-call refusals (HTTP 200, `\"status\": \"FAIL\"`, `response: null`, nothing changed):\n\n| Message | Meaning |\n|---|---|\n| `This status change is not enabled for sellers.` | The store has switched this transition off for the seller role. Contact the store team. |\n| `Order not avilable in vendor.` | **None** of the ids is one of your sub-orders. |\n| `orderIdList not found` | `orderIdList` missing or empty. |\n| `orderIdList exceeds the maximum of 100 per request` | Split the batch. |\n| `Invalid orderIdList` | An id is not 1-64 letters/digits/`-`/`_`. |\n| `remark must be at most 1000 characters` / `Invalid remark` | `remark` too long, or not single-line plain text (line breaks, control characters and `<` `>` are refused, as are HTML/script or SQL-like fragments such as `--`). |\n| `Invalid awbNo` / `Invalid logisticName` / `Invalid statusCode` / `Invalid shipmentDate` | Same plain-text rule for `shipmentList` fields. |\n| `every shipmentList entry needs a groupOrderId that is one of the orderIdList values` | A `shipmentList` entry has no `groupOrderId`, or names a sub-order not in `orderIdList`. |\n| `Request body is required.` | Empty body. |\n",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"orderIdList\": [\n    \"IASG1216\"\n  ],\n  \"remark\": \"Delivered, signed by customer\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     },
     "response": [
      {
       "name": "Moved",
       "originalRequest": {
        "method": "POST",
        "header": [
         {
          "key": "X-Api-Key",
          "value": "{{apiKey}}"
         },
         {
          "key": "Authorization",
          "value": "Bearer {{accessToken}}"
         },
         {
          "key": "Content-Type",
          "value": "application/json"
         }
        ],
        "url": {
         "raw": "{{baseUrl}}/seller/orders/deliver",
         "host": [
          "{{baseUrl}}"
         ],
         "path": [
          "seller",
          "orders",
          "deliver"
         ]
        },
        "description": "Mark order delivered (transition 896: 116 Order Dispatched -> 120 Order Delivered)\n\n**Scope `seller:orders:write`.** The customer received the parcel. For cash-on-delivery sub-orders, report delivery only after the cash is collected.\n\nPerforms **only** status_transition **896** on the drop-ship engine (5, VENDORLOGISTIC), granted to the seller role (Supplier Admin, roles_master 17) in status_rolestatustransitioin. Each sub-order must currently be **116 Order Dispatched**; it moves to **120 Order Delivered**. Do not send a status id - a `statusId` in the body is ignored. Up to 100 sub-order numbers (`grouporderid`) per call.\n\n| API | status_transition id | Transition name | From status (status_master id, displayname, *description*) | To status (status_master id, displayname, *description*) |\n|---|---|---|---|---|\n| `POST /seller/orders/deliver` | 896 | VL- Order Dispatched to Order Delivered | **116** Order Dispatched (*Order Shipped*) | **120** Order Delivered (*Order Delivered*) |\n\n**Read both maps.** The call answers `\"status\": \"SUCCESS\"` when it processed the batch, even if some\nsub-orders were refused:\n\n- `response.successMap` - sub-order number -> `\"Status updated.\"`\n- `response.errorMap` - sub-order number -> reason. Either map is **absent** when empty.\n- `response.transition` - the transition this call performed (always present on `SUCCESS`).\n\n| `errorMap` reason | Meaning |\n|---|---|\n| `Order is in status <displayname> (<id>); this API moves orders from <from displayname> (<from id>) only.` | The sub-order is not in this API's FROM status (or not on the drop-ship engine) - it was not moved. If `<displayname>` is already this API's TO status, the update was done earlier. |\n| `Order not avilable in vendor.` | Not your sub-order, unknown number, another store's order, or an order number (not a sub-order number) was sent. (Spelling as returned.) |\n| `Error` or any other text | The order engine refused or failed the move for that sub-order - re-read its `statusId` via `/seller/orders/detail` before retrying. |\n\nWhole-call refusals (HTTP 200, `\"status\": \"FAIL\"`, `response: null`, nothing changed):\n\n| Message | Meaning |\n|---|---|\n| `This status change is not enabled for sellers.` | The store has switched this transition off for the seller role. Contact the store team. |\n| `Order not avilable in vendor.` | **None** of the ids is one of your sub-orders. |\n| `orderIdList not found` | `orderIdList` missing or empty. |\n| `orderIdList exceeds the maximum of 100 per request` | Split the batch. |\n| `Invalid orderIdList` | An id is not 1-64 letters/digits/`-`/`_`. |\n| `remark must be at most 1000 characters` / `Invalid remark` | `remark` too long, or not single-line plain text (line breaks, control characters and `<` `>` are refused, as are HTML/script or SQL-like fragments such as `--`). |\n| `Invalid awbNo` / `Invalid logisticName` / `Invalid statusCode` / `Invalid shipmentDate` | Same plain-text rule for `shipmentList` fields. |\n| `every shipmentList entry needs a groupOrderId that is one of the orderIdList values` | A `shipmentList` entry has no `groupOrderId`, or names a sub-order not in `orderIdList`. |\n| `Request body is required.` | Empty body. |\n",
        "body": {
         "mode": "raw",
         "raw": "{\n  \"orderIdList\": [\n    \"IASG1216\"\n  ],\n  \"remark\": \"Delivered, signed by customer\"\n}",
         "options": {
          "raw": {
           "language": "json"
          }
         }
        }
       },
       "status": "OK",
       "code": 200,
       "_postman_previewlanguage": "json",
       "header": [
        {
         "key": "Content-Type",
         "value": "application/json"
        }
       ],
       "cookie": [],
       "body": "{\n  \"status\": \"SUCCESS\",\n  \"message\": \"Success\",\n  \"response\": {\n    \"successMap\": {\n      \"IASG1216\": \"Status updated.\"\n    },\n    \"transition\": {\n      \"transitionId\": 896,\n      \"fromStatusId\": 116,\n      \"fromStatus\": \"Order Dispatched\",\n      \"toStatusId\": 120,\n      \"toStatus\": \"Order Delivered\"\n    }\n  }\n}"
      },
      {
       "name": "One sub-order not yours - read errorMap",
       "originalRequest": {
        "method": "POST",
        "header": [
         {
          "key": "X-Api-Key",
          "value": "{{apiKey}}"
         },
         {
          "key": "Authorization",
          "value": "Bearer {{accessToken}}"
         },
         {
          "key": "Content-Type",
          "value": "application/json"
         }
        ],
        "url": {
         "raw": "{{baseUrl}}/seller/orders/deliver",
         "host": [
          "{{baseUrl}}"
         ],
         "path": [
          "seller",
          "orders",
          "deliver"
         ]
        },
        "description": "Mark order delivered (transition 896: 116 Order Dispatched -> 120 Order Delivered)\n\n**Scope `seller:orders:write`.** The customer received the parcel. For cash-on-delivery sub-orders, report delivery only after the cash is collected.\n\nPerforms **only** status_transition **896** on the drop-ship engine (5, VENDORLOGISTIC), granted to the seller role (Supplier Admin, roles_master 17) in status_rolestatustransitioin. Each sub-order must currently be **116 Order Dispatched**; it moves to **120 Order Delivered**. Do not send a status id - a `statusId` in the body is ignored. Up to 100 sub-order numbers (`grouporderid`) per call.\n\n| API | status_transition id | Transition name | From status (status_master id, displayname, *description*) | To status (status_master id, displayname, *description*) |\n|---|---|---|---|---|\n| `POST /seller/orders/deliver` | 896 | VL- Order Dispatched to Order Delivered | **116** Order Dispatched (*Order Shipped*) | **120** Order Delivered (*Order Delivered*) |\n\n**Read both maps.** The call answers `\"status\": \"SUCCESS\"` when it processed the batch, even if some\nsub-orders were refused:\n\n- `response.successMap` - sub-order number -> `\"Status updated.\"`\n- `response.errorMap` - sub-order number -> reason. Either map is **absent** when empty.\n- `response.transition` - the transition this call performed (always present on `SUCCESS`).\n\n| `errorMap` reason | Meaning |\n|---|---|\n| `Order is in status <displayname> (<id>); this API moves orders from <from displayname> (<from id>) only.` | The sub-order is not in this API's FROM status (or not on the drop-ship engine) - it was not moved. If `<displayname>` is already this API's TO status, the update was done earlier. |\n| `Order not avilable in vendor.` | Not your sub-order, unknown number, another store's order, or an order number (not a sub-order number) was sent. (Spelling as returned.) |\n| `Error` or any other text | The order engine refused or failed the move for that sub-order - re-read its `statusId` via `/seller/orders/detail` before retrying. |\n\nWhole-call refusals (HTTP 200, `\"status\": \"FAIL\"`, `response: null`, nothing changed):\n\n| Message | Meaning |\n|---|---|\n| `This status change is not enabled for sellers.` | The store has switched this transition off for the seller role. Contact the store team. |\n| `Order not avilable in vendor.` | **None** of the ids is one of your sub-orders. |\n| `orderIdList not found` | `orderIdList` missing or empty. |\n| `orderIdList exceeds the maximum of 100 per request` | Split the batch. |\n| `Invalid orderIdList` | An id is not 1-64 letters/digits/`-`/`_`. |\n| `remark must be at most 1000 characters` / `Invalid remark` | `remark` too long, or not single-line plain text (line breaks, control characters and `<` `>` are refused, as are HTML/script or SQL-like fragments such as `--`). |\n| `Invalid awbNo` / `Invalid logisticName` / `Invalid statusCode` / `Invalid shipmentDate` | Same plain-text rule for `shipmentList` fields. |\n| `every shipmentList entry needs a groupOrderId that is one of the orderIdList values` | A `shipmentList` entry has no `groupOrderId`, or names a sub-order not in `orderIdList`. |\n| `Request body is required.` | Empty body. |\n",
        "body": {
         "mode": "raw",
         "raw": "{\n  \"orderIdList\": [\n    \"IASG1216\"\n  ],\n  \"remark\": \"Delivered, signed by customer\"\n}",
         "options": {
          "raw": {
           "language": "json"
          }
         }
        }
       },
       "status": "OK",
       "code": 200,
       "_postman_previewlanguage": "json",
       "header": [
        {
         "key": "Content-Type",
         "value": "application/json"
        }
       ],
       "cookie": [],
       "body": "{\n  \"status\": \"SUCCESS\",\n  \"message\": \"Success\",\n  \"response\": {\n    \"successMap\": {\n      \"IASG1216\": \"Status updated.\"\n    },\n    \"errorMap\": {\n      \"IASG9999\": \"Order not avilable in vendor.\"\n    },\n    \"transition\": {\n      \"transitionId\": 896,\n      \"fromStatusId\": 116,\n      \"fromStatus\": \"Order Dispatched\",\n      \"toStatusId\": 120,\n      \"toStatus\": \"Order Delivered\"\n    }\n  }\n}"
      },
      {
       "name": "Not yet dispatched (still 106)",
       "originalRequest": {
        "method": "POST",
        "header": [
         {
          "key": "X-Api-Key",
          "value": "{{apiKey}}"
         },
         {
          "key": "Authorization",
          "value": "Bearer {{accessToken}}"
         },
         {
          "key": "Content-Type",
          "value": "application/json"
         }
        ],
        "url": {
         "raw": "{{baseUrl}}/seller/orders/deliver",
         "host": [
          "{{baseUrl}}"
         ],
         "path": [
          "seller",
          "orders",
          "deliver"
         ]
        },
        "description": "Mark order delivered (transition 896: 116 Order Dispatched -> 120 Order Delivered)\n\n**Scope `seller:orders:write`.** The customer received the parcel. For cash-on-delivery sub-orders, report delivery only after the cash is collected.\n\nPerforms **only** status_transition **896** on the drop-ship engine (5, VENDORLOGISTIC), granted to the seller role (Supplier Admin, roles_master 17) in status_rolestatustransitioin. Each sub-order must currently be **116 Order Dispatched**; it moves to **120 Order Delivered**. Do not send a status id - a `statusId` in the body is ignored. Up to 100 sub-order numbers (`grouporderid`) per call.\n\n| API | status_transition id | Transition name | From status (status_master id, displayname, *description*) | To status (status_master id, displayname, *description*) |\n|---|---|---|---|---|\n| `POST /seller/orders/deliver` | 896 | VL- Order Dispatched to Order Delivered | **116** Order Dispatched (*Order Shipped*) | **120** Order Delivered (*Order Delivered*) |\n\n**Read both maps.** The call answers `\"status\": \"SUCCESS\"` when it processed the batch, even if some\nsub-orders were refused:\n\n- `response.successMap` - sub-order number -> `\"Status updated.\"`\n- `response.errorMap` - sub-order number -> reason. Either map is **absent** when empty.\n- `response.transition` - the transition this call performed (always present on `SUCCESS`).\n\n| `errorMap` reason | Meaning |\n|---|---|\n| `Order is in status <displayname> (<id>); this API moves orders from <from displayname> (<from id>) only.` | The sub-order is not in this API's FROM status (or not on the drop-ship engine) - it was not moved. If `<displayname>` is already this API's TO status, the update was done earlier. |\n| `Order not avilable in vendor.` | Not your sub-order, unknown number, another store's order, or an order number (not a sub-order number) was sent. (Spelling as returned.) |\n| `Error` or any other text | The order engine refused or failed the move for that sub-order - re-read its `statusId` via `/seller/orders/detail` before retrying. |\n\nWhole-call refusals (HTTP 200, `\"status\": \"FAIL\"`, `response: null`, nothing changed):\n\n| Message | Meaning |\n|---|---|\n| `This status change is not enabled for sellers.` | The store has switched this transition off for the seller role. Contact the store team. |\n| `Order not avilable in vendor.` | **None** of the ids is one of your sub-orders. |\n| `orderIdList not found` | `orderIdList` missing or empty. |\n| `orderIdList exceeds the maximum of 100 per request` | Split the batch. |\n| `Invalid orderIdList` | An id is not 1-64 letters/digits/`-`/`_`. |\n| `remark must be at most 1000 characters` / `Invalid remark` | `remark` too long, or not single-line plain text (line breaks, control characters and `<` `>` are refused, as are HTML/script or SQL-like fragments such as `--`). |\n| `Invalid awbNo` / `Invalid logisticName` / `Invalid statusCode` / `Invalid shipmentDate` | Same plain-text rule for `shipmentList` fields. |\n| `every shipmentList entry needs a groupOrderId that is one of the orderIdList values` | A `shipmentList` entry has no `groupOrderId`, or names a sub-order not in `orderIdList`. |\n| `Request body is required.` | Empty body. |\n",
        "body": {
         "mode": "raw",
         "raw": "{\n  \"orderIdList\": [\n    \"IASG1216\"\n  ],\n  \"remark\": \"Delivered, signed by customer\"\n}",
         "options": {
          "raw": {
           "language": "json"
          }
         }
        }
       },
       "status": "OK",
       "code": 200,
       "_postman_previewlanguage": "json",
       "header": [
        {
         "key": "Content-Type",
         "value": "application/json"
        }
       ],
       "cookie": [],
       "body": "{\n  \"status\": \"SUCCESS\",\n  \"message\": \"Success\",\n  \"response\": {\n    \"errorMap\": {\n      \"IASG1216\": \"Order is in status Order Confirmed by Supplier (106); this API moves orders from Order Dispatched (116) only.\"\n    },\n    \"transition\": {\n      \"transitionId\": 896,\n      \"fromStatusId\": 116,\n      \"fromStatus\": \"Order Dispatched\",\n      \"toStatusId\": 120,\n      \"toStatus\": \"Order Delivered\"\n    }\n  }\n}"
      },
      {
       "name": "Transition switched off for sellers",
       "originalRequest": {
        "method": "POST",
        "header": [
         {
          "key": "X-Api-Key",
          "value": "{{apiKey}}"
         },
         {
          "key": "Authorization",
          "value": "Bearer {{accessToken}}"
         },
         {
          "key": "Content-Type",
          "value": "application/json"
         }
        ],
        "url": {
         "raw": "{{baseUrl}}/seller/orders/deliver",
         "host": [
          "{{baseUrl}}"
         ],
         "path": [
          "seller",
          "orders",
          "deliver"
         ]
        },
        "description": "Mark order delivered (transition 896: 116 Order Dispatched -> 120 Order Delivered)\n\n**Scope `seller:orders:write`.** The customer received the parcel. For cash-on-delivery sub-orders, report delivery only after the cash is collected.\n\nPerforms **only** status_transition **896** on the drop-ship engine (5, VENDORLOGISTIC), granted to the seller role (Supplier Admin, roles_master 17) in status_rolestatustransitioin. Each sub-order must currently be **116 Order Dispatched**; it moves to **120 Order Delivered**. Do not send a status id - a `statusId` in the body is ignored. Up to 100 sub-order numbers (`grouporderid`) per call.\n\n| API | status_transition id | Transition name | From status (status_master id, displayname, *description*) | To status (status_master id, displayname, *description*) |\n|---|---|---|---|---|\n| `POST /seller/orders/deliver` | 896 | VL- Order Dispatched to Order Delivered | **116** Order Dispatched (*Order Shipped*) | **120** Order Delivered (*Order Delivered*) |\n\n**Read both maps.** The call answers `\"status\": \"SUCCESS\"` when it processed the batch, even if some\nsub-orders were refused:\n\n- `response.successMap` - sub-order number -> `\"Status updated.\"`\n- `response.errorMap` - sub-order number -> reason. Either map is **absent** when empty.\n- `response.transition` - the transition this call performed (always present on `SUCCESS`).\n\n| `errorMap` reason | Meaning |\n|---|---|\n| `Order is in status <displayname> (<id>); this API moves orders from <from displayname> (<from id>) only.` | The sub-order is not in this API's FROM status (or not on the drop-ship engine) - it was not moved. If `<displayname>` is already this API's TO status, the update was done earlier. |\n| `Order not avilable in vendor.` | Not your sub-order, unknown number, another store's order, or an order number (not a sub-order number) was sent. (Spelling as returned.) |\n| `Error` or any other text | The order engine refused or failed the move for that sub-order - re-read its `statusId` via `/seller/orders/detail` before retrying. |\n\nWhole-call refusals (HTTP 200, `\"status\": \"FAIL\"`, `response: null`, nothing changed):\n\n| Message | Meaning |\n|---|---|\n| `This status change is not enabled for sellers.` | The store has switched this transition off for the seller role. Contact the store team. |\n| `Order not avilable in vendor.` | **None** of the ids is one of your sub-orders. |\n| `orderIdList not found` | `orderIdList` missing or empty. |\n| `orderIdList exceeds the maximum of 100 per request` | Split the batch. |\n| `Invalid orderIdList` | An id is not 1-64 letters/digits/`-`/`_`. |\n| `remark must be at most 1000 characters` / `Invalid remark` | `remark` too long, or not single-line plain text (line breaks, control characters and `<` `>` are refused, as are HTML/script or SQL-like fragments such as `--`). |\n| `Invalid awbNo` / `Invalid logisticName` / `Invalid statusCode` / `Invalid shipmentDate` | Same plain-text rule for `shipmentList` fields. |\n| `every shipmentList entry needs a groupOrderId that is one of the orderIdList values` | A `shipmentList` entry has no `groupOrderId`, or names a sub-order not in `orderIdList`. |\n| `Request body is required.` | Empty body. |\n",
        "body": {
         "mode": "raw",
         "raw": "{\n  \"orderIdList\": [\n    \"IASG1216\"\n  ],\n  \"remark\": \"Delivered, signed by customer\"\n}",
         "options": {
          "raw": {
           "language": "json"
          }
         }
        }
       },
       "status": "OK",
       "code": 200,
       "_postman_previewlanguage": "json",
       "header": [
        {
         "key": "Content-Type",
         "value": "application/json"
        }
       ],
       "cookie": [],
       "body": "{\n  \"status\": \"FAIL\",\n  \"message\": \"This status change is not enabled for sellers.\",\n  \"response\": null\n}"
      },
      {
       "name": "None of the ids is your sub-order",
       "originalRequest": {
        "method": "POST",
        "header": [
         {
          "key": "X-Api-Key",
          "value": "{{apiKey}}"
         },
         {
          "key": "Authorization",
          "value": "Bearer {{accessToken}}"
         },
         {
          "key": "Content-Type",
          "value": "application/json"
         }
        ],
        "url": {
         "raw": "{{baseUrl}}/seller/orders/deliver",
         "host": [
          "{{baseUrl}}"
         ],
         "path": [
          "seller",
          "orders",
          "deliver"
         ]
        },
        "description": "Mark order delivered (transition 896: 116 Order Dispatched -> 120 Order Delivered)\n\n**Scope `seller:orders:write`.** The customer received the parcel. For cash-on-delivery sub-orders, report delivery only after the cash is collected.\n\nPerforms **only** status_transition **896** on the drop-ship engine (5, VENDORLOGISTIC), granted to the seller role (Supplier Admin, roles_master 17) in status_rolestatustransitioin. Each sub-order must currently be **116 Order Dispatched**; it moves to **120 Order Delivered**. Do not send a status id - a `statusId` in the body is ignored. Up to 100 sub-order numbers (`grouporderid`) per call.\n\n| API | status_transition id | Transition name | From status (status_master id, displayname, *description*) | To status (status_master id, displayname, *description*) |\n|---|---|---|---|---|\n| `POST /seller/orders/deliver` | 896 | VL- Order Dispatched to Order Delivered | **116** Order Dispatched (*Order Shipped*) | **120** Order Delivered (*Order Delivered*) |\n\n**Read both maps.** The call answers `\"status\": \"SUCCESS\"` when it processed the batch, even if some\nsub-orders were refused:\n\n- `response.successMap` - sub-order number -> `\"Status updated.\"`\n- `response.errorMap` - sub-order number -> reason. Either map is **absent** when empty.\n- `response.transition` - the transition this call performed (always present on `SUCCESS`).\n\n| `errorMap` reason | Meaning |\n|---|---|\n| `Order is in status <displayname> (<id>); this API moves orders from <from displayname> (<from id>) only.` | The sub-order is not in this API's FROM status (or not on the drop-ship engine) - it was not moved. If `<displayname>` is already this API's TO status, the update was done earlier. |\n| `Order not avilable in vendor.` | Not your sub-order, unknown number, another store's order, or an order number (not a sub-order number) was sent. (Spelling as returned.) |\n| `Error` or any other text | The order engine refused or failed the move for that sub-order - re-read its `statusId` via `/seller/orders/detail` before retrying. |\n\nWhole-call refusals (HTTP 200, `\"status\": \"FAIL\"`, `response: null`, nothing changed):\n\n| Message | Meaning |\n|---|---|\n| `This status change is not enabled for sellers.` | The store has switched this transition off for the seller role. Contact the store team. |\n| `Order not avilable in vendor.` | **None** of the ids is one of your sub-orders. |\n| `orderIdList not found` | `orderIdList` missing or empty. |\n| `orderIdList exceeds the maximum of 100 per request` | Split the batch. |\n| `Invalid orderIdList` | An id is not 1-64 letters/digits/`-`/`_`. |\n| `remark must be at most 1000 characters` / `Invalid remark` | `remark` too long, or not single-line plain text (line breaks, control characters and `<` `>` are refused, as are HTML/script or SQL-like fragments such as `--`). |\n| `Invalid awbNo` / `Invalid logisticName` / `Invalid statusCode` / `Invalid shipmentDate` | Same plain-text rule for `shipmentList` fields. |\n| `every shipmentList entry needs a groupOrderId that is one of the orderIdList values` | A `shipmentList` entry has no `groupOrderId`, or names a sub-order not in `orderIdList`. |\n| `Request body is required.` | Empty body. |\n",
        "body": {
         "mode": "raw",
         "raw": "{\n  \"orderIdList\": [\n    \"IASG1216\"\n  ],\n  \"remark\": \"Delivered, signed by customer\"\n}",
         "options": {
          "raw": {
           "language": "json"
          }
         }
        }
       },
       "status": "OK",
       "code": 200,
       "_postman_previewlanguage": "json",
       "header": [
        {
         "key": "Content-Type",
         "value": "application/json"
        }
       ],
       "cookie": [],
       "body": "{\n  \"status\": \"FAIL\",\n  \"message\": \"Order not avilable in vendor.\",\n  \"response\": null\n}"
      },
      {
       "name": "remark not plain text",
       "originalRequest": {
        "method": "POST",
        "header": [
         {
          "key": "X-Api-Key",
          "value": "{{apiKey}}"
         },
         {
          "key": "Authorization",
          "value": "Bearer {{accessToken}}"
         },
         {
          "key": "Content-Type",
          "value": "application/json"
         }
        ],
        "url": {
         "raw": "{{baseUrl}}/seller/orders/deliver",
         "host": [
          "{{baseUrl}}"
         ],
         "path": [
          "seller",
          "orders",
          "deliver"
         ]
        },
        "description": "Mark order delivered (transition 896: 116 Order Dispatched -> 120 Order Delivered)\n\n**Scope `seller:orders:write`.** The customer received the parcel. For cash-on-delivery sub-orders, report delivery only after the cash is collected.\n\nPerforms **only** status_transition **896** on the drop-ship engine (5, VENDORLOGISTIC), granted to the seller role (Supplier Admin, roles_master 17) in status_rolestatustransitioin. Each sub-order must currently be **116 Order Dispatched**; it moves to **120 Order Delivered**. Do not send a status id - a `statusId` in the body is ignored. Up to 100 sub-order numbers (`grouporderid`) per call.\n\n| API | status_transition id | Transition name | From status (status_master id, displayname, *description*) | To status (status_master id, displayname, *description*) |\n|---|---|---|---|---|\n| `POST /seller/orders/deliver` | 896 | VL- Order Dispatched to Order Delivered | **116** Order Dispatched (*Order Shipped*) | **120** Order Delivered (*Order Delivered*) |\n\n**Read both maps.** The call answers `\"status\": \"SUCCESS\"` when it processed the batch, even if some\nsub-orders were refused:\n\n- `response.successMap` - sub-order number -> `\"Status updated.\"`\n- `response.errorMap` - sub-order number -> reason. Either map is **absent** when empty.\n- `response.transition` - the transition this call performed (always present on `SUCCESS`).\n\n| `errorMap` reason | Meaning |\n|---|---|\n| `Order is in status <displayname> (<id>); this API moves orders from <from displayname> (<from id>) only.` | The sub-order is not in this API's FROM status (or not on the drop-ship engine) - it was not moved. If `<displayname>` is already this API's TO status, the update was done earlier. |\n| `Order not avilable in vendor.` | Not your sub-order, unknown number, another store's order, or an order number (not a sub-order number) was sent. (Spelling as returned.) |\n| `Error` or any other text | The order engine refused or failed the move for that sub-order - re-read its `statusId` via `/seller/orders/detail` before retrying. |\n\nWhole-call refusals (HTTP 200, `\"status\": \"FAIL\"`, `response: null`, nothing changed):\n\n| Message | Meaning |\n|---|---|\n| `This status change is not enabled for sellers.` | The store has switched this transition off for the seller role. Contact the store team. |\n| `Order not avilable in vendor.` | **None** of the ids is one of your sub-orders. |\n| `orderIdList not found` | `orderIdList` missing or empty. |\n| `orderIdList exceeds the maximum of 100 per request` | Split the batch. |\n| `Invalid orderIdList` | An id is not 1-64 letters/digits/`-`/`_`. |\n| `remark must be at most 1000 characters` / `Invalid remark` | `remark` too long, or not single-line plain text (line breaks, control characters and `<` `>` are refused, as are HTML/script or SQL-like fragments such as `--`). |\n| `Invalid awbNo` / `Invalid logisticName` / `Invalid statusCode` / `Invalid shipmentDate` | Same plain-text rule for `shipmentList` fields. |\n| `every shipmentList entry needs a groupOrderId that is one of the orderIdList values` | A `shipmentList` entry has no `groupOrderId`, or names a sub-order not in `orderIdList`. |\n| `Request body is required.` | Empty body. |\n",
        "body": {
         "mode": "raw",
         "raw": "{\n  \"orderIdList\": [\n    \"IASG1216\"\n  ],\n  \"remark\": \"Delivered, signed by customer\"\n}",
         "options": {
          "raw": {
           "language": "json"
          }
         }
        }
       },
       "status": "OK",
       "code": 200,
       "_postman_previewlanguage": "json",
       "header": [
        {
         "key": "Content-Type",
         "value": "application/json"
        }
       ],
       "cookie": [],
       "body": "{\n  \"status\": \"FAIL\",\n  \"message\": \"Invalid remark\",\n  \"response\": null\n}"
      },
      {
       "name": "More than 100 ids",
       "originalRequest": {
        "method": "POST",
        "header": [
         {
          "key": "X-Api-Key",
          "value": "{{apiKey}}"
         },
         {
          "key": "Authorization",
          "value": "Bearer {{accessToken}}"
         },
         {
          "key": "Content-Type",
          "value": "application/json"
         }
        ],
        "url": {
         "raw": "{{baseUrl}}/seller/orders/deliver",
         "host": [
          "{{baseUrl}}"
         ],
         "path": [
          "seller",
          "orders",
          "deliver"
         ]
        },
        "description": "Mark order delivered (transition 896: 116 Order Dispatched -> 120 Order Delivered)\n\n**Scope `seller:orders:write`.** The customer received the parcel. For cash-on-delivery sub-orders, report delivery only after the cash is collected.\n\nPerforms **only** status_transition **896** on the drop-ship engine (5, VENDORLOGISTIC), granted to the seller role (Supplier Admin, roles_master 17) in status_rolestatustransitioin. Each sub-order must currently be **116 Order Dispatched**; it moves to **120 Order Delivered**. Do not send a status id - a `statusId` in the body is ignored. Up to 100 sub-order numbers (`grouporderid`) per call.\n\n| API | status_transition id | Transition name | From status (status_master id, displayname, *description*) | To status (status_master id, displayname, *description*) |\n|---|---|---|---|---|\n| `POST /seller/orders/deliver` | 896 | VL- Order Dispatched to Order Delivered | **116** Order Dispatched (*Order Shipped*) | **120** Order Delivered (*Order Delivered*) |\n\n**Read both maps.** The call answers `\"status\": \"SUCCESS\"` when it processed the batch, even if some\nsub-orders were refused:\n\n- `response.successMap` - sub-order number -> `\"Status updated.\"`\n- `response.errorMap` - sub-order number -> reason. Either map is **absent** when empty.\n- `response.transition` - the transition this call performed (always present on `SUCCESS`).\n\n| `errorMap` reason | Meaning |\n|---|---|\n| `Order is in status <displayname> (<id>); this API moves orders from <from displayname> (<from id>) only.` | The sub-order is not in this API's FROM status (or not on the drop-ship engine) - it was not moved. If `<displayname>` is already this API's TO status, the update was done earlier. |\n| `Order not avilable in vendor.` | Not your sub-order, unknown number, another store's order, or an order number (not a sub-order number) was sent. (Spelling as returned.) |\n| `Error` or any other text | The order engine refused or failed the move for that sub-order - re-read its `statusId` via `/seller/orders/detail` before retrying. |\n\nWhole-call refusals (HTTP 200, `\"status\": \"FAIL\"`, `response: null`, nothing changed):\n\n| Message | Meaning |\n|---|---|\n| `This status change is not enabled for sellers.` | The store has switched this transition off for the seller role. Contact the store team. |\n| `Order not avilable in vendor.` | **None** of the ids is one of your sub-orders. |\n| `orderIdList not found` | `orderIdList` missing or empty. |\n| `orderIdList exceeds the maximum of 100 per request` | Split the batch. |\n| `Invalid orderIdList` | An id is not 1-64 letters/digits/`-`/`_`. |\n| `remark must be at most 1000 characters` / `Invalid remark` | `remark` too long, or not single-line plain text (line breaks, control characters and `<` `>` are refused, as are HTML/script or SQL-like fragments such as `--`). |\n| `Invalid awbNo` / `Invalid logisticName` / `Invalid statusCode` / `Invalid shipmentDate` | Same plain-text rule for `shipmentList` fields. |\n| `every shipmentList entry needs a groupOrderId that is one of the orderIdList values` | A `shipmentList` entry has no `groupOrderId`, or names a sub-order not in `orderIdList`. |\n| `Request body is required.` | Empty body. |\n",
        "body": {
         "mode": "raw",
         "raw": "{\n  \"orderIdList\": [\n    \"IASG1216\"\n  ],\n  \"remark\": \"Delivered, signed by customer\"\n}",
         "options": {
          "raw": {
           "language": "json"
          }
         }
        }
       },
       "status": "OK",
       "code": 200,
       "_postman_previewlanguage": "json",
       "header": [
        {
         "key": "Content-Type",
         "value": "application/json"
        }
       ],
       "cookie": [],
       "body": "{\n  \"status\": \"FAIL\",\n  \"message\": \"orderIdList exceeds the maximum of 100 per request\",\n  \"response\": null\n}"
      },
      {
       "name": "401 - E_AUTH",
       "originalRequest": {
        "method": "POST",
        "header": [
         {
          "key": "X-Api-Key",
          "value": "{{apiKey}}"
         },
         {
          "key": "Authorization",
          "value": "Bearer {{accessToken}}"
         },
         {
          "key": "Content-Type",
          "value": "application/json"
         }
        ],
        "url": {
         "raw": "{{baseUrl}}/seller/orders/deliver",
         "host": [
          "{{baseUrl}}"
         ],
         "path": [
          "seller",
          "orders",
          "deliver"
         ]
        },
        "description": "Mark order delivered (transition 896: 116 Order Dispatched -> 120 Order Delivered)\n\n**Scope `seller:orders:write`.** The customer received the parcel. For cash-on-delivery sub-orders, report delivery only after the cash is collected.\n\nPerforms **only** status_transition **896** on the drop-ship engine (5, VENDORLOGISTIC), granted to the seller role (Supplier Admin, roles_master 17) in status_rolestatustransitioin. Each sub-order must currently be **116 Order Dispatched**; it moves to **120 Order Delivered**. Do not send a status id - a `statusId` in the body is ignored. Up to 100 sub-order numbers (`grouporderid`) per call.\n\n| API | status_transition id | Transition name | From status (status_master id, displayname, *description*) | To status (status_master id, displayname, *description*) |\n|---|---|---|---|---|\n| `POST /seller/orders/deliver` | 896 | VL- Order Dispatched to Order Delivered | **116** Order Dispatched (*Order Shipped*) | **120** Order Delivered (*Order Delivered*) |\n\n**Read both maps.** The call answers `\"status\": \"SUCCESS\"` when it processed the batch, even if some\nsub-orders were refused:\n\n- `response.successMap` - sub-order number -> `\"Status updated.\"`\n- `response.errorMap` - sub-order number -> reason. Either map is **absent** when empty.\n- `response.transition` - the transition this call performed (always present on `SUCCESS`).\n\n| `errorMap` reason | Meaning |\n|---|---|\n| `Order is in status <displayname> (<id>); this API moves orders from <from displayname> (<from id>) only.` | The sub-order is not in this API's FROM status (or not on the drop-ship engine) - it was not moved. If `<displayname>` is already this API's TO status, the update was done earlier. |\n| `Order not avilable in vendor.` | Not your sub-order, unknown number, another store's order, or an order number (not a sub-order number) was sent. (Spelling as returned.) |\n| `Error` or any other text | The order engine refused or failed the move for that sub-order - re-read its `statusId` via `/seller/orders/detail` before retrying. |\n\nWhole-call refusals (HTTP 200, `\"status\": \"FAIL\"`, `response: null`, nothing changed):\n\n| Message | Meaning |\n|---|---|\n| `This status change is not enabled for sellers.` | The store has switched this transition off for the seller role. Contact the store team. |\n| `Order not avilable in vendor.` | **None** of the ids is one of your sub-orders. |\n| `orderIdList not found` | `orderIdList` missing or empty. |\n| `orderIdList exceeds the maximum of 100 per request` | Split the batch. |\n| `Invalid orderIdList` | An id is not 1-64 letters/digits/`-`/`_`. |\n| `remark must be at most 1000 characters` / `Invalid remark` | `remark` too long, or not single-line plain text (line breaks, control characters and `<` `>` are refused, as are HTML/script or SQL-like fragments such as `--`). |\n| `Invalid awbNo` / `Invalid logisticName` / `Invalid statusCode` / `Invalid shipmentDate` | Same plain-text rule for `shipmentList` fields. |\n| `every shipmentList entry needs a groupOrderId that is one of the orderIdList values` | A `shipmentList` entry has no `groupOrderId`, or names a sub-order not in `orderIdList`. |\n| `Request body is required.` | Empty body. |\n",
        "body": {
         "mode": "raw",
         "raw": "{\n  \"orderIdList\": [\n    \"IASG1216\"\n  ],\n  \"remark\": \"Delivered, signed by customer\"\n}",
         "options": {
          "raw": {
           "language": "json"
          }
         }
        }
       },
       "status": "Unauthorized",
       "code": 401,
       "_postman_previewlanguage": "json",
       "header": [
        {
         "key": "Content-Type",
         "value": "application/json"
        }
       ],
       "cookie": [],
       "body": "{\n  \"status\": \"FAIL\",\n  \"message\": \"Request could not be authorized.\",\n  \"response\": {\n    \"code\": \"E_AUTH\",\n    \"requestId\": \"0d6f4f2e-3c1a-4a43-9f63-1f2a7c9b8e10\"\n  }\n}"
      }
     ],
     "event": [
      {
       "listen": "test",
       "script": {
        "type": "text/javascript",
        "exec": [
         "// Business refusals are HTTP 200 with status FAIL - always look at the envelope.",
         "const b = pm.response.json();",
         "pm.test('envelope present', () => pm.expect(b).to.have.property('status'));",
         "if (b.status !== 'SUCCESS') { console.warn('FAIL:', b.message, 'X-Request-Id', pm.response.headers.get('X-Request-Id')); }"
        ]
       }
      }
     ]
    },
    {
     "name": "Mark order returned to origin (transition 903: 116 Order Dispatched -> 125 RTO Delivered)",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "X-Api-Key",
        "value": "{{apiKey}}"
       },
       {
        "key": "Authorization",
        "value": "Bearer {{accessToken}}"
       },
       {
        "key": "Content-Type",
        "value": "application/json"
       }
      ],
      "url": {
       "raw": "{{baseUrl}}/seller/orders/rto",
       "host": [
        "{{baseUrl}}"
       ],
       "path": [
        "seller",
        "orders",
        "rto"
       ]
      },
      "description": "Mark order returned to origin (transition 903: 116 Order Dispatched -> 125 RTO Delivered)\n\n**Scope `seller:orders:write`.** The parcel came back to you undelivered (customer refused / unreachable) and the return is complete.\n\nPerforms **only** status_transition **903** on the drop-ship engine (5, VENDORLOGISTIC), granted to the seller role (Supplier Admin, roles_master 17) in status_rolestatustransitioin. Each sub-order must currently be **116 Order Dispatched**; it moves to **125 RTO Delivered**. Do not send a status id - a `statusId` in the body is ignored. Up to 100 sub-order numbers (`grouporderid`) per call.\n\n| API | status_transition id | Transition name | From status (status_master id, displayname, *description*) | To status (status_master id, displayname, *description*) |\n|---|---|---|---|---|\n| `POST /seller/orders/rto` | 903 | VL - Order Dispatched to Order RTO | **116** Order Dispatched (*Order Shipped*) | **125** RTO Delivered (*Returned To Origin*) |\n\n**Read both maps.** The call answers `\"status\": \"SUCCESS\"` when it processed the batch, even if some\nsub-orders were refused:\n\n- `response.successMap` - sub-order number -> `\"Status updated.\"`\n- `response.errorMap` - sub-order number -> reason. Either map is **absent** when empty.\n- `response.transition` - the transition this call performed (always present on `SUCCESS`).\n\n| `errorMap` reason | Meaning |\n|---|---|\n| `Order is in status <displayname> (<id>); this API moves orders from <from displayname> (<from id>) only.` | The sub-order is not in this API's FROM status (or not on the drop-ship engine) - it was not moved. If `<displayname>` is already this API's TO status, the update was done earlier. |\n| `Order not avilable in vendor.` | Not your sub-order, unknown number, another store's order, or an order number (not a sub-order number) was sent. (Spelling as returned.) |\n| `Error` or any other text | The order engine refused or failed the move for that sub-order - re-read its `statusId` via `/seller/orders/detail` before retrying. |\n\nWhole-call refusals (HTTP 200, `\"status\": \"FAIL\"`, `response: null`, nothing changed):\n\n| Message | Meaning |\n|---|---|\n| `This status change is not enabled for sellers.` | The store has switched this transition off for the seller role. Contact the store team. |\n| `Order not avilable in vendor.` | **None** of the ids is one of your sub-orders. |\n| `orderIdList not found` | `orderIdList` missing or empty. |\n| `orderIdList exceeds the maximum of 100 per request` | Split the batch. |\n| `Invalid orderIdList` | An id is not 1-64 letters/digits/`-`/`_`. |\n| `remark must be at most 1000 characters` / `Invalid remark` | `remark` too long, or not single-line plain text (line breaks, control characters and `<` `>` are refused, as are HTML/script or SQL-like fragments such as `--`). |\n| `Invalid awbNo` / `Invalid logisticName` / `Invalid statusCode` / `Invalid shipmentDate` | Same plain-text rule for `shipmentList` fields. |\n| `every shipmentList entry needs a groupOrderId that is one of the orderIdList values` | A `shipmentList` entry has no `groupOrderId`, or names a sub-order not in `orderIdList`. |\n| `Request body is required.` | Empty body. |\n",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"orderIdList\": [\n    \"IASG1216\"\n  ],\n  \"remark\": \"Customer refused delivery; returned to i-planet warehouse\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     },
     "response": [
      {
       "name": "Moved",
       "originalRequest": {
        "method": "POST",
        "header": [
         {
          "key": "X-Api-Key",
          "value": "{{apiKey}}"
         },
         {
          "key": "Authorization",
          "value": "Bearer {{accessToken}}"
         },
         {
          "key": "Content-Type",
          "value": "application/json"
         }
        ],
        "url": {
         "raw": "{{baseUrl}}/seller/orders/rto",
         "host": [
          "{{baseUrl}}"
         ],
         "path": [
          "seller",
          "orders",
          "rto"
         ]
        },
        "description": "Mark order returned to origin (transition 903: 116 Order Dispatched -> 125 RTO Delivered)\n\n**Scope `seller:orders:write`.** The parcel came back to you undelivered (customer refused / unreachable) and the return is complete.\n\nPerforms **only** status_transition **903** on the drop-ship engine (5, VENDORLOGISTIC), granted to the seller role (Supplier Admin, roles_master 17) in status_rolestatustransitioin. Each sub-order must currently be **116 Order Dispatched**; it moves to **125 RTO Delivered**. Do not send a status id - a `statusId` in the body is ignored. Up to 100 sub-order numbers (`grouporderid`) per call.\n\n| API | status_transition id | Transition name | From status (status_master id, displayname, *description*) | To status (status_master id, displayname, *description*) |\n|---|---|---|---|---|\n| `POST /seller/orders/rto` | 903 | VL - Order Dispatched to Order RTO | **116** Order Dispatched (*Order Shipped*) | **125** RTO Delivered (*Returned To Origin*) |\n\n**Read both maps.** The call answers `\"status\": \"SUCCESS\"` when it processed the batch, even if some\nsub-orders were refused:\n\n- `response.successMap` - sub-order number -> `\"Status updated.\"`\n- `response.errorMap` - sub-order number -> reason. Either map is **absent** when empty.\n- `response.transition` - the transition this call performed (always present on `SUCCESS`).\n\n| `errorMap` reason | Meaning |\n|---|---|\n| `Order is in status <displayname> (<id>); this API moves orders from <from displayname> (<from id>) only.` | The sub-order is not in this API's FROM status (or not on the drop-ship engine) - it was not moved. If `<displayname>` is already this API's TO status, the update was done earlier. |\n| `Order not avilable in vendor.` | Not your sub-order, unknown number, another store's order, or an order number (not a sub-order number) was sent. (Spelling as returned.) |\n| `Error` or any other text | The order engine refused or failed the move for that sub-order - re-read its `statusId` via `/seller/orders/detail` before retrying. |\n\nWhole-call refusals (HTTP 200, `\"status\": \"FAIL\"`, `response: null`, nothing changed):\n\n| Message | Meaning |\n|---|---|\n| `This status change is not enabled for sellers.` | The store has switched this transition off for the seller role. Contact the store team. |\n| `Order not avilable in vendor.` | **None** of the ids is one of your sub-orders. |\n| `orderIdList not found` | `orderIdList` missing or empty. |\n| `orderIdList exceeds the maximum of 100 per request` | Split the batch. |\n| `Invalid orderIdList` | An id is not 1-64 letters/digits/`-`/`_`. |\n| `remark must be at most 1000 characters` / `Invalid remark` | `remark` too long, or not single-line plain text (line breaks, control characters and `<` `>` are refused, as are HTML/script or SQL-like fragments such as `--`). |\n| `Invalid awbNo` / `Invalid logisticName` / `Invalid statusCode` / `Invalid shipmentDate` | Same plain-text rule for `shipmentList` fields. |\n| `every shipmentList entry needs a groupOrderId that is one of the orderIdList values` | A `shipmentList` entry has no `groupOrderId`, or names a sub-order not in `orderIdList`. |\n| `Request body is required.` | Empty body. |\n",
        "body": {
         "mode": "raw",
         "raw": "{\n  \"orderIdList\": [\n    \"IASG1216\"\n  ],\n  \"remark\": \"Customer refused delivery; returned to i-planet warehouse\"\n}",
         "options": {
          "raw": {
           "language": "json"
          }
         }
        }
       },
       "status": "OK",
       "code": 200,
       "_postman_previewlanguage": "json",
       "header": [
        {
         "key": "Content-Type",
         "value": "application/json"
        }
       ],
       "cookie": [],
       "body": "{\n  \"status\": \"SUCCESS\",\n  \"message\": \"Success\",\n  \"response\": {\n    \"successMap\": {\n      \"IASG1216\": \"Status updated.\"\n    },\n    \"transition\": {\n      \"transitionId\": 903,\n      \"fromStatusId\": 116,\n      \"fromStatus\": \"Order Dispatched\",\n      \"toStatusId\": 125,\n      \"toStatus\": \"RTO Delivered\"\n    }\n  }\n}"
      },
      {
       "name": "One sub-order not yours - read errorMap",
       "originalRequest": {
        "method": "POST",
        "header": [
         {
          "key": "X-Api-Key",
          "value": "{{apiKey}}"
         },
         {
          "key": "Authorization",
          "value": "Bearer {{accessToken}}"
         },
         {
          "key": "Content-Type",
          "value": "application/json"
         }
        ],
        "url": {
         "raw": "{{baseUrl}}/seller/orders/rto",
         "host": [
          "{{baseUrl}}"
         ],
         "path": [
          "seller",
          "orders",
          "rto"
         ]
        },
        "description": "Mark order returned to origin (transition 903: 116 Order Dispatched -> 125 RTO Delivered)\n\n**Scope `seller:orders:write`.** The parcel came back to you undelivered (customer refused / unreachable) and the return is complete.\n\nPerforms **only** status_transition **903** on the drop-ship engine (5, VENDORLOGISTIC), granted to the seller role (Supplier Admin, roles_master 17) in status_rolestatustransitioin. Each sub-order must currently be **116 Order Dispatched**; it moves to **125 RTO Delivered**. Do not send a status id - a `statusId` in the body is ignored. Up to 100 sub-order numbers (`grouporderid`) per call.\n\n| API | status_transition id | Transition name | From status (status_master id, displayname, *description*) | To status (status_master id, displayname, *description*) |\n|---|---|---|---|---|\n| `POST /seller/orders/rto` | 903 | VL - Order Dispatched to Order RTO | **116** Order Dispatched (*Order Shipped*) | **125** RTO Delivered (*Returned To Origin*) |\n\n**Read both maps.** The call answers `\"status\": \"SUCCESS\"` when it processed the batch, even if some\nsub-orders were refused:\n\n- `response.successMap` - sub-order number -> `\"Status updated.\"`\n- `response.errorMap` - sub-order number -> reason. Either map is **absent** when empty.\n- `response.transition` - the transition this call performed (always present on `SUCCESS`).\n\n| `errorMap` reason | Meaning |\n|---|---|\n| `Order is in status <displayname> (<id>); this API moves orders from <from displayname> (<from id>) only.` | The sub-order is not in this API's FROM status (or not on the drop-ship engine) - it was not moved. If `<displayname>` is already this API's TO status, the update was done earlier. |\n| `Order not avilable in vendor.` | Not your sub-order, unknown number, another store's order, or an order number (not a sub-order number) was sent. (Spelling as returned.) |\n| `Error` or any other text | The order engine refused or failed the move for that sub-order - re-read its `statusId` via `/seller/orders/detail` before retrying. |\n\nWhole-call refusals (HTTP 200, `\"status\": \"FAIL\"`, `response: null`, nothing changed):\n\n| Message | Meaning |\n|---|---|\n| `This status change is not enabled for sellers.` | The store has switched this transition off for the seller role. Contact the store team. |\n| `Order not avilable in vendor.` | **None** of the ids is one of your sub-orders. |\n| `orderIdList not found` | `orderIdList` missing or empty. |\n| `orderIdList exceeds the maximum of 100 per request` | Split the batch. |\n| `Invalid orderIdList` | An id is not 1-64 letters/digits/`-`/`_`. |\n| `remark must be at most 1000 characters` / `Invalid remark` | `remark` too long, or not single-line plain text (line breaks, control characters and `<` `>` are refused, as are HTML/script or SQL-like fragments such as `--`). |\n| `Invalid awbNo` / `Invalid logisticName` / `Invalid statusCode` / `Invalid shipmentDate` | Same plain-text rule for `shipmentList` fields. |\n| `every shipmentList entry needs a groupOrderId that is one of the orderIdList values` | A `shipmentList` entry has no `groupOrderId`, or names a sub-order not in `orderIdList`. |\n| `Request body is required.` | Empty body. |\n",
        "body": {
         "mode": "raw",
         "raw": "{\n  \"orderIdList\": [\n    \"IASG1216\"\n  ],\n  \"remark\": \"Customer refused delivery; returned to i-planet warehouse\"\n}",
         "options": {
          "raw": {
           "language": "json"
          }
         }
        }
       },
       "status": "OK",
       "code": 200,
       "_postman_previewlanguage": "json",
       "header": [
        {
         "key": "Content-Type",
         "value": "application/json"
        }
       ],
       "cookie": [],
       "body": "{\n  \"status\": \"SUCCESS\",\n  \"message\": \"Success\",\n  \"response\": {\n    \"successMap\": {\n      \"IASG1216\": \"Status updated.\"\n    },\n    \"errorMap\": {\n      \"IASG9999\": \"Order not avilable in vendor.\"\n    },\n    \"transition\": {\n      \"transitionId\": 903,\n      \"fromStatusId\": 116,\n      \"fromStatus\": \"Order Dispatched\",\n      \"toStatusId\": 125,\n      \"toStatus\": \"RTO Delivered\"\n    }\n  }\n}"
      },
      {
       "name": "Not dispatched (still 110) - captured live",
       "originalRequest": {
        "method": "POST",
        "header": [
         {
          "key": "X-Api-Key",
          "value": "{{apiKey}}"
         },
         {
          "key": "Authorization",
          "value": "Bearer {{accessToken}}"
         },
         {
          "key": "Content-Type",
          "value": "application/json"
         }
        ],
        "url": {
         "raw": "{{baseUrl}}/seller/orders/rto",
         "host": [
          "{{baseUrl}}"
         ],
         "path": [
          "seller",
          "orders",
          "rto"
         ]
        },
        "description": "Mark order returned to origin (transition 903: 116 Order Dispatched -> 125 RTO Delivered)\n\n**Scope `seller:orders:write`.** The parcel came back to you undelivered (customer refused / unreachable) and the return is complete.\n\nPerforms **only** status_transition **903** on the drop-ship engine (5, VENDORLOGISTIC), granted to the seller role (Supplier Admin, roles_master 17) in status_rolestatustransitioin. Each sub-order must currently be **116 Order Dispatched**; it moves to **125 RTO Delivered**. Do not send a status id - a `statusId` in the body is ignored. Up to 100 sub-order numbers (`grouporderid`) per call.\n\n| API | status_transition id | Transition name | From status (status_master id, displayname, *description*) | To status (status_master id, displayname, *description*) |\n|---|---|---|---|---|\n| `POST /seller/orders/rto` | 903 | VL - Order Dispatched to Order RTO | **116** Order Dispatched (*Order Shipped*) | **125** RTO Delivered (*Returned To Origin*) |\n\n**Read both maps.** The call answers `\"status\": \"SUCCESS\"` when it processed the batch, even if some\nsub-orders were refused:\n\n- `response.successMap` - sub-order number -> `\"Status updated.\"`\n- `response.errorMap` - sub-order number -> reason. Either map is **absent** when empty.\n- `response.transition` - the transition this call performed (always present on `SUCCESS`).\n\n| `errorMap` reason | Meaning |\n|---|---|\n| `Order is in status <displayname> (<id>); this API moves orders from <from displayname> (<from id>) only.` | The sub-order is not in this API's FROM status (or not on the drop-ship engine) - it was not moved. If `<displayname>` is already this API's TO status, the update was done earlier. |\n| `Order not avilable in vendor.` | Not your sub-order, unknown number, another store's order, or an order number (not a sub-order number) was sent. (Spelling as returned.) |\n| `Error` or any other text | The order engine refused or failed the move for that sub-order - re-read its `statusId` via `/seller/orders/detail` before retrying. |\n\nWhole-call refusals (HTTP 200, `\"status\": \"FAIL\"`, `response: null`, nothing changed):\n\n| Message | Meaning |\n|---|---|\n| `This status change is not enabled for sellers.` | The store has switched this transition off for the seller role. Contact the store team. |\n| `Order not avilable in vendor.` | **None** of the ids is one of your sub-orders. |\n| `orderIdList not found` | `orderIdList` missing or empty. |\n| `orderIdList exceeds the maximum of 100 per request` | Split the batch. |\n| `Invalid orderIdList` | An id is not 1-64 letters/digits/`-`/`_`. |\n| `remark must be at most 1000 characters` / `Invalid remark` | `remark` too long, or not single-line plain text (line breaks, control characters and `<` `>` are refused, as are HTML/script or SQL-like fragments such as `--`). |\n| `Invalid awbNo` / `Invalid logisticName` / `Invalid statusCode` / `Invalid shipmentDate` | Same plain-text rule for `shipmentList` fields. |\n| `every shipmentList entry needs a groupOrderId that is one of the orderIdList values` | A `shipmentList` entry has no `groupOrderId`, or names a sub-order not in `orderIdList`. |\n| `Request body is required.` | Empty body. |\n",
        "body": {
         "mode": "raw",
         "raw": "{\n  \"orderIdList\": [\n    \"IASG1216\"\n  ],\n  \"remark\": \"Customer refused delivery; returned to i-planet warehouse\"\n}",
         "options": {
          "raw": {
           "language": "json"
          }
         }
        }
       },
       "status": "OK",
       "code": 200,
       "_postman_previewlanguage": "json",
       "header": [
        {
         "key": "Content-Type",
         "value": "application/json"
        }
       ],
       "cookie": [],
       "body": "{\n  \"status\": \"SUCCESS\",\n  \"message\": \"Success\",\n  \"response\": {\n    \"errorMap\": {\n      \"IASG1190\": \"Order is in status Order Confirm (110); this API moves orders from Order Dispatched (116) only.\"\n    },\n    \"transition\": {\n      \"transitionId\": 903,\n      \"fromStatusId\": 116,\n      \"fromStatus\": \"Order Dispatched\",\n      \"toStatusId\": 125,\n      \"toStatus\": \"RTO Delivered\"\n    }\n  }\n}"
      },
      {
       "name": "Transition switched off for sellers",
       "originalRequest": {
        "method": "POST",
        "header": [
         {
          "key": "X-Api-Key",
          "value": "{{apiKey}}"
         },
         {
          "key": "Authorization",
          "value": "Bearer {{accessToken}}"
         },
         {
          "key": "Content-Type",
          "value": "application/json"
         }
        ],
        "url": {
         "raw": "{{baseUrl}}/seller/orders/rto",
         "host": [
          "{{baseUrl}}"
         ],
         "path": [
          "seller",
          "orders",
          "rto"
         ]
        },
        "description": "Mark order returned to origin (transition 903: 116 Order Dispatched -> 125 RTO Delivered)\n\n**Scope `seller:orders:write`.** The parcel came back to you undelivered (customer refused / unreachable) and the return is complete.\n\nPerforms **only** status_transition **903** on the drop-ship engine (5, VENDORLOGISTIC), granted to the seller role (Supplier Admin, roles_master 17) in status_rolestatustransitioin. Each sub-order must currently be **116 Order Dispatched**; it moves to **125 RTO Delivered**. Do not send a status id - a `statusId` in the body is ignored. Up to 100 sub-order numbers (`grouporderid`) per call.\n\n| API | status_transition id | Transition name | From status (status_master id, displayname, *description*) | To status (status_master id, displayname, *description*) |\n|---|---|---|---|---|\n| `POST /seller/orders/rto` | 903 | VL - Order Dispatched to Order RTO | **116** Order Dispatched (*Order Shipped*) | **125** RTO Delivered (*Returned To Origin*) |\n\n**Read both maps.** The call answers `\"status\": \"SUCCESS\"` when it processed the batch, even if some\nsub-orders were refused:\n\n- `response.successMap` - sub-order number -> `\"Status updated.\"`\n- `response.errorMap` - sub-order number -> reason. Either map is **absent** when empty.\n- `response.transition` - the transition this call performed (always present on `SUCCESS`).\n\n| `errorMap` reason | Meaning |\n|---|---|\n| `Order is in status <displayname> (<id>); this API moves orders from <from displayname> (<from id>) only.` | The sub-order is not in this API's FROM status (or not on the drop-ship engine) - it was not moved. If `<displayname>` is already this API's TO status, the update was done earlier. |\n| `Order not avilable in vendor.` | Not your sub-order, unknown number, another store's order, or an order number (not a sub-order number) was sent. (Spelling as returned.) |\n| `Error` or any other text | The order engine refused or failed the move for that sub-order - re-read its `statusId` via `/seller/orders/detail` before retrying. |\n\nWhole-call refusals (HTTP 200, `\"status\": \"FAIL\"`, `response: null`, nothing changed):\n\n| Message | Meaning |\n|---|---|\n| `This status change is not enabled for sellers.` | The store has switched this transition off for the seller role. Contact the store team. |\n| `Order not avilable in vendor.` | **None** of the ids is one of your sub-orders. |\n| `orderIdList not found` | `orderIdList` missing or empty. |\n| `orderIdList exceeds the maximum of 100 per request` | Split the batch. |\n| `Invalid orderIdList` | An id is not 1-64 letters/digits/`-`/`_`. |\n| `remark must be at most 1000 characters` / `Invalid remark` | `remark` too long, or not single-line plain text (line breaks, control characters and `<` `>` are refused, as are HTML/script or SQL-like fragments such as `--`). |\n| `Invalid awbNo` / `Invalid logisticName` / `Invalid statusCode` / `Invalid shipmentDate` | Same plain-text rule for `shipmentList` fields. |\n| `every shipmentList entry needs a groupOrderId that is one of the orderIdList values` | A `shipmentList` entry has no `groupOrderId`, or names a sub-order not in `orderIdList`. |\n| `Request body is required.` | Empty body. |\n",
        "body": {
         "mode": "raw",
         "raw": "{\n  \"orderIdList\": [\n    \"IASG1216\"\n  ],\n  \"remark\": \"Customer refused delivery; returned to i-planet warehouse\"\n}",
         "options": {
          "raw": {
           "language": "json"
          }
         }
        }
       },
       "status": "OK",
       "code": 200,
       "_postman_previewlanguage": "json",
       "header": [
        {
         "key": "Content-Type",
         "value": "application/json"
        }
       ],
       "cookie": [],
       "body": "{\n  \"status\": \"FAIL\",\n  \"message\": \"This status change is not enabled for sellers.\",\n  \"response\": null\n}"
      },
      {
       "name": "None of the ids is your sub-order",
       "originalRequest": {
        "method": "POST",
        "header": [
         {
          "key": "X-Api-Key",
          "value": "{{apiKey}}"
         },
         {
          "key": "Authorization",
          "value": "Bearer {{accessToken}}"
         },
         {
          "key": "Content-Type",
          "value": "application/json"
         }
        ],
        "url": {
         "raw": "{{baseUrl}}/seller/orders/rto",
         "host": [
          "{{baseUrl}}"
         ],
         "path": [
          "seller",
          "orders",
          "rto"
         ]
        },
        "description": "Mark order returned to origin (transition 903: 116 Order Dispatched -> 125 RTO Delivered)\n\n**Scope `seller:orders:write`.** The parcel came back to you undelivered (customer refused / unreachable) and the return is complete.\n\nPerforms **only** status_transition **903** on the drop-ship engine (5, VENDORLOGISTIC), granted to the seller role (Supplier Admin, roles_master 17) in status_rolestatustransitioin. Each sub-order must currently be **116 Order Dispatched**; it moves to **125 RTO Delivered**. Do not send a status id - a `statusId` in the body is ignored. Up to 100 sub-order numbers (`grouporderid`) per call.\n\n| API | status_transition id | Transition name | From status (status_master id, displayname, *description*) | To status (status_master id, displayname, *description*) |\n|---|---|---|---|---|\n| `POST /seller/orders/rto` | 903 | VL - Order Dispatched to Order RTO | **116** Order Dispatched (*Order Shipped*) | **125** RTO Delivered (*Returned To Origin*) |\n\n**Read both maps.** The call answers `\"status\": \"SUCCESS\"` when it processed the batch, even if some\nsub-orders were refused:\n\n- `response.successMap` - sub-order number -> `\"Status updated.\"`\n- `response.errorMap` - sub-order number -> reason. Either map is **absent** when empty.\n- `response.transition` - the transition this call performed (always present on `SUCCESS`).\n\n| `errorMap` reason | Meaning |\n|---|---|\n| `Order is in status <displayname> (<id>); this API moves orders from <from displayname> (<from id>) only.` | The sub-order is not in this API's FROM status (or not on the drop-ship engine) - it was not moved. If `<displayname>` is already this API's TO status, the update was done earlier. |\n| `Order not avilable in vendor.` | Not your sub-order, unknown number, another store's order, or an order number (not a sub-order number) was sent. (Spelling as returned.) |\n| `Error` or any other text | The order engine refused or failed the move for that sub-order - re-read its `statusId` via `/seller/orders/detail` before retrying. |\n\nWhole-call refusals (HTTP 200, `\"status\": \"FAIL\"`, `response: null`, nothing changed):\n\n| Message | Meaning |\n|---|---|\n| `This status change is not enabled for sellers.` | The store has switched this transition off for the seller role. Contact the store team. |\n| `Order not avilable in vendor.` | **None** of the ids is one of your sub-orders. |\n| `orderIdList not found` | `orderIdList` missing or empty. |\n| `orderIdList exceeds the maximum of 100 per request` | Split the batch. |\n| `Invalid orderIdList` | An id is not 1-64 letters/digits/`-`/`_`. |\n| `remark must be at most 1000 characters` / `Invalid remark` | `remark` too long, or not single-line plain text (line breaks, control characters and `<` `>` are refused, as are HTML/script or SQL-like fragments such as `--`). |\n| `Invalid awbNo` / `Invalid logisticName` / `Invalid statusCode` / `Invalid shipmentDate` | Same plain-text rule for `shipmentList` fields. |\n| `every shipmentList entry needs a groupOrderId that is one of the orderIdList values` | A `shipmentList` entry has no `groupOrderId`, or names a sub-order not in `orderIdList`. |\n| `Request body is required.` | Empty body. |\n",
        "body": {
         "mode": "raw",
         "raw": "{\n  \"orderIdList\": [\n    \"IASG1216\"\n  ],\n  \"remark\": \"Customer refused delivery; returned to i-planet warehouse\"\n}",
         "options": {
          "raw": {
           "language": "json"
          }
         }
        }
       },
       "status": "OK",
       "code": 200,
       "_postman_previewlanguage": "json",
       "header": [
        {
         "key": "Content-Type",
         "value": "application/json"
        }
       ],
       "cookie": [],
       "body": "{\n  \"status\": \"FAIL\",\n  \"message\": \"Order not avilable in vendor.\",\n  \"response\": null\n}"
      },
      {
       "name": "remark not plain text",
       "originalRequest": {
        "method": "POST",
        "header": [
         {
          "key": "X-Api-Key",
          "value": "{{apiKey}}"
         },
         {
          "key": "Authorization",
          "value": "Bearer {{accessToken}}"
         },
         {
          "key": "Content-Type",
          "value": "application/json"
         }
        ],
        "url": {
         "raw": "{{baseUrl}}/seller/orders/rto",
         "host": [
          "{{baseUrl}}"
         ],
         "path": [
          "seller",
          "orders",
          "rto"
         ]
        },
        "description": "Mark order returned to origin (transition 903: 116 Order Dispatched -> 125 RTO Delivered)\n\n**Scope `seller:orders:write`.** The parcel came back to you undelivered (customer refused / unreachable) and the return is complete.\n\nPerforms **only** status_transition **903** on the drop-ship engine (5, VENDORLOGISTIC), granted to the seller role (Supplier Admin, roles_master 17) in status_rolestatustransitioin. Each sub-order must currently be **116 Order Dispatched**; it moves to **125 RTO Delivered**. Do not send a status id - a `statusId` in the body is ignored. Up to 100 sub-order numbers (`grouporderid`) per call.\n\n| API | status_transition id | Transition name | From status (status_master id, displayname, *description*) | To status (status_master id, displayname, *description*) |\n|---|---|---|---|---|\n| `POST /seller/orders/rto` | 903 | VL - Order Dispatched to Order RTO | **116** Order Dispatched (*Order Shipped*) | **125** RTO Delivered (*Returned To Origin*) |\n\n**Read both maps.** The call answers `\"status\": \"SUCCESS\"` when it processed the batch, even if some\nsub-orders were refused:\n\n- `response.successMap` - sub-order number -> `\"Status updated.\"`\n- `response.errorMap` - sub-order number -> reason. Either map is **absent** when empty.\n- `response.transition` - the transition this call performed (always present on `SUCCESS`).\n\n| `errorMap` reason | Meaning |\n|---|---|\n| `Order is in status <displayname> (<id>); this API moves orders from <from displayname> (<from id>) only.` | The sub-order is not in this API's FROM status (or not on the drop-ship engine) - it was not moved. If `<displayname>` is already this API's TO status, the update was done earlier. |\n| `Order not avilable in vendor.` | Not your sub-order, unknown number, another store's order, or an order number (not a sub-order number) was sent. (Spelling as returned.) |\n| `Error` or any other text | The order engine refused or failed the move for that sub-order - re-read its `statusId` via `/seller/orders/detail` before retrying. |\n\nWhole-call refusals (HTTP 200, `\"status\": \"FAIL\"`, `response: null`, nothing changed):\n\n| Message | Meaning |\n|---|---|\n| `This status change is not enabled for sellers.` | The store has switched this transition off for the seller role. Contact the store team. |\n| `Order not avilable in vendor.` | **None** of the ids is one of your sub-orders. |\n| `orderIdList not found` | `orderIdList` missing or empty. |\n| `orderIdList exceeds the maximum of 100 per request` | Split the batch. |\n| `Invalid orderIdList` | An id is not 1-64 letters/digits/`-`/`_`. |\n| `remark must be at most 1000 characters` / `Invalid remark` | `remark` too long, or not single-line plain text (line breaks, control characters and `<` `>` are refused, as are HTML/script or SQL-like fragments such as `--`). |\n| `Invalid awbNo` / `Invalid logisticName` / `Invalid statusCode` / `Invalid shipmentDate` | Same plain-text rule for `shipmentList` fields. |\n| `every shipmentList entry needs a groupOrderId that is one of the orderIdList values` | A `shipmentList` entry has no `groupOrderId`, or names a sub-order not in `orderIdList`. |\n| `Request body is required.` | Empty body. |\n",
        "body": {
         "mode": "raw",
         "raw": "{\n  \"orderIdList\": [\n    \"IASG1216\"\n  ],\n  \"remark\": \"Customer refused delivery; returned to i-planet warehouse\"\n}",
         "options": {
          "raw": {
           "language": "json"
          }
         }
        }
       },
       "status": "OK",
       "code": 200,
       "_postman_previewlanguage": "json",
       "header": [
        {
         "key": "Content-Type",
         "value": "application/json"
        }
       ],
       "cookie": [],
       "body": "{\n  \"status\": \"FAIL\",\n  \"message\": \"Invalid remark\",\n  \"response\": null\n}"
      },
      {
       "name": "More than 100 ids",
       "originalRequest": {
        "method": "POST",
        "header": [
         {
          "key": "X-Api-Key",
          "value": "{{apiKey}}"
         },
         {
          "key": "Authorization",
          "value": "Bearer {{accessToken}}"
         },
         {
          "key": "Content-Type",
          "value": "application/json"
         }
        ],
        "url": {
         "raw": "{{baseUrl}}/seller/orders/rto",
         "host": [
          "{{baseUrl}}"
         ],
         "path": [
          "seller",
          "orders",
          "rto"
         ]
        },
        "description": "Mark order returned to origin (transition 903: 116 Order Dispatched -> 125 RTO Delivered)\n\n**Scope `seller:orders:write`.** The parcel came back to you undelivered (customer refused / unreachable) and the return is complete.\n\nPerforms **only** status_transition **903** on the drop-ship engine (5, VENDORLOGISTIC), granted to the seller role (Supplier Admin, roles_master 17) in status_rolestatustransitioin. Each sub-order must currently be **116 Order Dispatched**; it moves to **125 RTO Delivered**. Do not send a status id - a `statusId` in the body is ignored. Up to 100 sub-order numbers (`grouporderid`) per call.\n\n| API | status_transition id | Transition name | From status (status_master id, displayname, *description*) | To status (status_master id, displayname, *description*) |\n|---|---|---|---|---|\n| `POST /seller/orders/rto` | 903 | VL - Order Dispatched to Order RTO | **116** Order Dispatched (*Order Shipped*) | **125** RTO Delivered (*Returned To Origin*) |\n\n**Read both maps.** The call answers `\"status\": \"SUCCESS\"` when it processed the batch, even if some\nsub-orders were refused:\n\n- `response.successMap` - sub-order number -> `\"Status updated.\"`\n- `response.errorMap` - sub-order number -> reason. Either map is **absent** when empty.\n- `response.transition` - the transition this call performed (always present on `SUCCESS`).\n\n| `errorMap` reason | Meaning |\n|---|---|\n| `Order is in status <displayname> (<id>); this API moves orders from <from displayname> (<from id>) only.` | The sub-order is not in this API's FROM status (or not on the drop-ship engine) - it was not moved. If `<displayname>` is already this API's TO status, the update was done earlier. |\n| `Order not avilable in vendor.` | Not your sub-order, unknown number, another store's order, or an order number (not a sub-order number) was sent. (Spelling as returned.) |\n| `Error` or any other text | The order engine refused or failed the move for that sub-order - re-read its `statusId` via `/seller/orders/detail` before retrying. |\n\nWhole-call refusals (HTTP 200, `\"status\": \"FAIL\"`, `response: null`, nothing changed):\n\n| Message | Meaning |\n|---|---|\n| `This status change is not enabled for sellers.` | The store has switched this transition off for the seller role. Contact the store team. |\n| `Order not avilable in vendor.` | **None** of the ids is one of your sub-orders. |\n| `orderIdList not found` | `orderIdList` missing or empty. |\n| `orderIdList exceeds the maximum of 100 per request` | Split the batch. |\n| `Invalid orderIdList` | An id is not 1-64 letters/digits/`-`/`_`. |\n| `remark must be at most 1000 characters` / `Invalid remark` | `remark` too long, or not single-line plain text (line breaks, control characters and `<` `>` are refused, as are HTML/script or SQL-like fragments such as `--`). |\n| `Invalid awbNo` / `Invalid logisticName` / `Invalid statusCode` / `Invalid shipmentDate` | Same plain-text rule for `shipmentList` fields. |\n| `every shipmentList entry needs a groupOrderId that is one of the orderIdList values` | A `shipmentList` entry has no `groupOrderId`, or names a sub-order not in `orderIdList`. |\n| `Request body is required.` | Empty body. |\n",
        "body": {
         "mode": "raw",
         "raw": "{\n  \"orderIdList\": [\n    \"IASG1216\"\n  ],\n  \"remark\": \"Customer refused delivery; returned to i-planet warehouse\"\n}",
         "options": {
          "raw": {
           "language": "json"
          }
         }
        }
       },
       "status": "OK",
       "code": 200,
       "_postman_previewlanguage": "json",
       "header": [
        {
         "key": "Content-Type",
         "value": "application/json"
        }
       ],
       "cookie": [],
       "body": "{\n  \"status\": \"FAIL\",\n  \"message\": \"orderIdList exceeds the maximum of 100 per request\",\n  \"response\": null\n}"
      },
      {
       "name": "401 - E_AUTH",
       "originalRequest": {
        "method": "POST",
        "header": [
         {
          "key": "X-Api-Key",
          "value": "{{apiKey}}"
         },
         {
          "key": "Authorization",
          "value": "Bearer {{accessToken}}"
         },
         {
          "key": "Content-Type",
          "value": "application/json"
         }
        ],
        "url": {
         "raw": "{{baseUrl}}/seller/orders/rto",
         "host": [
          "{{baseUrl}}"
         ],
         "path": [
          "seller",
          "orders",
          "rto"
         ]
        },
        "description": "Mark order returned to origin (transition 903: 116 Order Dispatched -> 125 RTO Delivered)\n\n**Scope `seller:orders:write`.** The parcel came back to you undelivered (customer refused / unreachable) and the return is complete.\n\nPerforms **only** status_transition **903** on the drop-ship engine (5, VENDORLOGISTIC), granted to the seller role (Supplier Admin, roles_master 17) in status_rolestatustransitioin. Each sub-order must currently be **116 Order Dispatched**; it moves to **125 RTO Delivered**. Do not send a status id - a `statusId` in the body is ignored. Up to 100 sub-order numbers (`grouporderid`) per call.\n\n| API | status_transition id | Transition name | From status (status_master id, displayname, *description*) | To status (status_master id, displayname, *description*) |\n|---|---|---|---|---|\n| `POST /seller/orders/rto` | 903 | VL - Order Dispatched to Order RTO | **116** Order Dispatched (*Order Shipped*) | **125** RTO Delivered (*Returned To Origin*) |\n\n**Read both maps.** The call answers `\"status\": \"SUCCESS\"` when it processed the batch, even if some\nsub-orders were refused:\n\n- `response.successMap` - sub-order number -> `\"Status updated.\"`\n- `response.errorMap` - sub-order number -> reason. Either map is **absent** when empty.\n- `response.transition` - the transition this call performed (always present on `SUCCESS`).\n\n| `errorMap` reason | Meaning |\n|---|---|\n| `Order is in status <displayname> (<id>); this API moves orders from <from displayname> (<from id>) only.` | The sub-order is not in this API's FROM status (or not on the drop-ship engine) - it was not moved. If `<displayname>` is already this API's TO status, the update was done earlier. |\n| `Order not avilable in vendor.` | Not your sub-order, unknown number, another store's order, or an order number (not a sub-order number) was sent. (Spelling as returned.) |\n| `Error` or any other text | The order engine refused or failed the move for that sub-order - re-read its `statusId` via `/seller/orders/detail` before retrying. |\n\nWhole-call refusals (HTTP 200, `\"status\": \"FAIL\"`, `response: null`, nothing changed):\n\n| Message | Meaning |\n|---|---|\n| `This status change is not enabled for sellers.` | The store has switched this transition off for the seller role. Contact the store team. |\n| `Order not avilable in vendor.` | **None** of the ids is one of your sub-orders. |\n| `orderIdList not found` | `orderIdList` missing or empty. |\n| `orderIdList exceeds the maximum of 100 per request` | Split the batch. |\n| `Invalid orderIdList` | An id is not 1-64 letters/digits/`-`/`_`. |\n| `remark must be at most 1000 characters` / `Invalid remark` | `remark` too long, or not single-line plain text (line breaks, control characters and `<` `>` are refused, as are HTML/script or SQL-like fragments such as `--`). |\n| `Invalid awbNo` / `Invalid logisticName` / `Invalid statusCode` / `Invalid shipmentDate` | Same plain-text rule for `shipmentList` fields. |\n| `every shipmentList entry needs a groupOrderId that is one of the orderIdList values` | A `shipmentList` entry has no `groupOrderId`, or names a sub-order not in `orderIdList`. |\n| `Request body is required.` | Empty body. |\n",
        "body": {
         "mode": "raw",
         "raw": "{\n  \"orderIdList\": [\n    \"IASG1216\"\n  ],\n  \"remark\": \"Customer refused delivery; returned to i-planet warehouse\"\n}",
         "options": {
          "raw": {
           "language": "json"
          }
         }
        }
       },
       "status": "Unauthorized",
       "code": 401,
       "_postman_previewlanguage": "json",
       "header": [
        {
         "key": "Content-Type",
         "value": "application/json"
        }
       ],
       "cookie": [],
       "body": "{\n  \"status\": \"FAIL\",\n  \"message\": \"Request could not be authorized.\",\n  \"response\": {\n    \"code\": \"E_AUTH\",\n    \"requestId\": \"0d6f4f2e-3c1a-4a43-9f63-1f2a7c9b8e10\"\n  }\n}"
      }
     ],
     "event": [
      {
       "listen": "test",
       "script": {
        "type": "text/javascript",
        "exec": [
         "// Business refusals are HTTP 200 with status FAIL - always look at the envelope.",
         "const b = pm.response.json();",
         "pm.test('envelope present', () => pm.expect(b).to.have.property('status'));",
         "if (b.status !== 'SUCCESS') { console.warn('FAIL:', b.message, 'X-Request-Id', pm.response.headers.get('X-Request-Id')); }"
        ]
       }
      }
     ]
    }
   ]
  },
  {
   "name": "4. Inventory & Price  (scope: seller:sku:write)",
   "item": [
    {
     "name": "Push the available stock of one SKU (absolute quantity)",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "X-Api-Key",
        "value": "{{apiKey}}"
       },
       {
        "key": "Authorization",
        "value": "Bearer {{accessToken}}"
       },
       {
        "key": "Content-Type",
        "value": "application/json"
       }
      ],
      "url": {
       "raw": "{{baseUrl}}/seller/sku/inventory",
       "host": [
        "{{baseUrl}}"
       ],
       "path": [
        "seller",
        "sku",
        "inventory"
       ]
      },
      "description": "Push the available stock of one SKU (absolute quantity)\n\n**Scope `seller:sku:write`.** Sets the **available, sellable quantity** of one of your SKUs,\nidentified by **your** `sellerskucode`.\n\n- `quantity` is **absolute**: it **replaces** the current available stock - it is not added to it.\n  Send the full current on-hand sellable quantity every time (0 = out of stock).\n  Whole number >= 0; a JSON string (`\"25\"`) or number (`25`) is accepted.\n- `referenceno` is required: your reference for this push (e.g. ERP document + line). It is stored in\n  our audit log with the request and our answer.\n- Takes effect on the storefront immediately (stock is not subject to approval).\n- For many SKUs use `/seller/sku/inventory/batch` (100 per call, counts as one request).\n\nBusiness messages (HTTP 200, `\"status\": \"FAIL\"`):\n\n| Message | Meaning |\n|---|---|\n| `referenceno not found` / `Invalid referenceno` | Missing, or contains unsafe text. |\n| `sellerskucode not found` | Unknown code, or a code that belongs to another seller. |\n| `Invalid sellerskucode` | Unsafe text in the code. |\n| `quantity not found` / `Invalid quantity` | Missing, negative, fractional or non-numeric. |\n| `sellerskucode is a parent SKU; push stock for its variant SKU codes.` | Stock lives on variants (colour / storage), not on the grouping SKU. |\n| `Approved SKU not found for seller SKU code.` | The SKU exists but has not been approved into the live catalogue yet. |\n| `You are not authorized to update this SKU.` | The SKU is not linked to your seller account. |\n| `Seller not found for authenticated user.` | Your credential is linked to more than one seller account - contact us. |\n| `Something went wrong` | Unexpected error - retry later, quote `X-Request-Id`. |\n\n\n## Other request body examples\n\n**Out of stock**\n\n```json\n{\n  \"referenceno\": \"ERP-INV-0002\",\n  \"sellerskucode\": \"MTP63HN/A\",\n  \"quantity\": \"0\"\n}\n```",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"referenceno\": \"ERP-INV-0001\",\n  \"sellerskucode\": \"MTP63HN/A\",\n  \"quantity\": \"25\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     },
     "response": [
      {
       "name": "Updated",
       "originalRequest": {
        "method": "POST",
        "header": [
         {
          "key": "X-Api-Key",
          "value": "{{apiKey}}"
         },
         {
          "key": "Authorization",
          "value": "Bearer {{accessToken}}"
         },
         {
          "key": "Content-Type",
          "value": "application/json"
         }
        ],
        "url": {
         "raw": "{{baseUrl}}/seller/sku/inventory",
         "host": [
          "{{baseUrl}}"
         ],
         "path": [
          "seller",
          "sku",
          "inventory"
         ]
        },
        "description": "Push the available stock of one SKU (absolute quantity)\n\n**Scope `seller:sku:write`.** Sets the **available, sellable quantity** of one of your SKUs,\nidentified by **your** `sellerskucode`.\n\n- `quantity` is **absolute**: it **replaces** the current available stock - it is not added to it.\n  Send the full current on-hand sellable quantity every time (0 = out of stock).\n  Whole number >= 0; a JSON string (`\"25\"`) or number (`25`) is accepted.\n- `referenceno` is required: your reference for this push (e.g. ERP document + line). It is stored in\n  our audit log with the request and our answer.\n- Takes effect on the storefront immediately (stock is not subject to approval).\n- For many SKUs use `/seller/sku/inventory/batch` (100 per call, counts as one request).\n\nBusiness messages (HTTP 200, `\"status\": \"FAIL\"`):\n\n| Message | Meaning |\n|---|---|\n| `referenceno not found` / `Invalid referenceno` | Missing, or contains unsafe text. |\n| `sellerskucode not found` | Unknown code, or a code that belongs to another seller. |\n| `Invalid sellerskucode` | Unsafe text in the code. |\n| `quantity not found` / `Invalid quantity` | Missing, negative, fractional or non-numeric. |\n| `sellerskucode is a parent SKU; push stock for its variant SKU codes.` | Stock lives on variants (colour / storage), not on the grouping SKU. |\n| `Approved SKU not found for seller SKU code.` | The SKU exists but has not been approved into the live catalogue yet. |\n| `You are not authorized to update this SKU.` | The SKU is not linked to your seller account. |\n| `Seller not found for authenticated user.` | Your credential is linked to more than one seller account - contact us. |\n| `Something went wrong` | Unexpected error - retry later, quote `X-Request-Id`. |\n\n\n## Other request body examples\n\n**Out of stock**\n\n```json\n{\n  \"referenceno\": \"ERP-INV-0002\",\n  \"sellerskucode\": \"MTP63HN/A\",\n  \"quantity\": \"0\"\n}\n```",
        "body": {
         "mode": "raw",
         "raw": "{\n  \"referenceno\": \"ERP-INV-0001\",\n  \"sellerskucode\": \"MTP63HN/A\",\n  \"quantity\": \"25\"\n}",
         "options": {
          "raw": {
           "language": "json"
          }
         }
        }
       },
       "status": "OK",
       "code": 200,
       "_postman_previewlanguage": "json",
       "header": [
        {
         "key": "Content-Type",
         "value": "application/json"
        }
       ],
       "cookie": [],
       "body": "{\n  \"status\": \"SUCCESS\",\n  \"message\": \"Record updated successfully.\",\n  \"response\": null\n}"
      },
      {
       "name": "Unknown / another seller's code",
       "originalRequest": {
        "method": "POST",
        "header": [
         {
          "key": "X-Api-Key",
          "value": "{{apiKey}}"
         },
         {
          "key": "Authorization",
          "value": "Bearer {{accessToken}}"
         },
         {
          "key": "Content-Type",
          "value": "application/json"
         }
        ],
        "url": {
         "raw": "{{baseUrl}}/seller/sku/inventory",
         "host": [
          "{{baseUrl}}"
         ],
         "path": [
          "seller",
          "sku",
          "inventory"
         ]
        },
        "description": "Push the available stock of one SKU (absolute quantity)\n\n**Scope `seller:sku:write`.** Sets the **available, sellable quantity** of one of your SKUs,\nidentified by **your** `sellerskucode`.\n\n- `quantity` is **absolute**: it **replaces** the current available stock - it is not added to it.\n  Send the full current on-hand sellable quantity every time (0 = out of stock).\n  Whole number >= 0; a JSON string (`\"25\"`) or number (`25`) is accepted.\n- `referenceno` is required: your reference for this push (e.g. ERP document + line). It is stored in\n  our audit log with the request and our answer.\n- Takes effect on the storefront immediately (stock is not subject to approval).\n- For many SKUs use `/seller/sku/inventory/batch` (100 per call, counts as one request).\n\nBusiness messages (HTTP 200, `\"status\": \"FAIL\"`):\n\n| Message | Meaning |\n|---|---|\n| `referenceno not found` / `Invalid referenceno` | Missing, or contains unsafe text. |\n| `sellerskucode not found` | Unknown code, or a code that belongs to another seller. |\n| `Invalid sellerskucode` | Unsafe text in the code. |\n| `quantity not found` / `Invalid quantity` | Missing, negative, fractional or non-numeric. |\n| `sellerskucode is a parent SKU; push stock for its variant SKU codes.` | Stock lives on variants (colour / storage), not on the grouping SKU. |\n| `Approved SKU not found for seller SKU code.` | The SKU exists but has not been approved into the live catalogue yet. |\n| `You are not authorized to update this SKU.` | The SKU is not linked to your seller account. |\n| `Seller not found for authenticated user.` | Your credential is linked to more than one seller account - contact us. |\n| `Something went wrong` | Unexpected error - retry later, quote `X-Request-Id`. |\n\n\n## Other request body examples\n\n**Out of stock**\n\n```json\n{\n  \"referenceno\": \"ERP-INV-0002\",\n  \"sellerskucode\": \"MTP63HN/A\",\n  \"quantity\": \"0\"\n}\n```",
        "body": {
         "mode": "raw",
         "raw": "{\n  \"referenceno\": \"ERP-INV-0001\",\n  \"sellerskucode\": \"MTP63HN/A\",\n  \"quantity\": \"25\"\n}",
         "options": {
          "raw": {
           "language": "json"
          }
         }
        }
       },
       "status": "OK",
       "code": 200,
       "_postman_previewlanguage": "json",
       "header": [
        {
         "key": "Content-Type",
         "value": "application/json"
        }
       ],
       "cookie": [],
       "body": "{\n  \"status\": \"FAIL\",\n  \"message\": \"sellerskucode not found\",\n  \"response\": null\n}"
      },
      {
       "name": "Parent SKU code",
       "originalRequest": {
        "method": "POST",
        "header": [
         {
          "key": "X-Api-Key",
          "value": "{{apiKey}}"
         },
         {
          "key": "Authorization",
          "value": "Bearer {{accessToken}}"
         },
         {
          "key": "Content-Type",
          "value": "application/json"
         }
        ],
        "url": {
         "raw": "{{baseUrl}}/seller/sku/inventory",
         "host": [
          "{{baseUrl}}"
         ],
         "path": [
          "seller",
          "sku",
          "inventory"
         ]
        },
        "description": "Push the available stock of one SKU (absolute quantity)\n\n**Scope `seller:sku:write`.** Sets the **available, sellable quantity** of one of your SKUs,\nidentified by **your** `sellerskucode`.\n\n- `quantity` is **absolute**: it **replaces** the current available stock - it is not added to it.\n  Send the full current on-hand sellable quantity every time (0 = out of stock).\n  Whole number >= 0; a JSON string (`\"25\"`) or number (`25`) is accepted.\n- `referenceno` is required: your reference for this push (e.g. ERP document + line). It is stored in\n  our audit log with the request and our answer.\n- Takes effect on the storefront immediately (stock is not subject to approval).\n- For many SKUs use `/seller/sku/inventory/batch` (100 per call, counts as one request).\n\nBusiness messages (HTTP 200, `\"status\": \"FAIL\"`):\n\n| Message | Meaning |\n|---|---|\n| `referenceno not found` / `Invalid referenceno` | Missing, or contains unsafe text. |\n| `sellerskucode not found` | Unknown code, or a code that belongs to another seller. |\n| `Invalid sellerskucode` | Unsafe text in the code. |\n| `quantity not found` / `Invalid quantity` | Missing, negative, fractional or non-numeric. |\n| `sellerskucode is a parent SKU; push stock for its variant SKU codes.` | Stock lives on variants (colour / storage), not on the grouping SKU. |\n| `Approved SKU not found for seller SKU code.` | The SKU exists but has not been approved into the live catalogue yet. |\n| `You are not authorized to update this SKU.` | The SKU is not linked to your seller account. |\n| `Seller not found for authenticated user.` | Your credential is linked to more than one seller account - contact us. |\n| `Something went wrong` | Unexpected error - retry later, quote `X-Request-Id`. |\n\n\n## Other request body examples\n\n**Out of stock**\n\n```json\n{\n  \"referenceno\": \"ERP-INV-0002\",\n  \"sellerskucode\": \"MTP63HN/A\",\n  \"quantity\": \"0\"\n}\n```",
        "body": {
         "mode": "raw",
         "raw": "{\n  \"referenceno\": \"ERP-INV-0001\",\n  \"sellerskucode\": \"MTP63HN/A\",\n  \"quantity\": \"25\"\n}",
         "options": {
          "raw": {
           "language": "json"
          }
         }
        }
       },
       "status": "OK",
       "code": 200,
       "_postman_previewlanguage": "json",
       "header": [
        {
         "key": "Content-Type",
         "value": "application/json"
        }
       ],
       "cookie": [],
       "body": "{\n  \"status\": \"FAIL\",\n  \"message\": \"sellerskucode is a parent SKU; push stock for its variant SKU codes.\",\n  \"response\": null\n}"
      },
      {
       "name": "Negative or fractional quantity",
       "originalRequest": {
        "method": "POST",
        "header": [
         {
          "key": "X-Api-Key",
          "value": "{{apiKey}}"
         },
         {
          "key": "Authorization",
          "value": "Bearer {{accessToken}}"
         },
         {
          "key": "Content-Type",
          "value": "application/json"
         }
        ],
        "url": {
         "raw": "{{baseUrl}}/seller/sku/inventory",
         "host": [
          "{{baseUrl}}"
         ],
         "path": [
          "seller",
          "sku",
          "inventory"
         ]
        },
        "description": "Push the available stock of one SKU (absolute quantity)\n\n**Scope `seller:sku:write`.** Sets the **available, sellable quantity** of one of your SKUs,\nidentified by **your** `sellerskucode`.\n\n- `quantity` is **absolute**: it **replaces** the current available stock - it is not added to it.\n  Send the full current on-hand sellable quantity every time (0 = out of stock).\n  Whole number >= 0; a JSON string (`\"25\"`) or number (`25`) is accepted.\n- `referenceno` is required: your reference for this push (e.g. ERP document + line). It is stored in\n  our audit log with the request and our answer.\n- Takes effect on the storefront immediately (stock is not subject to approval).\n- For many SKUs use `/seller/sku/inventory/batch` (100 per call, counts as one request).\n\nBusiness messages (HTTP 200, `\"status\": \"FAIL\"`):\n\n| Message | Meaning |\n|---|---|\n| `referenceno not found` / `Invalid referenceno` | Missing, or contains unsafe text. |\n| `sellerskucode not found` | Unknown code, or a code that belongs to another seller. |\n| `Invalid sellerskucode` | Unsafe text in the code. |\n| `quantity not found` / `Invalid quantity` | Missing, negative, fractional or non-numeric. |\n| `sellerskucode is a parent SKU; push stock for its variant SKU codes.` | Stock lives on variants (colour / storage), not on the grouping SKU. |\n| `Approved SKU not found for seller SKU code.` | The SKU exists but has not been approved into the live catalogue yet. |\n| `You are not authorized to update this SKU.` | The SKU is not linked to your seller account. |\n| `Seller not found for authenticated user.` | Your credential is linked to more than one seller account - contact us. |\n| `Something went wrong` | Unexpected error - retry later, quote `X-Request-Id`. |\n\n\n## Other request body examples\n\n**Out of stock**\n\n```json\n{\n  \"referenceno\": \"ERP-INV-0002\",\n  \"sellerskucode\": \"MTP63HN/A\",\n  \"quantity\": \"0\"\n}\n```",
        "body": {
         "mode": "raw",
         "raw": "{\n  \"referenceno\": \"ERP-INV-0001\",\n  \"sellerskucode\": \"MTP63HN/A\",\n  \"quantity\": \"25\"\n}",
         "options": {
          "raw": {
           "language": "json"
          }
         }
        }
       },
       "status": "OK",
       "code": 200,
       "_postman_previewlanguage": "json",
       "header": [
        {
         "key": "Content-Type",
         "value": "application/json"
        }
       ],
       "cookie": [],
       "body": "{\n  \"status\": \"FAIL\",\n  \"message\": \"Invalid quantity\",\n  \"response\": null\n}"
      },
      {
       "name": "referenceno missing",
       "originalRequest": {
        "method": "POST",
        "header": [
         {
          "key": "X-Api-Key",
          "value": "{{apiKey}}"
         },
         {
          "key": "Authorization",
          "value": "Bearer {{accessToken}}"
         },
         {
          "key": "Content-Type",
          "value": "application/json"
         }
        ],
        "url": {
         "raw": "{{baseUrl}}/seller/sku/inventory",
         "host": [
          "{{baseUrl}}"
         ],
         "path": [
          "seller",
          "sku",
          "inventory"
         ]
        },
        "description": "Push the available stock of one SKU (absolute quantity)\n\n**Scope `seller:sku:write`.** Sets the **available, sellable quantity** of one of your SKUs,\nidentified by **your** `sellerskucode`.\n\n- `quantity` is **absolute**: it **replaces** the current available stock - it is not added to it.\n  Send the full current on-hand sellable quantity every time (0 = out of stock).\n  Whole number >= 0; a JSON string (`\"25\"`) or number (`25`) is accepted.\n- `referenceno` is required: your reference for this push (e.g. ERP document + line). It is stored in\n  our audit log with the request and our answer.\n- Takes effect on the storefront immediately (stock is not subject to approval).\n- For many SKUs use `/seller/sku/inventory/batch` (100 per call, counts as one request).\n\nBusiness messages (HTTP 200, `\"status\": \"FAIL\"`):\n\n| Message | Meaning |\n|---|---|\n| `referenceno not found` / `Invalid referenceno` | Missing, or contains unsafe text. |\n| `sellerskucode not found` | Unknown code, or a code that belongs to another seller. |\n| `Invalid sellerskucode` | Unsafe text in the code. |\n| `quantity not found` / `Invalid quantity` | Missing, negative, fractional or non-numeric. |\n| `sellerskucode is a parent SKU; push stock for its variant SKU codes.` | Stock lives on variants (colour / storage), not on the grouping SKU. |\n| `Approved SKU not found for seller SKU code.` | The SKU exists but has not been approved into the live catalogue yet. |\n| `You are not authorized to update this SKU.` | The SKU is not linked to your seller account. |\n| `Seller not found for authenticated user.` | Your credential is linked to more than one seller account - contact us. |\n| `Something went wrong` | Unexpected error - retry later, quote `X-Request-Id`. |\n\n\n## Other request body examples\n\n**Out of stock**\n\n```json\n{\n  \"referenceno\": \"ERP-INV-0002\",\n  \"sellerskucode\": \"MTP63HN/A\",\n  \"quantity\": \"0\"\n}\n```",
        "body": {
         "mode": "raw",
         "raw": "{\n  \"referenceno\": \"ERP-INV-0001\",\n  \"sellerskucode\": \"MTP63HN/A\",\n  \"quantity\": \"25\"\n}",
         "options": {
          "raw": {
           "language": "json"
          }
         }
        }
       },
       "status": "OK",
       "code": 200,
       "_postman_previewlanguage": "json",
       "header": [
        {
         "key": "Content-Type",
         "value": "application/json"
        }
       ],
       "cookie": [],
       "body": "{\n  \"status\": \"FAIL\",\n  \"message\": \"referenceno not found\",\n  \"response\": null\n}"
      },
      {
       "name": "401 - E_AUTH",
       "originalRequest": {
        "method": "POST",
        "header": [
         {
          "key": "X-Api-Key",
          "value": "{{apiKey}}"
         },
         {
          "key": "Authorization",
          "value": "Bearer {{accessToken}}"
         },
         {
          "key": "Content-Type",
          "value": "application/json"
         }
        ],
        "url": {
         "raw": "{{baseUrl}}/seller/sku/inventory",
         "host": [
          "{{baseUrl}}"
         ],
         "path": [
          "seller",
          "sku",
          "inventory"
         ]
        },
        "description": "Push the available stock of one SKU (absolute quantity)\n\n**Scope `seller:sku:write`.** Sets the **available, sellable quantity** of one of your SKUs,\nidentified by **your** `sellerskucode`.\n\n- `quantity` is **absolute**: it **replaces** the current available stock - it is not added to it.\n  Send the full current on-hand sellable quantity every time (0 = out of stock).\n  Whole number >= 0; a JSON string (`\"25\"`) or number (`25`) is accepted.\n- `referenceno` is required: your reference for this push (e.g. ERP document + line). It is stored in\n  our audit log with the request and our answer.\n- Takes effect on the storefront immediately (stock is not subject to approval).\n- For many SKUs use `/seller/sku/inventory/batch` (100 per call, counts as one request).\n\nBusiness messages (HTTP 200, `\"status\": \"FAIL\"`):\n\n| Message | Meaning |\n|---|---|\n| `referenceno not found` / `Invalid referenceno` | Missing, or contains unsafe text. |\n| `sellerskucode not found` | Unknown code, or a code that belongs to another seller. |\n| `Invalid sellerskucode` | Unsafe text in the code. |\n| `quantity not found` / `Invalid quantity` | Missing, negative, fractional or non-numeric. |\n| `sellerskucode is a parent SKU; push stock for its variant SKU codes.` | Stock lives on variants (colour / storage), not on the grouping SKU. |\n| `Approved SKU not found for seller SKU code.` | The SKU exists but has not been approved into the live catalogue yet. |\n| `You are not authorized to update this SKU.` | The SKU is not linked to your seller account. |\n| `Seller not found for authenticated user.` | Your credential is linked to more than one seller account - contact us. |\n| `Something went wrong` | Unexpected error - retry later, quote `X-Request-Id`. |\n\n\n## Other request body examples\n\n**Out of stock**\n\n```json\n{\n  \"referenceno\": \"ERP-INV-0002\",\n  \"sellerskucode\": \"MTP63HN/A\",\n  \"quantity\": \"0\"\n}\n```",
        "body": {
         "mode": "raw",
         "raw": "{\n  \"referenceno\": \"ERP-INV-0001\",\n  \"sellerskucode\": \"MTP63HN/A\",\n  \"quantity\": \"25\"\n}",
         "options": {
          "raw": {
           "language": "json"
          }
         }
        }
       },
       "status": "Unauthorized",
       "code": 401,
       "_postman_previewlanguage": "json",
       "header": [
        {
         "key": "Content-Type",
         "value": "application/json"
        }
       ],
       "cookie": [],
       "body": "{\n  \"status\": \"FAIL\",\n  \"message\": \"Request could not be authorized.\",\n  \"response\": {\n    \"code\": \"E_AUTH\",\n    \"requestId\": \"0d6f4f2e-3c1a-4a43-9f63-1f2a7c9b8e10\"\n  }\n}"
      }
     ],
     "event": [
      {
       "listen": "test",
       "script": {
        "type": "text/javascript",
        "exec": [
         "// Business refusals are HTTP 200 with status FAIL - always look at the envelope.",
         "const b = pm.response.json();",
         "pm.test('envelope present', () => pm.expect(b).to.have.property('status'));",
         "if (b.status !== 'SUCCESS') { console.warn('FAIL:', b.message, 'X-Request-Id', pm.response.headers.get('X-Request-Id')); }"
        ]
       }
      }
     ]
    },
    {
     "name": "Submit a new MRP and offer price for one SKU (goes to store approval)",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "X-Api-Key",
        "value": "{{apiKey}}"
       },
       {
        "key": "Authorization",
        "value": "Bearer {{accessToken}}"
       },
       {
        "key": "Content-Type",
        "value": "application/json"
       }
      ],
      "url": {
       "raw": "{{baseUrl}}/seller/sku/prices",
       "host": [
        "{{baseUrl}}"
       ],
       "path": [
        "seller",
        "sku",
        "prices"
       ]
      },
      "description": "Submit a new MRP and offer price for one SKU (goes to store approval)\n\n**Scope `seller:sku:write`.** Submits a new **MRP** and **offer (selling) price** for one of your SKUs.\n\n- **Prices are reviewed by the store before they go live.** A successful call answers\n  `\"Price submitted and awaiting approval.\"` - the storefront keeps showing the old price until the\n  store approves. (If your account is later enabled for automatic approval, the answer becomes\n  `\"Record updated successfully.\"` and the price is live at once.)\n- Prices are plain decimals in INR with at most 2 decimals, no thousands separators\n  (`\"64900\"`, `\"64900.50\"`). A JSON string or number is accepted. `mrp` must be > 0;\n  `offerprice` must be >= 0 and **<= `mrp`**.\n- **Safety limit:** a change of **more than 20%** in either MRP or offer price, compared with the\n  SKU's current price on the platform (including a price you submitted that is still awaiting\n  approval), is refused. Large re-pricing has to be done by the store team. A SKU with no current\n  price has no limit.\n- `referenceno` is required (audit reference, see *Idempotency*).\n\nBusiness messages (HTTP 200, `\"status\": \"FAIL\"`):\n\n| Message | Meaning |\n|---|---|\n| `referenceno not found` / `Invalid referenceno` | Missing, or unsafe text. |\n| `sellerskucode not found` | Unknown code, or another seller's. |\n| `mrp not found` / `Invalid mrp` | Missing, zero/negative, non-numeric, or more than 2 decimals. |\n| `offerprice not found` / `Invalid offerprice` | Missing, negative, non-numeric, or more than 2 decimals. |\n| `offerprice cannot be greater than mrp` | Offer price above MRP. |\n| `MRP change of 25% exceeds the permitted 20%. Please submit this change through the admin console.` | MRP moves more than 20% from the current price. |\n| `Offer price change of 30% exceeds the permitted 20%. Please submit this change through the admin console.` | Offer price moves more than 20% from the current price. |\n| `You are not authorized to update this SKU.` | The SKU is not linked to your seller account. |\n| `Seller not found for authenticated user.` | Your credential is linked to more than one seller account - contact us. |\n| `Error while getting record` | Unexpected error - retry later, quote `X-Request-Id`. |\n",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"referenceno\": \"ERP-PRC-0001\",\n  \"sellerskucode\": \"MTP63HN/A\",\n  \"mrp\": \"69900\",\n  \"offerprice\": \"64900\"\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     },
     "response": [
      {
       "name": "Submitted - awaiting store approval",
       "originalRequest": {
        "method": "POST",
        "header": [
         {
          "key": "X-Api-Key",
          "value": "{{apiKey}}"
         },
         {
          "key": "Authorization",
          "value": "Bearer {{accessToken}}"
         },
         {
          "key": "Content-Type",
          "value": "application/json"
         }
        ],
        "url": {
         "raw": "{{baseUrl}}/seller/sku/prices",
         "host": [
          "{{baseUrl}}"
         ],
         "path": [
          "seller",
          "sku",
          "prices"
         ]
        },
        "description": "Submit a new MRP and offer price for one SKU (goes to store approval)\n\n**Scope `seller:sku:write`.** Submits a new **MRP** and **offer (selling) price** for one of your SKUs.\n\n- **Prices are reviewed by the store before they go live.** A successful call answers\n  `\"Price submitted and awaiting approval.\"` - the storefront keeps showing the old price until the\n  store approves. (If your account is later enabled for automatic approval, the answer becomes\n  `\"Record updated successfully.\"` and the price is live at once.)\n- Prices are plain decimals in INR with at most 2 decimals, no thousands separators\n  (`\"64900\"`, `\"64900.50\"`). A JSON string or number is accepted. `mrp` must be > 0;\n  `offerprice` must be >= 0 and **<= `mrp`**.\n- **Safety limit:** a change of **more than 20%** in either MRP or offer price, compared with the\n  SKU's current price on the platform (including a price you submitted that is still awaiting\n  approval), is refused. Large re-pricing has to be done by the store team. A SKU with no current\n  price has no limit.\n- `referenceno` is required (audit reference, see *Idempotency*).\n\nBusiness messages (HTTP 200, `\"status\": \"FAIL\"`):\n\n| Message | Meaning |\n|---|---|\n| `referenceno not found` / `Invalid referenceno` | Missing, or unsafe text. |\n| `sellerskucode not found` | Unknown code, or another seller's. |\n| `mrp not found` / `Invalid mrp` | Missing, zero/negative, non-numeric, or more than 2 decimals. |\n| `offerprice not found` / `Invalid offerprice` | Missing, negative, non-numeric, or more than 2 decimals. |\n| `offerprice cannot be greater than mrp` | Offer price above MRP. |\n| `MRP change of 25% exceeds the permitted 20%. Please submit this change through the admin console.` | MRP moves more than 20% from the current price. |\n| `Offer price change of 30% exceeds the permitted 20%. Please submit this change through the admin console.` | Offer price moves more than 20% from the current price. |\n| `You are not authorized to update this SKU.` | The SKU is not linked to your seller account. |\n| `Seller not found for authenticated user.` | Your credential is linked to more than one seller account - contact us. |\n| `Error while getting record` | Unexpected error - retry later, quote `X-Request-Id`. |\n",
        "body": {
         "mode": "raw",
         "raw": "{\n  \"referenceno\": \"ERP-PRC-0001\",\n  \"sellerskucode\": \"MTP63HN/A\",\n  \"mrp\": \"69900\",\n  \"offerprice\": \"64900\"\n}",
         "options": {
          "raw": {
           "language": "json"
          }
         }
        }
       },
       "status": "OK",
       "code": 200,
       "_postman_previewlanguage": "json",
       "header": [
        {
         "key": "Content-Type",
         "value": "application/json"
        }
       ],
       "cookie": [],
       "body": "{\n  \"status\": \"SUCCESS\",\n  \"message\": \"Price submitted and awaiting approval.\",\n  \"response\": null\n}"
      },
      {
       "name": "Move larger than 20%",
       "originalRequest": {
        "method": "POST",
        "header": [
         {
          "key": "X-Api-Key",
          "value": "{{apiKey}}"
         },
         {
          "key": "Authorization",
          "value": "Bearer {{accessToken}}"
         },
         {
          "key": "Content-Type",
          "value": "application/json"
         }
        ],
        "url": {
         "raw": "{{baseUrl}}/seller/sku/prices",
         "host": [
          "{{baseUrl}}"
         ],
         "path": [
          "seller",
          "sku",
          "prices"
         ]
        },
        "description": "Submit a new MRP and offer price for one SKU (goes to store approval)\n\n**Scope `seller:sku:write`.** Submits a new **MRP** and **offer (selling) price** for one of your SKUs.\n\n- **Prices are reviewed by the store before they go live.** A successful call answers\n  `\"Price submitted and awaiting approval.\"` - the storefront keeps showing the old price until the\n  store approves. (If your account is later enabled for automatic approval, the answer becomes\n  `\"Record updated successfully.\"` and the price is live at once.)\n- Prices are plain decimals in INR with at most 2 decimals, no thousands separators\n  (`\"64900\"`, `\"64900.50\"`). A JSON string or number is accepted. `mrp` must be > 0;\n  `offerprice` must be >= 0 and **<= `mrp`**.\n- **Safety limit:** a change of **more than 20%** in either MRP or offer price, compared with the\n  SKU's current price on the platform (including a price you submitted that is still awaiting\n  approval), is refused. Large re-pricing has to be done by the store team. A SKU with no current\n  price has no limit.\n- `referenceno` is required (audit reference, see *Idempotency*).\n\nBusiness messages (HTTP 200, `\"status\": \"FAIL\"`):\n\n| Message | Meaning |\n|---|---|\n| `referenceno not found` / `Invalid referenceno` | Missing, or unsafe text. |\n| `sellerskucode not found` | Unknown code, or another seller's. |\n| `mrp not found` / `Invalid mrp` | Missing, zero/negative, non-numeric, or more than 2 decimals. |\n| `offerprice not found` / `Invalid offerprice` | Missing, negative, non-numeric, or more than 2 decimals. |\n| `offerprice cannot be greater than mrp` | Offer price above MRP. |\n| `MRP change of 25% exceeds the permitted 20%. Please submit this change through the admin console.` | MRP moves more than 20% from the current price. |\n| `Offer price change of 30% exceeds the permitted 20%. Please submit this change through the admin console.` | Offer price moves more than 20% from the current price. |\n| `You are not authorized to update this SKU.` | The SKU is not linked to your seller account. |\n| `Seller not found for authenticated user.` | Your credential is linked to more than one seller account - contact us. |\n| `Error while getting record` | Unexpected error - retry later, quote `X-Request-Id`. |\n",
        "body": {
         "mode": "raw",
         "raw": "{\n  \"referenceno\": \"ERP-PRC-0001\",\n  \"sellerskucode\": \"MTP63HN/A\",\n  \"mrp\": \"69900\",\n  \"offerprice\": \"64900\"\n}",
         "options": {
          "raw": {
           "language": "json"
          }
         }
        }
       },
       "status": "OK",
       "code": 200,
       "_postman_previewlanguage": "json",
       "header": [
        {
         "key": "Content-Type",
         "value": "application/json"
        }
       ],
       "cookie": [],
       "body": "{\n  \"status\": \"FAIL\",\n  \"message\": \"Offer price change of 30% exceeds the permitted 20%. Please submit this change through the admin console.\",\n  \"response\": null\n}"
      },
      {
       "name": "Offer price above MRP",
       "originalRequest": {
        "method": "POST",
        "header": [
         {
          "key": "X-Api-Key",
          "value": "{{apiKey}}"
         },
         {
          "key": "Authorization",
          "value": "Bearer {{accessToken}}"
         },
         {
          "key": "Content-Type",
          "value": "application/json"
         }
        ],
        "url": {
         "raw": "{{baseUrl}}/seller/sku/prices",
         "host": [
          "{{baseUrl}}"
         ],
         "path": [
          "seller",
          "sku",
          "prices"
         ]
        },
        "description": "Submit a new MRP and offer price for one SKU (goes to store approval)\n\n**Scope `seller:sku:write`.** Submits a new **MRP** and **offer (selling) price** for one of your SKUs.\n\n- **Prices are reviewed by the store before they go live.** A successful call answers\n  `\"Price submitted and awaiting approval.\"` - the storefront keeps showing the old price until the\n  store approves. (If your account is later enabled for automatic approval, the answer becomes\n  `\"Record updated successfully.\"` and the price is live at once.)\n- Prices are plain decimals in INR with at most 2 decimals, no thousands separators\n  (`\"64900\"`, `\"64900.50\"`). A JSON string or number is accepted. `mrp` must be > 0;\n  `offerprice` must be >= 0 and **<= `mrp`**.\n- **Safety limit:** a change of **more than 20%** in either MRP or offer price, compared with the\n  SKU's current price on the platform (including a price you submitted that is still awaiting\n  approval), is refused. Large re-pricing has to be done by the store team. A SKU with no current\n  price has no limit.\n- `referenceno` is required (audit reference, see *Idempotency*).\n\nBusiness messages (HTTP 200, `\"status\": \"FAIL\"`):\n\n| Message | Meaning |\n|---|---|\n| `referenceno not found` / `Invalid referenceno` | Missing, or unsafe text. |\n| `sellerskucode not found` | Unknown code, or another seller's. |\n| `mrp not found` / `Invalid mrp` | Missing, zero/negative, non-numeric, or more than 2 decimals. |\n| `offerprice not found` / `Invalid offerprice` | Missing, negative, non-numeric, or more than 2 decimals. |\n| `offerprice cannot be greater than mrp` | Offer price above MRP. |\n| `MRP change of 25% exceeds the permitted 20%. Please submit this change through the admin console.` | MRP moves more than 20% from the current price. |\n| `Offer price change of 30% exceeds the permitted 20%. Please submit this change through the admin console.` | Offer price moves more than 20% from the current price. |\n| `You are not authorized to update this SKU.` | The SKU is not linked to your seller account. |\n| `Seller not found for authenticated user.` | Your credential is linked to more than one seller account - contact us. |\n| `Error while getting record` | Unexpected error - retry later, quote `X-Request-Id`. |\n",
        "body": {
         "mode": "raw",
         "raw": "{\n  \"referenceno\": \"ERP-PRC-0001\",\n  \"sellerskucode\": \"MTP63HN/A\",\n  \"mrp\": \"69900\",\n  \"offerprice\": \"64900\"\n}",
         "options": {
          "raw": {
           "language": "json"
          }
         }
        }
       },
       "status": "OK",
       "code": 200,
       "_postman_previewlanguage": "json",
       "header": [
        {
         "key": "Content-Type",
         "value": "application/json"
        }
       ],
       "cookie": [],
       "body": "{\n  \"status\": \"FAIL\",\n  \"message\": \"offerprice cannot be greater than mrp\",\n  \"response\": null\n}"
      },
      {
       "name": "Unknown / another seller's code",
       "originalRequest": {
        "method": "POST",
        "header": [
         {
          "key": "X-Api-Key",
          "value": "{{apiKey}}"
         },
         {
          "key": "Authorization",
          "value": "Bearer {{accessToken}}"
         },
         {
          "key": "Content-Type",
          "value": "application/json"
         }
        ],
        "url": {
         "raw": "{{baseUrl}}/seller/sku/prices",
         "host": [
          "{{baseUrl}}"
         ],
         "path": [
          "seller",
          "sku",
          "prices"
         ]
        },
        "description": "Submit a new MRP and offer price for one SKU (goes to store approval)\n\n**Scope `seller:sku:write`.** Submits a new **MRP** and **offer (selling) price** for one of your SKUs.\n\n- **Prices are reviewed by the store before they go live.** A successful call answers\n  `\"Price submitted and awaiting approval.\"` - the storefront keeps showing the old price until the\n  store approves. (If your account is later enabled for automatic approval, the answer becomes\n  `\"Record updated successfully.\"` and the price is live at once.)\n- Prices are plain decimals in INR with at most 2 decimals, no thousands separators\n  (`\"64900\"`, `\"64900.50\"`). A JSON string or number is accepted. `mrp` must be > 0;\n  `offerprice` must be >= 0 and **<= `mrp`**.\n- **Safety limit:** a change of **more than 20%** in either MRP or offer price, compared with the\n  SKU's current price on the platform (including a price you submitted that is still awaiting\n  approval), is refused. Large re-pricing has to be done by the store team. A SKU with no current\n  price has no limit.\n- `referenceno` is required (audit reference, see *Idempotency*).\n\nBusiness messages (HTTP 200, `\"status\": \"FAIL\"`):\n\n| Message | Meaning |\n|---|---|\n| `referenceno not found` / `Invalid referenceno` | Missing, or unsafe text. |\n| `sellerskucode not found` | Unknown code, or another seller's. |\n| `mrp not found` / `Invalid mrp` | Missing, zero/negative, non-numeric, or more than 2 decimals. |\n| `offerprice not found` / `Invalid offerprice` | Missing, negative, non-numeric, or more than 2 decimals. |\n| `offerprice cannot be greater than mrp` | Offer price above MRP. |\n| `MRP change of 25% exceeds the permitted 20%. Please submit this change through the admin console.` | MRP moves more than 20% from the current price. |\n| `Offer price change of 30% exceeds the permitted 20%. Please submit this change through the admin console.` | Offer price moves more than 20% from the current price. |\n| `You are not authorized to update this SKU.` | The SKU is not linked to your seller account. |\n| `Seller not found for authenticated user.` | Your credential is linked to more than one seller account - contact us. |\n| `Error while getting record` | Unexpected error - retry later, quote `X-Request-Id`. |\n",
        "body": {
         "mode": "raw",
         "raw": "{\n  \"referenceno\": \"ERP-PRC-0001\",\n  \"sellerskucode\": \"MTP63HN/A\",\n  \"mrp\": \"69900\",\n  \"offerprice\": \"64900\"\n}",
         "options": {
          "raw": {
           "language": "json"
          }
         }
        }
       },
       "status": "OK",
       "code": 200,
       "_postman_previewlanguage": "json",
       "header": [
        {
         "key": "Content-Type",
         "value": "application/json"
        }
       ],
       "cookie": [],
       "body": "{\n  \"status\": \"FAIL\",\n  \"message\": \"sellerskucode not found\",\n  \"response\": null\n}"
      },
      {
       "name": "401 - E_AUTH",
       "originalRequest": {
        "method": "POST",
        "header": [
         {
          "key": "X-Api-Key",
          "value": "{{apiKey}}"
         },
         {
          "key": "Authorization",
          "value": "Bearer {{accessToken}}"
         },
         {
          "key": "Content-Type",
          "value": "application/json"
         }
        ],
        "url": {
         "raw": "{{baseUrl}}/seller/sku/prices",
         "host": [
          "{{baseUrl}}"
         ],
         "path": [
          "seller",
          "sku",
          "prices"
         ]
        },
        "description": "Submit a new MRP and offer price for one SKU (goes to store approval)\n\n**Scope `seller:sku:write`.** Submits a new **MRP** and **offer (selling) price** for one of your SKUs.\n\n- **Prices are reviewed by the store before they go live.** A successful call answers\n  `\"Price submitted and awaiting approval.\"` - the storefront keeps showing the old price until the\n  store approves. (If your account is later enabled for automatic approval, the answer becomes\n  `\"Record updated successfully.\"` and the price is live at once.)\n- Prices are plain decimals in INR with at most 2 decimals, no thousands separators\n  (`\"64900\"`, `\"64900.50\"`). A JSON string or number is accepted. `mrp` must be > 0;\n  `offerprice` must be >= 0 and **<= `mrp`**.\n- **Safety limit:** a change of **more than 20%** in either MRP or offer price, compared with the\n  SKU's current price on the platform (including a price you submitted that is still awaiting\n  approval), is refused. Large re-pricing has to be done by the store team. A SKU with no current\n  price has no limit.\n- `referenceno` is required (audit reference, see *Idempotency*).\n\nBusiness messages (HTTP 200, `\"status\": \"FAIL\"`):\n\n| Message | Meaning |\n|---|---|\n| `referenceno not found` / `Invalid referenceno` | Missing, or unsafe text. |\n| `sellerskucode not found` | Unknown code, or another seller's. |\n| `mrp not found` / `Invalid mrp` | Missing, zero/negative, non-numeric, or more than 2 decimals. |\n| `offerprice not found` / `Invalid offerprice` | Missing, negative, non-numeric, or more than 2 decimals. |\n| `offerprice cannot be greater than mrp` | Offer price above MRP. |\n| `MRP change of 25% exceeds the permitted 20%. Please submit this change through the admin console.` | MRP moves more than 20% from the current price. |\n| `Offer price change of 30% exceeds the permitted 20%. Please submit this change through the admin console.` | Offer price moves more than 20% from the current price. |\n| `You are not authorized to update this SKU.` | The SKU is not linked to your seller account. |\n| `Seller not found for authenticated user.` | Your credential is linked to more than one seller account - contact us. |\n| `Error while getting record` | Unexpected error - retry later, quote `X-Request-Id`. |\n",
        "body": {
         "mode": "raw",
         "raw": "{\n  \"referenceno\": \"ERP-PRC-0001\",\n  \"sellerskucode\": \"MTP63HN/A\",\n  \"mrp\": \"69900\",\n  \"offerprice\": \"64900\"\n}",
         "options": {
          "raw": {
           "language": "json"
          }
         }
        }
       },
       "status": "Unauthorized",
       "code": 401,
       "_postman_previewlanguage": "json",
       "header": [
        {
         "key": "Content-Type",
         "value": "application/json"
        }
       ],
       "cookie": [],
       "body": "{\n  \"status\": \"FAIL\",\n  \"message\": \"Request could not be authorized.\",\n  \"response\": {\n    \"code\": \"E_AUTH\",\n    \"requestId\": \"0d6f4f2e-3c1a-4a43-9f63-1f2a7c9b8e10\"\n  }\n}"
      }
     ],
     "event": [
      {
       "listen": "test",
       "script": {
        "type": "text/javascript",
        "exec": [
         "// Business refusals are HTTP 200 with status FAIL - always look at the envelope.",
         "const b = pm.response.json();",
         "pm.test('envelope present', () => pm.expect(b).to.have.property('status'));",
         "if (b.status !== 'SUCCESS') { console.warn('FAIL:', b.message, 'X-Request-Id', pm.response.headers.get('X-Request-Id')); }"
        ]
       }
      }
     ]
    },
    {
     "name": "Push stock for up to 100 SKUs in one call",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "X-Api-Key",
        "value": "{{apiKey}}"
       },
       {
        "key": "Authorization",
        "value": "Bearer {{accessToken}}"
       },
       {
        "key": "Content-Type",
        "value": "application/json"
       }
      ],
      "url": {
       "raw": "{{baseUrl}}/seller/sku/inventory/batch",
       "host": [
        "{{baseUrl}}"
       ],
       "path": [
        "seller",
        "sku",
        "inventory",
        "batch"
       ]
      },
      "description": "Push stock for up to 100 SKUs in one call\n\n**Scope `seller:sku:write`.** Same rules as `/seller/sku/inventory` (absolute quantity), for up to 100 SKUs.\n\n- `items`: 1 to **100** single-SKU bodies, exactly as for the single call. Each item is processed\n  **independently and in order**; one item's failure does not affect the others.\n- The call answers `\"status\": \"SUCCESS\"` once the batch was processed - **check `response.failed`\n  and each `results[i].status`**. `message` is `\"All items processed.\"` when every item succeeded,\n  otherwise `\"Batch processed; see results.\"`.\n- `results[i].index` is the 0-based position in `items`; `message` is exactly what the single call\n  would have answered for that item.\n- The whole batch is refused (`\"status\": \"FAIL\"`) only for `items is required and must not be empty.`\n  or `At most 100 items per batch.`\n- A batch counts as **one** request against your rate limit.\n",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"items\": [\n    {\n      \"referenceno\": \"ERP-INV-0001-1\",\n      \"sellerskucode\": \"MTP63HN/A\",\n      \"quantity\": \"25\"\n    },\n    {\n      \"referenceno\": \"ERP-INV-0001-2\",\n      \"sellerskucode\": \"MXP93HN/A\",\n      \"quantity\": \"0\"\n    }\n  ]\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     },
     "response": [
      {
       "name": "All processed",
       "originalRequest": {
        "method": "POST",
        "header": [
         {
          "key": "X-Api-Key",
          "value": "{{apiKey}}"
         },
         {
          "key": "Authorization",
          "value": "Bearer {{accessToken}}"
         },
         {
          "key": "Content-Type",
          "value": "application/json"
         }
        ],
        "url": {
         "raw": "{{baseUrl}}/seller/sku/inventory/batch",
         "host": [
          "{{baseUrl}}"
         ],
         "path": [
          "seller",
          "sku",
          "inventory",
          "batch"
         ]
        },
        "description": "Push stock for up to 100 SKUs in one call\n\n**Scope `seller:sku:write`.** Same rules as `/seller/sku/inventory` (absolute quantity), for up to 100 SKUs.\n\n- `items`: 1 to **100** single-SKU bodies, exactly as for the single call. Each item is processed\n  **independently and in order**; one item's failure does not affect the others.\n- The call answers `\"status\": \"SUCCESS\"` once the batch was processed - **check `response.failed`\n  and each `results[i].status`**. `message` is `\"All items processed.\"` when every item succeeded,\n  otherwise `\"Batch processed; see results.\"`.\n- `results[i].index` is the 0-based position in `items`; `message` is exactly what the single call\n  would have answered for that item.\n- The whole batch is refused (`\"status\": \"FAIL\"`) only for `items is required and must not be empty.`\n  or `At most 100 items per batch.`\n- A batch counts as **one** request against your rate limit.\n",
        "body": {
         "mode": "raw",
         "raw": "{\n  \"items\": [\n    {\n      \"referenceno\": \"ERP-INV-0001-1\",\n      \"sellerskucode\": \"MTP63HN/A\",\n      \"quantity\": \"25\"\n    },\n    {\n      \"referenceno\": \"ERP-INV-0001-2\",\n      \"sellerskucode\": \"MXP93HN/A\",\n      \"quantity\": \"0\"\n    }\n  ]\n}",
         "options": {
          "raw": {
           "language": "json"
          }
         }
        }
       },
       "status": "OK",
       "code": 200,
       "_postman_previewlanguage": "json",
       "header": [
        {
         "key": "Content-Type",
         "value": "application/json"
        }
       ],
       "cookie": [],
       "body": "{\n  \"status\": \"SUCCESS\",\n  \"message\": \"All items processed.\",\n  \"response\": {\n    \"total\": 2,\n    \"succeeded\": 2,\n    \"failed\": 0,\n    \"results\": [\n      {\n        \"index\": 0,\n        \"sellerskucode\": \"MTP63HN/A\",\n        \"referenceno\": \"ERP-INV-0001-1\",\n        \"status\": \"SUCCESS\",\n        \"message\": \"Record updated successfully.\"\n      },\n      {\n        \"index\": 1,\n        \"sellerskucode\": \"MXP93HN/A\",\n        \"referenceno\": \"ERP-INV-0001-2\",\n        \"status\": \"SUCCESS\",\n        \"message\": \"Record updated successfully.\"\n      }\n    ]\n  }\n}"
      },
      {
       "name": "One item refused",
       "originalRequest": {
        "method": "POST",
        "header": [
         {
          "key": "X-Api-Key",
          "value": "{{apiKey}}"
         },
         {
          "key": "Authorization",
          "value": "Bearer {{accessToken}}"
         },
         {
          "key": "Content-Type",
          "value": "application/json"
         }
        ],
        "url": {
         "raw": "{{baseUrl}}/seller/sku/inventory/batch",
         "host": [
          "{{baseUrl}}"
         ],
         "path": [
          "seller",
          "sku",
          "inventory",
          "batch"
         ]
        },
        "description": "Push stock for up to 100 SKUs in one call\n\n**Scope `seller:sku:write`.** Same rules as `/seller/sku/inventory` (absolute quantity), for up to 100 SKUs.\n\n- `items`: 1 to **100** single-SKU bodies, exactly as for the single call. Each item is processed\n  **independently and in order**; one item's failure does not affect the others.\n- The call answers `\"status\": \"SUCCESS\"` once the batch was processed - **check `response.failed`\n  and each `results[i].status`**. `message` is `\"All items processed.\"` when every item succeeded,\n  otherwise `\"Batch processed; see results.\"`.\n- `results[i].index` is the 0-based position in `items`; `message` is exactly what the single call\n  would have answered for that item.\n- The whole batch is refused (`\"status\": \"FAIL\"`) only for `items is required and must not be empty.`\n  or `At most 100 items per batch.`\n- A batch counts as **one** request against your rate limit.\n",
        "body": {
         "mode": "raw",
         "raw": "{\n  \"items\": [\n    {\n      \"referenceno\": \"ERP-INV-0001-1\",\n      \"sellerskucode\": \"MTP63HN/A\",\n      \"quantity\": \"25\"\n    },\n    {\n      \"referenceno\": \"ERP-INV-0001-2\",\n      \"sellerskucode\": \"MXP93HN/A\",\n      \"quantity\": \"0\"\n    }\n  ]\n}",
         "options": {
          "raw": {
           "language": "json"
          }
         }
        }
       },
       "status": "OK",
       "code": 200,
       "_postman_previewlanguage": "json",
       "header": [
        {
         "key": "Content-Type",
         "value": "application/json"
        }
       ],
       "cookie": [],
       "body": "{\n  \"status\": \"SUCCESS\",\n  \"message\": \"Batch processed; see results.\",\n  \"response\": {\n    \"total\": 2,\n    \"succeeded\": 1,\n    \"failed\": 1,\n    \"results\": [\n      {\n        \"index\": 0,\n        \"sellerskucode\": \"MTP63HN/A\",\n        \"referenceno\": \"ERP-INV-0001-1\",\n        \"status\": \"SUCCESS\",\n        \"message\": \"Record updated successfully.\"\n      },\n      {\n        \"index\": 1,\n        \"sellerskucode\": \"UNKNOWN-01\",\n        \"referenceno\": \"ERP-INV-0001-2\",\n        \"status\": \"FAIL\",\n        \"message\": \"sellerskucode not found\"\n      }\n    ]\n  }\n}"
      },
      {
       "name": "Empty items",
       "originalRequest": {
        "method": "POST",
        "header": [
         {
          "key": "X-Api-Key",
          "value": "{{apiKey}}"
         },
         {
          "key": "Authorization",
          "value": "Bearer {{accessToken}}"
         },
         {
          "key": "Content-Type",
          "value": "application/json"
         }
        ],
        "url": {
         "raw": "{{baseUrl}}/seller/sku/inventory/batch",
         "host": [
          "{{baseUrl}}"
         ],
         "path": [
          "seller",
          "sku",
          "inventory",
          "batch"
         ]
        },
        "description": "Push stock for up to 100 SKUs in one call\n\n**Scope `seller:sku:write`.** Same rules as `/seller/sku/inventory` (absolute quantity), for up to 100 SKUs.\n\n- `items`: 1 to **100** single-SKU bodies, exactly as for the single call. Each item is processed\n  **independently and in order**; one item's failure does not affect the others.\n- The call answers `\"status\": \"SUCCESS\"` once the batch was processed - **check `response.failed`\n  and each `results[i].status`**. `message` is `\"All items processed.\"` when every item succeeded,\n  otherwise `\"Batch processed; see results.\"`.\n- `results[i].index` is the 0-based position in `items`; `message` is exactly what the single call\n  would have answered for that item.\n- The whole batch is refused (`\"status\": \"FAIL\"`) only for `items is required and must not be empty.`\n  or `At most 100 items per batch.`\n- A batch counts as **one** request against your rate limit.\n",
        "body": {
         "mode": "raw",
         "raw": "{\n  \"items\": [\n    {\n      \"referenceno\": \"ERP-INV-0001-1\",\n      \"sellerskucode\": \"MTP63HN/A\",\n      \"quantity\": \"25\"\n    },\n    {\n      \"referenceno\": \"ERP-INV-0001-2\",\n      \"sellerskucode\": \"MXP93HN/A\",\n      \"quantity\": \"0\"\n    }\n  ]\n}",
         "options": {
          "raw": {
           "language": "json"
          }
         }
        }
       },
       "status": "OK",
       "code": 200,
       "_postman_previewlanguage": "json",
       "header": [
        {
         "key": "Content-Type",
         "value": "application/json"
        }
       ],
       "cookie": [],
       "body": "{\n  \"status\": \"FAIL\",\n  \"message\": \"items is required and must not be empty.\",\n  \"response\": null\n}"
      },
      {
       "name": "More than 100 items",
       "originalRequest": {
        "method": "POST",
        "header": [
         {
          "key": "X-Api-Key",
          "value": "{{apiKey}}"
         },
         {
          "key": "Authorization",
          "value": "Bearer {{accessToken}}"
         },
         {
          "key": "Content-Type",
          "value": "application/json"
         }
        ],
        "url": {
         "raw": "{{baseUrl}}/seller/sku/inventory/batch",
         "host": [
          "{{baseUrl}}"
         ],
         "path": [
          "seller",
          "sku",
          "inventory",
          "batch"
         ]
        },
        "description": "Push stock for up to 100 SKUs in one call\n\n**Scope `seller:sku:write`.** Same rules as `/seller/sku/inventory` (absolute quantity), for up to 100 SKUs.\n\n- `items`: 1 to **100** single-SKU bodies, exactly as for the single call. Each item is processed\n  **independently and in order**; one item's failure does not affect the others.\n- The call answers `\"status\": \"SUCCESS\"` once the batch was processed - **check `response.failed`\n  and each `results[i].status`**. `message` is `\"All items processed.\"` when every item succeeded,\n  otherwise `\"Batch processed; see results.\"`.\n- `results[i].index` is the 0-based position in `items`; `message` is exactly what the single call\n  would have answered for that item.\n- The whole batch is refused (`\"status\": \"FAIL\"`) only for `items is required and must not be empty.`\n  or `At most 100 items per batch.`\n- A batch counts as **one** request against your rate limit.\n",
        "body": {
         "mode": "raw",
         "raw": "{\n  \"items\": [\n    {\n      \"referenceno\": \"ERP-INV-0001-1\",\n      \"sellerskucode\": \"MTP63HN/A\",\n      \"quantity\": \"25\"\n    },\n    {\n      \"referenceno\": \"ERP-INV-0001-2\",\n      \"sellerskucode\": \"MXP93HN/A\",\n      \"quantity\": \"0\"\n    }\n  ]\n}",
         "options": {
          "raw": {
           "language": "json"
          }
         }
        }
       },
       "status": "OK",
       "code": 200,
       "_postman_previewlanguage": "json",
       "header": [
        {
         "key": "Content-Type",
         "value": "application/json"
        }
       ],
       "cookie": [],
       "body": "{\n  \"status\": \"FAIL\",\n  \"message\": \"At most 100 items per batch.\",\n  \"response\": null\n}"
      },
      {
       "name": "401 - E_AUTH",
       "originalRequest": {
        "method": "POST",
        "header": [
         {
          "key": "X-Api-Key",
          "value": "{{apiKey}}"
         },
         {
          "key": "Authorization",
          "value": "Bearer {{accessToken}}"
         },
         {
          "key": "Content-Type",
          "value": "application/json"
         }
        ],
        "url": {
         "raw": "{{baseUrl}}/seller/sku/inventory/batch",
         "host": [
          "{{baseUrl}}"
         ],
         "path": [
          "seller",
          "sku",
          "inventory",
          "batch"
         ]
        },
        "description": "Push stock for up to 100 SKUs in one call\n\n**Scope `seller:sku:write`.** Same rules as `/seller/sku/inventory` (absolute quantity), for up to 100 SKUs.\n\n- `items`: 1 to **100** single-SKU bodies, exactly as for the single call. Each item is processed\n  **independently and in order**; one item's failure does not affect the others.\n- The call answers `\"status\": \"SUCCESS\"` once the batch was processed - **check `response.failed`\n  and each `results[i].status`**. `message` is `\"All items processed.\"` when every item succeeded,\n  otherwise `\"Batch processed; see results.\"`.\n- `results[i].index` is the 0-based position in `items`; `message` is exactly what the single call\n  would have answered for that item.\n- The whole batch is refused (`\"status\": \"FAIL\"`) only for `items is required and must not be empty.`\n  or `At most 100 items per batch.`\n- A batch counts as **one** request against your rate limit.\n",
        "body": {
         "mode": "raw",
         "raw": "{\n  \"items\": [\n    {\n      \"referenceno\": \"ERP-INV-0001-1\",\n      \"sellerskucode\": \"MTP63HN/A\",\n      \"quantity\": \"25\"\n    },\n    {\n      \"referenceno\": \"ERP-INV-0001-2\",\n      \"sellerskucode\": \"MXP93HN/A\",\n      \"quantity\": \"0\"\n    }\n  ]\n}",
         "options": {
          "raw": {
           "language": "json"
          }
         }
        }
       },
       "status": "Unauthorized",
       "code": 401,
       "_postman_previewlanguage": "json",
       "header": [
        {
         "key": "Content-Type",
         "value": "application/json"
        }
       ],
       "cookie": [],
       "body": "{\n  \"status\": \"FAIL\",\n  \"message\": \"Request could not be authorized.\",\n  \"response\": {\n    \"code\": \"E_AUTH\",\n    \"requestId\": \"0d6f4f2e-3c1a-4a43-9f63-1f2a7c9b8e10\"\n  }\n}"
      }
     ],
     "event": [
      {
       "listen": "test",
       "script": {
        "type": "text/javascript",
        "exec": [
         "// Business refusals are HTTP 200 with status FAIL - always look at the envelope.",
         "const b = pm.response.json();",
         "pm.test('envelope present', () => pm.expect(b).to.have.property('status'));",
         "if (b.status !== 'SUCCESS') { console.warn('FAIL:', b.message, 'X-Request-Id', pm.response.headers.get('X-Request-Id')); }"
        ]
       }
      }
     ]
    },
    {
     "name": "Submit prices for up to 100 SKUs in one call",
     "request": {
      "method": "POST",
      "header": [
       {
        "key": "X-Api-Key",
        "value": "{{apiKey}}"
       },
       {
        "key": "Authorization",
        "value": "Bearer {{accessToken}}"
       },
       {
        "key": "Content-Type",
        "value": "application/json"
       }
      ],
      "url": {
       "raw": "{{baseUrl}}/seller/sku/prices/batch",
       "host": [
        "{{baseUrl}}"
       ],
       "path": [
        "seller",
        "sku",
        "prices",
        "batch"
       ]
      },
      "description": "Submit prices for up to 100 SKUs in one call\n\n**Scope `seller:sku:write`.** Same rules as `/seller/sku/prices` (store approval, 20% limit), for up to 100 SKUs.\n\n- `items`: 1 to **100** single-SKU bodies, exactly as for the single call. Each item is processed\n  **independently and in order**; one item's failure does not affect the others.\n- The call answers `\"status\": \"SUCCESS\"` once the batch was processed - **check `response.failed`\n  and each `results[i].status`**. `message` is `\"All items processed.\"` when every item succeeded,\n  otherwise `\"Batch processed; see results.\"`.\n- `results[i].index` is the 0-based position in `items`; `message` is exactly what the single call\n  would have answered for that item.\n- The whole batch is refused (`\"status\": \"FAIL\"`) only for `items is required and must not be empty.`\n  or `At most 100 items per batch.`\n- A batch counts as **one** request against your rate limit.\n",
      "body": {
       "mode": "raw",
       "raw": "{\n  \"items\": [\n    {\n      \"referenceno\": \"ERP-PRC-0001-1\",\n      \"sellerskucode\": \"MTP63HN/A\",\n      \"mrp\": \"69900\",\n      \"offerprice\": \"64900\"\n    },\n    {\n      \"referenceno\": \"ERP-PRC-0001-2\",\n      \"sellerskucode\": \"MXP93HN/A\",\n      \"mrp\": \"79900\",\n      \"offerprice\": \"74900\"\n    }\n  ]\n}",
       "options": {
        "raw": {
         "language": "json"
        }
       }
      }
     },
     "response": [
      {
       "name": "All submitted",
       "originalRequest": {
        "method": "POST",
        "header": [
         {
          "key": "X-Api-Key",
          "value": "{{apiKey}}"
         },
         {
          "key": "Authorization",
          "value": "Bearer {{accessToken}}"
         },
         {
          "key": "Content-Type",
          "value": "application/json"
         }
        ],
        "url": {
         "raw": "{{baseUrl}}/seller/sku/prices/batch",
         "host": [
          "{{baseUrl}}"
         ],
         "path": [
          "seller",
          "sku",
          "prices",
          "batch"
         ]
        },
        "description": "Submit prices for up to 100 SKUs in one call\n\n**Scope `seller:sku:write`.** Same rules as `/seller/sku/prices` (store approval, 20% limit), for up to 100 SKUs.\n\n- `items`: 1 to **100** single-SKU bodies, exactly as for the single call. Each item is processed\n  **independently and in order**; one item's failure does not affect the others.\n- The call answers `\"status\": \"SUCCESS\"` once the batch was processed - **check `response.failed`\n  and each `results[i].status`**. `message` is `\"All items processed.\"` when every item succeeded,\n  otherwise `\"Batch processed; see results.\"`.\n- `results[i].index` is the 0-based position in `items`; `message` is exactly what the single call\n  would have answered for that item.\n- The whole batch is refused (`\"status\": \"FAIL\"`) only for `items is required and must not be empty.`\n  or `At most 100 items per batch.`\n- A batch counts as **one** request against your rate limit.\n",
        "body": {
         "mode": "raw",
         "raw": "{\n  \"items\": [\n    {\n      \"referenceno\": \"ERP-PRC-0001-1\",\n      \"sellerskucode\": \"MTP63HN/A\",\n      \"mrp\": \"69900\",\n      \"offerprice\": \"64900\"\n    },\n    {\n      \"referenceno\": \"ERP-PRC-0001-2\",\n      \"sellerskucode\": \"MXP93HN/A\",\n      \"mrp\": \"79900\",\n      \"offerprice\": \"74900\"\n    }\n  ]\n}",
         "options": {
          "raw": {
           "language": "json"
          }
         }
        }
       },
       "status": "OK",
       "code": 200,
       "_postman_previewlanguage": "json",
       "header": [
        {
         "key": "Content-Type",
         "value": "application/json"
        }
       ],
       "cookie": [],
       "body": "{\n  \"status\": \"SUCCESS\",\n  \"message\": \"All items processed.\",\n  \"response\": {\n    \"total\": 2,\n    \"succeeded\": 2,\n    \"failed\": 0,\n    \"results\": [\n      {\n        \"index\": 0,\n        \"sellerskucode\": \"MTP63HN/A\",\n        \"referenceno\": \"ERP-PRC-0001-1\",\n        \"status\": \"SUCCESS\",\n        \"message\": \"Price submitted and awaiting approval.\"\n      },\n      {\n        \"index\": 1,\n        \"sellerskucode\": \"MXP93HN/A\",\n        \"referenceno\": \"ERP-PRC-0001-2\",\n        \"status\": \"SUCCESS\",\n        \"message\": \"Price submitted and awaiting approval.\"\n      }\n    ]\n  }\n}"
      },
      {
       "name": "One item refused",
       "originalRequest": {
        "method": "POST",
        "header": [
         {
          "key": "X-Api-Key",
          "value": "{{apiKey}}"
         },
         {
          "key": "Authorization",
          "value": "Bearer {{accessToken}}"
         },
         {
          "key": "Content-Type",
          "value": "application/json"
         }
        ],
        "url": {
         "raw": "{{baseUrl}}/seller/sku/prices/batch",
         "host": [
          "{{baseUrl}}"
         ],
         "path": [
          "seller",
          "sku",
          "prices",
          "batch"
         ]
        },
        "description": "Submit prices for up to 100 SKUs in one call\n\n**Scope `seller:sku:write`.** Same rules as `/seller/sku/prices` (store approval, 20% limit), for up to 100 SKUs.\n\n- `items`: 1 to **100** single-SKU bodies, exactly as for the single call. Each item is processed\n  **independently and in order**; one item's failure does not affect the others.\n- The call answers `\"status\": \"SUCCESS\"` once the batch was processed - **check `response.failed`\n  and each `results[i].status`**. `message` is `\"All items processed.\"` when every item succeeded,\n  otherwise `\"Batch processed; see results.\"`.\n- `results[i].index` is the 0-based position in `items`; `message` is exactly what the single call\n  would have answered for that item.\n- The whole batch is refused (`\"status\": \"FAIL\"`) only for `items is required and must not be empty.`\n  or `At most 100 items per batch.`\n- A batch counts as **one** request against your rate limit.\n",
        "body": {
         "mode": "raw",
         "raw": "{\n  \"items\": [\n    {\n      \"referenceno\": \"ERP-PRC-0001-1\",\n      \"sellerskucode\": \"MTP63HN/A\",\n      \"mrp\": \"69900\",\n      \"offerprice\": \"64900\"\n    },\n    {\n      \"referenceno\": \"ERP-PRC-0001-2\",\n      \"sellerskucode\": \"MXP93HN/A\",\n      \"mrp\": \"79900\",\n      \"offerprice\": \"74900\"\n    }\n  ]\n}",
         "options": {
          "raw": {
           "language": "json"
          }
         }
        }
       },
       "status": "OK",
       "code": 200,
       "_postman_previewlanguage": "json",
       "header": [
        {
         "key": "Content-Type",
         "value": "application/json"
        }
       ],
       "cookie": [],
       "body": "{\n  \"status\": \"SUCCESS\",\n  \"message\": \"Batch processed; see results.\",\n  \"response\": {\n    \"total\": 2,\n    \"succeeded\": 1,\n    \"failed\": 1,\n    \"results\": [\n      {\n        \"index\": 0,\n        \"sellerskucode\": \"MTP63HN/A\",\n        \"referenceno\": \"ERP-PRC-0001-1\",\n        \"status\": \"SUCCESS\",\n        \"message\": \"Price submitted and awaiting approval.\"\n      },\n      {\n        \"index\": 1,\n        \"sellerskucode\": \"MXP93HN/A\",\n        \"referenceno\": \"ERP-PRC-0001-2\",\n        \"status\": \"FAIL\",\n        \"message\": \"offerprice cannot be greater than mrp\"\n      }\n    ]\n  }\n}"
      },
      {
       "name": "More than 100 items",
       "originalRequest": {
        "method": "POST",
        "header": [
         {
          "key": "X-Api-Key",
          "value": "{{apiKey}}"
         },
         {
          "key": "Authorization",
          "value": "Bearer {{accessToken}}"
         },
         {
          "key": "Content-Type",
          "value": "application/json"
         }
        ],
        "url": {
         "raw": "{{baseUrl}}/seller/sku/prices/batch",
         "host": [
          "{{baseUrl}}"
         ],
         "path": [
          "seller",
          "sku",
          "prices",
          "batch"
         ]
        },
        "description": "Submit prices for up to 100 SKUs in one call\n\n**Scope `seller:sku:write`.** Same rules as `/seller/sku/prices` (store approval, 20% limit), for up to 100 SKUs.\n\n- `items`: 1 to **100** single-SKU bodies, exactly as for the single call. Each item is processed\n  **independently and in order**; one item's failure does not affect the others.\n- The call answers `\"status\": \"SUCCESS\"` once the batch was processed - **check `response.failed`\n  and each `results[i].status`**. `message` is `\"All items processed.\"` when every item succeeded,\n  otherwise `\"Batch processed; see results.\"`.\n- `results[i].index` is the 0-based position in `items`; `message` is exactly what the single call\n  would have answered for that item.\n- The whole batch is refused (`\"status\": \"FAIL\"`) only for `items is required and must not be empty.`\n  or `At most 100 items per batch.`\n- A batch counts as **one** request against your rate limit.\n",
        "body": {
         "mode": "raw",
         "raw": "{\n  \"items\": [\n    {\n      \"referenceno\": \"ERP-PRC-0001-1\",\n      \"sellerskucode\": \"MTP63HN/A\",\n      \"mrp\": \"69900\",\n      \"offerprice\": \"64900\"\n    },\n    {\n      \"referenceno\": \"ERP-PRC-0001-2\",\n      \"sellerskucode\": \"MXP93HN/A\",\n      \"mrp\": \"79900\",\n      \"offerprice\": \"74900\"\n    }\n  ]\n}",
         "options": {
          "raw": {
           "language": "json"
          }
         }
        }
       },
       "status": "OK",
       "code": 200,
       "_postman_previewlanguage": "json",
       "header": [
        {
         "key": "Content-Type",
         "value": "application/json"
        }
       ],
       "cookie": [],
       "body": "{\n  \"status\": \"FAIL\",\n  \"message\": \"At most 100 items per batch.\",\n  \"response\": null\n}"
      },
      {
       "name": "401 - E_AUTH",
       "originalRequest": {
        "method": "POST",
        "header": [
         {
          "key": "X-Api-Key",
          "value": "{{apiKey}}"
         },
         {
          "key": "Authorization",
          "value": "Bearer {{accessToken}}"
         },
         {
          "key": "Content-Type",
          "value": "application/json"
         }
        ],
        "url": {
         "raw": "{{baseUrl}}/seller/sku/prices/batch",
         "host": [
          "{{baseUrl}}"
         ],
         "path": [
          "seller",
          "sku",
          "prices",
          "batch"
         ]
        },
        "description": "Submit prices for up to 100 SKUs in one call\n\n**Scope `seller:sku:write`.** Same rules as `/seller/sku/prices` (store approval, 20% limit), for up to 100 SKUs.\n\n- `items`: 1 to **100** single-SKU bodies, exactly as for the single call. Each item is processed\n  **independently and in order**; one item's failure does not affect the others.\n- The call answers `\"status\": \"SUCCESS\"` once the batch was processed - **check `response.failed`\n  and each `results[i].status`**. `message` is `\"All items processed.\"` when every item succeeded,\n  otherwise `\"Batch processed; see results.\"`.\n- `results[i].index` is the 0-based position in `items`; `message` is exactly what the single call\n  would have answered for that item.\n- The whole batch is refused (`\"status\": \"FAIL\"`) only for `items is required and must not be empty.`\n  or `At most 100 items per batch.`\n- A batch counts as **one** request against your rate limit.\n",
        "body": {
         "mode": "raw",
         "raw": "{\n  \"items\": [\n    {\n      \"referenceno\": \"ERP-PRC-0001-1\",\n      \"sellerskucode\": \"MTP63HN/A\",\n      \"mrp\": \"69900\",\n      \"offerprice\": \"64900\"\n    },\n    {\n      \"referenceno\": \"ERP-PRC-0001-2\",\n      \"sellerskucode\": \"MXP93HN/A\",\n      \"mrp\": \"79900\",\n      \"offerprice\": \"74900\"\n    }\n  ]\n}",
         "options": {
          "raw": {
           "language": "json"
          }
         }
        }
       },
       "status": "Unauthorized",
       "code": 401,
       "_postman_previewlanguage": "json",
       "header": [
        {
         "key": "Content-Type",
         "value": "application/json"
        }
       ],
       "cookie": [],
       "body": "{\n  \"status\": \"FAIL\",\n  \"message\": \"Request could not be authorized.\",\n  \"response\": {\n    \"code\": \"E_AUTH\",\n    \"requestId\": \"0d6f4f2e-3c1a-4a43-9f63-1f2a7c9b8e10\"\n  }\n}"
      }
     ],
     "event": [
      {
       "listen": "test",
       "script": {
        "type": "text/javascript",
        "exec": [
         "// Business refusals are HTTP 200 with status FAIL - always look at the envelope.",
         "const b = pm.response.json();",
         "pm.test('envelope present', () => pm.expect(b).to.have.property('status'));",
         "if (b.status !== 'SUCCESS') { console.warn('FAIL:', b.message, 'X-Request-Id', pm.response.headers.get('X-Request-Id')); }"
        ]
       }
      }
     ]
    }
   ]
  }
 ]
}
