Voidly

Build on the evidence.

Censorship measurements, incidents and source records. Read public data over HTTPS, or use authenticated endpoints for deeper analysis.

Public data is free to read. Examples are illustrative; unknown results are not evidence of accessibility.

A public read · request / response

  1. Ask for the record.GET /data/incidents/statsNo key or signup for this public read.
  2. Read the response.{ total, citable_censorship, total_evidence }Return values come from the API, not this illustration.
  3. Follow the evidence.Use incident IDs to inspect source records and citations.
Example flow, not a live request. Availability and returned evidence depend on the endpoint.
Contents
  1. Overview
  2. Quickstart
  3. Authentication
  4. Endpoints
  5. POST /detect
  6. POST /predict
  7. GET /forecast ✨
  8. GET /threat-level
  9. GET /scores
  10. GET /model/info
  11. Public Data
  12. Censorship Index
  13. Country Data
  14. VPN Accessibility ✨
  15. Methodology
  16. Early-warning record
  17. Risk Intelligence ✨
  18. Platform Risk
  19. ISP Index
  20. Accessibility
  21. Election Risk
  22. Incidents
  23. List Incidents
  24. Incident Detail
  25. Evidence
  26. Reports & Citation
  27. Semantic Search ✨
  28. Community Probes
  29. Register Node
  30. Leaderboard
  31. Alerts & Webhooks
  32. Subscribe
  33. Manage
  34. Errors
  35. Rate Limits
  36. Developer Tools
  37. Changelog
v1.6.0Check source licenses

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.

Exploring Voidpay?Read the current integration boundaries before planning a payment flow.voidpay for builders →
Country index
Incident evidence
Classifier evaluation
—
Incidents (reference feed)
Data fromVoidly ProbesML evaluation·

Quickstart

Start with the record itself — one free GET, no key, no signup:

bash
curl 'https://api.voidly.ai/data/incidents/stats'

Response — illustrative values; run the request for the current record

