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-option

Pack 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-information

Submit 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-option

Set 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-items

Generate 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-lading

Request 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.