List FBA Reimbursements
GET/api/amazon/unified/fba-reimbursements
Paginated list of FBA reimbursements Amazon has already paid, unified across all Amazon integration instances. Rows are ingested from the FBA reimbursements report and form the authoritative payout log that reimbursement cases are reconciled against; amazon_reimbursement_case_id (and the embedded reimbursement_case object) is set when a row has been matched to a tracked case.
This endpoint currently requires session authentication; Personal Access Token scope support is in progress.
Per-row recovery fields:
linked_case_id(integer|null) — the reimbursement case this payout is linked to (same value asamazon_reimbursement_case_id).linked_sales_order(object|null) — the sales order behindamazon_order_idon the same integration instance (id,sales_order_number,order_status); null when the row has no order ID or the order has not been imported.underpaid(boolean) — true when the payout was flagged as underpaid: Amazon paid less per unit than its policy owes: for a unit lost before a sale, the purchase cost (the price on the product's latest purchase order on or before the payment; shipping and duties are excluded; the unit cost at the event when there is no purchase order); for a refunded unit, the sale price less promotions and the sale's fees, or the purchase cost until the order settles.expected_per_unit(number|null) — what the unit was worth according to the underpaid check; null when the row was not flagged.underpaid_case_id(integer|null) — the open underpaid-reimbursement case raised for this row; null when not flagged.
Payout against cost:
recoverability(string|null) — never_returns, may_reappear or cash_only: whether the reimbursed units can come back.fba_loss_event_id(integer|null) — the FBA loss event this payment pays for (the first one when it pays for several).settlement_data_id(integer|null) — the settlement line that carried this payment's cash.cost_basis(string|null) — howcost_totalwas measured: consumed_layer (the FIFO cost the lost units consumed), recorded_shortage (an inbound loss: what the recorded inbound shortage wrote off), landed_at_event_date (no ledger cost, so the product's unit cost at the loss date), replacement (Amazon replaced the units instead of paying — nothing to compare), supplement (a money-only top-up of an earlier payment; its units were costed on the original payment, so it is never costed), unknown (no cost on file).cost_total(number|null) — what the cash-reimbursed units cost you.unit_cost(number|null) —cost_totaldivided byquantity_reimbursed_cash.variance_total(number|null) —amount_totalminuscost_total; negative when Amazon paid less than cost. Null when there is no cost or the row is not a positive payment.variance_per_unit(number|null) —variance_totalper cash-reimbursed unit.
Pagination: page and per_page (default 10).
Sorting: sort=<field> ascending or sort=-<field> descending. Sortable fields: id, reimbursement_id, approval_date, case_id, amazon_order_id, reason, reason_category, sku, fnsku, asin, amount_per_unit, amount_total, currency, quantity_reimbursed_cash, quantity_reimbursed_inventory, quantity_reimbursed_total, cost_total, variance, created_at, updated_at. variance sorts by amount paid minus cost, so sort=variance lists the most underpaid payments first; payments without a cost sort last in either direction.
Simple filters:
filter[search]— fuzzy search across reimbursement_id, case_id, amazon_order_id, sku, asin, fnsku, reason and the integration instance name. Restrict withsearch_columnsand force exact matching per column withsearch_strict_columns.filter[integration_instance_ids]— comma-separated Amazon integration instance IDs.filter[reason_category]— comma-separated list of normalized reason categories.filter[currency]— comma-separated list of currency codes.filter[has_case_id]— true/false (also accepts 1/0, yes/no): rows that do or do not carry an Amazon case ID.filter[has_linked_case]— true/false (also accepts 1/0, yes/no): rows that are or are not linked to a SKU.io reimbursement case.filter[underpaid]— 1/0 (also accepts true/false, yes/no): rows that were or were not flagged as underpaid, i.e. Amazon paid less per unit than the unit was worth and an open (not dismissed) underpaid-reimbursement case exists for the row.filter[linked]—filed(linked to a case you filed in Seller Central, i.e. the case has an Amazon case ID),auto(linked to a case that was never filed — Amazon paid on its own and the payout was matched automatically), ornone(not linked to any case).filter[variance]—negative(Amazon paid less than the units cost) orpositive(paid at or above cost). Only payments with a known cost and a positive amount match.filter[recoverability]— comma-separated list of never_returns, may_reappear, cash_only.filter[loss_event_status]— comma-separated statuses of the FBA loss event the payment pays for (researching, confirmed_lost, partially_reimbursed, reimbursed, found, reversed, written_off); payments not linked to a loss event never match.filter[fba_loss_event_id]— payments for one FBA loss event (exact match).filter[loss_outcome]— comma-separated list offoundand/orreimbursed. Matches a payment when any loss event it pays for or claws back (through its loss-event links, not onlyfba_loss_event_id) has found units (found), or has more than zero units paid for net of reversals (cash plus replacements) while more units were lost than found (reimbursed). Several values match either; unknown values are ignored.
Advanced operator filters use the syntax filter[column.operator]=value; a bare filter[column]=value is treated as the is operator.
- Text columns (reimbursement_id, case_id, amazon_order_id, reason, reason_category, sku, fnsku, asin, condition) support: contains, does_not_contain, is, is_not, is_one_of, is_not_one_of, starts_with, does_not_start_with, ends_with, does_not_end_with, is_empty, is_not_empty.
- Numeric columns (amount_per_unit, amount_total, quantity_reimbursed_cash, quantity_reimbursed_inventory, quantity_reimbursed_total) support: is, is_not, is_one_of, is_not_one_of, greater_than, less_than, greater_than_or_equal, less_than_or_equal, between, is_empty, is_not_empty.
- Date columns (approval_date, created_at, updated_at) support: is, is_not, before, after, on_or_before, on_or_after, between, is_empty, is_not_empty, today, yesterday, tomorrow, past_week, past_month, past_year, next_week, next_month, next_year, days_ago, days_from_now, past_days, next_days. Date values use ISO 8601 / Y-m-d;
betweentakes two comma-separated values.
Complex AND/OR filter trees can be sent via filter_groups (base64-encoded JSON tree of conditions and nested groups).
unmatched_reason says why the claim this payment names by case id was not settled by it — the payment is in a different currency from the claim, or the claim type does not accept the payment's reason (e.g. "Payment is in EUR but the claim (case 17389245671) is in USD — record it on the claim manually with "Record Amazon's answer"."). null when matched or when no case id applies.
Request
Responses
- 200
- 401
- 403
- 429
OK
Response Headers
Unauthenticated — the bearer token is missing, revoked, expired, or malformed. Never retry automatically; fix the credential. See the Errors guide.
Forbidden — the token lacks a required scope, the endpoint is not available to API tokens, or the user behind the token lacks the permission. A human must adjust the token scopes or user permissions; do not retry.
Rate limited — platform limit is 1,000 requests/min; individual tokens may carry lower limits. Honor the Retry-After header before retrying. See the Rate Limits guide.