Create a fulfillment
Address inventory by exact QIDs or SKU-and-quantity lines. Standard
fulfillment uses a recipient shipping address; withdrawal uses the
organization’s primary verified address or a verified_address_id and never
accepts a free-form address. Everything downstream — allocation, warehouse
order, pick, pack, verification, label, and carrier handoff — happens on our
side, and progress flows back through GET /fulfillments/{fulfillment_id}
and the fulfillment.status.changed webhook.
Send an Idempotency-Key header; retries with the same key return the
original fulfillment instead of shipping twice.
POST
/fulfillmentsAuthorization
X-API-KeyAPI key · headerrequiredAPI key in format `sk_*`. Scoped to your partner account; server-side use only.
Header parameters
Idempotency-KeystringrequiredUnique key for safe retries. Reusing a key on the same endpoint returns the original result.
max length 255
Request body
requiredapplication/jsondeliver_bystring<date> | nullAdvisory requested delivery date.
external_refstring | nullPartner order reference echoed on the fulfillment and its events.
special_instructionsstring | nullFree text surfaced to warehouse staff during pick and pack.
Responses
201Fulfillment accepted and queued for the warehouse.
idstring<uuid>requiredqidsQID[]requiredstatusFulfillmentStatusrequiredFulfillment lifecycle. Returned means custody has resumed and the item will repeat intake.
Allowed:
pendingprocessingshippeddeliveredcancelledexceptionreturnedprocessing_stageProcessingStage | nullWarehouse sub-stage while status is processing. It may be null when granular telemetry is unavailable; status is always authoritative.
Allowed:
pickedpackedverifiedlabeledqueued_for_carriershipping_addressShippingAddress | anyShow propertiesHide properties
Any of:
ShippingAddress
recipient_namestringrequiredstreetstringrequiredstreet_2string | nullcitystringrequiredstatestringrequiredzipstringrequiredcountrystringrequiredany
anycarrierstring | nullCarrier code once the label exists.
servicestring | nullService code once the label exists.
tracking_numberstring | nulltracking_urlstring<uri> | nullissueFulfillmentIssue | anyShow propertiesHide properties
Any of:
FulfillmentIssue
codestringrequiredMachine-readable issue type.
messagestringrequiredoccurred_atstring<date-time>requiredany
anyexternal_refstring | nullcreated_atstring<date-time>requiredupdated_atstring<date-time>requiredtypeFulfillmentTyperequiredAllowed:
standardwithdrawalspecial_instructionsstring | nulldeliver_bystring<date> | nullverified_address_idstring<uuid> | null400Validation failed.
codeErrorCoderequiredStable machine-readable error vocabulary for v1.
Allowed:
validation_errorstate_conflictenvironment_mismatchunsupported_destinationinvalid_api_keynot_foundrate_limitedextraobjectrequiredStructured details such as field errors or SKU availability.
messagestringrequiredHuman-readable summary.
401Missing, invalid, expired, or environment-mismatched API key.
codeErrorCoderequiredStable machine-readable error vocabulary for v1.
Allowed:
validation_errorstate_conflictenvironment_mismatchunsupported_destinationinvalid_api_keynot_foundrate_limitedextraobjectrequiredStructured details such as field errors or SKU availability.
messagestringrequiredHuman-readable summary.
404No such resource exists for this partner and environment.
codeErrorCoderequiredStable machine-readable error vocabulary for v1.
Allowed:
validation_errorstate_conflictenvironment_mismatchunsupported_destinationinvalid_api_keynot_foundrate_limitedextraobjectrequiredStructured details such as field errors or SKU availability.
messagestringrequiredHuman-readable summary.
409An item owned by this partner is not available to ship — for example it already has an active fulfillment, or it has not completed intake. Missing, foreign-partner, and cross-environment QIDs or verified addresses return the same plain 404.
codeErrorCoderequiredStable machine-readable error vocabulary for v1.
Allowed:
validation_errorstate_conflictenvironment_mismatchunsupported_destinationinvalid_api_keynot_foundrate_limitedextraobjectrequiredStructured details such as field errors or SKU availability.
messagestringrequiredHuman-readable summary.
422The request is valid but cannot be fulfilled from available inventory.
codeErrorCoderequiredStable machine-readable error vocabulary for v1.
Allowed:
validation_errorstate_conflictenvironment_mismatchunsupported_destinationinvalid_api_keynot_foundrate_limitedextraobjectrequiredStructured details such as field errors or SKU availability.
messagestringrequiredHuman-readable summary.
429Rate limit exceeded for this API key.
codeErrorCoderequiredStable machine-readable error vocabulary for v1.
Allowed:
validation_errorstate_conflictenvironment_mismatchunsupported_destinationinvalid_api_keynot_foundrate_limitedextraobjectrequiredStructured details such as field errors or SKU availability.
messagestringrequiredHuman-readable summary.
Try it
Server
Authorization
Parameters
Bodyapplication/json
Request
curl -X POST "https://api.vault.stashtab.gg/v1/fulfillments" \
-H "X-API-Key: YOUR_API_KEY" \
-H "Idempotency-Key: string" \
-H "Content-Type: application/json" \
-d '{
"deliver_by": "2019-08-24",
"external_ref": "string",
"special_instructions": "string",
"qids": [
"7c9e6679-7425-40de-944b-e07fc1f90ae7"
],
"shipping_address": {
"recipient_name": "Jordan Alvarez",
"street": "480 Cedar St",
"street_2": "Apt 12",
"city": "Austin",
"state": "TX",
"zip": "78701",
"country": "US"
},
"type": "standard"
}'const response = await fetch("https://api.vault.stashtab.gg/v1/fulfillments", {
method: "POST",
headers: {
"X-API-Key": "YOUR_API_KEY",
"Idempotency-Key": "string",
"Content-Type": "application/json"
},
body: JSON.stringify({
"deliver_by": "2019-08-24",
"external_ref": "string",
"special_instructions": "string",
"qids": [
"7c9e6679-7425-40de-944b-e07fc1f90ae7"
],
"shipping_address": {
"recipient_name": "Jordan Alvarez",
"street": "480 Cedar St",
"street_2": "Apt 12",
"city": "Austin",
"state": "TX",
"zip": "78701",
"country": "US"
},
"type": "standard"
})
});Response
{
"id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
"qids": [
"7c9e6679-7425-40de-944b-e07fc1f90ae7"
],
"status": "shipped",
"processing_stage": "picked",
"shipping_address": {
"recipient_name": "Jordan Alvarez",
"street": "480 Cedar St",
"street_2": "Apt 12",
"city": "Austin",
"state": "TX",
"zip": "78701",
"country": "US"
},
"carrier": "usps",
"service": "usps_priority_mail",
"tracking_number": "9400111899223857267224",
"tracking_url": "http://example.com",
"issue": {
"code": "address_undeliverable",
"message": "string",
"occurred_at": "2019-08-24T14:15:22Z"
},
"external_ref": "string",
"created_at": "2019-08-24T14:15:22Z",
"updated_at": "2019-08-24T14:15:22Z",
"type": "standard",
"special_instructions": "string",
"deliver_by": "2019-08-24",
"verified_address_id": "e92daf1e-afde-425b-aaf7-6374949522b4"
}{
"code": "validation_error",
"extra": {},
"message": "string"
}{
"code": "validation_error",
"extra": {},
"message": "string"
}{
"code": "validation_error",
"extra": {},
"message": "string"
}{
"code": "validation_error",
"extra": {},
"message": "string"
}{
"code": "validation_error",
"extra": {},
"message": "string"
}{
"code": "validation_error",
"extra": {},
"message": "string"
}