{"openapi":"3.1.0","info":{"title":"WooliiPorter Merchant API","version":"1.1.0","description":"Private design-partner contract for forwarding, merchant-owned inventory, fulfillment, unified WooliiPorter shipments, settlement, tracking and signed webhooks."},"servers":[{"url":"https://api.woolii.com","description":"WooliiPorter Merchant API"}],"externalDocs":{"description":"Human-readable developer documentation","url":"https://porter.woolii.com/developers"},"tags":[{"name":"Getting started"},{"name":"Woo smart routing · pilot"},{"name":"Direct forwarding API"},{"name":"Billing & settlement"},{"name":"Tracking"},{"name":"Stocking & fulfillment"},{"name":"Webhooks"},{"name":"Public tracking"}],"paths":{"/v1/merchant/connection":{"get":{"operationId":"checkConnection","summary":"Check the API connection","description":"Validates the key and returns the merchant account, environment, granted scopes and rollout flags. Connectors should call this before registering a store or enabling automatic submission. A successful response proves authentication; it does not by itself enable smart routing.","tags":["Getting started"],"security":[{"bearerAuth":[]}],"x-woolii-scope":"orders:read","x-woolii-idempotent":false,"externalDocs":{"description":"Human-readable contract, examples and operational notes","url":"https://porter.woolii.com/developers#check-connection"},"responses":{"200":{"description":"Successful response","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"4XX":{"$ref":"#/components/responses/MerchantError"},"5XX":{"$ref":"#/components/responses/MerchantError"}},"x-codeSamples":[{"lang":"Shell","source":"curl https://api.woolii.com/v1/merchant/connection \\\n  -H \"Authorization: Bearer wp_sk_test_...\""}]}},"/v1/merchant/stores/{externalStoreId}":{"put":{"operationId":"registerStore","summary":"Register a WooCommerce store","description":"Creates or updates one WooCommerce installation in the API-key environment. The operation is naturally idempotent because the account, environment, platform and externalStoreId form the upsert key. The official plugin generates the Store identity once and keeps it stable across reconnects.","tags":["Woo smart routing · pilot"],"security":[{"bearerAuth":[]}],"x-woolii-scope":"orders:write","x-woolii-idempotent":false,"externalDocs":{"description":"Human-readable contract, examples and operational notes","url":"https://porter.woolii.com/developers#register-store"},"responses":{"200":{"description":"Successful response","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"4XX":{"$ref":"#/components/responses/MerchantError"},"5XX":{"$ref":"#/components/responses/MerchantError"}},"x-codeSamples":[{"lang":"Shell","source":"curl -X PUT https://api.woolii.com/v1/merchant/stores/wcstore_550e8400-e29b-41d4-a716-446655440000 \\\n  -H \"Authorization: Bearer wp_sk_test_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"platform\": \"WOOCOMMERCE\",\n    \"storeUrl\": \"https://shop.example.com/\",\n    \"pluginVersion\": \"0.4.0\",\n    \"webhookUrl\": \"https://shop.example.com/wp-json/wooliiporter/v1/webhook\"\n  }'"}],"parameters":[{"name":"externalStoreId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"}}}}}},"/v1/merchant/stores/{externalStoreId}/onboarding":{"get":{"operationId":"getStoreOnboarding","summary":"Read the store onboarding checklist","description":"Returns the same seven-step onboarding snapshot the merchant console shows for this WooCommerce Store — account, channel services, product sync, SKU links, inbound stocking, routing and first-order validation — plus the wallet funding status. The official plugin renders its Get-started wizard from this endpoint so plugin and console never disagree about progress.","tags":["Woo smart routing · pilot"],"security":[{"bearerAuth":[]}],"x-woolii-scope":"orders:read","x-woolii-idempotent":false,"externalDocs":{"description":"Human-readable contract, examples and operational notes","url":"https://porter.woolii.com/developers#get-store-onboarding"},"responses":{"200":{"description":"Successful response","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"4XX":{"$ref":"#/components/responses/MerchantError"},"5XX":{"$ref":"#/components/responses/MerchantError"}},"x-codeSamples":[{"lang":"Shell","source":"curl https://api.woolii.com/v1/merchant/stores/wcstore_550e8400-e29b-41d4-a716-446655440000/onboarding \\\n  -H \"Authorization: Bearer wp_sk_test_...\""}],"parameters":[{"name":"externalStoreId","in":"path","required":true,"schema":{"type":"string"}}]}},"/v1/merchant/stores/{externalStoreId}/catalog":{"post":{"operationId":"syncStoreCatalog","summary":"Sync the WooCommerce catalog and link SKUs","description":"Registers up to 250 WooCommerce products or variations per call and links them to warehouse SKUs. A row with an explicit skuCode is linked to that SKU; a row whose channel sku exactly matches one active warehouse SKU is linked automatically; every other row is returned as unmatched for a manual decision. The sync never creates warehouse SKUs and never guesses a link. A successful call records the catalog sync evidence used by onboarding step 3.","tags":["Woo smart routing · pilot"],"security":[{"bearerAuth":[]}],"x-woolii-scope":"orders:write","x-woolii-idempotent":false,"externalDocs":{"description":"Human-readable contract, examples and operational notes","url":"https://porter.woolii.com/developers#sync-store-catalog"},"responses":{"200":{"description":"Successful response","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"4XX":{"$ref":"#/components/responses/MerchantError"},"5XX":{"$ref":"#/components/responses/MerchantError"}},"x-codeSamples":[{"lang":"Shell","source":"curl -X POST https://api.woolii.com/v1/merchant/stores/wcstore_550e8400-e29b-41d4-a716-446655440000/catalog \\\n  -H \"Authorization: Bearer wp_sk_test_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"products\": [\n      { \"externalProductId\": \"101\", \"externalVariationId\": \"101\", \"name\": \"Ceramic mug\", \"sku\": \"MUG-01\" }\n    ]\n  }'"}],"parameters":[{"name":"externalStoreId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"}}}}}},"/v1/merchant/console-sso":{"post":{"operationId":"createConsoleHandoff","summary":"Open the Woolii merchant console","description":"Creates a 60-second, single-use merchant-console handoff for one registered WooCommerce Store. The official plugin calls this endpoint from WordPress after a manage_woocommerce nonce check; the API key never enters the browser or handoff URL. The returned URL must be opened immediately and must never be logged, cached, emailed or persisted.","tags":["Woo smart routing · pilot"],"security":[{"bearerAuth":[]}],"x-woolii-scope":"console:sso","x-woolii-idempotent":false,"externalDocs":{"description":"Human-readable contract, examples and operational notes","url":"https://porter.woolii.com/developers#create-console-handoff"},"responses":{"200":{"description":"Successful response","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"4XX":{"$ref":"#/components/responses/MerchantError"},"5XX":{"$ref":"#/components/responses/MerchantError"}},"x-codeSamples":[{"lang":"Shell","source":"curl -X POST https://api.woolii.com/v1/merchant/console-sso   -H \"Authorization: Bearer wp_sk_test_...\"   -H \"Content-Type: application/json\"   -d '{\n    \"externalStoreId\": \"wcstore_550e8400-e29b-41d4-a716-446655440000\",\n    \"returnPath\": \"/merchant/integrations\"\n  }'"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"}}}}}},"/v1/merchant/fulfillment-intents":{"post":{"operationId":"createFulfillmentIntent","summary":"Create a smart fulfillment intent","description":"Submits a versioned commerce-order snapshot for backend-owned routing. Each line is assessed against its SKU mapping, product preference and available inventory. A fully stocked order creates and reserves a fulfillment order; a fully forwarding order waits for real supplier tracking; a mixed order stops for an explicit merchant decision. This early-access endpoint requires both a registered Store and the smartRouting account flag.","tags":["Woo smart routing · pilot"],"security":[{"bearerAuth":[]}],"x-woolii-scope":"orders:write","x-woolii-idempotent":true,"externalDocs":{"description":"Human-readable contract, examples and operational notes","url":"https://porter.woolii.com/developers#create-fulfillment-intent"},"responses":{"200":{"description":"Successful response","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"4XX":{"$ref":"#/components/responses/MerchantError"},"5XX":{"$ref":"#/components/responses/MerchantError"}},"x-codeSamples":[{"lang":"Shell","source":"curl https://api.woolii.com/v1/merchant/fulfillment-intents \\\n  -H \"Authorization: Bearer wp_sk_test_...\" \\\n  -H \"Idempotency-Key: woocommerce:wcstore_…:1042:8f37…\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"platform\": \"WOOCOMMERCE\",\n    \"externalStoreId\": \"wcstore_550e8400-e29b-41d4-a716-446655440000\",\n    \"externalOrderId\": \"1042\",\n    \"externalOrderName\": \"WEB-001042\",\n    \"externalOrderVersion\": \"8f37…\",\n    \"destination\": {\n      \"recipientName\": \"Ada Merchant\", \"phone\": \"+1 415 000 0000\",\n      \"country\": \"US\", \"province\": \"CA\", \"city\": \"San Francisco\",\n      \"street\": \"1 Mission St\", \"postalCode\": \"94105\"\n    },\n    \"lines\": [\n      { \"externalLineId\": \"line-1\", \"productId\": \"501\",\n        \"productName\": \"Ceramic mug\", \"qty\": 2, \"skuCode\": \"MUG-WHT\",\n        \"fulfillmentPreference\": \"AUTO\" }\n    ]\n  }'"}],"parameters":[{"name":"Idempotency-Key","in":"header","required":true,"description":"Stable caller-generated key. Replays return the stored response; key reuse with a different payload is rejected.","schema":{"type":"string","minLength":1,"maxLength":200}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"}}}}}},"/v1/merchant/fulfillment-intents/{id}":{"get":{"operationId":"getFulfillmentIntent","summary":"Retrieve a fulfillment intent","description":"Returns the backend-owned routing projection: per-line decision facts, current routingVersion, requiredActions, editable supplier parcels, any child fulfillment or forwarding order, and the cancellation lifecycle when cancellation has been requested. Refresh before every merchant decision so stale browser state cannot overwrite a newer route.","tags":["Woo smart routing · pilot"],"security":[{"bearerAuth":[]}],"x-woolii-scope":"orders:read","x-woolii-idempotent":false,"externalDocs":{"description":"Human-readable contract, examples and operational notes","url":"https://porter.woolii.com/developers#get-fulfillment-intent"},"responses":{"200":{"description":"Successful response","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"4XX":{"$ref":"#/components/responses/MerchantError"},"5XX":{"$ref":"#/components/responses/MerchantError"}},"x-codeSamples":[{"lang":"Shell","source":"curl https://api.woolii.com/v1/merchant/fulfillment-intents/cfi_… \\\n  -H \"Authorization: Bearer wp_sk_test_...\""}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]}},"/v1/merchant/fulfillment-intents/{id}/cancel":{"post":{"operationId":"cancelFulfillmentIntent","summary":"Cancel a fulfillment intent","description":"Requests cancellation against the unified commerce fulfillment intent, so the API evaluates its stocked-fulfillment or supplier-forwarding child and the real physical execution stage. A 200 response means every linked operation was safely cancelled. A 202 response means the request was accepted but warehouse return or authorized admin review must finish before the intent is terminal.","tags":["Woo smart routing · pilot"],"security":[{"bearerAuth":[]}],"x-woolii-scope":"orders:write","x-woolii-idempotent":true,"externalDocs":{"description":"Human-readable contract, examples and operational notes","url":"https://porter.woolii.com/developers#cancel-fulfillment-intent"},"responses":{"200":{"description":"Successful response","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"4XX":{"$ref":"#/components/responses/MerchantError"},"5XX":{"$ref":"#/components/responses/MerchantError"}},"x-codeSamples":[{"lang":"Shell","source":"curl -X POST https://api.woolii.com/v1/merchant/fulfillment-intents/cfi_…/cancel \\\n  -H \"Authorization: Bearer wp_sk_test_...\" \\\n  -H \"Idempotency-Key: wc-1042-cancel-v2\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"routingVersion\": 2, \"reason\": \"Customer requested cancellation\" }'"}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":true,"description":"Stable caller-generated key. Replays return the stored response; key reuse with a different payload is rejected.","schema":{"type":"string","minLength":1,"maxLength":200}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"}}}}}},"/v1/merchant/fulfillment-intents/{id}/supplier-parcels":{"put":{"operationId":"saveSupplierParcels","summary":"Save supplier parcel drafts","description":"Replaces the complete editable supplier-parcel draft for an intent that is waiting for forwarding. Each real China domestic tracking number carries one or more externalLineId quantity allocations. Draft allocations may be partial, but cannot over-allocate a line or reuse a tracking number.","tags":["Woo smart routing · pilot"],"security":[{"bearerAuth":[]}],"x-woolii-scope":"orders:write","x-woolii-idempotent":true,"externalDocs":{"description":"Human-readable contract, examples and operational notes","url":"https://porter.woolii.com/developers#save-supplier-parcels"},"responses":{"200":{"description":"Successful response","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"4XX":{"$ref":"#/components/responses/MerchantError"},"5XX":{"$ref":"#/components/responses/MerchantError"}},"x-codeSamples":[{"lang":"Shell","source":"curl -X PUT https://api.woolii.com/v1/merchant/fulfillment-intents/cfi_…/supplier-parcels \\\n  -H \"Authorization: Bearer wp_sk_test_...\" \\\n  -H \"Idempotency-Key: wc-1042-parcels-v2-8b17…\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"routingVersion\": 2,\n    \"parcels\": [\n      { \"trackingNumber\": \"SF1234567890\", \"carrier\": \"SF Express\",\n        \"lines\": [ { \"externalLineId\": \"line-1\", \"qty\": 2 } ] }\n    ]\n  }'"}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":true,"description":"Stable caller-generated key. Replays return the stored response; key reuse with a different payload is rejected.","schema":{"type":"string","minLength":1,"maxLength":200}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"}}}}}},"/v1/merchant/fulfillment-intents/{id}/submit-forwarding":{"post":{"operationId":"submitIntentForwarding","summary":"Submit supplier forwarding","description":"Locks the supplier parcels and atomically creates the forwarding child order. Submission succeeds only when the saved parcel allocations exactly cover every forwarding line. The plugin deliberately separates draft saving from this irreversible warehouse handoff.","tags":["Woo smart routing · pilot"],"security":[{"bearerAuth":[]}],"x-woolii-scope":"orders:write","x-woolii-idempotent":true,"externalDocs":{"description":"Human-readable contract, examples and operational notes","url":"https://porter.woolii.com/developers#submit-intent-forwarding"},"responses":{"200":{"description":"Successful response","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"4XX":{"$ref":"#/components/responses/MerchantError"},"5XX":{"$ref":"#/components/responses/MerchantError"}},"x-codeSamples":[{"lang":"Shell","source":"curl -X POST https://api.woolii.com/v1/merchant/fulfillment-intents/cfi_…/submit-forwarding \\\n  -H \"Authorization: Bearer wp_sk_test_...\" \\\n  -H \"Idempotency-Key: wc-1042-submit-forwarding-v2-8b17…\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"routingVersion\": 2 }'"}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":true,"description":"Stable caller-generated key. Replays return the stored response; key reuse with a different payload is rejected.","schema":{"type":"string","minLength":1,"maxLength":200}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"}}}}}},"/v1/merchant/fulfillment-intents/{id}/select-route":{"post":{"operationId":"selectIntentRoute","summary":"Resolve a mixed-order route","description":"Resolves an unexecuted mixed order. FORWARD_ALL moves every line to supplier forwarding. WAIT_FOR_STOCK records the merchant decision but leaves the intent in review until stock changes and the merchant explicitly re-evaluates. Automatic split fulfillment is intentionally disabled in this release.","tags":["Woo smart routing · pilot"],"security":[{"bearerAuth":[]}],"x-woolii-scope":"orders:write","x-woolii-idempotent":true,"externalDocs":{"description":"Human-readable contract, examples and operational notes","url":"https://porter.woolii.com/developers#select-intent-route"},"responses":{"200":{"description":"Successful response","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"4XX":{"$ref":"#/components/responses/MerchantError"},"5XX":{"$ref":"#/components/responses/MerchantError"}},"x-codeSamples":[{"lang":"Shell","source":"curl -X POST https://api.woolii.com/v1/merchant/fulfillment-intents/cfi_…/select-route \\\n  -H \"Authorization: Bearer wp_sk_test_...\" \\\n  -H \"Idempotency-Key: wc-1042-route-v1-forward-all\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"routingVersion\": 1, \"selection\": \"FORWARD_ALL\" }'"}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":true,"description":"Stable caller-generated key. Replays return the stored response; key reuse with a different payload is rejected.","schema":{"type":"string","minLength":1,"maxLength":200}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"}}}}}},"/v1/merchant/fulfillment-intents/{id}/re-evaluate":{"post":{"operationId":"reevaluateIntent","summary":"Re-evaluate inventory routing","description":"Re-runs an unexecuted mixed, mapping-required or routing-blocked intent against current mappings, route configuration and inventory. It never re-routes an intent that already has a child order or submitted supplier parcel.","tags":["Woo smart routing · pilot"],"security":[{"bearerAuth":[]}],"x-woolii-scope":"orders:write","x-woolii-idempotent":true,"externalDocs":{"description":"Human-readable contract, examples and operational notes","url":"https://porter.woolii.com/developers#reevaluate-intent"},"responses":{"200":{"description":"Successful response","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"4XX":{"$ref":"#/components/responses/MerchantError"},"5XX":{"$ref":"#/components/responses/MerchantError"}},"x-codeSamples":[{"lang":"Shell","source":"curl -X POST https://api.woolii.com/v1/merchant/fulfillment-intents/cfi_…/re-evaluate \\\n  -H \"Authorization: Bearer wp_sk_test_...\" \\\n  -H \"Idempotency-Key: wc-1042-reevaluate-v2\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"routingVersion\": 2 }'"}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":true,"description":"Stable caller-generated key. Replays return the stored response; key reuse with a different payload is rejected.","schema":{"type":"string","minLength":1,"maxLength":200}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"}}}}}},"/v1/merchant/orders/estimate":{"post":{"operationId":"estimateOrder","summary":"Estimate cost and transit","description":"Models cost and configured transit time before order creation. It first selects the currently published WooliiPorter physical route, then applies the immutable supplier rate version, the merchant fine-weight settlement policy, and a current FX snapshot. The final packed quote reruns the same versioned engine with actual measurements and freezes its own route, rate and FX evidence, so a planning estimate is not a charge promise.","tags":["Direct forwarding API"],"security":[{"bearerAuth":[]}],"x-woolii-scope":"orders:read","x-woolii-idempotent":false,"externalDocs":{"description":"Human-readable contract, examples and operational notes","url":"https://porter.woolii.com/developers#estimate-order"},"responses":{"200":{"description":"Successful response","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"4XX":{"$ref":"#/components/responses/MerchantError"},"5XX":{"$ref":"#/components/responses/MerchantError"}},"x-codeSamples":[{"lang":"Shell","source":"curl https://api.woolii.com/v1/merchant/orders/estimate \\\n  -H \"Authorization: Bearer wp_sk_test_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"destination\": { \"country\": \"US\", \"postalCode\": \"94105\" },\n    \"packages\": [\n      { \"weight\": 12.5, \"length\": 40, \"width\": 30, \"height\": 25 }\n    ],\n    \"serviceType\": \"AIR_CARGO\",\n    \"packageTypeId\": \"1\",\n    \"services\": [ { \"type\": \"POLYBAG\", \"qty\": 24 } ]\n  }'"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"}}}}}},"/v1/merchant/orders":{"post":{"operationId":"createOrder","summary":"Create an order pre-alert","description":"Registers a forwarding pre-alert: the destination, shipment preferences and the domestic supplier parcels you expect to arrive. Returns the Woolii order, its receiving instructions and the recorded parcels. externalOrderId is unique per account.","tags":["Direct forwarding API"],"security":[{"bearerAuth":[]}],"x-woolii-scope":"orders:write","x-woolii-idempotent":true,"externalDocs":{"description":"Human-readable contract, examples and operational notes","url":"https://porter.woolii.com/developers#create-order"},"responses":{"200":{"description":"Successful response","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"4XX":{"$ref":"#/components/responses/MerchantError"},"5XX":{"$ref":"#/components/responses/MerchantError"}},"x-codeSamples":[{"lang":"Shell","source":"curl https://api.woolii.com/v1/merchant/orders \\\n  -H \"Authorization: Bearer wp_sk_test_...\" \\\n  -H \"Idempotency-Key: order-SO-1042-v1\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"externalOrderId\": \"SO-1042\",\n    \"destination\": {\n      \"recipientName\": \"Ada Merchant\",\n      \"phone\": \"+1 415 000 0000\",\n      \"country\": \"US\",\n      \"province\": \"CA\",\n      \"city\": \"San Francisco\",\n      \"street\": \"1 Mission St\",\n      \"postalCode\": \"94105\"\n    },\n    \"parcels\": [\n      { \"trackingNumber\": \"SF1234567890\",\n        \"productName\": \"Ceramic mugs\",\n        \"quantity\": 24,\n        \"cargoType\": \"General\" }\n    ],\n    \"shipmentType\": \"CONSOLIDATED\",\n    \"serviceType\": \"AIR_CARGO\",\n    \"inspection\": true,\n    \"destinationType\": \"CUSTOMER\",\n    \"services\": [\n      { \"type\": \"RELABEL\",\n        \"trackingNumber\": \"SF1234567890\",\n        \"qty\": 24,\n        \"instructionText\": \"Replace the supplier barcode with the enclosed label, one per unit, over the original.\",\n        \"illustrationImages\": [\"https://cdn.example.com/relabel-expected-result.jpg\"],\n        \"labelFiles\": [\"https://cdn.example.com/labels-SO-1042.pdf\"] }\n    ]\n  }'"}],"parameters":[{"name":"Idempotency-Key","in":"header","required":true,"description":"Stable caller-generated key. Replays return the stored response; key reuse with a different payload is rejected.","schema":{"type":"string","minLength":1,"maxLength":200}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"}}}}},"get":{"operationId":"listOrders","summary":"List orders","description":"Cursor-paginated list of your orders, newest first. Filter by externalOrderId, state, or updatedSince (ISO 8601).","tags":["Direct forwarding API"],"security":[{"bearerAuth":[]}],"x-woolii-scope":"orders:read","x-woolii-idempotent":false,"externalDocs":{"description":"Human-readable contract, examples and operational notes","url":"https://porter.woolii.com/developers#list-orders"},"responses":{"200":{"description":"Successful response","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"4XX":{"$ref":"#/components/responses/MerchantError"},"5XX":{"$ref":"#/components/responses/MerchantError"}},"x-codeSamples":[{"lang":"Shell","source":"curl \"https://api.woolii.com/v1/merchant/orders?limit=20&state=quote_ready\" \\\n  -H \"Authorization: Bearer wp_sk_test_...\""}]}},"/v1/merchant/orders/{id}":{"get":{"operationId":"getOrder","summary":"Retrieve an order","description":"Returns one order with its parcels, receiving instructions and the live progress of every value-added service you requested. Order ids from another account return 404 — resource existence is never disclosed across accounts.","tags":["Direct forwarding API"],"security":[{"bearerAuth":[]}],"x-woolii-scope":"orders:read","x-woolii-idempotent":false,"externalDocs":{"description":"Human-readable contract, examples and operational notes","url":"https://porter.woolii.com/developers#get-order"},"responses":{"200":{"description":"Successful response","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"4XX":{"$ref":"#/components/responses/MerchantError"},"5XX":{"$ref":"#/components/responses/MerchantError"}},"x-codeSamples":[{"lang":"Shell","source":"curl https://api.woolii.com/v1/merchant/orders/ord_cml0… \\\n  -H \"Authorization: Bearer wp_sk_test_...\""}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]}},"/v1/merchant/orders/{id}/cancel":{"post":{"operationId":"cancelOrder","summary":"Cancel an order","description":"Cancels an order while it is still awaiting parcels (state awaiting_parcels). After receiving has begun the API returns 409 merchant_order_conflict with a human escalation path — the same rule the customer dashboard enforces.","tags":["Direct forwarding API"],"security":[{"bearerAuth":[]}],"x-woolii-scope":"orders:write","x-woolii-idempotent":true,"externalDocs":{"description":"Human-readable contract, examples and operational notes","url":"https://porter.woolii.com/developers#cancel-order"},"responses":{"200":{"description":"Successful response","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"4XX":{"$ref":"#/components/responses/MerchantError"},"5XX":{"$ref":"#/components/responses/MerchantError"}},"x-codeSamples":[{"lang":"Shell","source":"curl -X POST https://api.woolii.com/v1/merchant/orders/ord_cml0…/cancel \\\n  -H \"Authorization: Bearer wp_sk_test_...\" \\\n  -H \"Idempotency-Key: cancel-SO-1042-v1\""}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":true,"description":"Stable caller-generated key. Replays return the stored response; key reuse with a different payload is rejected.","schema":{"type":"string","minLength":1,"maxLength":200}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"}}}}}},"/v1/merchant/orders/{id}/simulate":{"post":{"operationId":"simulateOrder","summary":"Simulate a sandbox lifecycle event","description":"Advances a sandbox forwarding order and emits the matching signed webhook without touching real warehouse, payment or carrier systems. Use the events in order when testing an end-to-end receiver. Production orders are always rejected.","tags":["Getting started"],"security":[{"bearerAuth":[]}],"x-woolii-scope":"orders:write","x-woolii-idempotent":false,"externalDocs":{"description":"Human-readable contract, examples and operational notes","url":"https://porter.woolii.com/developers#simulate-order"},"responses":{"200":{"description":"Successful response","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"4XX":{"$ref":"#/components/responses/MerchantError"},"5XX":{"$ref":"#/components/responses/MerchantError"}},"x-codeSamples":[{"lang":"Shell","source":"curl -X POST https://api.woolii.com/v1/merchant/orders/ord_cml0…/simulate \\\n  -H \"Authorization: Bearer wp_sk_test_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"event\": \"quote.ready\" }'"}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"}}}}}},"/v1/merchant/countries":{"get":{"operationId":"listCountries","summary":"List shippable countries","description":"Country-level candidates backed by a current published carrier buy-rate version and an executable published WooliiPorter route. This endpoint no longer reads legacy ShippingRate rows. Postal zone, cargo type, weight and dimension eligibility remain authoritative in the estimate endpoint.","tags":["Direct forwarding API"],"security":[{"bearerAuth":[]}],"x-woolii-scope":"orders:read","x-woolii-idempotent":false,"externalDocs":{"description":"Human-readable contract, examples and operational notes","url":"https://porter.woolii.com/developers#list-countries"},"responses":{"200":{"description":"Successful response","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"4XX":{"$ref":"#/components/responses/MerchantError"},"5XX":{"$ref":"#/components/responses/MerchantError"}},"x-codeSamples":[{"lang":"Shell","source":"curl https://api.woolii.com/v1/merchant/countries \\\n  -H \"Authorization: Bearer wp_sk_test_...\""}]}},"/v1/merchant/orders/{id}/quote":{"get":{"operationId":"getQuote","summary":"Retrieve the quote state","description":"Distinguishes the pending packed quote from the final packed quote. New final amounts come from each parcel’s route-matched versioned ShipmentSellQuote; legacy package snapshots are historical read-only fallback only. The public response exposes WooliiPorter shipment/parcel references and customer prices, never the selected internal carrier.","tags":["Billing & settlement"],"security":[{"bearerAuth":[]}],"x-woolii-scope":"orders:read","x-woolii-idempotent":false,"externalDocs":{"description":"Human-readable contract, examples and operational notes","url":"https://porter.woolii.com/developers#get-quote"},"responses":{"200":{"description":"Successful response","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"4XX":{"$ref":"#/components/responses/MerchantError"},"5XX":{"$ref":"#/components/responses/MerchantError"}},"x-codeSamples":[{"lang":"Shell","source":"curl https://api.woolii.com/v1/merchant/orders/ord_cml0…/quote \\\n  -H \"Authorization: Bearer wp_sk_test_...\""}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]}},"/v1/merchant/orders/{id}/settlement":{"get":{"operationId":"getSettlement","summary":"Retrieve the settlement","description":"The line-item bill. Every charge is one explainable line — category, label, amount — and the total is exactly the sum of the lines, the same amount pay charges. Before packing finalizes the quote no lines are presented: an estimate never masquerades as a bill.","tags":["Billing & settlement"],"security":[{"bearerAuth":[]}],"x-woolii-scope":"orders:read","x-woolii-idempotent":false,"externalDocs":{"description":"Human-readable contract, examples and operational notes","url":"https://porter.woolii.com/developers#get-settlement"},"responses":{"200":{"description":"Successful response","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"4XX":{"$ref":"#/components/responses/MerchantError"},"5XX":{"$ref":"#/components/responses/MerchantError"}},"x-codeSamples":[{"lang":"Shell","source":"curl https://api.woolii.com/v1/merchant/orders/ord_cml0…/settlement \\\n  -H \"Authorization: Bearer wp_sk_test_...\""}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]}},"/v1/merchant/orders/{id}/pay":{"post":{"operationId":"payOrder","summary":"Pay for a shipment","description":"Pay-per-shipment settlement of exactly the settlement lines — the charged amount always equals GET settlement’s total. Sandbox orders settle instantly with a sandbox payment and emit payment.completed. Production orders return a Stripe clientSecret to confirm with Stripe.js; the payment webhook then advances the order on the same rail as dashboard payments.","tags":["Billing & settlement"],"security":[{"bearerAuth":[]}],"x-woolii-scope":"orders:write","x-woolii-idempotent":false,"externalDocs":{"description":"Human-readable contract, examples and operational notes","url":"https://porter.woolii.com/developers#pay-order"},"responses":{"200":{"description":"Successful response","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"4XX":{"$ref":"#/components/responses/MerchantError"},"5XX":{"$ref":"#/components/responses/MerchantError"}},"x-codeSamples":[{"lang":"Shell","source":"curl -X POST https://api.woolii.com/v1/merchant/orders/ord_cml0…/pay \\\n  -H \"Authorization: Bearer wp_sk_live_...\""}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"}}}}}},"/v1/merchant/orders/{id}/timeline":{"get":{"operationId":"getTimeline","summary":"Retrieve the timeline","description":"One time-ordered event stream for the whole journey: the China private leg (receiving, inspection, value-added services, packing, payment) merged with the international carrier leg. \"Where is my order?\" has a single answer from a single endpoint.","tags":["Tracking"],"security":[{"bearerAuth":[]}],"x-woolii-scope":"orders:read","x-woolii-idempotent":false,"externalDocs":{"description":"Human-readable contract, examples and operational notes","url":"https://porter.woolii.com/developers#get-timeline"},"responses":{"200":{"description":"Successful response","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"4XX":{"$ref":"#/components/responses/MerchantError"},"5XX":{"$ref":"#/components/responses/MerchantError"}},"x-codeSamples":[{"lang":"Shell","source":"curl https://api.woolii.com/v1/merchant/orders/ord_cml0…/timeline \\\n  -H \"Authorization: Bearer wp_sk_test_...\""}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]}},"/v1/merchant/orders/{id}/tracking":{"get":{"operationId":"getTracking","summary":"Retrieve tracking","description":"Order-keyed tracking projection for every outbound package on the order. It returns the stable WooliiPorter WP number and the same delivery timeline available on woolii.com/track.","tags":["Tracking"],"security":[{"bearerAuth":[]}],"x-woolii-scope":"tracking:read","x-woolii-idempotent":false,"externalDocs":{"description":"Human-readable contract, examples and operational notes","url":"https://porter.woolii.com/developers#get-tracking"},"responses":{"200":{"description":"Successful response","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"4XX":{"$ref":"#/components/responses/MerchantError"},"5XX":{"$ref":"#/components/responses/MerchantError"}},"x-codeSamples":[{"lang":"Shell","source":"curl https://api.woolii.com/v1/merchant/orders/ord_cml0…/tracking \\\n  -H \"Authorization: Bearer wp_sk_test_...\""}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]}},"/v1/merchant/shipments":{"get":{"operationId":"listShipments","summary":"List unified shipments","description":"Lists the immutable outbound-shipment ledger across forwarding and stocked fulfillment. Use cursor pagination for continuous synchronization. The carrier is always WooliiPorter and each row uses the same stable public reference shown to the customer.","tags":["Tracking"],"security":[{"bearerAuth":[]}],"x-woolii-scope":"orders:read","x-woolii-idempotent":false,"externalDocs":{"description":"Human-readable contract, examples and operational notes","url":"https://porter.woolii.com/developers#list-shipments"},"responses":{"200":{"description":"Successful response","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShipmentSummaryPage"}}}},"4XX":{"$ref":"#/components/responses/MerchantError"},"5XX":{"$ref":"#/components/responses/MerchantError"}},"x-codeSamples":[{"lang":"Shell","source":"curl \"https://api.woolii.com/v1/merchant/shipments?updatedSince=2026-07-31T00%3A00%3A00Z&limit=50\" \\\n  -H \"Authorization: Bearer wp_sk_live_...\""}],"parameters":[{"name":"cursor","in":"query","required":false,"description":"Opaque cursor from nextCursor.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"1–100; default 20.","schema":{"type":"integer"}},{"name":"updatedSince","in":"query","required":false,"description":"Only shipments updated at or after this timestamp. A timezone offset is required.","schema":{"type":"string"}},{"name":"externalOrderId","in":"query","required":false,"description":"Exact merchant/store order identity.","schema":{"type":"string"}},{"name":"trackingNumber","in":"query","required":false,"description":"Exact WooliiPorter public tracking number.","schema":{"type":"string"}},{"name":"sourceType","in":"query","required":false,"description":"ORDER | FULFILLMENT_ORDER.","schema":{"type":"string"}},{"name":"status","in":"query","required":false,"description":"PACKED | ROUTED | BOOKING_PENDING | BOOKING_UNKNOWN | BOOKED | HANDOVER_PENDING | HANDED_OVER | IN_TRANSIT | DELIVERED | CANCELLED | EXCEPTION.","schema":{"type":"string"}},{"name":"trackingStatus","in":"query","required":false,"description":"UNKNOWN | INFO_RECEIVED | HANDED_OVER | IN_TRANSIT | OUT_FOR_DELIVERY | DELIVERED | EXCEPTION | RETURNED.","schema":{"type":"string"}}]}},"/v1/merchant/shipments/{shipmentNumber}":{"get":{"operationId":"getShipment","summary":"Retrieve a unified shipment","description":"Returns one outbound shipment by its WooliiPorter shipment number, including public parcel measurements, merchant-owned line snapshots, the latest merchant sell quote and the WooliiPorter delivery timeline.","tags":["Tracking"],"security":[{"bearerAuth":[]}],"x-woolii-scope":"orders:read","x-woolii-idempotent":false,"externalDocs":{"description":"Human-readable contract, examples and operational notes","url":"https://porter.woolii.com/developers#get-shipment"},"responses":{"200":{"description":"Successful response","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShipmentDetailResponse"}}}},"4XX":{"$ref":"#/components/responses/MerchantError"},"5XX":{"$ref":"#/components/responses/MerchantError"}},"x-codeSamples":[{"lang":"Shell","source":"curl https://api.woolii.com/v1/merchant/shipments/WP1785571574479 \\\n  -H \"Authorization: Bearer wp_sk_live_...\""}],"parameters":[{"name":"shipmentNumber","in":"path","required":true,"schema":{"type":"string"}}]}},"/v1/merchant/shipments/{shipmentNumber}/tracking":{"get":{"operationId":"getShipmentTracking","summary":"Retrieve shipment-native tracking","description":"Returns the compact tracking projection for every parcel in one unified shipment. New integrations should prefer this shipment-native endpoint; the order-keyed endpoint is only an alternate projection of the same Shipment ledger.","tags":["Tracking"],"security":[{"bearerAuth":[]}],"x-woolii-scope":"tracking:read","x-woolii-idempotent":false,"externalDocs":{"description":"Human-readable contract, examples and operational notes","url":"https://porter.woolii.com/developers#get-shipment-tracking"},"responses":{"200":{"description":"Successful response","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShipmentTrackingResponse"}}}},"4XX":{"$ref":"#/components/responses/MerchantError"},"5XX":{"$ref":"#/components/responses/MerchantError"}},"x-codeSamples":[{"lang":"Shell","source":"curl https://api.woolii.com/v1/merchant/shipments/WP1785571574479/tracking \\\n  -H \"Authorization: Bearer wp_sk_live_...\""}],"parameters":[{"name":"shipmentNumber","in":"path","required":true,"schema":{"type":"string"}}]}},"/v1/merchant/skus":{"post":{"operationId":"registerSku","summary":"Register a SKU","description":"Registers or updates a SKU in your catalog — an upsert keyed on skuCode, so replaying the same registration is safe without an Idempotency-Key. SKUs are the master data for stocking: inbound shipments and fulfillment orders reference skuCode and are rejected with 422 merchant_sku_unregistered until the SKU exists — stock is never put away against a guessed product. Re-registering reactivates an inactive SKU.","tags":["Stocking & fulfillment"],"security":[{"bearerAuth":[]}],"x-woolii-scope":"orders:write","x-woolii-idempotent":false,"externalDocs":{"description":"Human-readable contract, examples and operational notes","url":"https://porter.woolii.com/developers#register-sku"},"responses":{"200":{"description":"Successful response","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"4XX":{"$ref":"#/components/responses/MerchantError"},"5XX":{"$ref":"#/components/responses/MerchantError"}},"x-codeSamples":[{"lang":"Shell","source":"curl https://api.woolii.com/v1/merchant/skus \\\n  -H \"Authorization: Bearer wp_sk_test_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"skuCode\": \"MUG-CERAMIC-WHT\",\n    \"name\": \"Ceramic mug, white\",\n    \"unitWeight\": 0.4,\n    \"unitLength\": 12, \"unitWidth\": 9, \"unitHeight\": 10,\n    \"customsNameEn\": \"Ceramic mug\",\n    \"hsCode\": \"691200\"\n  }'"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"}}}}},"get":{"operationId":"listSkus","summary":"List SKUs","description":"Your active SKUs, sorted by skuCode. Up to 500 entries are returned.","tags":["Stocking & fulfillment"],"security":[{"bearerAuth":[]}],"x-woolii-scope":"orders:read","x-woolii-idempotent":false,"externalDocs":{"description":"Human-readable contract, examples and operational notes","url":"https://porter.woolii.com/developers#list-skus"},"responses":{"200":{"description":"Successful response","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"4XX":{"$ref":"#/components/responses/MerchantError"},"5XX":{"$ref":"#/components/responses/MerchantError"}},"x-codeSamples":[{"lang":"Shell","source":"curl https://api.woolii.com/v1/merchant/skus \\\n  -H \"Authorization: Bearer wp_sk_test_...\""}]}},"/v1/merchant/inbound-shipments":{"post":{"operationId":"createInboundShipment","summary":"Create an inbound shipment","description":"Creates a WooliiPorter inbound workflow for stored fulfillment, Amazon FBA preparation or marketplace FBM. Your suppliers send declared domestic parcels to the assigned China receiving address. Stored-fulfillment goods are put away as merchant-owned inventory, while FBA/FBM inbounds continue through their configured warehouse workflow.","tags":["Stocking & fulfillment"],"security":[{"bearerAuth":[]}],"x-woolii-scope":"orders:write","x-woolii-idempotent":false,"externalDocs":{"description":"Human-readable contract, examples and operational notes","url":"https://porter.woolii.com/developers#create-inbound-shipment"},"responses":{"200":{"description":"Successful response","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"4XX":{"$ref":"#/components/responses/MerchantError"},"5XX":{"$ref":"#/components/responses/MerchantError"}},"x-codeSamples":[{"lang":"Shell","source":"curl https://api.woolii.com/v1/merchant/inbound-shipments \\\n  -H \"Authorization: Bearer wp_sk_test_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"externalRef\": \"PO-2207\",\n    \"businessType\": \"STORED_FULFILLMENT\",\n    \"parcels\": [ { \"trackingNumber\": \"SF9876543210\", \"productName\": \"Ceramic mugs\" } ],\n    \"lines\": [ { \"skuCode\": \"MUG-CERAMIC-WHT\", \"expectedQty\": 200 } ],\n    \"services\": []\n  }'"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"}}}}},"get":{"operationId":"listInboundShipments","summary":"List inbound shipments","description":"Your inbound shipments, newest first, with parcel states and per-line received quantities. Up to 100 entries are returned.","tags":["Stocking & fulfillment"],"security":[{"bearerAuth":[]}],"x-woolii-scope":"orders:read","x-woolii-idempotent":false,"externalDocs":{"description":"Human-readable contract, examples and operational notes","url":"https://porter.woolii.com/developers#list-inbound-shipments"},"responses":{"200":{"description":"Successful response","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"4XX":{"$ref":"#/components/responses/MerchantError"},"5XX":{"$ref":"#/components/responses/MerchantError"}},"x-codeSamples":[{"lang":"Shell","source":"curl https://api.woolii.com/v1/merchant/inbound-shipments \\\n  -H \"Authorization: Bearer wp_sk_test_...\""}]}},"/v1/merchant/inventory":{"get":{"operationId":"getInventory","summary":"Retrieve inventory","description":"Live stock levels per SKU per warehouse — onHand, reserved, available — plus stock aging (the receipt date of the oldest lot still holding stock). Every number is computed on read by summing the immutable stock-movement ledger, the same source the storage lines on your statement are computed from: inventory and billing can never disagree. Filter one SKU with ?sku=.","tags":["Stocking & fulfillment"],"security":[{"bearerAuth":[]}],"x-woolii-scope":"orders:read","x-woolii-idempotent":false,"externalDocs":{"description":"Human-readable contract, examples and operational notes","url":"https://porter.woolii.com/developers#get-inventory"},"responses":{"200":{"description":"Successful response","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"4XX":{"$ref":"#/components/responses/MerchantError"},"5XX":{"$ref":"#/components/responses/MerchantError"}},"x-codeSamples":[{"lang":"Shell","source":"curl \"https://api.woolii.com/v1/merchant/inventory?sku=MUG-CERAMIC-WHT\" \\\n  -H \"Authorization: Bearer wp_sk_test_...\""}]}},"/v1/merchant/fulfillment-orders":{"post":{"operationId":"createFulfillmentOrder","summary":"Create a fulfillment order","description":"Creates a dropship fulfillment order shipped from your stocked inventory — one destination address, one or more SKU lines. externalOrderId is the idempotency key: replaying an id that already exists returns the stored order with replayed: true instead of creating a duplicate. By default the order is confirmed automatically on creation; set draftOnly to hold it in draft for an explicit confirm call.","tags":["Stocking & fulfillment"],"security":[{"bearerAuth":[]}],"x-woolii-scope":"orders:write","x-woolii-idempotent":false,"externalDocs":{"description":"Human-readable contract, examples and operational notes","url":"https://porter.woolii.com/developers#create-fulfillment-order"},"responses":{"200":{"description":"Successful response","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"4XX":{"$ref":"#/components/responses/MerchantError"},"5XX":{"$ref":"#/components/responses/MerchantError"}},"x-codeSamples":[{"lang":"Shell","source":"curl https://api.woolii.com/v1/merchant/fulfillment-orders \\\n  -H \"Authorization: Bearer wp_sk_test_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"externalOrderId\": \"wc-1042\",\n    \"destination\": {\n      \"recipientName\": \"Ada Merchant\", \"phone\": \"+1 415 000 0000\",\n      \"country\": \"US\", \"province\": \"CA\", \"city\": \"San Francisco\",\n      \"street\": \"1 Mission St\", \"postalCode\": \"94105\"\n    },\n    \"lines\": [ { \"skuCode\": \"MUG-CERAMIC-WHT\", \"qty\": 24 } ],\n    \"serviceType\": \"AIR_CARGO\"\n  }'"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"}}}}},"get":{"operationId":"listFulfillmentOrders","summary":"List fulfillment orders","description":"Your fulfillment orders, most recently updated first, with lines and fee items. Pass ?updatedSince= (ISO 8601) for incremental polling. Up to 100 entries are returned.","tags":["Stocking & fulfillment"],"security":[{"bearerAuth":[]}],"x-woolii-scope":"orders:read","x-woolii-idempotent":false,"externalDocs":{"description":"Human-readable contract, examples and operational notes","url":"https://porter.woolii.com/developers#list-fulfillment-orders"},"responses":{"200":{"description":"Successful response","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"4XX":{"$ref":"#/components/responses/MerchantError"},"5XX":{"$ref":"#/components/responses/MerchantError"}},"x-codeSamples":[{"lang":"Shell","source":"curl \"https://api.woolii.com/v1/merchant/fulfillment-orders?updatedSince=2026-07-20T00:00:00Z\" \\\n  -H \"Authorization: Bearer wp_sk_test_...\""}]}},"/v1/merchant/fulfillment-orders/{id}/confirm":{"post":{"operationId":"confirmFulfillment","summary":"Confirm a fulfillment order","description":"Confirms a draft order, or retries reservation on an on_hold order after restocking — the same atomic, FIFO, all-or-nothing reservation as auto-confirm. With default auto-confirm you only need this call for draftOnly orders and for releasing holds.","tags":["Stocking & fulfillment"],"security":[{"bearerAuth":[]}],"x-woolii-scope":"orders:write","x-woolii-idempotent":false,"externalDocs":{"description":"Human-readable contract, examples and operational notes","url":"https://porter.woolii.com/developers#confirm-fulfillment"},"responses":{"200":{"description":"Successful response","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"4XX":{"$ref":"#/components/responses/MerchantError"},"5XX":{"$ref":"#/components/responses/MerchantError"}},"x-codeSamples":[{"lang":"Shell","source":"curl -X POST https://api.woolii.com/v1/merchant/fulfillment-orders/fo_cml5…/confirm \\\n  -H \"Authorization: Bearer wp_sk_test_...\""}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"}}}}}},"/v1/merchant/fulfillment-orders/{id}/cancel":{"post":{"operationId":"cancelFulfillment","summary":"Cancel a fulfillment order","description":"Cancels a fulfillment order any time before dispatch and releases every unpicked reservation back to available stock, lot by lot, in the same ledger the inventory endpoint reads.","tags":["Stocking & fulfillment"],"security":[{"bearerAuth":[]}],"x-woolii-scope":"orders:write","x-woolii-idempotent":false,"externalDocs":{"description":"Human-readable contract, examples and operational notes","url":"https://porter.woolii.com/developers#cancel-fulfillment"},"responses":{"200":{"description":"Successful response","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"4XX":{"$ref":"#/components/responses/MerchantError"},"5XX":{"$ref":"#/components/responses/MerchantError"}},"x-codeSamples":[{"lang":"Shell","source":"curl -X POST https://api.woolii.com/v1/merchant/fulfillment-orders/fo_cml5…/cancel \\\n  -H \"Authorization: Bearer wp_sk_test_...\""}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"}}}}}},"/v1/merchant/statements":{"get":{"operationId":"getStatement","summary":"Retrieve the monthly statement","description":"The monthly stocking bill, computed live from the same ledger as inventory — never a stored snapshot, so the statement and your stock can never disagree. Storage is billed per lot: on-hand units × the lot’s unit volume (CBM) × the per-CBM-per-day price × billable days, where billing starts only after a free period from receipt. Fulfillment fees incurred in the month are listed line by line alongside. ?month=YYYY-MM; defaults to the current month.","tags":["Stocking & fulfillment"],"security":[{"bearerAuth":[]}],"x-woolii-scope":"finance:read","x-woolii-idempotent":false,"externalDocs":{"description":"Human-readable contract, examples and operational notes","url":"https://porter.woolii.com/developers#get-statement"},"responses":{"200":{"description":"Successful response","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"4XX":{"$ref":"#/components/responses/MerchantError"},"5XX":{"$ref":"#/components/responses/MerchantError"}},"x-codeSamples":[{"lang":"Shell","source":"curl \"https://api.woolii.com/v1/merchant/statements?month=2026-07\" \\\n  -H \"Authorization: Bearer wp_sk_test_...\""}]}},"/v1/merchant/transfer-orders":{"post":{"operationId":"createTransferOrder","summary":"Create a warehouse transfer","description":"Requests a China-to-overseas-warehouse stock transfer. The source is the active China warehouse; the destination must be an active international warehouse supplied by operations. Dispatch and receiving remain warehouse-controlled actions, and the resulting quantities appear as in transit until receiving completes.","tags":["Stocking & fulfillment"],"security":[{"bearerAuth":[]}],"x-woolii-scope":"orders:write","x-woolii-idempotent":false,"externalDocs":{"description":"Human-readable contract, examples and operational notes","url":"https://porter.woolii.com/developers#create-transfer-order"},"responses":{"200":{"description":"Successful response","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"4XX":{"$ref":"#/components/responses/MerchantError"},"5XX":{"$ref":"#/components/responses/MerchantError"}},"x-codeSamples":[{"lang":"Shell","source":"curl https://api.woolii.com/v1/merchant/transfer-orders \\\n  -H \"Authorization: Bearer wp_sk_test_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"toWarehouseId\": \"wh_us_west_…\",\n    \"lines\": [ { \"skuCode\": \"MUG-CERAMIC-WHT\", \"qty\": 80 } ],\n    \"notes\": \"Replenish US West inventory\"\n  }'"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"}}}}},"get":{"operationId":"listTransferOrders","summary":"List warehouse transfers","description":"Returns up to 100 transfer orders plus an inTransit summary by SKU. Use the individual lines for audit and the aggregate to avoid double-counting stock that has left China but has not yet been received overseas.","tags":["Stocking & fulfillment"],"security":[{"bearerAuth":[]}],"x-woolii-scope":"orders:read","x-woolii-idempotent":false,"externalDocs":{"description":"Human-readable contract, examples and operational notes","url":"https://porter.woolii.com/developers#list-transfer-orders"},"responses":{"200":{"description":"Successful response","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"4XX":{"$ref":"#/components/responses/MerchantError"},"5XX":{"$ref":"#/components/responses/MerchantError"}},"x-codeSamples":[{"lang":"Shell","source":"curl https://api.woolii.com/v1/merchant/transfer-orders \\\n  -H \"Authorization: Bearer wp_sk_test_...\""}]}},"/v1/merchant/webhook-endpoints":{"post":{"operationId":"createWebhook","summary":"Create a webhook endpoint","description":"Registers an HTTPS endpoint for the event types you select. The signing secret is returned exactly once — store it immediately. Up to 5 active endpoints per account.","tags":["Webhooks"],"security":[{"bearerAuth":[]}],"x-woolii-scope":"webhooks:write","x-woolii-idempotent":false,"externalDocs":{"description":"Human-readable contract, examples and operational notes","url":"https://porter.woolii.com/developers#create-webhook"},"responses":{"200":{"description":"Successful response","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"4XX":{"$ref":"#/components/responses/MerchantError"},"5XX":{"$ref":"#/components/responses/MerchantError"}},"x-codeSamples":[{"lang":"Shell","source":"curl https://api.woolii.com/v1/merchant/webhook-endpoints \\\n  -H \"Authorization: Bearer wp_sk_test_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"url\": \"https://example.com/webhooks/woolii\",\n    \"eventTypes\": [\"parcel.received\", \"quote.ready\",\n                   \"shipment.dispatched\", \"shipment.delivered\"]\n  }'"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"}}}}},"get":{"operationId":"listWebhooks","summary":"List webhook endpoints","description":"Lists your endpoints with status and failure counters. Signing secrets are never returned again.","tags":["Webhooks"],"security":[{"bearerAuth":[]}],"x-woolii-scope":"webhooks:write","x-woolii-idempotent":false,"externalDocs":{"description":"Human-readable contract, examples and operational notes","url":"https://porter.woolii.com/developers#list-webhooks"},"responses":{"200":{"description":"Successful response","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"4XX":{"$ref":"#/components/responses/MerchantError"},"5XX":{"$ref":"#/components/responses/MerchantError"}},"x-codeSamples":[{"lang":"Shell","source":"curl https://api.woolii.com/v1/merchant/webhook-endpoints \\\n  -H \"Authorization: Bearer wp_sk_test_...\""}]}},"/v1/merchant/webhook-endpoints/{id}":{"delete":{"operationId":"deleteWebhook","summary":"Disable a webhook endpoint","description":"Disables the endpoint. The delivery ledger is evidence and is retained; nothing is deleted.","tags":["Webhooks"],"security":[{"bearerAuth":[]}],"x-woolii-scope":"webhooks:write","x-woolii-idempotent":false,"externalDocs":{"description":"Human-readable contract, examples and operational notes","url":"https://porter.woolii.com/developers#delete-webhook"},"responses":{"200":{"description":"Successful response","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"4XX":{"$ref":"#/components/responses/MerchantError"},"5XX":{"$ref":"#/components/responses/MerchantError"}},"x-codeSamples":[{"lang":"Shell","source":"curl -X DELETE https://api.woolii.com/v1/merchant/webhook-endpoints/we_cml2… \\\n  -H \"Authorization: Bearer wp_sk_test_...\""}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]}},"/public/tracking/{publicTrackingNumber}":{"get":{"operationId":"getPublicTracking","summary":"Track a WooliiPorter public number","description":"Unauthenticated, rate-limited lookup for one stable WooliiPorter WP number. The response contains the WooliiPorter delivery timeline and public locations only.","tags":["Public tracking"],"security":[],"parameters":[{"name":"publicTrackingNumber","in":"path","required":true,"schema":{"type":"string","pattern":"^(?:WP[0-9]{13}|WPTRK-[A-Z0-9]{1,80})$"}}],"responses":{"200":{"description":"WooliiPorter public tracking record","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicTrackingRecord"}}}},"404":{"description":"Tracking number not found"},"429":{"description":"Public lookup rate limit exceeded"}}}}},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"wp_sk_test_… or wp_sk_live_…","description":"Merchant API key scoped to one account and environment."}},"headers":{"RequestId":{"description":"Bounded WooliiPorter request identifier for support and audit correlation.","schema":{"type":"string","pattern":"^req_"}}},"responses":{"MerchantError":{"description":"Stable Merchant API error envelope","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MerchantError"}}}}},"schemas":{"MerchantError":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message","requestId","details"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}},"PublicCarrier":{"type":"object","required":["name"],"properties":{"name":{"type":"string","const":"WooliiPorter"}},"description":"The only carrier identity exposed to merchants and their customers."},"ShipmentStatus":{"type":"string","enum":["PACKED","ROUTED","BOOKING_PENDING","BOOKING_UNKNOWN","BOOKED","HANDOVER_PENDING","HANDED_OVER","IN_TRANSIT","DELIVERED","CANCELLED","EXCEPTION"]},"ShipmentTrackingStatus":{"type":"string","enum":["UNKNOWN","INFO_RECEIVED","HANDED_OVER","IN_TRANSIT","OUT_FOR_DELIVERY","DELIVERED","EXCEPTION","RETURNED"]},"NullableTimestamp":{"type":["string","null"],"format":"date-time"},"PublicShipmentSource":{"type":"object","additionalProperties":false,"required":["type","id","externalOrderId"],"properties":{"type":{"type":"string","enum":["ORDER","FULFILLMENT_ORDER"]},"id":{"type":["string","null"]},"externalOrderId":{"type":["string","null"]}}},"PublicService":{"type":"object","additionalProperties":false,"required":["code","name"],"properties":{"code":{"type":"string"},"name":{"type":"string"}}},"MerchantSellQuote":{"type":["object","null"],"additionalProperties":false,"required":["revision","status","amount","currency","createdAt","acceptedAt","transit"],"properties":{"revision":{"type":"integer","minimum":1},"status":{"type":"string"},"amount":{"type":"string","pattern":"^[0-9]+(?:\\.[0-9]+)?$"},"currency":{"type":"string","minLength":3,"maxLength":3},"createdAt":{"type":"string","format":"date-time"},"acceptedAt":{"$ref":"#/components/schemas/NullableTimestamp"},"transit":{"type":["object","null"],"additionalProperties":false,"required":["minBusinessDays","maxBusinessDays","estimate"],"properties":{"minBusinessDays":{"type":"integer","minimum":1},"maxBusinessDays":{"type":"integer","minimum":1},"estimate":{"type":"string"}}}},"description":"Merchant sell quote only. Supplier charges, invoices and internal rate-plan data are excluded."},"ShipmentParcelSummary":{"type":"object","additionalProperties":false,"required":["parcelNumber","trackingNumber","trackingUrl","trackingStatus","quote"],"properties":{"parcelNumber":{"type":"string"},"trackingNumber":{"type":"string"},"trackingUrl":{"type":["string","null"],"format":"uri"},"trackingStatus":{"$ref":"#/components/schemas/ShipmentTrackingStatus"},"quote":{"$ref":"#/components/schemas/MerchantSellQuote"}}},"ShipmentSummary":{"type":"object","additionalProperties":false,"required":["shipmentNumber","source","carrier","service","status","sandbox","handedOverAt","deliveredAt","createdAt","updatedAt","parcels"],"properties":{"shipmentNumber":{"type":"string"},"source":{"$ref":"#/components/schemas/PublicShipmentSource"},"carrier":{"$ref":"#/components/schemas/PublicCarrier"},"service":{"$ref":"#/components/schemas/PublicService"},"status":{"$ref":"#/components/schemas/ShipmentStatus"},"sandbox":{"type":"boolean"},"handedOverAt":{"$ref":"#/components/schemas/NullableTimestamp"},"deliveredAt":{"$ref":"#/components/schemas/NullableTimestamp"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"parcels":{"type":"array","items":{"$ref":"#/components/schemas/ShipmentParcelSummary"}}}},"ShipmentSummaryPage":{"type":"object","additionalProperties":false,"required":["shipments","nextCursor"],"properties":{"shipments":{"type":"array","items":{"$ref":"#/components/schemas/ShipmentSummary"}},"nextCursor":{"type":["string","null"]}}},"ShipmentLine":{"type":"object","additionalProperties":false,"required":["quantity","sku","productName","externalLineId"],"properties":{"quantity":{"type":"integer","minimum":1},"sku":{"type":["string","null"]},"productName":{"type":["string","null"]},"externalLineId":{"type":["string","null"]}}},"ShipmentTrackingEvent":{"type":"object","additionalProperties":false,"required":["status","code","description","descriptionZh","location","eventAt"],"properties":{"status":{"$ref":"#/components/schemas/ShipmentTrackingStatus"},"code":{"type":"string"},"description":{"type":"string","description":"Normalized WooliiPorter customer copy in English."},"descriptionZh":{"type":"string","description":"Normalized WooliiPorter customer copy in Chinese."},"location":{"type":["string","null"]},"eventAt":{"type":"string","format":"date-time"}}},"PublicTrackingEvent":{"type":"object","additionalProperties":false,"required":["status","descriptionEn","descriptionZh","location","eventAt"],"properties":{"status":{"$ref":"#/components/schemas/ShipmentTrackingStatus"},"descriptionEn":{"type":"string"},"descriptionZh":{"type":"string"},"location":{"type":["string","null"]},"eventAt":{"type":"string","format":"date-time"}}},"PublicTrackingRecord":{"type":"object","additionalProperties":false,"required":["carrier","trackingNumber","status","updatedAt","events"],"properties":{"carrier":{"type":"string","const":"WooliiPorter"},"trackingNumber":{"type":"string","pattern":"^(?:WP[0-9]{13}|WPTRK-[A-Z0-9]{1,80})$"},"status":{"$ref":"#/components/schemas/ShipmentTrackingStatus"},"updatedAt":{"$ref":"#/components/schemas/NullableTimestamp"},"events":{"type":"array","maxItems":100,"items":{"$ref":"#/components/schemas/PublicTrackingEvent"}}}},"ShipmentParcelDetail":{"type":"object","additionalProperties":false,"required":["parcelNumber","trackingNumber","trackingUrl","trackingStatus","destinationCountryCode","measurement","lines","quote","events"],"properties":{"parcelNumber":{"type":"string"},"trackingNumber":{"type":"string"},"trackingUrl":{"type":["string","null"],"format":"uri"},"trackingStatus":{"$ref":"#/components/schemas/ShipmentTrackingStatus"},"destinationCountryCode":{"type":"string","minLength":2,"maxLength":2},"measurement":{"type":"object","additionalProperties":false,"required":["weightKg","lengthCm","widthCm","heightCm"],"properties":{"weightKg":{"type":"string"},"lengthCm":{"type":"string"},"widthCm":{"type":"string"},"heightCm":{"type":"string"}}},"lines":{"type":"array","items":{"$ref":"#/components/schemas/ShipmentLine"}},"quote":{"$ref":"#/components/schemas/MerchantSellQuote"},"events":{"type":"array","items":{"$ref":"#/components/schemas/ShipmentTrackingEvent"}}}},"ShipmentDetail":{"type":"object","additionalProperties":false,"required":["shipmentNumber","source","carrier","service","status","sandbox","handedOverAt","deliveredAt","createdAt","updatedAt","parcels"],"properties":{"shipmentNumber":{"type":"string"},"source":{"$ref":"#/components/schemas/PublicShipmentSource"},"carrier":{"$ref":"#/components/schemas/PublicCarrier"},"service":{"$ref":"#/components/schemas/PublicService"},"status":{"$ref":"#/components/schemas/ShipmentStatus"},"sandbox":{"type":"boolean"},"handedOverAt":{"$ref":"#/components/schemas/NullableTimestamp"},"deliveredAt":{"$ref":"#/components/schemas/NullableTimestamp"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"parcels":{"type":"array","items":{"$ref":"#/components/schemas/ShipmentParcelDetail"}}}},"ShipmentDetailResponse":{"type":"object","additionalProperties":false,"required":["shipment"],"properties":{"shipment":{"$ref":"#/components/schemas/ShipmentDetail"}}},"ShipmentTrackingParcel":{"type":"object","additionalProperties":false,"required":["parcelNumber","trackingNumber","trackingUrl","status","events"],"properties":{"parcelNumber":{"type":"string"},"trackingNumber":{"type":"string"},"trackingUrl":{"type":["string","null"],"format":"uri"},"status":{"$ref":"#/components/schemas/ShipmentTrackingStatus"},"events":{"type":"array","items":{"$ref":"#/components/schemas/ShipmentTrackingEvent"}}}},"ShipmentTrackingResponse":{"type":"object","additionalProperties":false,"required":["shipmentNumber","carrier","service","status","parcels","updatedAt"],"properties":{"shipmentNumber":{"type":"string"},"carrier":{"$ref":"#/components/schemas/PublicCarrier"},"service":{"$ref":"#/components/schemas/PublicService"},"status":{"$ref":"#/components/schemas/ShipmentStatus"},"parcels":{"type":"array","items":{"$ref":"#/components/schemas/ShipmentTrackingParcel"}},"updatedAt":{"type":"string","format":"date-time"}}}}},"x-woolii-contract-version":"2026-08-01.2","x-woolii-public-carrier":"WooliiPorter","x-woolii-internal-fields-never-exposed":["carrierProvider","carrierConnection","carrierRouteDecision","providerOrderId","providerTrackingNo","providerCharge","supplierInvoice","rawCarrierPayload"]}