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