{"openapi":"3.1.0","info":{"title":"Originalis Public API","description":"Programmatic access to your firm's Originalis workspace — the deal pipeline, portfolio book, LP fund positions, and the network intelligence your team's own emails and calendars actually evidence.\n\nOne API key, one base URL, plain JSON. Every `GET` is a pure read; the only endpoints that change anything are the explicit `POST` **actions** (analysis, research) and webhook management — write-scoped, budgeted, and documented below.\n\n## What you can query\n\n| Capability | Endpoint | Typical use |\n| --- | --- | --- |\n| Who do we know at X | `GET /api/v1/network/who-knows` | Warm-intro sourcing: ranked paths to a company or person, each naming the teammate who owns the relationship |\n| Warmth lookup | `POST /api/v1/network/warmth/lookup` | CRM enrichment: send up to 100 emails / contact ids, get relationship warmth back |\n| Contact export | `GET /api/v1/network/contacts` | Sync your graph (with warmth) into a CRM or warehouse, one cursor-paginated sweep |\n| Reach candidates | `GET /api/v1/network/reach/candidates` | Precomputed proxy-first-degree candidates from background fan-out runs |\n| Relationship signals | `GET /api/v1/network/signals/going-stale` | Relationships drifting past their touch cadence |\n| Deal pipeline | `GET /api/v1/deals` | Sync your org's deal workspace (status, stage, score) into a CRM or warehouse |\n| Deal detail | `GET /api/v1/deals/{deal_id}` | Structured record for one deal: company facts, round, team, score |\n| **Analyze a deal** | `POST /api/v1/deals/analyze` | Submit a company/fund website — or a DocSend/Notion/Drive/Canva/Figma/Gamma/Dropbox document link; full analysis runs async into your workspace |\n| **Analyze an uploaded file** | `POST /api/v1/deals/analyze/upload` | Multipart upload a deck (PDF/PPT/DOC) and run the full analysis on it |\n| **Add data-room documents** | `POST /api/v1/deals/{deal_id}/documents` | Push diligence files into a deal's data room; they're classified + analyzed async |\n| Deal documents | `GET /api/v1/deals/{deal_id}/documents` | The deal's document inventory: primary uploads + data-room files with folders |\n| Analysis status | `GET /api/v1/deals/{deal_id}/analysis` | Poll a submitted analysis: queued → running → succeeded/failed |\n| **Analyze a founder** | `POST /api/v1/founders/analyze` | Run a founder assessment from a name / LinkedIn / GitHub; org-deduped |\n| Founder analysis | `GET /api/v1/founders/analyses/{analysis_id}` | Status + the finished assessment: scores, strengths, risks, research |\n| **Run research** | `POST /api/v1/research` | Submit a question; a deep-research run produces a cited Markdown report |\n| Research report | `GET /api/v1/research/{research_id}` | Status + the finished report with citations |\n| Portfolio book | `GET /api/v1/portfolio/companies` | Holdings with ledger economics + latest operating metrics, for warehouse sync |\n| Metric history | `GET /api/v1/portfolio/companies/{company_id}/metrics` | Dated history of one metric for one holding (ARR trajectory, burn trend) |\n| LP positions | `GET /api/v1/funds/positions` | Fund commitments with called/distributed/NAV, TVPI/DPI, and data-quality flags |\n| LP cashflows | `GET /api/v1/funds/cashflows` | The dated call/distribution ledger, for reconciliation |\n| LP mark history | `GET /api/v1/funds/marks` | Each commitment's dated NAV/TVPI trace — the momentum view |\n| **Webhooks** | `POST /api/v1/webhooks` | Register a signed-event endpoint; list, delete, and inspect deliveries |\n\n## Getting started\n\nThree steps to a first call:\n\n**1 — Mint a key.** In the Originalis app, go to [Integrations → API Keys](https://dev.originalis.ai/app/integrations/api-keys) and create a key. The secret (`ak_...`) is shown once — store it in your secret manager. Keys can be given an expiry and revoked at any time.\n\n**2 — Call the API.**\n\n```bash\ncurl -H \"Authorization: Bearer ak_...\" \\\n  \"https://dev-originalis-api.originalis.ai/api/v1/network/who-knows?domain=acme.com\"\n```\n\n**3 — Read the response.** Responses are plain JSON; list and detail\nreads state their `scope` (whose data you're seeing) and carry `as_of`:\n\n```json\n{\n  \"target\": { \"domain\": \"acme.com\", \"person\": null },\n  \"scope\": \"org_shared\",\n  \"paths\": [\n    {\n      \"contact_id\": \"9f2c1b7a-4e11-4c2e-9b3a-1d5f6a7b8c9d\",\n      \"name\": \"Jane Doe\",\n      \"title\": \"CTO\",\n      \"email\": \"jane@acme.com\",\n      \"warmth\": 0.72,\n      \"strength_score\": 81.0,\n      \"relationship\": \"strong\",\n      \"path_owner\": \"Mark Smith\"\n    }\n  ],\n  \"unavailable_reason\": null,\n  \"as_of\": \"2026-09-02T14:00:00Z\"\n}\n```\n\n## Authentication\n\nEvery request needs an Originalis API key, sent either way:\n\n```bash\ncurl -H \"Authorization: Bearer ak_...\" \"https://dev-originalis-api.originalis.ai/api/v1/deals\"\ncurl -H \"X-API-Key: ak_...\"            \"https://dev-originalis-api.originalis.ai/api/v1/deals\"\n```\n\nKeys are bound to a user in your org; identity and org scope are resolved\n**server-side** from the key — the API never accepts a client-supplied\nuser or organization.\n\n## Scope: whose data comes back\n\nEach response declares its scope explicitly:\n\n| `scope` | Meaning | Endpoints |\n| --- | --- | --- |\n| `org` / `org_shared` / `org_workspace` | Your whole firm's data (network scopes pool only across members who opted into sharing) | who-knows, warmth lookup, deals, portfolio, funds |\n| `key_user` | The graph of the specific user the key is bound to | contacts, reach candidates, going-stale signals |\n\n## Shaping responses\n\nDetail reads accept a `view` query parameter, so pollers and dashboards\naren't forced to carry full analysis bodies:\n\n- `GET /deals/{deal_id}?view=full` — adds `analysis`: every visible\n  section of the deal record with its score and summary (default view\n  stays the structured facts).\n- `GET /founders/analyses/{analysis_id}?view=full` — each metric adds\n  `confidence`, `reasoning`, and `missing_info` alongside its score.\n- `GET /research/{research_id}?view=summary` — lifecycle + executive\n  summary only; the default (`full`) carries the entire Markdown report\n  and citations.\n\nViews only add or withhold optional fields — the schema of each response\nis identical across views, so typed clients need no variants.\n\n## Pagination\n\nThree styles, stated per endpoint:\n\n- **Offset** (`/deals`, `/portfolio/companies`): responses carry `total`,\n  `limit`, `offset`, `has_more`. Sweep with `offset += limit` until\n  `has_more` is `false`.\n- **Cursor** (`/network/contacts`): pass each response's `next_cursor`\n  back as `?cursor=` until it is `null`. Stable under concurrent writes.\n- **Whole-book** (`/funds/positions`, `/funds/cashflows`,\n  `/funds/marks`): LP books are small; one call returns everything.\n\n## Errors\n\nErrors are JSON with a human-readable `detail`:\n\n```json\n{ \"detail\": \"Invalid or revoked API key.\" }\n```\n\n(Validation `422`s carry the standard structured `detail` list naming\nthe offending parameter.)\n\nResponses carry an `X-Request-Id` header (the rare unhandled 500 is\nthe one exception). Quote it when you contact support and we can trace\nthe exact request in our logs.\n\n| Code | Meaning |\n| --- | --- |\n| `401` | Missing, invalid, revoked, or expired key |\n| `403` | Key's user belongs to no organization |\n| `404` | Resource doesn't exist or isn't visible to the key's user |\n| `409` | Conflict: a duplicate analysis already in flight, a webhook URL already registered, or an idempotency key from another workspace |\n| `422` | Invalid parameters (the body names the parameter) |\n| `429` | Daily per-key limit reached — honor `Retry-After` (seconds until UTC midnight) |\n| `503` | A dependency is temporarily unavailable — retry with backoff. A failed read is **never** disguised as an empty result |\n\n## Rate limits\n\nEach key has a daily request budget (default 5,000/day, resets at UTC\nmidnight). Successful responses report where you stand:\n\n| Header | Meaning |\n| --- | --- |\n| `X-RateLimit-Limit` | The key's daily budget |\n| `X-RateLimit-Remaining` | Requests left today |\n| `X-RateLimit-Reset` | Seconds until the budget resets (UTC midnight) |\n\n`429` responses carry `Retry-After` (seconds). The headers are omitted\non the rare request where the counter is unreachable — they are never\nguessed. Contact us if your integration needs a higher cap.\n\n## Principles\n\n- **Your data, your scope.** Every response is scoped to your org. Warm\n  paths pool only across teammates who opted into network sharing, and\n  every path names its owner.\n- **Absence is honest.** Missing data comes back as `null` plus a typed\n  `unavailable_reason` — never a defaulted or invented figure. Derived\n  economics (TVPI, multiples) are null when their inputs are missing.\n- **Reads are pure; actions are explicit.** GET endpoints never mutate\n  anything or trigger background work. The only endpoints that spend —\n  `POST` actions like `/deals/analyze` — require a write-scoped key,\n  draw down a separate daily budget, and always return `202` with a\n  poll URL.\n- **Stable contract.** The `/api/v1` surface only changes additively:\n  fields are added, never renamed, retyped, or removed.\n\n## Actions (asynchronous)\n\nActions run Originalis analysis pipelines on demand. They differ from\nreads in four deliberate ways:\n\n- **Write-scoped key required.** Mint a key with write access; read-only\n  keys get `403`. Actions are the only endpoints that can spend.\n- **Separate budget.** Each key gets an actions budget (default 25/day,\n  resets at UTC midnight) on top of the request limit — actions run\n  real analysis pipelines with real cost. The budget is charged only\n  when a run is actually dispatched: rejected, deduplicated, and\n  conflicting requests cost nothing. Over-budget returns `429` with\n  `Retry-After` plus `X-Actions-Limit` / `X-Actions-Remaining`.\n- **Always asynchronous.** Every action returns `202` immediately with\n  a `status_url`; analysis takes minutes. Poll with backoff:\n\n```bash\nDEAL=$(curl -s -X POST -H \"X-API-Key: $KEY\" -H \"Content-Type: application/json\" \\\n  -d '{\"website_url\": \"https://acmerobotics.com\"}' \\\n  \"https://dev-originalis-api.originalis.ai/api/v1/deals/analyze\")\nSTATUS_URL=\"https://dev-originalis-api.originalis.ai$(echo \"$DEAL\" | jq -r '.status_url')\"\nwhile :; do\n  S=$(curl -s -H \"X-API-Key: $KEY\" \"$STATUS_URL\" | jq -r '.status')\n  [ \"$S\" = \"succeeded\" ] || [ \"$S\" = \"failed\" ] || { sleep 30; continue; }\n  break\ndone\ncurl -s -H \"X-API-Key: $KEY\" \"https://dev-originalis-api.originalis.ai$(echo \"$DEAL\" | jq -r '.result_url')\"\n```\n\n- **One status vocabulary.** Every action reports\n  `queued → running → succeeded | failed`, and a `succeeded` action's\n  `result_url` points back into the read API — results are ordinary\n  resources, never a second schema.\n- **Live progress while polling.** A running action's status read\n  carries a `progress` object — pipeline stages for deal analysis, the\n  current stage for founder analysis, stage + percent for research — so\n  a poller can show real movement, not a spinner.\n- **Or stream it (SSE).** Append `/events` to an analysis resource for a\n  Server-Sent Events stream of the same payloads:\n  `GET /api/v1/deals/{deal_id}/analysis/events`,\n  `GET /api/v1/founders/analyses/{analysis_id}/events`,\n  `GET /api/v1/research/{research_id}/events`. Named events: `progress`\n  (emitted on change), `done` (terminal, carries `result_url`, then the\n  server closes), `error` (stream-level problem — reconnect or fall\n  back to polling); keep-alive comments every 25s. Authenticate with\n  the same key header (`curl -N -H \"X-API-Key: $KEY\" ...`). Streams are\n  not resumable — on reconnect the first `progress` event re-hydrates\n  you. For backends that can't hold a connection, use webhooks (below);\n  polling always works.\n\nDuplicate protection: a concurrent submission for the same target (the\nsame company domain in your org) returns `409` rather than silently\nstarting a second run.\n\n## Webhooks\n\nThe push door: register an HTTPS endpoint and Originalis POSTs a signed\nevent when an action reaches a terminal state — no polling, no open\nconnection.\n\n| Event | Fires when |\n| --- | --- |\n| `deal.analysis.completed` / `.failed` | A deal analysis finishes (or terminally fails) |\n| `founder.analysis.completed` / `.failed` | A founder assessment finishes |\n| `research.completed` / `.failed` | A research run finishes |\n\nPayloads are deliberately **thin** — fetch the resource for truth:\n\n```json\n{\n  \"event\": \"deal.analysis.completed\",\n  \"id\": \"9c0d1e2f-3a4b-4c5d-8e6f-7a8b9c0d1e2f\",\n  \"created_at\": \"2026-09-07T15:04:05Z\",\n  \"data\": {\n    \"entity_id\": \"8a9b0c1d-2e3f-4a5b-9c6d-7e8f9a0b1c2d\",\n    \"result_url\": \"/api/v1/deals/8a9b0c1d-2e3f-4a5b-9c6d-7e8f9a0b1c2d\"\n  }\n}\n```\n\n**Verification** follows the [Standard Webhooks](https://www.standardwebhooks.com)\nscheme, so off-the-shelf verifier libraries work. Each delivery carries\n`webhook-id`, `webhook-timestamp`, and `webhook-signature`\n(`v1,base64(HMAC-SHA256(secret, \"{id}.{timestamp}.{body}\"))`):\n\n```python\nimport base64, hashlib, hmac\n\ndef verify(secret: str, headers: dict, body: bytes) -> bool:\n    key = base64.b64decode(secret.removeprefix(\"whsec_\"))\n    message = (\n        f\"{headers['webhook-id']}.{headers['webhook-timestamp']}.\"\n        + body.decode()\n    )\n    expected = \"v1,\" + base64.b64encode(\n        hmac.new(key, message.encode(), hashlib.sha256).digest()\n    ).decode()\n    return hmac.compare_digest(expected, headers[\"webhook-signature\"])\n```\n\n**Delivery semantics**: at-least-once. Failed deliveries retry with\nexponential backoff — up to 11 attempts over roughly 30 minutes. A 4xx\nfrom your receiver stops retries immediately (except 408 and 429, which\nretry like a 5xx). Deduplicate on\n`webhook-id` — it is stable across retries. Answer with a 2xx within\n10 seconds; do slow work after acknowledging. Endpoints must be HTTPS\non a public address; the secret is shown once at registration. Inspect\nrecent deliveries at `GET /api/v1/webhooks/{webhook_id}/deliveries`.\n\nKnown gap (documented, not silent): a run failed by the background\nstale-timeout sweep may not produce a webhook — the poll endpoints\nremain the source of truth.\n\n## Recipes\n\n**Sync the pipeline into a warehouse** — page until `has_more` is false:\n\n```bash\nOFFSET=0\nwhile :; do\n  PAGE=$(curl -s -H \"X-API-Key: $KEY\" \\\n    \"https://dev-originalis-api.originalis.ai/api/v1/deals?limit=50&offset=$OFFSET\")\n  echo \"$PAGE\" | jq -c '.deals[]' >> deals.ndjson\n  [ \"$(echo \"$PAGE\" | jq '.has_more')\" = \"true\" ] || break\n  OFFSET=$((OFFSET + 50))\ndone\n```\n\n**Enrich a CRM with warmth** — batch up to 100 identifiers per call:\n\n```bash\ncurl -s -X POST -H \"X-API-Key: $KEY\" -H \"Content-Type: application/json\" \\\n  -d '{\"contacts\": [\"jane@acme.com\", \"sam@beta.io\"]}' \\\n  \"https://dev-originalis-api.originalis.ai/api/v1/network/warmth/lookup\" | jq '.results'\n```\n\n**Quarterly LP reconciliation** — positions plus the raw cashflow ledger:\n\n```bash\ncurl -s -H \"X-API-Key: $KEY\" \"https://dev-originalis-api.originalis.ai/api/v1/funds/positions\" \\\n  | jq '.totals'\ncurl -s -H \"X-API-Key: $KEY\" \"https://dev-originalis-api.originalis.ai/api/v1/funds/cashflows\" \\\n  | jq '.cashflows[] | select(.cashflow_date >= \"2026-07-01\")'\n```\n\n**Relationship-drift alerting** — pipe going-stale signals anywhere:\n\n```bash\ncurl -s -H \"X-API-Key: $KEY\" \\\n  \"https://dev-originalis-api.originalis.ai/api/v1/network/signals/going-stale?limit=10\" \\\n  | jq -r '.signals[] | \"\\(.name): \\(.days_since_last_touch)d since last touch\"'\n```\n\n## Connect an AI agent (MCP)\n\nOriginalis is also a [Model Context Protocol](https://modelcontextprotocol.io)\nserver — the same API key, a different door:\n\n```text\nhttps://dev-originalis-api.originalis.ai/mcp\n```\n\n- **Claude Code**:\n  `claude mcp add --transport http originalis https://dev-originalis-api.originalis.ai/mcp --header \"Authorization: Bearer ak_...\"`\n- **Claude.ai / Claude Desktop**: add a custom connector with that URL —\n  signing in with your Originalis account (OAuth) works there too. Or\n  start from the in-app install page at\n  [Integrations → Claude](https://dev.originalis.ai/app/integrations/claude-ai).\n\nThe MCP surface is deliberately a **single conversational tool** (`ori`)\nthat reaches the full Originalis workspace — deal lookups, memos,\nresearch, network questions — with real thread continuity, rather than a\nzoo of per-endpoint tools.\n\n**Which door to use:** this REST API for deterministic, typed\nintegrations (CRMs, warehouses, scheduled jobs — anything written in\ncode against a stable contract, including the async actions); MCP for\nAI assistants that converse — the agent reaches the full workspace\nconversationally, governed by your account's permissions.\n\n## OpenAPI & SDKs\n\nThe machine-readable contract lives at\n[`https://dev-originalis-api.originalis.ai/api/v1/openapi.json`](https://dev-originalis-api.originalis.ai/api/v1/openapi.json)\n(OpenAPI 3.1, unauthenticated). Point any generator at it — Stainless,\nSpeakeasy, Fern, `openapi-generator` — to produce a typed client in your\nlanguage.\n\n## Changelog\n\n- **1.10.0** (2026-09-08) — document inputs: `POST /deals/analyze` accepts\n  `document_url` (DocSend — with password + server-side email\n  verification — Notion, Canva, Dropbox, Google Drive, Figma, Gamma);\n  new `POST /deals/analyze/upload` (multipart PDF/PPT/DOC, 50 MB);\n  data-room endpoints `POST`/`GET /deals/{deal_id}/documents`.\n- **1.9.0** (2026-09-08) — response shaping: `?view=full` on deal and\n  founder detail reads (per-section analysis; per-metric confidence +\n  reasoning), `?view=summary` on research reads (lifecycle without the\n  report body).\n- **1.8.1** (2026-09-08) — production hardening: keys are strictly\n  org-scoped on every read (cross-org rows are a plain 404); the\n  actions budget is charged only when a run dispatches; per-key caps on\n  concurrent event streams; webhook retries widened to ~30 minutes.\n- **1.8.0** (2026-09-07) — webhooks: signed terminal-event delivery\n  (Standard Webhooks conventions), endpoint management + delivery\n  ledger under `/webhooks`.\n- **1.7.0** (2026-09-07) — SSE streams for every action\n  (`.../events`): `progress` on change, `done` with `result_url`,\n  25s keep-alives.\n- **1.6.0** (2026-09-07) — live `progress` on all three action status\n  reads (deal pipeline stages, founder stage, research stage + percent).\n- **1.5.0** (2026-09-07) — research actions: `POST /research`\n  (idempotent by required key, per-user live-run gate) +\n  `GET /research/{research_id}` with the cited Markdown report.\n- **1.4.0** (2026-09-07) — founder analysis actions:\n  `POST /founders/analyze` (org-deduped, `existing: true` on a cache\n  hit) + `GET /founders/analyses/{analysis_id}`.\n- **1.3.0** (2026-09-07) — first actions: `POST /deals/analyze` +\n  `GET /deals/{deal_id}/analysis`. Write-scoped keys, per-key daily\n  actions budget, shared async status vocabulary.\n- **1.2.1** (2026-09-02) — stable `operationId` on every operation (SDK\n  and agent friendly), curated examples on every response, documented\n  error bodies, and `X-Request-Id` / `X-RateLimit-*` headers.\n- **1.2.0** (2026-09-02) — added metric time-series\n  (`/portfolio/companies/{company_id}/metrics`) and LP mark history\n  (`/funds/marks`).\n- **1.1.0** (2026-09-02) — added Deals (`/deals`, `/deals/{deal_id}`),\n  Portfolio (`/portfolio/companies`), and Funds (`/funds/positions`,\n  `/funds/cashflows`).\n- **1.0.0** (2026-09-01) — initial release: Network Intelligence\n  (who-knows, warmth lookup, contacts export, reach candidates,\n  going-stale signals).","version":"1.10.0"},"paths":{"/api/v1/network/who-knows":{"get":{"tags":["public-network-v1"],"summary":"Who knows this company or person","description":"Rank the org's warm paths to a target company or person.","operationId":"whoKnows","parameters":[{"name":"domain","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Target company domain, e.g. 'acme.com'.","title":"Domain"},"description":"Target company domain, e.g. 'acme.com'."},{"name":"person","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Target person — a name or an email address.","title":"Person"},"description":"Target person — a name or an email address."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"default":10,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WhoKnowsResponse"},"example":{"target":{"domain":"acmerobotics.com","person":null},"scope":"org_shared","paths":[{"contact_id":"9f2c1b7a-4e11-4c2e-9b3a-1d5f6a7b8c9d","name":"Jane Doe","title":"CTO","email":"jane@acmerobotics.com","domain":"acmerobotics.com","warmth":0.72,"strength_score":81.0,"relationship":"strong","path_owner":"Mark Smith","owner_user_id":"user_2x9YbFq"},{"contact_id":"b3d4e5f6-7a8b-4c9d-8e0f-1a2b3c4d5e6f","name":"Sam Lee","title":"VP Engineering","email":"sam@acmerobotics.com","domain":"acmerobotics.com","warmth":0.31,"strength_score":44.0,"relationship":"moderate","path_owner":"Priya Patel","owner_user_id":"user_7kQwLm2"}],"unavailable_reason":null,"as_of":"2026-09-02T14:00:00Z"}}},"headers":{"X-Request-Id":{"description":"Correlation id for this request — quote it to support.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"The key's daily request budget.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left today. Omitted when the counter is unavailable.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Seconds until the budget resets at UTC midnight.","schema":{"type":"integer"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing, invalid, revoked, or expired API key.","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]},"example":{"detail":"Invalid or revoked API key."}}}},"403":{"description":"The key's user belongs to no organization.","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]},"example":{"detail":"This API key's user does not belong to an organization. Ask your firm admin to add the user to your Originalis org."}}}},"429":{"description":"Daily per-key request budget exhausted. Honor `Retry-After` (seconds until UTC midnight).","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]},"example":{"detail":"Daily request limit reached (5,000 requests per key). The limit resets at UTC midnight."}}}},"503":{"description":"A dependency is temporarily unavailable — retry with backoff. A failed read is never disguised as an empty result.","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]},"example":{"detail":"API key verification is temporarily unavailable. Retry shortly."}}}}},"x-scalar-stability":"stable"}},"/api/v1/network/warmth/lookup":{"post":{"tags":["public-network-v1"],"summary":"Batch warmth lookup","description":"Batch-resolve contact identifiers to the org's best warmth edge each.\n\nThe CRM-enrichment endpoint: send the emails (or contact ids, LinkedIn\nURLs, names) you hold and get back warmth + owner attribution per\nidentifier.","operationId":"warmthLookup","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WarmthLookupRequest"},"example":{"contacts":["jane@acmerobotics.com","nobody@unknown-domain.io","https://linkedin.com/in/adafounder-example"]}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WarmthLookupResponse"},"example":{"scope":"org_shared","results":[{"query":"jane@acmerobotics.com","contact_id":"9f2c1b7a-4e11-4c2e-9b3a-1d5f6a7b8c9d","name":"Jane Doe","title":"CTO","email":"jane@acmerobotics.com","domain":"acmerobotics.com","warmth":0.72,"strength_score":81.0,"relationship":"strong","path_owner":"Mark Smith","owner_user_id":"user_2x9YbFq","unavailable_reason":null},{"query":"nobody@unknown-domain.io","contact_id":null,"name":null,"title":null,"email":null,"domain":null,"warmth":null,"strength_score":null,"relationship":null,"path_owner":null,"owner_user_id":null,"unavailable_reason":"contact_not_found"}],"as_of":"2026-09-02T14:00:00Z"}}},"headers":{"X-Request-Id":{"description":"Correlation id for this request — quote it to support.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"The key's daily request budget.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left today. Omitted when the counter is unavailable.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Seconds until the budget resets at UTC midnight.","schema":{"type":"integer"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing, invalid, revoked, or expired API key.","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]},"example":{"detail":"Invalid or revoked API key."}}}},"403":{"description":"The key's user belongs to no organization.","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]},"example":{"detail":"This API key's user does not belong to an organization. Ask your firm admin to add the user to your Originalis org."}}}},"429":{"description":"Daily per-key request budget exhausted. Honor `Retry-After` (seconds until UTC midnight).","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]},"example":{"detail":"Daily request limit reached (5,000 requests per key). The limit resets at UTC midnight."}}}},"503":{"description":"A dependency is temporarily unavailable — retry with backoff. A failed read is never disguised as an empty result.","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]},"example":{"detail":"API key verification is temporarily unavailable. Retry shortly."}}}}},"x-scalar-stability":"stable"}},"/api/v1/network/contacts":{"get":{"tags":["public-network-v1"],"summary":"Export contacts with warmth","description":"Keyset-paginated listing of the key user's contact graph.\n\nEach row carries the org's best warmth edge (share_network-gated, owner\nattributed) so a single paged export is enough to sync warmth into a\nCRM or warehouse.","operationId":"listContacts","parameters":[{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Keyset cursor from the previous page.","title":"Cursor"},"description":"Keyset cursor from the previous page."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":100,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactsPageResponse"},"example":{"scope":"key_user","contacts":[{"contact_id":"9f2c1b7a-4e11-4c2e-9b3a-1d5f6a7b8c9d","name":"Jane Doe","email":"jane@acmerobotics.com","title":"CTO","domain":"acmerobotics.com","linkedin_url":"https://linkedin.com/in/janedoe-example","location":"New York, NY","warmth":0.72,"strength_score":81.0,"relationship":"strong","path_owner":"Mark Smith","owner_user_id":"user_2x9YbFq","unavailable_reason":null},{"contact_id":"c7d8e9f0-1a2b-4c3d-9e4f-5a6b7c8d9e0f","name":"Alex Kim","email":"alex@futuremail.example","title":null,"domain":"futuremail.example","linkedin_url":null,"location":null,"warmth":null,"strength_score":null,"relationship":null,"path_owner":null,"owner_user_id":null,"unavailable_reason":"no_relationship_data"}],"next_cursor":"c7d8e9f0-1a2b-4c3d-9e4f-5a6b7c8d9e0f","as_of":"2026-09-02T14:00:00Z"}}},"headers":{"X-Request-Id":{"description":"Correlation id for this request — quote it to support.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"The key's daily request budget.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left today. Omitted when the counter is unavailable.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Seconds until the budget resets at UTC midnight.","schema":{"type":"integer"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing, invalid, revoked, or expired API key.","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]},"example":{"detail":"Invalid or revoked API key."}}}},"403":{"description":"The key's user belongs to no organization.","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]},"example":{"detail":"This API key's user does not belong to an organization. Ask your firm admin to add the user to your Originalis org."}}}},"429":{"description":"Daily per-key request budget exhausted. Honor `Retry-After` (seconds until UTC midnight).","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]},"example":{"detail":"Daily request limit reached (5,000 requests per key). The limit resets at UTC midnight."}}}},"503":{"description":"A dependency is temporarily unavailable — retry with backoff. A failed read is never disguised as an empty result.","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]},"example":{"detail":"API key verification is temporarily unavailable. Retry shortly."}}}}},"x-scalar-stability":"stable"}},"/api/v1/network/reach/candidates":{"get":{"tags":["public-network-v1"],"summary":"Reach fan-out candidates","description":"Precomputed reach fan-out candidates for the key's user.\n\nServes the persisted output of background fan-out runs (proxy first\ndegree through the user's anchors, portfolio hops, LLM typing). Pure\ntable read — a run is never triggered by this endpoint.","operationId":"listReachCandidates","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":60,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReachCandidatesResponse"},"example":{"scope":"key_user","candidates":[{"candidate_id":"5e6f7a8b-9c0d-4e1f-8a2b-3c4d5e6f7a8b","full_name":"Ada Founder","linkedin_url":"https://linkedin.com/in/adafounder-example","headline":"Building warehouse robotics","current_title":"CEO","current_company":"Acme Robotics","location":"Brooklyn, NY","candidate_type":"founder","fit_score":0.83,"fit_reasons":["Former colleague of two of your anchors","Sector overlap: robotics, logistics"],"path_quality":"proxy_first_degree","is_proxy_first_degree":true,"status":"new","first_seen_at":"2026-08-28T09:12:00Z","updated_at":"2026-09-01T22:40:00Z"}],"as_of":"2026-09-02T14:00:00Z"}}},"headers":{"X-Request-Id":{"description":"Correlation id for this request — quote it to support.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"The key's daily request budget.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left today. Omitted when the counter is unavailable.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Seconds until the budget resets at UTC midnight.","schema":{"type":"integer"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing, invalid, revoked, or expired API key.","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]},"example":{"detail":"Invalid or revoked API key."}}}},"403":{"description":"The key's user belongs to no organization.","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]},"example":{"detail":"This API key's user does not belong to an organization. Ask your firm admin to add the user to your Originalis org."}}}},"429":{"description":"Daily per-key request budget exhausted. Honor `Retry-After` (seconds until UTC midnight).","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]},"example":{"detail":"Daily request limit reached (5,000 requests per key). The limit resets at UTC midnight."}}}},"503":{"description":"A dependency is temporarily unavailable — retry with backoff. A failed read is never disguised as an empty result.","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]},"example":{"detail":"API key verification is temporarily unavailable. Retry shortly."}}}}},"x-scalar-stability":"stable"}},"/api/v1/network/signals/going-stale":{"get":{"tags":["public-network-v1"],"summary":"Going-stale relationships","description":"Relationships whose days-since-last-touch exceed their cadence.\n\nMirrors the in-app going-stale surface: effective cadence = declared\n(user-set) when present, else the nightly learned cadence; snoozed rows\nare excluded; ordered by relative overdue. Scoped to the key's user.","operationId":"listGoingStaleSignals","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":25,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoingStaleSignalsResponse"},"example":{"scope":"key_user","signals":[{"contact_id":"9f2c1b7a-4e11-4c2e-9b3a-1d5f6a7b8c9d","name":"Jane Doe","days_since_last_touch":92,"effective_cadence_days":60,"source":"declared"},{"contact_id":"d1e2f3a4-5b6c-4d7e-8f9a-0b1c2d3e4f5a","name":"Chris Alvarez","days_since_last_touch":45,"effective_cadence_days":30,"source":"learned"}],"total":7,"as_of":"2026-09-02T14:00:00Z"}}},"headers":{"X-Request-Id":{"description":"Correlation id for this request — quote it to support.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"The key's daily request budget.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left today. Omitted when the counter is unavailable.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Seconds until the budget resets at UTC midnight.","schema":{"type":"integer"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing, invalid, revoked, or expired API key.","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]},"example":{"detail":"Invalid or revoked API key."}}}},"403":{"description":"The key's user belongs to no organization.","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]},"example":{"detail":"This API key's user does not belong to an organization. Ask your firm admin to add the user to your Originalis org."}}}},"429":{"description":"Daily per-key request budget exhausted. Honor `Retry-After` (seconds until UTC midnight).","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]},"example":{"detail":"Daily request limit reached (5,000 requests per key). The limit resets at UTC midnight."}}}},"503":{"description":"A dependency is temporarily unavailable — retry with backoff. A failed read is never disguised as an empty result.","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]},"example":{"detail":"API key verification is temporarily unavailable. Retry shortly."}}}}},"x-scalar-stability":"stable"}},"/api/v1/deals":{"get":{"tags":["public-deals-v1"],"summary":"List deals","description":"List the org's deal pipeline, newest activity first.\n\nThe active workspace cohort visible to the key's user — in-flight\nanalyses included (their scores arrive as they finish). Offset-\npaginated with a stable ordering and a `total`, so a full sweep into\na CRM or warehouse is `offset += limit` until `has_more` is false.","operationId":"listDeals","parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"description":"Filter to these deal statuses (repeatable: ?status=diligence&status=term-sheet). Omit for all.","title":"Status"},"description":"Filter to these deal statuses (repeatable: ?status=diligence&status=term-sheet). Omit for all."},{"name":"stage","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"description":"Filter to these funding stages (repeatable), e.g. 'Series A'.","title":"Stage"},"description":"Filter to these funding stages (repeatable), e.g. 'Series A'."},{"name":"kind","in":"query","required":false,"schema":{"anyOf":[{"enum":["company","fund"],"type":"string"},{"type":"null"}],"description":"Filter to 'company' or 'fund' deals.","title":"Kind"},"description":"Filter to 'company' or 'fund' deals."},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Case-insensitive company-name search.","title":"Q"},"description":"Case-insensitive company-name search."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DealsPageResponse"},"example":{"scope":"org_workspace","deals":[{"deal_id":"8a9b0c1d-2e3f-4a5b-9c6d-7e8f9a0b1c2d","kind":"company","company_name":"Acme Robotics","subtitle":"Autonomous picking for mid-size warehouses","sectors":["Robotics","Logistics"],"deal_status":"diligence","stage":"Series A","overall_score":78.5,"is_archived":false,"created_at":"2026-08-12T15:30:00Z","updated_at":"2026-09-01T18:05:00Z"},{"deal_id":"1f2e3d4c-5b6a-4978-8765-4321fedcba98","kind":"fund","company_name":"Beta Growth I","subtitle":"Growth-stage B2B software, fund II of an emerging manager","sectors":["B2B SaaS"],"deal_status":"screening","stage":null,"overall_score":null,"is_archived":false,"created_at":"2026-08-30T10:00:00Z","updated_at":null}],"total":34,"limit":50,"offset":0,"has_more":false,"as_of":"2026-09-02T14:00:00Z"}}},"headers":{"X-Request-Id":{"description":"Correlation id for this request — quote it to support.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"The key's daily request budget.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left today. Omitted when the counter is unavailable.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Seconds until the budget resets at UTC midnight.","schema":{"type":"integer"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing, invalid, revoked, or expired API key.","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]},"example":{"detail":"Invalid or revoked API key."}}}},"403":{"description":"The key's user belongs to no organization.","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]},"example":{"detail":"This API key's user does not belong to an organization. Ask your firm admin to add the user to your Originalis org."}}}},"429":{"description":"Daily per-key request budget exhausted. Honor `Retry-After` (seconds until UTC midnight).","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]},"example":{"detail":"Daily request limit reached (5,000 requests per key). The limit resets at UTC midnight."}}}},"503":{"description":"A dependency is temporarily unavailable — retry with backoff. A failed read is never disguised as an empty result.","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]},"example":{"detail":"API key verification is temporarily unavailable. Retry shortly."}}}}},"x-scalar-stability":"stable"}},"/api/v1/deals/{deal_id}":{"get":{"tags":["public-deals-v1"],"summary":"Get a deal record","description":"Structured detail for one deal: company facts, round, team, score.\n\n404 when the deal doesn't exist, isn't visible to the key's user, or\nits analysis hasn't produced a record yet.","operationId":"getDeal","parameters":[{"name":"deal_id","in":"path","required":true,"schema":{"type":"string","title":"Deal Id"}},{"name":"view","in":"query","required":false,"schema":{"enum":["default","full"],"type":"string","description":"'default' returns the structured record; 'full' adds the per-section analysis (scores + summaries) in `analysis`.","default":"default","title":"View"},"description":"'default' returns the structured record; 'full' adds the per-section analysis (scores + summaries) in `analysis`."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DealDetailResponse"},"example":{"deal_id":"8a9b0c1d-2e3f-4a5b-9c6d-7e8f9a0b1c2d","kind":"company","company_name":"Acme Robotics","company_url":"https://acmerobotics.com","subtitle":"Autonomous picking for mid-size warehouses","deal_status":"diligence","stage":"Series A","sectors":["Robotics","Logistics"],"location":"Brooklyn, NY","year_founded":2023,"current_round":"Series A","current_raise":"$12M","last_round_amount":"$3.5M","overall_score":78.5,"founders":[{"name":"Ada Founder","role":"CEO","linkedin_url":"https://linkedin.com/in/adafounder-example"},{"name":"Grace Builder","role":"CTO","linkedin_url":null}],"in_progress":false,"as_of":"2026-09-02T14:00:00Z"}}},"headers":{"X-Request-Id":{"description":"Correlation id for this request — quote it to support.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"The key's daily request budget.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left today. Omitted when the counter is unavailable.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Seconds until the budget resets at UTC midnight.","schema":{"type":"integer"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing, invalid, revoked, or expired API key.","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]},"example":{"detail":"Invalid or revoked API key."}}}},"403":{"description":"The key's user belongs to no organization.","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]},"example":{"detail":"This API key's user does not belong to an organization. Ask your firm admin to add the user to your Originalis org."}}}},"429":{"description":"Daily per-key request budget exhausted. Honor `Retry-After` (seconds until UTC midnight).","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]},"example":{"detail":"Daily request limit reached (5,000 requests per key). The limit resets at UTC midnight."}}}},"503":{"description":"A dependency is temporarily unavailable — retry with backoff. A failed read is never disguised as an empty result.","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]},"example":{"detail":"API key verification is temporarily unavailable. Retry shortly."}}}},"404":{"description":"The deal doesn't exist, isn't visible to the key's user, or has no analyzed record yet.","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]},"example":{"detail":"Deal not found"}}}}},"x-scalar-stability":"stable"}},"/api/v1/deals/analyze":{"post":{"tags":["public-deals-v1"],"summary":"Analyze a company or fund","description":"Submit a company or fund website for full Originalis analysis.\n\nDispatches the same pipeline the in-app \"generate from website\" flow\nuses: the site is read, a deal record is created in your org\nworkspace, and the full analysis (company intelligence, market,\nteam, scoring) runs asynchronously — typically minutes. Poll the\nreturned `status_url`; when it reports `succeeded`, the finished\nrecord is at `result_url`.\n\nRequires a write-scoped API key and draws down the daily actions\nbudget. One analysis per (org, domain) may run at a time — a\nconcurrent duplicate submission returns 409.\n\nInstead of a website, `document_url` accepts a hosted deck or\ndocument (DocSend, Notion, Canva, Dropbox, Google Drive, Figma,\nGamma) — same 202 contract; `verification_required` reports whether\na DocSend link still needs email verification (handled server-side\nvia the key user's inbox). For a raw file, use\n`POST /deals/analyze/upload`.","operationId":"analyzeDeal","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DealAnalyzeRequest"},"example":{"website_url":"https://acmerobotics.com","company_name":"Acme Robotics","kind":"company"}}},"required":true},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DealAnalyzeResponse"},"example":{"deal_id":"8a9b0c1d-2e3f-4a5b-9c6d-7e8f9a0b1c2d","status":"queued","status_url":"/api/v1/deals/8a9b0c1d-2e3f-4a5b-9c6d-7e8f9a0b1c2d/analysis","result_url":"/api/v1/deals/8a9b0c1d-2e3f-4a5b-9c6d-7e8f9a0b1c2d","as_of":"2026-09-02T14:00:00Z"}}},"headers":{"X-Request-Id":{"description":"Correlation id for this request — quote it to support.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"The key's daily request budget.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left today. Omitted when the counter is unavailable.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Seconds until the budget resets at UTC midnight.","schema":{"type":"integer"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing, invalid, revoked, or expired API key.","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]},"example":{"detail":"Invalid or revoked API key."}}}},"403":{"description":"The key's user belongs to no organization.","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]},"example":{"detail":"This API key's user does not belong to an organization. Ask your firm admin to add the user to your Originalis org."}}}},"429":{"description":"Daily per-key request budget exhausted. Honor `Retry-After` (seconds until UTC midnight).","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]},"example":{"detail":"Daily request limit reached (5,000 requests per key). The limit resets at UTC midnight."}}}},"503":{"description":"A dependency is temporarily unavailable — retry with backoff. A failed read is never disguised as an empty result.","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]},"example":{"detail":"API key verification is temporarily unavailable. Retry shortly."}}}},"409":{"description":"An analysis for this domain is already running in the org.","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]},"example":{"detail":"An analysis for this domain is already running in your org. Poll your deals list for the in-flight record."}}}}},"x-scalar-stability":"stable"}},"/api/v1/deals/analyze/upload":{"post":{"tags":["public-deals-v1"],"summary":"Analyze an uploaded deck or document","description":"Upload a file and run the full analysis pipeline on it.\n\nMultipart form. The same pipeline as an in-app deck upload:\nPPT/DOC formats are converted to PDF, the deal record is created in\nyour org workspace, and the analysis runs asynchronously — poll\n`status_url`. Max 50 MB; requires a write-scoped key and draws down\nthe daily actions budget.","operationId":"analyzeDealUpload","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_analyzeDealUpload"}}},"required":true},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DealAnalyzeResponse"},"example":{"deal_id":"3c4d5e6f-7a8b-4c9d-8e0f-1a2b3c4d5e6f","status":"queued","status_url":"/api/v1/deals/3c4d5e6f-7a8b-4c9d-8e0f-1a2b3c4d5e6f/analysis","result_url":"/api/v1/deals/3c4d5e6f-7a8b-4c9d-8e0f-1a2b3c4d5e6f","as_of":"2026-09-02T14:00:00Z"}}},"headers":{"X-Request-Id":{"description":"Correlation id for this request — quote it to support.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"The key's daily request budget.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left today. Omitted when the counter is unavailable.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Seconds until the budget resets at UTC midnight.","schema":{"type":"integer"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing, invalid, revoked, or expired API key.","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]},"example":{"detail":"Invalid or revoked API key."}}}},"403":{"description":"The key's user belongs to no organization.","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]},"example":{"detail":"This API key's user does not belong to an organization. Ask your firm admin to add the user to your Originalis org."}}}},"429":{"description":"Daily per-key request budget exhausted. Honor `Retry-After` (seconds until UTC midnight).","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]},"example":{"detail":"Daily request limit reached (5,000 requests per key). The limit resets at UTC midnight."}}}},"503":{"description":"A dependency is temporarily unavailable — retry with backoff. A failed read is never disguised as an empty result.","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]},"example":{"detail":"API key verification is temporarily unavailable. Retry shortly."}}}}},"x-scalar-stability":"stable"}},"/api/v1/deals/{deal_id}/documents":{"post":{"tags":["public-deals-v1"],"summary":"Add data-room documents to a deal","description":"Upload documents into the deal's data room and analyze them.\n\nThe in-app \"Add materials\" pipeline: files land in the deal's data\nroom, are auto-classified into categories, and the data-room\nanalysis runs asynchronously (fund deals route to the LP fund\ncomposition pipeline automatically). Watch `documents_url` and the\ndeal's analysis status.","operationId":"addDealDocuments","parameters":[{"name":"deal_id","in":"path","required":true,"schema":{"type":"string","title":"Deal Id"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_addDealDocuments"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DealDocumentsAddResponse"},"example":{"deal_id":"8a9b0c1d-2e3f-4a5b-9c6d-7e8f9a0b1c2d","files_received":3,"status":"queued","documents_url":"/api/v1/deals/8a9b0c1d-2e3f-4a5b-9c6d-7e8f9a0b1c2d/documents","as_of":"2026-09-02T14:00:00Z"}}},"headers":{"X-Request-Id":{"description":"Correlation id for this request — quote it to support.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"The key's daily request budget.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left today. Omitted when the counter is unavailable.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Seconds until the budget resets at UTC midnight.","schema":{"type":"integer"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing, invalid, revoked, or expired API key.","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]},"example":{"detail":"Invalid or revoked API key."}}}},"403":{"description":"The key's user belongs to no organization.","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]},"example":{"detail":"This API key's user does not belong to an organization. Ask your firm admin to add the user to your Originalis org."}}}},"429":{"description":"Daily per-key request budget exhausted. Honor `Retry-After` (seconds until UTC midnight).","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]},"example":{"detail":"Daily request limit reached (5,000 requests per key). The limit resets at UTC midnight."}}}},"503":{"description":"A dependency is temporarily unavailable — retry with backoff. A failed read is never disguised as an empty result.","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]},"example":{"detail":"API key verification is temporarily unavailable. Retry shortly."}}}}},"x-scalar-stability":"stable"},"get":{"tags":["public-deals-v1"],"summary":"List a deal's documents","description":"The deal's document inventory: primary uploads + data-room files.\n\nData-room files carry their folder (the customer's own upload\nstructure, or the auto-classified category). Storage keys and signed\nURLs are deliberately not exposed.","operationId":"listDealDocuments","parameters":[{"name":"deal_id","in":"path","required":true,"schema":{"type":"string","title":"Deal Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DealDocumentsResponse"},"example":{"deal_id":"8a9b0c1d-2e3f-4a5b-9c6d-7e8f9a0b1c2d","documents":[{"document_id":"5f6a7b8c-9d0e-4f1a-8b2c-3d4e5f6a7b8c","filename":"acme-series-a-deck.pdf","folder":null,"size_bytes":4194304,"content_type":"application/pdf","uploaded_at":"2026-09-08T14:02:11Z"},{"document_id":"6a7b8c9d-0e1f-4a2b-9c3d-4e5f6a7b8c9d","filename":"fy26-operating-model.xlsx","folder":"Financials","size_bytes":812340,"content_type":"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet","uploaded_at":"2026-09-08T14:05:47Z"}],"total":2,"as_of":"2026-09-02T14:00:00Z"}}},"headers":{"X-Request-Id":{"description":"Correlation id for this request — quote it to support.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"The key's daily request budget.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left today. Omitted when the counter is unavailable.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Seconds until the budget resets at UTC midnight.","schema":{"type":"integer"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing, invalid, revoked, or expired API key.","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]},"example":{"detail":"Invalid or revoked API key."}}}},"403":{"description":"The key's user belongs to no organization.","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]},"example":{"detail":"This API key's user does not belong to an organization. Ask your firm admin to add the user to your Originalis org."}}}},"429":{"description":"Daily per-key request budget exhausted. Honor `Retry-After` (seconds until UTC midnight).","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]},"example":{"detail":"Daily request limit reached (5,000 requests per key). The limit resets at UTC midnight."}}}},"503":{"description":"A dependency is temporarily unavailable — retry with backoff. A failed read is never disguised as an empty result.","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]},"example":{"detail":"API key verification is temporarily unavailable. Retry shortly."}}}}},"x-scalar-stability":"stable"}},"/api/v1/deals/{deal_id}/analysis":{"get":{"tags":["public-deals-v1"],"summary":"Analysis status for a deal","description":"Lifecycle of a submitted analysis: queued → running → succeeded/failed.\n\nPoll with backoff (analysis takes minutes). `succeeded` means the\nstructured record is readable at `result_url`; `failed` is terminal —\nresubmit or contact support with your `X-Request-Id`.","operationId":"getDealAnalysis","parameters":[{"name":"deal_id","in":"path","required":true,"schema":{"type":"string","title":"Deal Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DealAnalysisStatusResponse"},"example":{"deal_id":"8a9b0c1d-2e3f-4a5b-9c6d-7e8f9a0b1c2d","status":"running","progress":{"percent":0.4,"stages":[{"name":"received","label":"Deck received","status":"done","done":null,"total":null},{"name":"extract","label":"Reading the deck","status":"done","done":24,"total":24},{"name":"founders","label":"Looking up the founders","status":"active","done":1,"total":2},{"name":"score","label":"Scoring","status":"pending","done":null,"total":null}]},"result_url":null,"as_of":"2026-09-02T14:00:00Z"}}},"headers":{"X-Request-Id":{"description":"Correlation id for this request — quote it to support.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"The key's daily request budget.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left today. Omitted when the counter is unavailable.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Seconds until the budget resets at UTC midnight.","schema":{"type":"integer"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing, invalid, revoked, or expired API key.","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]},"example":{"detail":"Invalid or revoked API key."}}}},"403":{"description":"The key's user belongs to no organization.","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]},"example":{"detail":"This API key's user does not belong to an organization. Ask your firm admin to add the user to your Originalis org."}}}},"429":{"description":"Daily per-key request budget exhausted. Honor `Retry-After` (seconds until UTC midnight).","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]},"example":{"detail":"Daily request limit reached (5,000 requests per key). The limit resets at UTC midnight."}}}},"503":{"description":"A dependency is temporarily unavailable — retry with backoff. A failed read is never disguised as an empty result.","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]},"example":{"detail":"API key verification is temporarily unavailable. Retry shortly."}}}},"404":{"description":"The deal doesn't exist or isn't visible to the key's user.","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]},"example":{"detail":"Deal not found"}}}}},"x-scalar-stability":"stable"}},"/api/v1/founders/analyze":{"post":{"tags":["public-founders-v1"],"summary":"Analyze a founder","description":"Run an Originalis founder assessment.\n\nDeduped per org: if your org already assessed this founder (or a run\nis in flight), you get the existing analysis back with\n`existing: true` — no new run is started or billed. Otherwise the\nresearch-agent pipeline runs asynchronously (typically minutes);\npoll `status_url`.\n\nRequires a write-scoped API key and draws down the daily actions\nbudget.","operationId":"analyzeFounder","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FounderAnalyzeRequest"},"example":{"name":"Ada Founder","linkedin_url":"https://linkedin.com/in/adafounder-example","company":"Acme Robotics"}}},"required":true},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FounderAnalyzeResponse"},"example":{"analysis_id":"d4e5f6a7-8b9c-4d0e-8f1a-2b3c4d5e6f7a","founder_name":"Ada Founder","status":"running","existing":false,"status_url":"/api/v1/founders/analyses/d4e5f6a7-8b9c-4d0e-8f1a-2b3c4d5e6f7a","result_url":"/api/v1/founders/analyses/d4e5f6a7-8b9c-4d0e-8f1a-2b3c4d5e6f7a","as_of":"2026-09-02T14:00:00Z"}}},"headers":{"X-Request-Id":{"description":"Correlation id for this request — quote it to support.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"The key's daily request budget.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left today. Omitted when the counter is unavailable.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Seconds until the budget resets at UTC midnight.","schema":{"type":"integer"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing, invalid, revoked, or expired API key.","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]},"example":{"detail":"Invalid or revoked API key."}}}},"403":{"description":"The key's user belongs to no organization.","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]},"example":{"detail":"This API key's user does not belong to an organization. Ask your firm admin to add the user to your Originalis org."}}}},"429":{"description":"Daily per-key request budget exhausted. Honor `Retry-After` (seconds until UTC midnight).","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]},"example":{"detail":"Daily request limit reached (5,000 requests per key). The limit resets at UTC midnight."}}}},"503":{"description":"A dependency is temporarily unavailable — retry with backoff. A failed read is never disguised as an empty result.","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]},"example":{"detail":"API key verification is temporarily unavailable. Retry shortly."}}}}},"x-scalar-stability":"stable"}},"/api/v1/founders/analyses/{analysis_id}":{"get":{"tags":["public-founders-v1"],"summary":"Founder analysis status and result","description":"One founder analysis: lifecycle plus the assessment when finished.\n\n`running` analyses return identity fields with null scores; on\n`succeeded` the full allowlisted assessment is present, including\nper-category research evidence.","operationId":"getFounderAnalysis","parameters":[{"name":"analysis_id","in":"path","required":true,"schema":{"type":"string","title":"Analysis Id"}},{"name":"view","in":"query","required":false,"schema":{"enum":["default","full"],"type":"string","description":"'default' returns names + scores per metric; 'full' adds each metric's confidence, reasoning, and missing_info.","default":"default","title":"View"},"description":"'default' returns names + scores per metric; 'full' adds each metric's confidence, reasoning, and missing_info."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FounderAnalysisResponse"},"example":{"analysis_id":"d4e5f6a7-8b9c-4d0e-8f1a-2b3c4d5e6f7a","status":"succeeded","founder_name":"Ada Founder","analysis_mode":"linkedin_only","overall_score":82,"assessment_confidence":"high","executive_summary":"Second-time operator with deep warehouse-automation domain expertise; strong technical bench, unproven at enterprise sales.","ori_pov":"The rare robotics founder who has already lived one full hardware-margin cycle — bet on the learning rate.","metrics":[{"metric_name":"technical_depth","score":9.0},{"metric_name":"market_insight","score":8.0},{"metric_name":"execution_track_record","score":7.5}],"key_strengths":["Shipped and scaled a robotics fleet to 40 sites at prior company","Published research in motion planning"],"areas_for_improvement":["No prior enterprise sales ownership"],"risk_factors":["Single technical co-founder dependency"],"venture_fit":{"ideal_company_type":"Deep-tech hardware with recurring software revenue","ideal_sectors":["Robotics","Logistics"],"team_gaps":["GTM lead"]},"research":[{"category":"news","results":[{"url":"https://news.example/acme-series-a","title":"Acme Robotics raises Series A","snippet":"Warehouse-automation startup Acme Robotics…"}],"result_count":1}],"resolved_linkedin_url":"https://linkedin.com/in/adafounder-example","created_at":"2026-09-07T13:40:00Z","updated_at":"2026-09-07T13:52:00Z","as_of":"2026-09-02T14:00:00Z"}}},"headers":{"X-Request-Id":{"description":"Correlation id for this request — quote it to support.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"The key's daily request budget.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left today. Omitted when the counter is unavailable.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Seconds until the budget resets at UTC midnight.","schema":{"type":"integer"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing, invalid, revoked, or expired API key.","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]},"example":{"detail":"Invalid or revoked API key."}}}},"403":{"description":"The key's user belongs to no organization.","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]},"example":{"detail":"This API key's user does not belong to an organization. Ask your firm admin to add the user to your Originalis org."}}}},"429":{"description":"Daily per-key request budget exhausted. Honor `Retry-After` (seconds until UTC midnight).","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]},"example":{"detail":"Daily request limit reached (5,000 requests per key). The limit resets at UTC midnight."}}}},"503":{"description":"A dependency is temporarily unavailable — retry with backoff. A failed read is never disguised as an empty result.","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]},"example":{"detail":"API key verification is temporarily unavailable. Retry shortly."}}}},"404":{"description":"The analysis doesn't exist or isn't visible to the key's org.","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]},"example":{"detail":"Analysis not found"}}}}},"x-scalar-stability":"stable"}},"/api/v1/research":{"post":{"tags":["public-research-v1"],"summary":"Run deep research","description":"Submit a research question; a deep-research run executes async.\n\nThe plan is generated and approved server-side in this call (a few\nseconds), then the run itself takes minutes — up to 30. Poll\n`status_url` with generous backoff. Retrying with the same\n`idempotency_key` recovers the same run; it never starts or bills a\nsecond one.","operationId":"runResearch","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResearchRequest"},"example":{"query":"Map the warehouse-automation competitive landscape and market sizing for mid-market 3PLs.","idempotency_key":"warehouse-automation-landscape-2026-09"}}},"required":true},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResearchSubmitResponse"},"example":{"research_id":"7f8a9b0c-1d2e-4f3a-8b4c-5d6e7f8a9b0c","status":"queued","status_url":"/api/v1/research/7f8a9b0c-1d2e-4f3a-8b4c-5d6e7f8a9b0c","result_url":"/api/v1/research/7f8a9b0c-1d2e-4f3a-8b4c-5d6e7f8a9b0c","as_of":"2026-09-02T14:00:00Z"}}},"headers":{"X-Request-Id":{"description":"Correlation id for this request — quote it to support.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"The key's daily request budget.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left today. Omitted when the counter is unavailable.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Seconds until the budget resets at UTC midnight.","schema":{"type":"integer"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing, invalid, revoked, or expired API key.","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]},"example":{"detail":"Invalid or revoked API key."}}}},"403":{"description":"The key's user belongs to no organization.","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]},"example":{"detail":"This API key's user does not belong to an organization. Ask your firm admin to add the user to your Originalis org."}}}},"429":{"description":"Daily per-key request budget exhausted. Honor `Retry-After` (seconds until UTC midnight).","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]},"example":{"detail":"Daily request limit reached (5,000 requests per key). The limit resets at UTC midnight."}}}},"503":{"description":"A dependency is temporarily unavailable — retry with backoff. A failed read is never disguised as an empty result.","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]},"example":{"detail":"API key verification is temporarily unavailable. Retry shortly."}}}},"409":{"description":"The idempotency_key was already used in a different workspace.","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]},"example":{"detail":"This idempotency_key was already used in a different workspace. Use a new key."}}}}},"x-scalar-stability":"stable"}},"/api/v1/research/{research_id}":{"get":{"tags":["public-research-v1"],"summary":"Research status and report","description":"One research run: lifecycle plus the finished report.\n\nOn `succeeded` the response carries the full Markdown report and its\ncitations (`?view=summary` withholds both and keeps the response\nsmall). `failed` is terminal — resubmit with a new idempotency_key,\nor contact support with your `X-Request-Id`.","operationId":"getResearch","parameters":[{"name":"research_id","in":"path","required":true,"schema":{"type":"string","title":"Research Id"}},{"name":"view","in":"query","required":false,"schema":{"enum":["summary","full"],"type":"string","description":"'full' (default) returns the whole Markdown report and its citations; 'summary' returns lifecycle + executive summary only — useful for status dashboards that don't want the multi-hundred-KB report body on every poll.","default":"full","title":"View"},"description":"'full' (default) returns the whole Markdown report and its citations; 'summary' returns lifecycle + executive summary only — useful for status dashboards that don't want the multi-hundred-KB report body on every poll."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResearchDetailResponse"},"example":{"research_id":"7f8a9b0c-1d2e-4f3a-8b4c-5d6e7f8a9b0c","status":"succeeded","summary":"Mid-market warehouse automation is consolidating around three integration patterns; pricing power sits with the software layer.","content":"# Warehouse Automation for Mid-Market 3PLs\n\n> **Thesis**: The software orchestration layer captures the margin.\n\n## Market structure\n\nThe mid-market segment…[E3]\n\n## References\n\n[E3] Logistics Automation Review…","citations":[{"url":"https://research.example/warehouse-automation-2026","title":"Logistics Automation Review 2026"}],"created_at":"2026-09-07T14:05:00Z","completed_at":"2026-09-07T14:19:00Z","as_of":"2026-09-02T14:00:00Z"}}},"headers":{"X-Request-Id":{"description":"Correlation id for this request — quote it to support.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"The key's daily request budget.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left today. Omitted when the counter is unavailable.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Seconds until the budget resets at UTC midnight.","schema":{"type":"integer"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing, invalid, revoked, or expired API key.","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]},"example":{"detail":"Invalid or revoked API key."}}}},"403":{"description":"The key's user belongs to no organization.","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]},"example":{"detail":"This API key's user does not belong to an organization. Ask your firm admin to add the user to your Originalis org."}}}},"429":{"description":"Daily per-key request budget exhausted. Honor `Retry-After` (seconds until UTC midnight).","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]},"example":{"detail":"Daily request limit reached (5,000 requests per key). The limit resets at UTC midnight."}}}},"503":{"description":"A dependency is temporarily unavailable — retry with backoff. A failed read is never disguised as an empty result.","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]},"example":{"detail":"API key verification is temporarily unavailable. Retry shortly."}}}},"404":{"description":"The research doesn't exist or isn't visible to the key's org.","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]},"example":{"detail":"Research not found"}}}}},"x-scalar-stability":"stable"}},"/api/v1/portfolio/companies":{"get":{"tags":["public-portfolio-v1"],"summary":"List portfolio holdings","description":"List the org's portfolio holdings with economics and latest metrics.\n\nEach row carries ledger-derived economics (invested, current\nvaluation, multiple — null when the ledger has no record, never a\ndefaulted zero) and the latest actual for each core operating metric,\ndated by when it was measured.","operationId":"listPortfolioCompanies","parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by investment status, e.g. 'active'.","title":"Status"},"description":"Filter by investment status, e.g. 'active'."},{"name":"fund","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter to holdings in this fund (exact name).","title":"Fund"},"description":"Filter to holdings in this fund (exact name)."},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Case-insensitive company-name search.","title":"Q"},"description":"Case-insensitive company-name search."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PortfolioCompaniesPageResponse"},"example":{"scope":"org","companies":[{"company_id":"3c4d5e6f-7a8b-4c9d-8e0f-1a2b3c4d5e6f","name":"Acme Robotics","website":"https://acmerobotics.com","sector":"Robotics","stage":"Series A","status":"active","fund_name":"Fund I","holding_type":"direct_company","investment_date":"2025-03-15","ownership_percentage":8.5,"invested":2000000.0,"current_valuation":5000000.0,"value_multiple":2.5,"position_count":2,"metrics":{"arr":{"value":1200000.0,"unit":"usd","currency":"USD","statement_date":"2026-06-30T00:00:00Z"},"monthly_burn":{"value":150000.0,"unit":"usd","currency":"USD","statement_date":"2026-06-30T00:00:00Z"},"runway_months":{"value":14.0,"unit":"months","currency":null,"statement_date":"2026-06-30T00:00:00Z"}}},{"company_id":"6f7a8b9c-0d1e-4f2a-8b3c-4d5e6f7a8b9c","name":"Quietloop","website":"https://quietloop.example","sector":"Developer Tools","stage":"Seed","status":"active","fund_name":"Fund I","holding_type":"direct_company","investment_date":"2024-11-01","ownership_percentage":null,"invested":null,"current_valuation":null,"value_multiple":null,"position_count":0,"metrics":{}}],"total":23,"limit":50,"offset":0,"has_more":false,"as_of":"2026-09-02T14:00:00Z"}}},"headers":{"X-Request-Id":{"description":"Correlation id for this request — quote it to support.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"The key's daily request budget.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left today. Omitted when the counter is unavailable.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Seconds until the budget resets at UTC midnight.","schema":{"type":"integer"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing, invalid, revoked, or expired API key.","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]},"example":{"detail":"Invalid or revoked API key."}}}},"403":{"description":"The key's user belongs to no organization.","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]},"example":{"detail":"This API key's user does not belong to an organization. Ask your firm admin to add the user to your Originalis org."}}}},"429":{"description":"Daily per-key request budget exhausted. Honor `Retry-After` (seconds until UTC midnight).","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]},"example":{"detail":"Daily request limit reached (5,000 requests per key). The limit resets at UTC midnight."}}}},"503":{"description":"A dependency is temporarily unavailable — retry with backoff. A failed read is never disguised as an empty result.","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]},"example":{"detail":"API key verification is temporarily unavailable. Retry shortly."}}}}},"x-scalar-stability":"stable"}},"/api/v1/portfolio/companies/{company_id}/metrics":{"get":{"tags":["public-portfolio-v1"],"summary":"Metric history for a holding","description":"Dated history of one operating metric for one holding.\n\nActuals only (budget/forecast rows excluded), from the same canonical\nresolver the in-app sparklines read. Dated points come back oldest\nfirst; undated points (source never said when) come last and carry no\ntime claim.","operationId":"getMetricSeries","parameters":[{"name":"company_id","in":"path","required":true,"schema":{"type":"string","title":"Company Id"}},{"name":"metric","in":"query","required":false,"schema":{"enum":["arr","mrr","cash_on_hand","monthly_burn","runway_months","growth_rate","ndr","number_of_customers"],"type":"string","description":"Which metric's history to return.","default":"arr","title":"Metric"},"description":"Which metric's history to return."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":60,"minimum":1,"description":"Max points, most recent kept.","default":12,"title":"Limit"},"description":"Max points, most recent kept."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetricSeriesResponse"},"example":{"scope":"org","company_id":"3c4d5e6f-7a8b-4c9d-8e0f-1a2b3c4d5e6f","metric":"arr","points":[{"value":640000.0,"unit":"usd","currency":"USD","statement_date":"2025-12-31T00:00:00Z","source":"extraction"},{"value":910000.0,"unit":"usd","currency":"USD","statement_date":"2026-03-31T00:00:00Z","source":"extraction"},{"value":1200000.0,"unit":"usd","currency":"USD","statement_date":"2026-06-30T00:00:00Z","source":"manual"}],"as_of":"2026-09-02T14:00:00Z"}}},"headers":{"X-Request-Id":{"description":"Correlation id for this request — quote it to support.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"The key's daily request budget.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left today. Omitted when the counter is unavailable.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Seconds until the budget resets at UTC midnight.","schema":{"type":"integer"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing, invalid, revoked, or expired API key.","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]},"example":{"detail":"Invalid or revoked API key."}}}},"403":{"description":"The key's user belongs to no organization.","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]},"example":{"detail":"This API key's user does not belong to an organization. Ask your firm admin to add the user to your Originalis org."}}}},"429":{"description":"Daily per-key request budget exhausted. Honor `Retry-After` (seconds until UTC midnight).","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]},"example":{"detail":"Daily request limit reached (5,000 requests per key). The limit resets at UTC midnight."}}}},"503":{"description":"A dependency is temporarily unavailable — retry with backoff. A failed read is never disguised as an empty result.","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]},"example":{"detail":"API key verification is temporarily unavailable. Retry shortly."}}}},"404":{"description":"No portfolio company with this id in the key's org.","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]},"example":{"detail":"Portfolio company not found"}}}}},"x-scalar-stability":"stable"}},"/api/v1/funds/positions":{"get":{"tags":["public-funds-v1"],"summary":"LP fund positions","description":"The org's LP book: every fund commitment with derived economics.\n\nOne call returns the whole book (LP books are small — no pagination):\nper-position commitment/called/distributed/NAV with TVPI/DPI where the\ninputs exist, data-quality `attention` flags, and book totals with\nexplicit coverage counts.","operationId":"listFundPositions","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FundPositionsResponse"},"example":{"scope":"org","positions":[{"commitment_id":"2b3c4d5e-6f7a-4b8c-9d0e-1f2a3b4c5d6e","fund_name":"Alpha Ventures III","gp_firm_name":"Alpha Ventures","vintage_year":2021,"strategy_type":"venture","currency":"USD","status":"active","vehicle_kind":"fund","commitment_amount":10000000.0,"called_capital":9000000.0,"distributed_capital":1700000.0,"nav":11000000.0,"as_of_date":"2026-06-30","unfunded_amount":1000000.0,"tvpi":1.41,"dpi":0.19,"cashflow_count":14,"last_cashflow_date":"2026-05-01","attention":[]},{"commitment_id":"7a8b9c0d-1e2f-4a3b-8c4d-5e6f7a8b9c0d","fund_name":"Beta Growth I","gp_firm_name":"Beta Capital","vintage_year":2023,"strategy_type":null,"currency":"USD","status":"active","vehicle_kind":"spv","commitment_amount":5000000.0,"called_capital":null,"distributed_capital":null,"nav":null,"as_of_date":null,"unfunded_amount":null,"tvpi":null,"dpi":null,"cashflow_count":0,"last_cashflow_date":null,"attention":["no_mark_reported","no_cashflow_schedule","called_unknown"]}],"totals":{"fund_count":2,"manager_count":2,"oldest_vintage_year":2021,"total_committed":15000000.0,"total_called":9000000.0,"total_distributed":1700000.0,"total_nav":11000000.0,"total_unfunded":1000000.0,"book_tvpi":1.41,"book_dpi":0.19,"positions_with_called":1,"positions_with_nav":1,"positions_with_distributed":1},"as_of":"2026-09-02"}}},"headers":{"X-Request-Id":{"description":"Correlation id for this request — quote it to support.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"The key's daily request budget.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left today. Omitted when the counter is unavailable.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Seconds until the budget resets at UTC midnight.","schema":{"type":"integer"}}}},"401":{"description":"Missing, invalid, revoked, or expired API key.","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]},"example":{"detail":"Invalid or revoked API key."}}}},"403":{"description":"The key's user belongs to no organization.","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]},"example":{"detail":"This API key's user does not belong to an organization. Ask your firm admin to add the user to your Originalis org."}}}},"429":{"description":"Daily per-key request budget exhausted. Honor `Retry-After` (seconds until UTC midnight).","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]},"example":{"detail":"Daily request limit reached (5,000 requests per key). The limit resets at UTC midnight."}}}},"503":{"description":"A dependency is temporarily unavailable — retry with backoff. A failed read is never disguised as an empty result.","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]},"example":{"detail":"API key verification is temporarily unavailable. Retry shortly."}}}}},"x-scalar-stability":"stable"}},"/api/v1/funds/cashflows":{"get":{"tags":["public-funds-v1"],"summary":"LP cashflow ledger","description":"The dated LP cashflow ledger (calls and distributions), oldest first.\n\nThe reconciliation feed: every recorded call and distribution across\nthe org's commitments, each linked to its commitment.","operationId":"listFundCashflows","parameters":[{"name":"commitment_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter to one commitment (id from /funds/positions).","title":"Commitment Id"},"description":"Filter to one commitment (id from /funds/positions)."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FundCashflowsResponse"},"example":{"scope":"org","cashflows":[{"cashflow_id":"4d5e6f7a-8b9c-4d0e-8f1a-2b3c4d5e6f7a","commitment_id":"2b3c4d5e-6f7a-4b8c-9d0e-1f2a3b4c5d6e","cashflow_date":"2025-01-15","cashflow_type":"investment","amount":500000.0,"recallable":false},{"cashflow_id":"9c0d1e2f-3a4b-4c5d-8e6f-7a8b9c0d1e2f","commitment_id":"2b3c4d5e-6f7a-4b8c-9d0e-1f2a3b4c5d6e","cashflow_date":"2026-04-30","cashflow_type":"cash","amount":350000.0,"recallable":true}],"total":14,"as_of":"2026-09-02T14:00:00Z"}}},"headers":{"X-Request-Id":{"description":"Correlation id for this request — quote it to support.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"The key's daily request budget.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left today. Omitted when the counter is unavailable.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Seconds until the budget resets at UTC midnight.","schema":{"type":"integer"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing, invalid, revoked, or expired API key.","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]},"example":{"detail":"Invalid or revoked API key."}}}},"403":{"description":"The key's user belongs to no organization.","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]},"example":{"detail":"This API key's user does not belong to an organization. Ask your firm admin to add the user to your Originalis org."}}}},"429":{"description":"Daily per-key request budget exhausted. Honor `Retry-After` (seconds until UTC midnight).","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]},"example":{"detail":"Daily request limit reached (5,000 requests per key). The limit resets at UTC midnight."}}}},"503":{"description":"A dependency is temporarily unavailable — retry with backoff. A failed read is never disguised as an empty result.","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]},"example":{"detail":"API key verification is temporarily unavailable. Retry shortly."}}}}},"x-scalar-stability":"stable"}},"/api/v1/funds/marks":{"get":{"tags":["public-funds-v1"],"summary":"LP mark history","description":"Every commitment's dated mark trace (NAV / called / distributed).\n\nThe momentum view behind the in-app sparklines: each point carries the\nTVPI it supports (null when that point's inputs are missing), and\n`has_trace` is true only with two or more dated points — one point is\na level, not a movement.","operationId":"listFundMarks","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FundMarksResponse"},"example":{"scope":"org","series":[{"commitment_id":"2b3c4d5e-6f7a-4b8c-9d0e-1f2a3b4c5d6e","points":[{"as_of_date":"2025-12-31","nav":9000000.0,"called_capital":8000000.0,"distributed_capital":500000.0,"tvpi":1.19,"source":"statement"},{"as_of_date":"2026-06-30","nav":11000000.0,"called_capital":9000000.0,"distributed_capital":1700000.0,"tvpi":1.41,"source":"statement"}],"has_trace":true}],"as_of":"2026-09-02T14:00:00Z"}}},"headers":{"X-Request-Id":{"description":"Correlation id for this request — quote it to support.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"The key's daily request budget.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left today. Omitted when the counter is unavailable.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Seconds until the budget resets at UTC midnight.","schema":{"type":"integer"}}}},"401":{"description":"Missing, invalid, revoked, or expired API key.","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]},"example":{"detail":"Invalid or revoked API key."}}}},"403":{"description":"The key's user belongs to no organization.","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]},"example":{"detail":"This API key's user does not belong to an organization. Ask your firm admin to add the user to your Originalis org."}}}},"429":{"description":"Daily per-key request budget exhausted. Honor `Retry-After` (seconds until UTC midnight).","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]},"example":{"detail":"Daily request limit reached (5,000 requests per key). The limit resets at UTC midnight."}}}},"503":{"description":"A dependency is temporarily unavailable — retry with backoff. A failed read is never disguised as an empty result.","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]},"example":{"detail":"API key verification is temporarily unavailable. Retry shortly."}}}}},"x-scalar-stability":"stable"}},"/api/v1/webhooks":{"get":{"tags":["public-webhooks-v1"],"summary":"List webhook endpoints","description":"The org's registered endpoints. Secrets are never re-shown.","operationId":"listWebhooks","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookListResponse"},"example":{"scope":"org","webhooks":[{"webhook_id":"3a4b5c6d-7e8f-4a9b-8c0d-1e2f3a4b5c6d","url":"https://ops.examplefund.com/hooks/originalis","description":"Airflow ingestion trigger","is_active":true,"created_at":"2026-09-02T14:00:00Z"}],"as_of":"2026-09-02T14:00:00Z"}}},"headers":{"X-Request-Id":{"description":"Correlation id for this request — quote it to support.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"The key's daily request budget.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left today. Omitted when the counter is unavailable.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Seconds until the budget resets at UTC midnight.","schema":{"type":"integer"}}}},"401":{"description":"Missing, invalid, revoked, or expired API key.","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]},"example":{"detail":"Invalid or revoked API key."}}}},"403":{"description":"The key's user belongs to no organization.","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]},"example":{"detail":"This API key's user does not belong to an organization. Ask your firm admin to add the user to your Originalis org."}}}},"429":{"description":"Daily per-key request budget exhausted. Honor `Retry-After` (seconds until UTC midnight).","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]},"example":{"detail":"Daily request limit reached (5,000 requests per key). The limit resets at UTC midnight."}}}},"503":{"description":"A dependency is temporarily unavailable — retry with backoff. A failed read is never disguised as an empty result.","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]},"example":{"detail":"API key verification is temporarily unavailable. Retry shortly."}}}}},"x-scalar-stability":"stable"},"post":{"tags":["public-webhooks-v1"],"summary":"Register a webhook endpoint","description":"Register an HTTPS endpoint to receive signed terminal events.\n\nThe response carries the signing secret ONCE — store it immediately.\nDeliveries follow the Standard Webhooks conventions (`webhook-id`,\n`webhook-timestamp`, `webhook-signature` headers; HMAC-SHA256 over\n`id.timestamp.payload`), so off-the-shelf verifier libraries work.","operationId":"createWebhook","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookCreateRequest"},"example":{"url":"https://ops.examplefund.com/hooks/originalis","description":"Airflow ingestion trigger"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookCreateResponse"},"example":{"webhook_id":"3a4b5c6d-7e8f-4a9b-8c0d-1e2f3a4b5c6d","url":"https://ops.examplefund.com/hooks/originalis","description":"Airflow ingestion trigger","secret":"whsec_wprxGVtdi9y0aP9YBk4mCJcMFyLkAsxr","events":["deal.analysis.completed","deal.analysis.failed","founder.analysis.completed","founder.analysis.failed","research.completed","research.failed"],"created_at":"2026-09-02T14:00:00Z"}}},"headers":{"X-Request-Id":{"description":"Correlation id for this request — quote it to support.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"The key's daily request budget.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left today. Omitted when the counter is unavailable.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Seconds until the budget resets at UTC midnight.","schema":{"type":"integer"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing, invalid, revoked, or expired API key.","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]},"example":{"detail":"Invalid or revoked API key."}}}},"403":{"description":"The key's user belongs to no organization.","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]},"example":{"detail":"This API key's user does not belong to an organization. Ask your firm admin to add the user to your Originalis org."}}}},"429":{"description":"Daily per-key request budget exhausted. Honor `Retry-After` (seconds until UTC midnight).","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]},"example":{"detail":"Daily request limit reached (5,000 requests per key). The limit resets at UTC midnight."}}}},"503":{"description":"A dependency is temporarily unavailable — retry with backoff. A failed read is never disguised as an empty result.","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]},"example":{"detail":"API key verification is temporarily unavailable. Retry shortly."}}}},"409":{"description":"URL already registered, or the per-org endpoint limit reached.","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]},"example":{"detail":"This URL is already registered for your org."}}}}},"x-scalar-stability":"stable"}},"/api/v1/webhooks/{webhook_id}":{"delete":{"tags":["public-webhooks-v1"],"summary":"Delete a webhook endpoint","description":"Remove an endpoint. In-flight deliveries stop with it.","operationId":"deleteWebhook","parameters":[{"name":"webhook_id","in":"path","required":true,"schema":{"type":"string","title":"Webhook Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookDeleteResponse"},"example":{"webhook_id":"3a4b5c6d-7e8f-4a9b-8c0d-1e2f3a4b5c6d","deleted":true}}},"headers":{"X-Request-Id":{"description":"Correlation id for this request — quote it to support.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"The key's daily request budget.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left today. Omitted when the counter is unavailable.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Seconds until the budget resets at UTC midnight.","schema":{"type":"integer"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing, invalid, revoked, or expired API key.","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]},"example":{"detail":"Invalid or revoked API key."}}}},"403":{"description":"The key's user belongs to no organization.","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]},"example":{"detail":"This API key's user does not belong to an organization. Ask your firm admin to add the user to your Originalis org."}}}},"429":{"description":"Daily per-key request budget exhausted. Honor `Retry-After` (seconds until UTC midnight).","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]},"example":{"detail":"Daily request limit reached (5,000 requests per key). The limit resets at UTC midnight."}}}},"503":{"description":"A dependency is temporarily unavailable — retry with backoff. A failed read is never disguised as an empty result.","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]},"example":{"detail":"API key verification is temporarily unavailable. Retry shortly."}}}},"404":{"description":"The webhook doesn't exist or belongs to another org.","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]},"example":{"detail":"Webhook not found"}}}}},"x-scalar-stability":"stable"}},"/api/v1/webhooks/{webhook_id}/deliveries":{"get":{"tags":["public-webhooks-v1"],"summary":"Recent deliveries for an endpoint","description":"The delivery ledger — the debugging view for a misbehaving receiver.\n\nShows the last 50 deliveries with status, attempt count, and the\nreceiver's last response code.","operationId":"listWebhookDeliveries","parameters":[{"name":"webhook_id","in":"path","required":true,"schema":{"type":"string","title":"Webhook Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookDeliveriesResponse"},"example":{"webhook_id":"3a4b5c6d-7e8f-4a9b-8c0d-1e2f3a4b5c6d","deliveries":[{"delivery_id":"9c0d1e2f-3a4b-4c5d-8e6f-7a8b9c0d1e2f","event_type":"deal.analysis.completed","entity_id":"8a9b0c1d-2e3f-4a5b-9c6d-7e8f9a0b1c2d","status":"delivered","attempts":1,"response_status":200,"error":null,"created_at":"2026-09-02T14:00:00Z","delivered_at":"2026-09-02T14:00:00Z"},{"delivery_id":"5d6e7f8a-9b0c-4d1e-8f2a-3b4c5d6e7f8a","event_type":"research.completed","entity_id":"7f8a9b0c-1d2e-4f3a-8b4c-5d6e7f8a9b0c","status":"failed","attempts":6,"response_status":503,"error":"HTTP 503","created_at":"2026-09-02T14:00:00Z","delivered_at":null}],"as_of":"2026-09-02T14:00:00Z"}}},"headers":{"X-Request-Id":{"description":"Correlation id for this request — quote it to support.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"The key's daily request budget.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left today. Omitted when the counter is unavailable.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Seconds until the budget resets at UTC midnight.","schema":{"type":"integer"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Missing, invalid, revoked, or expired API key.","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]},"example":{"detail":"Invalid or revoked API key."}}}},"403":{"description":"The key's user belongs to no organization.","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]},"example":{"detail":"This API key's user does not belong to an organization. Ask your firm admin to add the user to your Originalis org."}}}},"429":{"description":"Daily per-key request budget exhausted. Honor `Retry-After` (seconds until UTC midnight).","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]},"example":{"detail":"Daily request limit reached (5,000 requests per key). The limit resets at UTC midnight."}}}},"503":{"description":"A dependency is temporarily unavailable — retry with backoff. A failed read is never disguised as an empty result.","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]},"example":{"detail":"API key verification is temporarily unavailable. Retry shortly."}}}},"404":{"description":"The webhook doesn't exist or belongs to another org.","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}},"required":["detail"]},"example":{"detail":"Webhook not found"}}}}},"x-scalar-stability":"stable"}}},"components":{"schemas":{"Body_addDealDocuments":{"properties":{"files":{"items":{"type":"string","format":"binary"},"type":"array","title":"Files","description":"Up to 20 files (50 MB each): decks, financials, memos…"}},"type":"object","required":["files"],"title":"Body_addDealDocuments"},"Body_analyzeDealUpload":{"properties":{"file":{"type":"string","format":"binary","title":"File","description":"Pitch deck or document: PDF, PPT/PPTX, or DOC/DOCX."},"kind":{"type":"string","enum":["company","fund"],"title":"Kind","description":"'company' (GP flow) or 'fund' (LP fund flow).","default":"company"},"company_name":{"anyOf":[{"type":"string","maxLength":300},{"type":"null"}],"title":"Company Name"}},"type":"object","required":["file"],"title":"Body_analyzeDealUpload"},"ContactsPageResponse":{"properties":{"scope":{"type":"string","const":"key_user","title":"Scope","description":"The listing is the key user's contact graph; warmth on each row pools org-shared edges and names the owner.","default":"key_user"},"contacts":{"items":{"$ref":"#/components/schemas/PublicContact"},"type":"array","title":"Contacts"},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Cursor","description":"Pass back as ?cursor= for the next page; null = done."},"as_of":{"type":"string","format":"date-time","title":"As Of"}},"type":"object","required":["contacts","as_of"],"title":"ContactsPageResponse"},"DealAnalysisProgress":{"properties":{"percent":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Percent","description":"Rough completion in [0, 1], from stages done."},"stages":{"items":{"$ref":"#/components/schemas/PublicAnalysisStage"},"type":"array","title":"Stages"}},"type":"object","title":"DealAnalysisProgress","description":"Live pipeline progress for a running analysis."},"DealAnalysisStatusResponse":{"properties":{"deal_id":{"type":"string","title":"Deal Id"},"status":{"type":"string","title":"Status","description":"'queued' | 'running' | 'succeeded' | 'failed'. Analysis takes minutes — poll with backoff, not a tight loop."},"progress":{"anyOf":[{"$ref":"#/components/schemas/DealAnalysisProgress"},{"type":"null"}],"description":"Stage-level progress while the analysis runs; null before the pipeline reports and after it finishes."},"result_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Result Url","description":"Set when status is 'succeeded': GET the deal record here."},"as_of":{"type":"string","format":"date-time","title":"As Of"}},"type":"object","required":["deal_id","status","as_of"],"title":"DealAnalysisStatusResponse","description":"Lifecycle of one submitted analysis (the shared action vocabulary)."},"DealAnalyzeRequest":{"properties":{"website_url":{"anyOf":[{"type":"string","maxLength":2048,"minLength":8},{"type":"null"}],"title":"Website Url","description":"The company's (or fund manager's) website, e.g. 'https://acmerobotics.com'. Must start with http:// or https://."},"document_url":{"anyOf":[{"type":"string","maxLength":2048,"minLength":8},{"type":"null"}],"title":"Document Url","description":"A hosted deck or document to analyze instead of a website: DocSend, Notion, Canva, Dropbox, Google Drive, Figma, or Gamma link. Unsupported hosts return 400."},"document_password":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Document Password","description":"Password for a protected document link (e.g. DocSend)."},"company_name":{"anyOf":[{"type":"string","maxLength":300},{"type":"null"}],"title":"Company Name","description":"Display name; inferred from the site when omitted."},"kind":{"type":"string","enum":["company","fund"],"title":"Kind","description":"'company' (GP flow) or 'fund' (LP fund flow).","default":"company"}},"type":"object","title":"DealAnalyzeRequest","description":"Submit a company or fund for full Originalis analysis.\n\nExactly one source: ``website_url`` (the site is read and analyzed)\nor ``document_url`` (a hosted deck/document is ingested and\nanalyzed — DocSend, Notion, Canva, Dropbox, Google Drive, Figma,\nGamma)."},"DealAnalyzeResponse":{"properties":{"deal_id":{"type":"string","title":"Deal Id","description":"The deal being built — stable from the moment of submission."},"status":{"type":"string","const":"queued","title":"Status","default":"queued"},"status_url":{"type":"string","title":"Status Url","description":"Poll GET here until status is 'succeeded' or 'failed'."},"result_url":{"type":"string","title":"Result Url","description":"Where the finished deal record will be readable."},"verification_required":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Verification Required","description":"Document submissions only. True when the host (DocSend) requires email verification: Originalis completes it automatically via the key user's connected inbox, or emails the key user a verification request — the analysis proceeds once verified. Null for website submissions."},"as_of":{"type":"string","format":"date-time","title":"As Of"}},"type":"object","required":["deal_id","status_url","result_url","as_of"],"title":"DealAnalyzeResponse","description":"Accepted analysis submission (HTTP 202)."},"DealDetailResponse":{"properties":{"deal_id":{"type":"string","title":"Deal Id"},"kind":{"type":"string","enum":["company","fund"],"title":"Kind","default":"company"},"company_name":{"type":"string","title":"Company Name"},"company_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Url"},"subtitle":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subtitle"},"deal_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Deal Status","description":"Kanban status (canonical spelling)."},"stage":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stage","description":"Funding stage, e.g. 'Seed', 'Series A'."},"sectors":{"items":{"type":"string"},"type":"array","title":"Sectors"},"location":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Location"},"year_founded":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Year Founded"},"current_round":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Current Round","description":"Round currently being raised, e.g. 'Series A'."},"current_raise":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Current Raise","description":"Amount being raised, e.g. '$7.6M'."},"last_round_amount":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Round Amount","description":"Amount raised in the last completed round."},"overall_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Overall Score","description":"Originalis analysis score (0-100); null when not yet scored."},"founders":{"items":{"$ref":"#/components/schemas/PublicDealFounder"},"type":"array","title":"Founders"},"analysis":{"anyOf":[{"items":{"$ref":"#/components/schemas/PublicDealSection"},"type":"array"},{"type":"null"}],"title":"Analysis","description":"Per-section analysis (scores + summaries). Present only with ?view=full; sections the analysis hid are excluded."},"in_progress":{"type":"boolean","title":"In Progress","description":"True while deck analysis is still populating this deal — fields may be partial. Re-fetch later for the complete record.","default":false},"as_of":{"type":"string","format":"date-time","title":"As Of"}},"type":"object","required":["deal_id","company_name","as_of"],"title":"DealDetailResponse","description":"Structured detail for a single deal."},"DealDocumentsAddResponse":{"properties":{"deal_id":{"type":"string","title":"Deal Id"},"files_received":{"type":"integer","title":"Files Received"},"status":{"type":"string","const":"queued","title":"Status","default":"queued"},"documents_url":{"type":"string","title":"Documents Url","description":"GET here to watch the inventory as analysis lands."},"as_of":{"type":"string","format":"date-time","title":"As Of"}},"type":"object","required":["deal_id","files_received","documents_url","as_of"],"title":"DealDocumentsAddResponse","description":"Accepted data-room submission (HTTP 202)."},"DealDocumentsResponse":{"properties":{"deal_id":{"type":"string","title":"Deal Id"},"documents":{"items":{"$ref":"#/components/schemas/PublicDealDocument"},"type":"array","title":"Documents"},"total":{"type":"integer","title":"Total"},"as_of":{"type":"string","format":"date-time","title":"As Of"}},"type":"object","required":["deal_id","total","as_of"],"title":"DealDocumentsResponse","description":"The deal's document inventory."},"DealsPageResponse":{"properties":{"scope":{"type":"string","const":"org_workspace","title":"Scope","description":"Deals shared into the key user's org workspace, plus deals shared directly with the key's user — i.e. what that member sees in the in-app pipeline.","default":"org_workspace"},"deals":{"items":{"$ref":"#/components/schemas/PublicDeal"},"type":"array","title":"Deals"},"total":{"type":"integer","title":"Total","description":"Total matching deals across all pages."},"limit":{"type":"integer","title":"Limit"},"offset":{"type":"integer","title":"Offset"},"has_more":{"type":"boolean","title":"Has More","description":"True when offset + len(deals) < total; page with ?offset=."},"as_of":{"type":"string","format":"date-time","title":"As Of"}},"type":"object","required":["deals","total","limit","offset","has_more","as_of"],"title":"DealsPageResponse","description":"Offset-paginated page of the org's deal workspace."},"FounderAnalysisProgress":{"properties":{"stage":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stage","description":"'resolving_linkedin' | 'enriching_profile' | 'researching' | 'analyzing'."},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label","description":"Human label, e.g. 'Researching across the web'."},"stage_completed":{"type":"boolean","title":"Stage Completed","description":"True when the reported stage has finished.","default":false}},"type":"object","title":"FounderAnalysisProgress","description":"Current pipeline stage while an analysis runs."},"FounderAnalysisResponse":{"properties":{"analysis_id":{"type":"string","title":"Analysis Id"},"status":{"type":"string","enum":["queued","running","succeeded","failed"],"title":"Status"},"progress":{"anyOf":[{"$ref":"#/components/schemas/FounderAnalysisProgress"},{"type":"null"}],"description":"Live stage while the analysis runs; null before the pipeline reports (progress state expires ~10 minutes after a run ends)."},"founder_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Founder Name"},"analysis_mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Analysis Mode","description":"'linkedin_only', 'github_only', or 'full'."},"overall_score":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Overall Score","description":"Overall assessment score; null until finished."},"assessment_confidence":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Assessment Confidence"},"executive_summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Executive Summary"},"ori_pov":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ori Pov"},"metrics":{"items":{"$ref":"#/components/schemas/PublicFounderMetricScore"},"type":"array","title":"Metrics"},"key_strengths":{"items":{"type":"string"},"type":"array","title":"Key Strengths"},"areas_for_improvement":{"items":{"type":"string"},"type":"array","title":"Areas For Improvement"},"risk_factors":{"items":{"type":"string"},"type":"array","title":"Risk Factors"},"venture_fit":{"anyOf":[{"$ref":"#/components/schemas/PublicFounderVentureFit"},{"type":"null"}]},"research":{"items":{"$ref":"#/components/schemas/PublicFounderResearch"},"type":"array","title":"Research","description":"Web-research evidence by category; populated on success."},"resolved_linkedin_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resolved Linkedin Url"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"},"as_of":{"type":"string","format":"date-time","title":"As Of"}},"type":"object","required":["analysis_id","status","as_of"],"title":"FounderAnalysisResponse","description":"One founder analysis: lifecycle plus the result when finished."},"FounderAnalyzeRequest":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":300},{"type":"null"}],"title":"Name","description":"Founder's full name."},"linkedin_url":{"anyOf":[{"type":"string","maxLength":1024},{"type":"null"}],"title":"Linkedin Url","description":"LinkedIn profile URL."},"github_url":{"anyOf":[{"type":"string","maxLength":1024},{"type":"null"}],"title":"Github Url","description":"GitHub profile URL."},"company":{"anyOf":[{"type":"string","maxLength":300},{"type":"null"}],"title":"Company","description":"Current company — a discovery hint, not required."},"context":{"anyOf":[{"type":"string","maxLength":20000},{"type":"null"}],"title":"Context","description":"Free-form context for the assessment (notes, emails)."}},"type":"object","title":"FounderAnalyzeRequest","description":"Submit a founder for an Originalis assessment.\n\nProvide at least one identity signal: a name, a LinkedIn URL, or a\nGitHub URL. A LinkedIn URL is the strongest key — name-only\nsubmissions dedupe on the name alone."},"FounderAnalyzeResponse":{"properties":{"analysis_id":{"type":"string","title":"Analysis Id"},"founder_name":{"type":"string","title":"Founder Name"},"status":{"type":"string","enum":["queued","running","succeeded","failed"],"title":"Status"},"existing":{"type":"boolean","title":"Existing","description":"True when your org already had this founder assessed (or a run in flight) — you were handed the existing analysis and NO new run was started or billed."},"status_url":{"type":"string","title":"Status Url","description":"Poll GET here until status is 'succeeded' or 'failed'."},"result_url":{"type":"string","title":"Result Url"},"as_of":{"type":"string","format":"date-time","title":"As Of"}},"type":"object","required":["analysis_id","founder_name","status","existing","status_url","result_url","as_of"],"title":"FounderAnalyzeResponse","description":"Accepted founder-analysis submission (HTTP 202)."},"FundCashflowsResponse":{"properties":{"scope":{"type":"string","const":"org","title":"Scope","default":"org"},"cashflows":{"items":{"$ref":"#/components/schemas/PublicFundCashflow"},"type":"array","title":"Cashflows","description":"All dated cashflows across the org's commitments, oldest first."},"total":{"type":"integer","title":"Total"},"as_of":{"type":"string","format":"date-time","title":"As Of"}},"type":"object","required":["cashflows","total","as_of"],"title":"FundCashflowsResponse"},"FundMarksResponse":{"properties":{"scope":{"type":"string","const":"org","title":"Scope","default":"org"},"series":{"items":{"$ref":"#/components/schemas/PublicCommitmentMarkSeries"},"type":"array","title":"Series","description":"One entry per commitment that has at least one mark."},"as_of":{"type":"string","format":"date-time","title":"As Of"}},"type":"object","required":["series","as_of"],"title":"FundMarksResponse"},"FundPositionsResponse":{"properties":{"scope":{"type":"string","const":"org","title":"Scope","default":"org"},"positions":{"items":{"$ref":"#/components/schemas/PublicFundPosition"},"type":"array","title":"Positions"},"totals":{"$ref":"#/components/schemas/PublicFundsBookTotals"},"as_of":{"type":"string","format":"date","title":"As Of","description":"Date the derived economics were computed for."}},"type":"object","required":["positions","totals","as_of"],"title":"FundPositionsResponse"},"GoingStaleSignal":{"properties":{"contact_id":{"type":"string","title":"Contact Id"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"days_since_last_touch":{"type":"integer","title":"Days Since Last Touch"},"effective_cadence_days":{"type":"integer","title":"Effective Cadence Days"},"source":{"type":"string","title":"Source","description":"Which cadence applied: 'declared' or 'learned'."}},"type":"object","required":["contact_id","days_since_last_touch","effective_cadence_days","source"],"title":"GoingStaleSignal","description":"A relationship whose days-since-last-touch exceeds its cadence."},"GoingStaleSignalsResponse":{"properties":{"scope":{"type":"string","const":"key_user","title":"Scope","default":"key_user"},"signals":{"items":{"$ref":"#/components/schemas/GoingStaleSignal"},"type":"array","title":"Signals"},"total":{"type":"integer","title":"Total","description":"Total going-stale relationships for the user, before limit."},"as_of":{"type":"string","format":"date-time","title":"As Of"}},"type":"object","required":["signals","total","as_of"],"title":"GoingStaleSignalsResponse"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"MetricSeriesResponse":{"properties":{"scope":{"type":"string","const":"org","title":"Scope","default":"org"},"company_id":{"type":"string","title":"Company Id"},"metric":{"type":"string","enum":["arr","mrr","cash_on_hand","monthly_burn","runway_months","growth_rate","ndr","number_of_customers"],"title":"Metric"},"points":{"items":{"$ref":"#/components/schemas/PublicMetricPoint"},"type":"array","title":"Points","description":"Actuals ordered oldest first; budget/forecast rows excluded."},"as_of":{"type":"string","format":"date-time","title":"As Of"}},"type":"object","required":["company_id","metric","points","as_of"],"title":"MetricSeriesResponse","description":"Bounded chronological history of one metric for one holding."},"PortfolioCompaniesPageResponse":{"properties":{"scope":{"type":"string","const":"org","title":"Scope","description":"The full org portfolio book — not per-user.","default":"org"},"companies":{"items":{"$ref":"#/components/schemas/PublicPortfolioCompany"},"type":"array","title":"Companies"},"total":{"type":"integer","title":"Total","description":"Total matching holdings across all pages."},"limit":{"type":"integer","title":"Limit"},"offset":{"type":"integer","title":"Offset"},"has_more":{"type":"boolean","title":"Has More"},"as_of":{"type":"string","format":"date-time","title":"As Of"}},"type":"object","required":["companies","total","limit","offset","has_more","as_of"],"title":"PortfolioCompaniesPageResponse","description":"Offset-paginated page of the org's portfolio."},"PublicAnalysisStage":{"properties":{"name":{"type":"string","title":"Name","description":"Stable stage slug, e.g. 'extract', 'score'."},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label","description":"Human label, e.g. 'Reading the deck'."},"status":{"type":"string","title":"Status","description":"'pending' | 'active' | 'done' | 'error' | 'skipped' | 'open'."},"done":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Done","description":"Units finished, when the stage counts work."},"total":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total"}},"type":"object","required":["name","status"],"title":"PublicAnalysisStage","description":"One stage of the analysis pipeline."},"PublicCommitmentMarkSeries":{"properties":{"commitment_id":{"type":"string","title":"Commitment Id"},"points":{"items":{"$ref":"#/components/schemas/PublicMarkPoint"},"type":"array","title":"Points"},"has_trace":{"type":"boolean","title":"Has Trace","description":"True only with two or more dated points — one point is a level, not a movement."}},"type":"object","required":["commitment_id","has_trace"],"title":"PublicCommitmentMarkSeries","description":"A commitment's dated mark trace, oldest first."},"PublicContact":{"properties":{"contact_id":{"type":"string","title":"Contact Id"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"domain":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Domain"},"linkedin_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Linkedin Url"},"location":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Location"},"warmth":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Warmth"},"strength_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Strength Score"},"relationship":{"anyOf":[{"type":"string","enum":["strong","moderate","weak","dormant"]},{"type":"null"}],"title":"Relationship"},"path_owner":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Path Owner"},"owner_user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Owner User Id"},"unavailable_reason":{"anyOf":[{"type":"string","const":"no_relationship_data"},{"type":"null"}],"title":"Unavailable Reason"}},"type":"object","required":["contact_id"],"title":"PublicContact","description":"One contact from the key user's graph with the org's best warmth edge."},"PublicDeal":{"properties":{"deal_id":{"type":"string","title":"Deal Id","description":"Stable deal identifier — use it for detail reads."},"kind":{"anyOf":[{"type":"string","enum":["company","fund"]},{"type":"null"}],"title":"Kind","description":"'company' (direct/GP flow) or 'fund' (LP fund flow)."},"company_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Name"},"subtitle":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subtitle","description":"One-line description of the company or fund."},"sectors":{"items":{"type":"string"},"type":"array","title":"Sectors"},"deal_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Deal Status","description":"Kanban status. System statuses include 'screening', 'first-meeting', 'in-process', 'diligence', 'term-sheet', 'tracking', 'passed', 'closed' — orgs can add custom statuses, so treat this as an open vocabulary."},"stage":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stage","description":"Funding stage, e.g. 'Seed', 'Series A'."},"overall_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Overall Score","description":"Originalis analysis score (0-100); null when not yet scored."},"is_archived":{"type":"boolean","title":"Is Archived","default":false},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["deal_id"],"title":"PublicDeal","description":"One deal visible in the org's shared workspace."},"PublicDealDocument":{"properties":{"document_id":{"type":"string","title":"Document Id"},"filename":{"type":"string","title":"Filename"},"folder":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Folder","description":"Data-room folder/category; null for primary uploads."},"size_bytes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Size Bytes"},"content_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content Type"},"uploaded_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Uploaded At"}},"type":"object","required":["document_id","filename"],"title":"PublicDealDocument","description":"One document attached to a deal (deck, data-room file)."},"PublicDealFounder":{"properties":{"name":{"type":"string","title":"Name"},"role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Role"},"linkedin_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Linkedin Url"}},"type":"object","required":["name"],"title":"PublicDealFounder","description":"A founder/team member on a deal — identity fields only."},"PublicDealSection":{"properties":{"key":{"type":"string","title":"Key","description":"Stable section key, e.g. 'market', 'team'."},"name":{"type":"string","title":"Name","description":"Display name, e.g. 'Market Opportunity'."},"score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Score","description":"Section score (1-10); null when unscored or placeholder."},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary","description":"The section's analysis summary."}},"type":"object","required":["key","name"],"title":"PublicDealSection","description":"One analysis section of the deal record (view=full)."},"PublicFounderMetricScore":{"properties":{"metric_name":{"type":"string","title":"Metric Name"},"score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Score"},"confidence":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Confidence","description":"'High' | 'Medium' | 'Low' | 'Insufficient Data' (view=full)."},"reasoning":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reasoning","description":"Analytic rationale for the score (view=full)."},"missing_info":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Missing Info","description":"What could not be verified; empty when nothing (view=full)."}},"type":"object","required":["metric_name"],"title":"PublicFounderMetricScore","description":"One assessment dimension. Default view: name + score. With\n?view=full: adds confidence, reasoning, and missing_info. Raw\nevidence bullets are deliberately never exposed (they paraphrase\nlicensed vendor data without attribution)."},"PublicFounderResearch":{"properties":{"category":{"type":"string","title":"Category"},"results":{"items":{"$ref":"#/components/schemas/PublicFounderResearchResult"},"type":"array","title":"Results"},"result_count":{"type":"integer","title":"Result Count","default":0}},"type":"object","required":["category"],"title":"PublicFounderResearch","description":"Research evidence for one category (news, exits, publications, …)."},"PublicFounderResearchResult":{"properties":{"url":{"type":"string","title":"Url","default":""},"title":{"type":"string","title":"Title","default":""},"snippet":{"type":"string","title":"Snippet","default":""}},"type":"object","title":"PublicFounderResearchResult"},"PublicFounderVentureFit":{"properties":{"ideal_company_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ideal Company Type"},"ideal_sectors":{"items":{"type":"string"},"type":"array","title":"Ideal Sectors"},"team_gaps":{"items":{"type":"string"},"type":"array","title":"Team Gaps"}},"type":"object","title":"PublicFounderVentureFit"},"PublicFundCashflow":{"properties":{"cashflow_id":{"type":"string","title":"Cashflow Id"},"commitment_id":{"type":"string","title":"Commitment Id"},"cashflow_date":{"type":"string","format":"date","title":"Cashflow Date"},"cashflow_type":{"type":"string","title":"Cashflow Type","description":"ILPA-style taxonomy: calls (e.g. 'investment', 'fees') and distribution types."},"amount":{"type":"number","title":"Amount"},"recallable":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Recallable"}},"type":"object","required":["cashflow_id","commitment_id","cashflow_date","cashflow_type","amount"],"title":"PublicFundCashflow","description":"One dated LP cashflow (capital call or distribution)."},"PublicFundPosition":{"properties":{"commitment_id":{"type":"string","title":"Commitment Id"},"fund_name":{"type":"string","title":"Fund Name"},"gp_firm_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Gp Firm Name"},"vintage_year":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Vintage Year"},"strategy_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Strategy Type","description":"e.g. 'venture', 'buyout', 'growth'."},"currency":{"type":"string","title":"Currency","default":"USD"},"status":{"type":"string","title":"Status","description":"'active', 'realized', 'written_off', or 'transferred'."},"vehicle_kind":{"type":"string","title":"Vehicle Kind","description":"'fund', 'spv', 'co_invest', or 'direct'."},"commitment_amount":{"type":"number","title":"Commitment Amount"},"called_capital":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Called Capital"},"distributed_capital":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Distributed Capital"},"nav":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Nav","description":"Latest reported NAV; null when never marked."},"as_of_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"As Of Date","description":"Date the called/distributed/NAV figures hold at."},"unfunded_amount":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Unfunded Amount","description":"commitment − called; null when called is unknown."},"tvpi":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Tvpi","description":"(distributed + NAV) / called; null when inputs are missing."},"dpi":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Dpi","description":"distributed / called; null when inputs are missing."},"cashflow_count":{"type":"integer","title":"Cashflow Count","default":0},"last_cashflow_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Last Cashflow Date"},"attention":{"items":{"type":"string"},"type":"array","title":"Attention","description":"Data-quality flags: 'mark_stale' (mark older than 12 months), 'no_mark_reported', 'no_cashflow_schedule', 'called_unknown'."}},"type":"object","required":["commitment_id","fund_name","status","vehicle_kind","commitment_amount"],"title":"PublicFundPosition","description":"One LP fund commitment with null-honest derived economics."},"PublicFundsBookTotals":{"properties":{"fund_count":{"type":"integer","title":"Fund Count","default":0},"manager_count":{"type":"integer","title":"Manager Count","default":0},"oldest_vintage_year":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Oldest Vintage Year"},"total_committed":{"type":"number","title":"Total Committed","default":0.0},"total_called":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Total Called","description":"Sum over positions reporting it; null when none do."},"total_distributed":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Total Distributed"},"total_nav":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Total Nav"},"total_unfunded":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Total Unfunded"},"book_tvpi":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Book Tvpi","description":"From covered sums only; null with zero coverage."},"book_dpi":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Book Dpi"},"positions_with_called":{"type":"integer","title":"Positions With Called","description":"Coverage: positions that report called capital.","default":0},"positions_with_nav":{"type":"integer","title":"Positions With Nav","default":0},"positions_with_distributed":{"type":"integer","title":"Positions With Distributed","default":0}},"type":"object","title":"PublicFundsBookTotals","description":"Aggregates over the org's LP book, with explicit coverage counts."},"PublicMarkPoint":{"properties":{"as_of_date":{"type":"string","format":"date","title":"As Of Date"},"nav":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Nav"},"called_capital":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Called Capital"},"distributed_capital":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Distributed Capital"},"tvpi":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Tvpi","description":"(distributed + NAV) / called at this date; null when the point's inputs are missing."},"source":{"type":"string","title":"Source","description":"'statement' or 'manual'."}},"type":"object","required":["as_of_date","source"],"title":"PublicMarkPoint","description":"One dated point in a commitment's mark history."},"PublicMetricPoint":{"properties":{"value":{"type":"number","title":"Value"},"unit":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Unit"},"currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Currency"},"statement_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Statement Date","description":"When the figure was measured. Null when the source never dated it — undated points rank last and carry no time claim."},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source","description":"How the value entered: 'manual', 'extraction', or a connector."}},"type":"object","required":["value"],"title":"PublicMetricPoint","description":"One dated point in a company's metric history."},"PublicPortfolioCompany":{"properties":{"company_id":{"type":"string","title":"Company Id","description":"Stable portfolio-company identifier."},"name":{"type":"string","title":"Name"},"website":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Website"},"sector":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sector"},"stage":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stage","description":"Company stage, e.g. 'Seed', 'Series A'."},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status","description":"Investment status, e.g. 'active', 'exited'. Open vocabulary."},"fund_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fund Name","description":"The firm's fund this holding sits in."},"holding_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Holding Type","description":"'direct_company' or 'fund_commitment'."},"investment_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Investment Date"},"ownership_percentage":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Ownership Percentage"},"invested":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Invested","description":"Total invested per the position ledger; null when unrecorded."},"current_valuation":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Current Valuation","description":"Current fair value per the position ledger; null when unmarked."},"value_multiple":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Value Multiple","description":"Blended fair value / invested; null when unknown."},"position_count":{"type":"integer","title":"Position Count","description":"Ledger positions (rounds/vehicles) behind the economics.","default":0},"metrics":{"additionalProperties":{"$ref":"#/components/schemas/PublicPortfolioMetric"},"type":"object","title":"Metrics","description":"Latest actuals keyed by metric: arr, mrr, cash_on_hand, monthly_burn, runway_months, growth_rate, ndr, number_of_customers. A key is absent when the company has never reported that metric."}},"type":"object","required":["company_id","name"],"title":"PublicPortfolioCompany","description":"One portfolio holding with ledger economics and latest metrics."},"PublicPortfolioMetric":{"properties":{"value":{"type":"number","title":"Value"},"unit":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Unit","description":"e.g. 'usd', 'months', 'percent', 'count'."},"currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Currency"},"statement_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Statement Date","description":"When the figure was measured (statement/report date). Null when the source never dated it — treat undated figures with care."}},"type":"object","required":["value"],"title":"PublicPortfolioMetric","description":"One latest-actual operating metric for a portfolio company."},"PublicResearchCitation":{"properties":{"url":{"type":"string","title":"Url"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"}},"type":"object","required":["url"],"title":"PublicResearchCitation"},"PublicWarmPath":{"properties":{"contact_id":{"type":"string","title":"Contact Id"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"domain":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Domain"},"warmth":{"type":"number","title":"Warmth","description":"Decayed warmth in [0, 1]: strength/100 × exp(-days_since_last_touch/180)."},"strength_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Strength Score","description":"Raw relationship strength, 0-100."},"relationship":{"anyOf":[{"type":"string","enum":["strong","moderate","weak","dormant"]},{"type":"null"}],"title":"Relationship"},"path_owner":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Path Owner","description":"Display name of the org member who owns this edge (provenance)."},"owner_user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Owner User Id"}},"type":"object","required":["contact_id","warmth"],"title":"PublicWarmPath","description":"One warm path: a contact plus the org's best relationship edge to them."},"PublicWebhookDelivery":{"properties":{"delivery_id":{"type":"string","title":"Delivery Id","description":"Also the `webhook-id` header — dedupe on it."},"event_type":{"type":"string","title":"Event Type"},"entity_id":{"type":"string","title":"Entity Id"},"status":{"type":"string","title":"Status","description":"'pending' | 'delivered' | 'failed'."},"attempts":{"type":"integer","title":"Attempts"},"response_status":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Response Status"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"delivered_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Delivered At"}},"type":"object","required":["delivery_id","event_type","entity_id","status","attempts","created_at"],"title":"PublicWebhookDelivery","description":"One delivery attempt record from the ledger."},"PublicWebhookEndpoint":{"properties":{"webhook_id":{"type":"string","title":"Webhook Id"},"url":{"type":"string","title":"Url"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"is_active":{"type":"boolean","title":"Is Active"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["webhook_id","url","is_active","created_at"],"title":"PublicWebhookEndpoint","description":"One registered endpoint — secret omitted by design."},"ReachCandidate":{"properties":{"candidate_id":{"type":"string","title":"Candidate Id"},"full_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Full Name"},"linkedin_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Linkedin Url"},"headline":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Headline"},"current_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Current Title"},"current_company":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Current Company"},"location":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Location"},"candidate_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Candidate Type","description":"LLM-classified: founder / builder / operator / co_investor / lp; null = not classified."},"fit_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Fit Score"},"fit_reasons":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Fit Reasons"},"path_quality":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Path Quality"},"is_proxy_first_degree":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Proxy First Degree"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"first_seen_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"First Seen At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["candidate_id"],"title":"ReachCandidate","description":"One precomputed reach fan-out candidate (proxy first/second degree).\n\nCandidates are produced by background fan-out runs, never on request —\nthis read is a plain table serve. ``bridges`` (raw path legs), taste\njudgments, and photo URLs are internal and deliberately not exposed."},"ReachCandidatesResponse":{"properties":{"scope":{"type":"string","const":"key_user","title":"Scope","description":"Fan-out runs are anchored on the API key's user, not the org.","default":"key_user"},"candidates":{"items":{"$ref":"#/components/schemas/ReachCandidate"},"type":"array","title":"Candidates"},"as_of":{"type":"string","format":"date-time","title":"As Of"}},"type":"object","required":["candidates","as_of"],"title":"ReachCandidatesResponse"},"ResearchDetailResponse":{"properties":{"research_id":{"type":"string","title":"Research Id"},"status":{"type":"string","enum":["queued","running","succeeded","failed"],"title":"Status"},"progress":{"anyOf":[{"$ref":"#/components/schemas/ResearchProgress"},{"type":"null"}],"description":"Live stage + percent while the run executes; null after."},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary"},"content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content","description":"The full report as Markdown; null until succeeded."},"citations":{"items":{"$ref":"#/components/schemas/PublicResearchCitation"},"type":"array","title":"Citations"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completed At"},"as_of":{"type":"string","format":"date-time","title":"As Of"}},"type":"object","required":["research_id","status","as_of"],"title":"ResearchDetailResponse","description":"One research run: lifecycle plus the report when finished."},"ResearchProgress":{"properties":{"stage":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stage","description":"'pending' | 'baseline' | 'deepening' | 'content' | 'synthesis' | 'complete' | 'recovered'."},"percent":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Percent","description":"Monotonic completion in [0, 1]."}},"type":"object","title":"ResearchProgress","description":"Coarse live progress while a run executes."},"ResearchRequest":{"properties":{"query":{"type":"string","maxLength":20000,"minLength":1,"title":"Query","description":"The research question, e.g. 'Map the warehouse-automation competitive landscape and sizing for mid-market 3PLs.'"},"idempotency_key":{"type":"string","maxLength":512,"minLength":1,"title":"Idempotency Key","description":"Required. Reuse the same key to safely retry — you get the same run back, never a second spend. Use a fresh key for a genuinely new question."}},"type":"object","required":["query","idempotency_key"],"title":"ResearchRequest","description":"Submit a research question for a deep-research run."},"ResearchSubmitResponse":{"properties":{"research_id":{"type":"string","title":"Research Id"},"status":{"type":"string","enum":["queued","running","succeeded","failed"],"title":"Status"},"status_url":{"type":"string","title":"Status Url","description":"Poll GET here until status is 'succeeded' or 'failed'. Runs take minutes (up to 30) — poll with generous backoff."},"result_url":{"type":"string","title":"Result Url"},"as_of":{"type":"string","format":"date-time","title":"As Of"}},"type":"object","required":["research_id","status","status_url","result_url","as_of"],"title":"ResearchSubmitResponse","description":"Accepted research submission (HTTP 202)."},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"WarmthLookupRequest":{"properties":{"contacts":{"items":{"type":"string"},"type":"array","maxItems":100,"minItems":1,"title":"Contacts","description":"Contact identifiers — email addresses, Originalis contact ids, LinkedIn URLs, or names. Max 100 per request."}},"type":"object","required":["contacts"],"title":"WarmthLookupRequest"},"WarmthLookupResponse":{"properties":{"scope":{"type":"string","const":"org_shared","title":"Scope","default":"org_shared"},"results":{"items":{"$ref":"#/components/schemas/WarmthLookupResult"},"type":"array","title":"Results"},"as_of":{"type":"string","format":"date-time","title":"As Of"}},"type":"object","required":["results","as_of"],"title":"WarmthLookupResponse"},"WarmthLookupResult":{"properties":{"query":{"type":"string","title":"Query"},"contact_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contact Id"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"domain":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Domain"},"warmth":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Warmth"},"strength_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Strength Score"},"relationship":{"anyOf":[{"type":"string","enum":["strong","moderate","weak","dormant"]},{"type":"null"}],"title":"Relationship"},"path_owner":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Path Owner"},"owner_user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Owner User Id"},"unavailable_reason":{"anyOf":[{"type":"string","enum":["contact_not_found","no_relationship_data"]},{"type":"null"}],"title":"Unavailable Reason"}},"type":"object","required":["query"],"title":"WarmthLookupResult"},"WebhookCreateRequest":{"properties":{"url":{"type":"string","maxLength":2048,"minLength":12,"title":"Url","description":"HTTPS endpoint that will receive signed event POSTs. Must resolve to a public address."},"description":{"anyOf":[{"type":"string","maxLength":300},{"type":"null"}],"title":"Description","description":"What this endpoint feeds."}},"type":"object","required":["url"],"title":"WebhookCreateRequest"},"WebhookCreateResponse":{"properties":{"webhook_id":{"type":"string","title":"Webhook Id"},"url":{"type":"string","title":"Url"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"secret":{"type":"string","title":"Secret","description":"whsec_-prefixed signing secret — shown ONCE, store it now. Verify deliveries per the Standard Webhooks scheme."},"events":{"items":{"type":"string"},"type":"array","title":"Events","description":"Event types this endpoint will receive (all of them)."},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["webhook_id","url","secret","events","created_at"],"title":"WebhookCreateResponse","description":"The ONLY response that ever carries the signing secret."},"WebhookDeleteResponse":{"properties":{"webhook_id":{"type":"string","title":"Webhook Id"},"deleted":{"type":"boolean","const":true,"title":"Deleted","default":true}},"type":"object","required":["webhook_id"],"title":"WebhookDeleteResponse"},"WebhookDeliveriesResponse":{"properties":{"webhook_id":{"type":"string","title":"Webhook Id"},"deliveries":{"items":{"$ref":"#/components/schemas/PublicWebhookDelivery"},"type":"array","title":"Deliveries"},"as_of":{"type":"string","format":"date-time","title":"As Of"}},"type":"object","required":["webhook_id","deliveries","as_of"],"title":"WebhookDeliveriesResponse"},"WebhookListResponse":{"properties":{"scope":{"type":"string","const":"org","title":"Scope","default":"org"},"webhooks":{"items":{"$ref":"#/components/schemas/PublicWebhookEndpoint"},"type":"array","title":"Webhooks"},"as_of":{"type":"string","format":"date-time","title":"As Of"}},"type":"object","required":["webhooks","as_of"],"title":"WebhookListResponse"},"WhoKnowsResponse":{"properties":{"target":{"$ref":"#/components/schemas/WhoKnowsTarget"},"scope":{"type":"string","const":"org_shared","title":"Scope","description":"Warm paths are pooled across org members who opted into network sharing; each path names its owner.","default":"org_shared"},"paths":{"items":{"$ref":"#/components/schemas/PublicWarmPath"},"type":"array","title":"Paths"},"unavailable_reason":{"anyOf":[{"type":"string","const":"no_warm_paths"},{"type":"null"}],"title":"Unavailable Reason"},"as_of":{"type":"string","format":"date-time","title":"As Of"}},"type":"object","required":["target","paths","as_of"],"title":"WhoKnowsResponse"},"WhoKnowsTarget":{"properties":{"domain":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Domain"},"person":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Person"}},"type":"object","title":"WhoKnowsTarget"}},"securitySchemes":{"ApiKeyBearer":{"type":"http","scheme":"bearer","description":"An Originalis API key: `Authorization: Bearer ak_...`"},"ApiKeyHeader":{"type":"apiKey","in":"header","name":"X-API-Key"}}},"servers":[{"url":"https://dev-originalis-api.originalis.ai"}],"tags":[{"name":"public-network-v1","x-displayName":"Network Intelligence","description":"Your firm's relationship graph, evidenced by your team's own emails and calendars. Warm paths pool across org members who opted into network sharing, and every path names the teammate who owns the relationship."},{"name":"public-deals-v1","x-displayName":"Deals","description":"The org's deal workspace — the same cohort the in-app pipeline shows. Listings are offset-paginated for full sweeps; the detail read returns the structured record for one deal."},{"name":"public-founders-v1","x-displayName":"Founders","description":"Programmatic founder assessment — the research-agent pipeline behind the in-app founder surface. Deduped per org: an already-assessed founder returns the existing analysis, never a second spend."},{"name":"public-research-v1","x-displayName":"Research","description":"Programmatic deep research: submit a question, get a citation-backed Markdown report. Idempotent by key; runs take minutes and execute asynchronously."},{"name":"public-portfolio-v1","x-displayName":"Portfolio","description":"The org's portfolio book. Economics come from the fund-investment ledger and metrics from the canonical latest-actuals resolver — the same sources the in-app hub reads."},{"name":"public-funds-v1","x-displayName":"Funds (LP Book)","description":"LP fund commitments: positions with null-honest derived economics (TVPI/DPI/unfunded), coverage-counted book totals, and the dated cashflow ledger for reconciliation."},{"name":"public-webhooks-v1","x-displayName":"Webhooks","description":"Signed event delivery when actions reach terminal states — Standard Webhooks conventions, so off-the-shelf verifiers work. Secrets are shown once; a delivery ledger backs debugging."}],"x-tagGroups":[{"name":"Network","tags":["public-network-v1"]},{"name":"Deal Flow","tags":["public-deals-v1","public-founders-v1"]},{"name":"Research","tags":["public-research-v1"]},{"name":"Back Office","tags":["public-portfolio-v1","public-funds-v1"]},{"name":"Platform","tags":["public-webhooks-v1"]}],"security":[{"ApiKeyBearer":[]},{"ApiKeyHeader":[]}]}