Summary and recommendation
ShipStation's REST API (base URL: https://ssapi.shipstation.com) authenticates via HTTP Basic Auth using a Base64-encoded API_KEY:API_SECRET pair passed in the Authorization header.
API keys are account-level credentials - all requests execute in the context of the account owner, not individual sub-users.
The API has no user-management endpoints;
sub-user provisioning, permission assignment, and deprovisioning are exclusively UI operations and cannot be automated or integrated into an identity graph for lifecycle management.
SCIM 2.0 is not supported;
Okta integration exists only for SSO via SAML with no automated provisioning capability.
API quick reference
| Has user API | No |
| Auth method | HTTP Basic Auth (API Key as username, API Secret as password, Base64-encoded) |
| Base URL | Official docs |
| SCIM available | No |
Authentication
Auth method: HTTP Basic Auth (API Key as username, API Secret as password, Base64-encoded)
Setup steps
- Log in to ShipStation and navigate to Account Settings > API Settings.
- Generate an API Key and API Secret.
- Base64-encode the string 'API_KEY:API_SECRET'.
- Pass the encoded value in the Authorization header as: 'Authorization: Basic
'.
User object / data model
User object field mapping is not yet verified for this app.
Core endpoints
List Orders
- Method: GET
- URL:
https://ssapi.shipstation.com/orders - Watch out for: No user-management endpoint exists; this is the primary resource endpoint for reference.
Request example
GET /orders?orderStatus=awaiting_shipment&pageSize=25&page=1
Authorization: Basic <encoded>
Response example
{
"orders": [...],
"total": 150,
"page": 1,
"pages": 6
}
Get Order
- Method: GET
- URL:
https://ssapi.shipstation.com/orders/{orderId} - Watch out for: orderId is ShipStation's internal integer ID, not the store's order number.
Request example
GET /orders/123456789
Authorization: Basic <encoded>
Response example
{
"orderId": 123456789,
"orderNumber": "TEST-001",
"orderStatus": "awaiting_shipment"
}
List Shipments
- Method: GET
- URL:
https://ssapi.shipstation.com/shipments - Watch out for: Voided shipments are included unless filtered with includeShipmentItems parameter.
Request example
GET /shipments?pageSize=100&page=1
Authorization: Basic <encoded>
Response example
{
"shipments": [...],
"total": 200,
"page": 1,
"pages": 2
}
List Stores
- Method: GET
- URL:
https://ssapi.shipstation.com/stores - Watch out for: Returns stores associated with the authenticated account only; no cross-account access.
Request example
GET /stores?showInactive=false
Authorization: Basic <encoded>
Response example
[
{
"storeId": 12345,
"storeName": "My Store",
"marketplaceId": 36
}
]
List Warehouses
- Method: GET
- URL:
https://ssapi.shipstation.com/warehouses - Watch out for: Warehouse management is account-scoped; no user-level warehouse assignment via API.
Request example
GET /warehouses
Authorization: Basic <encoded>
Response example
[
{
"warehouseId": 9876,
"warehouseName": "Main Warehouse",
"isDefault": true
}
]
Rate limits, pagination, and events
- Rate limits: Rate limits are enforced per API key and vary by ShipStation plan. The API returns an X-Rate-Limit-Limit header (requests allowed per window), X-Rate-Limit-Remaining header (requests remaining), and X-Rate-Limit-Reset header (seconds until window resets).
- Rate-limit headers: Yes
- Retry-After header: No
- Rate-limit notes: When the rate limit is exceeded, the API returns HTTP 429. The X-Rate-Limit-Reset header indicates seconds until the window resets. Retry-After header is not documented as returned.
- Pagination method: offset
- Default page size: 100
- Max page size: 500
- Pagination pointer: page and pageSize
| Plan | Limit | Concurrent |
|---|---|---|
| Starter ($9.99/mo) | 40 requests per minute | 0 |
| Growth/Scale plans | 40 requests per minute (standard); higher-volume plans may receive higher limits per ShipStation support | 0 |
- Webhooks available: Yes
- Webhook notes: ShipStation supports webhooks that fire on specific shipping events. Webhooks are configured in the ShipStation UI (Account Settings > Webhooks) or via the API POST /webhooks/subscribe endpoint.
- Alternative event strategy: Polling the /orders or /shipments endpoints with a modifyDateStart filter can substitute for webhook delivery if webhook receipt is unreliable.
- Webhook events: ORDER_NOTIFY, ITEM_ORDER_NOTIFY, SHIP_NOTIFY, ITEM_SHIP_NOTIFY
SCIM API status
- SCIM available: No
- SCIM version: Not documented
- Plan required: Not documented
- Endpoint: Not documented
Limitations:
- ShipStation does not offer a SCIM 2.0 API for user provisioning or deprovisioning.
- User and sub-user management is only available through the ShipStation web UI.
- Okta integration exists but is limited to SSO (SAML); automated provisioning via SCIM is not supported.
Common scenarios
Three integration patterns are well-supported by the current API surface.
For shipment tracking retrieval, paginate GET /shipments with shipDateStart and pageSize=500;
voided shipments are returned by default and must be filtered client-side using the voided boolean field.
For event-driven order processing, subscribe via POST /webhooks/subscribe with an ORDER_NOTIFY or SHIP_NOTIFY event - webhook payloads deliver only a resource_url, requiring a follow-up GET to retrieve the full object.
For multi-store data scoping, call GET /stores after UI-side store creation to retrieve storeId values, then use them as filter parameters on /orders and /shipments calls;
store creation itself cannot be performed via the API.
Automate shipment tracking retrieval
- Authenticate using Base64-encoded API Key:API Secret in the Authorization header.
- GET /shipments?shipDateStart=2024-01-01&pageSize=500&page=1 to retrieve shipments.
- Iterate through pages using the 'pages' field in the response until all records are fetched.
- Extract trackingNumber and carrierCode fields for downstream processing.
Watch out for: Voided shipments are returned by default; filter them out by checking the 'voided' boolean field on each shipment object.
Subscribe to order notifications via webhook
- POST /webhooks/subscribe with body: {"target_url": "https://yourapp.com/hook", "event": "ORDER_NOTIFY", "store_id": null, "friendly_name": "Order Notifier"}
- ShipStation will POST a JSON payload to target_url when new orders are detected.
- Respond with HTTP 200 within the timeout window to acknowledge receipt.
Watch out for: ShipStation webhook payloads contain only a resource_url, not the full order object. A follow-up GET to that URL is required to retrieve order details.
Add a new store/channel to an existing account
- Use the ShipStation web UI to connect a new marketplace or cart (API does not support store creation).
- After creation, call GET /stores to retrieve the new storeId.
- Use the storeId as a filter parameter in subsequent /orders or /shipments calls to scope data to that store.
Watch out for: Store creation and OAuth connections to marketplaces cannot be performed via the ShipStation API; they require UI interaction.
Why building this yourself is a trap
The core integration trap is assuming that API access implies any control over user identity or access state - it does not. ShipStation's API exposes shipping operations only; there is no endpoint to create, update, deactivate, or enumerate sub-users, making it impossible to wire ShipStation into an identity graph for joiner-mover-leaver automation.
Rate limits are enforced at 40 requests per minute on standard plans; HTTP 429 responses include an X-Rate-Limit-Reset header indicating seconds until window reset but no Retry-After header, so retry logic must be built against X-Rate-Limit-Reset explicitly. Pagination is 1-based offset with a maximum pageSize of 500;
the pages field in list responses is the reliable termination signal for full-dataset retrieval loops. The Apiary documentation may lag the live API - always cross-reference with the official help center for current endpoint behavior.
Automate ShipStation workflows without one-off scripts
Stitchflow builds and maintains end-to-end IT automation across your SaaS stack, including apps without APIs. Built for exactly how your company works, with human approvals where they matter.