{
 "about": "A map of what MeteoAlarm publishes for machines, made by following its own pages and links: every address here is one MeteoAlarm documents or links to, or one its public website was seen to call. Nothing was guessed in bulk. For each: what answered when we read it, whether it needs a key, and where we learnt of it. One request every three seconds, a plain client name. Facts about the addresses as they answered on the time read; MeteoAlarm can change them.",
 "read_utc": "2026-11-11T02:16:00Z",
 "hosts": [
  {
   "host": "www.meteoalarm.org",
   "what": "the public website: the map of Europe, the pages (terms, FAQ, warning providers and consumers, redistribution hub), an archive view",
   "robots_txt": "none (404)"
  },
  {
   "host": "feeds.meteoalarm.org",
   "what": "the open feeds: an Atom feed per country and, under /api/v1/warnings/, the same as JSON",
   "robots_txt": "present, disallows nothing"
  },
  {
   "host": "api.meteoalarm.org",
   "what": "the API portal: OGC EDR v1.0.0, MQTT v1.0.0, Metadata v0.1, Hub v1.0.0",
   "robots_txt": "not read"
  },
  {
   "host": "api-test.meteoalarm.org",
   "what": "the test system, \"completely decoupled from the production system\" (EDR FAQ)",
   "robots_txt": "not read; we do not use it"
  },
  {
   "host": "status.meteoalarm.org",
   "what": "system status (linked from the portal)",
   "robots_txt": "not read"
  }
 ],
 "endpoints": [
  {
   "node": "source:meteoalarm/feed/json",
   "address": "https://feeds.meteoalarm.org/api/v1/warnings/feeds-{country}",
   "example": "https://feeds.meteoalarm.org/api/v1/warnings/feeds-portugal",
   "method": "GET",
   "answered": "200, application/json, 343,634 bytes for Portugal",
   "auth": "none",
   "returns": "{warnings: [{uuid, alert: {identifier, sender, sent, status, msgType, scope, references, incidents, info: [one block per language: event, headline, description, onset, effective, expires, severity, certainty, urgency, responseType, category, senderName, web, parameter[awareness_level, awareness_type], area[areaDesc, geocode[EMMA_ID]]]}}]}",
   "notes": "No paging, no query parameters documented. Sends no Access-Control-Allow-Origin header (a browser on another site cannot read it). Holds expired messages for days: on 11 Nov 02:14 the oldest was sent 6 Nov 07:14. A message replaced by an Update is dropped.",
   "learnt_from": "the id of each entry in the Atom feed"
  },
  {
   "node": "source:meteoalarm/cap",
   "address": "https://feeds.meteoalarm.org/api/v1/warnings/feeds-{country}/{uuid}",
   "method": "GET",
   "answered": "200, text/xml, 2,548 bytes (read once, 11 Nov 04:24 UTC: IPMA's red wind warning for Lisbon, sent 10 Nov 07:18:40)",
   "auth": "none",
   "returns": "one CAP 1.2 message as XML: identifier, sender, sent, status, msgType, scope, references, and one info block per language (two for Portugal). The area is named by areaDesc and an EMMA_ID geocode: there is no polygon in the message. The same fields as the JSON feed's entry for it.",
   "learnt_from": "the id of each entry in the Atom feed"
  },
  {
   "node": "source:meteoalarm/feed/json",
   "address": "https://feeds.meteoalarm.org/api/v1/warnings",
   "method": "GET",
   "answered": "404",
   "auth": "",
   "returns": "nothing: there is no index of the JSON feeds; the list of countries is the Atom list on the feeds home page",
   "learnt_from": "the parent of the address above (one request)"
  },
  {
   "node": "source:meteoalarm/feed/atom",
   "address": "https://feeds.meteoalarm.org/feeds/meteoalarm-legacy-atom-{country}",
   "example": "https://feeds.meteoalarm.org/feeds/meteoalarm-legacy-atom-portugal",
   "method": "GET",
   "answered": "200, application/atom+xml, 186,372 bytes, 122 entries for Portugal",
   "auth": "none",
   "returns": "an Atom feed; one entry per message, language block and area, with cap: elements (areaDesc, event, sent, expires, effective, onset, certainty, severity, urgency, scope, message_type, status, identifier, geocode EMMA_ID); a rights line (CC BY 4.0 equivalent with the terms); a WebSub hub link",
   "notes": "Its bytes were the same across our five reads between 02:14 and 02:27 UTC (its updated stamp read 02:05): the feed is rebuilt from time to time, not on every request. Fewer entries than the JSON has messages (122 against 191 at the same minute): it appears to leave out what has expired (our reading, not MeteoAlarm's statement).",
   "learnt_from": "https://feeds.meteoalarm.org (the feed list)"
  },
  {
   "node": "source:meteoalarm/feed/atom",
   "address": "https://feeds.meteoalarm.org/feeds/meteoalarm-legacy-atom-{country}/subscribe",
   "method": "GET",
   "answered": "not read",
   "auth": "",
   "returns": "the WebSub subscription page for a feed (push instead of polling)",
   "learnt_from": "https://feeds.meteoalarm.org"
  },
  {
   "node": "source:meteoalarm/api/edr",
   "address": "https://api.meteoalarm.org/edr/v1",
   "method": "GET",
   "answered": "200 (HTML by default)",
   "auth": "none",
   "returns": "the landing page of the OGC EDR API: links to the definition, conformance, collections, authentication, FAQ, changelog",
   "learnt_from": "https://api.meteoalarm.org"
  },
  {
   "node": "source:meteoalarm/api/edr",
   "address": "https://api.meteoalarm.org/edr/v1/api",
   "method": "GET",
   "answered": "200, HTML (a Swagger UI: the page's 'swagger')",
   "auth": "none",
   "returns": "the API definition, shown in the browser",
   "notes": "With a client that asks only for JSON (Accept: application/json) this and the other pages answered 406; without the header, HTML.",
   "learnt_from": "the EDR landing page"
  },
  {
   "node": "source:meteoalarm/api/edr",
   "address": "https://api.meteoalarm.org/edr/v1/conformance",
   "method": "GET",
   "answered": "200, application/json, 401 bytes",
   "auth": "none",
   "returns": "conformsTo: OGC API EDR 1.0 core, html, geojson; OGC API Common 1 and 2; WMO WCMP2 core; WIS2 publisher",
   "learnt_from": "the EDR landing page"
  },
  {
   "node": "source:meteoalarm/api/edr",
   "address": "https://api.meteoalarm.org/edr/v1/collections",
   "method": "GET",
   "answered": "200, application/json, 3,855 bytes",
   "auth": "none",
   "returns": "one collection, `warnings`: \"Warnings issued by the MeteoAlarm Members. Only the 'locations' data query is supported.\" Custom parameters: active (ISO 8601 intervals; its examples start at 2024-01-01), language, awareness_type (14 hazard codes), awareness_level",
   "learnt_from": "the EDR landing page"
  },
  {
   "node": "source:meteoalarm/api/edr",
   "address": "https://api.meteoalarm.org/edr/v1/collections/warnings",
   "method": "GET",
   "answered": "not read",
   "auth": "listed as public",
   "returns": "the collection's description",
   "learnt_from": "the authentication page's list of public endpoints"
  },
  {
   "node": "source:meteoalarm/api/edr",
   "address": "https://api.meteoalarm.org/edr/v1/collections/warnings/locations",
   "method": "GET",
   "answered": "401 {\"error\":\"Unauthorized\"}",
   "auth": "a token: 'Authorization: Bearer' header, or a 'token' query parameter",
   "returns": "the locations (countries) that can be queried",
   "learnt_from": "the collections document"
  },
  {
   "node": "source:meteoalarm/api/edr",
   "address": "https://api.meteoalarm.org/edr/v1/collections/warnings/locations/{locationId}",
   "method": "GET",
   "answered": "not read (protected)",
   "auth": "a token",
   "returns": "the warnings of one country as GeoJSON, real-time and archived: \"The data is updated with a delay of 10 minutes and historical data can be queried\" (EDR FAQ). Each feature links its CAP message as XML and JSON.",
   "notes": "THIS IS WHERE HISTORY IS: a replaced message that the open feed has dropped should still be answerable here by time interval (`active`).",
   "learnt_from": "the authentication page and the FAQ"
  },
  {
   "node": "source:meteoalarm/api/edr",
   "address": "https://api.meteoalarm.org/edr/v1/metadata/warnings",
   "method": "GET",
   "answered": "not read",
   "auth": "listed as public",
   "returns": "metadata of the warnings collection (also a WCMP2 record: /edr/v1/metadata/WCMP2-record-eu-eumetnet-warnings.core.weather.advisories-warnings.json)",
   "learnt_from": "the authentication page's list of public endpoints"
  },
  {
   "node": "source:meteoalarm/api/edr",
   "address": "https://api.meteoalarm.org/edr/v1/authentication",
   "method": "GET",
   "answered": "200, HTML",
   "auth": "none",
   "returns": "how to authenticate, and which endpoints are public and which protected",
   "learnt_from": "the EDR landing page"
  },
  {
   "node": "source:meteoalarm/api/edr",
   "address": "https://api.meteoalarm.org/edr/v1/faq",
   "method": "GET",
   "answered": "200, HTML",
   "auth": "none",
   "returns": "who the API is for (members and re-distributors directly; the public through MeteoGate), what it holds, the response format",
   "learnt_from": "the EDR landing page"
  },
  {
   "node": "source:meteoalarm/api/mqtt",
   "address": "mqtts://api.meteoalarm.org (topics warnings-{countryCode}, warnings-ALL)",
   "method": "MQTT subscribe",
   "answered": "not connected",
   "auth": "username api, password a token",
   "returns": "one GeoJSON Feature per warning as it is issued (a WIS2 notification: bounding box, links to the CAP XML and JSON and to the exact geometry, licence link CC BY 4.0)",
   "notes": "Without registration: the same warnings are republished on the WMO WIS2 Global Brokers, topic origin/a/wis2/eu-eumetnet-warnings/data/core/weather/advisories-warnings, with the public credentials the page gives. Real time only, no history.",
   "learnt_from": "https://api.meteoalarm.org/mqtt"
  },
  {
   "node": "source:meteoalarm/api/metadata",
   "address": "https://api.meteoalarm.org/metadata/v1",
   "method": "GET",
   "answered": "200, HTML (a Swagger UI)",
   "auth": "\"for re-distributors and integration partners\"",
   "returns": "hazard types, awareness levels, regions (with geometries), national services' logos, languages",
   "learnt_from": "https://api.meteoalarm.org"
  },
  {
   "node": "source:meteoalarm/api/metadata",
   "address": "https://api.meteoalarm.org/metadata/v1/storms",
   "method": "GET",
   "answered": "200, application/json, {\"storms\":[]}",
   "auth": "none",
   "returns": "a list of named storms; empty when read, in the middle of Storm Charles",
   "notes": "Not in a document we read: the public website's own page calls it. Read once.",
   "learnt_from": "seen: www.meteoalarm.org calls it when a page loads"
  },
  {
   "node": "source:meteoalarm/api/hub",
   "address": "https://api.meteoalarm.org/hub/v1",
   "method": "GET",
   "answered": "200, HTML (a Swagger UI)",
   "auth": "EUMETNET members only",
   "returns": "where national services submit CAP warnings for validation and distribution. Not for us.",
   "learnt_from": "https://api.meteoalarm.org"
  }
 ],
 "seen_not_read": [
  {
   "address": "https://visservice.meteoalarm.org/api/v1/ (levels, regions, stream-buffers/live/frames)",
   "what": "the service behind the public map; the website calls it with a reference time",
   "why_not": "not documented for re-use; the terms keep the site's Content (maps, design, software) for the participants. Left alone until Dinis or MeteoAlarm says otherwise."
  },
  {
   "address": "https://cms-visualization.meteoalarm.org/api/v1/content-pages/{slug}",
   "what": "the text of the website's pages (the terms page is one)",
   "why_not": "we read the rendered page instead"
  },
  {
   "address": "https://devportal.meteogate.eu",
   "what": "MeteoGate, EUMETNET's public data gateway: \"Free access to the public\", \"Get your API key\"; it offers the same EDR and the archive",
   "why_not": "needs an account and a key: Dinis's decision"
  }
 ],
 "history": {
  "question": "Does MeteoAlarm keep the warnings it has dropped from the open feed (for us: Madeira's on Tuesday 10 November, 12:00 to 21:00 UTC)?",
  "answer": "Yes, by its own description: the EDR API serves \"realtime and archived weather warnings\" and \"historical data can be queried\"; the website has an archive view. The open feed does not: a replaced message is gone from it (the 11 Nov 02:14 read holds no Madeira message whose hours touch Tuesday 12:00 to 21:00). Reaching the archive needs a token from MeteoAlarm (for re-distributors) or a free MeteoGate key (for the public). We have neither.",
  "label": "the two quoted statements are facts read from MeteoAlarm's pages; that the missing Madeira messages are in the archive is a hypothesis until someone queries it"
 },
 "by": "incident.sources@web-summit.dinis",
 "updated": "2026-11-11T04:24:00Z"
}
