Run everything you never had time to implement. Define your process once, and keep it running with Qore.

All reports
Amazon Seller Central
Inventory

Amazon AFN Inventory Data Report

Amazon's AFN Inventory Data report is the simplest view of Amazon-fulfilled stock there is - six columns wide, a SKU and its condition against a single sellable quantity. What makes it worth understanding is what it does not have. There is no date column, no country column and no breakdown into reserved, inbound or unfulfillable units, and the marketplace you ask for is ignored: Amazon answers with the account's whole pooled FBA position, the same file whichever marketplace the request named.

Known upstream as
GET_AFN_INVENTORY_DATA
One row is
One row per SKU per snapshot
Refreshed
Point-in-time snapshot
Columns
6
Marketplaces
Not published by Amazon
History
None inside the file. The report carries no date column and the request takes no data start or end time, so a pull answers the position as it stands and nothing else. What Amazon documents keeping is the generated document, not the position: the Reports API retains a generated report for 90 days where the report type names no retention of its own, and this one names none. That is a window to re-download a report you already asked for, and regenerating it returns the current position, because the content is near real-time. So the history that exists is still the stack of snapshots someone stored.
Latency
Amazon calls the content of this report updated in near real-time, and caps how often a near real-time FBA report is rebuilt at once every 30 minutes - after one is generated, a 30-minute wait passes before Amazon will generate an updated version. The observed behaviour agrees with the live-position half of that: two requests made minutes apart came back 8 units apart out of 255,670, which is the behaviour of a moving position rather than a file published once a day. It does not agree with the 30-minute floor, and the sources below record the difference - the measurement is what this page follows. How quickly Amazon reflects a physical event in the number is not stated beyond near real-time.
Requires
Fulfilment by Amazon

What this report contains

A row is a SKU's sellable Amazon-fulfilled stock at the moment the report was generated. Six columns, and they divide cleanly: three identifiers - seller_sku, fulfillment_channel_sku and asin - then two condition fields, condition_type and warehouse_condition_code, then a single number, quantity_available. Whether one SKU can occupy more than one row - a row per condition - is not established, and Amazon's reference defines neither condition column, so sum a SKU's rows rather than expecting exactly one.

What the file lacks is the more important half of the description. There is no date column, so a row is true as of the pull and carries no claim about any other moment. There is no country or marketplace column, and that is not an omission Amazon forgot to fix: FBA inventory is pooled, and one unit in a US fulfilment centre is sellable on amazon.com, on amazon.ca through Remote Fulfilment, and on amazon.com.mx. The unit has a location; this report does not carry one. And there is no breakdown of the position - no reserved, no inbound, no unfulfillable. Everything the file says about a SKU is how many of it can be sold now.

That is what separates it from the other FBA inventory reports. If the question is per-marketplace, or needs the reserved, inbound and unfulfillable split, it belongs to the FBA Inventory Planning Data report, which is genuinely marketplace-scoped and says so in its own marketplace column. This report is the flat, whole-account answer to "how many units can I sell right now".

How to get it

Through the Selling Partner API, it is a Reports API request for report type GET_AFN_INVENTORY_DATA. You create the report, poll it until Amazon hands back a document ID, then download the document, which is TSV. There is no data start or end time to supply, because the report describes the present rather than a period.

The trap is the marketplace parameter, and it is a quiet one: Amazon ignores the marketplace filter here. The behaviour was measured two ways on 2026-08-27 against a seller holding real inventory in both the US and Canada. A US request and a CA request each returned 41,040 rows, 8 units apart out of 255,670 - pull-to-pull drift, not different data. And the quantity is the pooled figure, not the US slice: reconciled against the marketplace-scoped planning report minutes later, AFN's 249,442 units sat 1.2% from US plus CA available (252,535) and 17.4% from US available alone (212,392). Decisively, 48 SKUs stocked in Canada and not in the US were all present, stocked, in the AFN file - which no US-only file could contain.

