SPB Git

registry fragments: media (3 198), finance (3 791), infrastructure (3 532), government (4 910); ISO table + continent fallbacks; seed dedupe by host; registry-check script

Simon-Pierre Boucher committed (Sep 13, 2026) parent 841c7cf Browse files

14 changed files +16,195 −5

modified apps/api/src/internetpressure/api/public.py +2 −1
@@ -13,6 +13,7 @@ from ..asn import asndb
13 13 from ..config import COMPONENT_IDS
14 14 from ..db import ch, pg, rds
15 15 from ..engine.events import incident_dict
16 +from ..iso import ISO
16 17 from ..regions import COUNTRY_CENTROIDS, country_name, load_regions
17 18 from ..registry import get_service, get_target, list_probes, list_services, list_targets, load_config
18 19 from ..util import iso, loads, parse_ts, r1, r2, r3, utcnow
@@ -230,7 +231,7 @@ async def pressure_country(cc: str) -> dict[str, Any]:
230 231 if not live and not probes and not targets:
231 232 raise _nf()
232 233 regions = load_regions()
233 − lat, lon = COUNTRY_CENTROIDS.get(cc, (0.0, 0.0))
234 + lat, lon = COUNTRY_CENTROIDS.get(cc) or (ISO[cc][1], ISO[cc][2]) if (cc in COUNTRY_CENTROIDS or cc in ISO) else (0.0, 0.0)
234 235 base = live or {"cc": cc, "name": country_name(cc), "region": regions.region_of_country(cc), "lat": lat, "lon": lon,
235 236 "pressure": None, "level": "unknown", "level_label": "Unknown", "components": {}, "probes": len(probes),
236 237 "targets": len(targets), "role": "both" if probes and targets else ("probe" if probes else "target"),
modified apps/api/src/internetpressure/engine/loop.py +2 −1
@@ -13,6 +13,7 @@ from typing import Any
13 13 from ..asn import asndb
14 14 from ..config import COMPONENT_IDS
15 15 from ..db import ch, pg, rds
16 +from ..iso import ISO
16 17 from ..regions import COUNTRY_CENTROIDS, country_name, load_regions
17 18 from ..registry import bump_config_version, list_probes, list_services, list_targets, load_config
18 19 from ..settings import get_settings
@@ -190,7 +191,7 @@ class Engine:
190 191 n_targets = sum(1 for t in targets.values() if t.get("country") == cc)
191 192 pr = sc.pressure if allowed else None
192 193 lv, ll = cfg.level_for(pr)
193 − lat, lon = COUNTRY_CENTROIDS.get(cc, (0.0, 0.0))
194 + lat, lon = COUNTRY_CENTROIDS.get(cc) or (ISO[cc][1], ISO[cc][2]) if (cc in COUNTRY_CENTROIDS or cc in ISO) else (0.0, 0.0)
194 195 countries_out.append({
195 196 "cc": cc, "name": country_name(cc), "region": regions.region_of_country(cc), "lat": lat, "lon": lon,
196 197 "pressure": r1(pr), "level": lv, "level_label": ll, "delta_1h": None, "trend": "stable",
added apps/api/src/internetpressure/iso.py +89 −0
@@ -0,0 +1,89 @@
1 +"""ISO 3166-1 alpha-2 → English short name and approximate centroid (lat, lon), for every country/territory that can
2 +appear in the registry. Centroids are map-label anchors only (rounded to 0.1°)."""
3 +
4 +from __future__ import annotations
5 +
6 +# code: (name, lat, lon)
7 +ISO: dict[str, tuple[str, float, float]] = {
8 + "AD": ("Andorra", 42.5, 1.6), "AE": ("United Arab Emirates", 23.4, 53.8), "AF": ("Afghanistan", 33.9, 67.7),
9 + "AG": ("Antigua and Barbuda", 17.1, -61.8), "AI": ("Anguilla", 18.2, -63.1), "AL": ("Albania", 41.2, 20.2),
10 + "AM": ("Armenia", 40.1, 45.0), "AO": ("Angola", -11.2, 17.9), "AR": ("Argentina", -38.4, -63.6), "AS": ("American Samoa", -14.3, -170.7),
11 + "AT": ("Austria", 47.5, 14.6), "AU": ("Australia", -25.3, 133.8), "AW": ("Aruba", 12.5, -70.0), "AX": ("Åland Islands", 60.2, 19.9),
12 + "AZ": ("Azerbaijan", 40.1, 47.6), "BA": ("Bosnia and Herzegovina", 43.9, 17.7), "BB": ("Barbados", 13.2, -59.5),
13 + "BD": ("Bangladesh", 23.7, 90.4), "BE": ("Belgium", 50.5, 4.5), "BF": ("Burkina Faso", 12.2, -1.6), "BG": ("Bulgaria", 42.7, 25.5),
14 + "BH": ("Bahrain", 26.0, 50.6), "BI": ("Burundi", -3.4, 29.9), "BJ": ("Benin", 9.3, 2.3), "BM": ("Bermuda", 32.3, -64.8),
15 + "BN": ("Brunei", 4.5, 114.7), "BO": ("Bolivia", -16.3, -63.6), "BQ": ("Caribbean Netherlands", 12.2, -68.3), "BR": ("Brazil", -14.2, -51.9),
16 + "BS": ("Bahamas", 25.0, -77.4), "BT": ("Bhutan", 27.5, 90.4), "BW": ("Botswana", -22.3, 24.7), "BY": ("Belarus", 53.7, 28.0),
17 + "BZ": ("Belize", 17.2, -88.5), "CA": ("Canada", 56.1, -106.3), "CD": ("DR Congo", -4.0, 21.8), "CF": ("Central African Republic", 6.6, 20.9),
18 + "CG": ("Congo", -0.2, 15.8), "CH": ("Switzerland", 46.8, 8.2), "CI": ("Côte d'Ivoire", 7.5, -5.5), "CK": ("Cook Islands", -21.2, -159.8),
19 + "CL": ("Chile", -35.7, -71.5), "CM": ("Cameroon", 7.4, 12.4), "CN": ("China", 35.9, 104.2), "CO": ("Colombia", 4.6, -74.3),
20 + "CR": ("Costa Rica", 9.7, -83.8), "CU": ("Cuba", 21.5, -77.8), "CV": ("Cabo Verde", 16.0, -24.0), "CW": ("Curaçao", 12.2, -69.0),
21 + "CY": ("Cyprus", 35.1, 33.4), "CZ": ("Czechia", 49.8, 15.5), "DE": ("Germany", 51.2, 10.4), "DJ": ("Djibouti", 11.8, 42.6),
22 + "DK": ("Denmark", 56.3, 9.5), "DM": ("Dominica", 15.4, -61.4), "DO": ("Dominican Republic", 18.7, -70.2), "DZ": ("Algeria", 28.0, 1.7),
23 + "EC": ("Ecuador", -1.8, -78.2), "EE": ("Estonia", 58.6, 25.0), "EG": ("Egypt", 26.8, 30.8), "ER": ("Eritrea", 15.2, 39.8),
24 + "ES": ("Spain", 40.5, -3.7), "ET": ("Ethiopia", 9.1, 40.5), "FI": ("Finland", 61.9, 25.7), "FJ": ("Fiji", -17.7, 178.1),
25 + "FK": ("Falkland Islands", -51.8, -59.5), "FM": ("Micronesia", 7.4, 150.6), "FO": ("Faroe Islands", 62.0, -6.9), "FR": ("France", 46.6, 2.2),
26 + "GA": ("Gabon", -0.8, 11.6), "GB": ("United Kingdom", 54.0, -2.0), "GD": ("Grenada", 12.1, -61.7), "GE": ("Georgia", 42.3, 43.4),
27 + "GF": ("French Guiana", 3.9, -53.1), "GG": ("Guernsey", 49.5, -2.6), "GH": ("Ghana", 7.9, -1.0), "GI": ("Gibraltar", 36.1, -5.3),
28 + "GL": ("Greenland", 71.7, -42.6), "GM": ("Gambia", 13.4, -15.3), "GN": ("Guinea", 9.9, -9.7), "GP": ("Guadeloupe", 16.3, -61.6),
29 + "GQ": ("Equatorial Guinea", 1.7, 10.3), "GR": ("Greece", 39.1, 21.8), "GT": ("Guatemala", 15.8, -90.2), "GU": ("Guam", 13.4, 144.8),
30 + "GW": ("Guinea-Bissau", 11.8, -15.2), "GY": ("Guyana", 4.9, -58.9), "HK": ("Hong Kong", 22.3, 114.2), "HN": ("Honduras", 15.2, -86.2),
31 + "HR": ("Croatia", 45.1, 15.2), "HT": ("Haiti", 19.0, -72.3), "HU": ("Hungary", 47.2, 19.5), "ID": ("Indonesia", -0.8, 113.9),
32 + "IE": ("Ireland", 53.4, -8.2), "IL": ("Israel", 31.0, 34.9), "IM": ("Isle of Man", 54.2, -4.5), "IN": ("India", 20.6, 79.0),
33 + "IQ": ("Iraq", 33.2, 43.7), "IR": ("Iran", 32.4, 53.7), "IS": ("Iceland", 64.9, -19.0), "IT": ("Italy", 41.9, 12.6),
34 + "JE": ("Jersey", 49.2, -2.1), "JM": ("Jamaica", 18.1, -77.3), "JO": ("Jordan", 30.6, 36.2), "JP": ("Japan", 36.2, 138.3),
35 + "KE": ("Kenya", -0.0, 37.9), "KG": ("Kyrgyzstan", 41.2, 74.8), "KH": ("Cambodia", 12.6, 105.0), "KI": ("Kiribati", -3.4, -168.7),
36 + "KM": ("Comoros", -11.9, 43.9), "KN": ("Saint Kitts and Nevis", 17.4, -62.8), "KP": ("North Korea", 40.3, 127.5), "KR": ("South Korea", 35.9, 127.8),
37 + "KW": ("Kuwait", 29.3, 47.5), "KY": ("Cayman Islands", 19.3, -81.3), "KZ": ("Kazakhstan", 48.0, 66.9), "LA": ("Laos", 19.9, 102.5),
38 + "LB": ("Lebanon", 33.9, 35.9), "LC": ("Saint Lucia", 13.9, -61.0), "LI": ("Liechtenstein", 47.2, 9.6), "LK": ("Sri Lanka", 7.9, 80.8),
39 + "LR": ("Liberia", 6.4, -9.4), "LS": ("Lesotho", -29.6, 28.2), "LT": ("Lithuania", 55.2, 23.9), "LU": ("Luxembourg", 49.8, 6.1),
40 + "LV": ("Latvia", 56.9, 24.6), "LY": ("Libya", 26.3, 17.2), "MA": ("Morocco", 31.8, -7.1), "MC": ("Monaco", 43.7, 7.4),
41 + "MD": ("Moldova", 47.4, 28.4), "ME": ("Montenegro", 42.7, 19.4), "MF": ("Saint Martin", 18.1, -63.1), "MG": ("Madagascar", -18.8, 46.9),
42 + "MH": ("Marshall Islands", 7.1, 171.2), "MK": ("North Macedonia", 41.6, 21.7), "ML": ("Mali", 17.6, -4.0), "MM": ("Myanmar", 21.9, 95.9),
43 + "MN": ("Mongolia", 46.9, 103.8), "MO": ("Macao", 22.2, 113.5), "MP": ("Northern Mariana Islands", 15.1, 145.7), "MQ": ("Martinique", 14.6, -61.0),
44 + "MR": ("Mauritania", 21.0, -10.9), "MS": ("Montserrat", 16.7, -62.2), "MT": ("Malta", 35.9, 14.4), "MU": ("Mauritius", -20.3, 57.6),
45 + "MV": ("Maldives", 3.2, 73.2), "MW": ("Malawi", -13.3, 34.3), "MX": ("Mexico", 23.6, -102.5), "MY": ("Malaysia", 4.2, 102.0),
46 + "MZ": ("Mozambique", -18.7, 35.5), "NA": ("Namibia", -22.9, 18.5), "NC": ("New Caledonia", -20.9, 165.6), "NE": ("Niger", 17.6, 8.1),
47 + "NF": ("Norfolk Island", -29.0, 168.0), "NG": ("Nigeria", 9.1, 8.7), "NI": ("Nicaragua", 12.9, -85.2), "NL": ("Netherlands", 52.1, 5.3),
48 + "NO": ("Norway", 60.5, 8.5), "NP": ("Nepal", 28.4, 84.1), "NR": ("Nauru", -0.5, 166.9), "NU": ("Niue", -19.1, -169.9),
49 + "NZ": ("New Zealand", -40.9, 174.9), "OM": ("Oman", 21.5, 55.9), "PA": ("Panama", 8.5, -80.8), "PE": ("Peru", -9.2, -75.0),
50 + "PF": ("French Polynesia", -17.7, -149.4), "PG": ("Papua New Guinea", -6.3, 143.9), "PH": ("Philippines", 12.9, 121.8), "PK": ("Pakistan", 30.4, 69.3),
51 + "PL": ("Poland", 51.9, 19.1), "PM": ("Saint Pierre and Miquelon", 46.9, -56.3), "PR": ("Puerto Rico", 18.2, -66.6), "PS": ("Palestine", 31.9, 35.2),
52 + "PT": ("Portugal", 39.4, -8.2), "PW": ("Palau", 7.5, 134.6), "PY": ("Paraguay", -23.4, -58.4), "QA": ("Qatar", 25.4, 51.2),
53 + "RE": ("Réunion", -21.1, 55.5), "RO": ("Romania", 45.9, 25.0), "RS": ("Serbia", 44.0, 21.0), "RU": ("Russia", 61.5, 105.3),
54 + "RW": ("Rwanda", -1.9, 29.9), "SA": ("Saudi Arabia", 23.9, 45.1), "SB": ("Solomon Islands", -9.6, 160.2), "SC": ("Seychelles", -4.7, 55.5),
55 + "SD": ("Sudan", 12.9, 30.2), "SE": ("Sweden", 60.1, 18.6), "SG": ("Singapore", 1.4, 103.8), "SI": ("Slovenia", 46.2, 15.0),
56 + "SK": ("Slovakia", 48.7, 19.7), "SL": ("Sierra Leone", 8.5, -11.8), "SM": ("San Marino", 43.9, 12.5), "SN": ("Senegal", 14.5, -14.5),
57 + "SO": ("Somalia", 5.2, 46.2), "SR": ("Suriname", 3.9, -56.0), "SS": ("South Sudan", 6.9, 31.3), "ST": ("São Tomé and Príncipe", 0.2, 6.6),
58 + "SV": ("El Salvador", 13.8, -88.9), "SX": ("Sint Maarten", 18.0, -63.1), "SY": ("Syria", 34.8, 38.9), "SZ": ("Eswatini", -26.5, 31.5),
59 + "TC": ("Turks and Caicos Islands", 21.7, -71.8), "TD": ("Chad", 15.5, 18.7), "TG": ("Togo", 8.6, 0.8), "TH": ("Thailand", 15.9, 100.9),
60 + "TJ": ("Tajikistan", 38.9, 71.3), "TL": ("Timor-Leste", -8.9, 125.7), "TM": ("Turkmenistan", 38.9, 59.6), "TN": ("Tunisia", 33.9, 9.5),
61 + "TO": ("Tonga", -21.2, -175.2), "TR": ("Türkiye", 39.0, 35.2), "TT": ("Trinidad and Tobago", 10.7, -61.2), "TV": ("Tuvalu", -7.1, 177.6),
62 + "TW": ("Taiwan", 23.7, 121.0), "TZ": ("Tanzania", -6.4, 34.9), "UA": ("Ukraine", 48.4, 31.2), "UG": ("Uganda", 1.4, 32.3),
63 + "US": ("United States", 39.8, -98.6), "UY": ("Uruguay", -32.5, -55.8), "UZ": ("Uzbekistan", 41.4, 64.6), "VA": ("Vatican City", 41.9, 12.5),
64 + "VC": ("Saint Vincent and the Grenadines", 12.98, -61.3), "VE": ("Venezuela", 6.4, -66.6), "VG": ("British Virgin Islands", 18.4, -64.6),
65 + "VI": ("U.S. Virgin Islands", 18.3, -64.9), "VN": ("Vietnam", 14.1, 108.3), "VU": ("Vanuatu", -15.4, 166.9), "WF": ("Wallis and Futuna", -13.8, -177.2),
66 + "WS": ("Samoa", -13.8, -172.1), "XK": ("Kosovo", 42.6, 20.9), "YE": ("Yemen", 15.6, 48.5), "YT": ("Mayotte", -12.8, 45.2),
67 + "ZA": ("South Africa", -30.6, 22.9), "ZM": ("Zambia", -13.1, 27.8), "ZW": ("Zimbabwe", -19.0, 29.2),
68 +}
69 +
70 +# continent-level fallback for countries missing from data/regions.yaml
71 +CONTINENT_REGION: dict[str, str] = {
72 + **dict.fromkeys(["AD", "AL", "AT", "AX", "BA", "BE", "BG", "BY", "CH", "CZ", "DE", "DK", "EE", "ES", "FI", "FO", "FR", "GB", "GG", "GI",
73 + "GR", "HR", "HU", "IE", "IM", "IS", "IT", "JE", "LI", "LT", "LU", "LV", "MC", "MD", "ME", "MK", "MT", "NL", "NO", "PL",
74 + "PT", "RO", "RS", "RU", "SE", "SI", "SK", "SM", "UA", "VA", "XK", "GL"], "eu-east"),
75 + **dict.fromkeys(["AE", "BH", "DZ", "EG", "IL", "IQ", "IR", "JO", "KW", "LB", "LY", "MA", "OM", "PS", "QA", "SA", "SY", "TN", "YE"], "mena"),
76 + **dict.fromkeys(["AO", "BF", "BI", "BJ", "BW", "CD", "CF", "CG", "CI", "CM", "CV", "DJ", "ER", "ET", "GA", "GH", "GM", "GN", "GQ", "GW",
77 + "KE", "KM", "LR", "LS", "MG", "ML", "MR", "MU", "MW", "MZ", "NA", "NE", "NG", "RE", "RW", "SC", "SD", "SL", "SN", "SO",
78 + "SS", "ST", "SZ", "TD", "TG", "TZ", "UG", "YT", "ZA", "ZM", "ZW"], "africa"),
79 + **dict.fromkeys(["AF", "BD", "BT", "IN", "LK", "MV", "NP", "PK"], "asia-south"),
80 + **dict.fromkeys(["BN", "ID", "KH", "LA", "MM", "MY", "PH", "SG", "TH", "TL", "VN"], "asia-se"),
81 + **dict.fromkeys(["CN", "HK", "JP", "KP", "KR", "MN", "MO", "TW"], "asia-east"),
82 + **dict.fromkeys(["AM", "AZ", "GE", "KG", "KZ", "TJ", "TM", "UZ"], "eu-east-med"),
83 + **dict.fromkeys(["AU", "CK", "FJ", "FM", "GU", "KI", "MH", "MP", "NC", "NF", "NR", "NU", "NZ", "PF", "PG", "PW", "SB", "TO", "TV", "VU",
84 + "WF", "WS", "AS"], "oceania"),
85 + **dict.fromkeys(["AG", "AI", "AR", "AW", "BB", "BM", "BO", "BQ", "BR", "BS", "BZ", "CL", "CO", "CR", "CU", "CW", "DM", "DO", "EC", "FK",
86 + "GD", "GF", "GP", "GT", "GY", "HN", "HT", "JM", "KN", "KY", "LC", "MF", "MQ", "MS", "MX", "NI", "PA", "PE", "PM", "PR",
87 + "PY", "SR", "SV", "SX", "TC", "TT", "UY", "VC", "VE", "VG", "VI"], "latam"),
88 + **dict.fromkeys(["CA", "US"], "na-east"),
89 +}
modified apps/api/src/internetpressure/regions.py +9 −2
@@ -59,7 +59,9 @@ class RegionModel:
59 59 def region_of_country(self, cc: str | None) -> str:
60 60 if not cc:
61 61 return "global"
62 − return self.country_regions.get(cc.upper(), "global")
62 + from .iso import CONTINENT_REGION
63 +
64 + return self.country_regions.get(cc.upper()) or CONTINENT_REGION.get(cc.upper(), "global")
63 65
64 66 def get(self, region_id: str | None) -> Region | None:
65 67 return self.regions.get(region_id or "")
@@ -85,4 +87,9 @@ def load_regions() -> RegionModel:
85 87 def country_name(cc: str | None) -> str:
86 88 if not cc:
87 89 return "Global"
88 − return COUNTRY_NAMES.get(cc.upper(), cc.upper())
90 + from .iso import ISO
91 +
92 + cc = cc.upper()
93 + if cc in COUNTRY_NAMES:
94 + return COUNTRY_NAMES[cc]
95 + return ISO[cc][0] if cc in ISO else cc
modified apps/api/src/internetpressure/registry.py +9 −1
@@ -245,13 +245,21 @@ async def seed(*, targets: bool = True, services: bool = True, probes: bool = Tr
245 245 defaults = doc.get("defaults") or {}
246 246 all_targets = list(doc["targets"])
247 247 seen_ids = {str(t["id"]) for t in all_targets}
248 + # fragments were authored independently: the same public endpoint may appear twice → first occurrence wins
249 + seen_hosts = {(str(t["host"]).lower(), t.get("url"), t.get("ip")) for t in all_targets}
250 + skipped = 0
248 251 for f in sorted((s.targets_path.parent / "fragments").glob("*.yaml")):
249 252 with open(f, encoding="utf-8") as fh:
250 253 for t in (yaml.safe_load(fh) or {}).get("targets") or []:
251 − if str(t["id"]) in seen_ids:
254 + hk = (str(t["host"]).lower(), t.get("url"), t.get("ip"))
255 + if str(t["id"]) in seen_ids or hk in seen_hosts:
256 + skipped += 1
252 257 continue
253 258 seen_ids.add(str(t["id"]))
259 + seen_hosts.add(hk)
254 260 all_targets.append(t)
261 + if skipped:
262 + log.info("seed: %d fragment entries skipped as duplicates (id or host)", skipped)
255 263 for t in all_targets:
256 264 row = {
257 265 "target_id": str(t["id"]), "name": str(t["name"]), "hostname": str(t["host"]), "url": t.get("url"), "ip": t.get("ip"),
added data/seed/services-fragments/finance.yaml +109 −0
@@ -0,0 +1,109 @@
1 +# InternetPressure services fragment — FINANCE & PAYMENTS. Merged with services.yaml by `ip seed`.
2 +# Every status URL below was fetched on 2026-09-13 and returned the expected JSON shape
3 +# (Atlassian Statuspage: page + status.indicator; status.io: result.status_overall). Corroboration only.
4 +
5 +services:
6 + - { slug: aave, name: "Aave", category: finance, asns: [], importance: 4, status: { kind: statuspage, url: "https://status.aave.com/api/v2/summary.json" } }
7 + - { slug: afterpay, name: "Afterpay", category: finance, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.afterpay.com/api/v2/summary.json" } }
8 + - { slug: airwallex, name: "Airwallex", category: finance, asns: [], importance: 3, status: { kind: statuspage, url: "https://status.airwallex.com/api/v2/summary.json" } }
9 + - { slug: alchemy, name: "Alchemy", category: finance, asns: [], importance: 4, status: { kind: statuspage, url: "https://status.alchemy.com/api/v2/summary.json" } }
10 + - { slug: alma, name: "Alma", category: finance, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.getalma.eu/api/v2/summary.json" } }
11 + - { slug: alpaca, name: "Alpaca", category: finance, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.alpaca.markets/api/v2/summary.json" } }
12 + - { slug: authorizenet, name: "Authorize.net", category: finance, asns: [], importance: 4, status: { kind: statuspage, url: "https://status.authorize.net/api/v2/summary.json" } }
13 + - { slug: avalanche, name: "Avalanche", category: finance, asns: [], importance: 3, status: { kind: statuspage, url: "https://status.avax.network/api/v2/summary.json" } }
14 + - { slug: avalara, name: "Avalara", category: finance, asns: [], importance: 3, status: { kind: statuspage, url: "https://status.avalara.com/api/v2/summary.json" } }
15 + - { slug: bakkt, name: "Bakkt", category: finance, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.bakkt.com/api/v2/summary.json" } }
16 + - { slug: base, name: "Base", category: finance, asns: [], importance: 3, status: { kind: statuspage, url: "https://status.base.org/api/v2/summary.json" } }
17 + - { slug: bit2me, name: "Bit2Me", category: finance, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.bit2me.com/api/v2/summary.json" } }
18 + - { slug: bitbuy, name: "Bitbuy", category: finance, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.bitbuy.ca/api/v2/summary.json" } }
19 + - { slug: bitfinex, name: "Bitfinex", category: finance, asns: [], importance: 3, status: { kind: statuspage, url: "https://bitfinex.statuspage.io/api/v2/summary.json" } }
20 + - { slug: bitflyer, name: "bitFlyer", category: finance, asns: [], importance: 3, status: { kind: statuspage, url: "https://status.bitflyer.com/api/v2/summary.json" } }
21 + - { slug: bitgo, name: "BitGo", category: finance, asns: [], importance: 3, status: { kind: statuspage, url: "https://status.bitgo.com/api/v2/summary.json" } }
22 + - { slug: bitmex, name: "BitMEX", category: finance, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.bitmex.com/api/v2/summary.json" } }
23 + - { slug: bitpanda, name: "Bitpanda", category: finance, asns: [], importance: 3, status: { kind: statuspage, url: "https://status.bitpanda.com/api/v2/summary.json" } }
24 + - { slug: bitso, name: "Bitso", category: finance, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.bitso.com/api/v2/summary.json" } }
25 + - { slug: bitvavo, name: "Bitvavo", category: finance, asns: [], importance: 3, status: { kind: statuspage, url: "https://status.bitvavo.com/api/v2/summary.json" } }
26 + - { slug: btcmarkets, name: "BTC Markets", category: finance, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.btcmarkets.net/api/v2/summary.json" } }
27 + - { slug: bullish, name: "Bullish", category: finance, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.bullish.com/api/v2/summary.json" } }
28 + - { slug: cashapp, name: "Cash App", category: finance, asns: [], importance: 4, status: { kind: statuspage, url: "https://status.cash.app/api/v2/summary.json" } }
29 + - { slug: chainalysis, name: "Chainalysis", category: finance, asns: [], importance: 3, status: { kind: statuspage, url: "https://status.chainalysis.com/api/v2/summary.json" } }
30 + - { slug: chime, name: "Chime", category: finance, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.chime.com/api/v2/summary.json" } }
31 + - { slug: circle, name: "Circle", category: finance, asns: [], importance: 4, status: { kind: statuspage, url: "https://status.circle.com/api/v2/summary.json" } }
32 + - { slug: clover, name: "Clover", category: finance, asns: [], importance: 3, status: { kind: statuspage, url: "https://status.clover.com/api/v2/summary.json" } }
33 + - { slug: coindcx, name: "CoinDCX", category: finance, asns: [], importance: 3, status: { kind: statuspage, url: "https://status.coindcx.com/api/v2/summary.json" } }
34 + - { slug: coinjar, name: "CoinJar", category: finance, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.coinjar.com/api/v2/summary.json" } }
35 + - { slug: coinlist, name: "CoinList", category: finance, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.coinlist.co/api/v2/summary.json" } }
36 + - { slug: coinmarketcap, name: "CoinMarketCap", category: finance, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.coinmarketcap.com/api/v2/summary.json" } }
37 + - { slug: column, name: "Column", category: finance, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.column.com/api/v2/summary.json" } }
38 + - { slug: crypto-com, name: "Crypto.com", category: finance, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.crypto.com/api/v2/summary.json" } }
39 + - { slug: dwolla, name: "Dwolla", category: finance, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.dwolla.com/api/v2/summary.json" } }
40 + - { slug: etoro, name: "eToro", category: finance, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.etoro.com/api/v2/summary.json" } }
41 + - { slug: fireblocks, name: "Fireblocks", category: finance, asns: [], importance: 4, status: { kind: statuspage, url: "https://status.fireblocks.com/api/v2/summary.json" } }
42 + - { slug: flutterwave, name: "Flutterwave", category: finance, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.flutterwave.com/api/v2/summary.json" } }
43 + - { slug: foxbit, name: "Foxbit", category: finance, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.foxbit.com.br/api/v2/summary.json" } }
44 + - { slug: freshbooks, name: "FreshBooks", category: finance, asns: [], importance: 3, status: { kind: statuspage, url: "https://status.freshbooks.com/api/v2/summary.json" } }
45 + - { slug: ig, name: "IG", category: finance, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.ig.com/api/v2/summary.json" } }
46 + - { slug: increase, name: "Increase", category: finance, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.increase.com/api/v2/summary.json" } }
47 + - { slug: infura, name: "Infura", category: finance, asns: [], importance: 4, status: { kind: statuspage, url: "https://status.infura.io/api/v2/summary.json" } }
48 + - { slug: ledger, name: "Ledger", category: finance, asns: [], importance: 4, status: { kind: statuspage, url: "https://status.ledger.com/api/v2/summary.json" } }
49 + - { slug: lemon, name: "Lemon", category: finance, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.lemon.me/api/v2/summary.json" } }
50 + - { slug: lemonway, name: "Lemonway", category: finance, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.lemonway.com/api/v2/summary.json" } }
51 + - { slug: lightspeed, name: "Lightspeed", category: finance, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.lightspeedhq.com/api/v2/summary.json" } }
52 + - { slug: lithic, name: "Lithic", category: finance, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.lithic.com/api/v2/summary.json" } }
53 + - { slug: luno, name: "Luno", category: finance, asns: [], importance: 3, status: { kind: statuspage, url: "https://status.luno.com/api/v2/summary.json" } }
54 + - { slug: m1, name: "M1 Finance", category: finance, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.m1.com/api/v2/summary.json" } }
55 + - { slug: marqeta, name: "Marqeta", category: finance, asns: [], importance: 3, status: { kind: statuspage, url: "https://status.marqeta.com/api/v2/summary.json" } }
56 + - { slug: mercadopago, name: "Mercado Pago", category: finance, asns: [], importance: 3, status: { kind: statuspage, url: "https://status.mercadopago.com/api/v2/summary.json" } }
57 + - { slug: mercury, name: "Mercury", category: finance, asns: [], importance: 3, status: { kind: statuspage, url: "https://status.mercury.com/api/v2/summary.json" } }
58 + - { slug: moneris, name: "Moneris", category: finance, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.moneris.com/api/v2/summary.json" } }
59 + - { slug: montonio, name: "Montonio", category: finance, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.montonio.com/api/v2/summary.json" } }
60 + - { slug: monzo, name: "Monzo", category: finance, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.monzo.com/api/v2/summary.json" } }
61 + - { slug: morningstar, name: "Morningstar", category: finance, asns: [], importance: 4, status: { kind: statuspage, url: "https://status.morningstar.com/api/v2/summary.json" } }
62 + - { slug: mx, name: "MX Technologies", category: finance, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.mx.com/api/v2/summary.json" } }
63 + - { slug: netsuite, name: "Oracle NetSuite", category: finance, asns: [], importance: 4, status: { kind: statuspage, url: "https://status.netsuite.com/api/v2/summary.json" } }
64 + - { slug: newton, name: "Newton", category: finance, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.newton.co/api/v2/summary.json" } }
65 + - { slug: nium, name: "Nium", category: finance, asns: [], importance: 3, status: { kind: statuspage, url: "https://status.nium.com/api/v2/summary.json" } }
66 + - { slug: omise, name: "Omise (Opn)", category: finance, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.omise.co/api/v2/summary.json" } }
67 + - { slug: openexchangerates, name: "Open Exchange Rates", category: finance, asns: [], importance: 3, status: { kind: statuspage, url: "https://status.openexchangerates.org/api/v2/summary.json" } }
68 + - { slug: opensea, name: "OpenSea", category: finance, asns: [], importance: 3, status: { kind: statuspage, url: "https://status.opensea.io/api/v2/summary.json" } }
69 + - { slug: osl, name: "OSL", category: finance, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.osl.com/api/v2/summary.json" } }
70 + - { slug: paxos, name: "Paxos", category: finance, asns: [], importance: 3, status: { kind: statuspage, url: "https://status.paxos.com/api/v2/summary.json" } }
71 + - { slug: payfast, name: "Payfast", category: finance, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.payfast.io/api/v2/summary.json" } }
72 + - { slug: payoneer, name: "Payoneer", category: finance, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.payoneer.com/api/v2/summary.json" } }
73 + - { slug: payplug, name: "PayPlug", category: finance, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.payplug.com/api/v2/summary.json" } }
74 + - { slug: paysafe, name: "Paysafe", category: finance, asns: [], importance: 3, status: { kind: statuspage, url: "https://status.paysafe.com/api/v2/summary.json" } }
75 + - { slug: peach-payments, name: "peach-payments", category: finance, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.peachpayments.com/api/v2/summary.json" } }
76 + - { slug: pleo, name: "Pleo", category: finance, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.pleo.io/api/v2/summary.json" } }
77 + - { slug: polygon, name: "Polygon", category: finance, asns: [], importance: 3, status: { kind: statuspage, url: "https://status.polygon.technology/api/v2/summary.json" } }
78 + - { slug: quicknode, name: "QuickNode", category: finance, asns: [], importance: 3, status: { kind: statuspage, url: "https://status.quicknode.com/api/v2/summary.json" } }
79 + - { slug: ripio, name: "Ripio", category: finance, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.ripio.com/api/v2/summary.json" } }
80 + - { slug: sage, name: "Sage", category: finance, asns: [], importance: 4, status: { kind: statuspage, url: "https://status.sage.com/api/v2/summary.json" } }
81 + - { slug: scalable, name: "Scalable Capital", category: finance, asns: [], importance: 3, status: { kind: statuspage, url: "https://status.scalable.capital/api/v2/summary.json" } }
82 + - { slug: scalapay, name: "Scalapay", category: finance, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.scalapay.com/api/v2/summary.json" } }
83 + - { slug: sezzle, name: "Sezzle", category: finance, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.sezzle.com/api/v2/summary.json" } }
84 + - { slug: shakepay, name: "Shakepay", category: finance, asns: [], importance: 3, status: { kind: statuspage, url: "https://status.shakepay.com/api/v2/summary.json" } }
85 + - { slug: shift4, name: "Shift4", category: finance, asns: [], importance: 3, status: { kind: statuspage, url: "https://status.shift4.com/api/v2/summary.json" } }
86 + - { slug: solana, name: "Solana", category: finance, asns: [], importance: 4, status: { kind: statuspage, url: "https://status.solana.com/api/v2/summary.json" } }
87 + - { slug: solaris, name: "Solaris", category: finance, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.solarisgroup.com/api/v2/summary.json" } }
88 + - { slug: spendesk, name: "Spendesk", category: finance, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.spendesk.com/api/v2/summary.json" } }
89 + - { slug: square, name: "Square", category: finance, asns: [], importance: 3, status: { kind: statuspage, url: "https://www.issquareup.com/api/v2/summary.json" } }
90 + - { slug: stellar, name: "Stellar", category: finance, asns: [], importance: 3, status: { kind: statuspage, url: "https://status.stellar.org/api/v2/summary.json" } }
91 + - { slug: sumup, name: "SumUp", category: finance, asns: [], importance: 3, status: { kind: statuspage, url: "https://status.sumup.com/api/v2/summary.json" } }
92 + - { slug: swish, name: "Swish", category: finance, asns: [], importance: 4, status: { kind: statuspage, url: "https://status.swish.nu/api/v2/summary.json" } }
93 + - { slug: tabby, name: "Tabby", category: finance, asns: [], importance: 3, status: { kind: statuspage, url: "https://status.tabby.ai/api/v2/summary.json" } }
94 + - { slug: tastytrade, name: "tastytrade", category: finance, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.tastytrade.com/api/v2/summary.json" } }
95 + - { slug: tink, name: "Tink", category: finance, asns: [], importance: 3, status: { kind: statuspage, url: "https://status.tink.com/api/v2/summary.json" } }
96 + - { slug: toast, name: "Toast", category: finance, asns: [], importance: 3, status: { kind: statuspage, url: "https://status.toasttab.com/api/v2/summary.json" } }
97 + - { slug: treasuryprime, name: "Treasury Prime", category: finance, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.treasuryprime.com/api/v2/summary.json" } }
98 + - { slug: truelayer, name: "TrueLayer", category: finance, asns: [], importance: 3, status: { kind: statuspage, url: "https://status.truelayer.com/api/v2/summary.json" } }
99 + - { slug: tyro, name: "Tyro", category: finance, asns: [], importance: 3, status: { kind: statuspage, url: "https://status.tyro.com/api/v2/summary.json" } }
100 + - { slug: unit, name: "Unit", category: finance, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.unit.co/api/v2/summary.json" } }
101 + - { slug: unzer, name: "Unzer", category: finance, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.unzer.com/api/v2/summary.json" } }
102 + - { slug: valr, name: "VALR", category: finance, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.valr.com/api/v2/summary.json" } }
103 + - { slug: viva, name: "Viva.com", category: finance, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.viva.com/api/v2/summary.json" } }
104 + - { slug: wave, name: "Wave", category: finance, asns: [], importance: 3, status: { kind: statuspage, url: "https://status.waveapps.com/api/v2/summary.json" } }
105 + - { slug: worldpay, name: "Worldpay", category: finance, asns: [], importance: 3, status: { kind: statuspage, url: "https://status.worldpay.com/api/v2/summary.json" } }
106 + - { slug: xendit, name: "Xendit", category: finance, asns: [], importance: 3, status: { kind: statuspage, url: "https://status.xendit.co/api/v2/summary.json" } }
107 + - { slug: yapily, name: "Yapily", category: finance, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.yapily.com/api/v2/summary.json" } }
108 + - { slug: yoco, name: "Yoco", category: finance, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.yoco.com/api/v2/summary.json" } }
109 + - { slug: zettle, name: "Zettle", category: finance, asns: [], importance: 3, status: { kind: statuspage, url: "https://status.zettle.com/api/v2/summary.json" } }
added data/seed/services-fragments/government.yaml +4 −0
@@ -0,0 +1,4 @@
1 +# Services fragment — government sector. Governments almost never expose machine-readable status pages usable by our
2 +# connector kinds (statuspage / statusio / gcp_json / aws_rss / azure_rss / slack_json / heroku_v4); verified 2026-09-13.
3 +# Deliberately empty — corroboration for government targets comes from HTTP probes only.
4 +services: []
added data/seed/services-fragments/infrastructure.yaml +52 −0
@@ -0,0 +1,52 @@
1 +# Services fragment — Internet infrastructure providers with a machine-readable public status page.
2 +# Every connector below was verified 2026-09-13 with curl (Statuspage `/api/v2/summary.json` → status.indicator + page.name;
3 +# status.io `/1.0/status/<page_id>` → result.status_overall.status). Providers whose page is custom / Instatus / incident.io
4 +# (Vultr, Hetzner, Backblaze, Namecheap, Contabo, Leaseweb, IONOS, Gcore, Deno, NextDNS, Quad9, OpenDNS, Megaport, Starlink, Viasat,
5 +# Zscaler, Netskope, WP Engine, Platform.sh, Equinix, Digital Realty, Zayo, PacketFabric, ICANN) are deliberately omitted.
6 +services:
7 + # ───────── Cloud, hosting & PaaS
8 + - { slug: kinsta, name: Kinsta, category: cloud, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.kinsta.com/api/v2/summary.json" } }
9 + - { slug: pantheon, name: Pantheon, category: cloud, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.pantheon.io/api/v2/summary.json" } }
10 + - { slug: acquia, name: Acquia, category: cloud, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.acquia.com/api/v2/summary.json" } }
11 + - { slug: cloudways, name: Cloudways, category: cloud, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.cloudways.com/api/v2/summary.json" } }
12 + - { slug: liquidweb, name: Liquid Web, category: cloud, asns: [32244], importance: 2, status: { kind: statuspage, url: "https://status.liquidweb.com/api/v2/summary.json" } }
13 + - { slug: nexcess, name: Nexcess, category: cloud, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.nexcess.net/api/v2/summary.json" } }
14 + - { slug: phoenixnap, name: phoenixNAP, category: cloud, asns: [20278], importance: 2, status: { kind: statuspage, url: "https://status.phoenixnap.com/api/v2/summary.json" } }
15 + - { slug: hosteurope, name: Host Europe, category: cloud, asns: [20773], importance: 2, status: { kind: statuspage, url: "https://status.hosteurope.de/api/v2/summary.json" } }
16 + - { slug: onecom, name: one.com, category: cloud, asns: [51468], importance: 2, status: { kind: statuspage, url: "https://status.one.com/api/v2/summary.json" } }
17 + - { slug: dreamhost, name: DreamHost, category: cloud, asns: [26347], importance: 2, status: { kind: statusio, url: "https://api.status.io/1.0/status/575f0f606826303142000510" } }
18 + - { slug: catalystcloud, name: Catalyst Cloud, category: cloud, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.catalystcloud.nz/api/v2/summary.json" } }
19 + - { slug: webflow, name: Webflow, category: cloud, asns: [], importance: 3, status: { kind: statuspage, url: "https://status.webflow.com/api/v2/summary.json" } }
20 + - { slug: upstash, name: Upstash, category: developer, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.upstash.com/api/v2/summary.json" } }
21 + - { slug: cdnjs, name: cdnjs, category: cdn, asns: [], importance: 3, status: { kind: statuspage, url: "https://status.cdnjs.com/api/v2/summary.json" } }
22 + - { slug: cocoapods, name: CocoaPods, category: developer, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.cocoapods.org/api/v2/summary.json" } }
23 + - { slug: hexpm, name: Hex.pm, category: developer, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.hex.pm/api/v2/summary.json" } }
24 + # ───────── Registrars & DNS
25 + - { slug: namecom, name: Name.com, category: infrastructure, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.name.com/api/v2/summary.json" } }
26 + - { slug: dnsimple, name: DNSimple, category: infrastructure, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.dnsimple.com/api/v2/summary.json" } }
27 + - { slug: dnsfilter, name: DNSFilter, category: infrastructure, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.dnsfilter.com/api/v2/summary.json" } }
28 + - { slug: adguard, name: AdGuard DNS, category: infrastructure, asns: [212772], importance: 3, status: { kind: statuspage, url: "https://status.adguard.com/api/v2/summary.json" } }
29 + - { slug: ripe, name: RIPE NCC, category: infrastructure, asns: [3333], importance: 4, status: { kind: statuspage, url: "https://status.ripe.net/api/v2/summary.json" } }
30 + # ───────── PKI
31 + - { slug: digicert, name: DigiCert, category: infrastructure, asns: [], importance: 4, status: { kind: statuspage, url: "https://status.digicert.com/api/v2/summary.json" } }
32 + - { slug: globalsign, name: GlobalSign, category: infrastructure, asns: [], importance: 3, status: { kind: statuspage, url: "https://status.globalsign.com/api/v2/summary.json" } }
33 + - { slug: sectigo, name: Sectigo, category: infrastructure, asns: [], importance: 4, status: { kind: statusio, url: "https://sectigo.status.io/1.0/status/5938a0dbef3e6af26b001921" } }
34 + # ───────── Enterprise networking, zero-trust & VPN
35 + - { slug: meraki, name: Cisco Meraki, category: infrastructure, asns: [], importance: 3, status: { kind: statuspage, url: "https://status.meraki.com/api/v2/summary.json" } }
36 + - { slug: ubiquiti, name: Ubiquiti, category: infrastructure, asns: [], importance: 3, status: { kind: statuspage, url: "https://status.ui.com/api/v2/summary.json" } }
37 + - { slug: twingate, name: Twingate, category: infrastructure, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.twingate.com/api/v2/summary.json" } }
38 + - { slug: netbird, name: NetBird, category: infrastructure, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.netbird.io/api/v2/summary.json" } }
39 + - { slug: checkpoint, name: Check Point, category: infrastructure, asns: [], importance: 3, status: { kind: statuspage, url: "https://status.checkpoint.com/api/v2/summary.json" } }
40 + - { slug: forticloud, name: Fortinet FortiCloud, category: infrastructure, asns: [], importance: 3, status: { kind: statuspage, url: "https://status.forticloud.com/api/v2/summary.json" } }
41 + - { slug: barracuda, name: Barracuda Networks, category: infrastructure, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.barracuda.com/api/v2/summary.json" } }
42 + - { slug: watchguard, name: WatchGuard, category: infrastructure, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.watchguard.com/api/v2/summary.json" } }
43 + - { slug: infoblox, name: Infoblox, category: infrastructure, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.infoblox.com/api/v2/summary.json" } }
44 + - { slug: cradlepoint, name: Cradlepoint NetCloud, category: infrastructure, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.cradlepoint.com/api/v2/summary.json" } }
45 + - { slug: nordlayer, name: NordLayer, category: infrastructure, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.nordlayer.com/api/v2/summary.json" } }
46 + - { slug: perimeter81, name: Perimeter 81 (Check Point), category: infrastructure, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.perimeter81.com/api/v2/summary.json" } }
47 + # ───────── Network observability
48 + - { slug: kentik, name: Kentik, category: infrastructure, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.kentik.com/api/v2/summary.json" } }
49 + - { slug: thousandeyes, name: Cisco ThousandEyes, category: infrastructure, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.thousandeyes.com/api/v2/summary.json" } }
50 + - { slug: catchpoint, name: Catchpoint, category: infrastructure, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.catchpoint.com/api/v2/summary.json" } }
51 + - { slug: statuscake, name: StatusCake, category: infrastructure, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.statuscake.com/api/v2/summary.json" } }
52 + - { slug: incidentio, name: incident.io, category: infrastructure, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.incident.io/api/v2/summary.json" } }
added data/seed/services-fragments/media.yaml +37 −0
@@ -0,0 +1,37 @@
1 +# Services fragment — media / streaming / social / gaming providers with a machine-readable public status page.
2 +# Only connectors verified 2026-09-13 (Statuspage /api/v2/summary.json with page + status.indicator). Providers whose
3 +# status page is Instatus/custom (Bluesky, Discogs, mastodon.social, Philo, Podchaser, Restream, Wistia, Crunchyroll,
4 +# Spotify custom, Roku, SoundCloud, Vimeo, Unity, FACEIT, Photon, Chess.com, Lichess…) are intentionally omitted (status: null).
5 +services:
6 + - { slug: bitly, name: Bitly, category: social, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.bitly.com/api/v2/summary.json" } }
7 + - { slug: buffer, name: Buffer, category: social, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.buffer.com/api/v2/summary.json" } }
8 + - { slug: canva, name: Canva, category: social, asns: [], importance: 3, status: { kind: statuspage, url: "https://www.canvastatus.com/api/v2/summary.json" } }
9 + - { slug: dailymotion, name: Dailymotion, category: streaming, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.dailymotion.com/api/v2/summary.json" } }
10 + - { slug: devto, name: "DEV Community", category: social, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.dev.to/api/v2/summary.json" } }
11 + - { slug: disqus, name: Disqus, category: social, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.disqus.com/api/v2/summary.json" } }
12 + - { slug: foursquare, name: Foursquare, category: social, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.foursquare.com/api/v2/summary.json" } }
13 + - { slug: geforcenow, name: "NVIDIA GeForce NOW", category: streaming, asns: [], importance: 3, status: { kind: statuspage, url: "https://status.geforcenow.com/api/v2/summary.json" } }
14 + - { slug: giphy, name: GIPHY, category: social, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.giphy.com/api/v2/summary.json" } }
15 + - { slug: gofundme, name: GoFundMe, category: social, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.gofundme.com/api/v2/summary.json" } }
16 + - { slug: goto, name: GoTo, category: messaging, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.goto.com/api/v2/summary.json" } }
17 + - { slug: grindr, name: Grindr, category: social, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.grindr.com/api/v2/summary.json" } }
18 + - { slug: hootsuite, name: Hootsuite, category: social, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.hootsuite.com/api/v2/summary.json" } }
19 + - { slug: hypixel, name: Hypixel, category: streaming, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.hypixel.net/api/v2/summary.json" } }
20 + - { slug: imgur, name: Imgur, category: social, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.imgur.com/api/v2/summary.json" } }
21 + - { slug: kahoot, name: "Kahoot!", category: social, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.kahoot.com/api/v2/summary.json" } }
22 + - { slug: kickstarter, name: Kickstarter, category: social, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.kickstarter.com/api/v2/summary.json" } }
23 + - { slug: megaphone, name: "Megaphone (Spotify)", category: streaming, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.megaphone.fm/api/v2/summary.json" } }
24 + - { slug: minds, name: Minds, category: social, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.minds.com/api/v2/summary.json" } }
25 + - { slug: misskey, name: Misskey.io, category: social, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.misskey.io/api/v2/summary.json" } }
26 + - { slug: patreon, name: Patreon, category: social, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.patreon.com/api/v2/summary.json" } }
27 + - { slug: playfab, name: PlayFab, category: streaming, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.playfab.com/api/v2/summary.json" } }
28 + - { slug: plex, name: Plex, category: streaming, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.plex.tv/api/v2/summary.json" } }
29 + - { slug: simplecast, name: Simplecast, category: streaming, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.simplecast.com/api/v2/summary.json" } }
30 + - { slug: splice, name: Splice, category: streaming, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.splice.com/api/v2/summary.json" } }
31 + - { slug: streamyard, name: StreamYard, category: streaming, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.streamyard.com/api/v2/summary.json" } }
32 + - { slug: trustpilot, name: Trustpilot, category: social, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.trustpilot.com/api/v2/summary.json" } }
33 + - { slug: tunein, name: TuneIn, category: streaming, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.tunein.com/api/v2/summary.json" } }
34 + - { slug: unsplash, name: Unsplash, category: social, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.unsplash.com/api/v2/summary.json" } }
35 + - { slug: wattpad, name: Wattpad, category: social, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.wattpad.com/api/v2/summary.json" } }
36 + - { slug: wire, name: Wire, category: messaging, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.wire.com/api/v2/summary.json" } }
37 + - { slug: zulip, name: Zulip, category: messaging, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.zulip.com/api/v2/summary.json" } }
added data/targets/fragments/finance.yaml +3816 −0
Large diff (3,816 lines) is not loaded by default to keep the page fast.Load diff
added data/targets/fragments/government.yaml +5106 −0
Large diff (5,106 lines) is not loaded by default to keep the page fast.Load diff
added data/targets/fragments/infrastructure.yaml +3588 −0
Large diff (3,588 lines) is not loaded by default to keep the page fast.Load diff
added data/targets/fragments/media.yaml +3245 −0
Large diff (3,245 lines) is not loaded by default to keep the page fast.Load diff
added scripts/registry-check.py +127 −0
Large diff (128 lines) is not loaded by default to keep the page fast.Load diff
Menu

Theme