{
  "info": {
    "name": "MallPlus Open Platform",
    "description": "Hand-curated Postman v2.1 collection for the MallPlus Open Platform API. Covers the seller OAuth flow, credentials rotation, and the high-traffic catalog/orders/inventory/fulfillment endpoints. Pre-request script auto-computes the HMAC-SHA256 v2 signature so you only need to set the env vars and click Send.\n\n**Setup:**\n1. Import this collection into Postman.\n2. Open the collection's Variables tab and set:\n   - `baseUrl` (e.g. `https://api.mallplus.example`)\n   - `clientId` (sandbox or live `mp_*` / `mp_live_*`)\n   - `clientSecret` (paired with clientId \u2014 only shown once at app create / rotate)\n3. **Required** for seller-scoped routes (`orders`, `inventory`, `returns`, `fulfillments`, product writes, `sellers/:id`): `accessToken` and `sellerId` from the OAuth flow. Calls without these return 401 SELLER_TOKEN_REQUIRED.\n4. Send any request. The pre-request script signs it.\n\n**Pass-11 changes you may see in responses:**\n- `401 SELLER_TOKEN_REQUIRED` \u2014 route flagged `x-requires-seller-token` in OpenAPI; supply accessToken + sellerId.\n- `401 HMAC_VERSION_DEPRECATED` \u2014 production rejects HMAC v1; this collection always signs v2 so you should not hit it.\n- `400 INVALID_JSON` \u2014 body parse failed; check JSON shape.\n- `400 PAYLOAD_TOO_LARGE` \u2014 body exceeded 1MB cap.\n- New webhook delivery headers received by your callback endpoint: `X-MallPlus-Event-Id` (stable per fan-out) + `X-MallPlus-Delivery-Id` (per-row, dedupe key).\n\n**Reference:** see `/docs` in the developer console + `/open/v1/openapi.json` for the full machine-readable spec.",
    "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json",
    "_postman_id": "mallplus-open-platform"
  },
  "variable": [
    {
      "key": "baseUrl",
      "value": "https://api.mallplus.example",
      "type": "string"
    },
    {
      "key": "clientId",
      "value": "mp_xxx",
      "type": "string"
    },
    {
      "key": "clientSecret",
      "value": "",
      "type": "string"
    },
    {
      "key": "accessToken",
      "value": "",
      "type": "string"
    },
    {
      "key": "sellerId",
      "value": "",
      "type": "string"
    }
  ],
  "auth": {
    "type": "noauth"
  },
  "event": [
    {
      "listen": "prerequest",
      "script": {
        "type": "text/javascript",
        "exec": [
          "// HMAC-v2 signing pre-request script (binds method + body sha256 per Pass 5 P5-03).",
          "// base = timestamp:clientId:METHOD:path:sha256(body)",
          "// MP-7894 / MP-7897 — Shop mode signs the SAME base string as public mode; accessToken +",
          "// sellerId go in X-MallPlus-* headers ONLY, never in the signature.",
          "// v1 (timestamp:clientId:path) is REJECTED in production with HMAC_VERSION_DEPRECATED — Pass-11 #3.",
          "// Routes flagged x-requires-seller-token in /open/v1/openapi.json need accessToken + sellerId — Pass-11 #1.",
          "const cryptoJs = require('crypto-js')",
          "const ts = Math.floor(Date.now() / 1000).toString()",
          "const url = pm.variables.replaceIn(pm.request.url.toString())",
          "const path = new URL(url).pathname",
          "const method = pm.request.method.toUpperCase()",
          "const body = pm.request.body && pm.request.body.raw ? pm.variables.replaceIn(pm.request.body.raw) : ''",
          "const bodyHash = cryptoJs.SHA256(body).toString(cryptoJs.enc.Hex)",
          "const accessToken = pm.variables.get('accessToken') || ''",
          "const sellerId = pm.variables.get('sellerId') || ''",
          "const baseString = `${ts}:${pm.variables.get('clientId')}:${method}:${path}:${bodyHash}`",
          "const sig = cryptoJs.HmacSHA256(baseString, pm.variables.get('clientSecret')).toString(cryptoJs.enc.Hex)",
          "pm.request.headers.upsert({ key: 'X-MallPlus-Partner-Id', value: pm.variables.get('clientId') })",
          "pm.request.headers.upsert({ key: 'X-MallPlus-Timestamp', value: ts })",
          "pm.request.headers.upsert({ key: 'X-MallPlus-Signature', value: sig })",
          "if (accessToken) pm.request.headers.upsert({ key: 'X-MallPlus-Access-Token', value: accessToken })",
          "if (sellerId) pm.request.headers.upsert({ key: 'X-MallPlus-Seller-Id', value: sellerId })",
          "pm.request.headers.upsert({ key: 'Content-Type', value: 'application/json' })"
        ]
      }
    }
  ],
  "item": [
    {
      "name": "Auth (OAuth)",
      "item": [
        {
          "name": "Authorize (signed URL \u2014 open in browser)",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{baseUrl}}/open/v1/auth/authorize?client_id={{clientId}}&redirect_uri=YOUR_REDIRECT_URI&timestamp=&sign=",
              "host": ["{{baseUrl}}"],
              "path": ["open", "v1", "auth", "authorize"],
              "query": [
                {
                  "key": "client_id",
                  "value": "{{clientId}}"
                },
                {
                  "key": "redirect_uri",
                  "value": "YOUR_REDIRECT_URI"
                },
                {
                  "key": "timestamp",
                  "value": ""
                },
                {
                  "key": "sign",
                  "value": ""
                }
              ]
            },
            "description": "Generate the signed URL server-side then point the seller's browser at it. The seller approves on the consent page; on success they're redirected back with `?code=\u2026`."
          }
        },
        {
          "name": "Exchange code for tokens",
          "request": {
            "method": "POST",
            "url": {
              "raw": "{{baseUrl}}/open/v1/auth/token",
              "host": ["{{baseUrl}}"],
              "path": ["open", "v1", "auth", "token"]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"code\": \"AUTH_CODE_FROM_REDIRECT\",\n  \"client_id\": \"{{clientId}}\",\n  \"seller_id\": \"SELLER_ID_FROM_REDIRECT\"\n}"
            }
          }
        },
        {
          "name": "Refresh access token",
          "request": {
            "method": "POST",
            "url": {
              "raw": "{{baseUrl}}/open/v1/auth/token/refresh",
              "host": ["{{baseUrl}}"],
              "path": ["open", "v1", "auth", "token", "refresh"]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"refresh_token\": \"YOUR_REFRESH_TOKEN\",\n  \"client_id\": \"{{clientId}}\",\n  \"seller_id\": \"{{sellerId}}\"\n}"
            }
          }
        },
        {
          "name": "Revoke authorization",
          "request": {
            "method": "POST",
            "url": {
              "raw": "{{baseUrl}}/open/v1/auth/revoke",
              "host": ["{{baseUrl}}"],
              "path": ["open", "v1", "auth", "revoke"]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"client_id\": \"{{clientId}}\",\n  \"seller_id\": \"{{sellerId}}\"\n}"
            }
          }
        }
      ]
    },
    {
      "name": "Credentials",
      "item": [
        {
          "name": "Rotate sandbox secret",
          "request": {
            "method": "POST",
            "url": {
              "raw": "{{baseUrl}}/open/v1/credentials/rotate-secret",
              "host": ["{{baseUrl}}"],
              "path": ["open", "v1", "credentials", "rotate-secret"]
            },
            "body": {
              "mode": "raw",
              "raw": ""
            }
          }
        },
        {
          "name": "Rotate production secret (live apps only)",
          "request": {
            "method": "POST",
            "url": {
              "raw": "{{baseUrl}}/open/v1/credentials/rotate-live-secret",
              "host": ["{{baseUrl}}"],
              "path": ["open", "v1", "credentials", "rotate-live-secret"]
            },
            "body": {
              "mode": "raw",
              "raw": ""
            }
          }
        }
      ]
    },
    {
      "name": "Catalog",
      "item": [
        {
          "name": "List products",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{baseUrl}}/open/v1/products?page=1&limit=20",
              "host": ["{{baseUrl}}"],
              "path": ["open", "v1", "products"],
              "query": [
                {
                  "key": "page",
                  "value": "1"
                },
                {
                  "key": "limit",
                  "value": "20"
                }
              ]
            }
          }
        },
        {
          "name": "Get product",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{baseUrl}}/open/v1/products/PRODUCT_ID",
              "host": ["{{baseUrl}}"],
              "path": ["open", "v1", "products", "PRODUCT_ID"]
            }
          }
        },
        {
          "name": "Get product variant prices (MP-10041)",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{baseUrl}}/open/v1/products/{{productId}}/variant-prices",
              "host": ["{{baseUrl}}"],
              "path": ["open", "v1", "products", "{{productId}}", "variant-prices"]
            },
            "description": "Returns per-variant prices (original_price + sale_price where applicable) in PHP centavos. Requires seller token (X-MallPlus-Access-Token + X-MallPlus-Seller-Id)."
          }
        },
        {
          "name": "Create product",
          "request": {
            "method": "POST",
            "url": {
              "raw": "{{baseUrl}}/open/v1/products",
              "host": ["{{baseUrl}}"],
              "path": ["open", "v1", "products"]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"title\": \"Example Product\",\n  \"description\": \"A sample product created via the Open API\",\n  \"category\": \"cat_food\",\n  \"images\": [\"https://cdn.example.com/sample.jpg\"],\n  \"variants\": [\n    { \"title\": \"Default\", \"sku\": \"EX-1\", \"price\": 1999, \"stock\": 25 }\n  ]\n}"
            }
          }
        },
        {
          "name": "Update product",
          "request": {
            "method": "PUT",
            "url": {
              "raw": "{{baseUrl}}/open/v1/products/PRODUCT_ID",
              "host": ["{{baseUrl}}"],
              "path": ["open", "v1", "products", "PRODUCT_ID"]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"title\": \"Updated product title\",\n  \"price\": 2499,\n  \"status\": \"published\"\n}"
            }
          }
        },
        {
          "name": "Update variant prices (MP-10046)",
          "request": {
            "method": "PUT",
            "url": {
              "raw": "{{baseUrl}}/open/v1/products/{{productId}}/price",
              "host": ["{{baseUrl}}"],
              "path": ["open", "v1", "products", "{{productId}}", "price"]
            },
            "description": "Atomically update prices for one or more variants of a seller-owned product. All variant_id values must belong to the product; a single invalid id rejects the entire batch. Prices must be > 0 (PHP centavos). Requires seller token (X-MallPlus-Access-Token + X-MallPlus-Seller-Id).",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"updates\": [\n    {\n      \"variant_id\": \"VARIANT_ID_1\",\n      \"price\": 19900\n    },\n    {\n      \"variant_id\": \"VARIANT_ID_2\",\n      \"price\": 24900\n    }\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          }
        },
        {
          "name": "GET /open/v1/attributes",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{baseUrl}}/open/v1/attributes",
              "host": ["{{baseUrl}}"],
              "path": ["open", "v1", "attributes"],
              "query": [
                {
                  "key": "page",
                  "value": "1",
                  "description": "Page number",
                  "disabled": true
                },
                {
                  "key": "limit",
                  "value": "20",
                  "description": "Items per page",
                  "disabled": true
                }
              ]
            },
            "description": "List all product attribute definitions. Returns attribute_id, name, and type (ui_component) for each attribute."
          }
        }
      ]
    },
    {
      "name": "Orders",
      "item": [
        {
          "name": "List orders",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{baseUrl}}/open/v1/orders?page=1&limit=20",
              "host": ["{{baseUrl}}"],
              "path": ["open", "v1", "orders"],
              "query": [
                {
                  "key": "page",
                  "value": "1"
                },
                {
                  "key": "limit",
                  "value": "20"
                }
              ]
            }
          }
        },
        {
          "name": "Get order",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{baseUrl}}/open/v1/orders/ORDER_ID",
              "host": ["{{baseUrl}}"],
              "path": ["open", "v1", "orders", "ORDER_ID"]
            }
          }
        },
        {
          "name": "Ship order",
          "request": {
            "method": "POST",
            "url": {
              "raw": "{{baseUrl}}/open/v1/orders/ORDER_ID/ship",
              "host": ["{{baseUrl}}"],
              "path": ["open", "v1", "orders", "ORDER_ID", "ship"]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"trackingNumber\": \"TRK-123\",\n  \"trackingCompany\": \"DHL\"\n}"
            }
          }
        },
        {
          "name": "Cancel order",
          "request": {
            "method": "POST",
            "url": {
              "raw": "{{baseUrl}}/open/v1/orders/ORDER_ID/cancel",
              "host": ["{{baseUrl}}"],
              "path": ["open", "v1", "orders", "ORDER_ID", "cancel"]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"reason\": \"Customer requested cancellation\"\n}"
            }
          }
        }
      ]
    },
    {
      "name": "Inventory",
      "item": [
        {
          "name": "List inventory",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{baseUrl}}/open/v1/inventory?page=1&limit=50",
              "host": ["{{baseUrl}}"],
              "path": ["open", "v1", "inventory"],
              "query": [
                {
                  "key": "page",
                  "value": "1"
                },
                {
                  "key": "limit",
                  "value": "50"
                }
              ]
            }
          }
        },
        {
          "name": "Update inventory",
          "request": {
            "method": "PUT",
            "url": {
              "raw": "{{baseUrl}}/open/v1/inventory/ITEM_ID",
              "host": ["{{baseUrl}}"],
              "path": ["open", "v1", "inventory", "ITEM_ID"]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"quantity\": 42\n}"
            }
          }
        },
        {
          "name": "Bulk update inventory",
          "request": {
            "method": "POST",
            "url": {
              "raw": "{{baseUrl}}/open/v1/inventory/bulk-update",
              "host": ["{{baseUrl}}"],
              "path": ["open", "v1", "inventory", "bulk-update"]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"items\": [\n    { \"id\": \"ITEM_1\", \"quantity\": 10 },\n    { \"id\": \"ITEM_2\", \"quantity\": 0 }\n  ]\n}"
            }
          }
        }
      ]
    },
    {
      "name": "Fulfillments",
      "item": [
        {
          "name": "List fulfillments",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{baseUrl}}/open/v1/fulfillments?page=1&limit=20",
              "host": ["{{baseUrl}}"],
              "path": ["open", "v1", "fulfillments"],
              "query": [
                {
                  "key": "page",
                  "value": "1"
                },
                {
                  "key": "limit",
                  "value": "20"
                }
              ]
            }
          }
        },
        {
          "name": "Create fulfillment",
          "request": {
            "method": "POST",
            "url": {
              "raw": "{{baseUrl}}/open/v1/fulfillments",
              "host": ["{{baseUrl}}"],
              "path": ["open", "v1", "fulfillments"]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"orderId\": \"ORDER_ID\",\n  \"items\": [{ \"itemId\": \"ITEM_1\", \"quantity\": 1 }],\n  \"trackingNumber\": \"TRK-123\",\n  \"trackingCompany\": \"DHL\"\n}"
            }
          }
        }
      ]
    },
    {
      "name": "Returns",
      "item": [
        {
          "name": "List returns",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{baseUrl}}/open/v1/returns?page=1&limit=20",
              "host": ["{{baseUrl}}"],
              "path": ["open", "v1", "returns"],
              "query": [
                {
                  "key": "page",
                  "value": "1"
                },
                {
                  "key": "limit",
                  "value": "20"
                }
              ]
            }
          }
        },
        {
          "name": "Create return",
          "request": {
            "method": "POST",
            "url": {
              "raw": "{{baseUrl}}/open/v1/returns",
              "host": ["{{baseUrl}}"],
              "path": ["open", "v1", "returns"]
            },
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"orderId\": \"ORDER_ID\",\n  \"items\": [{ \"itemId\": \"ITEM_ID\", \"quantity\": 1 }],\n  \"reason\": \"Damaged on arrival\"\n}"
            }
          }
        },
        {
          "name": "Approve return",
          "request": {
            "method": "POST",
            "url": {
              "raw": "{{baseUrl}}/open/v1/returns/RETURN_ID/approve",
              "host": ["{{baseUrl}}"],
              "path": ["open", "v1", "returns", "RETURN_ID", "approve"]
            },
            "body": {
              "mode": "raw",
              "raw": ""
            }
          }
        },
        {
          "name": "Reject return",
          "request": {
            "method": "POST",
            "url": {
              "raw": "{{baseUrl}}/open/v1/returns/RETURN_ID/reject",
              "host": ["{{baseUrl}}"],
              "path": ["open", "v1", "returns", "RETURN_ID", "reject"]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"reason\": \"Item not eligible for return\"\n}"
            }
          }
        }
      ]
    },
    {
      "name": "Webhooks",
      "item": [
        {
          "name": "List subscriptions",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{baseUrl}}/open/v1/webhooks",
              "host": ["{{baseUrl}}"],
              "path": ["open", "v1", "webhooks"]
            }
          }
        },
        {
          "name": "Create subscription",
          "request": {
            "method": "POST",
            "url": {
              "raw": "{{baseUrl}}/open/v1/webhooks",
              "host": ["{{baseUrl}}"],
              "path": ["open", "v1", "webhooks"]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"eventType\": \"order.created\",\n  \"callbackUrl\": \"https://your-domain.example/mallplus/webhook\"\n}"
            }
          }
        },
        {
          "name": "Delete subscription",
          "request": {
            "method": "DELETE",
            "url": {
              "raw": "{{baseUrl}}/open/v1/webhooks/SUBSCRIPTION_ID",
              "host": ["{{baseUrl}}"],
              "path": ["open", "v1", "webhooks", "SUBSCRIPTION_ID"]
            }
          }
        }
      ]
    },
    {
      "name": "Usage",
      "item": [
        {
          "name": "Get my API call stats (last 90d)",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{baseUrl}}/open/v1/usage?from=&to=",
              "host": ["{{baseUrl}}"],
              "path": ["open", "v1", "usage"],
              "query": [
                {
                  "key": "from",
                  "value": "",
                  "description": "ISO-8601 datetime, optional"
                },
                {
                  "key": "to",
                  "value": "",
                  "description": "ISO-8601 datetime, optional"
                }
              ]
            },
            "description": "Returns per-endpoint call counts + success rate scoped to the calling app. Window capped at 90 days."
          }
        }
      ]
    },
    {
      "name": "Payouts",
      "description": "Per-order settlement breakdown for the authenticated seller. Settled payouts only \u2014 pending / in-flight payouts are not exposed in V1.",
      "item": [
        {
          "name": "List payouts",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{baseUrl}}/open/v1/payouts?page=1&limit=50",
              "host": ["{{baseUrl}}"],
              "path": ["open", "v1", "payouts"],
              "query": [
                {
                  "key": "page",
                  "value": "1"
                },
                {
                  "key": "limit",
                  "value": "50"
                },
                {
                  "key": "order_id",
                  "value": "",
                  "disabled": true
                },
                {
                  "key": "released_after",
                  "value": "2026-01-01T00:00:00Z",
                  "disabled": true
                },
                {
                  "key": "released_before",
                  "value": "2026-12-31T23:59:59Z",
                  "disabled": true
                }
              ]
            },
            "description": "Returns per-order settlement rows: { id, orderId, grossAmount, commissionAmount, netAmount, releasedAt, status: 'released' }. Money in centavos. Requires orders:read scope + seller token."
          }
        }
      ]
    },
    {
      "name": "Sandbox",
      "description": "Joshua decision Q1 (2026-05-21) \u2014 full simulation environment. Sandbox-only \u2014 live creds (mp_live_*) return 403 SANDBOX_ONLY. Create test sellers + buyers, place buyer-driven orders, mock-pay, mock-deliver. State machine: PENDING \u2192 PAID \u2192 READY_TO_SHIP \u2192 SHIPPED \u2192 DELIVERED.",
      "item": [
        {
          "name": "List sandbox sellers",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{baseUrl}}/open/v1/sandbox/sellers",
              "host": ["{{baseUrl}}"],
              "path": ["open", "v1", "sandbox", "sellers"]
            }
          }
        },
        {
          "name": "Create sandbox seller",
          "request": {
            "method": "POST",
            "url": {
              "raw": "{{baseUrl}}/open/v1/sandbox/sellers",
              "host": ["{{baseUrl}}"],
              "path": ["open", "v1", "sandbox", "sellers"]
            },
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"name\": \"Test Seller\",\n  \"email\": \"seller@example.com\",\n  \"storeName\": \"Test Store\"\n}"
            }
          }
        },
        {
          "name": "List sandbox buyers",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{baseUrl}}/open/v1/sandbox/buyers",
              "host": ["{{baseUrl}}"],
              "path": ["open", "v1", "sandbox", "buyers"]
            }
          }
        },
        {
          "name": "Create sandbox buyer",
          "request": {
            "method": "POST",
            "url": {
              "raw": "{{baseUrl}}/open/v1/sandbox/buyers",
              "host": ["{{baseUrl}}"],
              "path": ["open", "v1", "sandbox", "buyers"]
            },
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"name\": \"Test Buyer\",\n  \"email\": \"buyer@example.com\",\n  \"phoneNumber\": \"+639001234567\",\n  \"shippingAddress\": {\n    \"line1\": \"123 Test St\",\n    \"city\": \"Manila\",\n    \"region\": \"NCR\",\n    \"postalCode\": \"1000\",\n    \"country\": \"PH\"\n  }\n}"
            }
          }
        },
        {
          "name": "Place sandbox order (buyer-driven)",
          "request": {
            "method": "POST",
            "url": {
              "raw": "{{baseUrl}}/open/v1/sandbox/orders",
              "host": ["{{baseUrl}}"],
              "path": ["open", "v1", "sandbox", "orders"]
            },
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"sellerId\": \"SELLER_ID\",\n  \"buyerId\": \"BUYER_ID\",\n  \"items\": [{ \"title\": \"Sample SKU\", \"sku\": \"TST-1\", \"quantity\": 1, \"unitPrice\": 19900 }],\n  \"paymentMethod\": \"gcash\"\n}"
            }
          }
        },
        {
          "name": "Mock-pay sandbox order",
          "request": {
            "method": "POST",
            "url": {
              "raw": "{{baseUrl}}/open/v1/sandbox/orders/{{orderId}}/pay-mock",
              "host": ["{{baseUrl}}"],
              "path": ["open", "v1", "sandbox", "orders", "{{orderId}}", "pay-mock"]
            },
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": ""
            },
            "description": "Chained transition PENDING \u2192 PAID \u2192 READY_TO_SHIP. Sets paidAt timestamp."
          }
        },
        {
          "name": "Mock-deliver sandbox order",
          "request": {
            "method": "POST",
            "url": {
              "raw": "{{baseUrl}}/open/v1/sandbox/orders/{{orderId}}/deliver-mock",
              "host": ["{{baseUrl}}"],
              "path": ["open", "v1", "sandbox", "orders", "{{orderId}}", "deliver-mock"]
            },
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": ""
            },
            "description": "Buyer-side mock delivery \u2014 SHIPPED \u2192 DELIVERED. Sets deliveredAt timestamp."
          }
        },
        {
          "name": "Re-seed sandbox fixtures",
          "request": {
            "method": "POST",
            "url": {
              "raw": "{{baseUrl}}/open/v1/sandbox/seed",
              "host": ["{{baseUrl}}"],
              "path": ["open", "v1", "sandbox", "seed"]
            },
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": ""
            },
            "description": "G-4 (PREMORTEM_2) \u2014 re-seed default sandbox fixtures after a deploy wipes process-scoped state. Idempotent."
          }
        }
      ]
    },
    {
      "name": "Workflows",
      "item": [
        {
          "name": "POST /open/v1/auth/seller-verify",
          "request": {
            "method": "POST",
            "url": {
              "raw": "{{baseUrl}}/open/v1/auth/seller-verify",
              "host": ["{{baseUrl}}"],
              "path": ["open", "v1", "auth", "seller-verify"]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"_\": \"TODO: fill in request body example per OpenAPI spec at /open/v1/openapi.json\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          }
        },
        {
          "name": "POST /open/v1/products/bulk",
          "request": {
            "method": "POST",
            "url": {
              "raw": "{{baseUrl}}/open/v1/products/bulk",
              "host": ["{{baseUrl}}"],
              "path": ["open", "v1", "products", "bulk"]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"_\": \"TODO: fill in request body example per OpenAPI spec at /open/v1/openapi.json\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          }
        },
        {
          "name": "POST /open/v1/orders/:id/ship",
          "request": {
            "method": "POST",
            "url": {
              "raw": "{{baseUrl}}/open/v1/orders/{{resourceId}}/ship",
              "host": ["{{baseUrl}}"],
              "path": ["open", "v1", "orders", "{{resourceId}}", "ship"]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"_\": \"TODO: fill in request body example per OpenAPI spec at /open/v1/openapi.json\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          }
        },
        {
          "name": "POST /open/v1/orders/:id/cancel",
          "request": {
            "method": "POST",
            "url": {
              "raw": "{{baseUrl}}/open/v1/orders/{{resourceId}}/cancel",
              "host": ["{{baseUrl}}"],
              "path": ["open", "v1", "orders", "{{resourceId}}", "cancel"]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"_\": \"TODO: fill in request body example per OpenAPI spec at /open/v1/openapi.json\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          }
        },
        {
          "name": "POST /open/v1/orders/bulk-ship",
          "request": {
            "method": "POST",
            "url": {
              "raw": "{{baseUrl}}/open/v1/orders/bulk-ship",
              "host": ["{{baseUrl}}"],
              "path": ["open", "v1", "orders", "bulk-ship"]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"_\": \"TODO: fill in request body example per OpenAPI spec at /open/v1/openapi.json\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          }
        },
        {
          "name": "POST /open/v1/orders/bulk-cancel",
          "request": {
            "method": "POST",
            "url": {
              "raw": "{{baseUrl}}/open/v1/orders/bulk-cancel",
              "host": ["{{baseUrl}}"],
              "path": ["open", "v1", "orders", "bulk-cancel"]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"_\": \"TODO: fill in request body example per OpenAPI spec at /open/v1/openapi.json\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          }
        },
        {
          "name": "POST /open/v1/cancellation-requests/:id/approve",
          "request": {
            "method": "POST",
            "url": {
              "raw": "{{baseUrl}}/open/v1/cancellation-requests/{{resourceId}}/approve",
              "host": ["{{baseUrl}}"],
              "path": ["open", "v1", "cancellation-requests", "{{resourceId}}", "approve"]
            }
          }
        },
        {
          "name": "POST /open/v1/cancellation-requests/:id/reject",
          "request": {
            "method": "POST",
            "url": {
              "raw": "{{baseUrl}}/open/v1/cancellation-requests/{{resourceId}}/reject",
              "host": ["{{baseUrl}}"],
              "path": ["open", "v1", "cancellation-requests", "{{resourceId}}", "reject"]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"reason\": \"Item already packed for shipment\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          }
        },
        {
          "name": "POST /open/v1/returns/:id/approve",
          "request": {
            "method": "POST",
            "url": {
              "raw": "{{baseUrl}}/open/v1/returns/{{resourceId}}/approve",
              "host": ["{{baseUrl}}"],
              "path": ["open", "v1", "returns", "{{resourceId}}", "approve"]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"_\": \"TODO: fill in request body example per OpenAPI spec at /open/v1/openapi.json\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          }
        },
        {
          "name": "POST /open/v1/returns/:id/reject",
          "request": {
            "method": "POST",
            "url": {
              "raw": "{{baseUrl}}/open/v1/returns/{{resourceId}}/reject",
              "host": ["{{baseUrl}}"],
              "path": ["open", "v1", "returns", "{{resourceId}}", "reject"]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"_\": \"TODO: fill in request body example per OpenAPI spec at /open/v1/openapi.json\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          }
        }
      ]
    },
    {
      "name": "Open API",
      "item": [
        {
          "name": "GET /open/v1/products/:id",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{baseUrl}}/open/v1/products/{{resourceId}}",
              "host": ["{{baseUrl}}"],
              "path": ["open", "v1", "products", "{{resourceId}}"]
            }
          }
        },
        {
          "name": "GET /open/v1/products/:id/variants",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{baseUrl}}/open/v1/products/{{resourceId}}/variants",
              "host": ["{{baseUrl}}"],
              "path": ["open", "v1", "products", "{{resourceId}}", "variants"]
            }
          }
        },
        {
          "name": "GET /open/v1/categories",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{baseUrl}}/open/v1/categories",
              "host": ["{{baseUrl}}"],
              "path": ["open", "v1", "categories"]
            }
          }
        },
        {
          "name": "GET /open/v1/categories/:id/attributes",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{baseUrl}}/open/v1/categories/{{categoryId}}/attributes",
              "host": ["{{baseUrl}}"],
              "path": ["open", "v1", "categories", "{{categoryId}}", "attributes"]
            }
          }
        },
        {
          "name": "GET /open/v1/attributes",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{baseUrl}}/open/v1/attributes",
              "host": ["{{baseUrl}}"],
              "path": ["open", "v1", "attributes"],
              "query": [
                {
                  "key": "page",
                  "value": "1",
                  "description": "Page number",
                  "disabled": true
                },
                {
                  "key": "limit",
                  "value": "20",
                  "description": "Items per page",
                  "disabled": true
                }
              ]
            },
            "description": "List all product attribute definitions. Returns attribute_id, name, and type for each attribute."
          }
        },
        {
          "name": "PUT /open/v1/products/:id",
          "request": {
            "method": "PUT",
            "url": {
              "raw": "{{baseUrl}}/open/v1/products/{{resourceId}}",
              "host": ["{{baseUrl}}"],
              "path": ["open", "v1", "products", "{{resourceId}}"]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"title\": \"Updated product title\",\n  \"description\": \"Synced from the partner master catalog\",\n  \"price\": 2499,\n  \"status\": \"published\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          }
        },
        {
          "name": "POST /open/v1/products/:id/status",
          "request": {
            "method": "POST",
            "url": {
              "raw": "{{baseUrl}}/open/v1/products/{{resourceId}}/status",
              "host": ["{{baseUrl}}"],
              "path": ["open", "v1", "products", "{{resourceId}}", "status"]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"status\": \"live\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          }
        },
        {
          "name": "PUT /open/v1/products/:id/stock",
          "request": {
            "method": "PUT",
            "url": {
              "raw": "{{baseUrl}}/open/v1/products/{{resourceId}}/stock",
              "host": ["{{baseUrl}}"],
              "path": ["open", "v1", "products", "{{resourceId}}", "stock"]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"items\": [\n    { \"variant_id\": \"{{variantId}}\", \"stock_quantity\": 100 }\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          }
        },
        {
          "name": "DELETE /open/v1/products/:id",
          "request": {
            "method": "DELETE",
            "url": {
              "raw": "{{baseUrl}}/open/v1/products/{{resourceId}}",
              "host": ["{{baseUrl}}"],
              "path": ["open", "v1", "products", "{{resourceId}}"]
            }
          }
        },
        {
          "name": "GET /open/v1/orders/:id",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{baseUrl}}/open/v1/orders/{{resourceId}}",
              "host": ["{{baseUrl}}"],
              "path": ["open", "v1", "orders", "{{resourceId}}"]
            }
          }
        },
        {
          "name": "GET /open/v1/orders/:id/items",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{baseUrl}}/open/v1/orders/{{resourceId}}/items",
              "host": ["{{baseUrl}}"],
              "path": ["open", "v1", "orders", "{{resourceId}}", "items"]
            }
          }
        },
        {
          "name": "PUT /open/v1/inventory/:id",
          "request": {
            "method": "PUT",
            "url": {
              "raw": "{{baseUrl}}/open/v1/inventory/{{resourceId}}",
              "host": ["{{baseUrl}}"],
              "path": ["open", "v1", "inventory", "{{resourceId}}"]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"_\": \"TODO: fill in request body example per OpenAPI spec at /open/v1/openapi.json\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          }
        },
        {
          "name": "GET /open/v1/fulfillments/:id",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{baseUrl}}/open/v1/fulfillments/{{resourceId}}",
              "host": ["{{baseUrl}}"],
              "path": ["open", "v1", "fulfillments", "{{resourceId}}"]
            }
          }
        },
        {
          "name": "PUT /open/v1/fulfillments/:id",
          "request": {
            "method": "PUT",
            "url": {
              "raw": "{{baseUrl}}/open/v1/fulfillments/{{resourceId}}",
              "host": ["{{baseUrl}}"],
              "path": ["open", "v1", "fulfillments", "{{resourceId}}"]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"_\": \"TODO: fill in request body example per OpenAPI spec at /open/v1/openapi.json\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          }
        },
        {
          "name": "GET /open/v1/sellers",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{baseUrl}}/open/v1/sellers",
              "host": ["{{baseUrl}}"],
              "path": ["open", "v1", "sellers"]
            }
          }
        },
        {
          "name": "GET /open/v1/sellers/:id",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{baseUrl}}/open/v1/sellers/{{resourceId}}",
              "host": ["{{baseUrl}}"],
              "path": ["open", "v1", "sellers", "{{resourceId}}"]
            }
          }
        },
        {
          "name": "GET /open/v1/seller/profile",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{baseUrl}}/open/v1/seller/profile",
              "host": ["{{baseUrl}}"],
              "path": ["open", "v1", "seller", "profile"]
            }
          }
        },
        {
          "name": "GET /open/v1/shop",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{baseUrl}}/open/v1/shop",
              "host": ["{{baseUrl}}"],
              "path": ["open", "v1", "shop"]
            }
          }
        },
        {
          "name": "GET /open/v1/shop/status",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{baseUrl}}/open/v1/shop/status",
              "host": ["{{baseUrl}}"],
              "path": ["open", "v1", "shop", "status"]
            }
          }
        },
        {
          "name": "GET /open/v1/returns/:id",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{baseUrl}}/open/v1/returns/{{resourceId}}",
              "host": ["{{baseUrl}}"],
              "path": ["open", "v1", "returns", "{{resourceId}}"]
            }
          }
        },
        {
          "name": "GET /open/v1/shipping/options",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{baseUrl}}/open/v1/shipping/options",
              "host": ["{{baseUrl}}"],
              "path": ["open", "v1", "shipping", "options"]
            }
          }
        }
      ]
    }
  ]
}
