Allegro API

Search allegro.pl offers and prices with one API

The Allegro API returns listings from Poland's largest online marketplace as clean JSON.

A
/allegro/v1

5 active endpoints. Every call is 2 credits.

  • POST/allegro/v1/search
  • POST/allegro/v1/category
  • POST/allegro/v1/offer
  • POST/allegro/v1/seller_offers
  • POST/allegro/v1/suggested

What Allegro endpoints does ReefAPI ship?

5 live read endpoints. Read-only data API: no writes, no account actions, no dashboard access on the target site.

5 endpoints

search

2 cr

Search Allegro by keyword.

required
query
optional
max_pages, sort, min_price, max_price, condition, free_delivery, category

category

2 cr

Browse an Allegro category without a keyword (the /kategoria/<slug> grid).

required
category
optional
max_pages, sort, min_price, max_price, condition, free_delivery

offer

2 cr

Single Allegro offer/product detail by id or URL.

required
optional
offer_id, offer_url, url

seller_offers

2 cr

A seller's public active listings, paginated.

required
seller
optional
max_pages, sort

suggested

2 cr

Related/recommended Allegro offers for a keyword.

required
query
optional

Every parameter, every allowed value →

Allegro API

3 of 5 endpoints, ready to run

View docs ↗

Offer cards for a term: price in zloty, price with delivery, rating, how many offers exist for the product, and the Polish attribute block.

2 credits1 required · 0 optional
POST/allegro/v1/suggested
idle
// Press "Try it" and this pane shows exactly what the
// live site returned this second — including an empty
// result, if that is the truth. No key, no account.

How the Allegro API works

Allegro is a normal ReefAPI surface — the same four rules that hold for every other engine on the key.

01
Authenticate
x-api-key header

No OAuth app, no request signing, no per-site account. One key covers all 185 engines.

02
Call
POST /allegro/v1/…

Every route is a POST with a JSON body. Parameters are validated against the published schema before anything is charged.

03
Pay
2 credit per call

Credits, not seats. Failed and blocked calls are never charged, and cache hits cost nothing.

04
Read
{ ok, data, meta, error }

One envelope everywhere. meta carries latency_ms, record_count and the endpoint that answered.

Browse a department, then open an offer

Allegro is one country and one currency, so the work here is not geography — it is knowing which of two similar-looking endpoints to spend a call on.

01category
POST/allegro/v1/category
{"category": "elektronika"}

One of ten department slugs. Take id from a row — that is the offer id, distinct from the product id next to it.

02offer
POST/allegro/v1/offer
{"offer_id": <id from above>}

Full offer detail. Search rows already carry price, delivery cost, rating and a Polish attribute block, so detail is only worth a call when you need more than that.

Four credits — every endpoint on this engine is two. Which is exactly why the note below about calling two of them for the same thing is worth reading.

request
curl -X POST https://api.reefapi.com/allegro/v1/suggested \
  -H "x-api-key: $REEF_KEY" \
  -H "content-type: application/json" \
  -d '{"query":"iphone 15"}'
response envelope
{
  "ok": true,
  "data": { … },
  "meta": {
    "api": "allegro",
    "endpoint": "suggested",
    "mode": "live",
    "latency_ms": …,
    "record_count": …
  },
  "error": null
}

What is in an Allegro offer row, and which rows are not offers

Allegro identifies the same listing two ways and mixes non-offer tiles into the same grid, which is where most integrations go wrong. These fields were measured on a live search for "iphone 15" on 2026-08-26 - 68 rows against a meta.total of 192,928. Prices are always PLN objects, never bare numbers.

FieldWhat it holdsMeasured example
idthe numeric offer id - the digits in allegro.pl/oferta/<id>"18678737081"
product_ida UUID identifying the product, not the offer"2c471a7b-e083-42cc-b811-faffef64ef77"
type"product" on a real row, "banner" on a promo tile67 product rows and 1 banner in one page
contextSPONSORED, PROMOTED or REGULAR (null on banner rows)12 / 34 / 21 in one page
price, price_with_delivery, lowest_shippingeach an {amount, currency:"PLN"} object2629.0 / 2639.49 / 10.49
delivery_textPolish display string, comma as the decimal mark"2639,49 zł z dostawą"
seller.typethe seller class Allegro printsFirma, Oficjalny sklep, Prywatny sprzedawca
seller.positive_feedback_percentfloat from 0 to 100, beside a super_seller boolean97.4, 98.2
popularitya Polish sentence, not a number"326 osób kupiło ostatnio"
urlthe offer link, except on sponsored rowssponsored rows return an allegro.pl/events/clicks redirect

