Every API here is available over the APIs.io API and to AI agents over MCP.
MCP server
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
Tools for apis
7 MCP tools reach this
find_apisBrowse and filter every API in the catalog.
get_api_artifactsOne API's artifacts, grouped by type.
get_openapiThe primary OpenAPI for this API.
find_similar_apisAPIs that look like this one.
apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
resolveTurn a domain, URL or GitHub org into the provider it belongs to.
find_cohortsEvery scored population of providers in the catalog.
All 92 tools →
Call it yourself
curl for this page
This API
curl "https://apis.io/api/v1/apis/droneincidents-com:droneledger-api-v1-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"
Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.
Get an API key
Free tier, no form to fill in. Signing in shares your email address with us — we
store it to create your key and to recognise you if you sign in with another
provider. See our Privacy Policy and
Terms.
A second provider on the same verified email joins the account you already have.
{
"openapi": "3.1.0",
"info": {
"title": "DroneLedger API",
"version": "1",
"description": "Source-backed drone incident dossiers. Each dossier separates three claims: drone presence, impact and attribution, each with its own evidence state and supporting sources. 'reported' means a source describes the claim without sufficient identification evidence; claims by parties to a conflict are never 'confirmed' on their own. Counts reflect dossiers in this curated archive, not all incidents worldwide. windowStart/windowEnd are reporting-window calendar bounds, not individual event days; legacy date remains the compatibility/sorting date for such records."
},
"servers": [
{
"url": "https://droneincidents.com"
}
],
"paths": {
"/api/v1/incidents.json": {
"get": {
"summary": "All published dossiers",
"description": "Each dossier separates three claims: drone presence, impact and attribution, each with its own evidence state and supporting sources. 'reported' means a source describes the claim without sufficient identification evidence; claims by parties to a conflict are never 'confirmed' on their own. Counts reflect dossiers in this curated archive, not all incidents worldwide. windowStart/windowEnd are reporting-window calendar bounds, not individual event days; legacy date remains the compatibility/sorting date for such records.",
"responses": {
"200": {
"description": "JSON"
}
}
}
},
"/api/v1/incidents.geojson": {
"get": {
"summary": "Coarse current dossier points",
"description": "Coordinates are public dossier coordinates rounded to a 0.1-degree grid, not exact incident sites or trajectories. Grid rounding is not a confidence radius. Null geometry means no valid dossier coordinates; display reference points are never substituted for incident locations. Calendar dates/windows retain their original meaning. This is the DroneLedger archive, not a worldwide incident census. Unknown status is not a negative finding.",
"responses": {
"200": {
"description": "JSON"
}
}
}
},
"/api/v1/incidents/{id}.json": {
"get": {
"summary": "One dossier by id",
"description": "Includes sources, timeline, history and citation.",
"responses": {
"200": {
"description": "JSON"
}
}
}
},
"/api/v1/drone-types.json": {
"get": {
"summary": "Drone type catalogue",
"description": "Manufacturer, origin, operators, published unit-cost estimates with sources.",
"responses": {
"200": {
"description": "JSON"
}
}
}
},
"/api/v1/drone-profiles.json": {
"get": {
"summary": "Source-bound research profiles",
"description": "All five languages, observation bounds, sources and disjoint model/family archive counts. Rebuilt per release.",
"responses": {
"200": {
"description": "JSON",
"content": {
"application/json": {
"schema": {
"$ref": "/api/v1/schemas/drone-profiles.schema.json"
}
}
}
}
},
"externalDocs": {
"description": "Release changelog and compatibility",
"url": "https://droneincidents.com/data/drone-profiles-changelog.json"
}
}
},
"/api/v1/drone-profiles/{id}.json": {
"get": {
"summary": "One source-bound research profile",
"parameters": [
{
"name": "id",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "Profile, research edition, source observations and archive links.",
"content": {
"application/json": {
"schema": {
"$ref": "/api/v1/schemas/drone-profile.schema.json"
}
}
}
},
"404": {
"description": "Unknown profile"
}
},
"externalDocs": {
"description": "Release changelog and compatibility",
"url": "https://droneincidents.com/data/drone-profiles-changelog.json"
}
}
},
"/data/drone-observations.csv": {
"get": {
"summary": "Source-bound observations CSV",
"description": "One row per observation; empty bounds are unknown, not zero. Source IDs and URLs are JSON arrays. Text cells with spreadsheet formula prefixes are apostrophe-prefixed.",
"responses": {
"200": {
"description": "UTF-8 CSV, one row per source observation",
"content": {
"text/csv": {
"schema": {
"type": "string"
}
}
}
}
}
}
},
"/api/v1/trends.json": {
"get": {
"summary": "Counts per period",
"description": "Dossiers by compatibility/sorting date compared with the previous period of the same length; reporting windows count once, never once per covered day.",
"responses": {
"200": {
"description": "JSON"
}
}
}
},
"/mcp": {
"post": {
"summary": "Model Context Protocol endpoint (Streamable HTTP, JSON-RPC 2.0)",
"description": "Read-only tools: search_incidents, get_incident, get_trends, list_drone_types, get_drone_type, get_methodology.",
"responses": {
"200": {
"description": "JSON-RPC response"
}
}
}
}
}
}