Create a shipment for a sales order
AI agents: read /llms.txt; add .md to any page URL. This page as Markdown: /reference/shipments/v2-sales-order-shipment-create.md. Index of every page and the rules for every call: /llms.txt. Guides and concepts in one file: /llms-full.txt. OpenAPI: /openapi.json.
POST/
Creates an empty shipment for an order: one address, one shipping type. Add its lines with the shipment line operations afterwards.
The shipment takes the team's next shipment number, the starting shipment status, the customer's primary brand profile, and the team's default shipping type unless you send one.
Safe retries: send your own operation_key. Sending the same key with the same fields again returns the shipment already created instead of a second one.
The answer is the shipment. {unique_key} is the order's id (for example V4keXwwxMQyXw7) or its unique_key (ord_…).
Business rules
- A published order needs a customer first: "Select a customer before creating a shipment."
- The same
operation_keywith different fields is refused with 422shipment_create_operation_payload_conflict. Reusing the key of a shipment that was deleted since is refused with 422shipment_create_operation_removed. - Refused when the Shopify order was deleted in Shopify.
Side effects
- Refreshes the order for people who have it open in the web app; on a published order, Customer Portal pages the customer has open refresh too.
Path parameters
Your team slug, shown as Team ID next to your API key in Profile.
- Example
your-team
- Example
The sales order's or quote's
id(a hash id), or itsunique_key(ord_…). The order number (scoped_id) does not work.- Example
V4keXwwxMQyXw7
- Example
Request body
application/json, required.
customer_idstringAccepted but ignored: the shipment always belongs to the order's customer.
customer_profile_idstring | nullAccepted but ignored: the shipment takes the customer's primary brand profile.
delivery_notesstringinternal_notesstringoperation_keystring | nullYour idempotency key for this create, up to 100 characters.
- At most 100 characters
receiver_contact_idstring | nullThe contact who receives it.
scoped_idstringYour own shipment number, without the
SHIP-the answer puts in front of it. Leave it out for the team's next number.shipping_address_idstringThe address to ship to.
shipping_type_idstring | nullA shipping type id. Leave it out for the team's default.
Response
200Successful response.
A shipment.
Child fields (21)
billable_fee_totaldecimal pairShipping charged to the customer. A decimal pair: the amount is
value÷ 10^dp({ "value": 125000, "dp": 4 }is 12.50). Kept with 4 decimal places; an amount never set can come as{ "value": 0, "dp": 0 }. Readdpevery time: it can differ between fields and records.- See Money and quantities.
cost_totaldecimal pairShipping cost. A decimal pair: the amount is
value÷ 10^dp({ "value": 125000, "dp": 4 }is 12.50). Kept with 4 decimal places; an amount never set can come as{ "value": 0, "dp": 0 }. Readdpevery time: it can differ between fields and records.- See Money and quantities.
customer_due_datestring (date-time) | nullThe order's in-hands date. ISO 8601 with offset, or null.
customer_idstring | nulldelivery_notesstring | nullinternal_notesstring | nullis_externalboolean | nullnullin this answer for a new shipment; read the shipment back (Get a shipment) for the stored value,falseunless it was synced from an integration. A repeated create with the sameoperation_keyanswers the stored shipment, withfalse.is_validbooleanitemsarray of objectsShipment lines (list only).
order_scoped_idstringready_to_shipbooleanreceiver_contact_idstring | nullscoped_idstringThe shipment number.
shipment_estimatesarray of objectsShipping estimates (list only).
shipment_packagesarray of objectsPackages (list only).
shipping_address_idstring | nullshipping_type_idstring | nullstatusobject | nullA status, as the status operations return it.
Child fields (9)
A hex color, such as
#2196f3.What customers see in the customer portal. When none is set:
Pendingforstart,In Progressforin_progressandpre_production,Completedforend.The status name people see.
Sort order within its list, lowest first.
Which list the status belongs to:
order,quote,job,shipment,purchase_order,pipelineorcustomer_message.true for a deleted status.
startis the first status of its list andendthe last;pre_productionandin_progressare the ones in between.- One of:
"start","pre_production","in_progress","end"
- One of:
pipeline_idstringThe task preset, for
pipelinestatuses only; absent for other roles.
Errors
401The API key is missing or wrong (
unauthenticated).403You are not allowed to do this.
api_access_not_in_plan: your team's plan doesn't include API access (Pro and above, with an active subscription or trial), so every request answers this until the team upgrades. When your role lacks the permission the operation needs, the body is only{"message": "Insufficient Permission"}. Other refusals use the error envelope, withunauthorizedoruser_is_not_authorized.404Not found.
page_not_found: the team slug is unknown, you are not a member of the team, or an id in the path is not one of this team's.code: null, with a message that starts "No query results for": there is no record with that id.422The request was refused and changed nothing.
validation_failedlists what to fix inerror.fields; other codes name a business rule, explained inerror.message. A few checks answer with only{"message": "..."}. An operation that calls another service (a payment provider, a carrier, an accounting app) can answerconnect_timeout("Please retry again") when that service does not answer in time: the change may or may not have happened there, so read the record back before you retry.- When
- No customer on a published order ("Select a customer before creating a shipment."), or a bad id.
- Fix
- Set the order's customer first, or check the ids.
- When
- The
operation_keywas used before with other fields (shipment_create_operation_payload_conflict), or its shipment was deleted (shipment_create_operation_removed). - Fix
- Resend the first request unchanged, or use a new key.
Related
- POSTAdd, change and remove shipment lines at once
/v2/ api/ store/ {team_slug}/ v2/ shipment/ {unique_key}/ item/ bulk - PUTUpdate a shipment
/v2/ api/ store/ {team_slug}/ v2/ shipment/ {unique_key} - PUTChange the status of a shipment
/v2/ api/ store/ {team_slug}/ v2/ sales_order/ {hash_id}/ shipment/ {id}/ status
