Documentation
The Adios API gives the news of every major Croatian portal as data: the latest and biggest stories, search by meaning, everything connected to a question, news around any place, the map, timelines, daily summaries, trending topics and product recalls.
| Base URL | https://adios.hr/api/v1 |
| Format | JSON (UTF-8), snake_case names, UTC times (ISO 8601) |
| OpenAPI | /api/v1/openapi.json (Postman, code generators, GPT actions) |
| MCP | https://adios.hr/api/mcp · guide |
| CORS | Allowed from any origin (a key, not a cookie, says who calls). |
Quickstart
- Make a key
Sign in to Adios and open the console. Your first key is made at once; it is shown only once. - Call the API
export ADIOS_KEY="adios_…" curl "https://adios.hr/api/v1/articles?sort=most_covered&limit=5" -H "Authorization: Bearer $ADIOS_KEY"
- Read data
Every answer is {"data": …, "meta": …}; data is an object or a list, meta tells how many items and what the plan limited.
For AI agents you don't even need a key: the MCP at /api/mcp works right away.
Authentication
Send the key in a header, either way:
Authorization: Bearer adios_AbC123… X-Api-Key: adios_AbC123…
- A key is "adios_" and 40 letters and digits. We keep only its hash (SHA-256), so it can't be shown again: revoke a lost key and make a new one.
- Up to 10 active keys per account (e.g. one for production, one for testing). A revoked key stops working at once.
- Don't put a key in public page or app code: call the API from your server.
- Only the MCP also takes the key in the address (
/api/mcp?key=adios_…), as ChatGPT and Claude can't set a header.
Limits
Each plan has a per-minute and a per-day limit, and the costlier calls (search, connected, places) have their own daily limit too. The day starts at 00:00 UTC.
| Group | What | Free | MCP without key (per session) |
|---|---|---|---|
| per minute | all calls | 60 | 20 |
| per day | all calls | 5,000 | 300 |
| search | /v1/search | 500 | 40 |
| connected | /v1/connected | 200 | 20 |
| geo | /v1/nearby, /v1/map, /v1/cities, /v1/places | 1,000 | 80 |
| webhooks | webhook deliveries | 500 | – |
| radius | /v1/nearby | 50 km | 50 km |
| archive | days back | 30 | 30 |
| limit | items per call | 50 | 20 |
Every answer carries the state in headers:
X-RateLimit-Limit: 5000 # daily limit X-RateLimit-Remaining: 4987 # left today X-RateLimit-Reset: 1760227200 # when the count resets (Unix) X-RateLimit-Minute: 60 X-RateLimit-Group: geo # for the costlier calls X-RateLimit-Group-Limit: 1000 X-RateLimit-Group-Remaining: 992
When a limit is reached the answer is 429 with a Retry-After header (seconds). If you ask beyond the plan (a bigger radius, more items, further back), you get what the plan allows and meta says so (e.g. radius_limited_to).
Responses
{
"data": [ … ],
"meta": {
"count": 20,
"limit": 20,
"plan": "free",
"took_ms": 41
}
}- Lists have limit and offset (stories: page). Empty fields are left out.
- url is the page on Adios (summary, every portal, the map); source.url is the article on the portal.
- Every list (search, connected, nearby, city, map and stories too) leaves out filler: horoscopes, quizzes, reality shows, celebrity gossip and promos. include_filler=true brings it back in any call.
Errors
{ "error": { "code": "invalid_parameter", "message": "'lat' must be a number between -90 and 90.", "docs": "https://adios.hr/developers/docs#errors" } }| HTTP | code | Meaning |
|---|---|---|
| 400 | missing_parameter, invalid_parameter, invalid_body, invalid_url | A parameter is missing or wrong; the message says which. |
| 401 | key_required, invalid_key | No key, or a wrong or revoked one. |
| 403 | account_suspended, history_limit, webhook_limit, radius_limit | The account is suspended or the request is beyond the plan. |
| 404 | article_not_found, place_not_found, city_not_found, digest_not_found, story_not_found, webhook_not_found, unknown_endpoint | Not there. |
| 429 | rate_limited, too_many_wrong_keys | A limit is reached; see Retry-After. |
| 500 | internal_error | Our error; it's logged. Try again. |
| 503 | unavailable | The API is resting (maintenance). |
News
Latest news
MCP: get_latest_newsThe latest news of all portals, or by category, portal and period. The same news from several portals comes once.
| Parameter | Type | Description |
|---|---|---|
| category | string | Category: crime, politics, sport… (see /v1/categories). |
| provider | string | Only one portal, by its slug (see /v1/providers). |
| from | string | From (YYYY-MM-DD or ISO time), within the plan's archive. |
| to | string | To (YYYY-MM-DD or ISO time). |
| sort | string |
newest (default), most_read or most_covered (most portals).
newest · most_read · most_covered |
| stories_only | boolean | Only news that is part of a followed story (timeline). |
| include_filler | boolean | Filler (horoscopes, quizzes, reality shows, celebrity gossip, promos) is left out of every list; true brings it back. |
| limit | integer | How many results (default 20, at most what the plan allows). |
| offset | integer | Skip this many (paging). |
curl "https://adios.hr/api/v1/articles?category=crime&limit=5" \ -H "Authorization: Bearer $ADIOS_KEY"
Article
MCP: get_articleEverything about one article: Adios's short summary and context, topics and people, the same news on other portals, related articles, where it happened and the story (timeline) it belongs to.
| Parameter | Type | Description |
|---|---|---|
| id required | string · path | The article's id (from a list or a search). |
curl "https://adios.hr/api/v1/articles/{id}" \
-H "Authorization: Bearer $ADIOS_KEY"Search
search MCP: search_newsSearch the news by meaning and words (Croatian or English questions), most relevant or newest first.
| Parameter | Type | Description |
|---|---|---|
| q required | string | The question, e.g. "požar Split" or "inflation". |
| category | string | Category: crime, politics, sport… (see /v1/categories). |
| provider | string | Only one portal, by its slug (see /v1/providers). |
| from | string | From (YYYY-MM-DD or ISO time), within the plan's archive. |
| to | string | To (YYYY-MM-DD or ISO time). |
| sort | string |
relevance (default) or newest.
relevance · newest |
| include_filler | boolean | Filler (horoscopes, quizzes, reality shows, celebrity gossip, promos) is left out of every list; true brings it back. |
| limit | integer | How many results (default 20, at most what the plan allows). |
| offset | integer | Skip this many. |
curl "https://adios.hr/api/v1/search?q=po%C5%BEar%20Split&limit=5" \ -H "Authorization: Bearer $ADIOS_KEY"
Everything connected
connected MCP: research_topicAsk anything and get everything connected: articles, followed stories with their stages, where it happened, the daily summaries that covered it and one timeline of it all.
| Parameter | Type | Description |
|---|---|---|
| q required | string | What you want to know: a person, a place, an event, a topic. |
| days | integer | How many days back (default 30, at most the plan's archive). |
| include_filler | boolean | Filler (horoscopes, quizzes, reality shows, celebrity gossip, promos) is left out of every list; true brings it back. |
| limit | integer | How many results (default 15, at most what the plan allows). |
curl "https://adios.hr/api/v1/connected?q=cijene%20goriva" \ -H "Authorization: Bearer $ADIOS_KEY"
Places and the map
News nearby
geo MCP: get_nearby_newsNews around a place or a point: everything within N km, with the distance, the kind (fire, crash, crime…) and every portal's report.
| Parameter | Type | Description |
|---|---|---|
| place | string | A place in Croatia, however written: "Zadar", "u Zadru", "Dugo Selo", "otok Krk". |
| lat | number | Latitude (instead of a place). |
| lon | number | Longitude. |
| radius_km | number | Radius in km (default 25, at most what the plan allows). |
| hours | integer | How many hours back (default 24, at most 720). |
| kinds | array | Kinds of map stories, e.g. fire,crash,crime (see /v1/categories). |
| urgent_only | boolean | Only what matters: fires, crashes, explosions, earthquakes, floods, storms, rescues, missing people and big stories. |
| include_filler | boolean | Filler (horoscopes, quizzes, reality shows, celebrity gossip, promos) is left out of every list; true brings it back. |
| sort | string |
distance (default), newest or importance.
distance · newest · importance |
| limit | integer | How many results (default 20, at most what the plan allows). |
curl "https://adios.hr/api/v1/nearby?place=Zadar&radius_km=50&hours=48" \ -H "Authorization: Bearer $ADIOS_KEY"
Resolve a place
geo MCP: resolve_placeA place name to a point (or a point to the nearest town), from the list of all Croatian places.
| Parameter | Type | Description |
|---|---|---|
| name | string | The place's name in any grammatical case. |
| lat | number | Or a point: latitude… |
| lon | number | …and longitude. |
curl "https://adios.hr/api/v1/places/resolve?name=Dugom%20Selu" \ -H "Authorization: Bearer $ADIOS_KEY"
Cities
geoThe cities with their own news page and how many stories each had in the last 30 days.
curl "https://adios.hr/api/v1/cities" \ -H "Authorization: Bearer $ADIOS_KEY"
A city's news
geo MCP: get_city_newsA city's and its surroundings' news of the last 30 days (each story on the page of the city it is nearest to).
| Parameter | Type | Description |
|---|---|---|
| slug required | string · path | The city: zadar, split, slavonski-brod… or its name. |
| kinds | array | Kinds of map stories, e.g. fire,crash,crime (see /v1/categories). |
| include_filler | boolean | Filler (horoscopes, quizzes, reality shows, celebrity gossip, promos) is left out of every list; true brings it back. |
| limit | integer | How many results (default 30, at most what the plan allows). |
curl "https://adios.hr/api/v1/cities/zadar" \ -H "Authorization: Bearer $ADIOS_KEY"
News map
geo MCP: get_news_mapEvery story with a location in the last N hours (Croatia and the world), newest first.
| Parameter | Type | Description |
|---|---|---|
| hours | integer | How many hours back (default 24, at most 720). |
| kinds | array | Kinds of map stories, e.g. fire,crash,crime (see /v1/categories). |
| urgent_only | boolean | Only what matters: fires, crashes, explosions, earthquakes, floods, storms, rescues, missing people and big stories. |
| include_filler | boolean | Filler (horoscopes, quizzes, reality shows, celebrity gossip, promos) is left out of every list; true brings it back. |
| limit | integer | How many results (default 100, at most what the plan allows). |
curl "https://adios.hr/api/v1/map?hours=6&urgent_only=true" \ -H "Authorization: Bearer $ADIOS_KEY"
Summaries
Daily summary
MCP: get_daily_digestAdios's summary of the day: what happened, by section, with a timeline and links to the stories. Today's is written live.
| Parameter | Type | Description |
|---|---|---|
| date | string | The day (YYYY-MM-DD, today, yesterday); default the newest. |
| croatia_only | boolean | Croatia only: without the world section and its stories, as "Samo Hrvatska" on adios.hr (default: all news). |
curl "https://adios.hr/api/v1/digests/daily?date=yesterday" \ -H "Authorization: Bearer $ADIOS_KEY"
Weekly summary
MCP: get_weekly_digestThe week's summary (Monday to Sunday): the week's most important stories.
| Parameter | Type | Description |
|---|---|---|
| date | string | Any day of the week (YYYY-MM-DD); default the newest. |
| croatia_only | boolean | Croatia only: without the world section and its stories, as "Samo Hrvatska" on adios.hr (default: all news). |
curl "https://adios.hr/api/v1/digests/weekly" \ -H "Authorization: Bearer $ADIOS_KEY"
Monthly summary
The month's summary: the month's most important stories.
| Parameter | Type | Description |
|---|---|---|
| date | string | Any day of the month (YYYY-MM-DD); default the newest. |
| croatia_only | boolean | Croatia only: without the world section and its stories, as "Samo Hrvatska" on adios.hr (default: all news). |
curl "https://adios.hr/api/v1/digests/monthly" \ -H "Authorization: Bearer $ADIOS_KEY"
List of summaries
The newest summaries of one kind (titles and links).
| Parameter | Type | Description |
|---|---|---|
| kind | string |
daily (default), weekly or monthly.
daily · weekly · monthly |
| limit | integer | How many results (default 14, at most what the plan allows). |
curl "https://adios.hr/api/v1/digests?kind=weekly&limit=4" \ -H "Authorization: Bearer $ADIOS_KEY"
Stories (timelines)
Stories
MCP: list_storiesFollowed stories (timelines of several stages): newest development first, or the longest, or the most reported.
| Parameter | Type | Description |
|---|---|---|
| q | string | Search the stories' and stages' names. |
| category | string | Category: crime, politics, sport… (see /v1/categories). |
| period | string |
A new stage within: day, week or month.
day · week · month |
| order | string |
latest (default), longest or most_reports.
latest · longest · most_reports |
| page | integer | Page (20 per page). |
| include_filler | boolean | Filler (horoscopes, quizzes, reality shows, celebrity gossip, promos) is left out of every list; true brings it back. |
curl "https://adios.hr/api/v1/stories?period=week" \ -H "Authorization: Bearer $ADIOS_KEY"
Story timeline
MCP: get_story_timelineA story's whole timeline: every stage with its name, time, summary and the portals' reports, and where it happened.
| Parameter | Type | Description |
|---|---|---|
| slug required | string · path | The story's slug (from /v1/stories or its /kronologija/… address). |
curl "https://adios.hr/api/v1/stories/{slug}" \
-H "Authorization: Bearer $ADIOS_KEY"More
Trending topics
MCP: get_trending_topicsThe topics written about and searched for most right now.
curl "https://adios.hr/api/v1/trending" \ -H "Authorization: Bearer $ADIOS_KEY"
Product recalls
MCP: get_product_recallsAdios Radar: product recalls and safety warnings (HAPIH, EU RASFF, Safety Gate), in Croatian or English.
| Parameter | Type | Description |
|---|---|---|
| q | string | Search: product, brand, store, hazard. |
| lang | string |
hr (default) or en.
hr · en |
| limit | integer | How many results (default 10, at most what the plan allows). |
curl "https://adios.hr/api/v1/recalls?lang=en&limit=5" \ -H "Authorization: Bearer $ADIOS_KEY"
Portals
MCP: list_portalsThe portals Adios reads, with the slug to filter by.
curl "https://adios.hr/api/v1/providers" \ -H "Authorization: Bearer $ADIOS_KEY"
Categories and kinds
MCP: list_categoriesThe articles' categories and the map stories' kinds (Croatian and English names).
curl "https://adios.hr/api/v1/categories" \ -H "Authorization: Bearer $ADIOS_KEY"
Account
My usage
MCP: get_my_usageYour plan, its limits and today's use by group.
curl "https://adios.hr/api/v1/me" \ -H "Authorization: Bearer $ADIOS_KEY"
Webhooks
My webhooks
key onlyYour webhooks with their event, settings and last delivery.
curl "https://adios.hr/api/v1/webhooks" \ -H "Authorization: Bearer $ADIOS_KEY"
Create a webhook
key onlyAdios POSTs to your address when it happens: news near a place (nearby.story), a new recall (recall.new), the day's summary (digest.daily) or a new stage of a followed story (story.stage). JSON body.
| Parameter | Type | Description |
|---|---|---|
| name required | string · body | A name (for you). |
| url required | string · body | Your HTTPS address. |
| event required | string · body |
nearby.story, recall.new, digest.daily or story.stage.
nearby.story · recall.new · digest.daily · story.stage |
| place | string · body | nearby.story: a place… |
| lat | number · body | …or a point (latitude)… |
| lon | number · body | …and longitude. |
| radius_km | number · body | nearby.story: the radius (default 25). |
| kinds | array · body | nearby.story: only these kinds. |
| urgent_only | boolean · body | nearby.story: only what matters. |
| story | string · body | story.stage: the story's slug. |
| lang | string · body |
recall.new: hr or en.
hr · en |
curl -X POST "https://adios.hr/api/v1/webhooks" \
-H "Authorization: Bearer $ADIOS_KEY" \
-H "Content-Type: application/json" \
-d '{"name":"Hotel Zadar","url":"https://example.com/adios","event":"nearby.story","place":"Zadar","radius_km":20,"urgent_only":true}'Delete a webhook
key onlyDeletes a webhook.
| Parameter | Type | Description |
|---|---|---|
| id required | string · path | The webhook's id. |
curl -X DELETE "https://adios.hr/api/v1/webhooks/{id}" \
-H "Authorization: Bearer $ADIOS_KEY"Test delivery
key onlySends a test event to the webhook's address (signed like a real one).
| Parameter | Type | Description |
|---|---|---|
| id required | string · path | The webhook's id. |
curl -X POST "https://adios.hr/api/v1/webhooks/{id}/test" \
-H "Authorization: Bearer $ADIOS_KEY"Webhooks: events
A webhook is your HTTPS address Adios POSTs to when something happens, without you asking. Make one in the console or through the API (POST /v1/webhooks).
| Event | When | Settings |
|---|---|---|
| nearby.story | A new story within your radius of a place (a hotel, a campsite, a town): fires, crashes, storms, closed roads, everything on the map. Each story once. | place | lat+lon, radius_km, kinds, urgent_only |
| recall.new | A new product recall or safety warning of Adios Radar (HAPIH, EU RASFF, Safety Gate). | lang (hr|en) |
| digest.daily | The day's summary once the day is over (a little after midnight, Croatian time). | – |
| story.stage | A new stage of a followed story (its timeline), e.g. a missing person found. | story (slug) |
The delivery's body:
POST https://example.com/adios
Content-Type: application/json
Adios-Event: nearby.story
Adios-Delivery: nearby_3f2c…
Adios-Signature: t=1760180000,v1=5b2e…
{
"id": "nearby_3f2c…",
"type": "nearby.story",
"created_at": "2026-10-11T18:04:00Z",
"webhook_id": "9a1d…",
"test": false,
"data": {
"place": "Zadar",
"story": { "title": "…", "kind": "fire", "place": "Bibinje", "distance_km": 6.2, "url": "https://adios.hr/…", … }
}
}Verifying signatures
Every delivery is signed with your webhook's secret (see the console): v1 is HMAC-SHA256 of "{t}.{body}". Check the signature, and that t is no older than 5 minutes.
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'] ?? '');
}Delivery and retries
- Answer 2xx within 10 seconds. Anything else is a failure.
- A failed delivery is retried less and less often (1, 2, 4… up to 60 minutes); after 20 failures in a row the webhook is switched off, and you switch it back on in the console.
- Each event comes once (its id is stable, so duplicates are easy to spot). A new webhook starts from when it was made, with no old events.
- Adios checks for news every minute. The console's "Test" button sends a real example right away.
- Addresses must be https:// on the public internet.
MCP
Adios is an MCP server too (Model Context Protocol, Streamable HTTP). Every endpoint above marked MCP is also a tool, plus search and fetch (for ChatGPT connectors and deep research) and ready prompts (morning briefing, local news, explain a story, recalls).
https://adios.hr/api/mcpWithout a key it works for everyone (limits per session); with a key (a header or ?key=) your plan's limits apply and the calls are in your log.
How to connect ChatGPT, Claude, Cursor…Changelog
1.0 · 11 October 2026 · First version: news, search, everything connected, news nearby, the map, cities, summaries, timelines, trending topics, recalls, webhooks and an MCP for everyone.
Changes that could break your code are announced in advance; new fields in answers may come at any time.