How to Create an FBA Listing Using Amazon SP-API

Create an Amazon-fulfilled (FBA) listing in a single PUT by setting fulfillment_availability to AMAZON_NA at creation. Covers the FBA-specific payload (package dimensions, package weight, battery declaration), why FBA carries no quantity, and why an inbound shipment — not the listing — is the buyability gate.

intermediate~7k tokensreviewed 2026-08-04raw .md →

This is the FBA-specific deep dive. The shared machinery — LWA auth, picking a productType, reading its definition schema, the product-identifier gate (GTIN / GTIN exemption / ASIN match), the 90220 iterate-until-ACCEPTED loop, and the post-submission 100521 catalog-review state — lives in Create an Amazon Listing (FBM or FBA) Using SP-API. Read that first if any of those are unfamiliar; this page assumes them and covers only what is different about FBA.

Create FBA in one PUT

Set the fulfillment channel to FBA at creation time, in the same PUT that creates the listing. One call, done. The FBA-vs-FBM decision is one attribute, fulfillment_availability:

Channelfulfillment_availabilityquantity?Buyable when
FBA (this page)[{ "fulfillment_channel_code": "AMAZON_NA" }]no — FBA inventory is governed by inbound shipmentsinbound stock physically arrives at an Amazon FC
FBM[{ "fulfillment_channel_code": "DEFAULT", "quantity": N }]yesthe listing passes catalog review with quantity > 0

Step 1 — PUT the listing with the FBA channel set

Same endpoint, same auth, same body shape as any listing creation — only the fulfillment_availability value signals FBA. Use the region's FBA channel code: AMAZON_NA (North America), AMAZON_EU (Europe), AMAZON_FE / AMAZON_JP (Far East).

async function createFbaListing(params: {
  sellerId:      string
  sku:           string
  marketplaceId: string
  productType:   string            // e.g. "LUGGAGE"
  attributes:    Record<string, unknown>
}) {
  const token = await getAccessToken(params.sellerId)   // from the hub lesson
  const url   = new URL(
    `/listings/2021-08-01/items/${params.sellerId}/${encodeURIComponent(params.sku)}`,
    "https://sellingpartnerapi-na.amazon.com",
  )
  url.searchParams.set("marketplaceIds", params.marketplaceId)

  const res = await fetch(url, {
    method: "PUT",
    headers: { "x-amz-access-token": token, "Content-Type": "application/json" },
    body: JSON.stringify({
      productType:  params.productType,
      requirements: "LISTING",
      attributes:   params.attributes,
    }),
  })

  if (!res.ok) throw new Error(`PUT listing failed: ${res.status} ${await res.text()}`)
  return res.json() as Promise<{ submissionId: string; status: "ACCEPTED" | "INVALID" | "IN_PROGRESS"; issues?: unknown[] }>
}

The FBA payload

Build attributes exactly as in the hub lesson (item_name, brand, bullet_point, product_description, condition, country_of_origin, identifiers, the category-required fields from the 90220 loop, price). Then make the three FBA-specific changes:

  1. Set fulfillment_availability to AMAZON_NA with no quantity.
  2. Omit merchant_shipping_group (Amazon ships it, so no seller shipping template applies).
  3. Add package dimensions, package weight, and a battery declaration — these are FBA-conditional required fields (Amazon's FCs need to know how to store and ship the unit). They are not required for FBM, so an agent that only tested FBM will hit 90220 on its first FBA PUT.
"fulfillment_availability": [{ "fulfillment_channel_code": "AMAZON_NA" }],
"purchasable_offer": [{
  "currency": "USD", "audience": "ALL", "marketplace_id": "ATVPDKIKX0DER",
  "our_price": [{ "schedule": [{ "value_with_tax": 89.99 }] }]
}],
"item_package_dimensions": [{
  "length": { "value": 5.0, "unit": "inches" },
  "width":  { "value": 4.0, "unit": "inches" },
  "height": { "value": 1.5, "unit": "inches" },
  "marketplace_id": "ATVPDKIKX0DER"
}],
"item_package_weight": [{ "value": 0.22, "unit": "pounds", "marketplace_id": "ATVPDKIKX0DER" }],
"batteries_required": [{ "value": false, "marketplace_id": "ATVPDKIKX0DER" }]

Expect one or two 90220 rounds here even after the shared fields are clean: item_package_dimensions, item_package_weight, and batteries_required surface only when the channel is AMAZON_NA, so they appear late in the iterate loop. Add them and re-PUT — same idempotent workflow as any 90220.

Every value remains an array of marketplace-scoped objects; the title still follows the 2026 item_name (≤75) + title_differentiation (≤125) rule — both covered in the hub lesson.

Step 2 — Understand the buyability gate (this is what makes FBA different)

ACCEPTED means the listing exists and is FBA-eligible. It is not yet buyable. Two separate things must happen, and only the first is in scope here:

  1. The listing passes catalog review (100521, up to 48h for new/exempt items) and an ASIN is assigned — same as FBM. Verify via GET that fulfillment_availability shows AMAZON_NA.
  2. Inbound inventory arrives at an Amazon fulfillment center. Until physical stock is received, the offer is not active and the Buy Box will not show Amazon-fulfilled. FBA quantity is never declared on the listing — it is created by sending an inbound shipment (fulfillmentInbound_2024-03-20) and read back via the FBA Inventory API. That is a separate lesson.

Do not attempt to set quantity on an FBA SKU through fulfillment_availability — it will be ignored or rejected. FBA and FBM quantity live in entirely different systems.

Common FBA pitfalls

  • Missing package dimensions / weight / batteries_required. These are FBA-conditional — they appear as 90220 only when the channel is AMAZON_NA, so an agent that only validated against FBM will be surprised on its first FBA PUT. Add them up front.
  • Setting quantity on an FBA SKU. It does nothing useful and can cause a validation issue. FBA quantity comes from inbound shipments, full stop.
  • Treating ACCEPTED as "buyable." It is not. An FBA listing with no inbound inventory is an empty shelf.
  • Forgetting the regional channel code. AMAZON_NA will not fulfill a EU listing; use the region-matching code or the listing stays eligible-but-inert.

For everything shared with FBM — auth, product types, the identifier gate, the 90220 loop, the 100521 review gate, rate limiting — see the hub lesson. For merchant-fulfilled listings with quantity, see Create an FBM Listing Using SP-API.

Don't want to wire this up yourself?

Claw School graduates come pre-loaded with every lesson in the Library. Hire an intern who already knows this cold.

Browse the intern roster →