So the correct way to pull it is once per account, claiming no marketplace at all, and to leave the marketplace null on the stored rows: null is the honest value here rather than a gap. Fanning the request out across every marketplace an account sells in returns the same file N times, and stamping the requested marketplace onto those rows invents a country column the data does not have.

Sample rows

Illustrative values, not data from a real account. Shown to give the shape of the file.

seller_skufulfillment_channel_skuasincondition_typewarehouse_condition_codequantity_available
EXAMPLE-SKU-01X0EXAMPLE01B0EXAMPLE01NewItemSELLABLE1200
EXAMPLE-SKU-02X0EXAMPLE02B0EXAMPLE02NewItemSELLABLE0
EXAMPLE-SKU-03X0EXAMPLE03B0EXAMPLE03NewItemSELLABLE450
EXAMPLE-SKU-03-FBAX0EXAMPLE04B0EXAMPLE03NewItemSELLABLE80
EXAMPLE-SKU-04X0EXAMPLE05B0EXAMPLE04UsedGoodSELLABLE15

Field reference

ColumnTypeDescription
seller_skustringYour own SKU for the offer. The file carries no date and no country, so what identifies a row is this SKU, the condition columns beside it and the snapshot you pulled - do not assume the SKU alone is unique within a file.
fulfillment_channel_skustringAmazon's own identifier for this SKU inside the fulfilment network, carried beside your seller SKU so that a physical unit can be matched back to the offer that sells it. Whether it is always the FNSKU, and when the two identifiers diverge, is not established, so join on it only after checking a real file.
asinstringThe ASIN these units are listed against. Several SKUs can point at one ASIN, so an ASIN-level total needs a sum over rows rather than a lookup.
condition_typestringThe condition Amazon holds these units under. The evidence records the column but not the set of values Amazon writes into it, so treat any particular string as something to confirm against a real file.
warehouse_condition_codestringA second condition field, carried per row alongside condition_type. Neither its values nor how the two condition columns relate is established, so do not build a sellable-versus-damaged rule on it without checking a file first.
quantity_availableint64Sellable, Amazon-fulfilled units for this row. It is the account's pooled FBA position, not one marketplace's slice - measured against the marketplace-scoped planning report on 2026-08-27, the AFN total sat 1.2% from US plus CA available and 17.4% from US available alone. It is also the file's only quantity - reserved, inbound and unfulfillable units are not here. Whether a SKU with no sellable units is written as a zero or left out of the file altogether is not established, so do not read an absent SKU as a zero without checking.

Use cases

Answering how much you can actually sell right now. quantity_available summed over a SKU's rows is sellable FBA stock, with nothing in it that is reserved, in transit or unfulfillable. That makes it the cleanest input to an available-to-promise figure, and a much smaller thing to reconcile than a planning file.

Reconciling Amazon's SKU list against your own. seller_sku, fulfillment_channel_sku and asin on one row is the mapping most internal systems are missing. SKUs in the file that your ERP does not know, or ASINs carrying stock under a SKU you retired, both show up as soon as the three identifiers sit side by side.

Building the time series Amazon does not hand you. The file has no date, so a snapshot stored on a schedule is the only way sellable stock by SKU over time exists at all. Stamp the pull date on ingest and a month of pulls becomes the cover, sell-through and stock-out history the report itself cannot answer.

Catching the stock-out before support does. A SKU with no sellable units left is out of stock for every marketplace the pool serves at once, not just one - which is exactly the shape of outage that a per-marketplace dashboard reports late. Watch for the SKU vanishing from the file as well as for a zero in quantity_available: whether Amazon writes the zero row or omits the SKU is not established, and comparing today's pull against yesterday's catches it either way.

Splitting stock by condition. condition_type and warehouse_condition_code separate the position into whatever conditions Amazon is holding units under, so new stock is not silently totalled together with used or warehouse-deal units. Amazon lists both columns in its report-type reference and enumerates neither, so confirm the value sets on a real file before writing rules against them.

