{"openapi":"3.1.0","info":{"title":"deep-sieve","version":"sdk-v0.3.3-46-g5304248b"},"paths":{"/v1/me":{"get":{"tags":["v1-meta"],"summary":"Get Me","description":"Identity + the plan and balance the caller is operating under.\n\n``plan`` and ``balance_cents`` are here rather than behind a billing scope\non purpose: an autonomous caller can't open the billing page, so without\nthem it discovers its spending position by being refused mid-workflow. This\nis the same read the cost estimate uses, so the two can't disagree.\n\n``balance_cents: null`` means UNKNOWN (billing not configured, or a\nMetronome read failed) — never zero. Clients must not substitute a default.","operationId":"v1-meta_get_me","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response V1-Meta Get Me"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/keys":{"post":{"tags":["v1-keys"],"summary":"Create Key","operationId":"v1-keys_create_key","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateKeyRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["v1-keys"],"summary":"List Keys","operationId":"v1-keys_list_keys","parameters":[{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Limit"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response V1-Keys List Keys"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/keys/{key_id}/rotate":{"post":{"tags":["v1-keys"],"summary":"Rotate Key","description":"Mint a replacement with clamped grants; old key gets a 24h grace window.","operationId":"v1-keys_rotate_key","parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","title":"Key Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/keys/{key_id}":{"delete":{"tags":["v1-keys"],"summary":"Revoke Key","operationId":"v1-keys_revoke_key","parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","title":"Key Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response V1-Keys Revoke Key"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/research/runs/estimate":{"post":{"tags":["v1-research"],"summary":"Estimate Run","description":"What this run would cost, and whether the caller can afford it.\n\nAn autonomous caller has no billing page to look at. Without this it learns\nthe price by being charged, or learns it can't afford the run from a 402\nhalfway through a workflow it has already committed to. Deliberately gated\non ``runs:read``, not a billing scope: refusing to tell an agent the price of\nthe thing it is about to buy is not a security control.\n\n``affordable`` is null when the balance is genuinely unknown (no billing\nconfigured, or a Metronome read failed) — never guessed, because an agent\nthat trusts a fabricated \"yes\" strands its workflow at the charge.","operationId":"v1-research_estimate_run","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EstimateRunRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response V1-Research Estimate Run"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/research/runs":{"post":{"tags":["v1-research"],"summary":"Create Run","operationId":"v1-research_create_run","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateRunRequest"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["v1-research"],"summary":"List Runs","operationId":"v1-research_list_runs","parameters":[{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Limit"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response V1-Research List Runs"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/research/runs/{run_id}":{"get":{"tags":["v1-research"],"summary":"Get Run","operationId":"v1-research_get_run","parameters":[{"name":"run_id","in":"path","required":true,"schema":{"type":"string","title":"Run Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/research/runs/{run_id}/cancel":{"post":{"tags":["v1-research"],"summary":"Cancel Run","operationId":"v1-research_cancel_run","parameters":[{"name":"run_id","in":"path","required":true,"schema":{"type":"string","title":"Run Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response V1-Research Cancel Run"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/research/monitoring":{"get":{"tags":["v1-research"],"summary":"List Monitoring","description":"Every actively-monitored report, what it costs, and what it duplicates.\n\nAn agent that creates reports on a schedule is the caller most likely to\naccumulate overlapping monitoring — re-researching a watchlist into a fresh\nreport rather than extending the old one is the natural loop, and it\nsilently doubles the recurring cost. Nothing in the product could see that\nbefore this endpoint.\n\nTwo states the word \"monitored\" hides, both returned per report:\n\n* `in_free_window` — inside its free 30 days, costing nothing yet;\n* `billing` — past that, spending units every day.\n\n`fully_covered_by` lists reports whose in-TTL entity set is a SUPERSET of\nthis one's: everything here is already kept fresh over there, so these units\nbuy nothing. Reported only for reports that are actually BILLING — warning\nabout a free window would be noise.\n\nADVISORY, and deliberately not destructive: `warnings` carries INFO entries,\nand nothing is cancelled. Which report to keep is a judgement about what the\ncaller is watching, not something to infer from a set comparison. Turn one\noff with `PATCH /api/research/runs/{id}/monitoring`.","operationId":"v1-research_list_monitoring","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response V1-Research List Monitoring"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/webhooks":{"post":{"tags":["v1-webhooks"],"summary":"Create Webhook","operationId":"v1-webhooks_create_webhook","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateWebhookRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["v1-webhooks"],"summary":"List Webhooks","operationId":"v1-webhooks_list_webhooks","parameters":[{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Limit"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response V1-Webhooks List Webhooks"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/webhooks/{endpoint_id}":{"delete":{"tags":["v1-webhooks"],"summary":"Disable Webhook","operationId":"v1-webhooks_disable_webhook","parameters":[{"name":"endpoint_id","in":"path","required":true,"schema":{"type":"string","title":"Endpoint Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response V1-Webhooks Disable Webhook"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["v1-webhooks"],"summary":"Get Webhook","operationId":"v1-webhooks_get_webhook","parameters":[{"name":"endpoint_id","in":"path","required":true,"schema":{"type":"string","title":"Endpoint Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response V1-Webhooks Get Webhook"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["v1-webhooks"],"summary":"Update Webhook","description":"Change URL/events in place — delete+recreate would mint a new secret and\nforce an integrator redeploy (QA M4.1).","operationId":"v1-webhooks_update_webhook","parameters":[{"name":"endpoint_id","in":"path","required":true,"schema":{"type":"string","title":"Endpoint Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateWebhookRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response V1-Webhooks Update Webhook"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/webhooks/{endpoint_id}/ping":{"post":{"tags":["v1-webhooks"],"summary":"Ping Webhook","description":"Queue a test `ping` event (admin — it triggers an outbound POST).","operationId":"v1-webhooks_ping_webhook","parameters":[{"name":"endpoint_id","in":"path","required":true,"schema":{"type":"string","title":"Endpoint Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response V1-Webhooks Ping Webhook"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/webhooks/{endpoint_id}/rotate":{"post":{"tags":["v1-webhooks"],"summary":"Rotate Webhook","description":"Mint a new signing secret, revealed once, and invalidate the old one\nIMMEDIATELY — the next delivery (`webhooks_out.deliver_once`) reads this\ncolumn at send time and signs with the new secret only.\n\nRotation is immediate rather than grace-windowed: `webhook_endpoints` has a\nsingle `secret` column and no grace infrastructure (unlike API keys), and a\ntrue overlap would need a shared-DB migration plus dual-signature emission.\nThe delivery loop retries with backoff, so the brief window until the\nintegrator deploys the new secret self-heals. A dual-signature grace window\nis tracked as a Fast-Follow (#1139).","operationId":"v1-webhooks_rotate_webhook","parameters":[{"name":"endpoint_id","in":"path","required":true,"schema":{"type":"string","title":"Endpoint Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response V1-Webhooks Rotate Webhook"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/webhooks/{endpoint_id}/enable":{"post":{"tags":["v1-webhooks"],"summary":"Enable Webhook","description":"Re-activate a disabled endpoint (the inverse of DELETE-disables). The\nsecret is unchanged, so the integrator's existing verifier keeps working.\nIdempotent: enabling an already-active endpoint returns it unchanged.","operationId":"v1-webhooks_enable_webhook","parameters":[{"name":"endpoint_id","in":"path","required":true,"schema":{"type":"string","title":"Endpoint Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response V1-Webhooks Enable Webhook"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/export":{"get":{"tags":["v1-data"],"summary":"Export Dataset","description":"Whole-dataset export. NDJSON is the agent default: line 1 is a metadata\nrecord carrying the Blueprint schema (so consumers can't hardcode columns\nagainst a schema the customer can change), then one record per row with\ncitations nested. CSV requires ?entity= and drops citations (documented).\n\n``workspace_id`` exports a SPECIFIC Blueprint by id without changing the\ncaller's active workspace (authorized: org ownership + viewer scope, draft\nrejected). Omitted, it exports the active workspace. The target schema is\nthreaded explicitly through the Blueprint load and every session, NOT via\nthe ambient tenant context — the response streams, and its generator runs\nafter this function returns, once that context is torn down; a contextvar\nwrap would export the wrong tenant silently.","operationId":"v1-data_export_dataset","parameters":[{"name":"format","in":"query","required":false,"schema":{"type":"string","pattern":"^(ndjson|json|csv)$","default":"ndjson","title":"Format"}},{"name":"entity","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Entity"}},{"name":"receipts","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Receipts"}},{"name":"workspace_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workspace Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/reports":{"get":{"tags":["v1-reports"],"summary":"List Reports V1","operationId":"v1-reports_list_reports_v1","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response V1-Reports List Reports V1"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["v1-reports"],"summary":"Create Report V1","operationId":"v1-reports_create_report_v1","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response V1-Reports Create Report V1"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/reports/columns":{"get":{"tags":["v1-reports"],"summary":"Report Columns V1","description":"The valid column vocabulary per entity — call before building a config\n(like GET /v1/blueprints/{id}, the schema is customer-defined; never guess\ncolumns).","operationId":"v1-reports_report_columns_v1","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response V1-Reports Report Columns V1"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/reports/{report_id}":{"get":{"tags":["v1-reports"],"summary":"Get Report V1","operationId":"v1-reports_get_report_v1","parameters":[{"name":"report_id","in":"path","required":true,"schema":{"type":"string","title":"Report Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response V1-Reports Get Report V1"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["v1-reports"],"summary":"Update Report V1","operationId":"v1-reports_update_report_v1","parameters":[{"name":"report_id","in":"path","required":true,"schema":{"type":"string","title":"Report Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response V1-Reports Update Report V1"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["v1-reports"],"summary":"Delete Report V1","operationId":"v1-reports_delete_report_v1","parameters":[{"name":"report_id","in":"path","required":true,"schema":{"type":"string","title":"Report Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response V1-Reports Delete Report V1"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/reports/{report_id}/tabs/{tab_id}/data":{"get":{"tags":["v1-reports"],"summary":"Report Tab Data V1","operationId":"v1-reports_report_tab_data_v1","parameters":[{"name":"report_id","in":"path","required":true,"schema":{"type":"string","title":"Report Id"}},{"name":"tab_id","in":"path","required":true,"schema":{"type":"string","title":"Tab Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response V1-Reports Report Tab Data V1"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/blueprints/drafts":{"post":{"tags":["v1-blueprints"],"summary":"Start Onboarding","operationId":"v1-blueprints_start_onboarding","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/blueprints/drafts/{session_id}":{"get":{"tags":["v1-blueprints"],"summary":"Get Onboarding","operationId":"v1-blueprints_get_onboarding","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/blueprints/drafts/{session_id}/answers":{"post":{"tags":["v1-blueprints"],"summary":"Answer Onboarding","operationId":"v1-blueprints_answer_onboarding","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response V1-Blueprints Answer Onboarding"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/blueprints/drafts/{session_id}/adjust":{"post":{"tags":["v1-blueprints"],"summary":"Adjust Onboarding","description":"DEPRECATED (#1204) — use ``POST …/chat``, which returns the written reply\nand the measured changes synchronously. Kept, unchanged, because v1 is\nadditive-only: ask the Blueprint-inference agent for a natural-language\nadjustment to the draft. 202 — poll the session until status returns to\n`ready`, then re-review the draft.","operationId":"v1-blueprints_adjust_onboarding","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response V1-Blueprints Adjust Onboarding"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/blueprints/drafts/{session_id}/chat":{"post":{"tags":["v1-blueprints"],"summary":"Chat Onboarding","description":"One SYNCHRONOUS adjustments-chat turn on the draft (#1204): the model's\nwritten reply (what changed / not done / questions), the MEASURED\n``changes[]`` with data-safety tiers, and whether the draft moved.\nSupersedes ``/adjust`` (202 + poll, no reply). ``message_id`` is the\nidempotency key — a repeat returns the stored turn without a model call;\nomitted, the server mints one and returns it. Never a 5xx for a model\nproblem: a timeout or an invalid spec is a 200 with ``applied:false`` and a\ntyped ``not_applied_reason``.","operationId":"v1-blueprints_chat_onboarding","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response V1-Blueprints Chat Onboarding"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["v1-blueprints"],"summary":"Get Onboarding Chat","description":"The persisted adjustments-chat thread for the session (#1204). Read\nscope, like the sibling `GET …/onboarding/{id}` — a read-only key that can\nsee the draft can see what was asked of it.","operationId":"v1-blueprints_get_onboarding_chat","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response V1-Blueprints Get Onboarding Chat"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/blueprints/drafts/{session_id}/approve":{"post":{"tags":["v1-blueprints"],"summary":"Approve Onboarding","description":"Approve the draft: validate → CREATE TABLEs → activate. The reviewing\nagent should present the draft to its human first when acting on their\nbehalf — approval instantiates real schema.","operationId":"v1-blueprints_approve_onboarding","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response V1-Blueprints Approve Onboarding"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/blueprints":{"get":{"tags":["v1-blueprints"],"summary":"List Blueprints","description":"**The Blueprints this caller can see**, and which one is active.\n\n\"See\", not \"read\": a `draft` row is listed so an agent can find and resume\nit, and the reads below refuse it with a `409`. `has_data` is the field that\nanswers \"will a read work\".\n\nStart here. Every other read on this surface is scoped to exactly one\nBlueprint, and an agent cannot guess a customer-defined id — so this is the\ncall that turns \"the active Blueprint\" (ambient, invisible, and wrong the\nmoment a customer has two) into an explicit choice the caller states.\n\nThe list is not paginated: it is one row per Blueprint an organization owns,\na count bounded by how many domains a customer has defined. It carries the\nstandard list envelope anyway so a client that pages generically does not\nspecial-case it.","operationId":"v1-blueprints_list_blueprints","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response V1-Blueprints List Blueprints"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/blueprints/{blueprint_id}":{"get":{"tags":["v1-blueprints"],"summary":"Get Blueprint","description":"**Read one Blueprint's schema** — its entities and their columns.\n\nAn agent cannot guess a customer-defined schema, so this is the discovery\ncall to make before any data read: treat what it returns as data rather than\na constant, because the customer can change their Blueprint.\n\nUnlike the ambient form, this names the Blueprint it answered for. Two\nBlueprints in one organization describe different domains with different\nentities, and a schema read against the wrong one is not an error — it is a\nplausible answer to a question you did not ask.","operationId":"v1-blueprints_get_blueprint","parameters":[{"name":"blueprint_id","in":"path","required":true,"schema":{"type":"string","title":"Blueprint Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response V1-Blueprints Get Blueprint"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/blueprints/{blueprint_id}/entities/{entity_key}":{"get":{"tags":["v1-blueprints"],"summary":"Read Blueprint Entity","description":"Rows of one entity, in the Blueprint you name.\n\n**`entities`, not `data`** — the Blueprint declares entities, the product\nsays entities, and the error text an agent hits when it guesses a key\nalready tells it to list entities.\n\nThe free-preview row cap applies to every entity read, from the same\nfunction: this endpoint must not become the paywall bypass.","operationId":"v1-blueprints_read_blueprint_entity","parameters":[{"name":"blueprint_id","in":"path","required":true,"schema":{"type":"string","title":"Blueprint Id"}},{"name":"entity_key","in":"path","required":true,"schema":{"type":"string","title":"Entity Key"}},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Limit"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor"}},{"name":"updated_since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated Since"}},{"name":"fields","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"comma-separated column subset","title":"Fields"},"description":"comma-separated column subset"},{"name":"receipts","in":"query","required":false,"schema":{"type":"boolean","description":"nest per-cell citations","default":false,"title":"Receipts"},"description":"nest per-cell citations"},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response V1-Blueprints Read Blueprint Entity"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/blueprints/{blueprint_id}/export":{"get":{"tags":["v1-blueprints"],"summary":"Export Blueprint","description":"Whole-dataset export of the Blueprint you name.\n\nDelegates to `GET /v1/export`'s handler with the Blueprint as its\n``workspace_id`` — the same streaming, the same cap headers, the same\nexplicitly-threaded schema. ⚠️ Do not reimplement the stream here: its\ngenerator runs AFTER this request's tenant context is torn down, so a\nhand-rolled copy that wrapped a contextvar would export the wrong tenant\nwith no error and no way to tell from the output.","operationId":"v1-blueprints_export_blueprint","parameters":[{"name":"blueprint_id","in":"path","required":true,"schema":{"type":"string","title":"Blueprint Id"}},{"name":"format","in":"query","required":false,"schema":{"type":"string","pattern":"^(ndjson|json|csv)$","default":"ndjson","title":"Format"}},{"name":"entity","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Entity"}},{"name":"receipts","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Receipts"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/blueprints/{blueprint_id}/propose":{"post":{"tags":["v1-blueprints"],"summary":"Propose Blueprint Change","description":"Ask what a plain-language change to the Blueprint you NAME would be (#1266).\n\n⚠️ **This was ``POST /v1/blueprints/propose``, against the ambient active\nBlueprint, and moving it was a behaviour change rather than a rename**\n(#1313). The old path made no claim about which Blueprint answered; this one\ndoes, in the id you send — so the id reaches the baseline the proposal is\nbuilt from AND the workspace whose live tables decide the tier. An id that\nreached only the first would be decorative in the way that looks fixed: the\nwrong Blueprint answering successfully.\n\n🛑 **Changes nothing.** No DDL, no activation, and no stored proposal:\ncalling this twice leaves the workspace exactly as calling it zero times\ndoes.\n\n**Scopes: ``blueprint:propose`` AND ``data:read``** (#1353). The response\ncarries the named Blueprint's full spec, so it asks the same rights as\nreading that spec directly with ``GET /v1/blueprints/{blueprint_id}``. Keys\nminted with the ``agent`` preset hold both; a key asking for\n``blueprint:propose`` alone is minted **with** ``data:read`` attached rather\nthan being refused later — unless the MINTING key itself lacks ``data:read``,\nin which case minting refuses and names the scope that pulled it in. The mint\nresponse echoes what it granted.\n\n⚠️ **It is not FREE, though — send an ``Idempotency-Key``** (#1300). Every\ncall is a model call somebody pays for, and this route holds the connection\nopen for the whole of it. With a key, a retry after a dropped connection\nreplays the stored answer instead of buying a second one. Without a key\nthis route behaves exactly as it did before, so an existing caller is\nunaffected — and unprotected.\n\nThe ledger row a key writes lives in the control plane\n(``public.idempotency_keys``), **not** in the workspace, which is why the\nparagraph above is still true. Reusing a key with a different payload is a\n422; retrying while the first call is genuinely still running is a 409 with\n``Retry-After`` — retry it, do not mint a new key, because a new key is a\nsecond charge.\n\n**What it is for.** An agent that hits a column the named Blueprint lacks can\nfind out for itself whether adding it works and what tier it classifies as,\nbefore spending a human's attention. That is the half an agent should do on\nits own. The other half is not its to do — applying is\n``require_blueprint_edit``, which is ``human_only=True`` and refuses every\nkey regardless of scope. **Propose and apply are two scopes apart on\npurpose, not one scope with two levels.**\n\n⚠️ **Decide \"does this column exist\" with ``GET /v1/blueprints/{id}``, never\n``GET /v1/reports/columns``.** The latter answers a different question and\nis wrong in both directions for this one: it strips the always-shown\ncolumns (``name``, the source links) — real columns, and exactly the ones a\nrun reports as unresearched — and it appends relationship pills\n(``type: \"relation\"``) that are display constructs rather than columns.\n\n**Handing it over.** There is deliberately no proposal id and no link to\none. Offer your human ``{app_url}/blueprint?ask=<your request>`` — from the\n``app_url`` on ``/v1/me`` — and their own chat re-derives the proposal\nthey review and apply.\n\n🛑 **The editor that link opens works on THEIR active Blueprint, not on the\none you named here** (#1313). So **always say which Blueprint you proposed\nagainst** — by the ``name`` from ``GET /v1/blueprints`` — and tell them to\nswitch to it before opening the link. The response echoes ``blueprint_id``\nfor exactly that.\n\n⚠️ **Unconditionally, and you cannot shortcut it with a check.** Nothing you\ncan read tells you which Blueprint a *person* is looking at: your active\nworkspace is your key's, resolved from its own pin or the org's oldest\nworkspace, while theirs is their own switcher setting. This route briefly\nreturned a ``blueprint_is_active`` flag; it compared against YOUR workspace\nwhile its documentation described THEIRS, so it read ``true`` in exactly the\ncase that needed the warning. It was removed rather than renamed — a check\nthat answers a neighbouring question is worse than no check, because it\nstops you doing the thing that always works.\n\n⚠️ **Offer that link; never promise it resolves.** ``app_url`` falls back to\n``http://localhost:3002`` when a deployment has not set\n``POST_LOGIN_REDIRECT``, which is a well-formed URL that is wrong and cannot\nbe detected as wrong from outside. Hosted MCP needs a *different* setting,\nso the likeliest configuration to be talking to an agent is exactly the one\nthat can serve a working MCP surface beside a localhost ``app_url``.\n\n⚠️ **Every call here is a SINGLE TURN against the Blueprint you name.**\nUnlike the web route, this one takes no ``thread`` and no working ``spec``,\nand ignores them if sent. That is the design, not a limitation: it\nguarantees your inputs are the ones the human's chat will have, so the\nproposal they see is the one you saw — provided they are looking at the same\nBlueprint, which is what the unconditional instruction above is for: name the\nBlueprint you proposed against and tell them to switch to it.\n\n⚠️ This sentence used to end *\"which is what ``blueprint_is_active`` is\nfor\"*. That field was REMOVED a few hundred lines below (it compared against\nthe CALLER's workspace while claiming to describe the HUMAN's), and this\nreference outlived it — so the docstring went on telling agents to rely on a\nfield the response no longer carries. Deleting a field does not delete the\nsentences that depend on it, and nothing goes red when one is orphaned.\n\nA ``thread`` would have let you build a proposal their chat **cannot**\nreproduce — it re-derives with an empty thread from the single request you\nhand over — and the only remedy would have been a warning telling you not to\nuse the feature. Removing the lossy case beats documenting it. Hand over one\nself-contained request and the re-derivation is faithful by construction.\n\nA model problem is never a 5xx: a timeout, a transport failure or a spec\nthat fails validation all return 200 with no proposal and a typed\n``not_applied_reason``.","operationId":"v1-blueprints_propose_blueprint_change","parameters":[{"name":"blueprint_id","in":"path","required":true,"schema":{"type":"string","title":"Blueprint Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/research/runs/{run_id}/chat/messages":{"post":{"tags":["v1-chat"],"summary":"Send Message","description":"Ask the research agent about this run's report, or request a change.\n\n202 — the turn runs asynchronously (seconds, not minutes). Poll\n``GET /v1/research/runs/{run_id}/chat`` until the trailing agent message\nleaves ``status: \"streaming\"``.","operationId":"v1-chat_send_message","parameters":[{"name":"run_id","in":"path","required":true,"schema":{"type":"string","title":"Run Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SendChatMessageRequest"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/research/runs/{run_id}/chat":{"get":{"tags":["v1-chat"],"summary":"Get Thread","description":"The whole conversation — human-sent and agent-sent alike, in order.\n\n``in_flight`` is true while the research agent is composing. Each message\ncarries ``sent_via`` (`app` | `api`) and, for API-sent ones,\n``sent_by_key``; ``actions`` lists any data changes an answer applied,\neach revertible by id.","operationId":"v1-chat_get_thread","parameters":[{"name":"run_id","in":"path","required":true,"schema":{"type":"string","title":"Run Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/chat/actions/{action_id}/revert":{"post":{"tags":["v1-chat"],"summary":"Revert Action","description":"Undo a data change a chat answer applied. Either side may revert.","operationId":"v1-chat_revert_action","parameters":[{"name":"action_id","in":"path","required":true,"schema":{"type":"string","title":"Action Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response V1-Chat Revert Action"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/audit":{"get":{"tags":["v1-audit"],"summary":"List Audit Events","description":"The org's audit trail, newest first.","operationId":"v1-audit_list_audit_events","parameters":[{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Limit"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor"}},{"name":"action","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"exact action match, e.g. webhook.created","title":"Action"},"description":"exact action match, e.g. webhook.created"},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"only events at or after this time","title":"Since"},"description":"only events at or after this time"},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response V1-Audit List Audit Events"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/auth/device/code":{"post":{"tags":["auth"],"summary":"Start Device Authorization","description":"Begin a device authorization. Unauthenticated by design (RFC 8628 §3.1).","operationId":"auth_start_device_authorization","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeviceCodeRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Auth Start Device Authorization"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/auth/device/token":{"post":{"tags":["auth"],"summary":"Claim Device Token","description":"Poll for the result. Returns the minted key exactly once on approval.","operationId":"auth_claim_device_token","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeviceTokenRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Auth Claim Device Token"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/members":{"get":{"tags":["v1-members"],"summary":"List Members","description":"The caller's org roster plus editor-seat usage.\n\nSmall and bounded (at most the editor limit plus free viewers), so it is not\ncursor-paged — but it still carries the v1 list envelope so an SDK consumer\nhandles it like every other list. ``seats`` is org-level, not per-row.","operationId":"v1-members_list_members","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response V1-Members List Members"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/blueprints/{blueprint_id}/entities/{entity_key}/columns/{column}/changes":{"get":{"tags":["v1-lineage"],"summary":"Read Column Changes","description":"Every recorded change to one column across records, newest first.\n\nEach entry carries a persistent ``cell_id`` for the cell it belongs to;\n``GET /v1/cells/{cell_id}/changes`` is that cell's own log.","operationId":"v1-lineage_read_column_changes","parameters":[{"name":"blueprint_id","in":"path","required":true,"schema":{"type":"string","title":"Blueprint Id"}},{"name":"entity_key","in":"path","required":true,"schema":{"type":"string","title":"Entity Key"}},{"name":"column","in":"path","required":true,"schema":{"type":"string","title":"Column"}},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Limit"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor"}},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Since"}},{"name":"record_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Record Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response V1-Lineage Read Column Changes"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/cells/{cell_id}/changes":{"get":{"tags":["v1-lineage"],"summary":"Read Cell Changes","description":"One cell's full change log, newest first — every evidence row ever\nwritten for it, with the link each writer recorded.","operationId":"v1-lineage_read_cell_changes","parameters":[{"name":"cell_id","in":"path","required":true,"schema":{"type":"string","title":"Cell Id"}},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Limit"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor"}},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Since"}},{"name":"include","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Include"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response V1-Lineage Read Cell Changes"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"CreateKeyRequest":{"properties":{"name":{"type":"string","maxLength":120,"minLength":1,"title":"Name"},"preset":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Preset","description":"agent | read_only | full"},"scopes":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Scopes"},"workspace_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workspace Id"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"},"budget_runs":{"anyOf":[{"type":"integer","minimum":1.0},{"type":"null"}],"title":"Budget Runs"},"budget_cents":{"anyOf":[{"type":"integer","minimum":1.0},{"type":"null"}],"title":"Budget Cents"}},"type":"object","required":["name"],"title":"CreateKeyRequest"},"CreateRunRequest":{"properties":{"query":{"anyOf":[{"type":"string","maxLength":2000,"minLength":3},{"type":"null"}],"title":"Query"},"seeds":{"anyOf":[{"items":{"type":"string"},"type":"array","minItems":1},{"type":"null"}],"title":"Seeds"},"guidance":{"anyOf":[{"type":"string","maxLength":4000},{"type":"null"}],"title":"Guidance"},"depth":{"type":"string","pattern":"^(standard|max)$","title":"Depth","default":"standard"},"monitored":{"type":"boolean","title":"Monitored","default":true},"additive_to":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Additive To"},"reuse_existing":{"type":"boolean","title":"Reuse Existing","default":false},"dry_run":{"type":"boolean","title":"Dry Run","default":false},"temporal_cutoff":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Temporal Cutoff"},"allowed_sources":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Allowed Sources"}},"type":"object","title":"CreateRunRequest","description":"Provide ``query`` (natural-language intent) or ``seeds`` (URLs/names).\n\n``query`` is run through the intake parser (#1045): it may name specific\nsubjects (→ a seeded run), ask for a whole-domain sweep (→ broad), or be\nsomething we can't read as a research request (→ 400, nothing charged). It\nmay also name @entity.column narrowings; ones this Blueprint lacks come back\nunder ``intake.ignored_refs`` rather than being dropped silently. ``seeds``\nis taken verbatim — no parse."},"CreateWebhookRequest":{"properties":{"url":{"type":"string","maxLength":2083,"minLength":1,"format":"uri","title":"Url"},"events":{"items":{"type":"string"},"type":"array","minItems":1,"title":"Events"}},"type":"object","required":["url","events"],"title":"CreateWebhookRequest"},"DeviceCodeRequest":{"properties":{"client_name":{"type":"string","maxLength":80,"title":"Client Name","default":"CLI"},"preset":{"type":"string","title":"Preset","default":"agent"}},"type":"object","title":"DeviceCodeRequest"},"DeviceTokenRequest":{"properties":{"device_code":{"type":"string","maxLength":200,"minLength":16,"title":"Device Code"}},"type":"object","required":["device_code"],"title":"DeviceTokenRequest"},"EstimateRunRequest":{"properties":{"depth":{"type":"string","pattern":"^(standard|max)$","title":"Depth","default":"standard"},"monitored":{"type":"boolean","title":"Monitored","default":true},"seeds":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Seeds"},"query":{"anyOf":[{"type":"string","maxLength":2000,"minLength":3},{"type":"null"}],"title":"Query"},"additive_to":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Additive To"},"allowed_sources":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Allowed Sources"}},"type":"object","title":"EstimateRunRequest","description":"What a run WOULD cost. Same shape as a create, minus the parts that don't\nmove the price — so an agent can copy its create body verbatim."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"SendChatMessageRequest":{"properties":{"content":{"type":"string","maxLength":4000,"minLength":1,"title":"Content"},"row_ref":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Row Ref"}},"type":"object","required":["content"],"title":"SendChatMessageRequest"},"UpdateWebhookRequest":{"properties":{"url":{"anyOf":[{"type":"string","maxLength":2083,"minLength":1,"format":"uri"},{"type":"null"}],"title":"Url"},"events":{"anyOf":[{"items":{"type":"string"},"type":"array","minItems":1},{"type":"null"}],"title":"Events"}},"type":"object","title":"UpdateWebhookRequest"},"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"}}}}