Shipping API
Manage individual shipments: create, confirm, cancel, and track parcels from booking through delivery. Covers the full shipment lifecycle including label and document retrieval, status overrides, consolidated (master) shipments, manifests, and bulk operations.
Shipment booking is asynchronous. Creating or confirming a shipment returns pending; the carrier-confirmed outcome (tracking number, label, or booking error) arrives by webhook.
Errors
Every request is authenticated with x-api-key and tenant-id, and answers 401 when the key is missing or invalid. Every shipment-scoped endpoint resolves the path value as a shipment_id first and then as a partner_shipment_reference, and answers 404 when neither matches. An API key is scoped to one or more merchants; a shipment belonging to a merchant outside that scope, or to another tenant, answers 403. A malformed body, or an unreadable enum value inside it, answers 400. Causes specific to one operation are listed on that operation's response for the status code they produce.
Idempotency
Write endpoints accept an optional Idempotency-Key request header for safe request replay when your integration retries after uncertain network outcomes. Replayed responses include Idempotent-Replayed: true. See https://carriyo.com/docs/api/idempotency/ for the full contract.
Shipments
The shipment object is the backbone of the Shipping API. It represents a grouping of items that are transported together from a starting point to a final destination, in one or more parcels.
The type of shipment can be classified as either FORWARD or REVERSE. A forward shipment moves items from a merchant to a customer; a reverse shipment is the opposite, returning items from a customer to a merchant.
Each shipment is given two identifiers: a shipment_id generated by Carriyo, and a partner_shipment_reference supplied by the merchant.
25 operations · 1 object
The Shipment object
The Shipment object is the central entity of the Shipping API. It carries everything Carriyo needs to book a shipment with a carrier and track it through delivery — origin and destination addresses, items being shipped, parcels and their dimensions, payment information, customs data for cross-border, and the shipment's lifecycle status.
A shipment can be created in draft state (held in Carriyo until your team
confirms) or confirmed directly (booked with a carrier immediately). Reverse
shipments — returns from a customer back to your warehouse — use the same object
with entity_type: REVERSE.
For the conceptual relationship between shipments, orders, and fulfillment orders, see the Domain model.
Properties
Related
- Create shipment — POST /shipments
- Get shipment — GET /shipments/{shipment_id}
- Update shipment — PUT /shipments/{shipment_id}
- E-commerce orders guide — draft → confirm flow
- WMS / OMS guide — confirmed-direct flow
- Cross-border shipments — customs data
/shipmentsCreate shipment
Create a shipment. Returns a unique shipment_id. Either name a carrier_account explicitly or let Carriyo's shipping rules pick one.
Forward vs reverse. Set entity_type to either:
FORWARD: a normal outbound shipment from the merchant to the customer. Omitentity_typeand this is what you get.REVERSE: a return shipment, where the customer sends items back to the merchant.
Draft, confirmed, prebooked. Three creation modes, each with different behavior against the carrier:
Draft (
?draft=true): the shipment is saved in Carriyo for visibility but is not sent to the carrier. Use this when parcel details aren't final yet. The shipment stays indraftuntil you call Confirm shipment.Confirmed (default, no
?draftquery parameter): Carriyo validates the payload, assigns a carrier, and immediately submits the booking request to that carrier. The API responds with statuspendingstraight away, without waiting for the carrier's response. The carrier's outcome (acceptance, rejection, label) arrives via webhook. If Carriyo's own validations fail, the shipment is still created, inerrorstatus with the validation errors in the response body, and the call returns200rather than a client error.Prebooked (
pre_booked: true): register a shipment that was booked outside Carriyo so Carriyo can track it. Once registered, the shipment shows up alongside the rest of your shipments in operational monitoring, reporting, and the branded customer tracking experience. Carriyo does not call the carrier's booking endpoint in this mode, but it does take ownership of tracking the shipment with the carrier from this point on. Supply the existing carrier and tracking number inpre_booking_info:{ "pre_booked": true, "pre_booking_info": { "input_carrier": "DHL", "carrier_tracking_no": "1234567890" } }
After booking. Once the carrier accepts the booking, the shipment status moves to booked and the carrier's tracking number is attached. A label is generated. From that point, all subsequent status changes and label updates are pushed to your webhooks; the response from this endpoint represents only the moment of submission, not the carrier's final decision.
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
| draft | boolean | No | Set to `true` to create the shipment as a draft. The shipment is saved and validated but no carrier is contacted, so nothing is booked until you call **Confirm shipment**. Omit it and the shipment is submitted to the carrier immediately. |
Headers
| Name | Value | Required | Description |
|---|---|---|---|
| Authorization | Bearer YOUR-ACCESS-TOKEN | Yes | OAuth 2.0 bearer token obtained from `POST /oauth/token`. |
| x-api-key | YOUR-API-KEY | Yes | Your tenant's API key, issued in the Carriyo Dashboard. Required on every request except `POST /oauth/token`. |
| tenant-id | YOUR-TENANT-ID | Yes | Your Carriyo tenant ID, shown in the Carriyo Dashboard. Required on every request except `POST /oauth/token`. |
| Content-Type | application/json | Yes | Media type of the request body. |
Header parameters
| Name | Type | Required | Description |
|---|---|---|---|
| Idempotency-Key | string | No | Optional client-generated key that identifies one logical operation. Reuse the same key when retrying with the same payload. Replays the stored response. See https://carriyo.com/docs/api/idempotency/. |
Request body
application/jsonSchema: shipment-requestrequired- References the merchant supplies for a shipment.
partner_order_referenceis usually the customer-facing order number; it need not be unique, so every shipment of one order carries the same value.partner_shipment_referencemust be unique across the tenant. Both are required on create — neither is derived from the other, and an empty value is rejected. - Pickup address. Either name a predefined location, by Carriyo's
partner_location_idor your ownpartner_location_code, and Carriyo copies its contact and address fields, or pass a free-form address. Forward shipments must name a predefined location; reverse shipments may use either, since the pickup is the customer's own address. - Dropoff address. Either name a predefined location, by Carriyo's
partner_location_idor your ownpartner_location_code, and Carriyo copies its contact and address fields, or pass a free-form address. Reverse shipments must name a predefined location; forward shipments may use either, since the dropoff is the customer's own address. - Set to
trueto create this shipment as a consolidated parent. Requiresconsolidated_child_shipmentsto be supplied. This is a deferred validation: ifconsolidated_child_shipmentsis missing when Carriyo books the shipment with the carrier, the shipment is set to statuserror. It is not rejected at create time. - Set to
truewhen registering a shipment that has already been booked with a carrier outside Carriyo. Requirespre_booking_info. This is a deferred validation: ifpre_booking_infois missing when Carriyo books the shipment, the shipment is set to statuserror. It is not rejected at create time.
Responses
shipment-objecterror-responseThe request was rejected. One of:
referencesis missing, orpartner_order_referenceorpartner_shipment_referenceis empty.partner_shipment_referencealready exists for the tenant.merchantis missing from the body, or names a merchant that does not exist or is deactivated.- both
parcelsandfreight.packagesare supplied. - the tenant's monthly shipment limit is reached.
error-responseNeed the full machine-readable spec? Download the OpenAPI document →
/shipmentsList shipments
Return a paginated list of shipments matching the search and filter parameters. The
search_string parameter matches from the start of a word across carrier tracking number,
order reference, shipment reference, customer name, email, and similar fields, so acme
finds Acme Trading while cme finds nothing. An all-digit search_string is the
exception: it also matches the end of the pickup or dropoff contact phone number, so the
last few digits are enough to find a shipment. Combine it with the other filters, sort, and
pagination parameters as needed.
Each request through the API counts one against the account's monthly shipment-list quota, a separate allowance from the shipment quota. The counter resets each calendar month. A request is refunded only when the search itself fails with a server error; a timeout still counts. An exhausted quota returns 429 with the limit in the message.
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
| search_string | string | No | The search string to find shipments using shipment data such as carrier tracking number, order reference, shipment reference, customer name, email etc. |
| order_ref | string | No | The string to be used to fetch shipments for a given order reference. |
| merchant | string | No | The merchant parameter filters shipments for a given merchant. This parameter can be used multiple times to filter results for multiple merchants. |
| shipment_type | string | No | The shipment type can either be `forward` or `reverse`. If not passed, then both types of shipments will be included in the results. |
| creation_date_from | string | No | The start date in ISO 8601 format to filter the results using shipment creation date. |
| creation_date_to | string | No | The end date in ISO 8601 format to filter the results using shipment creation date. |
| update_date_from | string | No | The start date in ISO 8601 format to filter results by shipment update date. Creation date is filtered separately with `creation_date_from`. |
| update_date_to | string | No | The end date in ISO 8601 format to filter results by shipment update date. Creation date is filtered separately with `creation_date_to`. |
| page | string | No | The page number of the result set, starting from 0. Defaults to the first page (page 0). |
| page_size | string | No | The number of results in the response, at most 100. Defaults to 10. A value above 100 is rejected with `400`, as is a request whose `page_size * (page + 1)` exceeds 10,000. |
Headers
| Name | Value | Required | Description |
|---|---|---|---|
| Authorization | Bearer YOUR-ACCESS-TOKEN | Yes | OAuth 2.0 bearer token obtained from `POST /oauth/token`. |
| x-api-key | YOUR-API-KEY | Yes | Your tenant's API key, issued in the Carriyo Dashboard. Required on every request except `POST /oauth/token`. |
| tenant-id | YOUR-TENANT-ID | Yes | Your Carriyo tenant ID, shown in the Carriyo Dashboard. Required on every request except `POST /oauth/token`. |
Responses
shipment-listmiddleware-error-responseThe request was rejected. One of:
pageorpage_sizeis not a number,page_sizeis above 100, orpage_size * (page + 1)exceeds 10,000.search_stringruns to more than 100 words.
middleware-error-responsemiddleware-error-responseNeed the full machine-readable spec? Download the OpenAPI document →
/shipments/{shipment_id}Get shipment
Return the latest shipment object, including the most up-to-date status and tracking information.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
| shipment_id | string | Yes | Carriyo `shipment_id` or your own `partner_shipment_reference`. The value is matched against `shipment_id` first, then `partner_shipment_reference`. |
Headers
| Name | Value | Required | Description |
|---|---|---|---|
| Authorization | Bearer YOUR-ACCESS-TOKEN | Yes | OAuth 2.0 bearer token obtained from `POST /oauth/token`. |
| x-api-key | YOUR-API-KEY | Yes | Your tenant's API key, issued in the Carriyo Dashboard. Required on every request except `POST /oauth/token`. |
| tenant-id | YOUR-TENANT-ID | Yes | Your Carriyo tenant ID, shown in the Carriyo Dashboard. Required on every request except `POST /oauth/token`. |
Responses
shipment-objecterror-responseNeed the full machine-readable spec? Download the OpenAPI document →
/shipments/{shipment_id}Update shipment
Partially update an existing shipment. Allowed when the shipment is in draft, error,
or cancelled; any other status returns 400. (Cancelled shipments are editable so you
can correct them before reprocessing.)
The body merges into the stored shipment as follows:
- Top-level fields you include are replaced wholesale. A top-level field you leave out
keeps its current value, but one you send overwrites the stored value entirely — the
merge does not reach inside it. To change a single pickup postcode you must still send
the whole
pickupobject; any field you omit inside it is reset. - An explicit
nullclears a field.carrier_account: nullunassigns the carrier. custom_attributesandcarriyo_metadataare the exceptions and merge entry by entry: add or change one without supplying the others, and set a value tonullto remove it.carriyo_metadataentries are matched onname.
Every PATCH resets post_shipping_info to its draft state, keeping documents you uploaded.
Changing references.partner_shipment_reference is allowed here, and is rejected when the
new value already belongs to another shipment.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
| shipment_id | string | Yes | Carriyo `shipment_id` or your own `partner_shipment_reference`. The value is matched against `shipment_id` first, then `partner_shipment_reference`. |
Headers
| Name | Value | Required | Description |
|---|---|---|---|
| Authorization | Bearer YOUR-ACCESS-TOKEN | Yes | OAuth 2.0 bearer token obtained from `POST /oauth/token`. |
| x-api-key | YOUR-API-KEY | Yes | Your tenant's API key, issued in the Carriyo Dashboard. Required on every request except `POST /oauth/token`. |
| tenant-id | YOUR-TENANT-ID | Yes | Your Carriyo tenant ID, shown in the Carriyo Dashboard. Required on every request except `POST /oauth/token`. |
| Content-Type | application/json | Yes | Media type of the request body. |
Header parameters
| Name | Type | Required | Description |
|---|---|---|---|
| Idempotency-Key | string | No | Optional client-generated key that identifies one logical operation. Reuse the same key when retrying with the same payload. Replays the stored response. See https://carriyo.com/docs/api/idempotency/. |
Request body
application/jsonSchema: shipment-requestrequired- References the merchant supplies for a shipment.
partner_order_referenceis usually the customer-facing order number; it need not be unique, so every shipment of one order carries the same value.partner_shipment_referencemust be unique across the tenant. Both are required on create — neither is derived from the other, and an empty value is rejected. - Pickup address. Either name a predefined location, by Carriyo's
partner_location_idor your ownpartner_location_code, and Carriyo copies its contact and address fields, or pass a free-form address. Forward shipments must name a predefined location; reverse shipments may use either, since the pickup is the customer's own address. - Dropoff address. Either name a predefined location, by Carriyo's
partner_location_idor your ownpartner_location_code, and Carriyo copies its contact and address fields, or pass a free-form address. Reverse shipments must name a predefined location; forward shipments may use either, since the dropoff is the customer's own address. - Set to
trueto create this shipment as a consolidated parent. Requiresconsolidated_child_shipmentsto be supplied. This is a deferred validation: ifconsolidated_child_shipmentsis missing when Carriyo books the shipment with the carrier, the shipment is set to statuserror. It is not rejected at create time. - Set to
truewhen registering a shipment that has already been booked with a carrier outside Carriyo. Requirespre_booking_info. This is a deferred validation: ifpre_booking_infois missing when Carriyo books the shipment, the shipment is set to statuserror. It is not rejected at create time.
Responses
shipment-objecterror-responseThe request was rejected. One of:
- the shipment is not
draft,errororcancelled. - the new
partner_shipment_referencealready belongs to another shipment. - the carrier account named in the body does not resolve.
- a field is longer than its configured maximum.
Need the full machine-readable spec? Download the OpenAPI document →
/shipments/{shipment_id}Replace shipment
Fully replace a shipment. The request body overwrites the stored shipment: any field you
omit is reset, including nested objects like pickup, dropoff, parcels and items.
To change a few fields and leave the rest intact, use Update shipment (PATCH) instead.
Some fields survive the replacement whatever you send: tenant, merchant, entity_type,
creation_date, manifest_id, version, return_request_id, fulfillment_order_id,
original_promised_delivery_date, source, creation_source, update_source and the
retry metadata.
Allowed in draft, error and cancelled, the same statuses as PATCH; any other status
returns 400. Unlike PATCH, the body is required, and references.partner_shipment_reference
cannot be changed.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
| shipment_id | string | Yes | Carriyo `shipment_id` or your own `partner_shipment_reference`. The value is matched against `shipment_id` first, then `partner_shipment_reference`. |
Headers
| Name | Value | Required | Description |
|---|---|---|---|
| Authorization | Bearer YOUR-ACCESS-TOKEN | Yes | OAuth 2.0 bearer token obtained from `POST /oauth/token`. |
| x-api-key | YOUR-API-KEY | Yes | Your tenant's API key, issued in the Carriyo Dashboard. Required on every request except `POST /oauth/token`. |
| tenant-id | YOUR-TENANT-ID | Yes | Your Carriyo tenant ID, shown in the Carriyo Dashboard. Required on every request except `POST /oauth/token`. |
| Content-Type | application/json | Yes | Media type of the request body. |
Header parameters
| Name | Type | Required | Description |
|---|---|---|---|
| Idempotency-Key | string | No | Optional client-generated key that identifies one logical operation. Reuse the same key when retrying with the same payload. Replays the stored response. See https://carriyo.com/docs/api/idempotency/. |
Request body
application/jsonSchema: shipment-requestrequired- References the merchant supplies for a shipment.
partner_order_referenceis usually the customer-facing order number; it need not be unique, so every shipment of one order carries the same value.partner_shipment_referencemust be unique across the tenant. Both are required on create — neither is derived from the other, and an empty value is rejected. - Pickup address. Either name a predefined location, by Carriyo's
partner_location_idor your ownpartner_location_code, and Carriyo copies its contact and address fields, or pass a free-form address. Forward shipments must name a predefined location; reverse shipments may use either, since the pickup is the customer's own address. - Dropoff address. Either name a predefined location, by Carriyo's
partner_location_idor your ownpartner_location_code, and Carriyo copies its contact and address fields, or pass a free-form address. Reverse shipments must name a predefined location; forward shipments may use either, since the dropoff is the customer's own address. - Set to
trueto create this shipment as a consolidated parent. Requiresconsolidated_child_shipmentsto be supplied. This is a deferred validation: ifconsolidated_child_shipmentsis missing when Carriyo books the shipment with the carrier, the shipment is set to statuserror. It is not rejected at create time. - Set to
truewhen registering a shipment that has already been booked with a carrier outside Carriyo. Requirespre_booking_info. This is a deferred validation: ifpre_booking_infois missing when Carriyo books the shipment, the shipment is set to statuserror. It is not rejected at create time.
Responses
shipment-objecterror-responseThe request was rejected. One of:
- the body is missing.
- the shipment is not
draft,errororcancelled. references.partner_shipment_referencediffers from the stored value.- a field is longer than its configured maximum.
Need the full machine-readable spec? Download the OpenAPI document →
/shipments/{shipment_id}/confirmConfirm shipment
Book a draft shipment for the first time, or retry booking a shipment that's currently
in error status.
Eligible statuses: draft, error. For any other status that still allows
re-booking (e.g. booked, cancelled, returned), use Reprocess shipment
(POST /shipments/{shipment_id}/reprocess) instead.
Optional updates. The request body is optional. Supply it if you want to amend the shipment as part of
confirming. Merge rules match Update shipment (PATCH):
- A top-level field you leave out keeps its value; one you send replaces the stored value
wholesale, so send nested objects like
pickupcomplete. An explicitnullclears a field. custom_attributesandcarriyo_metadatamerge entry by entry. Passnullto remove one.
Booking flow. Carriyo moves the shipment to pending, assigns a carrier, and submits the booking
request to that carrier. The API responds immediately with status pending, without
waiting for the carrier's reply. If the carrier accepts, the status becomes booked
and the tracking number is attached. If the carrier rejects, the status becomes error
with the carrier's reason in post_shipping_info.error_details.
Booking outcomes and label generation are delivered via webhooks, not in the response to this call.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
| shipment_id | string | Yes | Carriyo `shipment_id` or your own `partner_shipment_reference`. The value is matched against `shipment_id` first, then `partner_shipment_reference`. |
Headers
| Name | Value | Required | Description |
|---|---|---|---|
| Authorization | Bearer YOUR-ACCESS-TOKEN | Yes | OAuth 2.0 bearer token obtained from `POST /oauth/token`. |
| x-api-key | YOUR-API-KEY | Yes | Your tenant's API key, issued in the Carriyo Dashboard. Required on every request except `POST /oauth/token`. |
| tenant-id | YOUR-TENANT-ID | Yes | Your Carriyo tenant ID, shown in the Carriyo Dashboard. Required on every request except `POST /oauth/token`. |
| Content-Type | application/json | Yes | Media type of the request body. |
Header parameters
| Name | Type | Required | Description |
|---|---|---|---|
| Idempotency-Key | string | No | Optional client-generated key that identifies one logical operation. Reuse the same key when retrying with the same payload. Replays the stored response. See https://carriyo.com/docs/api/idempotency/. |
Request body
application/jsonSchema: shipment-patch-request- Pickup address. Either name a predefined location, by Carriyo's
partner_location_idor your ownpartner_location_code, and Carriyo copies its contact and address fields, or pass a free-form address. Forward shipments must name a predefined location; reverse shipments may use either, since the pickup is the customer's own address. - Dropoff address. Either name a predefined location, by Carriyo's
partner_location_idor your ownpartner_location_code, and Carriyo copies its contact and address fields, or pass a free-form address. Reverse shipments must name a predefined location; forward shipments may use either, since the dropoff is the customer's own address. - Optional. The promised delivery date to the end customer, in ISO 8601 format. If omitted, Carriyo will set the promised delivery date from the scheduled delivery window when present, or otherwise from service level configuration. Example:
2020-09-03T17:07:05.000+01:00, or2020-09-03T17:07:05.000Zfor UTC.
Responses
shipment-objecterror-responseThe request was rejected. One of:
- the shipment is not
draftorerror. - the shipment is a consolidated parent still awaiting its booking confirmation.
Need the full machine-readable spec? Download the OpenAPI document →
/shipments/{shipment_id}/reprocessReprocess shipment
Re-book a shipment that's no longer in draft. Confirm shipment only handles draft
and error; this endpoint covers the wider list of statuses below. For error, either
endpoint works.
Eligible statuses: booked, ready_to_ship, error, cancelled,
cancelled_by_carrier, out_for_collection, failed_collection_attempt,
ready_for_return, return_in_transit, returned.
Typical uses:
- Retry after a transient carrier error.
- Switch carrier or routing after the original carrier cancelled or rejected the booking.
- Correct addresses, parcels, or other shipment data and re-submit.
- Re-book during a return or reverse-logistics flow.
Optional updates. The request body is optional. Supply it to amend shipment data as part of reprocessing.
Merge rules match Update shipment (PATCH):
- A top-level field you leave out keeps its value; one you send replaces the stored value
wholesale, so send nested objects like
pickupcomplete. An explicitnullclears a field. custom_attributesandcarriyo_metadatamerge entry by entry. Passnullto remove one.
Booking flow. Carriyo moves the shipment to pending, re-assigns a carrier (or keeps the one specified
in the body), and submits the booking request. The API responds immediately as pending,
without waiting for the carrier. If the carrier accepts, status becomes booked with the
tracking number attached; if rejected, status becomes error with details in
post_shipping_info.error_details. Subsequent booking outcomes and label updates flow
through webhooks.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
| shipment_id | string | Yes | Carriyo `shipment_id` or your own `partner_shipment_reference`. The value is matched against `shipment_id` first, then `partner_shipment_reference`. |
Headers
| Name | Value | Required | Description |
|---|---|---|---|
| Authorization | Bearer YOUR-ACCESS-TOKEN | Yes | OAuth 2.0 bearer token obtained from `POST /oauth/token`. |
| x-api-key | YOUR-API-KEY | Yes | Your tenant's API key, issued in the Carriyo Dashboard. Required on every request except `POST /oauth/token`. |
| tenant-id | YOUR-TENANT-ID | Yes | Your Carriyo tenant ID, shown in the Carriyo Dashboard. Required on every request except `POST /oauth/token`. |
| Content-Type | application/json | Yes | Media type of the request body. |
Header parameters
| Name | Type | Required | Description |
|---|---|---|---|
| Idempotency-Key | string | No | Optional client-generated key that identifies one logical operation. Reuse the same key when retrying with the same payload. Replays the stored response. See https://carriyo.com/docs/api/idempotency/. |
Request body
application/jsonSchema: shipment-patch-request- Pickup address. Either name a predefined location, by Carriyo's
partner_location_idor your ownpartner_location_code, and Carriyo copies its contact and address fields, or pass a free-form address. Forward shipments must name a predefined location; reverse shipments may use either, since the pickup is the customer's own address. - Dropoff address. Either name a predefined location, by Carriyo's
partner_location_idor your ownpartner_location_code, and Carriyo copies its contact and address fields, or pass a free-form address. Reverse shipments must name a predefined location; forward shipments may use either, since the dropoff is the customer's own address. - Optional. The promised delivery date to the end customer, in ISO 8601 format. If omitted, Carriyo will set the promised delivery date from the scheduled delivery window when present, or otherwise from service level configuration. Example:
2020-09-03T17:07:05.000+01:00, or2020-09-03T17:07:05.000Zfor UTC.
Responses
shipment-objecterror-responseThe request was rejected. One of:
- the shipment is not
booked,ready_to_ship,error,cancelled,cancelled_by_carrier,out_for_collection,failed_collection_attempt,ready_for_return,return_in_transitorreturned. - the shipment is a consolidated parent still awaiting its booking confirmation.
- re-booking with the same carrier from a status that does not allow it.
Need the full machine-readable spec? Download the OpenAPI document →
/shipments/{shipment_id}/ready-to-shipReady to ship
Mark a shipment as ready to ship. Allowed from booked, out_for_collection and
failed_collection_attempt; any other status is rejected with 400.
The carrier is asked to arrange a pickup only when the body carries a full collection window
(scheduled_from with scheduled_to) or sets schedule_pickup, and no pickup is already
pending or arranged. Otherwise the status is set and the carrier is not contacted.
Where a pickup is requested, or the carrier has its own ready-to-ship API, the change is
asynchronous: the response still carries the previous status, and ready_to_ship lands when
the carrier confirms. Watch post_shipping_info.async_statuses.ready_to_ship.
Use with care. For carriers that operate pre-agreed line hauls or fixed daily pickup routes, sending an ad-hoc ready-to-ship notification can interfere with the carrier's own scheduling. Only call this endpoint for carriers and accounts configured to expect it.
The body is optional. Include it to update parcel information (weight, dimensions, count) at
the same time, which is often when the final parcel details become known, or to set
schedule_pickup and suppress_communication. ready_to_ship_date defaults to now.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
| shipment_id | string | Yes | Carriyo `shipment_id` or your own `partner_shipment_reference`. The value is matched against `shipment_id` first, then `partner_shipment_reference`. |
Headers
| Name | Value | Required | Description |
|---|---|---|---|
| Authorization | Bearer YOUR-ACCESS-TOKEN | Yes | OAuth 2.0 bearer token obtained from `POST /oauth/token`. |
| x-api-key | YOUR-API-KEY | Yes | Your tenant's API key, issued in the Carriyo Dashboard. Required on every request except `POST /oauth/token`. |
| tenant-id | YOUR-TENANT-ID | Yes | Your Carriyo tenant ID, shown in the Carriyo Dashboard. Required on every request except `POST /oauth/token`. |
| Content-Type | application/json | Yes | Media type of the request body. |
Header parameters
| Name | Type | Required | Description |
|---|---|---|---|
| Idempotency-Key | string | No | Optional client-generated key that identifies one logical operation. Reuse the same key when retrying with the same payload. Replays the stored response. See https://carriyo.com/docs/api/idempotency/. |
Request body
application/jsonSchema: ready-to-ship-requestResponses
shipment-objecterror-responseThe request was rejected. One of:
- the shipment is not
booked,out_for_collectionorfailed_collection_attempt. - a ready-to-ship request is already pending for this shipment.
- a collection window is in the past, or starts before the order date.
error-responseNeed the full machine-readable spec? Download the OpenAPI document →
/shipments/{shipment_id}/cancelCancel shipment
Cancel a shipment before it ships. Allowed from draft, pending, error, booked,
ready_to_ship, out_for_collection, failed_collection_attempt and
cancelled_by_carrier. Any other status returns 400, delivered and returned among
them. Cancelling an already cancelled shipment changes nothing and returns 200.
Whether the carrier is called depends on how far the shipment had got, not on what the
carrier supports: the booking is cancelled with the carrier from booked, ready_to_ship,
out_for_collection, failed_collection_attempt and cancelled_by_carrier, unless the
shipment was pre-booked. In that case carrier_status becomes Pending Cancellation
immediately.
The response does not show the cancellation. The status change is queued and applied
asynchronously, so the shipment returned here still carries its previous status. Read the
shipment again, or wait for the webhook, to see cancelled.
The body is optional. Include update_reason_code to record why; the value can be one of
Carriyo's standard reason codes or a custom code configured for your merchant.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
| shipment_id | string | Yes | Carriyo `shipment_id` or your own `partner_shipment_reference`. The value is matched against `shipment_id` first, then `partner_shipment_reference`. |
Headers
| Name | Value | Required | Description |
|---|---|---|---|
| Authorization | Bearer YOUR-ACCESS-TOKEN | Yes | OAuth 2.0 bearer token obtained from `POST /oauth/token`. |
| x-api-key | YOUR-API-KEY | Yes | Your tenant's API key, issued in the Carriyo Dashboard. Required on every request except `POST /oauth/token`. |
| tenant-id | YOUR-TENANT-ID | Yes | Your Carriyo tenant ID, shown in the Carriyo Dashboard. Required on every request except `POST /oauth/token`. |
| Content-Type | application/json | Yes | Media type of the request body. |
Header parameters
| Name | Type | Required | Description |
|---|---|---|---|
| Idempotency-Key | string | No | Optional client-generated key that identifies one logical operation. Reuse the same key when retrying with the same payload. Replays the stored response. See https://carriyo.com/docs/api/idempotency/. |
Request body
application/json- Any one of the standard reason codes (below) or custom reason codes defined by the merchant. The standard reason codes are listed at https://carriyo.com/docs/reference/reason-codes/
Responses
shipment-objecterror-responseThe request was rejected. One of:
- the current status does not allow cancellation.
update_reason_codedoes not exist for the tenant, or is not allowed forcancelled.
Need the full machine-readable spec? Download the OpenAPI document →
/shipments/{shipment_id}/update-statusUpdate status
Set the shipment status manually. Use this when:
- Recording a merchant-controlled status such as
shipped,delivery_confirmed, orreturn_confirmed, which the carrier doesn't emit. - Overriding an incorrect carrier status. For example, if the carrier reported
deliveredbut the parcel actually came back to the warehouse, set the status toreturned. - Filling in a status the carrier failed to report. For example, if you know the
parcel was delivered but no
deliveredevent came through, set it manually here.
The response does not show the new status. The change is queued and applied asynchronously, so the shipment returned here still carries its previous status. Read the shipment again, or wait for the webhook, to see the change.
Include update_reason_code to record why the status was set; the value can be one of
Carriyo's standard reason codes or a custom code configured for your merchant. Set
suppress_communication to true to make the change without sending the customer
notifications the new status would normally trigger.
Allowed transitions. The full transition matrix below shows every current → new_status change permitted
by the platform. Any transition not listed returns 400.
new_status |
Allowed current status |
|---|---|
shipped |
booked, cancelled_by_carrier, failed_collection_attempt, ready_to_ship, out_for_collection |
out_for_delivery |
awaiting_customer_collection, delayed, failed_delivery_attempt, in_transit, missing, ready_for_return, return_in_transit, shipped, suspended |
delivered |
awaiting_customer_collection, cancelled, delayed, delivery_confirmed, failed_delivery_attempt, in_transit, missing, out_for_delivery, ready_for_return, return_in_transit, returned, shipped, suspended |
delivery_confirmed |
delivered |
return_in_transit |
awaiting_customer_collection, delayed, failed_delivery_attempt, in_transit, missing, out_for_delivery, ready_for_return, shipped, suspended, out_for_collection |
returned |
awaiting_customer_collection, cancelled, delayed, delivered, failed_delivery_attempt, in_transit, missing, out_for_delivery, ready_for_return, return_confirmed, return_in_transit, shipped, suspended |
return_confirmed |
returned |
Most integrations only ever set the merchant-controlled statuses (
shipped,delivery_confirmed,return_confirmed). The wider matrix exists for override and correction scenarios.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
| shipment_id | string | Yes | Carriyo `shipment_id` or your own `partner_shipment_reference`. The value is matched against `shipment_id` first, then `partner_shipment_reference`. |
Headers
| Name | Value | Required | Description |
|---|---|---|---|
| Authorization | Bearer YOUR-ACCESS-TOKEN | Yes | OAuth 2.0 bearer token obtained from `POST /oauth/token`. |
| x-api-key | YOUR-API-KEY | Yes | Your tenant's API key, issued in the Carriyo Dashboard. Required on every request except `POST /oauth/token`. |
| tenant-id | YOUR-TENANT-ID | Yes | Your Carriyo tenant ID, shown in the Carriyo Dashboard. Required on every request except `POST /oauth/token`. |
| Content-Type | application/json | Yes | Media type of the request body. |
Header parameters
| Name | Type | Required | Description |
|---|---|---|---|
| Idempotency-Key | string | No | Optional client-generated key that identifies one logical operation. Reuse the same key when retrying with the same payload. Replays the stored response. See https://carriyo.com/docs/api/idempotency/. |
Request body
application/jsonrequired- Values:
pendingerrorbookedready_to_shipshippedout_for_deliverydeliveredcancelledcancelled_by_carrierfailed_collection_attemptin_transitawaiting_customer_collectiondelivery_confirmedfailed_delivery_attemptready_for_returnreturn_in_transitreturnedreturn_confirmedsuspendedmissingdelayed
Responses
shipment-objecterror-responseThe request was rejected. One of:
- the transition from the current status to
new_statusis not allowed, including whennew_statusis missing. update_dateis earlier than the date already recorded for the current status.update_reason_codedoes not exist for the tenant, or is not allowed for the requested status.
Need the full machine-readable spec? Download the OpenAPI document →
/shipments/{shipment_id}/label/refreshRefresh label
Re-request the default shipping label from the carrier when the label is missing on a booked shipment. Use this if the label URL is absent or returned a download error and you need Carriyo to fetch a fresh one.
A shipment with no carrier assigned is a no-op: the call returns 200 having done nothing.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
| shipment_id | string | Yes | Carriyo `shipment_id` or your own `partner_shipment_reference`. The value is matched against `shipment_id` first, then `partner_shipment_reference`. |
Headers
| Name | Value | Required | Description |
|---|---|---|---|
| Authorization | Bearer YOUR-ACCESS-TOKEN | Yes | OAuth 2.0 bearer token obtained from `POST /oauth/token`. |
| x-api-key | YOUR-API-KEY | Yes | Your tenant's API key, issued in the Carriyo Dashboard. Required on every request except `POST /oauth/token`. |
| tenant-id | YOUR-TENANT-ID | Yes | Your Carriyo tenant ID, shown in the Carriyo Dashboard. Required on every request except `POST /oauth/token`. |
Header parameters
| Name | Type | Required | Description |
|---|---|---|---|
| Idempotency-Key | string | No | Optional client-generated key that identifies one logical operation. Reuse the same key when retrying with the same payload. Replays the stored response. See https://carriyo.com/docs/api/idempotency/. |
Responses
draft, pending or error.Schema: error-responseNeed the full machine-readable spec? Download the OpenAPI document →
/shipments/{shipment_id}/commercial-invoice/refreshRefresh commercial invoice
Re-fetch or regenerate the commercial invoice for a cross-border shipment from the carrier.
Use this when customs data was corrected after the original booking and you need the carrier to issue a new commercial invoice that reflects the corrected information. Typical triggers include:
- Item descriptions or quantities updated post-booking.
- HS code added or corrected.
- A registration number (
VAT,IOSS,EOR, etc.) added on the seller, importer, or exporter. - Incoterms changed mid-flight, for example flipping
DAPtoDDP.
It fetches a first invoice; it does not replace one. Where the shipment already carries a carrier-issued commercial invoice, the call returns having done nothing. Reprocess the shipment when you need the carrier to reissue.
The shipment must be cross-border and must not be in draft, pending or error. A
refresh already in flight is rejected with 400.
Only meaningful for carriers that produce commercial invoices through their API. Carriers that do not will reject the request asynchronously, so the refusal arrives later rather than in this response.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
| shipment_id | string | Yes | Carriyo `shipment_id` or your own `partner_shipment_reference`. The value is matched against `shipment_id` first, then `partner_shipment_reference`. |
Headers
| Name | Value | Required | Description |
|---|---|---|---|
| Authorization | Bearer YOUR-ACCESS-TOKEN | Yes | OAuth 2.0 bearer token obtained from `POST /oauth/token`. |
| x-api-key | YOUR-API-KEY | Yes | Your tenant's API key, issued in the Carriyo Dashboard. Required on every request except `POST /oauth/token`. |
| tenant-id | YOUR-TENANT-ID | Yes | Your Carriyo tenant ID, shown in the Carriyo Dashboard. Required on every request except `POST /oauth/token`. |
Header parameters
| Name | Type | Required | Description |
|---|---|---|---|
| Idempotency-Key | string | No | Optional client-generated key that identifies one logical operation. Reuse the same key when retrying with the same payload. Replays the stored response. See https://carriyo.com/docs/api/idempotency/. |
Responses
error-responseThe request was rejected. One of:
- the shipment is
draft,pendingorerror, or is not cross-border. - an invoice fetch is already in flight for this shipment.
Need the full machine-readable spec? Download the OpenAPI document →
/shipments/{shipment_id}/estimate-shipping-costEstimate shipping cost
Get a cost estimate for a shipment. The estimate is sourced from the configured costing
profile or, where available, from the carrier's live rating API, and is both returned on the
shipment and saved to it as estimated_shipping_cost.
There is no status rule: it works before or after booking. The shipment must already have a
carrier_account that resolves, otherwise the call is rejected with 400. The rating call is
made while you wait, so this is slower than the other shipment reads.
Useful for rate-shopping or for surfacing shipping cost on a checkout page before committing to the booking.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
| shipment_id | string | Yes | Carriyo `shipment_id` or your own `partner_shipment_reference`. The value is matched against `shipment_id` first, then `partner_shipment_reference`. |
Headers
| Name | Value | Required | Description |
|---|---|---|---|
| Authorization | Bearer YOUR-ACCESS-TOKEN | Yes | OAuth 2.0 bearer token obtained from `POST /oauth/token`. |
| x-api-key | YOUR-API-KEY | Yes | Your tenant's API key, issued in the Carriyo Dashboard. Required on every request except `POST /oauth/token`. |
| tenant-id | YOUR-TENANT-ID | Yes | Your Carriyo tenant ID, shown in the Carriyo Dashboard. Required on every request except `POST /oauth/token`. |
Header parameters
| Name | Type | Required | Description |
|---|---|---|---|
| Idempotency-Key | string | No | Optional client-generated key that identifies one logical operation. Reuse the same key when retrying with the same payload. Replays the stored response. See https://carriyo.com/docs/api/idempotency/. |
Responses
shipment-objecterror-responseThe request was rejected. One of:
- the shipment has no
carrier_accountassigned. - the assigned carrier account does not resolve.
Need the full machine-readable spec? Download the OpenAPI document →
/shipments/{shipment_id}/update-delivery-promiseUpdate delivery promise
Update the promised delivery date displayed to the customer on the branded tracking page
and used in your own SLA tracking. Rejected once the shipment reaches delivered,
delivery_confirmed, returned, return_confirmed, ready_for_return,
return_in_transit or cancelled. The new date must be at least a minute in the future.
The first change stamps original_promised_delivery_date, so the original commitment stays
visible. A shipment webhook fires, and the customer is notified.
This only updates the promise in Carriyo. It does not change the carrier's actual delivery commitment.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
| shipment_id | string | Yes | Carriyo `shipment_id` or your own `partner_shipment_reference`. The value is matched against `shipment_id` first, then `partner_shipment_reference`. |
Headers
| Name | Value | Required | Description |
|---|---|---|---|
| Authorization | Bearer YOUR-ACCESS-TOKEN | Yes | OAuth 2.0 bearer token obtained from `POST /oauth/token`. |
| x-api-key | YOUR-API-KEY | Yes | Your tenant's API key, issued in the Carriyo Dashboard. Required on every request except `POST /oauth/token`. |
| tenant-id | YOUR-TENANT-ID | Yes | Your Carriyo tenant ID, shown in the Carriyo Dashboard. Required on every request except `POST /oauth/token`. |
| Content-Type | application/json | Yes | Media type of the request body. |
Header parameters
| Name | Type | Required | Description |
|---|---|---|---|
| Idempotency-Key | string | No | Optional client-generated key that identifies one logical operation. Reuse the same key when retrying with the same payload. Replays the stored response. See https://carriyo.com/docs/api/idempotency/. |
Request body
application/jsonSchema: promised-delivery-date-requestrequiredResponses
shipment-objecterror-responseThe request was rejected. One of:
revised_promised_delivery_dateis not at least a minute in the future.- the shipment is
delivered,delivery_confirmed,returned,return_confirmed,ready_for_return,return_in_transitorcancelled.
Need the full machine-readable spec? Download the OpenAPI document →
/shipments/{shipment_id}/schedule-deliverySchedule delivery
Update the scheduled delivery date for a shipment. Rejected once the shipment reaches
delivered, delivery_confirmed, returned, return_confirmed, cancelled or error.
Note: most carriers don't accept schedule updates after the original booking, so this change is recorded in Carriyo (and reflected on the branded tracking page) but is not propagated to the carrier post-booking.
Two shapes are supported:
Time window, using
scheduled_fromandscheduled_to:{ "scheduled_from": "2022-01-01T10:00:00.000Z", "scheduled_to": "2022-01-01T12:00:00.000Z" }A named slot on a day, using
scheduled_datewithscheduled_time_slot_id:{ "scheduled_date": "2022-01-01", "scheduled_time_slot_id": "SLOT_AM" }
Send scheduled_date together with scheduled_time_slot_id. On its own it does not name a
window and no delivery window is recorded.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
| shipment_id | string | Yes | Carriyo `shipment_id` or your own `partner_shipment_reference`. The value is matched against `shipment_id` first, then `partner_shipment_reference`. |
Headers
| Name | Value | Required | Description |
|---|---|---|---|
| Authorization | Bearer YOUR-ACCESS-TOKEN | Yes | OAuth 2.0 bearer token obtained from `POST /oauth/token`. |
| x-api-key | YOUR-API-KEY | Yes | Your tenant's API key, issued in the Carriyo Dashboard. Required on every request except `POST /oauth/token`. |
| tenant-id | YOUR-TENANT-ID | Yes | Your Carriyo tenant ID, shown in the Carriyo Dashboard. Required on every request except `POST /oauth/token`. |
| Content-Type | application/json | Yes | Media type of the request body. |
Header parameters
| Name | Type | Required | Description |
|---|---|---|---|
| Idempotency-Key | string | No | Optional client-generated key that identifies one logical operation. Reuse the same key when retrying with the same payload. Replays the stored response. See https://carriyo.com/docs/api/idempotency/. |
Request body
application/jsonSchema: schedule-requestrequiredResponses
shipment-objecterror-responseThe request was rejected. One of:
- the shipment is
delivered,delivery_confirmed,returned,return_confirmed,cancelledorerror. - a scheduled date is in the past, or
scheduled_fromis not beforescheduled_to.
Need the full machine-readable spec? Download the OpenAPI document →
/shipments/{shipment_id}/schedule-collectionSchedule collection
Schedule the collection of a shipment. The collection window is recorded in Carriyo, and where the carrier offers collection, a pickup is booked with them. For carriers that do not, the window is recorded and no request is sent.
Allowed from draft, pending, error, booked, ready_to_ship, out_for_collection,
failed_collection_attempt, cancelled and cancelled_by_carrier; any other status is
rejected. This does not change the shipment status; call Ready to ship separately
for that.
Sending no body, or no window, is meaningful: Carriyo derives the window from the carrier
account's configured pickup hours. Where that yields nothing the call is rejected with 400
asking for a window. A scheduled_date without scheduled_time_slot_id is not a window.
A shipment webhook is sent once the window is recorded.
The carrier is asked once per shipment. If a collection is already booked, a later call updates the recorded window without contacting the carrier again. If an earlier request failed, calling again retries it.
Check post_shipping_info.async_statuses.schedule_pickup for the result. When a request
fails, the carrier's reason is recorded in post_shipping_info.error_details with
trigger: SCHEDULING.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
| shipment_id | string | Yes | Carriyo `shipment_id` or your own `partner_shipment_reference`. The value is matched against `shipment_id` first, then `partner_shipment_reference`. |
Headers
| Name | Value | Required | Description |
|---|---|---|---|
| Authorization | Bearer YOUR-ACCESS-TOKEN | Yes | OAuth 2.0 bearer token obtained from `POST /oauth/token`. |
| x-api-key | YOUR-API-KEY | Yes | Your tenant's API key, issued in the Carriyo Dashboard. Required on every request except `POST /oauth/token`. |
| tenant-id | YOUR-TENANT-ID | Yes | Your Carriyo tenant ID, shown in the Carriyo Dashboard. Required on every request except `POST /oauth/token`. |
| Content-Type | application/json | Yes | Media type of the request body. |
Header parameters
| Name | Type | Required | Description |
|---|---|---|---|
| Idempotency-Key | string | No | Optional client-generated key that identifies one logical operation. Reuse the same key when retrying with the same payload. Replays the stored response. See https://carriyo.com/docs/api/idempotency/. |
Request body
application/jsonSchema: schedule-requestResponses
shipment-objecterror-responseThe request was rejected. One of:
- the shipment has already shipped; only
draft,pending,error,booked,ready_to_ship,out_for_collection,failed_collection_attempt,cancelledandcancelled_by_carrierare allowed. - a scheduled date is in the past, or
scheduled_fromis not beforescheduled_to. scheduled_time_slot_iddoes not exist.- no window was supplied and none can be derived from the carrier account's pickup hours.
error-responseNeed the full machine-readable spec? Download the OpenAPI document →
/shipments/{shipment_id}/update-collection-scheduleUpdate collection schedule
Deprecated. Use Schedule collection instead. It takes the same body, so migrating is a path change only, and it also schedules the collection with the carrier. Responses here carry a
Deprecationheader and aLinkheader naming the successor.
Update the scheduled collection date for a shipment. The date is recorded in Carriyo; the
carrier is not contacted, so no collection is arranged. Allowed while the shipment has not
yet shipped — draft, pending, error, booked, ready_to_ship, out_for_collection,
failed_collection_attempt, cancelled and cancelled_by_carrier; any other status is
rejected.
Note: most carriers don't accept schedule updates after the original booking, so this change is recorded in Carriyo but is not propagated to the carrier post-booking.
Two shapes are supported:
Time window, using
scheduled_fromandscheduled_to:{ "scheduled_from": "2022-01-01T10:00:00.000Z", "scheduled_to": "2022-01-01T12:00:00.000Z" }A named slot on a day, using
scheduled_datewithscheduled_time_slot_id:{ "scheduled_date": "2022-01-01", "scheduled_time_slot_id": "SLOT_AM" }
Send scheduled_date together with scheduled_time_slot_id. On its own it does not name a
window and no collection window is recorded.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
| shipment_id | string | Yes | Carriyo `shipment_id` or your own `partner_shipment_reference`. The value is matched against `shipment_id` first, then `partner_shipment_reference`. |
Headers
| Name | Value | Required | Description |
|---|---|---|---|
| Authorization | Bearer YOUR-ACCESS-TOKEN | Yes | OAuth 2.0 bearer token obtained from `POST /oauth/token`. |
| x-api-key | YOUR-API-KEY | Yes | Your tenant's API key, issued in the Carriyo Dashboard. Required on every request except `POST /oauth/token`. |
| tenant-id | YOUR-TENANT-ID | Yes | Your Carriyo tenant ID, shown in the Carriyo Dashboard. Required on every request except `POST /oauth/token`. |
| Content-Type | application/json | Yes | Media type of the request body. |
Header parameters
| Name | Type | Required | Description |
|---|---|---|---|
| Idempotency-Key | string | No | Optional client-generated key that identifies one logical operation. Reuse the same key when retrying with the same payload. Replays the stored response. See https://carriyo.com/docs/api/idempotency/. |
Request body
application/jsonSchema: schedule-requestrequiredResponses
shipment-objecterror-responseThe request was rejected. One of:
- the shipment has already shipped; only
draft,pending,error,booked,ready_to_ship,out_for_collection,failed_collection_attempt,cancelledandcancelled_by_carrierare allowed. - a scheduled date is in the past, or
scheduled_fromis not beforescheduled_to.
Need the full machine-readable spec? Download the OpenAPI document →
/shipments/{shipment_id}/custom-attributesUpdate custom attributes
Update the tenant-defined custom attribute values on an existing shipment, without
touching the rest of the shipment data — the alternative to re-sending the whole shipment
through PUT /shipments/{shipment_id}.
Only attributes registered for your tenant with the SHIPMENT scope are accepted.
Attributes merge key by key: a key you send is set or replaced, a key you leave out keeps
its value, and a null value removes the attribute from the shipment.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
| shipment_id | string | Yes | Carriyo `shipment_id` or your own `partner_shipment_reference`. The value is matched against `shipment_id` first, then `partner_shipment_reference`. |
Headers
| Name | Value | Required | Description |
|---|---|---|---|
| Authorization | Bearer YOUR-ACCESS-TOKEN | Yes | OAuth 2.0 bearer token obtained from `POST /oauth/token`. |
| x-api-key | YOUR-API-KEY | Yes | Your tenant's API key, issued in the Carriyo Dashboard. Required on every request except `POST /oauth/token`. |
| tenant-id | YOUR-TENANT-ID | Yes | Your Carriyo tenant ID, shown in the Carriyo Dashboard. Required on every request except `POST /oauth/token`. |
| Content-Type | application/json | Yes | Media type of the request body. |
Header parameters
| Name | Type | Required | Description |
|---|---|---|---|
| Idempotency-Key | string | No | Optional client-generated key that identifies one logical operation. Reuse the same key when retrying with the same payload. Replays the stored response. See https://carriyo.com/docs/api/idempotency/. |
Request body
application/jsonrequiredResponses
shipment-objecterror-responseThe request was rejected. One of:
- an attribute name is not registered for the
SHIPMENTscope (custom_attribute_invalid). - for
ENUMattributes, a supplied value is not in the attribute'sallowed_values(custom_attribute_value_invalid). - a
STRINGvalue is longer than the configured maximum.
Need the full machine-readable spec? Download the OpenAPI document →
/shipments/{shipment_id}/documentsUpload document
Attach a document to a shipment, such as a commercial invoice, packing list, or certificate. The document is stored against the shipment in Carriyo and, when the carrier-upload prerequisites are met, also pushed to the carrier asynchronously.
What to send. Identify the target document setting by either document_id or document_name; one
is required. When both are supplied, document_id takes precedence. content_base64
is required and must be a valid PDF (the only currently supported format).
Carrier sync. After Carriyo stores the document, it is pushed to the carrier asynchronously only when all of the following are true:
- The document setting is configured to be uploaded to the carrier.
- A carrier account is assigned to the shipment.
- The shipment has progressed past the pre-booking statuses (i.e. its status is not
draft,pending, orerror). - The assigned carrier supports document upload. Today, that's DHL, FedEx, and UPS.
- The carrier account has a document-type mapping configured for the matched document setting.
If any of those conditions is not met, the document is still stored in Carriyo and the carrier upload simply does not run. You can call Retry document upload later once the missing condition is in place.
Sync runs asynchronously. The carrier_upload_status field on the document reflects
progress: pending while in flight, complete once the carrier accepts it, or
error if the carrier rejects it (the document's message field then carries the
carrier's reason).
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
| shipment_id | string | Yes | Carriyo `shipment_id` or your own `partner_shipment_reference`. The value is matched against `shipment_id` first, then `partner_shipment_reference`. |
Headers
| Name | Value | Required | Description |
|---|---|---|---|
| Authorization | Bearer YOUR-ACCESS-TOKEN | Yes | OAuth 2.0 bearer token obtained from `POST /oauth/token`. |
| x-api-key | YOUR-API-KEY | Yes | Your tenant's API key, issued in the Carriyo Dashboard. Required on every request except `POST /oauth/token`. |
| tenant-id | YOUR-TENANT-ID | Yes | Your Carriyo tenant ID, shown in the Carriyo Dashboard. Required on every request except `POST /oauth/token`. |
| Content-Type | application/json | Yes | Media type of the request body. |
Header parameters
| Name | Type | Required | Description |
|---|---|---|---|
| Idempotency-Key | string | No | Optional client-generated key that identifies one logical operation. Reuse the same key when retrying with the same payload. Replays the stored response. See https://carriyo.com/docs/api/idempotency/. |
Request body
application/jsonSchema: document-upload-requestrequiredResponses
shipment-objecterror-responseThe request was rejected. One of:
- neither
document_idnordocument_nameis supplied. content_base64is missing.- no document setting matches the
document_idordocument_name. - a document for that setting is already attached to the shipment.
- the content does not match the format the setting declares.
error-responseNeed the full machine-readable spec? Download the OpenAPI document →
/shipments/{shipment_id}/documents/{document_identifier}Update document
Replace the content of a document that already exists on a shipment. Useful when a commercial invoice, packing list, or certificate has been amended after upload.
- The document must already exist on the shipment; otherwise the call returns
400. - Content is supplied as a Base64-encoded string. Only PDF is supported, and the content is security-validated against the declared format.
- The new content fully replaces the existing content in storage; the previous version is not retained.
Carrier sync. The same carrier-upload prerequisites as Upload document apply: the document setting is configured for carrier upload, a carrier account is assigned, the shipment is past the pre-booking statuses, the carrier supports document upload, and the carrier account has a document-type mapping for the matched setting. When all are met, the updated content is re-pushed to the carrier asynchronously.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
| shipment_id | string | Yes | Carriyo `shipment_id` or your own `partner_shipment_reference`. The value is matched against `shipment_id` first, then `partner_shipment_reference`. |
| document_identifier | string | Yes | The document ID or document name (URL-encoded) to identify the document to update. |
Headers
| Name | Value | Required | Description |
|---|---|---|---|
| Authorization | Bearer YOUR-ACCESS-TOKEN | Yes | OAuth 2.0 bearer token obtained from `POST /oauth/token`. |
| x-api-key | YOUR-API-KEY | Yes | Your tenant's API key, issued in the Carriyo Dashboard. Required on every request except `POST /oauth/token`. |
| tenant-id | YOUR-TENANT-ID | Yes | Your Carriyo tenant ID, shown in the Carriyo Dashboard. Required on every request except `POST /oauth/token`. |
| Content-Type | application/json | Yes | Media type of the request body. |
Header parameters
| Name | Type | Required | Description |
|---|---|---|---|
| Idempotency-Key | string | No | Optional client-generated key that identifies one logical operation. Reuse the same key when retrying with the same payload. Replays the stored response. See https://carriyo.com/docs/api/idempotency/. |
Request body
application/jsonSchema: document-update-requestrequiredResponses
shipment-objecterror-responseThe request was rejected. One of:
content_base64is missing.- the shipment carries no documents.
- no document on the shipment matches the identifier.
- the content does not match the format the document declares.
error-responseNeed the full machine-readable spec? Download the OpenAPI document →
/shipments/{shipment_id}/documents/{document_identifier}Delete document
Remove a document from a shipment.
- The document must exist on the shipment; otherwise the call returns
400. - The content is deleted from Carriyo storage. This operation cannot be undone.
- If the document was already uploaded to a carrier, deleting it from Carriyo does not remove it from the carrier's system.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
| shipment_id | string | Yes | Carriyo `shipment_id` or your own `partner_shipment_reference`. The value is matched against `shipment_id` first, then `partner_shipment_reference`. |
| document_identifier | string | Yes | The document ID or document name (URL-encoded) to identify the document to delete. |
Headers
| Name | Value | Required | Description |
|---|---|---|---|
| Authorization | Bearer YOUR-ACCESS-TOKEN | Yes | OAuth 2.0 bearer token obtained from `POST /oauth/token`. |
| x-api-key | YOUR-API-KEY | Yes | Your tenant's API key, issued in the Carriyo Dashboard. Required on every request except `POST /oauth/token`. |
| tenant-id | YOUR-TENANT-ID | Yes | Your Carriyo tenant ID, shown in the Carriyo Dashboard. Required on every request except `POST /oauth/token`. |
Header parameters
| Name | Type | Required | Description |
|---|---|---|---|
| Idempotency-Key | string | No | Optional client-generated key that identifies one logical operation. Reuse the same key when retrying with the same payload. Replays the stored response. See https://carriyo.com/docs/api/idempotency/. |
Responses
shipment-objecterror-responseThe request was rejected. One of:
- the shipment carries no documents.
- no document on the shipment matches the identifier.
error-responseNeed the full machine-readable spec? Download the OpenAPI document →
/shipments/{shipment_id}/documents/{document_identifier}/retryRetry document upload to carrier
Re-attempt the upload of an existing document to the carrier after a previous carrier upload failed.
Prerequisites. All of the following must hold; any missing one returns 400 with the specific reason:
- A carrier account is assigned to the shipment.
- The document exists on the shipment.
- The document has a stored URL (i.e. it was previously uploaded successfully to Carriyo).
- The assigned carrier supports document upload. Today, that's DHL, FedEx, and UPS.
- The carrier account has a document-type mapping configured for this document.
Behavior. The retry runs asynchronously. The document's carrier_upload_status is set to
pending immediately, then transitions to complete or error once the carrier
processes the upload. Watch the shipment via webhooks or polling to observe the
final state.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
| shipment_id | string | Yes | Carriyo `shipment_id` or your own `partner_shipment_reference`. The value is matched against `shipment_id` first, then `partner_shipment_reference`. |
| document_identifier | string | Yes | The document ID or document name (URL-encoded) to identify the document. |
Headers
| Name | Value | Required | Description |
|---|---|---|---|
| Authorization | Bearer YOUR-ACCESS-TOKEN | Yes | OAuth 2.0 bearer token obtained from `POST /oauth/token`. |
| x-api-key | YOUR-API-KEY | Yes | Your tenant's API key, issued in the Carriyo Dashboard. Required on every request except `POST /oauth/token`. |
| tenant-id | YOUR-TENANT-ID | Yes | Your Carriyo tenant ID, shown in the Carriyo Dashboard. Required on every request except `POST /oauth/token`. |
Header parameters
| Name | Type | Required | Description |
|---|---|---|---|
| Idempotency-Key | string | No | Optional client-generated key that identifies one logical operation. Reuse the same key when retrying with the same payload. Replays the stored response. See https://carriyo.com/docs/api/idempotency/. |
Responses
carrier_upload_status set to pending.Schema: shipment-objecterror-responseThe request was rejected. One of:
- the shipment has no carrier account assigned.
- the shipment carries no documents, or none matches the identifier.
- the document has no stored URL to send.
- the assigned carrier does not accept document upload.
- the carrier account has no document-type mapping for this document.
error-responseNeed the full machine-readable spec? Download the OpenAPI document →
/shipments/{shipment_id}/documents/bulkBulk upload documents
Upload or update multiple documents on a shipment in a single request. Unlike single Upload document, which rejects duplicates, this endpoint upserts: existing documents are replaced and missing ones are created.
How it works. Each entry in the array is validated individually, then processed. For each entry, if a document for that setting already exists on the shipment, its content is replaced. Otherwise a new document is created. After all entries are persisted in one save, carrier sync is triggered per document following the same rules as Upload document.
Prerequisites. A document setting must exist for every entry in the request, matched by document_id
or document_name. If any entry fails to match, the entire request is rejected with
400; there is no partial success. content_base64 is required on each entry, and is
validated against the matching document setting's format (currently PDF only).
Carrier sync. Per-document carrier sync is asynchronous and follows the same prerequisites as
Upload document. Track each document's carrier_upload_status to observe progress.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
| shipment_id | string | Yes | Carriyo `shipment_id` or your own `partner_shipment_reference`. The value is matched against `shipment_id` first, then `partner_shipment_reference`. |
Headers
| Name | Value | Required | Description |
|---|---|---|---|
| Authorization | Bearer YOUR-ACCESS-TOKEN | Yes | OAuth 2.0 bearer token obtained from `POST /oauth/token`. |
| x-api-key | YOUR-API-KEY | Yes | Your tenant's API key, issued in the Carriyo Dashboard. Required on every request except `POST /oauth/token`. |
| tenant-id | YOUR-TENANT-ID | Yes | Your Carriyo tenant ID, shown in the Carriyo Dashboard. Required on every request except `POST /oauth/token`. |
| Content-Type | application/json | Yes | Media type of the request body. |
Header parameters
| Name | Type | Required | Description |
|---|---|---|---|
| Idempotency-Key | string | No | Optional client-generated key that identifies one logical operation. Reuse the same key when retrying with the same payload. Replays the stored response. See https://carriyo.com/docs/api/idempotency/. |
Request body
application/jsonrequiredAn array of document-upload-request. Each item has the following fields:
Responses
shipment-objecterror-responseThe request was rejected. One of:
- an entry supplies neither
document_idnordocument_name. - an entry is missing
content_base64. - an entry matches no document setting.
- an entry's content does not match the format its setting declares.
error-responseNeed the full machine-readable spec? Download the OpenAPI document →
/shipments/{shipment_id}/live-trackingGet live tracking
Fetch real-time driver location and ETA for a shipment that is currently being collected or delivered. Designed for same-day, hyper-local carriers whose drivers move continuously through the day; the response is a snapshot of where the driver is right now, not a list of past events.
Carrier support. Only supported by carriers whose handlers integrate with the carrier's live driver-tracking API. Today that means Careem Express, Quiqup and noon. On any other carrier the call succeeds with an empty payload rather than failing, so treat an empty response as "this carrier does not offer live tracking", not as an error.
Status requirements. The shipment must be in a live-trackable status: out_for_collection or out_for_delivery.
Calling on a shipment in any other status returns 400 with
"Shipment is not in a live trackable status.".
Caching. Results are cached for 15 seconds per tenant, carrier account and shipment, to protect the carrier's API. Repeated calls within that window return the cached payload.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
| shipment_id | string | Yes | Carriyo `shipment_id` or your own `partner_shipment_reference`. The value is matched against `shipment_id` first, then `partner_shipment_reference`. |
Headers
| Name | Value | Required | Description |
|---|---|---|---|
| Authorization | Bearer YOUR-ACCESS-TOKEN | Yes | OAuth 2.0 bearer token obtained from `POST /oauth/token`. |
| x-api-key | YOUR-API-KEY | Yes | Your tenant's API key, issued in the Carriyo Dashboard. Required on every request except `POST /oauth/token`. |
| tenant-id | YOUR-TENANT-ID | Yes | Your Carriyo tenant ID, shown in the Carriyo Dashboard. Required on every request except `POST /oauth/token`. |
Responses
live-tracking-infoout_for_collection or out_for_delivery.Schema: error-responseNeed the full machine-readable spec? Download the OpenAPI document →
/shipments/{shipment_id}/redactRedact shipment PII
Replace the customer's contact details on a shipment with a keyed one-way hash, for privacy and data-protection compliance. The shipment itself is kept.
Use this when a customer exercises a right of erasure under GDPR, CCPA, or similar regulation, or when your data retention policy reaches its scrub window. Call the endpoint on each affected shipment.
After redaction:
- Three contact fields are replaced with a keyed one-way hash:
contact_name,contact_phoneandcontact_email. The phone keeps its country code and the email keeps an address-like shape, so both stay usable as data without identifying anyone. - Only the customer's side is touched: the
dropoffof a forward shipment, thepickupof a reverse one. The counterparty's contact details are left as they are. - The address is not redacted.
address1,address2,coordsand any notes keep their stored values. Where your obligation covers the street address, clear it yourself with Update shipment. - Everything operational is kept: status, tracking number, carrier, dates, weights and dimensions, so the shipment stays usable for analytics, audit and tracking statistics.
- Redacting a second time changes nothing and returns 200.
This action is irreversible. The hash is one-way and keyed with a secret Carriyo holds, so the original values cannot be recovered from the shipment. Webhooks that fired before the redaction are not retroactively scrubbed, so you remain responsible for redacting any copies of shipment data held in your own systems.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
| shipment_id | string | Yes | Carriyo `shipment_id` or your own `partner_shipment_reference`. The value is matched against `shipment_id` first, then `partner_shipment_reference`. |
Headers
| Name | Value | Required | Description |
|---|---|---|---|
| Authorization | Bearer YOUR-ACCESS-TOKEN | Yes | OAuth 2.0 bearer token obtained from `POST /oauth/token`. |
| x-api-key | YOUR-API-KEY | Yes | Your tenant's API key, issued in the Carriyo Dashboard. Required on every request except `POST /oauth/token`. |
| tenant-id | YOUR-TENANT-ID | Yes | Your Carriyo tenant ID, shown in the Carriyo Dashboard. Required on every request except `POST /oauth/token`. |
| Content-Type | application/json | Yes | Media type of the request body. |
Header parameters
| Name | Type | Required | Description |
|---|---|---|---|
| Idempotency-Key | string | No | Optional client-generated key that identifies one logical operation. Reuse the same key when retrying with the same payload. Replays the stored response. See https://carriyo.com/docs/api/idempotency/. |
Request body
application/jsonResponses
shipment-objectNeed the full machine-readable spec? Download the OpenAPI document →
Shipment Audit
The activity timeline for a shipment: field-level changes, carrier calls, notifications, and customer feedback in one paginated list.
1 operation · 0 objects
/shipments/{shipment_id}/activityList shipment activity
Returns a paginated timeline of everything that has happened to a shipment.
Each entry comes from one of four sources:
- Change logs: field-level edits, in
changes, diffed from the shipment snapshot taken after each write. - System logs: carrier API calls and internal events, with timing, response code, and the carrier account involved.
- Notifications: customer notifications, in
notification, withrequest_typeNOTIFICATION. - Customer feedback: delivery feedback, in
feedback, withrequest_typeFEEDBACK.
A change log and the system log that caused it merge into one entry. A system log with no change log appears on its own, without changes.
Housekeeping fields that change on every write, such as update_date and update_source, are left out of changes. So are high-churn tracking fields such as scan_count and last_status_refresh_date, so a carrier poll only produces an entry when something meaningful changed.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
| shipment_id | string | Yes | Carriyo `shipment_id` or your own `partner_shipment_reference`. The value is matched against `shipment_id` first, then `partner_shipment_reference`. |
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
| page_num | integer | No | Page of the timeline to return. Values below 1 fall back to 1. |
| rows_per_page | integer | No | Entries per page. Values above 100 are capped at 100. |
| sort | string | No | Orders entries by timestamp. Defaults to newest first. |
| source | array | No | Filters entries by what triggered them. Comma-separated, any match: `source=user,api`. - `all`: no filtering (default) - `user`: Dashboard and Fulfillment App activity - `api`: direct API calls - `webhook`: webhook deliveries and retries - `system`: everything else, such as carrier callbacks, tracking polls, and internal services Unrecognized values are ignored. |
Headers
| Name | Value | Required | Description |
|---|---|---|---|
| Authorization | Bearer YOUR-ACCESS-TOKEN | Yes | OAuth 2.0 bearer token obtained from `POST /oauth/token`. |
| x-api-key | YOUR-API-KEY | Yes | Your tenant's API key, issued in the Carriyo Dashboard. Required on every request except `POST /oauth/token`. |
| tenant-id | YOUR-TENANT-ID | Yes | Your Carriyo tenant ID, shown in the Carriyo Dashboard. Required on every request except `POST /oauth/token`. |
Responses
activity-responseerror-responseNeed the full machine-readable spec? Download the OpenAPI document →
Manifests
A manifest is a collection of shipments shipped together from the same location with the same carrier. It acts as an instruction to schedule the collection of the shipments with your carrier.
7 operations · 0 objects
/manifestsCreate manifest
Creates a new manifest. The request body lists the shipments to include and the planned pickup details (location, schedule, and carrier).
Headers
| Name | Value | Required | Description |
|---|---|---|---|
| Authorization | Bearer YOUR-ACCESS-TOKEN | Yes | OAuth 2.0 bearer token obtained from `POST /oauth/token`. |
| x-api-key | YOUR-API-KEY | Yes | Your tenant's API key, issued in the Carriyo Dashboard. Required on every request except `POST /oauth/token`. |
| tenant-id | YOUR-TENANT-ID | Yes | Your Carriyo tenant ID, shown in the Carriyo Dashboard. Required on every request except `POST /oauth/token`. |
| Content-Type | application/json | Yes | Media type of the request body. |
Request body
application/jsonSchema: manifest-requestResponses
manifest-responseNeed the full machine-readable spec? Download the OpenAPI document →
/manifests/{manifest-id}Update manifest
Update a draft manifest. Once a manifest has been moved to ready-to-ship or shipped, it can no longer be edited.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
| manifest-id | string | Yes | — |
Headers
| Name | Value | Required | Description |
|---|---|---|---|
| Authorization | Bearer YOUR-ACCESS-TOKEN | Yes | OAuth 2.0 bearer token obtained from `POST /oauth/token`. |
| x-api-key | YOUR-API-KEY | Yes | Your tenant's API key, issued in the Carriyo Dashboard. Required on every request except `POST /oauth/token`. |
| tenant-id | YOUR-TENANT-ID | Yes | Your Carriyo tenant ID, shown in the Carriyo Dashboard. Required on every request except `POST /oauth/token`. |
| Content-Type | application/json | Yes | Media type of the request body. |
Request body
application/jsonSchema: manifest-requestrequiredResponses
manifest-responseNeed the full machine-readable spec? Download the OpenAPI document →
/manifests/{manifest-id}Get manifest
Returns the specified manifest by ID, including its list of shipments and current status.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
| manifest-id | string | Yes | — |
Headers
| Name | Value | Required | Description |
|---|---|---|---|
| Authorization | Bearer YOUR-ACCESS-TOKEN | Yes | OAuth 2.0 bearer token obtained from `POST /oauth/token`. |
| x-api-key | YOUR-API-KEY | Yes | Your tenant's API key, issued in the Carriyo Dashboard. Required on every request except `POST /oauth/token`. |
| tenant-id | YOUR-TENANT-ID | Yes | Your Carriyo tenant ID, shown in the Carriyo Dashboard. Required on every request except `POST /oauth/token`. |
Responses
manifest-responseNeed the full machine-readable spec? Download the OpenAPI document →
/manifests/{manifest-id}/ready-to-shipMark manifest ready to ship
Lock the contents of a draft manifest. After this call, no more shipments can be added
or removed. The manifest must be in draft when called. Once locked, ship the manifest
with POST /manifests/{manifest-id}/ship to dispatch it to the carrier.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
| manifest-id | string | Yes | — |
Headers
| Name | Value | Required | Description |
|---|---|---|---|
| Authorization | Bearer YOUR-ACCESS-TOKEN | Yes | OAuth 2.0 bearer token obtained from `POST /oauth/token`. |
| x-api-key | YOUR-API-KEY | Yes | Your tenant's API key, issued in the Carriyo Dashboard. Required on every request except `POST /oauth/token`. |
| tenant-id | YOUR-TENANT-ID | Yes | Your Carriyo tenant ID, shown in the Carriyo Dashboard. Required on every request except `POST /oauth/token`. |
Responses
manifest-responseNeed the full machine-readable spec? Download the OpenAPI document →
/manifests/{manifest-id}/cancelCancel manifest
Cancel the manifest. The constituent shipments are not cancelled; they are released from the manifest and can be added to another one.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
| manifest-id | string | Yes | — |
Headers
| Name | Value | Required | Description |
|---|---|---|---|
| Authorization | Bearer YOUR-ACCESS-TOKEN | Yes | OAuth 2.0 bearer token obtained from `POST /oauth/token`. |
| x-api-key | YOUR-API-KEY | Yes | Your tenant's API key, issued in the Carriyo Dashboard. Required on every request except `POST /oauth/token`. |
| tenant-id | YOUR-TENANT-ID | Yes | Your Carriyo tenant ID, shown in the Carriyo Dashboard. Required on every request except `POST /oauth/token`. |
Responses
Need the full machine-readable spec? Download the OpenAPI document →
/manifests/{manifest-id}/retryRetry manifest
Retries a manifest that failed at the carrier. Used when the carrier rejected the initial manifest submission and a transient cause has been resolved.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
| manifest-id | string | Yes | — |
Headers
| Name | Value | Required | Description |
|---|---|---|---|
| Authorization | Bearer YOUR-ACCESS-TOKEN | Yes | OAuth 2.0 bearer token obtained from `POST /oauth/token`. |
| x-api-key | YOUR-API-KEY | Yes | Your tenant's API key, issued in the Carriyo Dashboard. Required on every request except `POST /oauth/token`. |
| tenant-id | YOUR-TENANT-ID | Yes | Your Carriyo tenant ID, shown in the Carriyo Dashboard. Required on every request except `POST /oauth/token`. |
Responses
Need the full machine-readable spec? Download the OpenAPI document →
/manifests/{manifest-id}/shipShip manifest
Marks the manifest as shipped and submits it to the carrier. Triggers carrier-side processing and finalises the pickup arrangement.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
| manifest-id | string | Yes | — |
Headers
| Name | Value | Required | Description |
|---|---|---|---|
| Authorization | Bearer YOUR-ACCESS-TOKEN | Yes | OAuth 2.0 bearer token obtained from `POST /oauth/token`. |
| x-api-key | YOUR-API-KEY | Yes | Your tenant's API key, issued in the Carriyo Dashboard. Required on every request except `POST /oauth/token`. |
| tenant-id | YOUR-TENANT-ID | Yes | Your Carriyo tenant ID, shown in the Carriyo Dashboard. Required on every request except `POST /oauth/token`. |
Responses
Need the full machine-readable spec? Download the OpenAPI document →
Consolidated Shipments
Consolidated (master) shipments group multiple child shipments under a single parent. Useful for multi-parcel consignments and freight where one master tracking number aggregates several physical movements.
2 operations · 0 objects
/shipments/{shipment_id}/add-child-shipmentsLink child shipments
Adds one or more existing shipments as children of a consolidated (master) shipment.
The parent must already be marked as consolidated and be in draft or error status.
A child is checked only for being neither a consolidated parent itself nor already
linked to another parent; its own status is not inspected.
Linking is best-effort. Where a child cannot be written after several attempts the call still returns 200 with the parent's child list updated, so read the children back if it matters.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
| shipment_id | string | Yes | The consolidated parent shipment, by Carriyo `shipment_id` or your own `partner_shipment_reference`. |
Headers
| Name | Value | Required | Description |
|---|---|---|---|
| Authorization | Bearer YOUR-ACCESS-TOKEN | Yes | OAuth 2.0 bearer token obtained from `POST /oauth/token`. |
| x-api-key | YOUR-API-KEY | Yes | Your tenant's API key, issued in the Carriyo Dashboard. Required on every request except `POST /oauth/token`. |
| tenant-id | YOUR-TENANT-ID | Yes | Your Carriyo tenant ID, shown in the Carriyo Dashboard. Required on every request except `POST /oauth/token`. |
| Content-Type | application/json | Yes | Media type of the request body. |
Header parameters
| Name | Type | Required | Description |
|---|---|---|---|
| Idempotency-Key | string | No | Optional client-generated key that identifies one logical operation. Reuse the same key when retrying with the same payload. Replays the stored response. See https://carriyo.com/docs/api/idempotency/. |
Request body
application/jsonrequiredResponses
shipment-objecterror-responseThe request was rejected. One of:
shipment_idsis empty or absent, or carries the same id twice.- one or more ids do not resolve. This is a
400here, not a404. - the target shipment is not a consolidated parent, or is not
draftorerror. - a child is itself a consolidated parent, or already belongs to another parent.
Need the full machine-readable spec? Download the OpenAPI document →
/shipments/{shipment_id}/remove-child-shipmentsUnlink child shipments
Remove one or more child shipments from a consolidated parent. The unlinked children become independent shipments again; they are not deleted, just disassociated from the parent.
Every id in shipment_ids must be a child of the parent named in the path.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
| shipment_id | string | Yes | The consolidated parent shipment, by Carriyo `shipment_id` or your own `partner_shipment_reference`. |
Headers
| Name | Value | Required | Description |
|---|---|---|---|
| Authorization | Bearer YOUR-ACCESS-TOKEN | Yes | OAuth 2.0 bearer token obtained from `POST /oauth/token`. |
| x-api-key | YOUR-API-KEY | Yes | Your tenant's API key, issued in the Carriyo Dashboard. Required on every request except `POST /oauth/token`. |
| tenant-id | YOUR-TENANT-ID | Yes | Your Carriyo tenant ID, shown in the Carriyo Dashboard. Required on every request except `POST /oauth/token`. |
| Content-Type | application/json | Yes | Media type of the request body. |
Header parameters
| Name | Type | Required | Description |
|---|---|---|---|
| Idempotency-Key | string | No | Optional client-generated key that identifies one logical operation. Reuse the same key when retrying with the same payload. Replays the stored response. See https://carriyo.com/docs/api/idempotency/. |
Request body
application/jsonrequiredResponses
shipment-objecterror-responseThe request was rejected. One of:
shipment_idsis empty or absent.- the target shipment is not a consolidated parent, or is not
draftorerror.
Need the full machine-readable spec? Download the OpenAPI document →
Bulk Operations
Do-X-to-many-shipments operations: kick off a batch, poll for status, validate before booking, retry, force a status refresh.
Unlike Consolidated shipments, which represents a master shipment containing child shipments, these endpoints operate over arbitrary sets of independent shipments in a single call. Useful for high-volume booking flows and back-office bulk corrections.
5 operations · 0 objects
/shipments/bulk/statusGet bulk status
This endpoint is designed to provide user with the statuses of requested shipments.
Parameter shipment_id can be specified multiple times. The result of this operation is the
list of shipments' current statuses and all milestones.
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
| shipment_id | array | No | Carriyo shipment ids, repeated once per shipment. Unlike the shipment-scoped paths, this parameter does not fall back to `partner_shipment_reference`. A value that is not a `shipment_id` matches nothing and the shipment is simply absent from the response, with no error. Pass your own references in `partner_shipment_reference` instead. |
| partner_shipment_reference | array | No | Your own shipment references, repeated once per shipment. Combine with `shipment_id` to look up a batch by either identifier. |
Headers
| Name | Value | Required | Description |
|---|---|---|---|
| Authorization | Bearer YOUR-ACCESS-TOKEN | Yes | OAuth 2.0 bearer token obtained from `POST /oauth/token`. |
| x-api-key | YOUR-API-KEY | Yes | Your tenant's API key, issued in the Carriyo Dashboard. Required on every request except `POST /oauth/token`. |
| tenant-id | YOUR-TENANT-ID | Yes | Your Carriyo tenant ID, shown in the Carriyo Dashboard. Required on every request except `POST /oauth/token`. |
Responses
An array of bulk-shipment-status-response. Each item has the following fields:
error-responseNeed the full machine-readable spec? Download the OpenAPI document →
/shipments/bulk/importBulk import shipments
Creates or updates a batch of draft shipments from a single request.
Each row is matched by partner_shipment_reference. A shipment already in draft or
error is updated; anything else creates a new draft shipment, and a row matching an
already-confirmed shipment is rejected.
- At most 20 rows per request. A larger batch is rejected with
400before any row is processed. confirmbooks every shipment in the batch with the carrier. Without it, rows are created in the same state a singlePOST /shipmentswould produce.- Rows run concurrently, so their side effects are not ordered.
Duplicates within a batch. Where two or more rows share the same partner_shipment_reference, the first is
processed normally and the rest are rejected with Duplicate Partner Shipment Reference.
What you get back. One entry per accepted row. A row with no partner_shipment_reference is dropped
silently and produces no entry at all, so match on the reference rather than on position.
Each entry carries:
result:createdwhen a new shipment was created,updatedwhen an existing draft shipment was updated,rejectedon failure.reason: human-readable detail, e.g. an error message for rejections, or a note when the shipment was saved as draft but auto-confirm failed.shipment: the saved shipment whenresultis notrejected.
Everything other than the batch-size limit is reported per row inside a 200, as
result: rejected with a reason.
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
| confirm | boolean | No | If `true`, every imported shipment is auto-confirmed (booked with the carrier). |
Headers
| Name | Value | Required | Description |
|---|---|---|---|
| Authorization | Bearer YOUR-ACCESS-TOKEN | Yes | OAuth 2.0 bearer token obtained from `POST /oauth/token`. |
| x-api-key | YOUR-API-KEY | Yes | Your tenant's API key, issued in the Carriyo Dashboard. Required on every request except `POST /oauth/token`. |
| tenant-id | YOUR-TENANT-ID | Yes | Your Carriyo tenant ID, shown in the Carriyo Dashboard. Required on every request except `POST /oauth/token`. |
| Content-Type | application/json | Yes | Media type of the request body. |
Header parameters
| Name | Type | Required | Description |
|---|---|---|---|
| Idempotency-Key | string | No | Optional client-generated key that identifies one logical operation. Reuse the same key when retrying with the same payload. Replays the stored response. See https://carriyo.com/docs/api/idempotency/. |
Request body
application/jsonrequiredResponses
An array of bulk-shipment-import-response. Each item has the following fields:
Need the full machine-readable spec? Download the OpenAPI document →
/shipments/bulk/validateValidate shipment batch
Pre-validate a batch of shipment payloads without creating them. Applies the same
request-time validations as POST /shipments (required fields and schema shape) and
returns per-shipment validation errors so you can fix issues before calling POST /shipments/bulk/import. Rows are validated independently: duplicates within the batch
are not detected, only clashes with shipments that already exist.
At most 20 rows per request. Everything other than the batch-size limit is reported per
row inside a 200.
Headers
| Name | Value | Required | Description |
|---|---|---|---|
| Authorization | Bearer YOUR-ACCESS-TOKEN | Yes | OAuth 2.0 bearer token obtained from `POST /oauth/token`. |
| x-api-key | YOUR-API-KEY | Yes | Your tenant's API key, issued in the Carriyo Dashboard. Required on every request except `POST /oauth/token`. |
| tenant-id | YOUR-TENANT-ID | Yes | Your Carriyo tenant ID, shown in the Carriyo Dashboard. Required on every request except `POST /oauth/token`. |
| Content-Type | application/json | Yes | Media type of the request body. |
Request body
application/jsonrequiredResponses
Need the full machine-readable spec? Download the OpenAPI document →
/shipments/bulk/reprocessReprocess shipment batch
Retries booking for a list of shipment IDs. Useful when many shipments errored on a transient carrier issue and need re-booking together.
The shipments are processed one after another while you wait, and the first failure aborts the run: shipments already handled keep their new booking, the rest are untouched, and the response carries no per-shipment result. Re-send the remainder rather than the whole list.
Headers
| Name | Value | Required | Description |
|---|---|---|---|
| Authorization | Bearer YOUR-ACCESS-TOKEN | Yes | OAuth 2.0 bearer token obtained from `POST /oauth/token`. |
| x-api-key | YOUR-API-KEY | Yes | Your tenant's API key, issued in the Carriyo Dashboard. Required on every request except `POST /oauth/token`. |
| tenant-id | YOUR-TENANT-ID | Yes | Your Carriyo tenant ID, shown in the Carriyo Dashboard. Required on every request except `POST /oauth/token`. |
| Content-Type | application/json | Yes | Media type of the request body. |
Header parameters
| Name | Type | Required | Description |
|---|---|---|---|
| Idempotency-Key | string | No | Optional client-generated key that identifies one logical operation. Reuse the same key when retrying with the same payload. Replays the stored response. See https://carriyo.com/docs/api/idempotency/. |
Request body
application/jsonrequiredResponses
error-responseThe request was rejected. One of:
shipment_idsis empty or absent.- a shipment's status does not allow reprocessing, which aborts the run.
- a shipment is a consolidated parent still awaiting its booking confirmation.
error-responseNeed the full machine-readable spec? Download the OpenAPI document →
/shipments/bulk/status/refreshRefresh status batch
Triggers a carrier status refresh for a list of shipments. The latest carrier-reported status is fetched and persisted; webhook events fire on any state change. Subject to per-tenant batch size limits.
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
| shipment_id | array | No | Carriyo shipment ids, repeated once per shipment. This parameter accepts `shipment_id` only — there is no `partner_shipment_reference` fallback and no reference parameter on this operation, so a value that is not a `shipment_id` is skipped without an error. |
Headers
| Name | Value | Required | Description |
|---|---|---|---|
| Authorization | Bearer YOUR-ACCESS-TOKEN | Yes | OAuth 2.0 bearer token obtained from `POST /oauth/token`. |
| x-api-key | YOUR-API-KEY | Yes | Your tenant's API key, issued in the Carriyo Dashboard. Required on every request except `POST /oauth/token`. |
| tenant-id | YOUR-TENANT-ID | Yes | Your Carriyo tenant ID, shown in the Carriyo Dashboard. Required on every request except `POST /oauth/token`. |
Header parameters
| Name | Type | Required | Description |
|---|---|---|---|
| Idempotency-Key | string | No | Optional client-generated key that identifies one logical operation. Reuse the same key when retrying with the same payload. Replays the stored response. See https://carriyo.com/docs/api/idempotency/. |
Responses
shipment_id values. This error is returned as plain text, not as the JSON error envelope.Need the full machine-readable spec? Download the OpenAPI document →