Deciding which inventory report a question belongs to. A pooled "can I sell it" question is this report. A per-marketplace one, or anything needing the reserved, inbound and unfulfillable breakdown, is the FBA Inventory Planning Data report - and using this file for it produces a number that is wrong by roughly the size of your other marketplaces.

Limitations and gotchas

The marketplace filter does nothing, and it fails silently. You get a well-formed file with plausible rows for the marketplace you asked about; it is simply the whole pooled account position. Nothing in the response says so, which is why this is the first thing to know about the report.

Never label these rows with the marketplace you requested. The pooled units have no marketplace, so a marketplace column added from the request is wrong for every row that holds stock outside it. Leave it null.

Never union per-marketplace pulls. Nine requests return nine copies of the same file. Stacking them multiplies the account's inventory by nine, and every row looks legitimate.

Do not compare the total to one marketplace's available quantity. Measured against the planning report, the same account's AFN total was 17.4% above US available alone. A reconciliation that treats the two as the same figure will chase a difference that is just Canada.

There is no date in the file. If the pipeline does not stamp the snapshot date on ingest, the rows are undatable afterwards, and two snapshots concatenated become one indistinguishable pile.

History cannot be assumed. The request takes no date range, and what Amazon documents keeping is the generated report document - 90 days, the default for a report type that names no retention of its own - not the position it described. Ask for the report again and you get today's, because the content is near real-time. Treat a missed pull as data you may not be able to recover.

The position drifts between calls. Two pulls minutes apart differed by 8 units out of 255,670. That is small, but it means an exact tie-out between this file and anything pulled at a different moment is not achievable, and a difference of a few units is not a bug to investigate.

Sellable only. Reserved, inbound and unfulfillable units are not in this file at all, so it undercounts what you own in Amazon's network - deliberately, and by however much is currently in those states.

The raw column headers are not the tidy names on this page. In the TSV Amazon sends hyphenated, inconsistently cased headers - seller-sku next to Warehouse-Condition-code next to Quantity Available. Parsers that match on exact case are the usual casualty; the names in the field reference above are the normalised ones.

FAQ

Does the AFN Inventory report break down inventory by marketplace?

No. Amazon ignores the marketplace filter on this report and returns the account's whole pooled FBA position, so a US request and a CA request come back with the same data. Per-marketplace inventory questions belong to the FBA Inventory Planning Data report, which is genuinely marketplace-scoped and carries a marketplace column.

Why do my US and CA requests return the same file?

Because they are the same file. Measured on a seller with real stock in both countries, the two requests returned 41,040 rows each and totals 8 units apart out of 255,670 - ordinary pull-to-pull drift rather than different data - and SKUs stocked only in Canada appeared in the US request.

Does quantity available include reserved, inbound or unfulfillable units?

No. The file has one quantity column and it is sellable Amazon-fulfilled stock. The reserved, inbound and unfulfillable breakdown is in the FBA Inventory Planning Data report, not this one.

What does AFN mean?

Amazon Fulfillment Network - the units held in Amazon's fulfilment centres and shipped by Amazon under FBA, as opposed to the stock you hold and ship yourself. This report covers the Amazon-held side only.

Does the file have a date column, and how far back can I pull it?

There is no date column, and the request takes no date range. The only date a row has is the one your own pull stamps on it, so the history that exists is the snapshots you stored.

Which report should I use for FBA inventory by country?

The FBA Inventory Planning Data report. It is marketplace-scoped, labels each row with its own marketplace, and carries the reserved, inbound and unfulfillable columns this report leaves out.

Sources

