Skip to content

RejectFulfillmentOrders tells Zentail you cannot fulfil work it asked for — out of stock, damaged, address undeliverable. This is the other direction from ConfirmCancellations: there, Zentail asked; here, you are declining.

You call thissales:orders:fulfillment:self

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

Zentail reroutes the work or surfaces it to the user, and it leaves ListNeedToShip.

Media typeapplication/json
object
rejections

One entry per fulfillment order you are declining. Required and server-capped, like every batch on this contract.

Array<object>
object
fulfillmentOrderId

The work you are handing back, from ListNeedToShip.

string
reason

RejectionReason is shown to the Zentail user deciding what to do next, so it is required on every rejection. Pick the one that describes your side of the problem; OTHER plus Rejection.detail is better than a near-miss.

  • REJECTION_REASON_UNSPECIFIED: Refused. Send a real reason, or OTHER.
  • REJECTION_REASON_OUT_OF_STOCK: You hold the SKU but not enough of it to ship this work.
  • REJECTION_REASON_DAMAGED: The units are there but not shippable — damaged, expired, or failed a quality check.
  • REJECTION_REASON_UNDELIVERABLE_ADDRESS: The address will not deliver: your carrier refuses it, or it is incomplete. The likeliest reason a fulfillment order arrives with no ship_to at all.
  • REJECTION_REASON_SKU_NOT_FOUND: The SKU is not one you stock at all. Distinct from OUT_OF_STOCK: that one clears when stock arrives, this one needs someone to fix the catalogue or the routing.
  • REJECTION_REASON_OTHER: Anything else. Put the specifics in Rejection.detail — a user reads both.
string
default: REJECTION_REASON_UNSPECIFIED
Allowed values: REJECTION_REASON_UNSPECIFIED REJECTION_REASON_OUT_OF_STOCK REJECTION_REASON_DAMAGED REJECTION_REASON_UNDELIVERABLE_ADDRESS REJECTION_REASON_SKU_NOT_FOUND REJECTION_REASON_OTHER
detail

Free text shown to the user alongside the reason.

string
lines

Not supported yet. Sending any line fails the entry rather than declining the whole order, which would hand back units you can still ship, silently. Omit it to decline the whole fulfillment order.

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

A successful response.

Media typeapplication/json
object
results

One result per rejection sent, matched on fulfillment_order_id. Anything that failed is still in ListNeedToShip on the next poll.

Array<object>
object
fulfillmentOrderId

The rejection this answers, echoed back.

string
success

True when the work is out of your queue, which includes a repeat of a rejection already recorded. False is a real failure and the work is still yours to ship or decline.

boolean
errorMessage

Why it failed, in prose, for logs and support. Empty on success. The one worth handling rather than retrying is an order that has shipped, part-shipped or been cancelled, which can no longer be declined.

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

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