PretCarburant.ro nyilvános API — REST v1

Programozott hozzáférés az aggregált romániai üzemanyagár-adatokhoz. Ugyanaz az adat, amit mi is használunk az oldalon, naponta többször frissül, hitelesítés nélkül. Creative Commons BY 4.0 licenc — szabadon használható forrásmegjelöléssel.

Többre van szükséged az ingyenes keretnél? Kereskedelmi csomagok 19 €/hó-tól — 10 000–1 000 000 kérés/hó, 3 napos próba. Csomagok megtekintése →

Gyorsindítás — nulláról az első sikeres hívásig

  1. Kulcs beszerzése — vagy kezdés kulcs nélkül. Az API kulcs nélkül is azonnal hívható, csökkentett adatkészlettel (részletek a hitelesítés szakaszban). Kereskedelmi kulcs a csomagoldalon igényelhető; a pcro_live_ előtagú kulcs a feliratkozás után néhány percen belül emailben érkezik.

  2. Az első hívás. Terminálból, regisztráció nélkül:

    curl -s https://pretcarburant.ro/api/v1/preturi

    Valós válasz (rövidítve: a rezultate és a retele listából csak az első elemet mutatjuk):

    {
      "data": "2026-09-02",
      "nota": "Acces public: top 20 orase. Setul complet (368 orase cu preturi) necesita o cheie API: https://pretcarburant.ro/api-preturi-carburanti",
      "preturi_lipsa": "null",
      "retele": [
        {
          "benzina": 8.92,
          "benzina_premium": 9.4,
          "culoare": "#E31937",
          "gpl": 3.72,
          "logo": "/static/img/brands/petrom.svg",
          "motorina": 9.73,
          "motorina_premium": 10.5,
          "nume": "Petrom",
          "slug": "petrom"
        }
      ],
      "rezultate": [
        {
          "benzina": 8.92,
          "benzina_premium": 9.4,
          "gpl": 4.23,
          "judet": "B",
          "lat": 44.42527,
          "lng": 26.01369,
          "motorina": 9.67,
          "motorina_premium": 10.49,
          "oras": "Bucuresti",
          "slug": "bucuresti"
        }
      ],
      "status": "ok",
      "total": 20
    }
  3. Mit jelent, amit kapott? A rezultate tömb minden eleme egy város a jelenleg elérhető legalacsonyabb árakkal, RON/liter egységben: benzina = standard benzin, motorina = standard gázolaj, gpl = LPG; a null azt jelenti, hogy az adott üzemanyagra nincs adatunk (soha nem 0 — lásd az árkonvenciót). A retele tömb a hálózatok országos átlagárait hozza. Kulcs nélkül a top-20 várost kapja, és a nota mező jelzi a korlátozást; az X-Api-Key fejléccel az összes legalább egy árral rendelkező város érkezik (jelenleg 368). Innen a végpont-referencia a következő lépés.

Hitelesítés: az X-Api-Key fejléc

A kereskedelmi kulcsot HTTP-fejlécben kell küldeni, minden egyes kérésnél. A fejléc neve X-Api-Key; query-paraméteres vagy cookie-alapú változat nincs.

curl -s -H "X-Api-Key: pcro_live_A_SAJAT_KULCSOD" \
  https://pretcarburant.ro/api/v1/preturi

Kulcs nélkül a hívás nem bukik el. Ez tudatos döntés: minden végpont válaszol, de csökkentett adatkészlettel vagy szigorúbb korláttal:

Érvényes kulccsal a teljes adatkészletet és a csomag havi kvótáját kapja, valamint minden válaszon az X-RateLimit-* fejléceket. Érvénytelen vagy visszavont kulcsra viszont a válasz explicit 401 — nem csendes visszaesés a publikus szintre, hogy a hibát azonnal észrevegye. A valós 401-es törzs:

{
  "message": "Invalid or revoked API key.",
  "status": "error"
}

A kulcsot kezelje titokként: ne építse be kliensoldali JavaScriptbe és ne kommitolja repóba — az API-t szerveroldalról hívja.

Elérhető végpontok

Bázis URL: https://pretcarburant.ro/api/v1/. Minden válasz JSON (UTF-8), a nyilvános végpontokon nyitott CORS-szal (Access-Control-Allow-Origin: *). A HTTP-válaszok no-store cache-fejléccel érkeznek — köztes cache nem tárolja őket; maguk az áradatok naponta többször frissülnek, frissességüket az actualizat_la mező és a health check mutatja. Egy /api/ alatti hibás útvonal JSON-törzsű 404-et ad, nem HTML-oldalt.

REST v1 végpontok
VégpontLeírásKorlát kulcs nélkül
GET /api/v1/preturi Városonként aggregált árak (opcionális szűrő ?judet=CLUJ) Nincs korlát (top-20 város)
GET /api/v1/preturi/minime Országos minimum/átlag/maximum árak üzemanyagtípusonként Nincs korlát
GET /api/v1/judete/<judet> Megyei szintű aggregált átlagár (pl. /api/v1/judete/CLUJ) 1 kérés/hét/IP
GET /api/v1/retele Figyelt hálózatok márkaszintű átlagárakkal 1 kérés/hét/IP
GET /api/v1/statii Állomáslista koordinátákkal, márkával, árakkal (szűrők: ?brand=, ?tip=, ?lat=&lon=&raza= a sugáron belüli állomásokhoz, km). Minden rekord tartalmaz egy stabil id-t az állomáshoz. 1 kérés/hét/IP (150 rekordos minta)
GET /api/v1/statie/<station_id>/istoric Egy töltőállomás árelőzményei (station_id = az id mező a /api/v1/statii válaszból; ismeretlen id → 404) 1 kérés/hét/IP
GET /api/v1/geocode Városnév-kiegészítés (?q=cluj, min. 2 karakter) 1 kérés/hét/IP
POST /api/v1/traseu/custom Töltőállomások egy A→B útvonal mentén (JSON body: start, end, tip) 1 kérés/hét/IP
GET /api/v1/cheie A saját API-kulcs csomagja és fogyasztása (csak kulccsal hívható) Nem fogyasztja a kvótát
GET /api/v1/health Az adatok állapota: frissesség és az árral rendelkező rekordok száma (lásd health check) Nincs korlát (cache nélkül)