condition is primarily a filter (new = Nowy, used = Używany). It is only PARTLY readable back: measured 2026-08-27, 8 of 63 rows carried a Stan attribute (Używany or Powystawowy) inside the attribute block and the other 55 did not, because the seller never filled it in. So filter for condition rather than parsing for it - but do not assume the row never tells you. A value the filter does not recognise is swallowed silently: an invalid condition returns ok:true and the unfiltered result count.

One country, and which Allegro this is

Half the search results for this brand name are a C game-programming library and a network measurement appliance. This page is neither: it is allegro.pl, Poland's largest marketplace. With that out of the way, here is what a call actually returns.

Market

Poland, allegro.pl. One site, no country parameter, and no other national edition behind it.

Currency

Zloty on every row, and there are three price fields: the offer price, the price including delivery, and the cheapest shipping option on its own. They are not interchangeable.

Two ids per row

A numeric offer id — one seller's listing — and a product id that is a UUID, identifying the catalogue product many sellers list against. The offer id is what detail takes.

Attributes come back in Polish

Rows carry a structured attribute block with the specification already in it — colour, screen size, storage, memory — under Polish field names. It means you often do not need a second call per product, and it means a mapping table is the first thing you will write.

Ten departments, and the error tells you which

Category browse takes ten top-level slugs and nothing else. Send a real Allegro sub-category slug and it is rejected in about half a second, without spending a credit, and the error body lists all ten valid values. That is a cheap way to discover the vocabulary.

Against us — the same parameter name behaves two ways

There is also a category parameter on search, and it does not follow the same contract: it accepts any string, returns success, and changes the result count by barely a percent. One name, two endpoints, two behaviours. Filter by department using the browse endpoint, not the search parameter.

Against us — a wrong condition is swallowed

The condition filter works with the two values it accepts. Give it a value it does not know and the call still succeeds, with no warning, and returns the unfiltered result count. Validate before you send rather than trusting the response.

Against us — two endpoints, nearly one result set

The suggested endpoint returns a superset of what search returns for the same term — in a measured run every id from search was also in suggested, with a handful extra. Both cost two credits. Calling both for the same query buys almost nothing.

What people build with Allegro

The jobs this data is most often used for.

5

endpoints

2

credits per call

01

Pricing teams call search to track competitor prices and delivery offers across Allegro.

02

Seller-intelligence tools use seller_offers to audit a competitor's full Allegro inventory.

03

Market analysts use category to size supply and price ranges in a Polish product segment.

What Allegro data costs

The cheapest call here is 2 credits, so $15/mo (Pro) buys 5,000 of them — $1.50 per 1,000 credits. Credits roll over and never expire, and failed or blocked calls are not charged.

Full pricing →
$0.67–$1.50 / 1,000 credits
  • 1,000 free credits on signup, no card
  • One key, all 185 APIs, one credit pool
  • Failed and blocked calls are never charged
  • Credits roll over and never expire

Call it in two lines

Sign up, get 1,000 credits and one key that works on every engine. Then this is the whole protocol.

curl
curl -X POST https://api.reefapi.com/allegro/v1/suggested \
  -H "x-api-key: $REEF_KEY" \
  -H "content-type: application/json" \
  -d '{"query":"iphone 15"}'
python
import requests

r = requests.post(
    "https://api.reefapi.com/allegro/v1/suggested",
    headers={"x-api-key": REEF_KEY},
    json={
  "query": "iphone 15"
},
)
print(r.json()["data"])
FAQ

Have a question? We got answers.

The questions people actually ask before wiring up Allegro.

Get a free key →
What is the difference between id and product_id?

id is the offer - one seller's listing, with its own price, stock and delivery - and it is the number in allegro.pl/oferta/<id>. product_id is the catalog product that many sellers list against, and it is a UUID, not a number; it is the trailing segment of an allegro.pl/produkt/<slug>-<uuid> URL. A measured row carried id 18678737081 and product_id 2c471a7b-e083-42cc-b811-faffef64ef77 for the same iPhone 15. Use the offer id for price tracking and the product UUID to group competing sellers.

