{"openapi":"3.1.0","info":{"title":"DataSpring API","version":"0.3.0"},"paths":{"/api/auth/login":{"get":{"summary":"Login","operationId":"login_api_auth_login_get","parameters":[{"name":"next","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/callback":{"get":{"summary":"Callback","operationId":"callback_api_auth_callback_get","parameters":[{"name":"code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"}},{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"}},{"name":"error","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},{"name":"__session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"  Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/logout":{"post":{"summary":"Logout","description":"Sign out of Forspring (hub D-99 item 3): end this browser's session and\nsend it to the account's end-session, whose back-channel logout ends the\nperson's sessions in every other product.\n\nThe user menu of @forspring/ui posts a plain form here (``signOut.action``\nwith ``signOut.fields``), so its answer is a 303 to the end-session and the\nbrowser simply follows it. A script's POST gets ``{\"redirect\": ...}``.\n\nCSRF: with a session cookie, the form's ``csrf`` field (or the\n``X-CSRF-Token`` header) must be :func:`sessions.csrf_token` of that\ncookie, which only a page that read ``GET /api/me`` knows; otherwise\nnothing ends and the answer is 403. Without a cookie there is no session\nto end, and the account's end-session is the only place this sends the\nbrowser; any site can link there directly, so refusing would protect\nnothing.","operationId":"logout_api_auth_logout_post","parameters":[{"name":"__session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"  Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/forspring/events":{"post":{"summary":"Events","operationId":"events_api_forspring_events_post","parameters":[{"name":"x-forspring-signature","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Forspring-Signature"}},{"name":"x-forspring-event-id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Forspring-Event-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/forspring/logout":{"post":{"summary":"Logout","operationId":"logout_api_forspring_logout_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_logout_api_forspring_logout_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/keys":{"get":{"summary":"List Keys","operationId":"list_keys_api_keys_get","parameters":[{"name":"mine","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Mine"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-DataSpring-Org","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Dataspring-Org"}},{"name":"__session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"  Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Keys Api Keys Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Create Key","description":"A key that acts as the caller in this org, at most as admin (its role is\nmin(admin, the caller's role) now, and min(that, their live role) on every\nrequest), until it is revoked. Only a person in the browser makes one: a\nkey cannot make keys, as it cannot approve a device login.","operationId":"create_key_api_keys_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-DataSpring-Org","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Dataspring-Org"}},{"name":"__session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"  Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NewKey"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Create Key Api Keys Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/keys/{key_id}":{"delete":{"summary":"Revoke Key","operationId":"revoke_key_api_keys__key_id__delete","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"}},{"name":"X-DataSpring-Org","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Dataspring-Org"}},{"name":"__session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"  Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Revoke Key Api Keys  Key Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/device/code":{"post":{"summary":"Device Code","operationId":"device_code_api_device_code_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_device_code_api_device_code_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/device/lookup":{"get":{"summary":"Device Lookup","operationId":"device_lookup_api_device_lookup_get","parameters":[{"name":"user_code","in":"query","required":true,"schema":{"type":"string","title":"User Code"}},{"name":"__session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"  Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Device Lookup Api Device Lookup Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/device/approve":{"post":{"summary":"Device Approve","operationId":"device_approve_api_device_approve_post","parameters":[{"name":"__session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"  Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_device_approve_api_device_approve_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Device Approve Api Device Approve Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/device/deny":{"post":{"summary":"Device Deny","operationId":"device_deny_api_device_deny_post","parameters":[{"name":"__session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"  Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_device_deny_api_device_deny_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Device Deny Api Device Deny Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/device/token":{"post":{"summary":"Device Token","operationId":"device_token_api_device_token_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_device_token_api_device_token_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/mcp":{"get":{"summary":"Mcp Add Trailing Slash","description":"Redirect /api/mcp → /api/mcp/ using the external URL.\n\nPreserves the query string via ``mcp_trailing_slash_target`` so the MCP\norg-pinning feature (``?org=<id>``) survives the redirect.","operationId":"mcp_add_trailing_slash_api_mcp_delete","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"summary":"Mcp Add Trailing Slash","description":"Redirect /api/mcp → /api/mcp/ using the external URL.\n\nPreserves the query string via ``mcp_trailing_slash_target`` so the MCP\norg-pinning feature (``?org=<id>``) survives the redirect.","operationId":"mcp_add_trailing_slash_api_mcp_delete","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"delete":{"summary":"Mcp Add Trailing Slash","description":"Redirect /api/mcp → /api/mcp/ using the external URL.\n\nPreserves the query string via ``mcp_trailing_slash_target`` so the MCP\norg-pinning feature (``?org=<id>``) survives the redirect.","operationId":"mcp_add_trailing_slash_api_mcp_delete","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/render/{path}":{"get":{"summary":"Serve Render Spa","description":"Serve the SPA for render routes (dashboard/widget rendering).","operationId":"serve_render_spa_render__path__get","parameters":[{"name":"path","in":"path","required":true,"schema":{"type":"string","title":"Path"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/.well-known/oauth-protected-resource/":{"get":{"summary":"Oauth Protected Resource Metadata Api","description":"The MCP's protected-resource metadata (RFC 9728). Since tick eoy it\nnames the Forspring account as the only authorization server (hub D-99\nitem 1): new MCP clients sign in there and send its ``fat_`` token, which\nis verified at the account on every request. The authorization-server\ndocuments below stay for connections made through DataSpring's own\nserver before, which refresh there until they are removed.","operationId":"oauth_protected_resource_metadata_api__well_known_oauth_protected_resource__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/.well-known/oauth-protected-resource":{"get":{"summary":"Oauth Protected Resource Metadata Api","description":"The MCP's protected-resource metadata (RFC 9728). Since tick eoy it\nnames the Forspring account as the only authorization server (hub D-99\nitem 1): new MCP clients sign in there and send its ``fat_`` token, which\nis verified at the account on every request. The authorization-server\ndocuments below stay for connections made through DataSpring's own\nserver before, which refresh there until they are removed.","operationId":"oauth_protected_resource_metadata_api__well_known_oauth_protected_resource_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/.well-known/oauth-protected-resource/api/mcp/":{"get":{"summary":"Oauth Protected Resource Metadata Api","description":"The MCP's protected-resource metadata (RFC 9728). Since tick eoy it\nnames the Forspring account as the only authorization server (hub D-99\nitem 1): new MCP clients sign in there and send its ``fat_`` token, which\nis verified at the account on every request. The authorization-server\ndocuments below stay for connections made through DataSpring's own\nserver before, which refresh there until they are removed.","operationId":"oauth_protected_resource_metadata_api__well_known_oauth_protected_resource_api_mcp__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/.well-known/oauth-protected-resource/api/mcp":{"get":{"summary":"Oauth Protected Resource Metadata Api","description":"The MCP's protected-resource metadata (RFC 9728). Since tick eoy it\nnames the Forspring account as the only authorization server (hub D-99\nitem 1): new MCP clients sign in there and send its ``fat_`` token, which\nis verified at the account on every request. The authorization-server\ndocuments below stay for connections made through DataSpring's own\nserver before, which refresh there until they are removed.","operationId":"oauth_protected_resource_metadata_api__well_known_oauth_protected_resource_api_mcp_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/.well-known/oauth-protected-resource/api/mcp/o/{org_id}/":{"get":{"summary":"Oauth Protected Resource Metadata Org","description":"One org's MCP address, ``/api/mcp/o/<org>``, as its own resource\n(hub D-99 item 2): the ``resource`` is the address as typed.","operationId":"oauth_protected_resource_metadata_org__well_known_oauth_protected_resource_api_mcp_o__org_id___get","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/.well-known/oauth-protected-resource/api/mcp/o/{org_id}":{"get":{"summary":"Oauth Protected Resource Metadata Org","description":"One org's MCP address, ``/api/mcp/o/<org>``, as its own resource\n(hub D-99 item 2): the ``resource`` is the address as typed.","operationId":"oauth_protected_resource_metadata_org__well_known_oauth_protected_resource_api_mcp_o__org_id__get","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/.well-known/oauth-authorization-server/api/mcp/":{"get":{"summary":"Oauth Authorization Server Metadata","description":"Serve OAuth authorization server metadata.","operationId":"oauth_authorization_server_metadata__well_known_oauth_authorization_server_api_mcp__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/.well-known/oauth-authorization-server/api/mcp":{"get":{"summary":"Oauth Authorization Server Metadata","description":"Serve OAuth authorization server metadata.","operationId":"oauth_authorization_server_metadata__well_known_oauth_authorization_server_api_mcp_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/.well-known/oauth-authorization-server/":{"get":{"summary":"Oauth Authorization Server Metadata","description":"Serve OAuth authorization server metadata.","operationId":"oauth_authorization_server_metadata__well_known_oauth_authorization_server__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/.well-known/oauth-authorization-server":{"get":{"summary":"Oauth Authorization Server Metadata","description":"Serve OAuth authorization server metadata.","operationId":"oauth_authorization_server_metadata__well_known_oauth_authorization_server_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/mcp/.well-known/openid-configuration/":{"get":{"summary":"Openid Configuration","description":"Serve OpenID Connect discovery document.","operationId":"openid_configuration_api_mcp__well_known_openid_configuration__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/mcp/.well-known/openid-configuration":{"get":{"summary":"Openid Configuration","description":"Serve OpenID Connect discovery document.","operationId":"openid_configuration_api_mcp__well_known_openid_configuration_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/.well-known/openid-configuration/api/mcp/":{"get":{"summary":"Openid Configuration","description":"Serve OpenID Connect discovery document.","operationId":"openid_configuration__well_known_openid_configuration_api_mcp__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/.well-known/openid-configuration/api/mcp":{"get":{"summary":"Openid Configuration","description":"Serve OpenID Connect discovery document.","operationId":"openid_configuration__well_known_openid_configuration_api_mcp_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/.well-known/openid-configuration/":{"get":{"summary":"Openid Configuration","description":"Serve OpenID Connect discovery document.","operationId":"openid_configuration__well_known_openid_configuration__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/.well-known/openid-configuration":{"get":{"summary":"Openid Configuration","description":"Serve OpenID Connect discovery document.","operationId":"openid_configuration__well_known_openid_configuration_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/health":{"get":{"summary":"Health","operationId":"health_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/health/deep":{"get":{"summary":"Deep Health","description":"Deep health probe (Nightnurse polls this; keepwarm keeps it hot).\n\nWhen HEALTH_PROBE_SECRET is configured the probe requires it in the\nX-Health-Secret header, so the public internet cannot make the app do a\nFirestore read and a Nightnurse ping per request. Without the setting\n(local development) it stays open.\n\nThis intentionally avoids expensive warehouse queries, dashboard rendering,\nemail, or LLM calls. It verifies the public route can reach Cloud Run, the app\ncan read required config, and Firestore is accessible — cheap enough to serve\nunauthenticated. Returns 500 when any component fails so an HTTP probe sees\na non-2xx status.","operationId":"deep_health_api_health_deep_get","parameters":[{"name":"X-Health-Secret","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Health-Secret"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeepHealthResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/health/deep":{"get":{"summary":"Deep Health","description":"Deep health probe (Nightnurse polls this; keepwarm keeps it hot).\n\nWhen HEALTH_PROBE_SECRET is configured the probe requires it in the\nX-Health-Secret header, so the public internet cannot make the app do a\nFirestore read and a Nightnurse ping per request. Without the setting\n(local development) it stays open.\n\nThis intentionally avoids expensive warehouse queries, dashboard rendering,\nemail, or LLM calls. It verifies the public route can reach Cloud Run, the app\ncan read required config, and Firestore is accessible — cheap enough to serve\nunauthenticated. Returns 500 when any component fails so an HTTP probe sees\na non-2xx status.","operationId":"deep_health_health_deep_get","parameters":[{"name":"X-Health-Secret","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Health-Secret"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeepHealthResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me":{"get":{"summary":"Get Me","description":"Return the authenticated user's profile and current org context.\n\nUsed by the CLI to resolve user context without requiring local ADC/Firestore access.\n\nAnswers 200 for a caller who belongs to no organization, with ``org_id``,\n``org_role`` and ``org_name`` all null (D25: sign-up no longer creates\none, so this is a normal state for a new account). Every other route\nrefuses such a caller; this one is how they find out why.\n\nA browser session also gets ``csrf``: the hidden field of the bar's\n\"Sign out of Forspring\" form (``POST /api/auth/logout``, hub D-99).","operationId":"get_me_api_me_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-DataSpring-Org","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Dataspring-Org"}},{"name":"__session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"  Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/error-reports":{"post":{"summary":"Create Error Report Endpoint","description":"Submit a CLI error report. Used by `dataspring report` command.","operationId":"create_error_report_endpoint_api_error_reports_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-DataSpring-Org","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Dataspring-Org"}},{"name":"__session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"  Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/skill":{"get":{"summary":"List Skills Endpoint","description":"List all skills as a markdown document (frontmatters only).","operationId":"list_skills_endpoint_api_v1_skill_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/skill/{persona}":{"get":{"summary":"Get Skill Frontmatter Endpoint","description":"Return the persona's frontmatter as a YAML/markdown block.","operationId":"get_skill_frontmatter_endpoint_api_v1_skill__persona__get","parameters":[{"name":"persona","in":"path","required":true,"schema":{"type":"string","title":"Persona"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/skill/{persona}/instructions":{"get":{"summary":"Get Skill Instructions Endpoint","description":"Return the persona's full body (the SKILL.md content).","operationId":"get_skill_instructions_endpoint_api_v1_skill__persona__instructions_get","parameters":[{"name":"persona","in":"path","required":true,"schema":{"type":"string","title":"Persona"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/skills":{"get":{"summary":"List Skill Trees Endpoint","description":"Every skill: name, description, version and file paths.","operationId":"list_skill_trees_endpoint_api_skills_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/skills/{name}":{"get":{"summary":"Get Skill Tree Endpoint","description":"One skill as a tree: SKILL.md plus every file beside it, and its version.","operationId":"get_skill_tree_endpoint_api_skills__name__get","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/skill/latest.json":{"get":{"summary":"Suite Skill Endpoint","description":"The suite skill (suite-standards §5, tick ezt): public, no auth.\n\n``{name: \"dataspring\", version, files: [{path, content}]}``, the shape\nSiteSpring and PulseSpring publish, which Spring's Brain imports into\nevery company that connects DataSpring. The ETag is the version, so a\ndaily check that finds nothing new is one 304. Assembled from\n``backend/skills/`` by ``services.skills.suite_skill``.","operationId":"suite_skill_endpoint_skill_latest_json_head","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"head":{"summary":"Suite Skill Endpoint","description":"The suite skill (suite-standards §5, tick ezt): public, no auth.\n\n``{name: \"dataspring\", version, files: [{path, content}]}``, the shape\nSiteSpring and PulseSpring publish, which Spring's Brain imports into\nevery company that connects DataSpring. The ETag is the version, so a\ndaily check that finds nothing new is one 304. Assembled from\n``backend/skills/`` by ``services.skills.suite_skill``.","operationId":"suite_skill_endpoint_skill_latest_json_head","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/waitlist":{"post":{"summary":"Join Waitlist","description":"Add email to the waitlist.","operationId":"join_waitlist_api_waitlist_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WaitlistRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/cache/stats":{"get":{"summary":"Cache Stats","description":"Get cache statistics. Requires admin role.","operationId":"cache_stats_api_cache_stats_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-DataSpring-Org","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Dataspring-Org"}},{"name":"__session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"  Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/cache/invalidate":{"post":{"summary":"Invalidate Cache","description":"Invalidate all cached queries for this organization. Requires admin role.","operationId":"invalidate_cache_api_cache_invalidate_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-DataSpring-Org","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Dataspring-Org"}},{"name":"__session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"  Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/metrics":{"get":{"summary":"List Metrics","description":"List all available metrics from MetricFlow.","operationId":"list_metrics_metrics_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-DataSpring-Org","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Dataspring-Org"}},{"name":"__session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"  Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/semantic-layer/dimensions":{"get":{"summary":"List Dimensions Endpoint","description":"List all available dimensions in their MetricFlow-qualified form.","operationId":"list_dimensions_endpoint_api_semantic_layer_dimensions_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-DataSpring-Org","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Dataspring-Org"}},{"name":"__session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"  Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/manifest":{"get":{"summary":"Get Manifest Status Endpoint","description":"Manifest status: the counts the CLI's ``manifest status`` prints.","operationId":"get_manifest_status_endpoint_api_manifest_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-DataSpring-Org","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Dataspring-Org"}},{"name":"__session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"  Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"summary":"Upload Manifest","description":"Upload/update the semantic manifest. Requires admin role.\n\nThe older path for ``POST /api/semantic-layer/import``: the same replace\nsemantics through ``services.manifest.import_manifest``, the same answer.","operationId":"upload_manifest_api_manifest_put","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-DataSpring-Org","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Dataspring-Org"}},{"name":"__session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"  Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Manifest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/semantic-layer/import":{"post":{"summary":"Import Manifest Endpoint","description":"Import semantic models and metrics from a manifest into Firestore.\n\nReplace semantics:\n- The manifest is the source of truth for the imported namespace.\n- Imported-origin items absent from the upload are hard-deleted.\n- DataSpring-origin (user-created) items are never touched by import.\n- A name collision between an upload entry and a metricly-origin item is\n  reported as a conflict; the dataspring version wins.\n\nValidation gates (no writes happen on failure):\n1. The uploaded manifest must be internally consistent.\n2. The post-replace effective state (incoming + retained dataspring items)\n   must have all metric→measure / metric→metric references resolved.\n3. Existing quick metrics must still resolve against the post-replace\n   metric set.\n\nRequires admin role. Routed through ``services.manifest.import_manifest``\nso REST, MCP and CLI all share the same field-level merge (decision\n2026-08-31: dbt owns computation, DataSpring owns descriptive text).","operationId":"import_manifest_endpoint_api_semantic_layer_import_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-DataSpring-Org","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Dataspring-Org"}},{"name":"__session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"  Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Manifest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/semantic-layer/validate":{"post":{"summary":"Validate Manifest Endpoint","description":"Validate a semantic manifest without saving.\n\nReturns validation errors and warnings. Use this to check changes before\nsaving semantic models or metrics.","operationId":"validate_manifest_endpoint_api_semantic_layer_validate_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-DataSpring-Org","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Dataspring-Org"}},{"name":"__session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"  Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Manifest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/semantic-layer/models":{"get":{"summary":"List Semantic Models Endpoint","description":"List all semantic models for the organization.","operationId":"list_semantic_models_endpoint_api_semantic_layer_models_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-DataSpring-Org","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Dataspring-Org"}},{"name":"__session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"  Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Create Semantic Model Endpoint","description":"Create a new semantic model. Requires admin role.","operationId":"create_semantic_model_endpoint_api_semantic_layer_models_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-DataSpring-Org","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Dataspring-Org"}},{"name":"__session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"  Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Model"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/semantic-layer/models/{name}":{"get":{"summary":"Get Semantic Model Endpoint","description":"Get a specific semantic model by name.","operationId":"get_semantic_model_endpoint_api_semantic_layer_models__name__get","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-DataSpring-Org","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Dataspring-Org"}},{"name":"__session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"  Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"summary":"Update Semantic Model Endpoint","description":"Update an existing semantic model. Requires admin role.\n\nText edits (description, label) always write. A computation change to an\nIMPORTED model is a 409 ``DBT_OWNS_COMPUTATION`` proposal; to a NATIVE\nmodel it is a 409 ``REQUIRES_CONFIRMATION`` until ``?confirmed=true``.","operationId":"update_semantic_model_endpoint_api_semantic_layer_models__name__put","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}},{"name":"confirmed","in":"query","required":false,"schema":{"type":"boolean","description":"Apply a redefinition of a NATIVE metric or model the user has confirmed, after a 409 REQUIRES_CONFIRMATION showed its impact. Has no effect on imported entities: dbt owns their computation.","default":false,"title":"Confirmed"},"description":"Apply a redefinition of a NATIVE metric or model the user has confirmed, after a 409 REQUIRES_CONFIRMATION showed its impact. Has no effect on imported entities: dbt owns their computation."},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-DataSpring-Org","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Dataspring-Org"}},{"name":"__session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"  Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Updates"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Delete Semantic Model Endpoint","description":"Delete a semantic model. Requires admin role.","operationId":"delete_semantic_model_endpoint_api_semantic_layer_models__name__delete","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-DataSpring-Org","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Dataspring-Org"}},{"name":"__session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"  Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/semantic-layer/metrics":{"get":{"summary":"List Metrics Endpoint","description":"List all metrics for the organization.","operationId":"list_metrics_endpoint_api_semantic_layer_metrics_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-DataSpring-Org","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Dataspring-Org"}},{"name":"__session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"  Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Create Metric Endpoint","description":"Create a new metric. Requires admin role.","operationId":"create_metric_endpoint_api_semantic_layer_metrics_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-DataSpring-Org","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Dataspring-Org"}},{"name":"__session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"  Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Metric"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/semantic-layer/metrics/{name}":{"get":{"summary":"Get Metric Endpoint","description":"Get a specific metric by name.","operationId":"get_metric_endpoint_api_semantic_layer_metrics__name__get","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-DataSpring-Org","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Dataspring-Org"}},{"name":"__session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"  Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"summary":"Update Metric Endpoint","description":"Update an existing metric. Requires admin role.\n\nText edits (description, label) always write. A computation change to an\nIMPORTED metric is a 409 ``DBT_OWNS_COMPUTATION`` proposal; to a NATIVE\nmetric it is a 409 ``REQUIRES_CONFIRMATION`` until ``?confirmed=true``.","operationId":"update_metric_endpoint_api_semantic_layer_metrics__name__put","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}},{"name":"confirmed","in":"query","required":false,"schema":{"type":"boolean","description":"Apply a redefinition of a NATIVE metric or model the user has confirmed, after a 409 REQUIRES_CONFIRMATION showed its impact. Has no effect on imported entities: dbt owns their computation.","default":false,"title":"Confirmed"},"description":"Apply a redefinition of a NATIVE metric or model the user has confirmed, after a 409 REQUIRES_CONFIRMATION showed its impact. Has no effect on imported entities: dbt owns their computation."},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-DataSpring-Org","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Dataspring-Org"}},{"name":"__session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"  Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Updates"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Delete Metric Endpoint","description":"Delete a metric. Requires admin role.","operationId":"delete_metric_endpoint_api_semantic_layer_metrics__name__delete","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-DataSpring-Org","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Dataspring-Org"}},{"name":"__session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"  Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/semantic-layer/metrics/preview":{"post":{"summary":"Preview Metric Endpoint","description":"Preview a metric definition without saving.\n\n``dispatch.metric_edit(preview)`` — the same preview MCP and the inline\nagent run — validates the definition against this org's manifest and\nexecutes a sample query over the last ``days`` days. ``dbt_yaml`` is what\nwould be committed for it.","operationId":"preview_metric_endpoint_api_semantic_layer_metrics_preview_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-DataSpring-Org","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Dataspring-Org"}},{"name":"__session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"  Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetricPreviewRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetricPreviewResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/semantic-layer/export":{"get":{"summary":"Export Manifest Endpoint","description":"Export the semantic manifest (metrics, semantic_models,\nproject_configuration) - the shape ``dataspring manifest export`` writes\nto disk and ``dataspring://manifest/export`` serves on MCP.","operationId":"export_manifest_endpoint_api_semantic_layer_export_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-DataSpring-Org","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Dataspring-Org"}},{"name":"__session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"  Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/semantic-layer/export/zip":{"get":{"summary":"Export Zip Endpoint","description":"Export the semantic layer as a ZIP of dbt-compatible YAML files.","operationId":"export_zip_endpoint_api_semantic_layer_export_zip_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-DataSpring-Org","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Dataspring-Org"}},{"name":"__session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"  Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/context":{"get":{"summary":"Get Context Endpoint","description":"Get business context for an organization.","operationId":"get_context_endpoint_api_context_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-DataSpring-Org","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Dataspring-Org"}},{"name":"__session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"  Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"summary":"Save Context Endpoint","description":"Save business context for an organization. Requires admin role.\n\n``business_context_edit(set)`` enforces the 2000-byte UTF-8 cap (a 413\nhere) and records the change on the learned trail, exactly as on MCP.","operationId":"save_context_endpoint_api_context_put","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-DataSpring-Org","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Dataspring-Org"}},{"name":"__session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"  Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/learned":{"get":{"summary":"List Learned Endpoint","description":"List the org's learned trail. The service already hides other\nusers' personal (user-scope) entries.","operationId":"list_learned_endpoint_api_learned_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}},{"name":"include_reverted","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Include Reverted"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-DataSpring-Org","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Dataspring-Org"}},{"name":"__session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"  Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/learned/{learning_id}":{"get":{"summary":"Get Learned Endpoint","operationId":"get_learned_endpoint_api_learned__learning_id__get","parameters":[{"name":"learning_id","in":"path","required":true,"schema":{"type":"string","title":"Learning Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-DataSpring-Org","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Dataspring-Org"}},{"name":"__session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"  Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/learned/{learning_id}/revert":{"post":{"summary":"Revert Learned Endpoint","operationId":"revert_learned_endpoint_api_learned__learning_id__revert_post","parameters":[{"name":"learning_id","in":"path","required":true,"schema":{"type":"string","title":"Learning Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-DataSpring-Org","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Dataspring-Org"}},{"name":"__session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"  Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/learned/undo":{"post":{"summary":"Undo Learned Endpoint","operationId":"undo_learned_endpoint_api_learned_undo_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-DataSpring-Org","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Dataspring-Org"}},{"name":"__session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"  Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/dispatch/{tool_key}":{"post":{"summary":"Dispatch Endpoint","description":"Run one dispatch handler by registry key. See the module comment above.","operationId":"dispatch_endpoint_api_dispatch__tool_key__post","parameters":[{"name":"tool_key","in":"path","required":true,"schema":{"type":"string","title":"Tool Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-DataSpring-Org","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Dataspring-Org"}},{"name":"__session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"  Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/platform/dispatch/tenant_edit":{"post":{"summary":"Platform Tenant Edit Endpoint","description":"``tenant_edit`` from the platform view, which lives at the org-free\n``/platform`` and names no org (D27, hub D-99): a platform admin in\nseveral orgs, or in none, must still reach it. The handler checks the\nplatform-admin flag itself; nothing inside an org is reachable here.","operationId":"platform_tenant_edit_endpoint_api_platform_dispatch_tenant_edit_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-DataSpring-Org","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Dataspring-Org"}},{"name":"__session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"  Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/dispatch":{"get":{"summary":"Dispatch Manifest Endpoint","description":"The dispatch registry as a manifest. See the module comment above.","operationId":"dispatch_manifest_endpoint_api_dispatch_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-internal-secret","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Internal-Secret"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/organizations":{"get":{"summary":"List My Organizations","description":"The organizations the caller belongs to, with the one this request\nnames (``X-DataSpring-Org``, or the only one) flagged ``current``. The\ndashboard's org chooser and switcher read this; no org is stored anywhere.\n\nAn empty list is a legitimate answer since D25, not an error: a new\nallowlisted account belongs to nothing until an administrator adds it.","operationId":"list_my_organizations_api_me_organizations_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-DataSpring-Org","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Dataspring-Org"}},{"name":"__session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"  Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/preferences":{"get":{"summary":"Get My Preferences","description":"The caller's standing query preferences: the dataspring://context payload.","operationId":"get_my_preferences_api_me_preferences_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-DataSpring-Org","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Dataspring-Org"}},{"name":"__session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"  Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/quick-metrics":{"get":{"summary":"List Quick Metrics Endpoint","description":"Quick metrics of the org: the dataspring://quick_metrics payload.","operationId":"list_quick_metrics_endpoint_api_quick_metrics_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-DataSpring-Org","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Dataspring-Org"}},{"name":"__session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"  Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/quick-metrics/{metric_id}":{"get":{"summary":"Get Quick Metric Endpoint","description":"One quick metric by id.","operationId":"get_quick_metric_endpoint_api_quick_metrics__metric_id__get","parameters":[{"name":"metric_id","in":"path","required":true,"schema":{"type":"string","title":"Metric Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-DataSpring-Org","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Dataspring-Org"}},{"name":"__session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"  Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/schedules":{"get":{"summary":"List Schedules Endpoint","description":"Scheduled reports of the org: the dataspring://reports payload.","operationId":"list_schedules_endpoint_api_schedules_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-DataSpring-Org","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Dataspring-Org"}},{"name":"__session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"  Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/schedules/{schedule_id}":{"get":{"summary":"Get Schedule Endpoint","description":"One scheduled report by id.","operationId":"get_schedule_endpoint_api_schedules__schedule_id__get","parameters":[{"name":"schedule_id","in":"path","required":true,"schema":{"type":"string","title":"Schedule Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-DataSpring-Org","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Dataspring-Org"}},{"name":"__session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"  Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/datacore/files":{"get":{"summary":"Datacore Files Endpoint","description":"The deployed and draft snapshot listings (``dataspring://datacore/files``).","operationId":"datacore_files_endpoint_api_datacore_files_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-DataSpring-Org","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Dataspring-Org"}},{"name":"__session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"  Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/datacore/file/{path}":{"get":{"summary":"Datacore File Endpoint","description":"One workspace file (``dataspring://datacore/file/{path}``).","operationId":"datacore_file_endpoint_api_datacore_file__path__get","parameters":[{"name":"path","in":"path","required":true,"schema":{"type":"string","title":"Path"}},{"name":"snapshot","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"draft, deployed, or a snapshot id; default: the draft if any","title":"Snapshot"},"description":"draft, deployed, or a snapshot id; default: the draft if any"},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-DataSpring-Org","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Dataspring-Org"}},{"name":"__session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"  Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/datacore/schema":{"get":{"summary":"Datacore Schema Endpoint","description":"The columns of one dataset's tables (``dataspring://datacore/schema``\nis the raw one); 400 for another dataset or a table it does not have.","operationId":"datacore_schema_endpoint_api_datacore_schema_get","parameters":[{"name":"dataset","in":"query","required":false,"schema":{"type":"string","description":"raw (default), staging, core, marts or dev: which of the org's datasets","default":"raw","title":"Dataset"},"description":"raw (default), staging, core, marts or dev: which of the org's datasets"},{"name":"table","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"one table or view of it; default: every table","title":"Table"},"description":"one table or view of it; default: every table"},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-DataSpring-Org","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Dataspring-Org"}},{"name":"__session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"  Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/datacore/runs":{"get":{"summary":"Datacore Runs Endpoint","description":"Recent runs (``dataspring://datacore/runs``).","operationId":"datacore_runs_endpoint_api_datacore_runs_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-DataSpring-Org","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Dataspring-Org"}},{"name":"__session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"  Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/datacore/runs/{run_id}":{"get":{"summary":"Datacore Run Endpoint","description":"One run document, for polling a check or a backfill.","operationId":"datacore_run_endpoint_api_datacore_runs__run_id__get","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"}},{"name":"X-DataSpring-Org","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Dataspring-Org"}},{"name":"__session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"  Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/datacore/pipelines":{"get":{"summary":"Datacore Pipelines Endpoint","description":"The deployed pipelines with their schedules, fire times and last run\n(the viewer's datacore panel). Same auth and org pinning as the other\ndatacore reads: the org is the caller's, never a query parameter.","operationId":"datacore_pipelines_endpoint_api_datacore_pipelines_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-DataSpring-Org","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Dataspring-Org"}},{"name":"__session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"  Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/python/runs":{"post":{"summary":"Python Runs Create Endpoint","description":"``python_run run``: ``{code, inputs?, timeout_seconds?, warehouse?}``.\n200 with the result when it finished inside the inline wait, 202 with\n``{run_id, status: running}`` when it became a job.","operationId":"python_runs_create_endpoint_api_python_runs_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-DataSpring-Org","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Dataspring-Org"}},{"name":"__session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"  Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"summary":"Python Runs List Endpoint","description":"``python_run list``: the org's recent runs and its allowance.","operationId":"python_runs_list_endpoint_api_python_runs_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-DataSpring-Org","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Dataspring-Org"}},{"name":"__session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"  Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/python/runs/{run_id}":{"get":{"summary":"Python Run Endpoint","description":"One run: its result once finished, else its status (poll this).","operationId":"python_run_endpoint_api_python_runs__run_id__get","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"}},{"name":"X-DataSpring-Org","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Dataspring-Org"}},{"name":"__session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"  Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/python/runs/{run_id}/files/{name}":{"get":{"summary":"Python Run File Endpoint","description":"One file a run kept, through the backend with the caller's session or\nkey: the download link every python_run answer carries (never a signed\nURL). A member of the run's org only; 410 once the 30 days are over.","operationId":"python_run_file_endpoint_api_python_runs__run_id__files__name__get","parameters":[{"name":"run_id","in":"path","required":true,"schema":{"type":"string","title":"Run Id"}},{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-DataSpring-Org","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Dataspring-Org"}},{"name":"__session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"  Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/platform/tenants":{"get":{"summary":"Platform Tenants Endpoint","description":"Every tenant and how it is doing — the `/app/platform` view (D27).\n\nPlatform admin only. The permissive dependency on purpose: the claim is on\nthe ACCOUNT, so a platform admin who is a member of no organization must\nstill be able to read this. The org-scoped routes are not reachable that\nway, and `require_platform_admin` is what actually gates this one.\n\nOperational metadata only. It never reads inside a customer's warehouse:\nthat still means being a member of that organization, which is a\ndeliberate, audited act.","operationId":"platform_tenants_endpoint_api_platform_tenants_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-DataSpring-Org","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Dataspring-Org"}},{"name":"__session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"  Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/datacore/freshness":{"get":{"summary":"Datacore Freshness Endpoint","description":"Per raw table freshness (``dataspring://datacore/freshness``).","operationId":"datacore_freshness_endpoint_api_datacore_freshness_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-DataSpring-Org","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Dataspring-Org"}},{"name":"__session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"  Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/datacore/diff":{"get":{"summary":"Datacore Diff Endpoint","description":"The draft against the deployed snapshot (``dataspring://datacore/diff``).","operationId":"datacore_diff_endpoint_api_datacore_diff_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-DataSpring-Org","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Dataspring-Org"}},{"name":"__session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"  Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/datacore/reference":{"get":{"summary":"Datacore Reference Endpoint","description":"What a pipeline or connection file may say (``dataspring://datacore/reference``):\nthe schemas and the connector catalog, the files the runner validates\nagainst. No org data, so any signed-in caller, managed tenant or not.","operationId":"datacore_reference_endpoint_api_datacore_reference_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-DataSpring-Org","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Dataspring-Org"}},{"name":"__session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"  Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/datacore/reference/{part}":{"get":{"summary":"Datacore Reference Part Endpoint","description":"One part of the reference, whole: ``pipeline``, ``connection``,\n``connector``, ``catalog`` or ``catalog/<name>``.","operationId":"datacore_reference_part_endpoint_api_datacore_reference__part__get","parameters":[{"name":"part","in":"path","required":true,"schema":{"type":"string","title":"Part"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-DataSpring-Org","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Dataspring-Org"}},{"name":"__session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"  Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/warehouses":{"get":{"summary":"List Warehouses Endpoint","description":"The org's warehouses (the ``dataspring://warehouses`` payload): id,\nkind, label, active flag, manifest counts and import time. Writes go\nthrough ``POST /api/dispatch/warehouse_edit``.","operationId":"list_warehouses_endpoint_api_warehouses_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-DataSpring-Org","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Dataspring-Org"}},{"name":"__session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"  Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/metrics/{name}/dimensions":{"get":{"summary":"Metric Dimensions Endpoint","description":"What this metric can be sliced by (``dataspring://metrics/{name}/dimensions``).\n\nNot the org's dimension list: a metric reaches only the semantic models it\njoins to, so this is resolved per metric by MetricFlow's own group-by\nresolver and every name it returns compiles.","operationId":"metric_dimensions_endpoint_api_metrics__name__dimensions_get","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}},{"name":"values","in":"query","required":false,"schema":{"type":"boolean","description":"sample each categorical dimension's values (one small warehouse query each, cached)","default":true,"title":"Values"},"description":"sample each categorical dimension's values (one small warehouse query each, cached)"},{"name":"warehouse","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"one of the org's warehouses; default the active one","title":"Warehouse"},"description":"one of the org's warehouses; default the active one"},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-DataSpring-Org","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Dataspring-Org"}},{"name":"__session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"  Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/changes":{"get":{"summary":"Changes Endpoint","description":"Definition changes and completed data loads, newest first\n(``dataspring://changes``). Either feed may be unavailable; ``sources``\nsays which and why, and the read still answers.","operationId":"changes_endpoint_api_changes_get","parameters":[{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO-8601 timestamp or a relative window (24h, 7d, 2w); default the last 7 days","title":"Since"},"description":"ISO-8601 timestamp or a relative window (24h, 7d, 2w); default the last 7 days"},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"rows to return; default 100, cap 500","title":"Limit"},"description":"rows to return; default 100, cap 500"},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-DataSpring-Org","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Dataspring-Org"}},{"name":"__session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"  Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/warehouse/test":{"post":{"summary":"Test Warehouse Connection Endpoint","description":"Probe a warehouse document without saving it. Requires admin role.\n\nBuilds the client exactly as ``warehouse.OrgWarehouse`` does for real\nqueries (``build_client``, as this org: impersonation, the Secret\nManager read of ``bigquery.key_secret``), so a document that passes here\nis one queries will run on - there is no second construction path.","operationId":"test_warehouse_connection_endpoint_api_warehouse_test_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-DataSpring-Org","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Dataspring-Org"}},{"name":"__session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"  Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Config"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/boards":{"get":{"summary":"List Boards Endpoint","description":"Summaries of every board this caller can read.","operationId":"list_boards_endpoint_api_boards_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-DataSpring-Org","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Dataspring-Org"}},{"name":"__session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"  Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/boards/{board_id}":{"get":{"summary":"Get Board Endpoint","description":"One board's whole document: sections, rows, controls and display hints.","operationId":"get_board_endpoint_api_boards__board_id__get","parameters":[{"name":"board_id","in":"path","required":true,"schema":{"type":"string","title":"Board Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-DataSpring-Org","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Dataspring-Org"}},{"name":"__session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"  Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/briefings":{"get":{"summary":"List Briefings Endpoint","description":"Summaries of every briefing this caller can read.","operationId":"list_briefings_endpoint_api_briefings_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-DataSpring-Org","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Dataspring-Org"}},{"name":"__session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"  Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/briefings/{briefing_id}":{"get":{"summary":"Get Briefing Endpoint","description":"One briefing's whole document.","operationId":"get_briefing_endpoint_api_briefings__briefing_id__get","parameters":[{"name":"briefing_id","in":"path","required":true,"schema":{"type":"string","title":"Briefing Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-DataSpring-Org","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Dataspring-Org"}},{"name":"__session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"  Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/briefings/{briefing_id}/issues":{"get":{"summary":"List Briefing Issues Endpoint","description":"One briefing's committed issues, newest period first.","operationId":"list_briefing_issues_endpoint_api_briefings__briefing_id__issues_get","parameters":[{"name":"briefing_id","in":"path","required":true,"schema":{"type":"string","title":"Briefing Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-DataSpring-Org","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Dataspring-Org"}},{"name":"__session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"  Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/briefings/{briefing_id}/issues/{period_key}":{"get":{"summary":"Get Briefing Issue Endpoint","description":"One committed issue, whole.","operationId":"get_briefing_issue_endpoint_api_briefings__briefing_id__issues__period_key__get","parameters":[{"name":"briefing_id","in":"path","required":true,"schema":{"type":"string","title":"Briefing Id"}},{"name":"period_key","in":"path","required":true,"schema":{"type":"string","title":"Period Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-DataSpring-Org","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Dataspring-Org"}},{"name":"__session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"  Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/watches":{"get":{"summary":"List Watches Endpoint","description":"Every watch of this organization, with its hysteresis state.","operationId":"list_watches_endpoint_api_watches_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-DataSpring-Org","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Dataspring-Org"}},{"name":"__session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"  Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/watches/{watch_id}":{"get":{"summary":"Get Watch Endpoint","description":"One watch's whole document.","operationId":"get_watch_endpoint_api_watches__watch_id__get","parameters":[{"name":"watch_id","in":"path","required":true,"schema":{"type":"string","title":"Watch Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-DataSpring-Org","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Dataspring-Org"}},{"name":"__session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"  Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/dashboards":{"get":{"summary":"List Dashboards Endpoint","description":"List all dashboards visible to user, split into personal and team sections.\n\nFull definitions, not summaries: the viewer renders the first one straight\nfrom this list (``apps/dashboard/src/pages/DashboardPage.tsx``).","operationId":"list_dashboards_endpoint_api_dashboards_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-DataSpring-Org","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Dataspring-Org"}},{"name":"__session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"  Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Create Dashboard Endpoint","description":"Create a new dashboard owned by the current user.\n\n``title`` plus optional ``description`` and ``visibility``. A dashboard\ncreated here has no content and no way to gain any: the layout tools that\nfilled one in are retired (step 7 of\n``docs/2026-09-18-agent-interface.md``) and `board_edit` is how a board is\nauthored now. The route stays for the existing REST clients and is a thin\ncall on the dashboard service, not on a dispatch tool.","operationId":"create_dashboard_endpoint_api_dashboards_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-DataSpring-Org","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Dataspring-Org"}},{"name":"__session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"  Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Dashboard"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/dashboards/order":{"put":{"summary":"Update Dashboard Order Endpoint","description":"Update the user's own dashboard ordering (a per-member preference).","operationId":"update_dashboard_order_endpoint_api_dashboards_order_put","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-DataSpring-Org","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Dataspring-Org"}},{"name":"__session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"  Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashboardOrderUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/dashboards/{dashboard_id}":{"get":{"summary":"Get Dashboard Endpoint","description":"Get a specific dashboard by ID.","operationId":"get_dashboard_endpoint_api_dashboards__dashboard_id__get","parameters":[{"name":"dashboard_id","in":"path","required":true,"schema":{"type":"string","title":"Dashboard Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-DataSpring-Org","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Dataspring-Org"}},{"name":"__session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"  Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"summary":"Update Dashboard Endpoint","description":"Update a dashboard's metadata and/or controls. Only the owner can update.\n\n``title`` / ``description`` / ``visibility`` and a ``controls`` block.\nOptimistic locking: pass ``expected_version`` to get a 409 with\ncurrent/expected versions on a mismatch. Pages, sections and widgets are\nnot editable here or anywhere else — a board holds the contents now\n(``/api/dispatch/board_edit``).","operationId":"update_dashboard_endpoint_api_dashboards__dashboard_id__put","parameters":[{"name":"dashboard_id","in":"path","required":true,"schema":{"type":"string","title":"Dashboard Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-DataSpring-Org","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Dataspring-Org"}},{"name":"__session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"  Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Updates"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Delete Dashboard Endpoint","description":"Delete a dashboard. Only the owner can delete.","operationId":"delete_dashboard_endpoint_api_dashboards__dashboard_id__delete","parameters":[{"name":"dashboard_id","in":"path","required":true,"schema":{"type":"string","title":"Dashboard Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-DataSpring-Org","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Dataspring-Org"}},{"name":"__session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"  Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/query":{"post":{"summary":"Query Metrics","description":"Execute one metric query for the dashboard and the CLI.\n\nA thin transport over ``services.dispatch.run_query`` — the same path MCP\nand the inline agent use — so the user's standing filters and metric\nsubstitutions, the clamp to the window asked for, and quick metrics apply\nhere too. What the defaults changed is reported on ``applied_defaults``.\n\nThe three-tier query cache sits in front of it. The cache is shared across\nthe org while standing preferences are personal, so the key is built from\nthe EFFECTIVE query (metrics and ``where`` after the defaults), never from\nthe request alone.","operationId":"query_metrics_query_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-DataSpring-Org","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Dataspring-Org"}},{"name":"__session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"  Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/QueryRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QueryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/render/dashboard/{dashboard_id}":{"post":{"summary":"Render Dashboard Endpoint","description":"Render a dashboard to PDF or PNG.\n\nSupports both Firebase ID tokens (web) and Google OAuth tokens (CLI).\nReturns binary file data.","operationId":"render_dashboard_endpoint_api_render_dashboard__dashboard_id__post","parameters":[{"name":"dashboard_id","in":"path","required":true,"schema":{"type":"string","title":"Dashboard Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-DataSpring-Org","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Dataspring-Org"}},{"name":"__session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"  Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashboardRenderRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/render/widget/{dashboard_id}/{widget_id}":{"post":{"summary":"Render Widget Endpoint","description":"Render a single widget to PNG.\n\nSupports both Firebase ID tokens (web) and Google OAuth tokens (CLI).\nReturns PNG image.","operationId":"render_widget_endpoint_api_render_widget__dashboard_id___widget_id__post","parameters":[{"name":"dashboard_id","in":"path","required":true,"schema":{"type":"string","title":"Dashboard Id"}},{"name":"widget_id","in":"path","required":true,"schema":{"type":"string","title":"Widget Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-DataSpring-Org","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Dataspring-Org"}},{"name":"__session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"  Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WidgetRenderRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/render/token/validate":{"get":{"summary":"Validate Render Token Endpoint","description":"Validate a one-time render token and return resource data.\n\nUsed by frontend render routes to validate access and get data for rendering.\nThis endpoint is unauthenticated - the token itself provides auth.\n\nThe endpoint returns the full dashboard/widget data so render pages\ndon't need to make additional authenticated API calls.\n\nReturns:\n    TokenValidationResponse with valid=true, org_id, and resource data if valid,\n    or 401 error if invalid/expired.","operationId":"validate_render_token_endpoint_api_render_token_validate_get","parameters":[{"name":"token","in":"query","required":true,"schema":{"type":"string","title":"Token"}},{"name":"resource_type","in":"query","required":true,"schema":{"enum":["dashboard","widget"],"type":"string","title":"Resource Type"}},{"name":"resource_id","in":"query","required":true,"schema":{"type":"string","title":"Resource Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenValidationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/render/query":{"post":{"summary":"Render Query Endpoint","description":"Execute a MetricFlow query using a render token for authentication.\n\nThis endpoint is used by frontend render pages to query metric data\nwithout requiring Firebase authentication. The render token must have\nbeen previously validated via /api/render/token/validate.","operationId":"render_query_endpoint_api_render_query_post","parameters":[{"name":"token","in":"query","required":true,"schema":{"type":"string","description":"Render token for authentication","title":"Token"},"description":"Render token for authentication"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/QueryRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/secret-links/{nonce}":{"get":{"summary":"Secret Link Endpoint","description":"What the /s/<nonce> page needs to render: kind, secret name, expiry.","operationId":"secret_link_endpoint_api_secret_links__nonce__get","parameters":[{"name":"nonce","in":"path","required":true,"schema":{"type":"string","title":"Nonce"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Secret Link Set Endpoint","description":"A `set` link's paste: create the secret if missing, add the version,\ndestroy the previous one, spend the link, record who and when.","operationId":"secret_link_set_endpoint_api_secret_links__nonce__post","parameters":[{"name":"nonce","in":"path","required":true,"schema":{"type":"string","title":"Nonce"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SecretLinkValue"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/secret-links/{nonce}/reveal":{"post":{"summary":"Secret Link Reveal Endpoint","description":"A `reveal` link's one read: spend the link, answer the value once.","operationId":"secret_link_reveal_endpoint_api_secret_links__nonce__reveal_post","parameters":[{"name":"nonce","in":"path","required":true,"schema":{"type":"string","title":"Nonce"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/schedules/{schedule_id}/execute":{"post":{"summary":"Execute Schedule Endpoint","description":"Execute a scheduled report (internal endpoint for Cloud Function).\n\nThis endpoint is called by the Cloud Function scheduler to execute\nscheduled reports. It renders dashboards or exports queries, then\nsends the results via email.\n\nSecurity:\n    Requires X-Internal-Secret header matching the configured secret.\n    This is NOT a user-facing endpoint.\n\nArgs:\n    schedule_id: The schedule to execute\n    x_org_id: Organization ID (from Cloud Function)\n    x_internal_secret: Internal secret for authentication\n\nReturns:\n    ScheduleExecuteResponse with execution status","operationId":"execute_schedule_endpoint_api_schedules__schedule_id__execute_post","parameters":[{"name":"schedule_id","in":"path","required":true,"schema":{"type":"string","title":"Schedule Id"}},{"name":"X-Org-Id","in":"header","required":true,"schema":{"type":"string","title":"X-Org-Id"}},{"name":"X-Internal-Secret","in":"header","required":true,"schema":{"type":"string","title":"X-Internal-Secret"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScheduleExecuteResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/internal/datacore/tick":{"post":{"summary":"Datacore Tick","description":"Cloud Scheduler's `datacore-tick`, every 15 minutes: fail stale runs,\nqueue due schedules, start one execution per org with queued runs.","operationId":"datacore_tick_api_internal_datacore_tick_post","parameters":[{"name":"X-Internal-Secret","in":"header","required":true,"schema":{"type":"string","title":"X-Internal-Secret"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/internal/runs":{"post":{"summary":"Create Internal Run","description":"A manual run (`scripts/run-pipeline.sh`): queue it, then launch as a\ntick would. 409 with the active run's id if the pipeline already has one.","operationId":"create_internal_run_api_internal_runs_post","parameters":[{"name":"X-Internal-Secret","in":"header","required":true,"schema":{"type":"string","title":"X-Internal-Secret"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalRunRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/internal/runs/{run_id}":{"get":{"summary":"Get Internal Run","description":"Two callers read a run: an operator's script, with the internal secret\nand the org; and the runner itself, with the run token minted for its\nexecution, which names the org and the run ids it may see. The runner has\nno internal secret, on purpose: it runs as the tenant.","operationId":"get_internal_run_api_internal_runs__run_id__get","parameters":[{"name":"run_id","in":"path","required":true,"schema":{"type":"string","title":"Run Id"}},{"name":"org","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The organization the run belongs to","title":"Org"},"description":"The organization the run belongs to"},{"name":"X-Internal-Secret","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Internal-Secret"}},{"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"}}}}}},"patch":{"summary":"Patch Internal Run","description":"The runner's progress reports, authenticated by the run token minted\nfor its execution (`DATASPRING_RUN_TOKEN`). The org comes from the token.","operationId":"patch_internal_run_api_internal_runs__run_id__patch","parameters":[{"name":"run_id","in":"path","required":true,"schema":{"type":"string","title":"Run Id"}},{"name":"Authorization","in":"header","required":true,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Patch"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/internal/manifests":{"post":{"summary":"Post Internal Manifest","description":"The runner's door for a semantic manifest, authenticated by the run\ntoken minted for its execution: the org comes from the token, and the\nbody's ``run_id`` must be one the token names. Imports into\n``organizations/<org>/warehouses/<warehouse>`` through the same\n``services.manifest.import_manifest`` the admin surfaces use, then\ninvalidates the org's caches. Answers\n``{imported, semantic_models, metrics, warnings}``. A check run imports\nnothing: its token is refused here and may only validate (below).","operationId":"post_internal_manifest_api_internal_manifests_post","parameters":[{"name":"Authorization","in":"header","required":true,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalManifestRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/internal/manifests/validate":{"post":{"summary":"Post Internal Manifest Validate","description":"Would this manifest import? The datacore check's question (tick rqk),\nanswered by the import itself run dry (``import_manifest(dry_run=True)``):\nevery gate the manifest post runs, against the warehouse's current state,\nand nothing written. Same body and token rules as the import. Answers\n``{valid, reason?, errors, warnings}``, 200 either way: a refusal is the\nanswer, ``reason`` the import's headline and each unresolved reference\none entry of ``errors``.","operationId":"post_internal_manifest_validate_api_internal_manifests_validate_post","parameters":[{"name":"Authorization","in":"header","required":true,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalManifestRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/internal/parity":{"post":{"summary":"Post Internal Parity","description":"Compare every metric both of the org's warehouses define over the\nwindow (``scripts/parity.sh``). Queues an ``organizations/<org>/parity/<id>``\ndocument for the datacore tick to work through in slices and answers it\nat once (202, ``status: queued``); with ``sync: true`` and at most\n``SYNC_LIMIT`` named metrics, runs now and answers the finished document.","operationId":"post_internal_parity_api_internal_parity_post","parameters":[{"name":"X-Internal-Secret","in":"header","required":true,"schema":{"type":"string","title":"X-Internal-Secret"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalParityRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/internal/parity/{parity_id}":{"get":{"summary":"Get Internal Parity","description":"The parity document: ``status`` (queued, running, succeeded, failed),\n``done``/``total``, and the verdicts so far under ``metrics``.","operationId":"get_internal_parity_api_internal_parity__parity_id__get","parameters":[{"name":"parity_id","in":"path","required":true,"schema":{"type":"string","title":"Parity Id"}},{"name":"org","in":"query","required":true,"schema":{"type":"string","description":"The organization the parity run belongs to","title":"Org"},"description":"The organization the parity run belongs to"},{"name":"X-Internal-Secret","in":"header","required":true,"schema":{"type":"string","title":"X-Internal-Secret"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"Body_device_approve_api_device_approve_post":{"properties":{"user_code":{"type":"string","title":"User Code"},"org_id":{"type":"string","title":"Org Id"}},"type":"object","required":["user_code","org_id"],"title":"Body_device_approve_api_device_approve_post"},"Body_device_code_api_device_code_post":{"properties":{"code_challenge":{"type":"string","title":"Code Challenge"},"code_challenge_method":{"type":"string","title":"Code Challenge Method","default":""},"hostname":{"type":"string","title":"Hostname","default":""},"all_orgs":{"type":"boolean","title":"All Orgs","default":false}},"type":"object","required":["code_challenge"],"title":"Body_device_code_api_device_code_post"},"Body_device_deny_api_device_deny_post":{"properties":{"user_code":{"type":"string","title":"User Code"}},"type":"object","required":["user_code"],"title":"Body_device_deny_api_device_deny_post"},"Body_device_token_api_device_token_post":{"properties":{"device_code":{"type":"string","title":"Device Code"},"code_verifier":{"type":"string","title":"Code Verifier"}},"type":"object","required":["device_code","code_verifier"],"title":"Body_device_token_api_device_token_post"},"Body_logout_api_forspring_logout_post":{"properties":{"logout_token":{"type":"string","title":"Logout Token"}},"type":"object","required":["logout_token"],"title":"Body_logout_api_forspring_logout_post"},"DashboardOrderUpdate":{"properties":{"personal_order":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Personal Order"},"team_order":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Team Order"}},"type":"object","title":"DashboardOrderUpdate"},"DashboardRenderRequest":{"properties":{"format":{"type":"string","enum":["pdf","png"],"title":"Format","default":"pdf"},"page_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Page Id"},"width":{"type":"integer","title":"Width","default":1200},"height":{"type":"integer","title":"Height","default":800}},"type":"object","title":"DashboardRenderRequest","description":"Request body for dashboard rendering."},"DeepHealthComponent":{"properties":{"ok":{"type":"boolean","title":"Ok"},"latency_ms":{"type":"integer","title":"Latency Ms"},"detail":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Detail"}},"type":"object","required":["ok","latency_ms"],"title":"DeepHealthComponent"},"DeepHealthResponse":{"properties":{"status":{"type":"string","enum":["ok","error"],"title":"Status"},"components":{"additionalProperties":{"$ref":"#/components/schemas/DeepHealthComponent"},"type":"object","title":"Components"},"duration_ms":{"type":"integer","title":"Duration Ms"}},"type":"object","required":["status","components","duration_ms"],"title":"DeepHealthResponse"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"InternalManifestRequest":{"properties":{"org":{"type":"string","title":"Org"},"warehouse":{"type":"string","title":"Warehouse"},"run_id":{"type":"string","title":"Run Id"},"manifest":{"additionalProperties":true,"type":"object","title":"Manifest"}},"type":"object","required":["org","warehouse","run_id","manifest"],"title":"InternalManifestRequest","description":"The runner's manifest post (chunk 2 plan, \"The dbt step in a run\")."},"InternalParityRequest":{"properties":{"org":{"type":"string","title":"Org"},"window":{"$ref":"#/components/schemas/RunWindow"},"metrics":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Metrics"},"grain":{"type":"string","enum":["day","week","month","quarter","year"],"title":"Grain","default":"month"},"sync":{"type":"boolean","title":"Sync","default":false}},"type":"object","required":["org","window"],"title":"InternalParityRequest"},"InternalRunRequest":{"properties":{"org":{"type":"string","title":"Org"},"pipeline":{"type":"string","title":"Pipeline"},"window":{"anyOf":[{"$ref":"#/components/schemas/RunWindow"},{"type":"null"}]}},"type":"object","required":["org","pipeline"],"title":"InternalRunRequest"},"MetricPreviewRequest":{"properties":{"metric":{"additionalProperties":true,"type":"object","title":"Metric"},"days":{"type":"integer","title":"Days","default":7},"limit":{"type":"integer","title":"Limit","default":10}},"type":"object","required":["metric"],"title":"MetricPreviewRequest","description":"Request body for metric preview."},"MetricPreviewResponse":{"properties":{"valid":{"type":"boolean","title":"Valid"},"errors":{"items":{"type":"string"},"type":"array","title":"Errors","default":[]},"warnings":{"items":{"type":"string"},"type":"array","title":"Warnings","default":[]},"data":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Data","default":[]},"columns":{"items":{"type":"string"},"type":"array","title":"Columns","default":[]},"sql":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sql"},"dbt_yaml":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dbt Yaml"}},"type":"object","required":["valid"],"title":"MetricPreviewResponse","description":"Response for metric preview."},"NewKey":{"properties":{"label":{"type":"string","maxLength":200,"minLength":1,"title":"Label","description":"What the key is for, e.g. GitHub Actions"}},"additionalProperties":false,"type":"object","required":["label"],"title":"NewKey"},"QueryRequest":{"properties":{"metrics":{"items":{"type":"string"},"type":"array","title":"Metrics"},"dimensions":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Dimensions"},"grain":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Grain"},"filters":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Filters"},"order_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Order By"},"limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Limit"},"start_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Start Date"},"end_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"End Date"},"comparison":{"anyOf":[{"type":"string","enum":["none","previous_period","same_period_last_year"]},{"type":"null"}],"title":"Comparison"},"period":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Period"},"warehouse":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Warehouse"}},"type":"object","required":["metrics"],"title":"QueryRequest"},"QueryResponse":{"properties":{"data":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Data"},"columns":{"items":{"type":"string"},"type":"array","title":"Columns"},"comparison_data":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Comparison Data"},"comparison_range":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Comparison Range"},"applied_defaults":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Applied Defaults"},"period":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Period"},"effective_window":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Effective Window"}},"type":"object","required":["data","columns"],"title":"QueryResponse"},"RunWindow":{"properties":{"start":{"type":"string","title":"Start"},"end":{"type":"string","title":"End"}},"type":"object","required":["start","end"],"title":"RunWindow"},"ScheduleExecuteResponse":{"properties":{"status":{"type":"string","enum":["success","failed"],"title":"Status"},"schedule_id":{"type":"string","title":"Schedule Id"},"report_type":{"type":"string","title":"Report Type"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},"type":"object","required":["status","schedule_id","report_type"],"title":"ScheduleExecuteResponse","description":"Response from schedule execution."},"SecretLinkValue":{"properties":{"value":{"type":"string","title":"Value"}},"type":"object","required":["value"],"title":"SecretLinkValue"},"TokenValidationResponse":{"properties":{"valid":{"type":"boolean","title":"Valid"},"org_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Org Id"},"dashboard":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Dashboard"},"widget":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Widget"},"controls":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Controls"}},"type":"object","required":["valid"],"title":"TokenValidationResponse","description":"Response for token validation."},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"WaitlistRequest":{"properties":{"email":{"type":"string","title":"Email"}},"type":"object","required":["email"],"title":"WaitlistRequest"},"WidgetRenderRequest":{"properties":{"width":{"type":"integer","title":"Width","default":600},"height":{"type":"integer","title":"Height","default":400}},"type":"object","title":"WidgetRenderRequest","description":"Request body for widget rendering."}}}}