FBA Workflow
Create an Amazon FBA transport plan and continue through labels
Overview
The FBA workflow creates an Amazon inbound plan from an outbound shipment, submits packing information, chooses where Amazon wants the inventory sent, confirms transportation, then requests labels.
The plan object is the source of truth between calls. After every asynchronous Amazon operation completes, fetch the plan again before using IDs for placement options, packing groups, shipments, transportation options, boxes, or labels.
Prerequisites
Before creating a plan, you need an outbound shipment, an Amazon channel, and one or more merchant SKUs with quantities. The SKUs must exist on the Amazon channel and be eligible for inbound shipment.
For item-level prep and label choices, check eligibility and prep details before creating the plan. Cached endpoints avoid a live Amazon fetch; the fetch endpoint asks Amazon for the latest eligibility for one ASIN.
Optional preflight checks
GET /api/fba-transport/v2024/item-eligibility?channel_id={channel_id}&asins[]={asin}
GET /api/fba-transport/v2024/fetch-item-eligibility?channel_id={channel_id}&asin={asin}
GET /api/fba-transport/v2024/item-prep-details?channel_id={channel_id}&mskus[]={msku}Create The Plan
Create the plan from the outbound shipment. Use the response plan ID for all later FBA transport calls. The Amazon inbound plan ID is stored on the returned plan.
Create plan
curl -X POST https://YOUR_DOMAIN/api/fba-transport/v2024/plans \
-H "Authorization: Bearer {token}" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{
"outbound_shipment_id": 5,
"channel_id": 1,
"destination_marketplace": "ATVPDKIKX0DER",
"items": [
{
"msku": "Mini-Porta-276810",
"quantity": 40,
"label_owner": "SELLER",
"prep_owner": "SELLER",
"expiration": null,
"manufacturing_lot_code": null
}
]
}'Handle Async Operations
Calls that generate or confirm Amazon options can return an operation ID. Poll the operation until it reaches a terminal state, then reload the plan.
Do not continue by guessing IDs from a previous response. IDs such as placement_option_id, shipment_id, and transportation_option_id should be read from the refreshed plan.
Poll then refresh
GET /api/fba-transport/v2024/operations/{operation_id}/update
GET /api/fba-transport/v2024/plans/{plan_id}Choose The Packing Workflow
Set whether packing information is known before placement. Use pack first for small parcel and any flow where box contents are known up front. Use pack later when placement needs to be confirmed before cartons are finalized, most commonly for LTL.
Set packing workflow
curl -X POST https://YOUR_DOMAIN/api/fba-transport/v2024/plans/{plan}/update-packing-info-known \
-H "Authorization: Bearer {token}" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{
"is_packing_info_known": true
}'Pack First
In pack first, confirm a packing option, create box groups for the packing groups Amazon returns, add plan items to the box groups, set packing information, then generate placement options.
Pack first sequence
POST /api/fba-transport/v2024/plans/{plan_id}/update-packing-info-known
POST /api/fba-transport/v2024/plans/{plan_id}/generate-packing-options
GET /api/fba-transport/v2024/plans/{plan_id}/packing-options
POST /api/fba-transport/v2024/plans/{plan_id}/confirm-packing-option
GET /api/fba-transport/v2024/plans/{plan_id}/packing-group-items
POST /api/fba-transport/v2024/plans/{plan_id}/box-groups
POST /api/fba-transport/v2024/plans/{plan_id}/box-groups/{box_group_id}/set-box-quantity
POST /api/fba-transport/v2024/plans/{plan_id}/box-groups/{box_group_id}/items
POST /api/fba-transport/v2024/plans/{plan_id}/set-packing-information
POST /api/fba-transport/v2024/plans/{plan_id}/generate-placement-options
GET /api/fba-transport/v2024/plans/{plan_id}/placement-options
POST /api/fba-transport/v2024/plans/{plan_id}/select-placement-optionPack Later
In pack later, generate and confirm placement first, then create box groups for the resulting shipments and submit box contents. Pack later does not support small parcel in the current workflow.
Pack later sequence
POST /api/fba-transport/v2024/plans/{plan_id}/update-packing-info-known
POST /api/fba-transport/v2024/plans/{plan_id}/generate-placement-options
GET /api/fba-transport/v2024/plans/{plan_id}/placement-options
POST /api/fba-transport/v2024/plans/{plan_id}/select-placement-option
POST /api/fba-transport/v2024/plans/{plan_id}/confirm-placement-option
GET /api/fba-transport/v2024/plans/{plan_id}/get-shipment
GET /api/fba-transport/v2024/plans/{plan_id}/list-shipment-boxes
POST /api/fba-transport/v2024/plans/{plan_id}/box-groups
POST /api/fba-transport/v2024/plans/{plan_id}/box-groups/{box_group_id}/items
POST /api/fba-transport/v2024/plans/{plan_id}/set-packing-informationSubmit Box Contents
A box group describes one package size and weight, plus the associated Amazon packing group or shipment entity. Add items to the box group using plan item IDs from the refreshed plan.
Create box group
curl -X POST https://YOUR_DOMAIN/api/fba-transport/v2024/plans/{plan}/box-groups \
-H "Authorization: Bearer {token}" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{
"associated_entity_id": "packingGroupId-abc123",
"length_mm": 300,
"width_mm": 200,
"height_mm": 150,
"weight_gm": 5000
}'Add item to box group
curl -X POST https://YOUR_DOMAIN/api/fba-transport/v2024/plans/{plan}/box-groups/{box-group-id}/items \
-H "Authorization: Bearer {token}" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{
"plan_item_id": "019953ae-7a0d-7342-956a-881dce3b8a23",
"quantity": 10
}'Select And Confirm Placement
Placement options describe how Amazon wants the plan split across fulfillment centers and what fees or discounts apply. Select one placement option before moving into delivery and transportation.
Pack later confirms placement before box contents. Pack first usually selects placement first and confirms it later, immediately before transportation confirmation.
Confirm placement option
curl -X POST https://YOUR_DOMAIN/api/fba-transport/v2024/plans/{plan}/confirm-placement-option \
-H "Authorization: Bearer {token}" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{
"plan_id": "019953ae-7a0d-7342-956a-881dcdbe42ad",
"placement_option_id": "placementOptionId-abc123"
}'Configure Delivery Options
Each shipment needs a first availability date and a transport mode. LTL shipments also need pallet details. Partnered LTL requires contact and freight information. Non-partnered shipments require a delivery window.
Delivery option sequence
POST /api/fba-transport/v2024/plans/{plan_id}/set-first-availability-date
POST /api/fba-transport/v2024/plans/{plan_id}/set-transport-mode-preference
POST /api/fba-transport/v2024/plans/{plan_id}/pallets
POST /api/fba-transport/v2024/plans/{plan_id}/update-contact-information
POST /api/fba-transport/v2024/plans/{plan_id}/update-freight-information
POST /api/fba-transport/v2024/plans/{plan_id}/generate-delivery-window-options
GET /api/fba-transport/v2024/plans/{plan_id}/delivery-window-options
POST /api/fba-transport/v2024/plans/{plan_id}/confirm-delivery-window-optionSet first availability date
curl -X POST https://YOUR_DOMAIN/api/fba-transport/v2024/plans/{plan}/set-first-availability-date \
-H "Authorization: Bearer {token}" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{
"plan_id": "019953ae-7a0d-7342-956a-881dcdbe42ad",
"placement_option_id": "placement-option-1",
"shipment_id": "shipment-1",
"first_availability_date": "2026-05-15T00:00:00Z"
}'Confirm Transportation
Generate transportation options after delivery prerequisites are complete. Select one transportation option for every shipment, confirm transportation, poll the operation if one is returned, then refresh the plan.
Transportation options can expire quickly. If options are more than about 15 minutes old, regenerate them before confirmation.
Transportation sequence
POST /api/fba-transport/v2024/plans/{plan_id}/confirm-placement-option
POST /api/fba-transport/v2024/plans/{plan_id}/generate-transportation-options
GET /api/fba-transport/v2024/plans/{plan_id}/transportation-options
POST /api/fba-transport/v2024/plans/{plan_id}/confirm-transportation-option
GET /api/fba-transport/v2024/plans/{plan_id}/list-shipment-itemsGenerate transportation options
curl -X POST https://YOUR_DOMAIN/api/fba-transport/v2024/plans/{plan}/generate-transportation-options \
-H "Authorization: Bearer {token}" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{
"plan_id": "019953ae-7a0d-7342-956a-881dcdbe42ad",
"placement_option_id": "placementOptionId-abc123",
"shipments_dates": [
{
"shipment_id": "shipmentId-abc123",
"start_date": "2024-06-01"
}
]
}'Confirm transportation option
curl -X POST https://YOUR_DOMAIN/api/fba-transport/v2024/plans/{plan}/confirm-transportation-option \
-H "Authorization: Bearer {token}" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{
"plan_id": "019953ae-7a0d-7342-956a-881dcdbe42ad",
"shipment_transportation_ids": [
{
"shipment_id": "shipmentId-abc123",
"transportation_option_id": "transportationOptionId-abc123"
}
]
}'Sync Shipment Items
After transportation is confirmed, call list-shipment-items for each shipment before requesting labels. This syncs shipment item details from Amazon, including FNSKUs. Missing this step can cause label resizing to fail because the label generation flow does not have the FNSKU data it needs.
Add Tracking For Non-Partnered Shipping
Partnered shipments do not require you to submit external carrier tracking. Non-partnered small parcel shipments need one tracking ID per Amazon box. Non-partnered LTL shipments need LTL tracking details before labels and paperwork are complete.
Small parcel tracking
curl -X POST https://YOUR_DOMAIN/api/fba-transport/v2024/plans/{plan}/update-tracking-small-details \
-H "Authorization: Bearer {token}" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{
"plan_id": "019953ae-7a0d-7342-956a-881dcdbe42ad",
"shipment_id": "shipment-1",
"box_tracking_ids": [
{
"amazon_box_id": "FBA1U000001",
"tracking_id": "1Z999AA10123456784"
}
]
}'Request Labels And Paperwork
Request package, box, pallet, or bill of lading labels after the shipment is confirmed and shipment items have been synced. To resize package labels, request package labels, fetch labels, then pass the label ID returned by the labels endpoint to the resize endpoint.
Label sequence
POST /api/fba-transport/v2024/plans/{plan_id}/request-package-labels
GET /api/fba-transport/v2024/plans/{plan_id}/labels?shipment_id={shipment_id}
POST /api/fba-transport/v2024/plans/{plan_id}/labels/{label_id}/resize-to-4x6
POST /api/fba-transport/v2024/plans/{plan_id}/request-box-labels
POST /api/fba-transport/v2024/plans/{plan_id}/request-pallet-labels
POST /api/fba-transport/v2024/plans/{plan_id}/request-bill-of-ladingRequest package labels
curl -X POST https://YOUR_DOMAIN/api/fba-transport/v2024/plans/{plan}/request-package-labels \
-H "Authorization: Bearer {token}" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{
"shipment_id": "shipment-1"
}'Recovery And Updates
Use POST /plans/{plan_id}/update to pull the latest Amazon state for a plan. Use reset endpoints only when intentionally backing up to an earlier stage, because later selections or submissions may be cleared.
If Amazon reports that placement options were generated in Seller Central, regenerate placement options through the API before continuing. If box assignment fails during transportation confirmation, call set-boxes-ids, refresh the plan, and retry the transportation confirmation.
Canceling a plan is a separate flow. Check whether the plan can be canceled, cancel it with Amazon, then mark it canceled locally after Amazon confirms the cancelation.