Why is there a row in offers[] with every field null?

Because Allegro injects promotional tiles into its own results grid, and the engine returns the grid as served rather than quietly deleting rows. That row has type "banner", an id of BEST_PRICE_GUARANTEE_BANNER, a Polish title, and null for url, price, seller, rating and everything else. One appeared per measured page. Filter on type == "product" before you iterate, or your price parser will trip on the first null.

Why is the url an allegro.pl/events/clicks link instead of the offer page?

That is Allegro's ad click-tracker, and it appears on exactly the sponsored rows - in a measured page of 68, all 12 rows with is_sponsored true carried a /events/clicks URL and all 55 organic rows carried a direct link. The tracker does redirect to the offer, but it embeds an emission id and a timestamp, so it is neither stable nor durable. Build the canonical link from the id instead: https://allegro.pl/oferta/<id>.

What do context, is_sponsored and promoted distinguish?

context is Allegro's own placement label, with three measured values: SPONSORED (a paid ad slot, 12 rows), PROMOTED (a seller-boosted listing that still ranks organically, 34 rows) and REGULAR (21 rows). is_sponsored tracks SPONSORED only, and promoted tracks PROMOTED. If you are measuring genuine organic position, drop SPONSORED - keeping it inflates how prominent a brand looks.

Does Allegro still have auctions, and can I see bids?

Not in this response shape. Every measured row was a fixed-price listing carrying a single price object; there is no bid count, no current bid, no time remaining and no auction-versus-buy-now flag anywhere in the payload, and the only condition-related control is the new/used filter. Treat this engine as buy-now price intelligence. If a listing happens to be an auction on the site, you still get its displayed price, but you cannot tell it apart here.

How many offers do I get per page, and how far can I go?

A page is roughly 60 rows - a measured search returned 68, banner included - and max_pages runs to 10, so about 600 offers per query is the ceiling against a meta.total that read 192,928. meta.pages_fetched reports what was actually retrieved. For deeper coverage, split the query into min_price / max_price bands or add a category slug, or switch to seller_offers, which walks one seller's catalog the same way (61 rows on the first page of a measured storefront).

Why does the offer action return less than the search row for the same listing?

They read different pages. A search row carries rating, rating_count, delivery prices, seller feedback percent, parameters and category_id; the offer action reads the product page and returns id, url, title, price plus price_string ("2629,00 zł"), the full-resolution image gallery and a thin seller object of login and listing_url - with description null on the listing measured. If you need the commercial fields, keep the search row instead of re-fetching detail.

What does product_offers_count count?

The offers grouped under that product in the view you are looking at, not a global total. The same offer id returned product_offers_count 156 when it arrived through a keyword search - the sellers competing on that product page - and 1 when the same offer came back through seller_offers, where the surrounding view is a single storefront. Read it as a per-response figure and do not compare it across actions.

What is the Allegro API?

Allegro API is a ReefAPI endpoint group for allegro It returns live JSON through POST requests under /allegro/v1.

Is the Allegro API free to try?

Yes. ReefAPI starts with 1,000 free credits, no card required. Allegro calls use the same shared credit balance as every other ReefAPI engine.

Do I need an Allegro login or account?

No login to Allegro is needed for the API response. You call ReefAPI with your x-api-key header, and the playground can run live examples before you create a production key.

How fresh is the Allegro data?

The page example is captured from a live search call, and production requests fetch live data through ReefAPI rather than a static sample.

How many credits does the Allegro API use?

Allegro actions currently cost 2 credits per successful call. Failed or blocked calls are free, and all APIs draw from one credit pool.

Can I call Allegro from an AI assistant or MCP client?

Yes. Connect ReefAPI once through MCP and your assistant can call allegro actions with the same key, credit pool and JSON envelope used by normal REST requests.

37 E-commerce & Marketplaces APIs on the same key

One key, one credit pool, one response envelope. If you are pulling Allegro, you are one call away from the rest of the category — no second contract, no second integration.

Try it on your own data before you pay anything

The call above is the real endpoint, not a recording. A free key gives you 1,000 credits, the other 184 APIs, and the same envelope everywhere.

Endpoints, parameters and credit costs on this page are read from the live catalog and cannot drift from what the API accepts. Field notes were captured on 2026-08-27.