OptiWMS API
OptiWMS API overview
Connect a custom store to OptiWMS: products and orders in, stock and shipments out, signed both ways.
OptiWMS API overview
The OptiWMS API connects a store OptiWMS has no ready-made integration for (your own platform, Magento, a headless storefront) to an OptiWMS warehouse. Your system sends OptiWMS its products and its orders that are ready to ship. OptiWMS calls your system back with stock levels, shipments, tracking changes and cancels.
Base URL: https://api.optiwms.com/store/v1/
Set up the connection in the OptiWMS dashboard at app.optiwms.com under Settings, Integrations, then Connect your own store or carrier (choose Your own store). The setup gives you the integration ID and the shared secret every call is signed with.
What this API does
- Import and update products (variants) OptiWMS can pick.
- Import and update paid orders that are ready to ship.
- Cancel an order before the warehouse finishes it.
- Read an order's status and shipments.
- Receive stock levels, shipments, tracking updates and warehouse cancels as signed calls to your registered base URL.
Out of scope
- Shopify, WooCommerce and eBay stores keep their own OptiWMS integrations; the OptiWMS API is for a store those do not cover.
- Orders go in once they are paid and ready to ship; the API has no draft or unpaid state.
- Warehouse operations (picks, packs, labels) stay in the OptiWMS dashboard and floor apps.
- Notification webhooks you subscribe to in the dashboard (order.shipped and similar) are a separate scheme: snake_case bodies signed with
X-OptiWMS-Hmac-Sha256over the body only. See Webhooks.
Calls into OptiWMS
| Call | What it does |
|---|---|
GET /ping |
Checks your signing and returns the integration's name and warehouse. Make this call work first. |
PUT /products |
Creates or updates up to 250 variants. A variant's components list makes it a set. |
POST /products/delete |
Marks variants or whole products as removed from your store. |
PUT /orders/{orderId} |
Sends an order: the whole current order, every time. |
POST /orders/{orderId}/cancel |
Cancels an order. |
GET /orders/{orderId} |
Reads what OptiWMS holds for an order and where it is. |
The calls OptiWMS makes to your system are listed under the OpenAPI webhooks: stock, shipments, shipmentTracking and orderCancel. They are signed the same way as calls into OptiWMS, over the full path your server receives (including any path prefix on your registered base URL).
Products
PUT /products sends up to 250 variants. OptiWMS matches a variant to a product by SKU. To sell one SKU that is picked as several products, send components on that variant: each entry is another variant's SKU and a quantity of 1 or more. The component SKUs can be in the same call. Leave components out and the stored set stays. Send [] to clear a set this integration defined. A set that another store defined, or that was defined in OptiWMS, is left as it is. Change it there.
An unknown component SKU, or a set OptiWMS refuses (stock on the set's own product, a set inside a set, more than 50 components), answers 400 for the whole call and names the variant. Nothing in that call is saved.
An order line for the set's SKU, with no setId, is split into those components. The shipments call and GET /orders/{orderId} then report that line as the number of sets. See Order rules.
Format
JSON in and out, field names in camelCase. Times are ISO 8601 with an offset (2026-10-27T09:30:00+11:00). Money is a decimal string ("29.95") with a three-letter ISO 4217 currency code. Ids are strings, kept exactly as your store writes them; OptiWMS never reads them as numbers.
Every authenticated answer carries X-OptiWMS-Request-Id. Quote that id when you ask for help; it also appears in Recent activity on the integration page.
Next
- Quick start - connect,
GET /ping, one product, one order. - Signing - the worked example and language samples.
- API reference - every operation from the OpenAPI document.
- Order rules - when an order can change, every 409, release the pick.
Connect your own store
Register the integration in the dashboard, then start with GET /ping.