{
 "openapi": "3.1.0",
 "info": {
  "title": "AiPod — grounded podcast context for agents",
  "version": "0.3.0",
  "description": "Deterministic, cited podcast context from a compiled entity graph. No auth, no model at query time. Check `covered` on /api/context: false means the corpus does not cover the question — abstain. Remote MCP at /mcp (Streamable HTTP). Per-show knowledge cutoffs are in every context response under coverage.podcasts."
 },
 "servers": [
  {
   "url": "https://aipod-two.vercel.app"
  }
 ],
 "paths": {
  "/api/context": {
   "get": {
    "summary": "THE call: routed, enriched, grounded context for any question",
    "parameters": [
     {
      "name": "q",
      "in": "query",
      "required": true,
      "schema": {
       "type": "string"
      }
     }
    ],
    "responses": {
     "200": {
      "description": "Routed context. `covered: false` = corpus gap, abstain."
     }
    }
   }
  },
  "/api/search": {
   "get": {
    "summary": "Keyword search over claims, topics, and facts",
    "parameters": [
     {
      "name": "q",
      "in": "query",
      "required": true,
      "schema": {
       "type": "string"
      }
     },
     {
      "name": "limit",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "maximum": 50
      }
     }
    ],
    "responses": {
     "200": {
      "description": "Claims/topics/facts with provenance; empty = not covered."
     }
    }
   }
  },
  "/api/entities": {
   "get": {
    "summary": "Entity index",
    "responses": {
     "200": {
      "description": "All entity pages (name + counts)."
     }
    }
   }
  },
  "/api/entity/{name}": {
   "get": {
    "summary": "Compiled cross-episode entity page",
    "parameters": [
     {
      "name": "name",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      }
     }
    ],
    "responses": {
     "200": {
      "description": "Every claim about the entity, chronological."
     },
     "404": {
      "description": "No such entity."
     }
    }
   }
  },
  "/api/episodes": {
   "get": {
    "summary": "Indexed episode list",
    "responses": {
     "200": {
      "description": "id, podcast, date, speakers, signal counts."
     }
    }
   }
  },
  "/api/episode/{id}": {
   "get": {
    "summary": "Full structured episode record (can be 50-150KB)",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      }
     }
    ],
    "responses": {
     "200": {
      "description": "Summary, topics, claims, predictions, facts, quotes."
     },
     "404": {
      "description": "No such episode."
     }
    }
   }
  },
  "/api/status": {
   "get": {
    "summary": "Corpus stats + per-show knowledge cutoffs",
    "responses": {
     "200": {
      "description": "Episodes, entities, claims, coverage windows."
     }
    }
   }
  },
  "/api/agent": {
   "post": {
    "summary": "LLM answer agent over the brain tools — grounded, cited, abstains on corpus gaps",
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "question": {
          "type": "string",
          "maxLength": 2000
         }
        },
        "required": [
         "question"
        ]
       }
      }
     }
    },
    "responses": {
     "200": {
      "description": "AgentResult",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "answer": {
           "type": "string",
           "description": "grounded, cited answer text"
          },
          "tool_calls": {
           "type": "array",
           "items": {
            "type": "object",
            "properties": {
             "tool": {
              "type": "string"
             },
             "input": {}
            }
           },
           "description": "the audit trail"
          },
          "sources": {
           "type": "array",
           "items": {
            "type": "string"
           },
           "description": "episode titles the tools surfaced"
          },
          "abstained": {
           "type": "boolean",
           "description": "true = the corpus does not cover the question"
          }
         }
        }
       }
      }
     },
     "400": {
      "description": "Missing/oversized question."
     },
     "429": {
      "description": "Model rate-limited — retry after the retry-after header."
     },
     "502": {
      "description": "Agent failed (model/gateway error)."
     }
    }
   }
  },
  "/api/waitlist": {
   "post": {
    "summary": "Register interest in Deep Answer (one full cited answer per question)",
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "email": {
          "type": "string",
          "format": "email"
         }
        },
        "required": [
         "email"
        ]
       }
      }
     }
    },
    "responses": {
     "200": {
      "description": "{ok: true}"
     },
     "400": {
      "description": "Invalid email."
     }
    }
   }
  }
 }
}