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.
Shipments
The shipment object
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 predefined automation rules pick one.
Forward vs reverse
Set entity_type to either:
FORWARD: a normal outbound shipment from the merchant to the customer.REVERSE: a return shipment, where the customer sends items back to the merchant.
Draft, confirmed, prebooked
Three creation modes, each with different behaviour 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 created inerrorstatus with the validation errors in the response.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 | Pass true for draft shipment |
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: shipment-requestrequired- References for a shipment, provided by the merchant. The
partner_order_referenceis mandatory but not required to be unique. It is usually the customer facing order number. Thepartner_shipment_referencemust be unique for every shipment. It is mandatory, but is copied frompartner_order_referenceif it is not provided. If a single order has multiple shipments, then they will share thepartner_order_referencebut have uniquepartner_shipment_reference. - Collection details chosen for the shipment, such as scheduled collection date. It can be set using one of the following options Option 1: Provide the
scheduled_fromandscheduled_toto choose the scheduled date along with start and end time. Example: "collection": { "scheduled_from": "2022-01-01'T'10:00:00.000+1:00", "scheduled_to": "2022-01-01'T'12:00:00.000+1:00" } Option 2: Provide thescheduled_dateonly to choose the entire day. Example: "collection": { "scheduled_date": "2022-01-01" } - The delivery options chosen for the shipment, including the delivery type and schedule. It can be set using one of the following options Option 1: Provide the
scheduled_fromandscheduled_toto choose the scheduled date along with start and end time. Example: "delivery": { "delivery_type": "STANDARD", "scheduled_from": "2022-01-01'T'10:00:00.000+1:00", "scheduled_to": "2022-01-01'T'12:00:00.000+1:00" } Option 2: Provide thescheduled_dateonly to choose the entire day. Example: "delivery": { "delivery_type": "STANDARD", "scheduled_date": "2022-01-01" } - Pickup address for the shipment. You can either pass a free-form address or a predefined location. For forward shipments, you must pass a predefined pickup location. Carriyo will copy the contact and address fields from the specified location. To specify the location, you can use Carriyo's internal location ID (
partner_location_id), or your own location code (partner_location_code) as defined when you created the location in Carriyo. For reverse shipments, you can pass the customer's pickup address as a free-form pickup address. - Dropoff address for the shipment. You can either pass a free-form address or a predefined location. For forward shipments, you can pass the customer's dropoff address as a free-form address. For reverse shipments, you must pass a predefined dropoff location. Carriyo will copy the contact and address fields from the specified location. To specify the location, you can use Carriyo's internal location ID (
partner_location_id), or your own location code (partner_location_code) as defined when you created the location in Carriyo. - Optional. The promised delivery date to the end customer, in ISO 8601 format. If present, Carriyo will not calculate promise date from service level configuration. Example: 2020-09-03T17:07:05.000+1:00 represents the date-time in UTC+1 time zone or 2020-09-03T17:07:05.000Z represents date-time in UTC (zulu) time zone
- 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-objectNeed 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 does a substring match across carrier tracking number, order
reference, shipment reference, customer name, email, and similar fields; combine it with
the other filters, sort, and pagination parameters as needed.
Quota: this endpoint is subject to your account's monthly shipment quota. Once the monthly limit is exceeded, further requests are blocked until the quota resets.
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, returning shipments that were either created OR updated during this time period. |
| update_date_to | string | No | The end date in ISO 8601 format to filter results, returning shipments that were either created OR updated during this time period. |
| 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 to be included in the response, ranging from 10 to 100. Defaults to page size of 10. |
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 →
/shipments/{shipment_id}Get shipment
Return the latest shipment object, including the most up-to-date status and tracking information.
The path parameter accepts either the Carriyo shipment_id or the merchant's
partner_shipment_reference. The reference variant is useful when your own system only
retained the value it originally supplied.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
| shipment_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
shipment-objectNeed 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.)
Merge rules
- Top-level fields you include are replaced wholesale. For example, to change only the
pickup postcode, you still pass the entire
pickupobject; any field you omit there is reset to its default. Plan your payload accordingly. - Custom attributes are the exception and merge key-by-key. You can add or change a
single attribute without supplying the others. To remove an attribute, set its value
to
null.
The path parameter accepts either the Carriyo shipment_id or the merchant's
partner_shipment_reference.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
| shipment_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: shipment-requestrequired- References for a shipment, provided by the merchant. The
partner_order_referenceis mandatory but not required to be unique. It is usually the customer facing order number. Thepartner_shipment_referencemust be unique for every shipment. It is mandatory, but is copied frompartner_order_referenceif it is not provided. If a single order has multiple shipments, then they will share thepartner_order_referencebut have uniquepartner_shipment_reference. - Collection details chosen for the shipment, such as scheduled collection date. It can be set using one of the following options Option 1: Provide the
scheduled_fromandscheduled_toto choose the scheduled date along with start and end time. Example: "collection": { "scheduled_from": "2022-01-01'T'10:00:00.000+1:00", "scheduled_to": "2022-01-01'T'12:00:00.000+1:00" } Option 2: Provide thescheduled_dateonly to choose the entire day. Example: "collection": { "scheduled_date": "2022-01-01" } - The delivery options chosen for the shipment, including the delivery type and schedule. It can be set using one of the following options Option 1: Provide the
scheduled_fromandscheduled_toto choose the scheduled date along with start and end time. Example: "delivery": { "delivery_type": "STANDARD", "scheduled_from": "2022-01-01'T'10:00:00.000+1:00", "scheduled_to": "2022-01-01'T'12:00:00.000+1:00" } Option 2: Provide thescheduled_dateonly to choose the entire day. Example: "delivery": { "delivery_type": "STANDARD", "scheduled_date": "2022-01-01" } - Pickup address for the shipment. You can either pass a free-form address or a predefined location. For forward shipments, you must pass a predefined pickup location. Carriyo will copy the contact and address fields from the specified location. To specify the location, you can use Carriyo's internal location ID (
partner_location_id), or your own location code (partner_location_code) as defined when you created the location in Carriyo. For reverse shipments, you can pass the customer's pickup address as a free-form pickup address. - Dropoff address for the shipment. You can either pass a free-form address or a predefined location. For forward shipments, you can pass the customer's dropoff address as a free-form address. For reverse shipments, you must pass a predefined dropoff location. Carriyo will copy the contact and address fields from the specified location. To specify the location, you can use Carriyo's internal location ID (
partner_location_id), or your own location code (partner_location_code) as defined when you created the location in Carriyo. - Optional. The promised delivery date to the end customer, in ISO 8601 format. If present, Carriyo will not calculate promise date from service level configuration. Example: 2020-09-03T17:07:05.000+1:00 represents the date-time in UTC+1 time zone or 2020-09-03T17:07:05.000Z represents date-time in UTC (zulu) time zone
- 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-objectNeed the full machine-readable spec? Download the OpenAPI document →
/shipments/{shipment_id}Replace shipment
Fully replace a draft shipment. The request body overwrites the existing shipment in its
entirety: any field you omit is reset to the schema default, including nested objects
like pickup, dropoff, parcels, and items. If you want to change only a few
fields and leave the rest intact, use Update shipment (PATCH) instead.
Only draft shipments can be replaced. Confirmed shipments return 400.
The path parameter accepts either the Carriyo shipment_id or the merchant's
partner_shipment_reference.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
| shipment_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: shipment-requestrequired- References for a shipment, provided by the merchant. The
partner_order_referenceis mandatory but not required to be unique. It is usually the customer facing order number. Thepartner_shipment_referencemust be unique for every shipment. It is mandatory, but is copied frompartner_order_referenceif it is not provided. If a single order has multiple shipments, then they will share thepartner_order_referencebut have uniquepartner_shipment_reference. - Collection details chosen for the shipment, such as scheduled collection date. It can be set using one of the following options Option 1: Provide the
scheduled_fromandscheduled_toto choose the scheduled date along with start and end time. Example: "collection": { "scheduled_from": "2022-01-01'T'10:00:00.000+1:00", "scheduled_to": "2022-01-01'T'12:00:00.000+1:00" } Option 2: Provide thescheduled_dateonly to choose the entire day. Example: "collection": { "scheduled_date": "2022-01-01" } - The delivery options chosen for the shipment, including the delivery type and schedule. It can be set using one of the following options Option 1: Provide the
scheduled_fromandscheduled_toto choose the scheduled date along with start and end time. Example: "delivery": { "delivery_type": "STANDARD", "scheduled_from": "2022-01-01'T'10:00:00.000+1:00", "scheduled_to": "2022-01-01'T'12:00:00.000+1:00" } Option 2: Provide thescheduled_dateonly to choose the entire day. Example: "delivery": { "delivery_type": "STANDARD", "scheduled_date": "2022-01-01" } - Pickup address for the shipment. You can either pass a free-form address or a predefined location. For forward shipments, you must pass a predefined pickup location. Carriyo will copy the contact and address fields from the specified location. To specify the location, you can use Carriyo's internal location ID (
partner_location_id), or your own location code (partner_location_code) as defined when you created the location in Carriyo. For reverse shipments, you can pass the customer's pickup address as a free-form pickup address. - Dropoff address for the shipment. You can either pass a free-form address or a predefined location. For forward shipments, you can pass the customer's dropoff address as a free-form address. For reverse shipments, you must pass a predefined dropoff location. Carriyo will copy the contact and address fields from the specified location. To specify the location, you can use Carriyo's internal location ID (
partner_location_id), or your own location code (partner_location_code) as defined when you created the location in Carriyo. - Optional. The promised delivery date to the end customer, in ISO 8601 format. If present, Carriyo will not calculate promise date from service level configuration. Example: 2020-09-03T17:07:05.000+1:00 represents the date-time in UTC+1 time zone or 2020-09-03T17:07:05.000Z represents date-time in UTC (zulu) time zone
- 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-objectNeed 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):
- Top-level fields you include are replaced wholesale; omitted fields reset to defaults.
- Custom attributes are the exception and merge key-by-key. Pass
nullto 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.
The path parameter accepts either the Carriyo shipment_id or the merchant's
partner_shipment_reference.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
| shipment_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: shipment-patch-request- Collection details chosen for the shipment, such as scheduled collection date. It can be set using one of the following options Option 1: Provide the
scheduled_fromandscheduled_toto choose the scheduled date along with start and end time. Example: "collection": { "scheduled_from": "2022-01-01'T'10:00:00.000+1:00", "scheduled_to": "2022-01-01'T'12:00:00.000+1:00" } Option 2: Provide thescheduled_dateonly to choose the entire day. Example: "collection": { "scheduled_date": "2022-01-01" } - The delivery options chosen for the shipment, including the delivery type and schedule. It can be set using one of the following options Option 1: Provide the
scheduled_fromandscheduled_toto choose the scheduled date along with start and end time. Example: "delivery": { "delivery_type": "STANDARD", "scheduled_from": "2022-01-01'T'10:00:00.000+1:00", "scheduled_to": "2022-01-01'T'12:00:00.000+1:00" } Option 2: Provide thescheduled_dateonly to choose the entire day. Example: "delivery": { "delivery_type": "STANDARD", "scheduled_date": "2022-01-01" } - Pickup address for the shipment. You can either pass a free-form address or a predefined location. For forward shipments, you must pass a predefined pickup location. Carriyo will copy the contact and address fields from the specified location. To specify the location, you can use Carriyo's internal location ID (
partner_location_id), or your own location code (partner_location_code) defined when you created the location in Carriyo. For reverse shipments, you can pass the customer's pickup address as a free-form pickup address. - Dropoff address for the shipment. You can either pass a free-form address or a predefined location. For forward shipments, you can pass the customer's dropoff address as a free-form address. For reverse shipments, you must pass a predefined dropoff location. Carriyo will copy the contact and address fields from the specified location. To specify the location, you can use Carriyo's internal location ID (
partner_location_id), or your own location code (partner_location_code) defined when you created the location in Carriyo. - 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+1:00 represents the date-time in UTC+1 time zone or 2020-09-03T17:07:05.000Z represents date-time in UTC (zulu) time zone
Responses
shipment-objectNeed 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):
- Top-level fields you include are replaced wholesale; omitted fields reset to defaults.
- Custom attributes are the exception and merge key-by-key. Pass
nullto 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.
The path parameter accepts either the Carriyo shipment_id or the merchant's
partner_shipment_reference.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
| shipment_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: shipment-patch-request- Collection details chosen for the shipment, such as scheduled collection date. It can be set using one of the following options Option 1: Provide the
scheduled_fromandscheduled_toto choose the scheduled date along with start and end time. Example: "collection": { "scheduled_from": "2022-01-01'T'10:00:00.000+1:00", "scheduled_to": "2022-01-01'T'12:00:00.000+1:00" } Option 2: Provide thescheduled_dateonly to choose the entire day. Example: "collection": { "scheduled_date": "2022-01-01" } - The delivery options chosen for the shipment, including the delivery type and schedule. It can be set using one of the following options Option 1: Provide the
scheduled_fromandscheduled_toto choose the scheduled date along with start and end time. Example: "delivery": { "delivery_type": "STANDARD", "scheduled_from": "2022-01-01'T'10:00:00.000+1:00", "scheduled_to": "2022-01-01'T'12:00:00.000+1:00" } Option 2: Provide thescheduled_dateonly to choose the entire day. Example: "delivery": { "delivery_type": "STANDARD", "scheduled_date": "2022-01-01" } - Pickup address for the shipment. You can either pass a free-form address or a predefined location. For forward shipments, you must pass a predefined pickup location. Carriyo will copy the contact and address fields from the specified location. To specify the location, you can use Carriyo's internal location ID (
partner_location_id), or your own location code (partner_location_code) defined when you created the location in Carriyo. For reverse shipments, you can pass the customer's pickup address as a free-form pickup address. - Dropoff address for the shipment. You can either pass a free-form address or a predefined location. For forward shipments, you can pass the customer's dropoff address as a free-form address. For reverse shipments, you must pass a predefined dropoff location. Carriyo will copy the contact and address fields from the specified location. To specify the location, you can use Carriyo's internal location ID (
partner_location_id), or your own location code (partner_location_code) defined when you created the location in Carriyo. - 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+1:00 represents the date-time in UTC+1 time zone or 2020-09-03T17:07:05.000Z represents date-time in UTC (zulu) time zone
Responses
shipment-objectNeed the full machine-readable spec? Download the OpenAPI document →
/shipments/{shipment_id}/ready-to-shipReady to ship
Mark a shipment as ready to ship.
For carriers that support scheduled collection (typically on-demand couriers), this also notifies the carrier of the scheduled collection date and time so they can arrange pickup.
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.
The path parameter accepts either the Carriyo shipment_id or the merchant's
partner_shipment_reference.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
| shipment_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: update-parcels-requestResponses
shipment-objectNeed the full machine-readable spec? Download the OpenAPI document →
/shipments/{shipment_id}/cancelCancel shipment
Cancel a shipment that has not yet shipped. Returns 400 if the shipment is already in transit or beyond.
Where the carrier supports it, Carriyo also issues the cancellation against the carrier's booking; for carriers that don't support cancellation, the Carriyo record is cancelled but no carrier call is made. Either way, the resulting shipment object reflects the cancelled state.
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.
The path parameter accepts either the Carriyo shipment_id or the merchant's
partner_shipment_reference.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
| shipment_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/json- Any one of the standard reason codes (below) or custom reason codes defined by the merchant. Click here for the list of Standard Reason Codes
Responses
shipment-objectNeed 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.
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.
The path parameter accepts either the Carriyo shipment_id or the merchant's
partner_shipment_reference.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
| shipment_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/jsonrequiredResponses
shipment-objectNeed 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.
The path parameter accepts either the Carriyo shipment_id or the merchant's
partner_shipment_reference.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
| shipment_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 →
/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.
Carriyo asks the carrier for a refreshed invoice and replaces the existing
commercial_invoice reference on the shipment with the new one. The previous invoice
URL stops being valid once the refresh completes.
Only meaningful for carriers that produce commercial invoices via API (DHL Express, FedEx, and similar). Carriers without invoice-refresh support return an error.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
| shipment_id | string | Yes | Carriyo shipment ID. |
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-objectNeed the full machine-readable spec? Download the OpenAPI document →
/shipments/{shipment_id}/estimate-shipping-costEstimate shipping cost
Get a cost estimate for a draft shipment before booking it. The estimate is sourced from the configured costing profile or, where available, from the carrier's live rating API, and is attached to the returned shipment object.
Useful for rate-shopping or for surfacing shipping cost on a checkout page before committing to the booking.
The path parameter accepts either the Carriyo shipment_id or the merchant's
partner_shipment_reference.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
| shipment_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
shipment-objectNeed 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. Allowed at any time until the shipment reaches a final
status (delivered, returned, cancelled).
This only updates the promise in Carriyo. It does not change the carrier's actual delivery commitment.
The path parameter accepts either the Carriyo shipment_id or the merchant's
partner_shipment_reference.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
| shipment_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: promised-delivery-date-requestrequiredResponses
shipment-objectNeed the full machine-readable spec? Download the OpenAPI document →
/shipments/{shipment_id}/update-delivery-scheduleUpdate delivery schedule
Update the scheduled delivery date for a shipment. Allowed at any time until the shipment
reaches a final status (delivered, returned, cancelled).
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:{ "delivery": { "scheduled_from": "2022-01-01T10:00:00.000Z", "scheduled_to": "2022-01-01T12:00:00.000Z" } }Whole day, using just
scheduled_date:{ "delivery": { "scheduled_date": "2022-01-01" } }
The path parameter accepts either the Carriyo shipment_id or the merchant's
partner_shipment_reference.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
| shipment_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: collection-requestrequiredResponses
shipment-objectNeed the full machine-readable spec? Download the OpenAPI document →
/shipments/{shipment_id}/update-collection-scheduleUpdate collection schedule
Update the scheduled collection date for a shipment. Allowed at any time until the
shipment reaches a final status (delivered, returned, cancelled).
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:{ "collection": { "scheduled_from": "2022-01-01T10:00:00.000Z", "scheduled_to": "2022-01-01T12:00:00.000Z" } }Whole day, using just
scheduled_date:{ "collection": { "scheduled_date": "2022-01-01" } }
The path parameter accepts either the Carriyo shipment_id or the merchant's
partner_shipment_reference.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
| shipment_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: collection-requestrequiredResponses
shipment-objectNeed the full machine-readable spec? Download the OpenAPI document →
/shipments/{shipment_id}/parcelsUpdate parcels
Replace the parcel list on a shipment after it's been created. Use this when the original parcel data (weight, dimensions, count) was wrong, or when the final parcel details only become known after picking and packing.
The request body is optional; if omitted, the parcel list is unchanged. If supplied, it fully replaces the existing parcels.
The path parameter accepts either the Carriyo shipment_id or the merchant's
partner_shipment_reference.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
| shipment_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: update-parcels-requestResponses
shipment-objectNeed 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.
Use this when your tenant has configured custom attributes (for example an SAP order number, a 3PL pick-batch reference, or a warehouse zone code) and you want to set or replace those values on an already-created shipment.
A common scenario is when an upstream system becomes aware of metadata after the shipment
has been created. For example, a WMS may assign a pick-batch ID once items are picked, or
an ERP may issue a tax document number after the fact. Rather than re-sending the entire
shipment via PUT /shipments/{shipment_id}, you can patch just the attributes that
changed.
Only attributes registered for your tenant via the Attributes
API are accepted. Unknown attribute names return a
custom_attribute_invalid error.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
| shipment_id | string | Yes | Carriyo shipment ID. |
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
shipment-objectNeed 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.
Request
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).
Validation
The request is rejected with 400 when:
- No document setting in your tenant matches the supplied
document_idordocument_name. - A document for the same setting is already attached to the shipment. To replace existing content, use Update document or Bulk upload documents, which upserts.
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).
The path parameter accepts either the Carriyo shipment_id or the merchant's
partner_shipment_reference.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
| shipment_id | string | Yes | The Carriyo shipment ID or the merchant provided `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. |
Request body
application/jsonSchema: document-upload-requestrequiredResponses
shipment-objectcreate-shipment-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.
Identifying the document
The document_identifier path parameter accepts either:
- The document's
document_id. - The document's
name. URL-encode it if it contains special characters or spaces.
Behaviour
- 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.
The path parameter accepts either the Carriyo shipment_id or the merchant's
partner_shipment_reference.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
| shipment_id | string | Yes | The Carriyo shipment ID or the merchant provided `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. |
Request body
application/jsonSchema: document-update-requestrequiredResponses
shipment-objectcreate-shipment-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.
Identifying the document
The document_identifier path parameter accepts either:
- The document's
document_id. - The document's
name. URL-encode it if it contains special characters or spaces.
Behaviour
- The document must exist on the shipment; otherwise the call returns 400.
- The content is deleted from Carriyo storage (S3). 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.
The path parameter accepts either the Carriyo shipment_id or the merchant's
partner_shipment_reference.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
| shipment_id | string | Yes | The Carriyo shipment ID or the merchant provided `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`. |
Responses
shipment-objectcreate-shipment-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.
Identifying the document
The document_identifier path parameter accepts either:
- The document's
document_id. - The document's
name. URL-encode it if it contains special characters or spaces.
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.
Behaviour
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.
The path parameter accepts either the Carriyo shipment_id or the merchant's
partner_shipment_reference.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
| shipment_id | string | Yes | The Carriyo shipment ID or the merchant provided `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`. |
Responses
shipment-objectcreate-shipment-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 | The Carriyo shipment ID or the merchant provided `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. |
Request body
application/jsonrequiredResponses
shipment-objectcreate-shipment-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 and Quiqup. Calling this endpoint on a shipment whose carrier doesn't support live tracking returns 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 (carrier account, 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. |
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-infocreate-shipment-error-responseNeed the full machine-readable spec? Download the OpenAPI document →
/shipments/{shipment_id}/redactRedact shipment PII
Permanently remove personally identifiable information (PII) from a shipment, for privacy and data-protection compliance.
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:
- Contact fields are cleared:
contact_name,contact_phone,contact_email,address1,address2,coords, and customer-supplied notes. - Operational fields are kept: status, tracking number, carrier, dates, weights, and dimensions.
- The shipment remains usable for analytics, audit, and tracking statistics, but the recipient can no longer be identified from it.
This action is irreversible. The original PII cannot be recovered. 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. |
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/jsonResponses
shipment-objectNeed 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.
9 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 →
/manifestsList manifests
Returns the merchant's manifests, with optional filters for status, date range, 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`. |
Responses
Need 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}Delete manifest
Permanently deletes the specified manifest. Only allowed while the manifest is in a non-shipped 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. Children must be in draft or error status
and not already linked to another consolidated parent. Linked children inherit certain
routing and lifecycle behaviour from the parent.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
| shipment_id | string | Yes | Identifier of the consolidated parent shipment. |
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
shipment-objectNeed 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.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
| shipment_id | string | Yes | Identifier of the consolidated parent shipment. |
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
shipment-objectNeed 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 | — |
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 →
/shipments/bulk/importBulk import shipments
Asynchronously creates a batch of shipments from a single request. Optionally confirms
(books with the carrier) every shipment in the batch via the confirm query parameter;
otherwise shipments are created in the same state as a single POST /shipments would
produce. Subject to per-tenant batch size limits.
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. |
Request body
application/jsonrequiredResponses
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, schema shape, and
duplicate partner_shipment_reference detection across the batch) and returns
per-shipment validation errors so you can fix issues before calling POST /shipments/bulk/import.
Deferred validations (the kind that would set a created shipment's status to error
rather than reject the request outright) are not surfaced here.
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
Asynchronously retries booking for a list of shipment IDs. Useful when many shipments errored due to a transient carrier issue and need to be rebooked together.
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/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.
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 →