Amazon PA-API is retired: getting product data without it

PA-API 5 now answers 403 and points to the Creators API. Who should migrate, who needs a data API instead, a field mapping and real coverage numbers.

Amazon’s Product Advertising API 5 is deprecated, and Amazon’s own notice says calls to it now return an HTTP 403 AccessDeniedException that points to the Creators API. If you earn Amazon Associates commissions, migrate to the Creators API. If you only need product data (prices, ratings, availability, offers) for monitoring, enrichment or research, a data API such as FastAF returns it for 1 credit per product, with no Associates account. Below: the split, a field mapping, and what 24 real product lookups returned on 19 October 2026.

What happened to PA-API 5?

Amazon’s PA-API 5 deprecation notice (read 19 October 2026) says the API “has been deprecated and is being replaced by the Creators API”. Applications that still call it get a 403 whose message tells them to migrate. The old webservices.amazon.com/paapi5/documentation/ pages now redirect to that notice.

The notice gives no end date. One third-party article, a DEV Community post, reports 30 April 2026 for deprecation and 15 May 2026 for retirement. We could not confirm those dates on an Amazon page, so treat them as reported, not official.

The migration guide lists the real changes: OAuth 2.0 instead of AWS Signature V4, new credentials (the old keys do not work), a new endpoint at creatorsapi.amazon/catalog/v1/, lowerCamelCase fields, and OffersV2 replacing Offers.Listings.

Should I use the Creators API or a data API?

Use the Creators API if you are an Associate and your product is affiliate links. It is the official route, it returns commission-tracked URLs, and the same four operations carry over: SearchItems, GetItems, GetVariations, GetBrowseNodes.

The catch is eligibility. Amazon’s introduction lists at least 10 qualifying sales in the past 30 days as a prerequisite, and the rate documentation says access is lost after 30 consecutive days without qualified referring sales. The starting limit is 1 request per second and 8,640 per day for the first 30 days, then it scales with shipped revenue (1 TPS per $4,320 of shipped items in the previous 30 days, up to 10).

A price monitor, a catalog enrichment job, a market study or an AI agent answering “what does this cost in Germany” usually has no affiliate sales, and must not depend on them. For that, use a data API. The trade-off is plain: you get product data, you do not get tracked links, and Amazon’s terms and the Associates policies stay your responsibility.

How do PA-API 5 operations map to FastAF?

Everything below is GET https://api.fastaf.co/v1/amazon with a Bearer key. Field names are from real responses.

PA-API 5 / Creators API FastAF call Fields returned Gap
SearchItems query, domain, page (1 to 100), 1 credit asin, title, extracted_price, rating, reviews, image, has_prime No minPrice, brand or sortBy; 15 to 48 products per page
GetItems resource=product&asin=, 1 credit title, extracted_price, availability_status, images, extracted_average_rating, extracted_total_reviews One ASIN per call, no batching of 10
ItemInfo (features, brand, technical) same call feature_bullets, brand, product_information Free-form dict, keys vary by category and language
Images same call images, main_image No size variants or width and height fields
GetVariations same call parent_asin, variant_combinations (asin, dimensions) No per-variation price: one product call per child
OffersV2 listings resource=offers, 5 credits offers[] with price.value, condition, seller.name, buybox_winner No deal timing fields in the offers I saw
BrowseNodeInfo same product call category_id, categories, best_sellers_rank Rank is structured on .com only (see below)
GetBrowseNodes resource=bestsellers&category_id=, 5 credits ranked results plus a category tree No call that lists children of an arbitrary node
detailPageURL with partnerTag none build /dp/<asin> yourself No commission-tracked links

Two things FastAF returns that the Creators API resource list does not mention: rating and review count (the list covers ItemInfo, Images, OffersV2, BrowseNodeInfo, ParentASIN, SearchRefinements and VariationSummary), and number_of_people_bought. There is also a reviews resource, covered in the Amazon API page.

How complete is the data?

On 19 October 2026 we ran 9 searches (3 queries: “mechanical keyboard”, “air fryer”, “yoga mat”, on com, co.uk and de), then looked up 27 ASINs from them with resource=product and resource=offers, 5 requests in parallel. 24 product pages and 26 offer lists came back. The rest returned a 4xx after about 40 seconds and were not charged.

Field Search results (239 products) Product pages (24)
Price (numeric) 235 (98%) 24 (100%)
Rating 237 (99%) 23 (96%)
Review count 237 (99%) 23 (96%)
Image 239 (100%) 24 (100%)
Availability not in search 24 (100%)
Feature bullets not in search 24 (100%)
Brand not in search 19 (79%)
Variants not in search 21 (88%)

