Know the basis.
The country anomaly index uses OONI measurements from its declared rolling window. Incident and evidence totals come from separate records. The incident stats response reports an event date range; the country index reports its own data-as-of time. The classifier's leave-one-country-out evaluation and training-label caveats are in its public model report. Free for research.
Quickstart
Start with the record itself — one free GET, no key, no signup:
curl 'https://api.voidly.ai/data/incidents/stats'Response — illustrative values; run the request for the current record
{
"total": 4830,
"citable_censorship": 578,
"citable_with_evidence": 522,
"total_evidence": 213170,
"evidence_by_source": { "ooni": 155720, "ioda": 26835, "censoredplanet": 30420 }
}Then ask for a verdict — is Google blocked in China? (authenticated):
curl -X POST https://api.voidly.ai/hydra/v1/detect \
-H "Content-Type: application/json" \
-H "X-API-Key: hydra_demo_key" \
-d '{"country":"CN","target":"google.com"}'Response shape — illustrative, not a live capture
{
"country": "CN",
"target": "google.com",
"blocked": true,
"confidence": 0.95,
"blockType": "dpi_block",
"lastChecked": "<time of the newest supporting measurement>",
"sources": ["ooni", "ioda", "censoredplanet"]
}Authentication
Pass your API key in the X-API-Key header. Public data endpoints require no authentication.
hydra_demo_keyUse this key for testing. Rate limited to 100 requests/minute.
Request Headers
| Header | Value | Required |
|---|---|---|
X-API-Key | Your API key | For /hydra/* endpoints |
Content-Type | application/json | For POST requests |
Integrations
Endpoints
/hydra/v1/detectIs a domain blocked in a country? Returns status (blocked / accessible / unknown), basis, the evidence count, the blocking method, a heuristic confidence (not a calibrated probability) and measurementSource. A measured verdict comes from per-domain OONI + CensoredPlanet evidence behind POST /v1/accessibility/batch. That source is on hold during source review (HTTP 503 ACCESSIBILITY_REVIEW_HOLD), so no domain is measured now: a domain on the static known-blocked list returns status: "blocked" with basis: "known_list" and a fixed confidence of 0.7, and every other domain returns status: "unknown". Verifying many domains? Use POST /hydra/v1/detect/batch (up to 50 per call). Requires an API key (free — get one at /api-keys/signup;hydra_demo_key also works for testing).
Try It
Request Body
| Field | Type | Description |
|---|---|---|
country | string | ISO 3166-1 alpha-2 code (e.g., "CN", "IR") |
target | string | Domain to check (e.g., "google.com") |
Response Schema
| Field | Type | Description |
|---|---|---|
status | string | "blocked" | "accessible" | "unknown" (unknown = no per-domain measurements) |
blocked | boolean | True only when status is "blocked". For unknown, check status — false here is not "confirmed accessible". |
confidence | number | Heuristic 0–1, not a calibrated probability: a measured verdict uses the source accessibility score (capped at 0.9), a known-list verdict is a fixed 0.7, and unmeasured is 0 |
basis | string | "measured" | "known_list" | "unmeasured" — what the verdict rests on |
evidenceCount | number | Number of underlying per-domain measurements |
blockingMethod | string | null | e.g. "tcp-reset", "dns-blocking", "blockpage" |
sources | string[] | "ooni", "censoredplanet", "known_list" |
lastChecked | string | ISO 8601 timestamp |
/hydra/v1/detect/batchVerify many domains in one country in a single call — up to 50 domains per request. Each result carries the same status / basis semantics as /hydra/v1/detect, plus a summary of blocked / accessible / unknown counts. Built for bulk verification jobs (checking hundreds of domains across countries). Requires an API key.
Request Body
{
"country": "IR",
"targets": ["twitter.com", "whatsapp.com", "github.com"]
}Response
{
"country": "IR",
"count": 3,
"summary": { "blocked": 2, "accessible": 0, "unknown": 1 },
"results": [
{ "target": "twitter.com", "status": "blocked", "blocked": true, "basis": "measured", "methods": ["tcp-reset"] },
{ "target": "whatsapp.com", "status": "blocked", "blocked": true, "basis": "measured", "methods": ["tcp-reset"] },
{ "target": "github.com", "status": "unknown", "blocked": false, "basis": "unmeasured", "methods": [] }
]
}/hydra/v1/predictExperimental heuristic, not a validated prediction; no accuracy claim. currentRisk is the country's live OONI anomaly rate (a fixed fallback score when live data is missing). predictedRisk equals currentRisk and trend is always "stable": no trend or onset model runs, so onset timing is unproven, and horizon is echoed. The same input gives the same output. With a target, mlPrediction adds a per-domain blocked probability from the ML service or a local rule; mlPrediction.source says which.
Request Body
| Field | Type | Description |
|---|---|---|
country | string | ISO 3166-1 alpha-2 code |
target | string? | Optional domain to score |
horizon | number | Echoed in the response, not modeled (default: 7) |
curl -X POST https://api.voidly.ai/hydra/v1/predict \
-H "Content-Type: application/json" \
-H "X-API-Key: hydra_demo_key" \
-d '{"country":"RU","horizon":30}'/v1/forecast/:country/7dayNEWExperimental 7-day current-regime risk score for a country, from a model trained on historical censorship patterns, election calendars and political events. Onset timing is unproven: a score is not a prediction of when a shutdown starts, and no current skill or accuracy figure is published. Limits: /v1/forecast/onset-skill.
Response Fields
| Field | Type | Description |
|---|---|---|
forecast | array | 8 daily scores (day 0-7) |
forecast[].risk | number | Risk score 0-1 (0.5+ is elevated) |
forecast[].drivers | string[] | Risk factors (election, protest, etc.) |
summary.max_risk | number | Peak risk in the 7-day window |
confidence | number | Model confidence (0-1) |
# Get 7-day forecast for Iran
curl "https://api.voidly.ai/v1/forecast/IR/7day"
# Get all high-risk countries (threshold 0.3)
curl "https://api.voidly.ai/v1/forecast/high-risk?threshold=0.3"
# Batch forecast for multiple countries
curl -X POST "https://api.voidly.ai/v1/forecast/batch" \
-H "Content-Type: application/json" \
-d '{"countries":["IR","CN","RU"]}'Example Response
{
"country": "IR",
"country_name": "Iran",
"forecast": [
{"day": 0, "date": "2026-02-10", "risk": 0.26, "drivers": []},
{"day": 1, "date": "2026-02-11", "risk": 0.28, "drivers": []},
{"day": 7, "date": "2026-02-17", "risk": 0.35, "drivers": ["election"]}
],
"summary": {
"max_risk": 0.35,
"max_risk_day": 7,
"avg_risk": 0.27,
"key_drivers": ["election"]
},
"confidence": 0.85,
"model_version": "v1"
}/hydra/v1/threat-level/:countryCountry threat level: the live OONI anomaly rate, raised to a static floor for the country's risk tier (scoreSource says which). recentBlocks counts OONI measurements with confirmed blocking in the upstream window, or is null without live data. No trend is computed, so trend is null. With includeHistory=true, history counts incident records per day (each day's score is null), or is null when the incident source does not answer. Not a validated prediction.
curl -H "X-API-Key: hydra_demo_key" \
"https://api.voidly.ai/hydra/v1/threat-level/IR?includeHistory=true"/hydra/v1/scoresGet censorship scores for all tracked countries, sorted by severity.
Query Parameters
| Param | Type | Description |
|---|---|---|
minConfidence | number | Minimum confidence threshold (0-1, default: 0.5) |
limit | number | Max results (default: 50) |
/hydra/v1/model/infoHydra service metadata: endpoint descriptions, methodology, data sources, authentication and rate limits. It returns no accuracy figure; classifier evaluation is at GET /v1/classifier/info.
curl -H "X-API-Key: hydra_demo_key" "https://api.voidly.ai/hydra/v1/model/info"Public Data
Open datasets available without authentication. Voidly-original summaries and upstream measurements have different licenses; check each dataset and source before reuse.
/data/censorship-index.jsonNo AuthFull censorship index dataset with Schema.org structured data. Updated continuously.
/data/country/:codeNo AuthDetailed censorship data for a single country.
curl "https://api.voidly.ai/data/country/CN"Under review. These routes currently answer HTTP 200 with every blocked verdict, list, count and rate set to unknown or null and a top-level review object (status: "under_review", dataAsOf). The national blocklist layer let false positives through in open countries (one confirmed measurement could count a network), so it is being rebuilt with a stricter per-network rule, and its blocked lists are withheld until a fixed checker passes review. Why ↗
/v1/measurement/summaryNo AuthCensorship Intelligence — one-call state of global censorship: countries measured, countries with confirmed national blocks, the deepest censor, the broadest-blocked category, measurement depth and data coverage. The ideal first call; links the per-metric endpoints below.
curl "https://api.voidly.ai/v1/measurement/summary"/v1/measurement/intent-profileNo AuthWhat each censor targets: per-country category mix of nationally-blocked domains, rolled into three focus shares — political speech, regulated “morality”, and circumvention tooling. Add ?country=XX for one country.
curl "https://api.voidly.ai/v1/measurement/intent-profile?country=RU"/v1/measurement/category-leadersNo AuthWhich countries most censor a given Citizen Lab content category (NEWS, ANON, HUMR, LGBT, GMB, POLR…), ranked by distinct domains nationally blocked, with example domains.
curl "https://api.voidly.ai/v1/measurement/category-leaders?category=LGBT"/v1/measurement/co-blockingNo AuthCountry pairs that nationally block the same domains (“censorship twins”) — shared blocklist size plus shared_political and shared_tooling, which separate political and circumvention categories from other shared domains. Read the response for the observed counts and window.
curl "https://api.voidly.ai/v1/measurement/co-blocking"/v1/measurement/most-blocked-domainsNo AuthGlobal leaderboard of the most-blocked domains by country count. Honest: gambling/adult dominate the top (legal blocking), not political censorship — use ?category=ANON for circumvention tools or ?category=NEWS for news. Also: /network-depth, /quality, /techniques, /by-region.
curl "https://api.voidly.ai/v1/measurement/most-blocked-domains?category=ANON"/v1/vpn-accessibilityNo AuthUnique DataCheck which VPN endpoints are blocked in each country. Voidly combines probe-network reachability checks with censorship intelligence. Per-probe and operator listings are withheld to protect volunteer operators.
Query Parameters
| Param | Type | Description |
|---|---|---|
country | string | Filter by probe node country (where test runs FROM) |
provider | string | VPN provider: voidly, nordvpn, protonvpn, mullvad |
curl "https://api.voidly.ai/v1/vpn-accessibility?country=IR"Why this matters: Journalists and researchers often ask "Can users in Iran connect to VPNs?" This endpoint answers that question with real probe data from our global infrastructure.
/data/methodologyNo AuthMachine-readable methodology including scoring algorithm and data sources.
Early-warning pre-registration record
Read the published study rules and commitment ledger. These public reads require no API key. The record does not disclose alerts, alert counts or scores. Read the returned caveats with the data.
/v1/early-warning/protocol
No query parameters. Returns the published study rules in protocol and a link to the ledger in commitments_url.
curl -fsS "https://api.voidly.ai/v1/early-warning/protocol"/v1/early-warning/commitments
Optional since=YYYY-MM-DD includes rows on or after that UTC forecast issue date. Omit it to read the full log. Unknown parameters, repeated parameters and invalid dates return HTTP 400 with INVALID_INPUT.
curl -fsS "https://api.voidly.ai/v1/early-warning/commitments?since=2026-10-14"Returns protocol_url, the requested since (or null), returned, commitments and cutovers (arm-version cutover records, never narrowed by since). Each cutover contains record_type (cutover), arm, effective_from, pre_registered_sha256 and note. Each commitment row contains schema, date, sha256, arms and status; a committed row dated before the UTC date of a listed arm’s cutover also carries before_cutover: true. The log summary always describes the full log: rows, committed, missed_zero_alerts, cutovers, skipped_unknown_arm, skipped_unknown_record_type, arm_rows_before_cutover, first_date and latest_date. Filtering changes only since, returned and commitments.
Shared response fields and freshness
Both responses include schema, source_url, page_url, fetched_at, performance_score (always null) and caveats. fetched_at is when the API read the published file, not when a forecast was issued.
Responses are cached at the edge for five minutes and may be served stale for another hour, so a response can be about 65 minutes old; the since parameter filters by commitment date, not by freshness. Stale responses carry X-Voidly-Cache: STALE and Cache-Control: no-store. If the source is unavailable or invalid and no usable cached response exists, the API returns HTTP 503 with Cache-Control: no-store.
Source errors return error, source_url and message; the error is EARLY_WARNING_SOURCE_UNAVAILABLE or EARLY_WARNING_SOURCE_INVALID.
Hosted MCP tools
Available only on https://api.voidly.ai/mcp. These tools are not in the npm package @voidly/mcp-server.
get_early_warning_protocol— read the published study rules. Arguments:{}.get_early_warning_commitments— read the commitment ledger. Arguments:{}or an optionalsincedate inYYYY-MM-DDformat.
Risk Intelligence
Four research APIs packaging our censorship measurement data for researchers, journalists, circumvention developers, and civil society.
Platform Risk Scores
Per-platform censorship risk across all monitored countries. How blocked is WhatsApp globally?
Under review. These routes currently answer HTTP 200 with every blocked verdict, list, count and rate set to unknown or null and a top-level review object (status: "under_review", dataAsOf). These verdicts counted CensoredPlanet rows and IODA outages as blocks, which Voidly no longer accepts as block evidence, so they are withheld until a fixed checker passes review. Why ↗
/v1/platforms/scoresAll platforms ranked by global risk (under review: verdicts unknown; no data date reported)/v1/platform/:platform/riskGlobal risk profile for a platform (under review: verdicts unknown; no data date reported)/v1/platform/:platform/risk/:countryPlatform risk in specific country (under review: verdicts unknown; no data date reported)/v1/platforms/country/:countryAll platforms ranked for a country (under review: verdicts unknown; no data date reported)curl https://api.voidly.ai/v1/platforms/scoresPlatforms tracked: Twitter/X, WhatsApp, Telegram, YouTube, Signal, Facebook, Instagram, TikTok, Wikipedia, Tor, Reddit, Medium.Explore live →
ISP Risk Index
Composite ISP censorship scores measuring aggressiveness, category breadth, and blocking methods.
Under review. These routes currently answer HTTP 200 with every blocked verdict, list, count and rate set to unknown or null and a top-level review object (status: "under_review", dataAsOf). These verdicts counted CensoredPlanet rows and IODA outages as blocks, which Voidly no longer accepts as block evidence, so they are withheld until a fixed checker passes review. Why ↗
/v1/isp/index?country=:CCISPs ranked by censorship score (under review: verdicts unknown; no data date reported)/v1/isp/:asn/profileDetailed ISP profile (under review: verdicts unknown; no data date reported)/v1/isp/worst?limit=20Global worst ISPs (under review: verdicts unknown; no data date reported)/v1/isp/compare?asns=:asn1,:asn2Side-by-side ISP comparison (under review: verdicts unknown; no data date reported)curl "https://api.voidly.ai/v1/isp/index?country=IR"Composite score (0-100) based on block rate, method aggressiveness, and category breadth.Explore live →
Service Accessibility API — on hold
Accessibility checks are on hold during source review. All four endpoints below return HTTP 503 with code ACCESSIBILITY_REVIEW_HOLD.
/v1/accessibility/check?domain=:d&country=:CCOn hold — domain check/v1/accessibility/batchOn hold — batch check/v1/accessibility/service/:nameOn hold — service check/v1/accessibility/country/:CC/summaryOn hold — country summary{
"error": "Accessibility checks temporarily unavailable",
"code": "ACCESSIBILITY_REVIEW_HOLD"
}The paths remain reference only while the hold is active. A withheld response is not an accessibility verdict.Read public incident totals →
Election Risk Briefings
Election-aware censorship risk combining our 7-day forecast with historical election-censorship correlation.
/v1/elections/upcoming?days=90Upcoming elections with risk overlay/v1/elections/:country/briefingFull election risk briefing/v1/elections/calendarAll elections calendarcurl "https://api.voidly.ai/v1/elections/IR/briefing"Uses the shutdown forecast and historical election-incident correlation. Sentinel validation status is at /v1/sentinel/accuracy; a held or unavailable response is not a performance score. Separately, the citable incident count is unavailable.Explore live →
Incidents
Unavailable citable censorship incidents with human-readable IDs (e.g., IR-2026-0142) for citation.
List Incidents
/data/incidentsList incidents (paginated)/data/incidents/statsIncident counts and source breakdown/data/incidents/export?format=csvBulk export (csv, jsonl, json)/data/incidents/delta?since=:timestampDelta feed for incremental sync/data/incidents/feed.rssRSS feed (also .atom)# List incidents for Iran, limit 10
curl "https://api.voidly.ai/data/incidents?country=IR&limit=10"Incident Detail
Lookup by human-readable ID (IR-2026-0142) or hash ID. Both formats work interchangeably.
/data/incidents/:idcurl "https://api.voidly.ai/data/incidents/IR-2026-0142"Evidence Permalinks
Get verifiable evidence sources (OONI, IODA, CensoredPlanet measurements) for an incident.
/data/incidents/:id/evidencecurl "https://api.voidly.ai/data/incidents/IR-2026-0142/evidence"Reports & Citation Export
Generate citable reports in multiple formats for academics and journalists.
/data/incidents/:id/report?format=markdownCitable markdown report/data/incidents/:id/report?format=bibtexBibTeX citation/data/incidents/:id/report?format=risRIS citation (Zotero, Mendeley)# BibTeX citation for academic papers
curl "https://api.voidly.ai/data/incidents/IR-2026-0142/report?format=bibtex"Semantic Search New
Find semantically similar incidents via natural-language query. Runs on sentence-transformers embeddings over the full 10-year archive — sub-60ms latency. Great for journalists ("find past cases like this"), researchers ("pattern across countries"), and AI agents doing RAG.
/v1/incidents/similar?query=:text&k=:nQuery by natural language/v1/incidents/similarSame endpoint, JSON body (supports filters)Base URL: https://intelligence.voidly.ai:8443 · Optional filters: country, incident_type, min_confidence · Default k=5, max 50.
# Find incidents similar to "WhatsApp blocked in Iran during elections"
curl "https://intelligence.voidly.ai:8443/v1/incidents/similar?query=WhatsApp+blocked+in+Iran&k=5"
# Filter by country + minimum confidence
curl -X POST https://intelligence.voidly.ai:8443/v1/incidents/similar \
-H "Content-Type: application/json" \
-d '{"query":"DNS tampering of news sites","country":"TR","k":3,"min_confidence":0.7}'Community Probes
Probe aggregates and operator listings are temporarily withheld to protect volunteers. Agents can read public incident totals below. Running a client is a separate choice. The Python client installs with pip install voidly-probe; installation alone does not register or measure. Docker starts probing immediately. Review the setup and consent guide before running either client.
Start with public incident totals
No key or signup. These totals describe incident records, not probe coverage or current accessibility. Check the response metadata before citing them. A failed or missing response is unavailable, not zero. The served target list is a separate planning input. Agent quickstart ↗
curl -fsS https://api.voidly.ai/data/incidents/statsRegister & Submit
/v1/community/registerRegister a new probe node (returns auth token)/v1/community/validate-tokenValidate a node token; also advances last-seen and the mixed counter, even without a measurement/v1/probe/statsOn hold — publication withheld to protect volunteersInstall the community client: Its first explicit --consent launch registers a node and begins measurements. Read the served target list and operational risks first.
pip install voidly-probeOperator privacy
Per-probe and operator listings, including the leaderboard and registry, are withheld to protect volunteer operators. Aggregate probe counts are also temporarily withheld. The example above reads public incident totals, not probe coverage.
Alerts & Webhooks
Subscribe to censorship incident notifications. Webhooks are signed with HMAC-SHA256 and retried with exponential backoff.
Subscribe
/api/alerts/subscribeCreate a webhook subscriptioncurl -X POST "https://api.voidly.ai/api/alerts/subscribe" \
-H "Content-Type: application/json" \
-H "X-API-Key: YOUR_KEY" \
-d '{"country_code":"IR","min_severity":"high","webhook_url":"https://your-server.com/webhook"}'Webhook Payload
{
"event": "incident.created",
"timestamp": "2026-02-10T12:00:00Z",
"incident": {
"id": "abc123",
"hashId": "IR-2026-0142",
"country": "IR",
"title": "DNS blocking of twitter.com",
"severity": "high",
"confidence": 0.95
}
}Signed with X-Voidly-Signature: sha256=... (HMAC-SHA256). Retry: 2, 4, 8, 16, 32 min.
Manage Subscriptions
/api/alerts/subscriptionsList your subscriptions/api/alerts/subscriptions/:idDelete a subscription/api/alerts/subscriptions/:idToggle on/off/api/alerts/webhook-testSend a test webhook# Toggle a subscription off
curl -X PATCH "https://api.voidly.ai/api/alerts/subscriptions/sub_123" \
-H "X-API-Key: YOUR_KEY" \
-d '{"enabled": false}'Errors
The API uses standard HTTP status codes. All errors return JSON with error and message fields.
| Code | Name | Resolution |
|---|---|---|
400 | Bad Request | Invalid request parameters. Check country codes (ISO 3166-1 alpha-2) and required fields. |
401 | Unauthorized | Invalid or missing API key. Include X-API-Key header. |
404 | Not Found | Country or resource not found. Check the country code exists in our dataset. |
429 | Rate Limited | Too many requests. Wait 60 seconds and retry with exponential backoff. |
500 | Server Error | Internal error. Retry with backoff. If persistent, contact support. |
503 | Service Unavailable | API temporarily unavailable. Check status page. |
Error Response Format
{
"error": "BAD_REQUEST",
"message": "country and target are required"
}Rate Limits
API requests are rate limited to ensure fair usage. Limits vary by endpoint and key type.
| Key Type | Rate Limit | Burst |
|---|---|---|
| Demo Key | 100 requests/minute | 20 requests |
| Research Key | 1,000 requests/minute | 100 requests |
| Public Data | No limit | — |
Rate Limit Headers
| Header | Description |
|---|---|
X-RateLimit-Limit | Maximum requests per window |
X-RateLimit-Remaining | Requests remaining in current window |
X-RateLimit-Reset | Unix timestamp when window resets |
Developer Tools
Integrations for AI assistants, research tools, and developer workflows. Query censorship data from Claude, Cursor, or ChatGPT.
Hosted endpoints and local packages expose different tool sets. Read the canonical server table for current hosted tools/list counts, transport details and access boundaries.
npx @voidly/mcp-serverThe npx @voidly/cli check command is on hold because accessibility checks return HTTP 503 (ACCESSIBILITY_REVIEW_HOLD). Other CLI commands include incident records, the censorship index and Sentinel forecasts. No API key is needed for public read endpoints.
# Install globally
npm install -g @voidly/cli
voidly forecast IR
voidly incidents --country RU --limit 10For Python AI agents. Async/sync messaging, encrypted channels, memory, tasks, discovery, trust scoring. Includes LangChain toolkit (9 tools) and CrewAI toolkit (7 tools).
pip install voidly-agents[all]A hosted, zero-value private session rail for agents. One entry point over plain HTTPS — no auth, no install step, no SDK. The config it returns carries the provider identity the rest of the session is negotiated from.
curl https://pay-staging.voidly.ai/v1/pay/private-session/configThe action is on hold because it calls POST /v1/accessibility/batch, and accessibility checks return HTTP 503 (ACCESSIBILITY_REVIEW_HOLD) during source review. A withheld response is not an accessibility verdict. Pure bash + curl, no Docker.
- name: Verify accessibility
uses: voidly-ai/voidly-check-action@v1
with:
domains: 'mycompany.com,api.mycompany.com'
countries: 'IR,RU,CN,UA'
fail-on-blocked: falseAI-optimized context file. Add to prompts for instant censorship data awareness.
View llms.txt →Changelog
Documentation update ·
- Probe examples now read public incident totals. Probe aggregates remain withheld; incident totals do not describe probe coverage.
- Accessibility endpoints and the CLI check command are marked on hold during source review.
- Hosted MCP tool counts come from an explicit public tools/list check in the server table. Local packages keep their own tool sets.
These are documentation changes, not a new API version or proof that a held capability has reopened.
Historical release notes
Archived entries describe earlier releases. They do not override the current holds above or establish present tool availability.
- NEW: Community Voidly Network — anyone can run a censorship probe (pip install voidly-probe)
- NEW: Published voidly-probe v1.0.1 to PyPI and Docker Hub
- Community registration is offered; per-probe and operator listings are withheld.
- Documented incident evidence and citation export endpoints
- Documented alert subscription and webhook management endpoints
- NEW: Platform Risk Scores — per-platform censorship risk and source limits
- NEW: ISP Risk Index — composite ISP censorship scoring (aggressiveness, breadth, methods)
- NEW: Service Accessibility API — domain accessibility checks by country (live checks are now paused while the source is reviewed)
- NEW: Election Risk Briefings — election-censorship correlation + forecast overlay
- MCP server v1.5.0 with 4 new tools: get_platform_risk, get_isp_risk_index, check_service_accessibility, get_election_risk
- NEW: Experimental 7-day current-regime risk score API (onset timing unproven; no accuracy claim)
- NEW: Webhook alerts for new censorship incidents
- NEW: RSS/Atom feeds for incident monitoring
- Added BibTeX/RIS citation export for academics
- Election and political event calendar integration (Wikipedia + GDELT)
- NEW: VPN Accessibility API - unique data showing which VPN endpoints are blocked in each country
- NEW: Block page fingerprinting - identifies blocking entity (Roskomnadzor, Iran TIC, etc.)
- Added 100+ domain categories from Citizen Lab test-lists
- MCP server now includes check_vpn_accessibility tool
- Added /incidents endpoint with confirmed censorship events
- Incident reports now include citable permalinks
- Added confidence scores to all detection responses
- Classifier evaluation is available from the public model transparency endpoint
- Added ISP-level breakdown in /detect responses
- New /predict endpoint: experimental risk score and trend (not a validated prediction)
- Initial public release
- Core endpoints: /detect, /threat-level, /scores
- Public data endpoints with source-specific license notes
Ready to get started?
No signup required. Use the demo key and start making requests.