Skip to content

ConfirmCancellations reports that you have pulled work back on your side, draining it from ListNeedToCancel.

You call thissales:orders:fulfillment:self

POST
/v2/shipping/fulfillment_orders/confirm_cancellations
curl --request POST \
--url https://api.zentail.com/v2/shipping/fulfillment_orders/confirm_cancellations \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{ "confirmations": [ { "fulfillmentOrderId": "example", "lines": [ { "lineItemId": "example", "quantity": 1 } ], "alreadyShipped": true } ] }'

Confirm only what you actually cancelled. If a unit has already shipped and cannot be recalled, say so with already_shipped rather than confirming — Zentail needs to know the difference to keep the customer order right.

Media typeapplication/json
object
confirmations

One entry per cancellation request you have carried out. Required and server-capped, like every batch on this contract.

Array<object>
object
fulfillmentOrderId

Which cancellation request you are answering, from ListNeedToCancel.

string
lines

Not supported yet. Sending any line fails the entry rather than being widened to the whole request, because treating a partial confirmation as a full one would cancel units you did not. Omit it to confirm the whole request, which is the only shape ListNeedToCancel asks for today.

Array<object>
object
lineItemId

Which line of the fulfillment order, echoed from FulfillmentOrderLine. A SKU is not accepted here: one SKU can appear on two lines.

string
quantity

How many units of that line are in this package. At least one, and never more than the line still owes — across the whole request, so naming one line twice is summed before it is checked.

integer format: int32
alreadyShipped

Set when you could not cancel because the units are already on their way. Zentail keeps the customer order truthful rather than showing a cancellation that did not happen; report the shipment through ConfirmShipments as normal.

boolean
Examplegenerated
{
"confirmations": [
{
"fulfillmentOrderId": "example",
"lines": [
{
"lineItemId": "example",
"quantity": 1
}
],
"alreadyShipped": true
}
]
}

A successful response.

Media typeapplication/json
object
results

One result per confirmation sent, matched on fulfillment_order_id. An entry that failed is still in ListNeedToCancel on the next poll.

Array<object>
object
fulfillmentOrderId

The confirmation this answers, echoed back.

string
success

True when the request is drained, which includes a replay (already_recorded set) and a report of already_shipped — you answered the question you were asked. False is a real failure, and the request will be re-offered.

boolean
errorMessage

Why it failed, in prose, for logs and support. Empty on success. Two failures are worth handling rather than retrying: no outstanding request for this order, and an order that has already shipped or been rejected.

string
alreadyRecorded

True when this cancellation was already recorded. Treat as success.

boolean
Examplegenerated
{
"results": [
{
"fulfillmentOrderId": "example",
"success": true,
"errorMessage": "example",
"alreadyRecorded": true
}
]
}

An unexpected error response.

Media typeapplication/json
object
code
integer format: int32
message
string
details
Array<object>
object
@type
string
key
additional properties
Examplegenerated
{
"code": 1,
"message": "example",
"details": [
{
"@type": "example"
}
]
}

Sourceshipping-api-proto@24ac5150 via [email protected]

Built0c509dd3

This page describes the source document as deployed: the version sales-orders pinned in its release r2026.09.24. A change merged upstream shows up here once it has deployed and the pins are next refreshed.

API changelog