A specifikáció további, nem a kereskedelmi adatmaghoz tartozó végpontokat is leír: GET /api/v1/reviews/<slug> és POST /api/v1/review (állomásértékelések), GET /api/v1/de-statii (németországi állomások és árak EUR-ban, Tankerkönig/MTS-K forrásból, 30 kérés/perc/IP), valamint a saját weboldalunk által használt /api/v1/push/* végpontok. Teljes leírásuk az openapi.json-ban található.

OpenAPI 3.1 specifikáció

A teljes v1 API-t formálisan leírja egy OpenAPI 3.1 specifikáció, amely a https://pretcarburant.ro/openapi.json címen érhető el (alias: /api/v1/openapi.json). Tartalmazza az összes végpontot, paramétert, válaszformát és hibakódot — közvetlenül importálható a Postmanbe vagy az Insomniába, az openapi-generator segítségével kliens generálható belőle a saját nyelvedre, vagy odaadhatod egy AI kódasszisztensnek, hogy megírja helyetted az integrációt. Korlátozás és kulcs nélkül, nyitott CORS-szal szolgáljuk ki; az /openapi.json Cache-Control: public, max-age=300 (5 perc) fejléccel érkezik, az /api/v1/openapi.json alias pedig no-store-ral, mint az API többi része.

curl -s https://pretcarburant.ro/openapi.json | jq '.info.version'

Végpont-referencia

Minden szakasz ugyanazt a sémát követi: mire való a végpont, milyen paramétereket fogad, egy valós kérés és a hozzá tartozó, az alkalmazásból rögzített valós válasz (a hosszú listák az első elemre rövidítve), végül a válasz mezői. A hiányzó árak mindenhol null-ként érkeznek — a konvenció itt.

GET /api/v1/preturi — árak városonként + hálózati átlagok

Erre a kérdésre válaszol: „melyik városban mennyibe kerül ma az üzemanyag?" — egyetlen hívásban a követett városok legalacsonyabb árai és a hálózatok országos átlagai. A kereskedelmi kulcsok fő végpontja és a beágyazható widget adatforrása.

Paraméterek — /api/v1/preturi
ParaméterTípusKötelezőAlapértékLeírás
judetstringopcionális—Egy megyére szűr: teljes név (ékezettel vagy anélkül) vagy rendszám-kód (pl. CJ)
zerosstringopcionális—1/true/yes/da: a hiányzó árak null helyett 0-val (kompatibilitási mód, részletek)
curl -s "https://pretcarburant.ro/api/v1/preturi?judet=CLUJ"

Valós válasz (kulcs nélkül; a top-20 listából a szűrő után egy Cluj megyei város marad):

{
  "data": "2026-09-02",
  "nota": "Acces public: top 20 orase. Setul complet (368 orase cu preturi) necesita o cheie API: https://pretcarburant.ro/api-preturi-carburanti",
  "preturi_lipsa": "null",
  "retele": [
    {
      "benzina": 8.92,
      "benzina_premium": 9.4,
      "culoare": "#E31937",
      "gpl": 3.72,
      "logo": "/static/img/brands/petrom.svg",
      "motorina": 9.73,
      "motorina_premium": 10.5,
      "nume": "Petrom",
      "slug": "petrom"
    }
  ],
  "rezultate": [
    {
      "benzina": 8.69,
      "benzina_premium": 9.4,
      "gpl": 4.29,
      "judet": "CJ",
      "lat": 46.762296886121476,
      "lng": 23.556419477800848,
      "motorina": 9.27,
      "motorina_premium": 10.29,
      "oras": "Cluj Napoca",
      "slug": "cluj-napoca"
    }
  ],
  "status": "ok",
  "total": 1
}
Válaszmezők — /api/v1/preturi
MezőTípusJelentés
statusstringMindig "ok" sikeres válasznál
datastringA szerver naptári napja a válasz pillanatában, ISO 8601 ("2026-09-02") — nem az árak dátuma: éjfél után vagy egy kiesett forrás mellett is a mai napot mutatja
actualizat_lastring vagy nullAz áradatok utolsó sikeres frissítésének időpontja, ISO 8601 időzóna-eltolással — ugyanaz a számítás és érték, mint a /health végponton. 2026.09.25-én került be (a fenti rögzített példából hiányzik); a /preturi/minime, /retele és /judete válaszokban is megvan
totalintegerA rezultate-ban visszaadott városok száma
rezultate[]objektumlistaVárosonként: oras, slug, judet (rendszám-kód), lat, lng, valamint öt ármező (benzina, benzina_premium, motorina, motorina_premium, gpl) — number vagy null, RON/liter
retele[]objektumlistaHálózatonként: nume, slug, culoare (hex márkaszín), logo (relatív útvonal) + ugyanaz az öt ármező, országos átlagként
preturi_lipsastring"null" vagy "zero" — a hiányzó árak aktív konvenciója
notastringCsak kulcs nélkül: a top-20-as korlátozás magyarázata

Kulccsal: az összes legalább egy árral rendelkező város érkezik (jelenleg 368; azok a városok, ahol csak ár nélküli állomásunk van, kimaradnak), a nota mező eltűnik, és a válasz megkapja az X-RateLimit-* fejléceket.

GET /api/v1/preturi/minime — országos minimum / átlag / maximum

Erre a kérdésre válaszol: „mennyi ma a legolcsóbb, az átlagos és a legdrágább ár az országban, üzemanyagtípusonként?" Kulcs és kvóta nélkül, bárhonnan hívható.

Paraméterek — /api/v1/preturi/minime
ParaméterTípusKötelezőAlapértékLeírás
zerosstringopcionális—1/true/yes/da: régi 0-konvenció (részletek)
curl -s https://pretcarburant.ro/api/v1/preturi/minime

Valós válasz (teljes):

{
  "data": "2026-09-02",
  "preturi": {
    "benzina_premium": {
      "max": 9.9,
      "mediu": 9.6,
      "min": 8.88
    },
    "benzina_standard": {
      "max": 9.42,
      "mediu": 8.98,
      "min": 8.69
    },
    "gpl": {
      "max": 5.0,
      "mediu": 4.34,
      "min": 3.61
    },
    "motorina_premium": {
      "max": 10.89,
      "mediu": 10.53,
      "min": 10.2
    },
    "motorina_standard": {
      "max": 10.49,
      "mediu": 9.74,
      "min": 9.27
    }
  },
  "preturi_lipsa": "null",
  "status": "ok"
}
Válaszmezők — /api/v1/preturi/minime
MezőTípusJelentés
preturiobjektumKulcs = üzemanyagtípus (benzina_standard, benzina_premium, motorina_standard, motorina_premium, gpl)
preturi.*.min / mediu / maxnumber | nullOrszágos minimum / átlag / maximum, RON/liter

A kulcs itt nem változtat semmin — a válasz mindig a teljes országos aggregátum.

GET /api/v1/judete/<judet> — megyei átlagárak

Erre a kérdésre válaszol: „mennyi az átlagár egy adott megyében?" — a megye összes követett városa fölött átlagol. Tipikus felhasználás: flottakezelés, ERP/TMS integrációk költségbecslése.

Paraméterek — /api/v1/judete/<judet>
ParaméterTípusKötelezőAlapértékLeírás
judet (útvonalban)stringkötelező—Megyenév (ékezettel vagy anélkül, pl. cluj) vagy rendszám-kód (CJ)
zerosstringopcionális—1/true/yes/da: régi 0-konvenció
curl -s https://pretcarburant.ro/api/v1/judete/CLUJ

Valós válasz (teljes):

{
  "benzina_premium": 9.55,
  "benzina_standard": 8.92,
  "data": "2026-09-02",
  "gpl": 4.35,
  "judet": "CJ",
  "motorina_premium": 10.52,
  "motorina_standard": 9.65,
  "nr_orase": 15,
  "preturi_lipsa": "null",
  "status": "ok"
}
Válaszmezők — /api/v1/judete/<judet>
MezőTípusJelentés
judetstringA normalizált rendszám-kód (bármilyen formát küldött, ez jön vissza)
nr_oraseintegerHány város árai fölött készült az átlag
benzina_standard, benzina_premium, motorina_standard, motorina_premium, gplnumber | nullMegyei átlagár RON/literben; null, ha a megyében nincs adat az adott üzemanyagra

Figyelem: itt az ármezők a _standard utótagos neveket használják (benzina_standard), míg a /preturi válaszában a rövid benzina/motorina nevek szerepelnek — a két végpont mezőnevei nem cserélhetők fel. Ismeretlen megyére a válasz 404. Kulcs nélkül a heti kvóta alá esik; kulccsal a havi kvótát fogyasztja.

GET /api/v1/retele — hálózatok országos átlagárai

Erre a kérdésre válaszol: „melyik hálózat mennyiért ad ma üzemanyagot országos átlagban?" — árösszehasonlítás márkák között, saját felületre építhető márkaszínnel és logóval.

Paraméterek — /api/v1/retele
ParaméterTípusKötelezőAlapértékLeírás
zerosstringopcionális—1/true/yes/da: régi 0-konvenció
curl -s https://pretcarburant.ro/api/v1/retele

Valós válasz (rövidítve: a 8 hálózatból az elsőt mutatjuk):

{
  "data": "2026-09-02",
  "preturi_lipsa": "null",
  "retele": [
    {
      "benzina": 8.92,
      "benzina_premium": 9.4,
      "culoare": "#E31937",
      "gpl": 3.72,
      "logo": "/static/img/brands/petrom.svg",
      "motorina": 9.73,
      "motorina_premium": 10.5,
      "nume": "Petrom",
      "slug": "petrom"
    }
  ],
  "status": "ok"
}
Válaszmezők — /api/v1/retele
MezőTípusJelentés
retele[].numestringA hálózat neve (pl. "Petrom")
retele[].slugstringURL-barát azonosító
retele[].culoarestringA márka hex színe, UI-hoz
retele[].logostringA logó relatív útvonala
retele[].benzina … gplnumber | nullOrszágos átlagár RON/literben, üzemanyagtípusonként

GET /api/v1/statii — rekordok állomásszinten

Erre a kérdésre válaszol: „hol tankoljak a közelben, és pontosan mennyiért?" — állomásszintű rekordok koordinátákkal, térképes és útvonaltervező alkalmazásokhoz. Adatmodell: egy fizikai állomás üzemanyagtípusonként külön rekordként jelenik meg; a rekordokat a stabil id mező köti ugyanahhoz az állomáshoz.

Paraméterek — /api/v1/statii
ParaméterTípusKötelezőAlapértékLeírás
brandstringopcionális—Márkaszűrő, kis/nagybetű-független (pl. omv)
tipstringopcionális—Üzemanyagszűrő: benzina_standard, benzina_premium, motorina_standard, motorina_premium, gpl vagy adblue (AdBlue, csak egyes állomásokon)
latnumberopcionális—Geo-szűrő (a lon-nal együtt): csak a sugáron belüli állomások, távolság szerint rendezve
lonnumberopcionális—Hosszúság a geo-szűrőhöz; a lng aliasként elfogadott
razanumberopcionális10A geo-szűrő sugara km-ben; 0,1 és 50 közé korlátozva
curl -s "https://pretcarburant.ro/api/v1/statii?lat=46.77&lon=23.62&raza=5"

Valós válasz (rövidítve: a 98 rekordból az elsőt mutatjuk):

{
  "data": "2026-09-02",
  "statii": [
    {
      "adresa": "str.Teodor Mihali",
      "brand": "Mol",
      "distanta_km": 0.94,
      "id": "7f5f7f40390e",
      "judet": "",
      "lat": 46.77845,
      "lng": 23.62024,
      "oras": "Cluj-Napoca",
      "pret": 9.02,
      "tip": "benzina_standard"
    }
  ],
  "status": "ok",
  "total": 98
}
Válaszmezők — /api/v1/statii
MezőTípusJelentés
actualizat_lastring | nullAz árak utolsó sikeres frissítésének időpontja, ISO 8601 időzónával — ugyanaz, mint a /api/v1/health válaszában
totalintegerA visszaadott rekordok száma (az esetleges publikus csonkítás után)
statii[].idstringAz állomás stabil azonosítója — ezt kell a /statie/<id>/istoric végpontnak adni. Az ár nélküli pont nem ismétlődik ugyanazon id + tip pár áras rekordja mellett
statii[].brand, oras, adresa, judetstringMárka, város, cím, megye. A judet lehet üres string, ha a forrás nem adta meg
statii[].lat, lngnumberKoordináták
statii[].tipstringAz öt üzemanyagtípus egyike, egyes állomásokon adblue; minden rekordon megvan
statii[].pretnumber | nullRON/liter; null = nincs elérhető ár
statii[].pret_expiratbooleanCsak akkor jelenik meg (true), ha az árat visszavontuk, mert a forrása több mint 24 órája nem frissült
statii[].nesigurbooleanCsak akkor jelenik meg (true), ha az árat kiadjuk, de az oldal nem támaszkodik rá (beragadt, árva vagy régi megfigyelés): kihagyja a minimumokból és a toplistákból, blocat és observatie_veche esetén pedig az állomás oldalán „bizonytalan ár” jelzést is kap. A válaszból számolt minimumból ezeket a rekordokat ki kell hagyni; az oldal országos minimuma ezen felül az elszigetelt vagy kiugró árakat is kihagyja
statii[].motiv_nesigurstringCsak a nesigur mellett: blocat (legalább 14 napja változatlan, miközben a márka hálózatának többi része árat váltott), observatie_veche (a forrás legalább 7 napja nem jelentette) vagy orfan_anpc (a Monitorul Prețurilor már nem küldi a sort)
statii[].nesigur_dinstring | nullCsak a nesigur mellett: a nap, amióta az ár változatlan (blocat), vagy az utolsó megfigyelés napja (observatie_veche); orfan_anpc esetén null. Az ANPC a bejelentés napjával datálja az árat, ezért az observat_la beragadt árnál is lehet friss
statii[].pret_masurat_lastringHa a forrás megadja: a mérés dátuma pontosan úgy, ahogy a forrás küldi (ANPC nap, SOCAR oldal időpontja). A kiadott ár korához az observat_la mezőt használja
statii[].pret_incoerentbooleanCsak akkor jelenik meg (true), ha a prémium árat visszavontuk, mert ugyanazon a kúton a standard alatt volt (a pret ilyenkor null)
statii[].nume, franciza, nota_pret, program, servicii, telefonstring / booleanHa a forrás megadja: a kézzel felvett állomások neve; a franchise SOCAR állomások, amelyek árát a hálózat nem közli, egy (román nyelvű) megjegyzéssel; nyitvatartás, szolgáltatások és telefonszám
statii[].coord_suspecta, approximate_coordsbooleanCsak akkor jelenik meg (true), ha a hálózat koordinátái más megyébe esnek, mint a megadott, illetve ha közelítőek
statii[].observat_lastring | nullMikor figyelték meg az árat, ISO 8601: a Monitorul Prețurilor (ANPC) áraknál csak a bejelentés napját közöljük, óra nélkül ("2026-09-22"); a SOCAR oldalánál és a kézi bejelentéseknél időpontot időzónával; null = a forrás nem mondja meg, vagy nincs ár. Soha nem a forrás letöltésének ideje
statii[].distanta_kmnumberCsak geo-szűrőnél: távolság a kért ponttól km-ben; a lista e szerint növekvően rendezett
total_disponibil, notainteger, stringCsak kulcs nélkül, csonkított válasznál: hány rekord létezne összesen + magyarázat

Kulcs nélkül a válasz legfeljebb 150 rekordos minta — például a ?brand=petrom&tip=motorina_standard szűrőre a rögzítéskor total: 150 és total_disponibil: 397 érkezett. Kulccsal a teljes készlet jön (a rögzítéskor 6 189 rekord). 2026. 09. 28. óta a válaszban nincsenek ár nélküli pontok egy ugyanazon állomás és üzemanyag áras rekordja mellett, és nincsenek tip nélküli rekordok.

GET /api/v1/statie/<station_id>/istoric — egy állomás árelőzményei

Erre a kérdésre válaszol: „hogyan mozgott ennek az állomásnak az ára az elmúlt napokban?" — grafikonhoz, trendfigyeléshez. A station_id a /statii válasz id mezőjéből jön.

Paraméterek — /api/v1/statie/<station_id>/istoric
ParaméterTípusKötelezőAlapértékLeírás
station_id (útvonalban)stringkötelező—Az állomás id-ja a /statii válaszból
daysintegeropcionális30Hány nap előzmény; legfeljebb 90
curl -s "https://pretcarburant.ro/api/v1/statie/2f4185850d36/istoric?days=30"

Valós válasz (a rögzítés egynapos fejlesztői adatbázisról készült — élesben a labels legfeljebb days elemű, a series listái pedig vele azonos hosszúak):

{
  "labels": [
    "02.09"
  ],
  "series": {
    "benzina_premium": [
      9.4
    ],
    "benzina_standard": [
      8.92
    ],
    "motorina_premium": [
      10.5
    ],
    "motorina_standard": [
      9.73
    ]
  },
  "station_id": "2f4185850d36",
  "status": "ok",
  "variatie": {}
}
Válaszmezők — /api/v1/statie/<station_id>/istoric
MezőTípusJelentés
labels[]string-listaNapcímkék NAP.HÓNAP formátumban (pl. "02.09") — megjelenítésre szánt címkék, nem ISO-dátumok
seriesobjektumKulcs = üzemanyagtípus; érték = a labels-szel azonos hosszúságú árlista (null hézagokkal, ahol nincs mérés)
variatieobjektumLegalább 2 napnyi adat esetén: az utolsó két nap árkülönbsége üzemanyagtípusonként (RON); különben üres objektum

Ismeretlen vagy előzmény nélküli station_id-ra a válasz 404.

GET /api/v1/geocode — városnév-kiegészítés

Mire való: egy szabad szöveges bemenetből (kereső, űrlap) a többi híváshoz használható kanonikus városnevet ad. Nem általános geokóder — csak a követett romániai városok között keres.

Paraméterek — /api/v1/geocode
ParaméterTípusKötelezőAlapértékLeírás
qstringkötelező—Városnév-töredék, legalább 2 karakter (alatta üres lista jön vissza)
curl -s "https://pretcarburant.ro/api/v1/geocode?q=cluj"

Valós válasz (teljes):

{
  "results": [
    "Cluj-Napoca"
  ]
}
Válaszmezők — /api/v1/geocode
MezőTípusJelentés
results[]string-listaLegfeljebb 10 találat; részsztring-egyezés, kis/nagybetű-független

Ez a válasz nem hordoz status mezőt — a siker jele maga a results lista.

POST /api/v1/traseu/custom — állomások egy A→B útvonal mentén

Erre a kérdésre válaszol: „hol tankoljak útközben?" — geokódolja a két végpontot, kiszámolja az útvonalat, és visszaadja az útvonal menti állomásokat a kért üzemanyag árával. Ez az egyetlen POST végpont az adatmagban.

Kéréstörzs (JSON) — /api/v1/traseu/custom
MezőTípusKötelezőAlapértékLeírás
startstringkötelező—Kiindulási helység (pl. "Bucuresti")
endstringkötelező—Célhelység (pl. "Brasov")
tipstringopcionálisbenzina_standardAz öt üzemanyagtípus egyike
razanumberopcionális5Legfeljebb ekkora távolságra az útvonaltól, km-ben; 15-re plafonálva
curl -s -X POST https://pretcarburant.ro/api/v1/traseu/custom \
  -H "Content-Type: application/json" \
  -d '{"start": "Bucuresti", "end": "Brasov", "tip": "motorina_standard"}'

Valós válasz (rövidítve: a 153 állomásból az elsőt, a waypoints-ból az első két pontot mutatjuk):

{
  "duration_min": 165,
  "end": {
    "lat": 45.655,
    "lng": 25.611,
    "name": "Brasov"
  },
  "km": 182.0,
  "ok": true,
  "start": {
    "lat": 44.4268,
    "lng": 26.1025,
    "name": "Bucuresti"
  },
  "statii": [
    {
      "adresa": "Str. Fagarasului 2",
      "brand": "Rompetrol",
      "dist_ruta": 4.0,
      "lat": 45.662296,
      "lng": 25.574169,
      "oras": "Brasov",
      "pret": 9.67,
      "tip": "motorina_standard"
    }
  ],
  "tip": "motorina_standard",
  "total_statii": 153,
  "waypoints": [
    [
      44.425874,
      26.102435
    ],
    [
      44.428773,
      26.103985
    ]
  ]
}
Válaszmezők — /api/v1/traseu/custom
MezőTípusJelentés
okbooleantrue sikernél — ez a végpont nem a status mezőt használja
start, endobjektumA geokódolt végpontok: name, lat, lng
km, duration_minnumberAz útvonal hossza km-ben és becsült ideje percben
statii[]objektumlistaLegfeljebb 50 állomás; a dist_ruta az útvonaltól mért távolság km-ben
total_statiiintegerHány állomás esik összesen a sávba (a csonkítás előtt)
waypoints[][lat, lng] párokAz útvonal ritkított töréspontjai (legfeljebb ~200 pont), térképre rajzoláshoz

Figyelem: a hibái is a saját formáját követik — {"ok": false, "msg": "..."}, 400-as státusszal, nem a szokásos {status, message} párost (lásd a katalógusban).

GET /api/v1/cheie — a saját kulcs állapota

Erre a kérdésre válaszol: „hol tartok a havi kvótámmal?" — a kliens-dashboard adatforrása. Csak kulccsal hívható, és nem fogyasztja sem a havi, sem a publikus kvótát: a saját fogyasztás ellenőrzése nem kerül semmibe.

curl -s -H "X-Api-Key: pcro_live_A_SAJAT_KULCSOD" \
  https://pretcarburant.ro/api/v1/cheie

Valós válasz (frissen kiállított teszt-kulccsal rögzítve):

{
  "abonament": false,
  "consum_luna": 2,
  "creata": "2026-09-02T20:35:21+00:00",
  "limita_lunara": 10000,
  "plan": "starter",
  "plan_nume": "Starter",
  "status": "ok",
  "total_cereri": 2,
  "ultima_folosire": "2026-09-02T20:35:22+00:00",
  "zilnic": [
    {
      "count": 2,
      "zi": "2026-09-02"
    }
  ]
}
Válaszmezők — /api/v1/cheie
MezőTípusJelentés
plan, plan_numestringA csomag azonosítója és megjelenítendő neve
limita_lunaraintegerA havi kvóta (egyedi limit esetén az egyedi érték)
consum_lunaintegerAz aktuális UTC naptári hónapban elfogyasztott kérések
total_cereriintegerÖsszes kérés a kulcs kiállítása óta
creata, ultima_folosirestring | nullA kulcs létrehozása és utolsó használata, ISO 8601 (UTC)
abonamentbooleanVan-e a kulcshoz aktív előfizetés
zilnic[]objektumlistaNapi bontású fogyasztás az utolsó 30 napra: zi (dátum) + count

Érvénytelen kulcsra itt is 401 a válasz.

Health check: /api/v1/health

Éles üzem előtti és utáni monitorozáshoz: a GET /api/v1/health hitelesítés és korlátozás nélkül válaszol, Cache-Control: no-store fejléccel — egy cache-ből kiszolgált health check pont azt az incidenst rejtené el, amelyet észlelni szeretnél.

Valós válasz (HTTP 200, 2026.09.25.):

{
  "actualizat_la": "2026-09-24T21:15:07.097831+00:00",
  "inregistrari_total": 6656,
  "observatie_cea_mai_veche": "2026-09-21",
  "preturi_disponibile": 5481,
  "preturi_fara_data_observatie": 0,
  "statii_cu_pret": 5481,
  "statii_cu_pret_unice": 1348,
  "statii_total": 1705,
  "status": "ok",
  "vechime_maxima_descarcare_secunde": 19324,
  "vechime_maxima_secunde": 19324,
  "vechime_secunde": 2816
}

A HTTP-státuszkód mindent elmond: 200 = minden szolgálatban lévő árforrás írt az elmúlt 24 órában, és szolgálunk ki árakat; 503 (status: "degraded" értékkel) = legalább egy szolgálatban lévő árforrás 24 óránál régebbi (egy élő forrás nem takar el egy kiesettet), nem maradt szolgálatban lévő árforrás, vagy egyetlen árat sem szolgálunk ki. A szándékosan kivont forrásokat nem vizsgáljuk. Egy olyan monitor, amely csak a státuszkódot nézi, elegendő; 503 esetén a törzs ugyanazt a 12 mezőt tartalmazza.

Hibakatalógus

Az API hibái mindig JSON-törzzsel érkeznek. Az alapforma {"status": "error", "message": "..."}; a kvótahibák további mezőket adnak, a /traseu/custom pedig — történeti okból — {ok, msg} formát használ. A message szövege román nyelvű és nem stabil kontraktus: a kliens a HTTP-státuszkódra és a gépi mezőkre (limit, retry_after_seconds, next_allowed) ágazzon el, soha ne a szövegre.

Hibakódok áttekintése
KódMikor fordul előMit tegyen a kliens
400/traseu/custom: nem geokódolható helység, nem számítható útvonal vagy érvénytelen törzs; bárhol: nem véges szám (nan, inf) egy paraméterben, nem objektum JSON-törzs vagy más típusú szöveges mezőJavítsa a helységneveket; ne próbálkozzon újra változatlan bemenettel
401Érkezett X-Api-Key fejléc, de a kulcs érvénytelen vagy visszavontEllenőrizze a kulcsot (elgépelés, visszavonás); ne álljon automatikus újrapróbálkozásra
404Ismeretlen megye (/judete), ismeretlen vagy előzmény nélküli állomás (/istoric), illetve nem létező útvonal az /api/ alatt (JSON-törzs: {status, message, message_en, docs}, nem HTML-oldal)A megyekódot a /preturi judet mezőjéből, az állomás-id-t a /statii id mezőjéből vegye
429 (csomagkvóta)Érvényes kulccsal, de a havi kvóta elfogyott — a törzsben limit és upgrade_urlOlvassa ki a Retry-After fejlécet (másodpercek a havi visszaállításig), vagy váltson nagyobb csomagra
429 (rövid távú korlát)Ugyanazzal a kulccsal több mint 5 kérés másodpercenként vagy 120 kérés percenként — a törzsben van retry_after_seconds, de nincs limitVárjon a Retry-After fejlécben megadott néhány másodpercig, majd folytassa ritkábban; az elutasított kérés nem számít bele a havi kvótába
429 (publikus kvóta)Kulcs nélkül, a heti 1 kérés elfogyott az adott végponton — a törzsben next_allowed és retry_after_secondsKüldjön API-kulcsot, vagy várjon a next_allowed időpontig (lásd a Retry-After fejlécet is); a csomagok linkje az upgrade_url mezőben és a rel="payment" típusú Link fejlécben van
503/health: egy szolgálatban lévő árforrás 24 óránál régebbi, nem maradt ilyen forrás, vagy nincs kiszolgált árKezelje incidensként; a lekért árakat tekintse elavultnak, amíg a health újra 200-at nem ad
503 (kulccsal)Érkezett X-Api-Key, de a kulcsok ellenőrzése nálunk átmenetileg nem elérhető — a kulcsot nem nyilvánítjuk érvénytelennekPróbálja újra a Retry-After fejlécben megadott másodpercek után (ugyanaz, mint a törzs retry_after_seconds mezője)

401 — érvénytelen kulcs (valós törzs):

{
  "message": "Invalid or revoked API key.",
  "status": "error"
}

404 — ismeretlen megye a /api/v1/judete/xyz hívásra (valós törzs):

{
  "message": "Judet necunoscut: xyz",
  "status": "error"
}

404 — ismeretlen állomás vagy nincs előzmény az /istoric végponton (valós törzs):

{
  "message": "Statie necunoscuta sau fara istoric. Foloseste campul `id` din /api/v1/statii.",
  "status": "error"
}

429 — a csomag havi kvótája elfogyott (valós törzs; a válaszon ott vannak az X-RateLimit-Limit: 10000, X-RateLimit-Remaining: 0, X-RateLimit-Reset és Retry-After fejlécek is):

{
  "limit": 10000,
  "message": "Cvota lunara a planului (10000 cereri) a fost depasita.",
  "status": "error",
  "upgrade_url": "https://pretcarburant.ro/api-preturi-carburanti"
}

429 — a publikus heti kvóta elfogyott (valós törzs; a válaszon ott van a Retry-After fejléc és egy rel="payment" típusú Link fejléc a csomagokra):

{
  "message": "Rate limit: 1 cerere pe saptamana. Urmatoarea cerere permisa peste 6z 23h.",
  "message_en": "Rate limit: 1 request per week per IP for this endpoint without an API key. Next request allowed in 6d 23h.",
  "next_allowed": "2026-09-09T23:31:29.780524+03:00",
  "retry_after_seconds": 604799,
  "status": "error",
  "upgrade_mesaj": "O cheie API inlocuieste limita saptamanala cu cota lunara a planului (de la 10.000 cereri/luna).",
  "upgrade_message": "An API key replaces the weekly limit with a monthly plan quota (from 10,000 requests/month).",
  "upgrade_url": "https://pretcarburant.ro/api-preturi-carburanti",
  "upgrade_url_en": "https://pretcarburant.ro/en/fuel-price-api"
}

400 — a /traseu/custom nem találta a helységet (valós törzs — figyelje az eltérő {ok, msg} formát):

{
  "msg": "Nu am gasit locatia",
  "ok": false
}

503 — elavult adatok a /health végponton: a törzs ugyanazt a 12 mezőt tartalmazza, mint 200 esetén (lásd health), status: "degraded" értékkel.

503 — a kulcsok ellenőrzése átmenetileg nem elérhető (pontos törzs; Retry-After: 30 fejléccel érkezik):

{
  "message": "Verificarea cheii API e temporar indisponibila. Reincearca peste 30 de secunde.",
  "message_en": "API key verification is temporarily unavailable. Retry in 30 seconds.",
  "retry_after_seconds": 30,
  "status": "error"
}

404 — nem létező útvonal az /api/ alatt (pontos törzs; a 410 ugyanilyen formájú):

{
  "docs": "https://pretcarburant.ro/api",
  "message": "Endpoint inexistent.",
  "message_en": "Not found.",
  "status": "error"
}

Kódminták — ugyanaz a hívás négy nyelven

Mindegyik minta ugyanazt teszi: lekéri a városonkénti árakat kulccsal, kezeli a 401/429 hibákat, és kiolvassa a kvótafejléceket — nem csak a happy path.

curl

curl -s -D fejlecek.txt -o valasz.json \
  -H "X-Api-Key: pcro_live_A_SAJAT_KULCSOD" \
  https://pretcarburant.ro/api/v1/preturi
grep -i '^x-ratelimit' fejlecek.txt
jq '.total, .preturi_lipsa' valasz.json

Python (requests)

import requests

API_KEY = "pcro_live_A_SAJAT_KULCSOD"

resp = requests.get(
    "https://pretcarburant.ro/api/v1/preturi",
    headers={"X-Api-Key": API_KEY},
    timeout=10,
)

print("Maradék kvóta:", resp.headers.get("X-RateLimit-Remaining"))

if resp.status_code == 429:
    varakozas = int(resp.headers.get("Retry-After", "3600"))
    print(f"Kvóta elfogyott — újrapróbálás {varakozas} s múlva")
elif resp.status_code == 401:
    print("Érvénytelen kulcs:", resp.json()["message"])
else:
    resp.raise_for_status()
    data = resp.json()
    # A hiányzó árak null-ként érkeznek — átlagolás előtt ki kell zárni őket.
    arak = [o["benzina"] for o in data["rezultate"] if o["benzina"] is not None]
    print(f"{data['total']} város, ebből {len(arak)} benzinárral")

JavaScript (fetch, Node 18+)

const API_KEY = "pcro_live_A_SAJAT_KULCSOD";

const resp = await fetch("https://pretcarburant.ro/api/v1/preturi", {
  headers: { "X-Api-Key": API_KEY },
});

console.log("Maradék kvóta:", resp.headers.get("X-RateLimit-Remaining"));

if (resp.status === 429) {
  const s = Number(resp.headers.get("Retry-After") || 3600);
  throw new Error(`Kvóta elfogyott — újrapróbálás ${s} s múlva`);
}
if (!resp.ok) {
  const hiba = await resp.json();
  throw new Error(`API-hiba ${resp.status}: ${hiba.message}`);
}

const data = await resp.json();
// A hiányzó árak null-ként érkeznek — átlagolás előtt szűrje ki őket.
const arak = data.rezultate
  .map((oras) => oras.benzina)
  .filter((ar) => ar !== null);
console.log(`${data.total} város, ebből ${arak.length} benzinárral`);

PHP (curl)

<?php
$apiKey = 'pcro_live_A_SAJAT_KULCSOD';

$ch = curl_init('https://pretcarburant.ro/api/v1/preturi');
$fejlecek = [];
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT => 10,
    CURLOPT_HTTPHEADER => ['X-Api-Key: ' . $apiKey],
    CURLOPT_HEADERFUNCTION => function ($ch, $sor) use (&$fejlecek) {
        if (stripos($sor, 'X-RateLimit') === 0 || stripos($sor, 'Retry-After') === 0) {
            [$nev, $ertek] = explode(':', trim($sor), 2);
            $fejlecek[$nev] = trim($ertek);
        }
        return strlen($sor);
    },
]);

$torzs = curl_exec($ch);
$statusz = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);
curl_close($ch);

if ($torzs === false) {
    exit("Hálózati hiba\n");
}
$data = json_decode($torzs, true);

if ($statusz === 429) {
    exit('Kvóta elfogyott — újrapróbálás ' . ($fejlecek['Retry-After'] ?? '?') . " s múlva\n");
}
if ($statusz !== 200) {
    exit('API-hiba ' . $statusz . ': ' . ($data['message'] ?? '') . "\n");
}

echo 'Maradék kvóta: ' . ($fejlecek['X-RateLimit-Remaining'] ?? 'n/a') . "\n";
// A hiányzó árak null-ként érkeznek — átlagolás előtt zárja ki őket.
$arak = array_filter(
    array_column($data['rezultate'], 'benzina'),
    fn($ar) => $ar !== null
);
printf("%d város, ebből %d benzinárral\n", $data['total'], count($arak));

Válaszformátum

Minden sikeres válasz status: "ok" mezőt hordoz, a legtöbb egy data mezőt (a szerver ISO 8601 dátuma a válasz pillanatában — nem az árak dátuma; azt az actualizat_la adja), az árválaszok pedig a preturi_lipsa konvenciójelzőt is. A teljes, valós válaszok az egyes végpont-szakaszokban láthatók. Hiba esetén a törzs alapformája:

{
  "message": "Judet necunoscut: xyz",
  "status": "error"
}

A kvótahibák további gépi mezőket adnak, a /traseu/custom pedig {ok, msg} formát használ — a teljes lista a hibakatalógusban.

Hiányzó árak: null, nem 0

Ha egy városban vagy egy hálózatnál nincs meg az adott üzemanyag ára, a mező null értékkel érkezik. Egyetlen üzemanyag sem kerül nulla lejbe — a valós sávok: benzin 5,50–12,00 RON/L, dízel 5,50–13,00, LPG 2,50–6,00 —, tehát a 0 nem mérés lenne, hanem kitalált érték, amely lehúzza a válaszunk fölött számolt bármely átlagot. A szabály a /preturi végpontra (a rezultate[] és a retele[] mezőkre egyaránt), a /preturi/minime végpontra (min, mediu, max), a /judete/<judet> és a /retele végpontokra vonatkozik.

Kizárólag az ármezők konvertálódnak. A total, nr_orase, lat vagy lng mezőben a 0 marad 0, mert ott a nulla valódi válasz, nem hiányzó érték. A /statii végpont pret mezője már korábban is null volt.

{
  "oras": "Turda", "slug": "turda", "judet": "CJ",
  "lat": 46.5667, "lng": 23.7833,
  "benzina": 7.15, "benzina_premium": null,
  "motorina": 7.40, "motorina_premium": null, "gpl": null
}

Azoknak az integrációknak, amelyek nem frissíthetők velünk együtt, a ?zeros=1 (a ?zeros=true is működik) pontosan a korábbi viselkedést hozza vissza, null helyett 0 értékkel:

curl -s "https://pretcarburant.ro/api/v1/preturi?zeros=1" | jq '.rezultate[0]'

Minden válasz maga jelzi a használt konvenciót a preturi_lipsa mezőben: "null" (alapértelmezett) vagy "zero" (a ?zeros=1 paraméterrel). Olvassa ki kódból, ne feltételezze — csak így lehet biztosan tudni, mit kapott. A konverzió egyirányú: a null soha nem lesz 0, még ?zeros=1 esetén sem, mert a /judete/<judet> korábban is null értéket adott, ha nem volt miből átlagot számolnia.

Adatkonvenciók

Az API adatkonvenciói
KonvencióÉrték
Pénznem és egységRON/liter minden ármezőben. Egyetlen kivétel a németországi /de-statii végpont, amely EUR-ban ad árat (moneda: "EUR")
Tizedesjelölő a JSON-banMindig pont (9.02), a kérés nyelvétől függetlenül — a tizedesvessző csak az oldal szövegeiben jelenik meg, a JSON-ban soha
DátumokISO 8601: a data mező dátum ("2026-09-02"), az actualizat_la, a creata és a next_allowed időbélyeg, explicit időzóna-eltolással ("2026-09-02T06:30:00+00:00"). Kivétel az /istoric labels mezője: NAP.HÓNAP formátumú megjelenítési címkék ("02.09")
IdőzónaUTC mindenhol: az időbélyegek, az X-RateLimit-Reset (Unix másodperc, UTC) és a havi kvóta naptári hónapja is UTC szerint értendő
Hiányzó áraknull, soha nem 0 — részletek fent. A válasz a preturi_lipsa mezőben deklarálja a konvenciót; a ?zeros=1 visszahozza a régi 0-jelölést

Korlátok és AI bot szabályok

Anonim felhasználóknál a korlátozott végpontokon (/judete, /retele, /statii, /statie/<id>/istoric, /geocode, /traseu/custom) 1 kérés/hét/IP/végpont a limit. A /preturi és /preturi/minime végpontok kvóta nélkül hívhatók, ahogy a /health és az /openapi.json is. Érvényes API-kulccsal a heti kvóta helyébe a csomag havi kvótája lép: Starter 10 000, Pro 100 000, Business 1 000 000 kérés/hó (részletek lent). Kulcsonként rövid távú korlát is érvényes: legfeljebb 5 kérés másodpercenként és 120 kérés percenként, a szerver összes folyamatára közösen; felette 429-es választ kapsz retry_after_seconds mezővel és Retry-After fejléccel, az elutasított kérés pedig nem számít bele a havi kvótába.

Az AI asszisztensek (ChatGPT, Claude, Perplexity, Gemini, Bing Copilot stb.) explicit User-Agent fehérlistán vannak. Ők a heti limit helyett 60 kérés/perc/IP cappal férnek hozzá, hogy közvetlenül idézhessék az adatainkat. Felismert UA-k: GPTBot, ChatGPT-User, OAI-SearchBot, ClaudeBot, anthropic-ai, PerplexityBot, Google-Extended, Googlebot, Applebot-Extended, Bytespider, Meta-ExternalAgent, CCBot, MistralAI, cohere-ai, YouBot, DiffBot, Bravebot és mások. A /statii és a /statie/<id>/istoric végponton a mentességhez fordított DNS-ellenőrzés is kell (forward-confirmed reverse DNS), így ott csak a Google, a Bing, az Apple, a Yandex és a Baidu crawlerei kapják meg; a többi bot ezen a két végponton a heti nyilvános kvótát kapja.

Az X-RateLimit-* kvótafejlécek

Minden érvényes API-kulccsal (X-Api-Key fejléc) küldött kérés három válaszfejlécet kap, amelyek pontosan megmutatják, hol tartasz a havi fogyasztással — minden végponton, a nyilvánosakon is:

A fejlécek a kvótatúllépést jelző 429-es válaszon is megérkeznek — pontosan akkor, amikor a legnagyobb szükséged van rájuk —, a Retry-After fejléccel együtt: ez a kvóta visszaállításáig hátralévő másodpercek száma, valósan kiszámolva, nem fix érték. Kiolvasásuk:

curl -s -D - -o /dev/null -H "X-Api-Key: A_KULCSOD" \
  https://pretcarburant.ro/api/v1/statii

HTTP/2 200
X-RateLimit-Limit: 10000
X-RateLimit-Remaining: 9977
X-RateLimit-Reset: 1790812800

Az 1790812800 jelentése: 2026. október 1., 00:00 UTC. Amikor az X-RateLimit-Remaining a nullához közelít, ideje nagyobb csomagra váltani — a visszaállítás után a számláló újra a teljes kvótáról indul.

Verziózás és kompatibilitás

Amit garantálunk — és amit nem:

Licenc és forrásmegjelölés

Az adatok Creative Commons BY 4.0 licenc alatt vannak közzétéve. Szabadon felhasználhatók kereskedelmi és nem kereskedelmi célokra is, látható forrásmegjelöléssel: „Forrás: PretCarburant.ro (https://pretcarburant.ro)".

A licenc minden /api/v1 válaszra vonatkozik, kulccsal vagy anélkül: az előfizetés a hozzáférést fizeti (teljes adatkészlet és havi kvóta), nem egy másik licencet. Minden válasz a rel="license" típusú Link fejlécben is jelzi.

A teljes adatállomány Zenodo DOI-val is elérhető: 10.5281/zenodo.19560194. A szervezet azonosítója a Wikidatán: Q139285387.

Kereskedelmi / nagy volumenű hozzáférés

Az ingyenes CC-BY 4.0 szint változatlan marad: 1 kérés/hét/IP a korlátozott végpontokon, látható forrásmegjelöléssel. Nem zárjuk le és nem plafonáljuk — a nyilvános adat nyilvános marad.

Alkalmazások, flották, szerkesztőségek és bármilyen nagy volumenű integráció számára azonnal aktiválható kereskedelmi csomagok állnak rendelkezésre — az API-kulcs a feliratkozás után néhány percen belül emailben érkezik:

  • Starter — 19 €/hó, 10 000 kérés/hó
  • Pro — 49 €/hó, 100 000 kérés/hó
  • Business — 149 €/hó, 1 000 000 kérés/hó, elsőbbségi támogatás

Mindegyik csomag tartalmaz 3 napos ingyenes próbát, hozzáférést az összes végponthoz heti kvóta nélkül, valamint az X-RateLimit-* fejléceket a fogyasztás nyomon követéséhez. Csomagok és előfizetés →

Egyedi igények (szerződéses SLA, bulk export, történeti pillanatképek, kiterjesztett jogok forrásmegjelölés nélkül)? Írjon nekünk dedikált ajánlatért.

Verziótörténet

Kapcsolat és hibajelentés

Email: contact@pretcarburant.ro. Technikai hibákhoz vagy feature kérésekhez tegyen „[API]" előtagot a tárgyba. Munkanapokon 48 órán belül válaszolunk.

Felelős nyilvánosságra hozatal biztonsági problémák esetén: lásd /.well-known/security.txt.