Zaseban paket, zasebni ključevi. API za vijesti i MCP imaju svoje dokumentaciju i svoje ključeve.
Radar API dokumentacija
Sve javne obavijesti Adios Radara kao podaci: opozivi i sigurnosna upozorenja (HAPIH, EU RASFF, Safety Gate), proizvodi s EAN/GTIN kodovima, serije i rokovi, tvrtke i trgovine, trajni slijed promjena, članci portala o opozivima i potpisani webhookovi.
| Adresa | https://adios.hr/api/v1/radar |
| Ključ | Radar ključ adios_radar_… · više |
| Format | JSON (UTF-8), nazivi u snake_case, vremena u UTC (ISO 8601) |
| OpenAPI | /api/v1/openapi.json (Radar pozivi imaju x-adios-package: radar) |
| Paket | 7 dana besplatno, zatim 19 € mjesečno. Neograničeni pozivi, cijela arhiva. |
| Arhiva | 870 javnih obavijesti · 4 izvora · 93 trgovina |
Brzi početak
- Pokrenite probu
Prijavite se i otvorite Radar konzolu. Uz 7 dana probe dobivate prvi Radar ključ; prikazuje se samo jednom. - Pozovite API
export ADIOS_RADAR_KEY="adios_radar_…" curl "https://adios.hr/api/v1/radar/notices?limit=5&lang=hr" -H "Authorization: Bearer $ADIOS_RADAR_KEY"
- Čitajte data
Svaki odgovor je {"data": …, "meta": …}. Obavijest ima sva polja odmah, bez dodatnih poziva.
Isprobajte bez ključa: u Radar konzoli odaberete poziv, filtre iz kataloga i kliknete Pošalji. Poziv ide kao vaš račun, a rezultat vidite kao kartice sa svim poljima ili kao cijeli JSON.
Radar ključevi
Radar ima svoje ključeve. Ključ šaljite u zaglavlju, na jedan od dva načina:
Authorization: Bearer adios_radar_AbC123… X-Api-Key: adios_radar_AbC123…
- Radar ključ je „adios_radar_” i 40 slova i znamenki. Radi samo za /api/v1/radar.
- Ključevi se ne dijele: API ključ (adios_…) na Radaru vraća 403 radar_key_required, a Radar ključ na API-ju za vijesti ili MCP-u 403 api_key_required.
- Do 10 aktivnih Radar ključeva po računu, u Radar konzoli. Čuvamo samo otisak (SHA-256): izgubljeni ključ opozovite i napravite novi. Opozvani ključ prestaje raditi odmah.
- Ključ ne stavljajte u kod koji se izvršava u pregledniku ili mobilnoj aplikaciji: zovite Radar sa svog servera.
Paket i pozivi
| Stanje | Što radi |
|---|---|
| trial | 7 dana od pokretanja u konzoli: sve, bez ograničenja. Proba se pokreće jednom po korisniku. |
| active | Plaćeni pristup (19 € mjesečno, dogovor e-poštom, bez automatske naplate): sve, bez ograničenja. |
| expired | Pozivi vraćaju 403 radar_expired, isporuke stoje i čekaju. Rade samo subscription, popis webhookova, isporuke, pauza i brisanje. |
| suspended | Kao expired, uz 403 radar_suspended. |
- Radar ne troši pozive paketa za vijesti i nema ograničenja u minuti ni danu, pa nema ni X-RateLimit zaglavlja.
- Popisi vraćaju do 100 stavki po stranici; izvoz cijele arhive do 5.000 obavijesti u jednom odgovoru. Arhiva nema vremensko ograničenje.
- Svaki poziv je u zapisniku konzole (i pozivi iz konzole, kao kanal console).
Odgovori
{
"data": [ … ],
"meta": {
"count": 25,
"has_more": true,
"next_cursor": "eyJ0aW1l…", # pošaljite kao cursor
"snapshot_at": "2026-10-14T09:30:00Z",
"sync_cursor": "1842", # changes?after= nakon uvoza
"package": "radar",
"took_ms": 14
}
}- data je popis ili objekt. Prazna polja se ne šalju; prazan popis znači da izvor to nije objavio.
- Straničenje je kursorom: dok je has_more=true, pošaljite next_cursor kao cursor uz potpuno iste filtre i limit. Kursor drži snapshot_at, pa nove obavijesti ne pomiču stranice.
- Filtri se kombiniraju (I). from je uključiv, to isključiv; datum (2026-10-01) ili ISO 8601 vrijeme.
Greške
{ "error": { "code": "radar_key_required", "message": "Radar takes a Radar key (adios_radar_…), not an API key. …", "docs": "https://adios.hr/developers/radar/docs#errors" } }| HTTP | code | Značenje |
|---|---|---|
| 400 | invalid_parameter, missing_parameter, invalid_body, invalid_url | Parametar, kursor, tijelo ili HTTPS adresa nisu dobri; poruka kaže što. |
| 401 | key_required, invalid_key | Nema ključa, ili je pogrešan ili opozvan. |
| 403 | radar_key_required, api_key_required | Ključ drugog paketa: Radar traži Radar ključ, API za vijesti API ključ. |
| 403 | radar_not_started, radar_expired, radar_suspended, account_suspended | Provjerite paket u konzoli. |
| 404 | not_found, unknown_endpoint | Nema takve javne obavijesti ili članka, webhook nije vaš ili poziv ne postoji. |
| 429 | too_many_wrong_keys | Previše pogrešnih ključeva s iste adrese; pričekajte minutu. |
| 500 / 503 | internal_error, unavailable | Privremeni problem; ponovite za malo. |
Obavijesti
Obavijesti
Radar ključJavne obavijesti sa svim poljima: tekst i prijevodi, proizvodi, EAN/GTIN, serije, rokovi, tvrtke, trgovine, slike, izvor i veze. Cijela arhiva, filtri se kombiniraju (I). Stranica do 100: sljedeću daje offset (offset=100) ili, za sinkronizaciju, meta.next_cursor kao cursor uz iste filtre.
| Parametar | Tip | Opis |
|---|---|---|
| lang | string |
Jezik glavnog teksta (zadano hr). Prijevodi su uvijek u translations[].
hr · en |
| limit | integer |
Broj stavki, 1–100 (zadano 25).
npr. 25 |
| offset | integer |
Preskače prvih N stavki, 0–10.000 (zadano 0): stranica bez kursora (offset=100 uz limit=100 je druga stotina). S cursor se zanemaruje.
npr. 100 |
| tracker | string |
Ključ Radara iz kataloga (trackers[].key).
npr. product-recalls |
| source | string |
Ključ izvora iz kataloga (sources[].key).
npr. hapih-obavijesti |
| category | string |
Ključ kategorije iz kataloga (categories[].key).
npr. food |
| hazard | string |
Ključ opasnosti iz kataloga (hazards[].key).
npr. microbial |
| store | string |
Slug trgovine iz kataloga (stores[].slug).
npr. lidl |
| gtin | string |
Točan EAN/GTIN; vodeće nule ostaju.
npr. 3830000000000 |
| lot | string |
Točna oznaka serije (LOT). S gtin traži isti proizvod.
npr. L2410 |
| brand | string |
Robna marka, bez obzira na velika i mala slova.
npr. Primjer |
| country | string |
Zemlja podrijetla, ISO 3166-1 alpha-2.
npr. HR |
| risk | string |
Razina rizika.
serious · high · medium · low · unknown |
| notice_type | string |
Vrsta obavijesti.
recall · withdrawal · warning · update · cancellation · other |
| children | boolean |
Samo proizvodi za djecu (kategorije s concerns_children).
npr. true |
| q | string |
Tekst u naslovu i tekstu obavijesti (do 200 znakova).
npr. salmonela |
| from | datetime |
Objavljeno od, uključivo (UTC, ISO 8601).
npr. 2026-01-01T00:00:00Z |
| to | datetime |
Objavljeno prije, isključivo (UTC).
npr. 2026-10-01T00:00:00Z |
| updated_since | datetime |
Izmijenjeno od, uključivo (UTC).
npr. 2026-10-01T00:00:00Z |
| sort | string |
Redoslijed (zadano newest).
newest · oldest · updated |
| cursor | string | meta.next_cursor prethodne stranice; isti filtri i limit. |
curl "https://adios.hr/api/v1/radar/notices?lang=en&limit=5" \ -H "Authorization: Bearer $ADIOS_RADAR_KEY"
Jedna obavijest
Radar ključSva javna polja jedne obavijesti, s vezama na raniju obavijest, dopune i povlačenje.
| Parametar | Tip | Opis |
|---|---|---|
| id obavezno | string · path | UUID obavijesti, članka ili webhooka. |
| lang | string |
Jezik glavnog teksta (zadano hr). Prijevodi su uvijek u translations[].
hr · en |
curl "https://adios.hr/api/v1/radar/notices/{id}" \
-H "Authorization: Bearer $ADIOS_RADAR_KEY"Izvoz cijele arhive
Radar ključSve javne obavijesti koje odgovaraju filtrima, sa svim poljima, u jednom odgovoru (do 5000), najnovije prvo. Za prvi uvoz; zatim pratite changes od meta.sync_cursor.
| Parametar | Tip | Opis |
|---|---|---|
| lang | string |
Jezik glavnog teksta (zadano hr). Prijevodi su uvijek u translations[].
hr · en |
| tracker | string |
Ključ Radara iz kataloga (trackers[].key).
npr. product-recalls |
| source | string |
Ključ izvora iz kataloga (sources[].key).
npr. hapih-obavijesti |
| category | string |
Ključ kategorije iz kataloga (categories[].key).
npr. food |
| hazard | string |
Ključ opasnosti iz kataloga (hazards[].key).
npr. microbial |
| store | string |
Slug trgovine iz kataloga (stores[].slug).
npr. lidl |
| gtin | string |
Točan EAN/GTIN; vodeće nule ostaju.
npr. 3830000000000 |
| lot | string |
Točna oznaka serije (LOT). S gtin traži isti proizvod.
npr. L2410 |
| brand | string |
Robna marka, bez obzira na velika i mala slova.
npr. Primjer |
| country | string |
Zemlja podrijetla, ISO 3166-1 alpha-2.
npr. HR |
| risk | string |
Razina rizika.
serious · high · medium · low · unknown |
| notice_type | string |
Vrsta obavijesti.
recall · withdrawal · warning · update · cancellation · other |
| children | boolean |
Samo proizvodi za djecu (kategorije s concerns_children).
npr. true |
| q | string |
Tekst u naslovu i tekstu obavijesti (do 200 znakova).
npr. salmonela |
| from | datetime |
Objavljeno od, uključivo (UTC, ISO 8601).
npr. 2026-01-01T00:00:00Z |
| to | datetime |
Objavljeno prije, isključivo (UTC).
npr. 2026-10-01T00:00:00Z |
| updated_since | datetime |
Izmijenjeno od, uključivo (UTC).
npr. 2026-10-01T00:00:00Z |
curl "https://adios.hr/api/v1/radar/export?lang=en" \ -H "Authorization: Bearer $ADIOS_RADAR_KEY"
Članci o opozivima
Članci o opozivima
Radar ključČlanci hrvatskih portala o opozivima (tema Povlačenje proizvoda), najnoviji prvo, cijela arhiva. Naslov, opis, Adios adresa i izvor; tekst ostaje na izvornom jeziku. Jedan rezultat po priči.
| Parametar | Tip | Opis |
|---|---|---|
| limit | integer |
Broj stavki, 1–100 (zadano 25).
npr. 25 |
| offset | integer |
Preskače prvih N stavki, 0–10.000 (zadano 0): stranica bez kursora (offset=100 uz limit=100 je druga stotina). S cursor se zanemaruje.
npr. 100 |
| provider | string |
Slug portala.
npr. index |
| q | string |
Tekst u naslovu ili opisu.
npr. salmonela |
| from | datetime |
Objavljeno od, uključivo (UTC).
npr. 2026-01-01T00:00:00Z |
| to | datetime |
Objavljeno prije, isključivo (UTC).
npr. 2026-10-01T00:00:00Z |
| cursor | string | meta.next_cursor prethodne stranice; isti filtri i limit. |
curl "https://adios.hr/api/v1/radar/articles?limit=5" \ -H "Authorization: Bearer $ADIOS_RADAR_KEY"
Jedan članak
Radar ključJavni podaci jednog članka o opozivu.
| Parametar | Tip | Opis |
|---|---|---|
| id obavezno | string · path | UUID obavijesti, članka ili webhooka. |
curl "https://adios.hr/api/v1/radar/articles/{id}" \
-H "Authorization: Bearer $ADIOS_RADAR_KEY"Katalog i promjene
Katalog
Radar ključSve što filtar ili polje može biti: Radari, izvori (s vremenom zadnje provjere), kategorije, opasnosti i trgovine s brojem javnih obavijesti, te sve fiksne vrijednosti (enums) sa značenjem: rizik, vrsta obavijesti, uloga tvrtke, vrsta promjene, webhook događaji, vrste slika, jezici i redoslijed.
| Parametar | Tip | Opis |
|---|---|---|
| lang | string |
Jezik glavnog teksta (zadano hr). Prijevodi su uvijek u translations[].
hr · en |
curl "https://adios.hr/api/v1/radar/catalogue?lang=en" \ -H "Authorization: Bearer $ADIOS_RADAR_KEY"
Promjene
Radar ključTrajni slijed objava, izmjena, povlačenja i uklanjanja, najstarije prvo. after=latest daje početnu točku, after=0 čita od početka slijeda. Uz svaku promjenu je trenutačno javno stanje obavijesti (ne povijesna snimka).
| Parametar | Tip | Opis |
|---|---|---|
| lang | string |
Jezik glavnog teksta (zadano hr). Prijevodi su uvijek u translations[].
hr · en |
| limit | integer |
Broj stavki, 1–100 (zadano 25).
npr. 25 |
| after | string |
ID zadnje obrađene promjene, ili latest (zadano 0).
npr. 0 |
curl "https://adios.hr/api/v1/radar/changes?after=0&limit=20" \ -H "Authorization: Bearer $ADIOS_RADAR_KEY"
Paket
Moj Radar paket
Radar ključStanje paketa (trial, active, expired, suspended), kraj probe i plaćeni pristup. Radi i nakon isteka.
curl "https://adios.hr/api/v1/radar/subscription" \ -H "Authorization: Bearer $ADIOS_RADAR_KEY"
Webhook pozivi
Moji Radar webhookovi
Radar ključRadar webhookovi računa, bez tajni.
curl "https://adios.hr/api/v1/radar/webhooks" \ -H "Authorization: Bearer $ADIOS_RADAR_KEY"
Novi webhook
Radar ključHTTPS webhook za promjene obavijesti (radar.change, zadano) ili članke (radar.article). Filtri su neobavezni: tracker, category, hazard, store i gtin za obavijesti, provider za članke. Tajna za potpis vraća se samo ovdje.
| Parametar | Tip | Opis |
|---|---|---|
| url obavezno | string · body |
Javni HTTPS URL.
npr. https://example.com/radar |
| name | string · body |
Naziv.
npr. My shop |
| event | string · body |
Pretplata.
radar.change · radar.article |
| lang | string · body |
Jezik glavnog teksta (zadano hr). Prijevodi su uvijek u translations[].
hr · en |
| tracker | string · body |
Ključ Radara iz kataloga (trackers[].key).
npr. product-recalls |
| category | string · body |
Ključ kategorije iz kataloga (categories[].key).
npr. food |
| hazard | string · body |
Ključ opasnosti iz kataloga (hazards[].key).
npr. microbial |
| store | string · body |
Slug trgovine iz kataloga (stores[].slug).
npr. lidl |
| gtin | string · body |
Točan EAN/GTIN; vodeće nule ostaju.
npr. 3830000000000 |
| provider | string · body |
Slug portala, samo za radar.article.
npr. index |
curl -X POST "https://adios.hr/api/v1/radar/webhooks" \
-H "Authorization: Bearer $ADIOS_RADAR_KEY" \
-H "Content-Type: application/json" \
-d '{"name":"My shop","url":"https://example.com/radar","event":"radar.change","category":"food","lang":"en"}'Test webhooka
Radar ključŠalje potpisan POST (test=true) na spremljeni URL: primjer, odabranu javnu obavijest ili članak, ili vlastiti JSON u data. Vraća HTTP status vašeg servera, trajanje, grešku i poslani payload. Ne dira redovne isporuke.
| Parametar | Tip | Opis |
|---|---|---|
| id obavezno | string · path | UUID obavijesti, članka ili webhooka. |
| type | string · body |
Testni događaj.
radar.created · radar.updated · radar.cancelled · radar.removed · radar.article |
| notice_id | string · body | UUID javne obavijesti (radar.change). |
| article_id | string · body | UUID javnog članka (radar.article). |
| data | object · body | Vlastiti JSON objekt (do 16.000 znakova) umjesto ID-ja. |
curl -X POST "https://adios.hr/api/v1/radar/webhooks/{id}/test" \
-H "Authorization: Bearer $ADIOS_RADAR_KEY" \
-H "Content-Type: application/json" \
-d '{"type":"radar.updated","data":{"message":"Hello from Adios Radar"}}'Pauza i nastavak
Radar ključactive=false pauzira, active=true nastavlja od neisporučene promjene.
| Parametar | Tip | Opis |
|---|---|---|
| id obavezno | string · path | UUID obavijesti, članka ili webhooka. |
| active obavezno | boolean · body |
Uključen.
npr. true |
curl -X POST "https://adios.hr/api/v1/radar/webhooks/{id}/state" \
-H "Authorization: Bearer $ADIOS_RADAR_KEY" \
-H "Content-Type: application/json" \
-d '{"active":false}'Isporuke
Radar ključZadnji pokušaji isporuke: događaj, HTTP status, trajanje i greška.
| Parametar | Tip | Opis |
|---|---|---|
| id obavezno | string · path | UUID obavijesti, članka ili webhooka. |
| limit | integer |
Broj stavki, 1–100 (zadano 25).
npr. 25 |
curl "https://adios.hr/api/v1/radar/webhooks/{id}/deliveries" \
-H "Authorization: Bearer $ADIOS_RADAR_KEY"Brisanje webhooka
Radar ključBriše vlastiti Radar webhook.
| Parametar | Tip | Opis |
|---|---|---|
| id obavezno | string · path | UUID obavijesti, članka ili webhooka. |
curl -X DELETE "https://adios.hr/api/v1/radar/webhooks/{id}" \
-H "Authorization: Bearer $ADIOS_RADAR_KEY"Obavijest: sva polja
Isti oblik u notices, notices/{id}, export, changes i webhookovima.
| Polje | Tip | Značenje |
|---|---|---|
| id | uuid | Stalan ID obavijesti. |
| tracker | string | Ključ Radara (trackers[].key u katalogu). |
| language | hr | en | Jezik glavnog teksta. Ako traženog prijevoda nema, kaže koji je stigao. |
| title, summary, body | string | Naslov, kratki sažetak i cijeli javni tekst. |
| reason | string? | Zašto je proizvod povučen. |
| advice | string? | Što kupac treba učiniti. |
| url | url | Obavijest na Adios Radaru. |
| translations[] | object[] | Svi jezici: language, title, summary, body, reason, advice, url. |
| category, hazard | object? | key, name, slug, concerns_children. Ključevi su u katalogu i ispod, u Vrijednostima. |
| risk | enum | serious, high, medium, low, unknown. |
| notice_type | enum | recall, withdrawal, warning, update, cancellation, other. |
| cancelled | boolean | Obavijest je povučena. To nije potvrda da je proizvod siguran. |
| brand | string? | Robna marka. |
| origin_country | string? | Zemlja podrijetla, ISO 3166-1 alpha-2. |
| issued_by | string? | Tijelo koje je izdalo obavijest. |
| published_at | datetime | Objava kod izvora (UTC). |
| detected_at | datetime | Kad ju je Radar pronašao. Stara obavijest pronađena danas ima stari published_at i novi detected_at. |
| updated_at | datetime | Zadnja izmjena na Radaru. |
| source_url | url | Izvorna obavijest. |
| source | object | key, name, publisher, publisher_short_name, publisher_url, language, checking_enabled, check_interval_minutes, last_checked_at, last_success_at. |
| image_url | url? | Glavna slika, na izvornoj adresi. |
| images[] | object[] | url, alt_text, kind (product, label, document). |
| products[] | object[] | name, brand, variant, gtin, lots[], best_before (kako piše izvor), best_before_date (datum, kad se dade pročitati). GTIN i LOT su stringovi; vodeće nule ostaju. |
| companies[] | object[] | role (producer, importer, distributor, retailer, other), name, address, country_code. |
| stores[] | object[] | Trgovine: name, slug (slug je filtar store). |
| earlier_notice_id | uuid? | Ranija obavijest koju ova dopunjuje ili povlači. |
| cancelled_by_id | uuid? | Obavijest koja je povukla ovu. |
| update_ids[] | uuid[] | Kasnije dopune ove obavijesti. |
| editorial | boolean | Obavijest je objavilo uredništvo Adiosa, ne izvor. |
Primjer: GET /api/v1/radar/notices?limit=1 (izmišljen proizvod)
{
"data": [
{
"id": "6f1c2a4e-8b3d-4c5e-9a7f-1d2e3f4a5b6c",
"tracker": "product-recalls",
"language": "hr",
"title": "Opoziv: svježi sir Primjer 250 g zbog Listeria monocytogenes",
"summary": "Mljekara Primjer opoziva svježi sir 250 g, serija L26281, zbog bakterije Listeria monocytogenes.",
"body": "Hrvatska agencija za poljoprivredu i hranu obavještava potrošače o opozivu proizvoda svježi sir Primjer 250 g …",
"reason": "U proizvodu je utvrđena Listeria monocytogenes.",
"advice": "Proizvod ne konzumirati i vratiti ga u prodavaonicu u kojoj je kupljen.",
"url": "https://adios.hr/radar/opozivi/opoziv-svjezi-sir-primjer-250-g-zbog-listeria-monocytogenes-6f1c2a4e",
"translations": [
{
"language": "en",
"title": "Recall: Primjer fresh cheese 250 g due to Listeria monocytogenes",
"summary": "Mljekara Primjer recalls its fresh cheese 250 g, batch L26281, due to Listeria monocytogenes.",
"body": "The Croatian Agency for Agriculture and Food informs consumers of the recall of Primjer fresh cheese 250 g …",
"reason": "Listeria monocytogenes was found in the product.",
"advice": "Do not eat the product; return it to the shop where it was bought.",
"url": "https://adios.hr/en/radar/recalls/recall-primjer-fresh-cheese-250-g-due-to-listeria-monocytogenes-6f1c2a4e"
},
{
"language": "hr",
"title": "Opoziv: svježi sir Primjer 250 g zbog Listeria monocytogenes",
"summary": "Mljekara Primjer opoziva svježi sir 250 g, serija L26281, zbog bakterije Listeria monocytogenes.",
"body": "Hrvatska agencija za poljoprivredu i hranu obavještava potrošače o opozivu proizvoda svježi sir Primjer 250 g …",
"reason": "U proizvodu je utvrđena Listeria monocytogenes.",
"advice": "Proizvod ne konzumirati i vratiti ga u prodavaonicu u kojoj je kupljen.",
"url": "https://adios.hr/radar/opozivi/opoziv-svjezi-sir-primjer-250-g-zbog-listeria-monocytogenes-6f1c2a4e"
}
],
"category": {
"key": "food",
"name": "Hrana",
"slug": "hrana",
"concerns_children": false
},
"hazard": {
"key": "microbial",
"name": "Mikrobiološka kontaminacija",
"slug": "mikrobioloska-kontaminacija",
"concerns_children": false
},
"risk": "serious",
"notice_type": "recall",
"cancelled": false,
"brand": "Primjer",
"origin_country": "HR",
"issued_by": "Hrvatska agencija za poljoprivredu i hranu",
"published_at": "2026-10-12T09:30:00Z",
"detected_at": "2026-10-12T09:37:00Z",
"updated_at": "2026-10-12T09:39:00Z",
"source_url": "https://www.hapih.hr/opoziv-svjezi-sir-primjer-250-g/",
"source": {
"key": "hapih-obavijesti",
"name": "HAPIH – obavijesti za potrošače",
"publisher": "Hrvatska agencija za poljoprivredu i hranu",
"publisher_short_name": "HAPIH",
"publisher_url": "https://www.hapih.hr/kategorija/obavijesti-za-potrosace/",
"language": "hr",
"checking_enabled": true,
"check_interval_minutes": 10,
"last_checked_at": "2026-10-14T09:34:00Z",
"last_success_at": "2026-10-14T09:34:00Z"
},
"image_url": "https://www.hapih.hr/wp-content/uploads/2026/10/svjezi-sir-primjer.jpg",
"images": [
{
"url": "https://www.hapih.hr/wp-content/uploads/2026/10/svjezi-sir-primjer.jpg",
"alt_text": "Svježi sir Primjer, prednja strana",
"kind": "product"
}
],
"products": [
{
"name": "Svježi sir 250 g",
"brand": "Primjer",
"variant": "250 g",
"gtin": "3850000000017",
"lots": [
"L26281",
"L26282"
],
"best_before": "20.10.2026.",
"best_before_date": "2026-10-20"
}
],
"companies": [
{
"role": "producer",
"name": "Mljekara Primjer d.o.o.",
"address": "Primjerska 1, 10000 Zagreb",
"country_code": "HR"
}
],
"stores": [
{
"name": "Trgovina Primjer",
"slug": "trgovina-primjer"
}
],
"update_ids": [],
"editorial": false
}
],
"meta": {
"next_cursor": "eyJ0aW1lIjoiMjAyNi0xMC0xMlQwOTozMDowMFoiLCJpZCI6IjZmMWMyYTRlIn0",
"has_more": true,
"snapshot_at": "2026-10-14T09:30:00Z",
"sync_cursor": "1842",
"count": 1,
"package": "radar",
"took_ms": 14
}
}Članak o opozivu: polja
Članci hrvatskih portala s temom Povlačenje proizvoda: novinarsko praćenje opoziva, odvojeno od službenih obavijesti. Jedan rezultat po priči.
| Polje | Tip | Značenje |
|---|---|---|
| id | uuid | ID članka na Adiosu. |
| title, description | string | Naslov i opis portala, na izvornom jeziku (bez punog teksta). |
| url | url | Članak na Adiosu. |
| source | object | name, slug i url članka na portalu. |
| published_at, discovered_at | datetime | Objava na portalu i kad ga je Adios pročitao. |
| language | string | Jezik članka. |
| theme, theme_url | string, url | Tema Povlačenje proizvoda i njezina stranica. |
{
"id": "77ff2052-07e8-45d9-a5cb-be861cc084c1",
"title": "Inspektorat se oglasio o rajčicama: \u0027Nabavljali su ih sezonski ugostiteljski objekti...\u0027",
"description": "Državni inspektorat potvrdio je da su cherry rajčice iz Italije, u kojima je otkrivena salmonela, nabavljene od sezonskih ugostiteljskih objekata.",
"url": "https://adios.hr/inspektorat-se-oglasio-o-rajcicama-nabavljali-su-ih-sezonski-ugostiteljski-objekti-77ff2052",
"source": {
"name": "24sata",
"slug": "24sata",
"url": "https://www.24sata.hr/news/inspektorat-se-oglasio-o-rajcicama-nabavljali-su-ih-sezonski-ugostiteljski-objekti-1160564"
},
"published_at": "2026-10-12T16:00:00Z",
"discovered_at": "2026-10-12T16:04:00Z",
"language": "hr",
"theme": "Povlačenje proizvoda",
"theme_url": "https://adios.hr/tema/povlacenje-proizvoda"
}Promjena: polja
| Polje | Tip | Značenje |
|---|---|---|
| id | string | ID promjene: raste, može imati praznine. Spremite ga kao kursor. |
| type | enum | radar.created, radar.updated, radar.cancelled, radar.removed. |
| notice_id | uuid | Obavijest na koju se odnosi. |
| occurred_at | datetime | Kad se promjena dogodila. |
| notice | object? | Trenutačno javno stanje obavijesti (sva polja iznad); izostaje kod radar.removed. |
Katalog: polja
GET /api/v1/radar/catalogue daje sve što filtar ili polje može biti, s brojem javnih obavijesti, i sve fiksne vrijednosti sa značenjem.
| Polje | Tip | Značenje |
|---|---|---|
| notices, latest_published_at | int, datetime | Javne obavijesti u arhivi i zadnja objava. |
| trackers[] | object[] | key, name, description, url, notices, latest_published_at. |
| sources[] | object[] | key, tracker, name, publisher, publisher_short_name, publisher_url, language, checking_enabled, check_interval_minutes, last_checked_at, last_success_at, notices. |
| categories[], hazards[] | object[] | tracker, key, name, slug, url, concerns_children, notices. |
| stores[] | object[] | name, slug, notices (samo trgovine s javnim obavijestima). |
| enums | object | Sve fiksne vrijednosti: risk, notice_type, company_role, change_type, webhook_event, image_kind, language, sort; svaka kao { value, name, description }. |
Vrijednosti (enums)
Fiksne vrijednosti polja i filtara. Iste su u katalogu (enums), uz naziv na traženom jeziku.
Razina rizika risk
| Vrijednost | Naziv | Značenje |
|---|---|---|
| serious | Ozbiljan rizik | Patogene bakterije (listerija, salmonela, STEC), neprijavljen glavni alergen, staklo ili metal, otrovna tvar, gušenje djece, strujni udar ili požar. |
| high | Visok rizik | Druga kontaminacija s navedenim rizikom za zdravlje: aflatoksini, etilen oksid, pesticidi iznad granice, plijesan. |
| medium | Srednji rizik | Neodobreni aditivi ili sastojci, prekoračene granice bez akutnog rizika. |
| low | Nizak rizik | Samo označavanje ili kakvoća. |
| unknown | Rizik nije naveden | Obavijest ne navodi razlog. |
Vrsta obavijesti notice_type
| Vrijednost | Naziv | Značenje |
|---|---|---|
| recall | Opoziv | Kupce se traži da proizvod vrate ili ga ne koriste. |
| withdrawal | Povlačenje | Proizvod je samo povučen s polica. |
| warning | Upozorenje | Javno upozorenje o proizvodu. |
| update | Dopuna | Dodaje serije ili proizvode ranijoj obavijesti ili je ispravlja (earlier_notice_id). |
| cancellation | Povučena obavijest | Ranija obavijest je povučena, obično jer je proizvod siguran. Nije opoziv proizvoda. |
| other | Obavijest | Sve ostalo, npr. granično odbijanje (RASFF). |
Uloga tvrtke companies[].role
| Vrijednost | Naziv | Značenje |
|---|---|---|
| producer | Proizvođač | Proizvodi ili pakira proizvod. |
| importer | Uvoznik | Uvozi proizvod u zemlju. |
| distributor | Distributer | Veleprodaja i distribucija. |
| retailer | Maloprodaja | Trgovina koja je prodavala proizvod. |
| other | Tvrtka | Druga uloga ili nije navedena. |
Vrsta promjene changes[].type
| Vrijednost | Naziv | Značenje |
|---|---|---|
| radar.created | Nova obavijest | Obavijest je objavljena na Radaru. |
| radar.updated | Izmjena | Promijenio se tekst, proizvod, serija, trgovina ili druga javna vrijednost. |
| radar.cancelled | Povučena | Obavijest je povučena (cancelled=true); proizvod nije nužno siguran. |
| radar.removed | Uklonjena | Obavijest više nije javna; šalje se samo notice_id, bez sadržaja. |
Webhook pretplata event
| Vrijednost | Naziv | Značenje |
|---|---|---|
| radar.change | Obavijesti | Svaka promjena obavijesti (radar.created, radar.updated, radar.cancelled, radar.removed). Filtri: tracker, category, hazard, store, gtin. |
| radar.article | Članci o opozivima | Novi članak s portala označen kao opoziv proizvoda. Filtar: provider. |
Vrsta slike images[].kind
| Vrijednost | Naziv | Značenje |
|---|---|---|
| product | Proizvod | Fotografija proizvoda ili pakiranja. |
| label | Etiketa | Etiketa, serija ili rok trajanja izbliza. |
| document | Dokument | Skenirana obavijest ili tablica. |
Jezik lang
| Vrijednost | Naziv | Značenje |
|---|---|---|
| hr | Hrvatski | Glavni tekst na hrvatskom. |
| en | Engleski | Glavni tekst na engleskom; ako prijevoda nema, language kaže koji je stigao. |
Redoslijed sort
| Vrijednost | Naziv | Značenje |
|---|---|---|
| newest | Najnovije | Po datumu objave izvora, najnovije prvo (zadano). |
| oldest | Najstarije | Po datumu objave, najstarije prvo. |
| updated | Zadnje izmijenjene | Po zadnjoj izmjeni, najnovije prvo. |
Radari, izvori, kategorije, opasnosti i trgovine
Uživo iz kataloga (osvježava se svakih 10 minuta). Ključevi su vrijednosti filtara tracker, source, category, hazard i store.
| Filtar | Ključ | Naziv | Obavijesti |
|---|---|---|---|
| tracker | product-recalls | Opozivi proizvoda | 870 |
| source | adios-urednistvo | Adios uredništvo | 0 |
| source | hapih-obavijesti | HAPIH – obavijesti za potrošače | 736 |
| source | eu-rasff | RASFF – EU upozorenja o hrani | 106 |
| source | eu-safety-gate | Safety Gate – EU upozorenja o proizvodima | 28 |
| category | baby-food | Hrana za bebe · za djecu | 19 |
| category | baby-products | Oprema za bebe · za djecu | 1 |
| category | toys | Igračke i dječji proizvodi · za djecu | 3 |
| category | food | Hrana | 650 |
| category | drinks | Pića | 22 |
| category | supplements | Dodaci prehrani | 37 |
| category | pet-food | Hrana za životinje | 49 |
| category | cosmetics | Kozmetika i higijena | 0 |
| category | kitchenware | Posuđe i ambalaža za hranu | 64 |
| category | household | Kućanstvo i kemikalije | 0 |
| category | electrical | Električni uređaji | 1 |
| category | vehicles | Vozila i oprema | 23 |
| category | clothing | Odjeća i obuća | 1 |
| category | medical | Lijekovi i medicinski proizvodi | 0 |
| category | other | Ostalo | 0 |
| hazard | microbial | Mikrobiološka kontaminacija | 215 |
| hazard | allergen | Nedeklarirani alergeni | 78 |
| hazard | foreign-body | Strano tijelo | 74 |
| hazard | chemical | Kemijska kontaminacija | 376 |
| hazard | unauthorised | Neodobreni sastojci | 48 |
| hazard | quality-labelling | Kvaliteta i označavanje | 20 |
| hazard | choking | Gušenje i sitni dijelovi | 7 |
| hazard | injury | Ozljede | 20 |
| hazard | electrical-fire | Strujni udar ili požar | 5 |
| hazard | other | Ostalo | 27 |
| store | muller | Müller | 49 |
| store | spar | Spar | 40 |
| store | lidl | Lidl | 35 |
| store | konzum | Konzum | 27 |
| store | kaufland | Kaufland | 23 |
| store | metro | Metro | 22 |
| store | tedi | TEDi | 16 |
| store | dm | dm | 14 |
| store | plodine | Plodine | 14 |
| store | eurospin | Eurospin | 10 |
| store | pekinska-patka | Pekinska patka | 10 |
| store | decathlon | Decathlon | 6 |
| store | pan-asia | Pan Asia | 6 |
| store | bipa | Bipa | 5 |
| store | ntl | NTL | 5 |
| store | ikea | IKEA | 4 |
| store | pepco | Pepco | 4 |
| store | boso | Boso | 3 |
| store | kik | KiK | 3 |
| store | osmi-kontinent | Osmi kontinent | 3 |
I još 73 trgovina u katalogu (stores[]).
Cijela arhiva i sinkronizacija
Za vlastitu kopiju svih obavijesti koja ostaje točna:
- Uvezite arhivu
GET /export daje sve obavijesti u jednom odgovoru (ili listajte notices?limit=100 kursorom). Spremite meta.sync_cursor. - Čitajte promjene
GET /changes?after=SYNC_CURSOR. Upišite obavijest po notice_id, a za radar.removed je obrišite. - Pomaknite kursor
Tek kad obradite cijelu stranicu, spremite meta.next_cursor i nastavite od njega. Bez promjena ostaje isti. - Ponavljajte ili dodajte webhook
Provjeravajte svakih nekoliko minuta, ili neka radar.change webhook javi svaku promjenu.
- Slijed promjena počinje uvođenjem Radar API-ja; starije obavijesti dolaze iz arhive. ID-jevi promjena su stringovi i mogu imati praznine.
- Promjena nosi trenutačno javno stanje, ne povijesnu verziju: više izmjena iste obavijesti može dati isto stanje.
- Skrivena ili obrisana obavijest daje samo radar.removed s notice_id.
Webhookovi: događaji
Webhook je vaša HTTPS adresa na koju Adios šalje potpisani POST kad se nešto dogodi. Napravite ga u Radar konzoli ili s Radar ključem (POST /api/v1/radar/webhooks).
| Pretplata | Što šalje | Postavke |
|---|---|---|
| radar.change | radar.created, radar.updated, radar.cancelled i radar.removed, s cijelom obaviješću. | tracker, category, hazard, store, gtin, lang |
| radar.article | radar.article: novi članak portala s temom Povlačenje proizvoda. | provider |
Tijelo isporuke:
POST https://example.com/radar
Content-Type: application/json
Adios-Event: radar.created
Adios-Delivery: radar_1842
Adios-Signature: t=1791797400,v1=5b2e…
{
"id": "radar_1842",
"type": "radar.created",
"created_at": "2026-10-12T09:38:00Z",
"webhook_id": "9a1d4c2b-3e5f-4a6b-8c7d-0e1f2a3b4c5d",
"test": false,
"data": {
"change": {
"id": "1842",
"type": "radar.created",
"notice_id": "6f1c2a4e-8b3d-4c5e-9a7f-1d2e3f4a5b6c",
"occurred_at": "2026-10-12T09:37:00Z",
"notice": {
"id": "6f1c2a4e-8b3d-4c5e-9a7f-1d2e3f4a5b6c",
"tracker": "product-recalls",
"language": "hr",
"title": "Opoziv: svježi sir Primjer 250 g zbog Listeria monocytogenes",
"summary": "Mljekara Primjer opoziva svježi sir 250 g, serija L26281, zbog bakterije Listeria monocytogenes.",
"body": "Hrvatska agencija za poljoprivredu i hranu obavještava potrošače o opozivu proizvoda svježi sir Primjer 250 g …",
"reason": "U proizvodu je utvrđena Listeria monocytogenes.",
"advice": "Proizvod ne konzumirati i vratiti ga u prodavaonicu u kojoj je kupljen.",
"url": "https://adios.hr/radar/opozivi/opoziv-svjezi-sir-primjer-250-g-zbog-listeria-monocytogenes-6f1c2a4e",
"translations": [
{
"language": "en",
"title": "Recall: Primjer fresh cheese 250 g due to Listeria monocytogenes",
"summary": "Mljekara Primjer recalls its fresh cheese 250 g, batch L26281, due to Listeria monocytogenes.",
"body": "The Croatian Agency for Agriculture and Food informs consumers of the recall of Primjer fresh cheese 250 g …",
"reason": "Listeria monocytogenes was found in the product.",
"advice": "Do not eat the product; return it to the shop where it was bought.",
"url": "https://adios.hr/en/radar/recalls/recall-primjer-fresh-cheese-250-g-due-to-listeria-monocytogenes-6f1c2a4e"
},
{
"language": "hr",
"title": "Opoziv: svježi sir Primjer 250 g zbog Listeria monocytogenes",
"summary": "Mljekara Primjer opoziva svježi sir 250 g, serija L26281, zbog bakterije Listeria monocytogenes.",
"body": "Hrvatska agencija za poljoprivredu i hranu obavještava potrošače o opozivu proizvoda svježi sir Primjer 250 g …",
"reason": "U proizvodu je utvrđena Listeria monocytogenes.",
"advice": "Proizvod ne konzumirati i vratiti ga u prodavaonicu u kojoj je kupljen.",
"url": "https://adios.hr/radar/opozivi/opoziv-svjezi-sir-primjer-250-g-zbog-listeria-monocytogenes-6f1c2a4e"
}
],
"category": {
"key": "food",
"name": "Hrana",
"slug": "hrana",
"concerns_children": false
},
"hazard": {
"key": "microbial",
"name": "Mikrobiološka kontaminacija",
"slug": "mikrobioloska-kontaminacija",
"concerns_children": false
},
"risk": "serious",
"notice_type": "recall",
"cancelled": false,
"brand": "Primjer",
"origin_country": "HR",
"issued_by": "Hrvatska agencija za poljoprivredu i hranu",
"published_at": "2026-10-12T09:30:00Z",
"detected_at": "2026-10-12T09:37:00Z",
"updated_at": "2026-10-12T09:39:00Z",
"source_url": "https://www.hapih.hr/opoziv-svjezi-sir-primjer-250-g/",
"source": {
"key": "hapih-obavijesti",
"name": "HAPIH – obavijesti za potrošače",
"publisher": "Hrvatska agencija za poljoprivredu i hranu",
"publisher_short_name": "HAPIH",
"publisher_url": "https://www.hapih.hr/kategorija/obavijesti-za-potrosace/",
"language": "hr",
"checking_enabled": true,
"check_interval_minutes": 10,
"last_checked_at": "2026-10-14T09:34:00Z",
"last_success_at": "2026-10-14T09:34:00Z"
},
"image_url": "https://www.hapih.hr/wp-content/uploads/2026/10/svjezi-sir-primjer.jpg",
"images": [
{
"url": "https://www.hapih.hr/wp-content/uploads/2026/10/svjezi-sir-primjer.jpg",
"alt_text": "Svježi sir Primjer, prednja strana",
"kind": "product"
}
],
"products": [
{
"name": "Svježi sir 250 g",
"brand": "Primjer",
"variant": "250 g",
"gtin": "3850000000017",
"lots": [
"L26281",
"L26282"
],
"best_before": "20.10.2026.",
"best_before_date": "2026-10-20"
}
],
"companies": [
{
"role": "producer",
"name": "Mljekara Primjer d.o.o.",
"address": "Primjerska 1, 10000 Zagreb",
"country_code": "HR"
}
],
"stores": [
{
"name": "Trgovina Primjer",
"slug": "trgovina-primjer"
}
],
"update_ids": [],
"editorial": false
}
}
}
}radar.article isporuka ima data.article (polja članka), a test=true i ID koji počinje s test_.
Provjera potpisa
Svaka isporuka je potpisana tajnom webhooka (vidi konzolu): v1 je HMAC-SHA256 od "{t}.{tijelo}", nad izvornim bajtovima tijela. Provjerite potpis i da t nije stariji od 5 minuta.
import crypto from "node:crypto";
function verify(secret, header, rawBody) {
const parts = Object.fromEntries(header.split(",").map(p => p.split("=")));
if (Math.abs(Date.now() / 1000 - Number(parts.t)) > 300) return false;
const expected = crypto.createHmac("sha256", secret).update(`${parts.t}.${rawBody}`).digest("hex");
return crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(parts.v1 ?? ""));
}import hmac, hashlib, time
def verify(secret: str, header: str, raw_body: bytes) -> bool:
parts = dict(p.split("=", 1) for p in header.split(","))
if abs(time.time() - int(parts["t"])) > 300:
return False
signed = parts["t"].encode() + b"." + raw_body
expected = hmac.new(secret.encode(), signed, hashlib.sha256).hexdigest()
return hmac.compare_digest(expected, parts.get("v1", ""))static bool Verify(string secret, string header, string rawBody)
{
var parts = header.Split(',').Select(p => p.Split('=', 2)).ToDictionary(p => p[0], p => p[1]);
long t = long.Parse(parts["t"]);
if (Math.Abs(DateTimeOffset.UtcNow.ToUnixTimeSeconds() - t) > 300) return false;
byte[] hash = HMACSHA256.HashData(Encoding.UTF8.GetBytes(secret), Encoding.UTF8.GetBytes($"{t}.{rawBody}"));
return CryptographicOperations.FixedTimeEquals(
Encoding.ASCII.GetBytes(Convert.ToHexStringLower(hash)), Encoding.ASCII.GetBytes(parts["v1"]));
}function verify(string $secret, string $header, string $rawBody): bool {
parse_str(str_replace(',', '&', $header), $parts);
if (abs(time() - (int)$parts['t']) > 300) return false;
$expected = hash_hmac('sha256', $parts['t'] . '.' . $rawBody, $secret);
return hash_equals($expected, $parts['v1'] ?? '');
}Isporuka i ponavljanje
- Odgovorite s 2xx u 10 sekundi, nakon što ste događaj sigurno spremili; obradu nastavite u svom redu.
- Isporuka je najmanje jednom: duplikati su mogući, prepoznajte ih po id-u (isti je u zaglavlju Adios-Delivery).
- Neuspjeh se ponavlja nakon 10, 20, 40… sekundi, najviše sat vremena između pokušaja. Nakon 20 neuspjeha zaredom webhook se pauzira; nastavak u konzoli ponovno šalje istu promjenu, a kasnije čekaju.
- Red se provjerava svakih 5 sekundi nakon što Radar obradi izvor; izvori se provjeravaju u svojim razmacima (source.check_interval_minutes).
- Novi webhook kreće od trenutka izrade, bez stare arhive. Napredak preživljava restart; istek paketa zaustavlja isporuke, a obnova nastavlja od spremljene točke.
- Uklanjanja dolaze svim radar.change webhookovima, samo s ID-jem: stari sadržaj i filtri više ne postoje.
- Samo javne https:// adrese; preusmjeravanja i privatne mrežne adrese nisu dopuštene.
Test na zahtjev
U Radar konzoli ili s POST /webhooks/{id}/test pošaljete primjer, odabranu javnu obavijest ili članak (po ID-ju), ili vlastiti JSON u data (do 16.000 znakova). Odmah vidite HTTP status vašeg servera, trajanje, grešku i točan poslani payload.
- Test ide na spremljeni URL s novim test_ ID-jem, test=true i važećim potpisom; radi i dok je webhook pauziran (uz aktivan paket).
- Odabrana stavka ne mora odgovarati filtrima webhooka. Test ne mijenja kursor, broj neuspjeha ni red čekanja.