json
{
  "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):

bash
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

json
{
  "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.

Demo API KeyNo Signup
Reference value
hydra_demo_key

Use this key for testing. Rate limited to 100 requests/minute.

Request Headers

HeaderValueRequired
X-API-KeyYour API keyFor /hydra/* endpoints
Content-Typeapplication/jsonFor POST requests

Integrations

Developer Tools
MCP server for Claude, Cursor, Windsurf. OpenAI Action for ChatGPT.
Feeds
RSS/Atom feeds, delta sync, bulk export (CSV, JSONL).
Citations
BibTeX and RIS export for academic papers. Citable incident IDs.
Webhooks
Incident alerts with HMAC-SHA256 signed payloads.

Endpoints

POST/hydra/v1/detect

Is 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

FieldTypeDescription
countrystringISO 3166-1 alpha-2 code (e.g., "CN", "IR")
targetstringDomain to check (e.g., "google.com")

Response Schema

FieldTypeDescription
statusstring"blocked" | "accessible" | "unknown" (unknown = no per-domain measurements)
blockedbooleanTrue only when status is "blocked". For unknown, check status — false here is not "confirmed accessible".
confidencenumberHeuristic 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
basisstring"measured" | "known_list" | "unmeasured" — what the verdict rests on
evidenceCountnumberNumber of underlying per-domain measurements
blockingMethodstring | nulle.g. "tcp-reset", "dns-blocking", "blockpage"
sourcesstring[]"ooni", "censoredplanet", "known_list"
lastCheckedstringISO 8601 timestamp
POST/hydra/v1/detect/batch

Verify 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

json
{
  "country": "IR",
  "targets": ["twitter.com", "whatsapp.com", "github.com"]
}

Response

json
{
  "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": [] }
  ]
}

POST/hydra/v1/predict

Experimental 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

FieldTypeDescription
countrystringISO 3166-1 alpha-2 code
targetstring?Optional domain to score
horizonnumberEchoed in the response, not modeled (default: 7)
bash
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}'

GET/v1/forecast/:country/7dayNEW

Experimental 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

FieldTypeDescription
forecastarray8 daily scores (day 0-7)
forecast[].risknumberRisk score 0-1 (0.5+ is elevated)
forecast[].driversstring[]Risk factors (election, protest, etc.)
summary.max_risknumberPeak risk in the 7-day window
confidencenumberModel confidence (0-1)
bash
# 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

json
{
  "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"
}

GET/hydra/v1/threat-level/:country

Country 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.

bash
curl -H "X-API-Key: hydra_demo_key" \
  "https://api.voidly.ai/hydra/v1/threat-level/IR?includeHistory=true"

GET/hydra/v1/scores

Get censorship scores for all tracked countries, sorted by severity.

Query Parameters

ParamTypeDescription
minConfidencenumberMinimum confidence threshold (0-1, default: 0.5)
limitnumberMax results (default: 50)
GET/hydra/v1/model/info

Hydra service metadata: endpoint descriptions, methodology, data sources, authentication and rate limits. It returns no accuracy figure; classifier evaluation is at GET /v1/classifier/info.

bash
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.

GET/data/censorship-index.jsonNo Auth

Full censorship index dataset with Schema.org structured data. Updated continuously.

GET/data/country/:codeNo Auth

Detailed censorship data for a single country.

bash
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 ↗

GET/v1/measurement/summaryNo Auth

Censorship 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.

bash
curl "https://api.voidly.ai/v1/measurement/summary"

GET/v1/measurement/intent-profileNo Auth

What 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.

bash
curl "https://api.voidly.ai/v1/measurement/intent-profile?country=RU"

GET/v1/measurement/category-leadersNo Auth

Which countries most censor a given Citizen Lab content category (NEWS, ANON, HUMR, LGBT, GMB, POLR…), ranked by distinct domains nationally blocked, with example domains.

bash
curl "https://api.voidly.ai/v1/measurement/category-leaders?category=LGBT"

GET/v1/measurement/co-blockingNo Auth

Country 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.

bash
curl "https://api.voidly.ai/v1/measurement/co-blocking"

GET/v1/measurement/most-blocked-domainsNo Auth

Global 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.

bash
curl "https://api.voidly.ai/v1/measurement/most-blocked-domains?category=ANON"

GET/v1/vpn-accessibilityNo AuthUnique Data

Check 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

ParamTypeDescription
countrystringFilter by probe node country (where test runs FROM)
providerstringVPN provider: voidly, nordvpn, protonvpn, mullvad
bash
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.

GET/data/methodologyNo Auth

Machine-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.

GET

/v1/early-warning/protocol

No query parameters. Returns the published study rules in protocol and a link to the ledger in commitments_url.

bash
curl -fsS "https://api.voidly.ai/v1/early-warning/protocol"

GET

/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.

bash
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 optional since date in YYYY-MM-DD format.

Hosted MCP reference · Read the pre-registration record

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 ↗

GET/v1/platforms/scoresAll platforms ranked by global risk (under review: verdicts unknown; no data date reported)
GET/v1/platform/:platform/riskGlobal risk profile for a platform (under review: verdicts unknown; no data date reported)
GET/v1/platform/:platform/risk/:countryPlatform risk in specific country (under review: verdicts unknown; no data date reported)
GET/v1/platforms/country/:countryAll platforms ranked for a country (under review: verdicts unknown; no data date reported)
bash
curl https://api.voidly.ai/v1/platforms/scores

Platforms 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 ↗

GET/v1/isp/index?country=:CCISPs ranked by censorship score (under review: verdicts unknown; no data date reported)
GET/v1/isp/:asn/profileDetailed ISP profile (under review: verdicts unknown; no data date reported)
GET/v1/isp/worst?limit=20Global worst ISPs (under review: verdicts unknown; no data date reported)
GET/v1/isp/compare?asns=:asn1,:asn2Side-by-side ISP comparison (under review: verdicts unknown; no data date reported)
bash
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.

GET/v1/accessibility/check?domain=:d&country=:CCOn hold — domain check
POST/v1/accessibility/batchOn hold — batch check
GET/v1/accessibility/service/:nameOn hold — service check
GET/v1/accessibility/country/:CC/summaryOn hold — country summary
json
{
  "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.

GET/v1/elections/upcoming?days=90Upcoming elections with risk overlay
GET/v1/elections/:country/briefingFull election risk briefing
GET/v1/elections/calendarAll elections calendar
bash
curl "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

GET/data/incidentsList incidents (paginated)
GET/data/incidents/statsIncident counts and source breakdown
GET/data/incidents/export?format=csvBulk export (csv, jsonl, json)
GET/data/incidents/delta?since=:timestampDelta feed for incremental sync
GET/data/incidents/feed.rssRSS feed (also .atom)
bash
# 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.

GET/data/incidents/:id
bash
curl "https://api.voidly.ai/data/incidents/IR-2026-0142"

Evidence Permalinks

Get verifiable evidence sources (OONI, IODA, CensoredPlanet measurements) for an incident.

GET/data/incidents/:id/evidence
bash
curl "https://api.voidly.ai/data/incidents/IR-2026-0142/evidence"

Reports & Citation Export

Generate citable reports in multiple formats for academics and journalists.

GET/data/incidents/:id/report?format=markdownCitable markdown report
GET/data/incidents/:id/report?format=bibtexBibTeX citation
GET/data/incidents/:id/report?format=risRIS citation (Zotero, Mendeley)
bash
# 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.

GET/v1/incidents/similar?query=:text&k=:nQuery by natural language
POST/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.

bash
# 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 ↗

bash
curl -fsS https://api.voidly.ai/data/incidents/stats

Register & Submit

POST/v1/community/registerRegister a new probe node (returns auth token)
POST/v1/community/validate-tokenValidate a node token; also advances last-seen and the mixed counter, even without a measurement
GET/v1/probe/statsOn hold — publication withheld to protect volunteers

Install the community client: Its first explicit --consent launch registers a node and begins measurements. Read the served target list and operational risks first.

bash
pip install voidly-probe

Operator 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

POST/api/alerts/subscribeCreate a webhook subscription
bash
curl -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

json
{
  "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

GET/api/alerts/subscriptionsList your subscriptions
DELETE/api/alerts/subscriptions/:idDelete a subscription
PATCH/api/alerts/subscriptions/:idToggle on/off
POST/api/alerts/webhook-testSend a test webhook
bash
# 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.

CodeNameResolution
400Bad RequestInvalid request parameters. Check country codes (ISO 3166-1 alpha-2) and required fields.
401UnauthorizedInvalid or missing API key. Include X-API-Key header.
404Not FoundCountry or resource not found. Check the country code exists in our dataset.
429Rate LimitedToo many requests. Wait 60 seconds and retry with exponential backoff.
500Server ErrorInternal error. Retry with backoff. If persistent, contact support.
503Service UnavailableAPI temporarily unavailable. Check status page.

Error Response Format

json
{
  "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 TypeRate LimitBurst
Demo Key100 requests/minute20 requests
Research Key1,000 requests/minute100 requests
Public DataNo limit—

Rate Limit Headers

HeaderDescription
X-RateLimit-LimitMaximum requests per window
X-RateLimit-RemainingRequests remaining in current window
X-RateLimit-ResetUnix timestamp when window resets

Developer Tools

Integrations for AI assistants, research tools, and developer workflows. Query censorship data from Claude, Cursor, or ChatGPT.

RecommendedMCP servers and setup

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.

bash
npx @voidly/mcp-server

Domain checks on holdVoidly CLI — terminal access

The 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.

bash
# Install globally
npm install -g @voidly/cli
voidly forecast IR
voidly incidents --country RU --limit 10

NewPython SDK — LangChain & CrewAI

For Python AI agents. Async/sync messaging, encrypted channels, memory, tasks, discovery, trust scoring. Includes LangChain toolkit (9 tools) and CrewAI toolkit (7 tools).

bash
pip install voidly-agents[all]

OpenAI Action

For ChatGPT custom GPTs. Import OpenAPI spec into GPT Builder.

Download openapi.json →
voidpay — private sessions

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.

bash
curl https://pay-staging.voidly.ai/v1/pay/private-session/config

Domain checks on holdGitHub Action — voidly-check-action

The 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.

yaml
- 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: false

llms.txt

AI-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.

v1.6.02026-02-19
  • 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
v1.5.02026-02-18
  • 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
v1.4.02026-02-10
  • 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)
v1.3.02026-02-08
  • 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
v1.2.02026-02-04
  • Added /incidents endpoint with confirmed censorship events
  • Incident reports now include citable permalinks
  • Added confidence scores to all detection responses
v1.1.02026-01-15
  • 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)
v1.0.02025-12-01
  • 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.