Overview
The ShipBob Orders API enables you to programmatically create orders, retrieve tracking information, and manage fulfillment. This guide walks you through building a complete orders integration.How It Works
Here’s the complete order lifecycle from creation to delivery tracking:Requirements
Before you begin, ensure:- Your API key has the
orders_writeandorders_readaccess scopes - You have your ShipBob channel ID (get it here)
Step 1: Create an Order
Use the Create Order endpoint to create an order.Make sure to pass the
shipbob_channel_id in the request header. This identifies which channel the order belongs to.POST https://{env}.shipbob.com/{api_version}/order
JSON response
The
reference_id field is your idempotency key. If ShipBob receives two identical requests with the same reference_id + shipbob_channel_id, it will return a 422 error.Step 2: Retrieve Tracking Details
ShipBob offers two workflows for retrieving shipment details:Webhooks
Real time updates via webhooks. Click to jump to this section.
Polling
Poll the API for updates on a schedule. Click to jump to this section.
Webhooks
ShipBob can fire webhooks for shipment events including:- Shipped - When a shipment leaves the warehouse
- Delivered - When the carrier confirms delivery
- Exception - Product out of stock or other fulfillment issues
- On Hold - Invalid address or payment issues
- Cancelled - Shipment was cancelled
- Via Dashboard: Go to Integrations > Webhooks > Add Subscription

- Via API: Use the Create Webhook Subscription endpoint
Polling
Poll the GET Orders endpoint on a recurring schedule (every 15-30 minutes). Key parameters:HasTracking- Filter for orders where tracking is available (shipment has been labeled)IsTrackingUploaded- Use as a sync flag. Set tofalseto find unsynced orders
- Inventory is stocked in multiple fulfillment centers
- Items don’t fit in one box due to size/weight
LabeledCreated, which quickly transitions to Completed. Always loop through the shipments[] array in the order response.
Example: Order with split shipments
Step 3: Mark Tracking as Synced
After syncing tracking to your system, mark shipments as uploaded to prevent re-processing:IsTrackingUploaded flag so future queries with IsTrackingUploaded=false won’t return these shipments.
Retrieve Orders and Shipments
Get a specific order:Search for Orders
Use query parameters on the GET Orders endpoint to search for orders. Common search queries:| Use Case | Query Example |
|---|---|
| Orders with tracking information | order?HasTracking=true&IsTrackingUploaded=false |
| Search by reference ID | order?ReferenceIds=1234762738908 |
| Orders within a date range | order?StartDate=2025-11-01&EndDate=2025-11-30 |
Important Fields
reference_id - Your unique order identifier. Acts as an idempotency key—duplicate reference_id + shipbob_channel_id combinations return a 422 error.
order_number - User-friendly order number for customer service. Does not need to be unique (can match reference_id).
shipping_method - Value like “Standard”, “Expedited”, or “2-Day”. Merchants map this to ShipBob Ship Options that determine SLA and carrier selection. See Ship Options guide.
type - Order type:
DTC- Direct-to-consumer orders (most common)B2B- Business-to-business orders (see B2B Orders guide)
shipbob_channel_id (header) - Identifies which channel the order belongs to. Get your channel ID from the GET Channels endpoint.
products.reference_id - SKU or unique product identifier. Must match a product created in ShipBob (see Product Management Guide).
IsTrackingUploaded - Boolean flag indicating if you’ve synced the tracking to your system. Use this to prevent duplicate processing.
Common Issues
422 error: Duplicate reference_id
422 error: Duplicate reference_id
Each order must have a unique
reference_id within a channel. If you need to resubmit, use a different reference_id or cancel the original order first.Invalid shipping address
Invalid shipping address
Ensure required fields are provided:
address1, city, country (ISO Alpha-2 code), and ideally state and zip_code.How to find my channel ID?
How to find my channel ID?
Call the GET Channels endpoint. Look for the channel with
_write scopes—that’s your integration channel.Order stuck in Exception or On Hold status
Order stuck in Exception or On Hold status
Check the
status_details field in the shipment for specific reasons. Common causes: out of stock, invalid address, missing customs info. See Status Reference for details.Tips
- Poll every 15-30 minutes - Don’t check more frequently than every 5 minutes to avoid rate limits
- API rate limit - 150 requests per minute
- Always use
shipbob_channel_idheader - Prevents retrieving orders from other integrations - Use webhooks + polling fallback - Webhooks for real-time updates, polling as a safety net
- Handle split shipments - Always loop through
order.shipments[]and sync each tracking number separately - Mark tracking as uploaded - Use the
batchUpdateTrackingUploadendpoint to avoid re-processing
