# IETF Draft Analyzer — API Documentation All API endpoints return JSON by default. Several support `?format=csv` for CSV export. Base URL: `http://localhost:5000` --- ## Public Endpoints ### GET /api/stats Overview statistics for the entire corpus. **Parameters:** None **Response:** ```json { "total_drafts": 361, "rated_drafts": 260, "total_authors": 403, "total_ideas": 1262, "total_gaps": 12, "avg_score": 3.42 } ``` --- ### GET /api/drafts Paginated, filterable list of drafts. **Parameters:** | Param | Type | Default | Description | |-------|------|---------|-------------| | `page` | int | 1 | Page number | | `q` | string | "" | Full-text search query | | `cat` | string | "" | Filter by category | | `source` | string | "" | Filter by source (ietf, w3c) | | `min_score` | float | 0.0 | Minimum composite score | | `sort` | string | "score" | Sort field | | `dir` | string | "desc" | Sort direction (asc/desc) | | `format` | string | "json" | Response format: "json" or "csv" | **Response:** JSON object with `drafts` array and pagination metadata. --- ### GET /api/drafts/{name} Detail for a single draft including rating, authors, ideas, and references. **Parameters:** | Param | Type | Description | |-------|------|-------------| | `name` | string | Draft name, e.g. `draft-ietf-ai-agent-protocol` | **Response:** JSON object with full draft detail, or `{"error": "Draft not found"}` (404). --- ### GET /api/categories Category names and draft counts. **Parameters:** | Param | Type | Default | Description | |-------|------|---------|-------------| | `format` | string | "json" | "json" or "csv" | **Response:** ```json { "A2A protocols": 45, "AI safety/alignment": 38, ... } ``` --- ### GET /api/ratings Rating distributions across the corpus. **Parameters:** | Param | Type | Default | Description | |-------|------|---------|-------------| | `format` | string | "json" | "json" or "csv" | **Response:** JSON object with arrays: `names`, `scores`, `novelty`, `maturity`, `overlap`, `momentum`, `relevance`, `categories`. --- ### GET /api/timeline Timeline data showing draft publication over time. **Parameters:** None **Response:** JSON object with timeline series data. --- ### GET /api/landscape t-SNE 2D embedding landscape of all drafts. **Parameters:** | Param | Type | Default | Description | |-------|------|---------|-------------| | `format` | string | "json" | "json" or "csv" | **Response:** JSON array of `{name, x, y, category, score}` points. --- ### GET /api/similarity Draft similarity network graph. **Parameters:** None **Response:** JSON object with `nodes` and `edges` arrays for a force-directed graph. --- ### GET /api/idea-clusters Clustered ideas across drafts. **Parameters:** None **Response:** JSON object with cluster data. --- ### GET /api/ideas All extracted technical ideas, grouped by type. **Parameters:** | Param | Type | Default | Description | |-------|------|---------|-------------| | `format` | string | "json" | "json" or "csv" | **Response:** JSON object with `ideas` array. --- ### GET /api/authors/network Author collaboration network graph. **Parameters:** None **Response:** JSON object with `nodes` and `edges` arrays. --- ### GET /api/citations Citation/reference graph between drafts. **Parameters:** | Param | Type | Default | Description | |-------|------|---------|-------------| | `min_refs` | int | 2 | Minimum references to include a node | **Response:** JSON object with citation graph data. --- ### GET /api/search Global search across drafts, ideas, authors, and gaps. **Parameters:** | Param | Type | Default | Description | |-------|------|---------|-------------| | `q` | string | "" | Search query (required for results) | | `format` | string | "json" | "json" or "csv" | **Response:** ```json { "drafts": [...], "ideas": [...], "authors": [...], "gaps": [...] } ``` --- ### POST /api/ask Search-only question answering (free, no Claude API call). Returns relevant sources and any cached answer. **Request body:** ```json { "question": "What drafts address agent authentication?", "top_k": 5 } ``` **Response:** JSON with `sources` array and optional cached `answer`. --- ## Admin-Only Endpoints These endpoints require admin mode (`--dev` flag) or authentication. ### POST /api/ask/synthesize Synthesize an answer using Claude (costs tokens, rate-limited to 10 req/min/IP). Answers are cached permanently. **Auth:** Admin required **Request body:** ```json { "question": "How do IETF drafts approach agent identity?", "top_k": 5 } ``` **Response:** JSON with `sources` array and synthesized `answer`. **Errors:** 429 if rate-limited. --- ### GET /api/gaps All identified standardization gaps. **Auth:** Admin required **Parameters:** | Param | Type | Default | Description | |-------|------|---------|-------------| | `format` | string | "json" | "json" or "csv" | **Response:** JSON array of gap objects. --- ### GET /api/gaps/{gap_id} Detail for a single gap. **Auth:** Admin required **Parameters:** | Param | Type | Description | |-------|------|-------------| | `gap_id` | int | Gap ID | **Response:** JSON object with gap detail, or `{"error": "Gap not found"}` (404). --- ### POST /api/compare Compare multiple drafts using Claude (costs tokens, rate-limited). **Auth:** Admin required **Request body:** ```json { "drafts": ["draft-name-one", "draft-name-two"] } ``` **Response:** ```json { "text": "Comparison analysis text...", "drafts": ["draft-name-one", "draft-name-two"] } ``` **Errors:** 400 if fewer than 2 drafts provided. --- ### POST /api/drafts/{name}/annotate Add or update annotations (notes, tags) for a draft. **Auth:** Admin required **Request body:** ```json { "note": "Interesting approach to agent handshake", "tags": ["important", "review"], "add_tag": "flagged", "remove_tag": "review" } ``` All fields are optional. `add_tag`/`remove_tag` operate on existing tags incrementally. **Response:** ```json { "success": true, "annotation": {"note": "...", "tags": ["important", "flagged"]} } ``` --- ### GET /api/monitor Pipeline monitoring status (processing progress, error counts). **Auth:** Admin required **Response:** JSON object with monitoring data. --- ## Non-API Data Endpoints ### GET /export/obsidian Download the entire research corpus as an Obsidian vault ZIP file. **Response:** `application/zip` file download. --- ## Authentication - **Production mode** (default): Admin endpoints return 403. - **Development mode** (`--dev` flag): All admin endpoints are accessible without authentication. - Rate-limited endpoints (`/api/ask/synthesize`, `/api/compare`): 10 requests per minute per IP, enforced via in-memory sliding window. ## Error Responses All errors return JSON: ```json {"error": "Description of the error"} ``` Common HTTP status codes: - `400` — Bad request (missing parameters) - `403` — Admin access required - `404` — Resource not found - `429` — Rate limit exceeded - `500` — Internal server error