Every researched claim on this page, and the Amazon or Walmart page it came from.

  • marketplaces — developer-docs.amazon.com/report-type-values-fba - the GET_AFN_INVENTORY_DATA entry gives 'Availability: FBA sellers', which is a seller type, and carries no 'Amazon store availability' line - the field the same page uses to restrict the FBA Multi-Country Inventory report (GET_AFN_INVENTORY_DATA_BY_COUNTRY) to 'Europe (EU)'. Nothing Amazon publishes names the stores this report exists in, and the Seller Central article that might (G200453180) serves no text without a login, so the page records `not-published` rather than reading `all` off an absent restriction.
  • grain — developer-docs.amazon.com/report-type-values-fba - the reference lists `condition-type` and `Warehouse-Condition-code` as attributes and defines neither, so nothing published says whether one SKU can occupy several rows under different conditions. `inventory-snapshot` stays as the closest single term and the prose no longer claims one row per SKU: total a SKU by summing its rows.
  • latency (doc vs evidence) — developer-docs.amazon.com/report-type-values-fba - Amazon says a near real-time FBA report 'is generated no more than once every 30 minutes'. Two requests on 2026-08-27 were minutes apart and came back 8 units apart, so something was rebuilt inside that window. Nothing was changed: the page follows the measurement. The likely reconciliation - that the requests named different stores (US and CA) and the cap applies per requested store - is unverified.
  • history_window — developer-docs.amazon.com/report-type-values-fba - the GET_AFN_INVENTORY_DATA entry states no retention of its own and no date range, and the request takes no data start or end time. Nothing published says whether Amazon holds a past snapshot it could serve, so the page says a missed pull may be unrecoverable rather than that it is.
  • fields.fulfillment_channel_sku — developer-docs.amazon.com/report-type-values-fba - Amazon names the column `fulfillment-channel-sku` here and defines it nowhere, while other FBA report entries on the same page list a separate `fnsku` attribute; developer-docs.amazon.com/terminology has no FNSKU entry. Nothing published equates the two, so the field description stays hedged. Needs a real file.
  • fields.condition_type and fields.warehouse_condition_code — developer-docs.amazon.com/report-type-values-fba - both columns are listed by name and neither is enumerated, and no FBA report entry on that page enumerates condition values anywhere. The values in the sample CSV are illustrative placeholders, not observed ones. Needs a real file.
  • fields.quantity_available — developer-docs.amazon.com/report-type-values-fba - the entry names `Quantity Available` and says nothing about whether a SKU with no sellable units appears as a zero row or drops out of the file. The prose no longer assumes a zero row appears. Needs a real file.
  • how-to-get-it (console path) — sellercentral.amazon.com/G200453180 - the `Amazon Fulfilled Inventory report` help article, re-checked 2026-09-28, returns a JavaScript shell with no article text without a login. The Seller Central path stays cut rather than written from memory; a reviewer with an account can restore it.
  • latency — developer-docs.amazon.com/report-type-values-fba - the FBA Amazon Fulfilled Inventory Report entry (reportType GET_AFN_INVENTORY_DATA) states 'Content updated in near real-time.'
  • latency — developer-docs.amazon.com/report-type-values-fba - 'A near real-time FBA report is generated no more than once every 30 minutes. This means that after a near real-time FBA report is generated following your report request, a 30-minute waiting period must pass before Amazon will generate an updated version of that report.'
  • history_window — developer-docs.amazon.com/report-type-values - 'The retention of generated reports varies by report type. If an explicit retention is not specified for a report type, then the report will be retained for 90 days. If the generated report is not downloaded within the retention period, you can generate the report again.' The GET_AFN_INVENTORY_DATA entry specifies no retention, so the 90-day default is what applies - to the generated document, not to a past position.
  • how-to-get-it — developer-docs.amazon.com/report-type-values-fba - Amazon's own name for the report type is 'FBA Amazon Fulfilled Inventory Report', under the Amazon Fulfillment role, with 'Availability: FBA sellers', 'This report can only be requested' and 'Report output type: Tab-delimited flat file'.
  • fields — developer-docs.amazon.com/report-type-values-fba - corroboration only, nothing changed: Amazon's attribute list for this report type is seller-sku, fulfillment-channel-sku, asin, condition-type, Warehouse-Condition-code, Quantity Available - the same six columns measured in the files, in the same order, with the same inconsistent raw casing the page warns parsers about. Amazon defines none of them further.