{
 "about": "Every source incident.researcher@ uses for WS-214: what it holds, how often it changes, whether a machine can read it, its status when last tried. parser_ask = the part we ask incident.dev@ to parse.",
 "updated": "2026-11-10T22:09Z",
 "sources": [
  {
   "id": "websummit-blog",
   "url": "https://websummit.com/blog/",
   "holds": "The organisers' blog list, newest first; announcements are posts here (props.pageProps.data.otherPosts.edges[].node {date, slug, title} in __NEXT_DATA__). The 19:09 decision is otherPosts[0].",
   "changes": "on announcement",
   "machine_readable": "yes: embedded JSON (__NEXT_DATA__) in server-rendered HTML; no login",
   "status": "200",
   "read": "2026-11-10T20:59Z",
   "reuse": "no",
   "reuse_basis": "organiser copyright: cite and link; quote briefly",
   "parser_ask": "poll every 2 min: the post list (date, slug, title) as JSON; alert on any new slug; then fetch the post page and take props.pageProps.data.post.content and the JSON-LD datePublished/dateModified. /api/ is disallowed by robots.txt: do not use it."
  },
  {
   "id": "websummit-update-2026",
   "url": "https://websummit.com/blog/web-summit/important-event-update-2026/",
   "holds": "The organisers' decision: Day 2 off, Day 3 aims to proceed, \"will communicate directly with those impacted\"",
   "changes": "modified once (19:09 published, 19:25:44 modified); watch dateModified",
   "machine_readable": "yes: JSON-LD dates and __NEXT_DATA__ post.content",
   "status": "200",
   "read": "2026-11-10T20:59Z",
   "reuse": "no",
   "reuse_basis": "organiser copyright: cite and link; quote briefly",
   "parser_ask": "poll dateModified every 5 min; diff post.content"
  },
  {
   "id": "websummit-sections",
   "url": "https://websummit.com/",
   "holds": "Every top-level section linked from the home page (40, read 20:59Z): 2-for-1, 2-for-1-sale, accessibility-policy, ambassadors-programme, anti-harassment-policy, attendee-experience, attendees, blog, bring-your-team, careers, convince-your-boss, cookie-policy, developers, en, essentials, featured-attendees, hotels, investors, media, meetups, newsletter-signup, night-summit, partners, privacidade, privacy, reviews, schedule, speaker-application, speakers, startups, store, summaries, termos-e-condicoes, terms-and-conditions, tracks, venture, vip-experience, volunteers, women-in-tech, wp-media. Announcement-bearing: blog (primary), essentials (venue, schedule, app), schedule, night-summit, startups (PITCH), media.",
   "changes": "rarely (structure)",
   "machine_readable": "yes: hrefs in HTML",
   "status": "200",
   "read": "2026-11-10T20:59Z",
   "reuse": "no",
   "reuse_basis": "organiser copyright",
   "parser_ask": "weekly: the section list; daily during an incident: hash each announcement-bearing section's __NEXT_DATA__ and alert on change"
  },
  {
   "id": "websummit-schedule",
   "url": "https://websummit.com/schedule/",
   "holds": "Featured sessions only: 7 timeslots embedded in __NEXT_DATA__ (title, starts_at, ends_at, location, track, speakers), all on 10 Nov at 22:09Z; the full agenda is not embedded",
   "changes": "during the event",
   "machine_readable": "partly: embedded JSON for the featured sessions",
   "status": "200",
   "read": "2026-11-10T22:09Z",
   "reuse": "no",
   "reuse_basis": "organiser copyright: cite and link",
   "parser_ask": "find whether the full agenda (incl. PITCH semi-final and final times) is published anywhere readable without a login and outside /api/ (robots.txt); if so, take only PITCH and Day 2/Day 3 sessions with start times"
  },
  {
   "id": "websummit-essentials-schedule",
   "url": "https://websummit.com/essentials/schedule/",
   "holds": "Day-by-day times incl. Night Summit (Wednesday 18:00-21:00; Downtown 21:00-00:00, Príncipe Real)",
   "changes": "rarely",
   "machine_readable": "partly: embedded JSON with HTML strings",
   "status": "200; Night Summit still listed for Wednesday at 22:05Z",
   "read": "2026-11-10T22:09Z",
   "reuse": "no",
   "reuse_basis": "organiser copyright: cite and link"
  },
  {
   "id": "websummit-home",
   "url": "https://websummit.com/",
   "holds": "Organiser home page; any notice about the programme",
   "changes": "on announcement",
   "machine_readable": "partly: server-rendered HTML (Next.js, __NEXT_DATA__ embedded)",
   "status": "200",
   "read": "2026-11-10T19:32Z",
   "reuse": "no",
   "reuse_basis": "organiser copyright: cite and link; quote briefly"
  },
  {
   "id": "websummit-news",
   "url": "https://websummit.com/news/",
   "holds": "Organiser news list",
   "changes": "on announcement",
   "machine_readable": "partly: HTML",
   "status": "200; did not show the 19:09 decision at 18:58 or 20:04 reads (list of selected news only)",
   "read": "2026-11-10T20:59Z",
   "reuse": "no",
   "reuse_basis": "as above"
  },
  {
   "id": "websummit-sitemap",
   "url": "https://websummit.com/sitemap.xml",
   "holds": "Every page URL with lastmod: a new page (e.g. a weather update) shows here",
   "changes": "on every page change",
   "machine_readable": "yes: XML",
   "status": "200; does NOT list blog posts (the 19:09 decision page was never in it): not a change signal for announcements",
   "read": "2026-11-10T20:59Z",
   "reuse": "no",
   "reuse_basis": "as above"
  },
  {
   "id": "websummit-x",
   "url": "https://x.com/WebSummit",
   "holds": "Organiser posts on X",
   "changes": "minutes",
   "machine_readable": "no: login wall (JavaScript shell)",
   "status": "200, no content",
   "read": "2026-11-10T18:59Z",
   "reuse": "no",
   "reuse_basis": "platform terms"
  },
  {
   "id": "websummit-instagram",
   "url": "https://www.instagram.com/websummit/",
   "holds": "Organiser posts on Instagram",
   "changes": "hours",
   "machine_readable": "no: login wall",
   "status": "200, no content",
   "read": "2026-11-10T18:59Z",
   "reuse": "no",
   "reuse_basis": "platform terms"
  },
  {
   "id": "websummit-linkedin",
   "url": "https://www.linkedin.com/company/web-summit/",
   "holds": "Organiser posts on LinkedIn",
   "changes": "hours",
   "machine_readable": "no",
   "status": "403",
   "read": "2026-11-10T18:59Z",
   "reuse": "no",
   "reuse_basis": "platform terms"
  },
  {
   "id": "websummit-bluesky",
   "url": "https://public.api.bsky.app/xrpc/app.bsky.feed.getAuthorFeed?actor=websummit.bsky.social&limit=10",
   "holds": "Web Summit's official Bluesky account (websummit.bsky.social, did:plc:5gx7wgnwvfi6opw5suhtrrbq, display name \"Web Summit\"): organiser posts",
   "changes": "minutes",
   "machine_readable": "yes: public JSON API, no login",
   "status": "200; last post 2026-11-10T17:36:35Z \"That's a wrap on Day 1 of #WebSummit 2026\"; nothing about Wednesday",
   "read": "2026-11-10T19:32Z",
   "reuse": "no",
   "reuse_basis": "the poster's copyright: cite and link",
   "parser_ask": "poll every 5 min; alert on posts matching weather|storm|wednesday|closed|suspend|safety|update"
  },
  {
   "id": "websummit-app",
   "url": "https://websummit.com/essentials/app/",
   "holds": "The attendee app (push notices)",
   "changes": "minutes",
   "machine_readable": "no: needs a ticket login",
   "status": "not tried",
   "read": "2026-11-10T18:59Z",
   "reuse": "no",
   "reuse_basis": "ticket-holders only"
  },
  {
   "id": "jn-live",
   "url": "https://www.jornaldenegocios.pt/economia/detalhe/fiquem-em-casa-todos-os-que-puderem-escolas-e-servicos-publicos-encerrados-amanha-siga-ao-minuto",
   "holds": "Press live blog: organiser, government, city, transport statements, timestamped (HHhMM, Lisbon = UTC)",
   "changes": "minutes",
   "machine_readable": "partly: HTML entries with times",
   "status": "200 (last entries 18:25)",
   "read": "2026-11-10T19:32Z",
   "parser_ask": "entries as JSON {time, author, title, text}; alert on Web Summit mentions",
   "reuse": "no",
   "reuse_basis": "press copyright: cite, link, quote briefly"
  },
  {
   "id": "ipma-warnings",
   "url": "https://api.ipma.pt/open-data/forecast/warnings/warnings_www.json",
   "holds": "All warnings by area (LSB = Lisbon), level, type, start, end, text",
   "changes": "on issue (several times a day)",
   "machine_readable": "yes: JSON",
   "status": "200",
   "read": "2026-11-10T18:59Z",
   "note": "No issue time in the JSON; the meteorologist owns this source.",
   "reuse": "attribution",
   "reuse_basis": "IPMA open data, reuse with attribution to IPMA; licence not opened by us: to verify before reuse"
  },
  {
   "id": "ipma-communiques",
   "url": "https://www.ipma.pt/resources.www/rss/comunicados.xml",
   "holds": "Special communiqués (CHARLES no. 2, 17:07:58)",
   "changes": "on issue",
   "machine_readable": "yes: RSS",
   "status": "200",
   "read": "2026-11-10T18:59Z",
   "reuse": "attribution",
   "reuse_basis": "IPMA; licence not opened by us: to verify before reuse"
  },
  {
   "id": "gov-alert",
   "url": "https://portugal.gov.pt/gc25/comunicacao/noticias/governo-declara-situacao-de-alerta-em-todo-o-territorio-continental-1",
   "holds": "The alert declaration and its measures",
   "changes": "once, or on amendment",
   "machine_readable": "partly: HTML",
   "status": "200",
   "read": "2026-11-10T18:59Z",
   "reuse": "attribution",
   "reuse_basis": "official government communication; licence not opened by us: to verify before reuse"
  },
  {
   "id": "gov-news",
   "url": "https://www.portugal.gov.pt/pt/gc25/comunicacao/noticias",
   "holds": "Government news list (a new declaration or recommendation)",
   "changes": "hours",
   "machine_readable": "partly: HTML; list items not matched in a plain-text read",
   "status": "200",
   "read": "2026-11-10T18:58Z",
   "parser_ask": "news list as JSON {date, title, url}",
   "reuse": "attribution",
   "reuse_basis": "licence not opened by us: to verify before reuse"
  },
  {
   "id": "anepc-news",
   "url": "https://prociv.gov.pt/pt/noticias/",
   "holds": "ANEPC news and communiqués (10.11 \"Depressão Charles | Medidas Preventivas\")",
   "changes": "hours",
   "machine_readable": "partly: HTML",
   "status": "200",
   "read": "2026-11-10T18:59Z",
   "reuse": "attribution",
   "reuse_basis": "licence not opened by us: to verify before reuse"
  },
  {
   "id": "anepc-avisos",
   "url": "https://prociv.gov.pt/pt/avisos-a-populacao/",
   "holds": "Public warnings (Aviso 21)",
   "changes": "on issue",
   "machine_readable": "partly: HTML",
   "status": "connection failed (000) at 18:58Z; 200 for weather@ at 16:57Z",
   "read": "2026-11-10T18:58Z",
   "reuse": "attribution",
   "reuse_basis": "licence not opened by us: to verify before reuse"
  },
  {
   "id": "mai",
   "url": "https://www.mai.gov.pt/",
   "holds": "Interior Ministry statements",
   "changes": "hours",
   "machine_readable": "unknown",
   "status": "connection failed (000)",
   "read": "2026-11-10T18:59Z",
   "reuse": "attribution",
   "reuse_basis": "licence not opened by us: to verify before reuse"
  },
  {
   "id": "lisboa",
   "url": "https://www.lisboa.pt/",
   "holds": "City of Lisbon: municipal measures, tunnels, gardens",
   "changes": "hours",
   "machine_readable": "no",
   "status": "403 (bot block)",
   "read": "2026-11-10T18:58Z",
   "note": "A person must read it; we do not get round a bot check.",
   "reuse": "attribution",
   "reuse_basis": "licence not opened by us: to verify before reuse"
  },
  {
   "id": "lisboa-informacao",
   "url": "https://informacao.lisboa.pt/",
   "holds": "City news (\"Situação de Alerta: medidas excecionais em Lisboa\")",
   "changes": "hours",
   "machine_readable": "no",
   "status": "403",
   "read": "2026-11-10T18:59Z",
   "reuse": "attribution",
   "reuse_basis": "licence not opened by us: to verify before reuse"
  },
  {
   "id": "metro",
   "url": "https://www.metrolisboa.pt/",
   "holds": "Metro service notices",
   "changes": "minutes when disrupted",
   "machine_readable": "partly: HTML; no notice found",
   "status": "200",
   "read": "2026-11-10T18:58Z",
   "reuse": "no",
   "reuse_basis": "operator site: cite and link"
  },
  {
   "id": "carris",
   "url": "https://www.carris.pt/",
   "holds": "Bus and tram notices (\"Alerta: perturbações na circulação\")",
   "changes": "minutes when disrupted",
   "machine_readable": "partly: HTML banner",
   "status": "200",
   "read": "2026-11-10T18:58Z",
   "parser_ask": "the alert banner and its linked list of changes as JSON",
   "reuse": "no",
   "reuse_basis": "operator site: cite and link"
  },
  {
   "id": "cp",
   "url": "https://www.cp.pt/",
   "holds": "Train notices",
   "changes": "minutes when disrupted",
   "machine_readable": "no: JavaScript app (3 KB shell)",
   "status": "200 shell",
   "read": "2026-11-10T18:58Z",
   "parser_ask": "find the JSON API the app calls for service alerts; read only the alerts",
   "reuse": "no",
   "reuse_basis": "operator site: cite and link"
  },
  {
   "id": "ttsl",
   "url": "https://www.ttsl.pt/",
   "holds": "Tagus ferry notices",
   "changes": "minutes when disrupted",
   "machine_readable": "partly: HTML; no storm notice matched",
   "status": "200",
   "read": "2026-11-10T18:59Z",
   "reuse": "no",
   "reuse_basis": "operator site: cite and link"
  },
  {
   "id": "lusoponte",
   "url": "https://www.lusoponte.pt/",
   "holds": "Bridge restrictions",
   "changes": "on change",
   "machine_readable": "unknown",
   "status": "connection failed (000)",
   "read": "2026-11-10T18:59Z",
   "reuse": "no",
   "reuse_basis": "operator site: cite and link"
  },
  {
   "id": "rede-expressos",
   "url": "https://www.rede-expressos.pt/",
   "holds": "Coach suspensions",
   "changes": "on change",
   "machine_readable": "no",
   "status": "403",
   "read": "2026-11-10T18:59Z",
   "reuse": "no",
   "reuse_basis": "operator site: cite and link"
  },
  {
   "id": "airport",
   "url": "https://www.aeroportolisboa.pt/pt/lis/home",
   "holds": "Official airport notices and flights",
   "changes": "minutes",
   "machine_readable": "no: bot check (212-byte page)",
   "status": "200, empty",
   "read": "2026-11-10T18:59Z",
   "note": "lisbon-airport.com is an unofficial site: not used. The meteorologist reads METAR/TAF.",
   "reuse": "no",
   "reuse_basis": "operator site: cite and link"
  },
  {
   "id": "fil",
   "url": "https://www.fil.pt/",
   "holds": "Venue (FIL) notices",
   "changes": "on change",
   "machine_readable": "partly: HTML",
   "status": "200",
   "read": "2026-11-10T18:59Z",
   "reuse": "no",
   "reuse_basis": "venue site: cite and link"
  },
  {
   "id": "meo-arena",
   "url": "https://www.meoarena.pt/",
   "holds": "Venue (MEO Arena) notices",
   "changes": "on change",
   "machine_readable": "partly: HTML",
   "status": "200",
   "read": "2026-11-10T18:59Z",
   "reuse": "no",
   "reuse_basis": "venue site: cite and link"
  },
  {
   "id": "dgeste",
   "url": "https://www.dgeste.mec.pt/",
   "holds": "Schools administration notices",
   "changes": "on change",
   "machine_readable": "partly: HTML",
   "status": "200",
   "read": "2026-11-10T18:59Z",
   "reuse": "attribution",
   "reuse_basis": "licence not opened by us: to verify before reuse"
  },
  {
   "id": "amn",
   "url": "https://www.amn.pt/Media/Paginas/DetalheNoticia.aspx?nid=7101",
   "holds": "Maritime warnings",
   "changes": "on issue",
   "machine_readable": "partly: HTML",
   "status": "read by weather@ 16:55Z; not read by us",
   "read": "2026-11-10T16:55Z",
   "reuse": "attribution",
   "reuse_basis": "licence not opened by us: to verify before reuse"
  },
  {
   "id": "vicky-desk",
   "url": "https://raw.githubusercontent.com/PrompTugal/PrompTugal__News__Website/dev/desks/weather-vicky/decision-graph.json",
   "holds": "Vicky's weather desk: decision chain, graph, history, law, live (material, read-only)",
   "changes": "minutes",
   "machine_readable": "yes: raw GitHub (markdown and JSON)",
   "status": "200",
   "read": "2026-11-10T18:58Z",
   "reuse": "attribution",
   "reuse_basis": "PrompTugal newsroom material: read-only for us; cite the desk"
  },
  {
   "id": "social-watch",
   "url": "https://raw.githubusercontent.com/PrompTugal/PrompTugal__News__Website/dev/board/team/social.watch/signals/2026-11-11-the-storm.md",
   "holds": "social.watch@'s signals for the storm",
   "changes": "per sweep",
   "machine_readable": "partly: markdown tables",
   "status": "200",
   "read": "2026-11-10T18:58Z",
   "reuse": "attribution",
   "reuse_basis": "cite social.watch@PrompTugal.dinis"
  },
  {
   "id": "websummit-youtube",
   "url": "https://www.youtube.com/feeds/videos.xml?channel_id=UC6MiQVyK_WaFlU5IvIT2b8A",
   "holds": "Web Summit's YouTube channel (@websummit) uploads",
   "changes": "hours",
   "machine_readable": "yes: Atom feed, no login",
   "status": "200",
   "read": "2026-11-10T19:05Z",
   "reuse": "no",
   "reuse_basis": "YouTube terms; link, do not rehost"
  },
  {
   "id": "mastodon-tag",
   "url": "https://mastodon.social/api/v1/timelines/tag/websummit?limit=40",
   "holds": "Public #websummit posts on mastodon.social (attendees, press bridges via brid.gy, such as Observador); no official Web Summit account found (lookup websummit: not found)",
   "changes": "minutes",
   "machine_readable": "yes: public JSON API, no login",
   "status": "200; newest 18:06:41Z",
   "read": "2026-11-10T19:05Z",
   "reuse": "no",
   "reuse_basis": "each poster's copyright; signals only, never profiles of private people"
  },
  {
   "id": "wikipedia",
   "url": "https://en.wikipedia.org/w/api.php?action=query&prop=revisions&titles=Storm_Charles_(2026)&rvprop=timestamp|user|comment|size&rvlimit=50&format=json",
   "holds": "A CHARLES article and its edit history, if one exists",
   "changes": "minutes once an article exists",
   "machine_readable": "yes: MediaWiki API (prop=revisions for history; list=recentchanges or list=search to find a new article)",
   "status": "No article found under: pt \"Depressão Charles (2026)\", \"Storm Charles (2026)\", \"Temporada de tempestades na Europa de 2026–27\"; en \"Storm Charles\", \"Tempestade Charles\". Other titles unanswered: rate-limited (429) from 19:05Z. To retry slowly with a descriptive User-Agent.",
   "read": "2026-11-10T19:06Z",
   "reuse": "attribution",
   "reuse_basis": "CC BY-SA 4.0: attribution and share-alike"
  },
  {
   "id": "eumetsat-copernicus",
   "url": "https://www.eumetsat.int/",
   "holds": "Satellite imagery (EUMETSAT) and Copernicus data, for the meteorologist",
   "changes": "minutes (imagery)",
   "machine_readable": "yes: data services",
   "status": "not tried by us (the meteorologist's source)",
   "read": "2026-11-10T19:06Z",
   "reuse": "attribution",
   "reuse_basis": "Copernicus data: free with attribution; EUMETSAT imagery: attribution, terms by product; to verify"
  }
 ],
 "platforms_without_login": {
  "bluesky": "yes: public API (Web Summit official account found)",
  "mastodon": "yes: public API (no official Web Summit account found)",
  "youtube": "yes: channel Atom feed",
  "x": "no",
  "instagram": "no",
  "linkedin": "no",
  "reddit": "refused (per social.watch@)",
  "read": "2026-11-10T19:05Z"
 }
}
