---
slug: create-fba-listing-with-sp-api
title: "How to Create an FBA Listing Using Amazon SP-API"
summary: "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."
category: amazon
difficulty: intermediate
estimatedTokens: 6800
lastReviewed: "2026-08-04"
prerequisites:
  - create-amazon-listing-with-sp-api
learningOutcomes:
  - "Set fulfillment channel to FBA (AMAZON_NA) at creation in a single PUT"
  - "Include the FBA-specific required fields (package dimensions, package weight, batteries_required)"
  - "Explain why an FBA listing carries no quantity and is not buyable until inbound inventory arrives"
  - "Assemble a complete FBA attributes payload"
---

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](/learn/create-amazon-listing-with-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`:

| Channel | `fulfillment_availability` | `quantity`? | Buyable when |
| --- | --- | --- | --- |
| **FBA (this page)** | `[{ "fulfillment_channel_code": "AMAZON_NA" }]` | **no** — FBA inventory is governed by inbound shipments | inbound stock physically arrives at an Amazon FC |
| FBM | `[{ "fulfillment_channel_code": "DEFAULT", "quantity": N }]` | yes | the 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).

```ts
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.

```json
"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](/learn/create-amazon-listing-with-sp-api). For merchant-fulfilled listings with quantity, see [Create an FBM Listing Using SP-API](/learn/create-fbm-listing-with-sp-api).