All 26 offer lists had at least one offer, a priced offer and a buy box winner; they held between 1 and 12 offers. The one product page without a rating had no rating fields at all in the response.

Latency at 5 parallel requests, successful calls only: search median 5.8 s (p90 16.9 s), product median 5.3 s (p90 11.1 s), offers median 13.5 s (p90 35 s). Confirmation calls to the production API, one at a time, took 4.8 s (product, de), 6.5 s (search, co.uk) and 17.6 s (offers, com). A product lookup on com failed twice with a 422 and no charge. Budget for retries and for tail latency of tens of seconds, so this is a batch tool, not a request-path dependency.

What are the gotchas?

Currency follows the postal code. A co.uk search with only country=gb returned prices as “USD 278.64”. Adding postal_code=SW1A 1AA returned “£171.00”. Pass country and postal_code every time. Even then, one of 8 co.uk products came back in USD, so check price_symbol.

Price is a display string; use the numeric field. price reads “$28.49 with 33 percent savings”, while extracted_price is 28.49.

Validate ratings. On one German page the rating was “4,7” and extracted_average_rating came back as 47. A repeat call returned 4.7. Reject anything above 5.

Best seller rank is structured on .com only. On co.uk and de it sits as text in product_information.

How do I migrate a GetItems call?

A drop-in function with the familiar shape: a list of ASINs and a marketplace in, items out. We ran it on 12 ASINs across the three marketplaces and got 12 items back.

import os
import time
from concurrent.futures import ThreadPoolExecutor

import requests

BASE = "https://api.fastaf.co/v1/amazon"
HEADERS = {"Authorization": f"Bearer {os.environ['FASTAF_API_KEY']}"}

# PA-API "Marketplace" value -> FastAF domain, country, postal code
MARKETPLACES = {
    "www.amazon.com": ("com", "us", "10001"),
    "www.amazon.co.uk": ("co.uk", "gb", "SW1A 1AA"),
    "www.amazon.de": ("de", "de", "10115"),
}


def _get(params, retries=1):
    for attempt in range(retries + 1):
        r = requests.get(BASE, params=params, headers=HEADERS, timeout=90)
        if r.status_code == 200:
            return r.json()
        if r.status_code in (422, 429, 502, 503) and attempt < retries:
            time.sleep(3)
            continue
        return None  # failed requests are not billed
    return None


def _rating(p):
    value = p.get("extracted_average_rating")
    if value is not None and value > 5:  # "4,7" parsed as 47
        value = value / 10
    return value


def get_items(item_ids, marketplace="www.amazon.com"):
    """Same call shape as PA-API GetItems: ASINs in, items out."""
    domain, country, postal = MARKETPLACES[marketplace]

    def one(asin):
        p = _get({"resource": "product", "asin": asin, "domain": domain,
                  "country": country, "postal_code": postal})
        if not p:
            return None
        return {
            "asin": asin,
            "title": p.get("title"),
            "brand": p.get("brand"),
            "price": p.get("extracted_price"),
            "currency": p.get("price_symbol"),
            "rating": _rating(p),
            "reviews": p.get("extracted_total_reviews"),
            "availability": p.get("availability_status"),
            "image": (p.get("images") or [None])[0],
            "features": p.get("feature_bullets") or [],
            "parent_asin": p.get("parent_asin"),
        }

    with ThreadPoolExecutor(max_workers=5) as pool:
        return [i for i in pool.map(one, item_ids) if i]

Output for the German test ASIN B09ZYLM43B: price 191.3, currency “€”, rating 4.7, 8,344 reviews, “In stock”. Four ASINs took 9 to 47 seconds per marketplace, so run big lists in batches and store results as you go. The existing guides cover the rest: what the Amazon endpoint returns and a full price tracking bot with SQLite history and alerts.

What does it cost?

Search and product requests cost 1 credit, offers and bestsellers 5. Refreshing 1,000 products daily is 30,000 credits a month, about $11.60 of a $29 Growth pack (75,000 credits, valid 12 months). Adding an offers check on every product daily would be 150,000 more, so pull offers only for the ASINs where the buy box seller matters. Our 12-ASIN migration test cost 12 credits. Current prices are on the pricing page, the full parameters in the docs, and a failed request is never charged.

The short version

PA-API 5 is deprecated and answers 403; the official replacement is the Creators API, which needs an Associates account with recent qualifying sales. If you earn commissions, migrate there. If you need prices, ratings, availability, variants and offers without affiliate eligibility, a data API covers them: 98 to 100% of products had a price, availability and image in our run, at 1 credit per product. Validate ratings and currency, retry on 4xx, and expect multi-second latency. You can get 500 free credits and rerun this test on your own ASINs.