{"openapi":"3.1.0","info":{"title":"Tillion","version":"0.1.0"},"paths":{"/admin/overview":{"get":{"tags":["admin"],"summary":"Overview","operationId":"overview_admin_overview_get","parameters":[{"name":"x-admin-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/pool":{"get":{"tags":["admin"],"summary":"Pool","description":"Warm-pool inventory for THIS region, down to the individual VM.\n\nCounts alone cannot answer the questions an operator actually has -- which guest is a\nsession on, how long has this VM been idle, is the pool full but cold (no pre-attached\nbrowsers, so every create silently pays the full attach).","operationId":"pool_admin_pool_get","parameters":[{"name":"x-admin-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["admin"],"summary":"Set Pool","description":"Resize the warm pool live, with no redeploy.\n\nChanging TILION_WARM_POOL_SIZE meant a `fly deploy`, which rolls every machine and tears\ndown the very pool being resized -- so capacity could not be adjusted during the incident\nthat needed it. The new target is persisted per region, so it survives the restart a later\ndeploy causes instead of silently snapping back to the toml.","operationId":"set_pool_admin_pool_post","parameters":[{"name":"x-admin-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PoolTargetRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/economics":{"get":{"tags":["admin"],"summary":"Economics","description":"Revenue, infrastructure cost, and margin -- the numbers an operator actually decides on.\n\nEvery input is read from live state or an explicit constant; nothing here is estimated.\nCosts come from the fleet we are actually running (a warm VM costs the same as a busy one --\nthat is the point of a warm pool, and it is where margin quietly goes), so the answer stays\nhonest when the pool is large and idle.","operationId":"economics_admin_economics_get","parameters":[{"name":"x-admin-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/keys":{"get":{"tags":["admin"],"summary":"List Keys","operationId":"list_keys_admin_keys_get","parameters":[{"name":"x-admin-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/KeyResponse"},"title":"Response List Keys Admin Keys Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["admin"],"summary":"Create Key","operationId":"create_key_admin_keys_post","parameters":[{"name":"x-admin-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateKeyRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatedKeyResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/keys/{key_id}":{"delete":{"tags":["admin"],"summary":"Revoke Key","operationId":"revoke_key_admin_keys__key_id__delete","parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","title":"Key Id"}},{"name":"x-admin-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Key"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/sessions":{"get":{"tags":["admin"],"summary":"All Sessions","operationId":"all_sessions_admin_sessions_get","parameters":[{"name":"x-admin-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AdminSessionResponse"},"title":"Response All Sessions Admin Sessions Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/sessions/{session_id}":{"delete":{"tags":["admin"],"summary":"Destroy Session","operationId":"destroy_session_admin_sessions__session_id__delete","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"x-admin-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Key"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/blocks":{"get":{"tags":["selfheal"],"summary":"List Blocks","operationId":"list_blocks_admin_blocks_get","parameters":[{"name":"owner","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Owner"}},{"name":"domain","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Domain"}},{"name":"type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type"}},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Since"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"default":100,"title":"Limit"}},{"name":"x-admin-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BlockEventResponse"},"title":"Response List Blocks Admin Blocks Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/health":{"get":{"tags":["selfheal"],"summary":"Health All","operationId":"health_all_admin_health_get","parameters":[{"name":"owner","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Owner"}},{"name":"x-admin-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SiteHealthResponse"},"title":"Response Health All Admin Health Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/health/{domain}":{"get":{"tags":["selfheal"],"summary":"Health One","operationId":"health_one_admin_health__domain__get","parameters":[{"name":"domain","in":"path","required":true,"schema":{"type":"string","title":"Domain"}},{"name":"owner","in":"query","required":true,"schema":{"type":"string","title":"Owner"}},{"name":"x-admin-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteHealthResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/strategies":{"get":{"tags":["selfheal"],"summary":"Strategies","operationId":"strategies_admin_strategies_get","parameters":[{"name":"owner","in":"query","required":true,"schema":{"type":"string","title":"Owner"}},{"name":"domain","in":"query","required":true,"schema":{"type":"string","title":"Domain"}},{"name":"x-admin-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/selfheal/overview":{"get":{"tags":["selfheal"],"summary":"Overview","operationId":"overview_admin_selfheal_overview_get","parameters":[{"name":"x-admin-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/health":{"get":{"summary":"Health","description":"Readiness probe: reports degraded/unhealthy (503) when this worker can't\nserve — the SessionManager/store is unreachable or a readiness flag is down.","operationId":"health_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/livez":{"get":{"summary":"Livez","description":"Always-200 liveness signal: the process is up and the event loop responds.\n(Distinct from /health, which reports readiness and can 503.)","operationId":"livez_livez_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/metrics":{"get":{"summary":"Metrics","description":"Prometheus text-exposition metrics.\n\nRequires a credential: TILLION_METRICS_TOKEN if set, otherwise the admin key. These\ncounters are business intelligence -- credits charged per axis, residential egress bytes,\ndenial reasons, session counts, warm-pool state -- and the endpoint used to be open to\nanyone whenever the token happened to be unset, which is the configuration prod shipped\nwith. Falling back to the admin key means an existing deployment stays scrapeable by\nwhoever already holds it, rather than by the internet. Same philosophy as the credit\nmeter, which refuses to boot rather than silently give the expensive thing away.","operationId":"metrics_metrics_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/dashboard":{"get":{"summary":"Dashboard","operationId":"dashboard_dashboard_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/dashboard/config.json":{"get":{"summary":"Dashboard Config","operationId":"dashboard_config_dashboard_config_json_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/keys":{"get":{"summary":"List Api Keys","description":"The caller's own keys, metadata only. Never returns a secret -- only the hash is stored,\nand the raw key is shown once at creation. Without this the dashboard could not see keys it\nhad already minted, so onboarding re-minted one per browser and never revoked the old.","operationId":"list_api_keys_v1_keys_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"summary":"Create Api Key","operationId":"create_api_key_v1_keys_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/keys/{key_id}":{"delete":{"summary":"Revoke Api Key","description":"Revoke one of the caller's own API keys.\n\nUntil now a leaked key could not be killed from the dashboard: /v1/keys was POST-only and\nDELETE existed only on the admin surface behind TILLION_ADMIN_KEY, so rotating a key\nrequired contacting us. That is a security obligation, not a feature.\n\nSupabase-JWT authed like the other onboarding calls; ownership is resolved from the caller's\nidentity server-side, so a caller cannot revoke another org's key by guessing an id --\nan unknown or foreign key returns 404 either way and does not confirm the id exists.","operationId":"revoke_api_key_v1_keys__key_id__delete","parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","title":"Key Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/billing/redeem":{"post":{"summary":"Billing Redeem","description":"Redeem a promo code → grant a trial tier with NO Stripe (so users can try a paid tier\nbefore payments are wired). Supabase-JWT authed like the other onboarding calls.","operationId":"billing_redeem_v1_billing_redeem_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/billing/checkout":{"post":{"summary":"Billing Checkout","operationId":"billing_checkout_v1_billing_checkout_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/billing/portal":{"post":{"summary":"Billing Portal","operationId":"billing_portal_v1_billing_portal_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/usage":{"get":{"summary":"Usage","description":"Self-serve: the caller's current-month usage vs their plan — so they can see how\nclose they are to the paywall (and what upgrading would unlock). Metering required.","operationId":"usage_v1_usage_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/credits":{"get":{"summary":"Credits Balance","description":"Self-serve: the caller's prepaid credit balance + the cost model.","operationId":"credits_balance_v1_credits_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/credits/redeem":{"post":{"summary":"Credits Redeem","operationId":"credits_redeem_v1_credits_redeem_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/admin/credits":{"post":{"summary":"Admin Grant Credits","description":"Operator grant/generate: add credits to any owner (x-admin-key gated). This is how you\n'give X amount of money' to a user or hand out a manual top-up.","operationId":"admin_grant_credits_v1_admin_credits_post","parameters":[{"name":"x-admin-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/regions":{"get":{"summary":"Regions","description":"List the egress regions a session can request. The registry version is\nreturned in X-Tillion-Region-Registry-Version so a rolling deploy can detect\nregion-config skew across workers (mismatched versions = config drift).","operationId":"regions_v1_regions_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/session":{"post":{"summary":"Create Session","operationId":"create_session_v1_session_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSessionRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/session/{session_id}":{"get":{"summary":"Get Session","operationId":"get_session_v1_session__session_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Destroy Session","operationId":"destroy_session_v1_session__session_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/sessions":{"get":{"summary":"List Sessions","operationId":"list_sessions_v1_sessions_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/SessionResponse"},"type":"array","title":"Response List Sessions V1 Sessions Get"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/fetch/job/{job_id}":{"get":{"summary":"Fetch Job","description":"Poll an async fetch. status: pending (still running) | ok/blocked/error (done).\n\nFLEET ROUTING: the job lives in memory on the worker that created it. The job_id is\n``{session_id}.{uuid}`` and the async POST was directory-routed to that session's owning\nworker — so we recover the session_id and route the poll to the SAME worker via the session\ndirectory (like every other session route). Without this, fly round-robins the poll to any\nof the ≥2 machines and it 404s.","operationId":"fetch_job_v1_fetch_job__job_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FetchResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/job/{job_id}":{"get":{"summary":"Job Poll","description":"Poll ANY async job (fetch / inspect / agent). Fleet-routes to the origin worker exactly\nlike the fetch-job poll: the job lives in memory on the worker that created it (unless Redis\nis configured), and the job_id carries the session_id used to route there.","operationId":"job_poll_v1_job__job_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/fetch":{"post":{"summary":"Fetch","operationId":"fetch_v1_fetch_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FetchRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FetchResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/stripe/webhook":{"post":{"summary":"Stripe Webhook","description":"Stripe subscription webhook -> tier change. When STRIPE_WEBHOOK_SECRET is set the\nsignature is verified (spoofed events rejected); without it (dev/test) the JSON event\nis applied as-is. The owner is read from the object's metadata.owner (set at Checkout).","operationId":"stripe_webhook_v1_stripe_webhook_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/session/{session_id}/view-token":{"post":{"summary":"Create View Token","description":"Mint a short-lived token to watch this session live or open its recording\nin a browser — so the real API key never rides in a URL/querystring.","operationId":"create_view_token_v1_session__session_id__view_token_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/session/{session_id}/recordings/{rec_id}/{asset_path}":{"get":{"summary":"Get Recording","description":"Owner-scoped recording asset server (replaces the old open static mount).\nAuthorizes via a view token (query or path-scoped cookie) or an owner Bearer,\nwith strict path containment under the session's recording dir.","operationId":"get_recording_v1_session__session_id__recordings__rec_id___asset_path__get","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"rec_id","in":"path","required":true,"schema":{"type":"string","title":"Rec Id"}},{"name":"asset_path","in":"path","required":true,"schema":{"type":"string","title":"Asset Path"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/session/{session_id}/live-view":{"get":{"summary":"Live View","operationId":"live_view_v1_session__session_id__live_view_get","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/session/{session_id}/connect":{"get":{"summary":"Session Connect","operationId":"session_connect_v1_session__session_id__connect_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/session/{session_id}/vnc-token":{"post":{"summary":"Vnc Token","description":"Mint a short-lived token + URL to watch the FULL browser window (noVNC). Owner-bound.","operationId":"vnc_token_v1_session__session_id__vnc_token_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/session/{session_id}/vnc/{path}":{"get":{"summary":"Vnc Static","description":"Serve the microVM's noVNC static files through the CP. Auth via ?token= (first load,\nwhich also sets a scoped cookie) or that cookie (the page's module imports carry no query).","operationId":"vnc_static_v1_session__session_id__vnc__path__get","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"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"}}}}}}},"/v1/inspect":{"post":{"summary":"Inspect","description":"Drive the session's browser on a URL, capture all network traffic, and\nreturn a documentation report of the site's API / auth / asset loading.","operationId":"inspect_v1_inspect_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InspectRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/session/{session_id}/tabs":{"get":{"summary":"List Tabs","description":"Every open tab in the session, oldest first.","operationId":"list_tabs_v1_session__session_id__tabs_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Open Tab","description":"Open a tab, optionally at a URL.\n\nBounded per session: each tab is a real renderer process inside a fixed-size microVM, so\nan unbounded loop here is a self-inflicted OOM of the guest rather than a bigger session.","operationId":"open_tab_v1_session__session_id__tabs_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OpenTabRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/session/{session_id}/tabs/{tab_id}":{"delete":{"summary":"Close Tab","description":"Close one tab. Closing the last one is refused: a session with no tab cannot be\ndriven, and the caller almost certainly meant to delete the session.","operationId":"close_tab_v1_session__session_id__tabs__tab_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"tab_id","in":"path","required":true,"schema":{"type":"string","title":"Tab Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/scrape":{"post":{"summary":"Scrape","description":"Fetch one page and return it. No session to create, drive or clean up.","operationId":"scrape_v1_scrape_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScrapeRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/crawl":{"post":{"summary":"Crawl","description":"Walk a site from a starting URL and return every page. One call, one session.","operationId":"crawl_v1_crawl_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CrawlRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/session/{session_id}/files/fetch":{"post":{"summary":"Fetch File","description":"Download a file through the session's browser and return its bytes.\n\nWorks for files behind a login, because the request is issued by the page itself with the\nsession's cookies and TLS identity rather than re-created from the control plane.","operationId":"fetch_file_v1_session__session_id__files_fetch_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FileFetchRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/session/{session_id}/context":{"get":{"summary":"Get Session Context","description":"Export this session's auth state as a portable JSON blob.\n\nStore it yourself and hand it back on a later create to skip the login entirely.","operationId":"get_session_context_v1_session__session_id__context_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Put Session Context","description":"Restore a previously exported context into a live session, then optionally navigate.\n\nCookies are applied before the navigation so the very first request is authenticated --\nsetting them after a goto is the usual reason a restore appears not to work.","operationId":"put_session_context_v1_session__session_id__context_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionContextRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/extract":{"post":{"summary":"Extract","description":"Navigate the session's browser to a URL and return clean, token-light\nMarkdown (noise stripped, links absolutized).","operationId":"extract_v1_extract_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExtractRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExtractResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/session/{session_id}/save-auth":{"post":{"summary":"Save Auth","operationId":"save_auth_v1_session__session_id__save_auth_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/auth":{"get":{"summary":"List Saved Auth","description":"Sites this tenant has connected (domains only -- cookie values are never returned).","operationId":"list_saved_auth_v1_auth_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/auth/{domain}":{"delete":{"summary":"Delete Saved Auth","operationId":"delete_saved_auth_v1_auth__domain__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"domain","in":"path","required":true,"schema":{"type":"string","title":"Domain"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/session/{session_id}/act":{"post":{"summary":"Session Act","description":"Drive a human-style INPUT on the session's visible page (issue #142): click / type /\nfill / press / scroll / set-clipboard / wait_for -- so an agent can fill a login, click a\nbutton, or dismiss a dialog, not just navigate. Acts on the tab the live view shows.\nSECURITY: `text` is a secret (passwords/tokens) -- never logged or echoed; only ok/fail\nreturns.","operationId":"session_act_v1_session__session_id__act_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/session/{session_id}/navigate":{"post":{"summary":"Session Navigate","description":"Open a URL in a KEPT-OPEN tab and leave it there — so the interactive live view has a\nreal page to click/type on. Unlike /v1/fetch (which renders then closes its tab), this\nholds the page open until you navigate again or end the session.","operationId":"session_navigate_v1_session__session_id__navigate_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NavigateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/session/{session_id}/rotate-ip":{"post":{"summary":"Rotate Ip","description":"Move this session to a FRESH residential exit IP. Sessions are sticky to one coherent\nIP by default (good for anti-bot); call this to rotate — e.g. when a site starts blocking,\nor between logical tasks. The next request egresses from a new IP.","operationId":"rotate_ip_v1_session__session_id__rotate_ip_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/agent/tasks":{"get":{"summary":"Agent Tasks List","description":"List the available high-level browser-agent tasks.","operationId":"agent_tasks_list_v1_agent_tasks_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/agent":{"post":{"summary":"Agent Task","description":"Run a named high-level browser-agent task against the session's browser.\nTasks (login, paginate_collect, extract_table, multi_step_checkout, …) compose\nthe engine into complex real-world flows; see GET /v1/agent/tasks.","operationId":"agent_task_v1_agent_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentTaskRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentTaskResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/templates":{"get":{"summary":"List Templates","description":"Catalogue of available workflow templates. `inputs` is the JSON Schema of each one's\nparams — the same schema the MCP tool advertises.","operationId":"list_templates_v1_templates_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"}},{"name":"tag","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tag"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/template":{"post":{"summary":"Run Template","description":"Run a named workflow template against the session's browser. Mirrors /v1/agent\n(auth, quota, SSRF-guarding, metering, async job) so templates are first-class, not a\nside door that skips the protections real endpoints have.","operationId":"run_template_v1_template_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TemplateRunRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentTaskResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/search/engines":{"get":{"tags":["search"],"summary":"List Engines","description":"The search engines this endpoint supports.","operationId":"list_engines_v1_search_engines_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/search":{"post":{"tags":["search"],"summary":"Do Search","operationId":"do_search_v1_search_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchResultModel"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/plan/health":{"get":{"tags":["plan"],"summary":"Plan Health","operationId":"plan_health_v1_plan_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/plan":{"post":{"tags":["plan"],"summary":"Make Plan","operationId":"make_plan_v1_plan_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlanRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/workflow":{"post":{"tags":["workflow"],"summary":"Run Workflow","operationId":"run_workflow_v1_workflow_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/task":{"post":{"tags":["determinism"],"summary":"Run Task","operationId":"run_task_v1_task_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TaskRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TaskResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/skills":{"get":{"tags":["determinism"],"summary":"List Skills","operationId":"list_skills_v1_skills_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/determinism/stats":{"get":{"tags":["determinism"],"summary":"Stats","operationId":"stats_v1_determinism_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}}},"components":{"schemas":{"ActRequest":{"properties":{"action":{"type":"string","enum":["click","type","fill","press","scroll","set_clipboard","wait_for"],"title":"Action"},"selector":{"anyOf":[{"type":"string","maxLength":2048},{"type":"null"}],"title":"Selector"},"by_text":{"anyOf":[{"type":"string","maxLength":512},{"type":"null"}],"title":"By Text"},"text":{"anyOf":[{"type":"string","maxLength":20000},{"type":"null"}],"title":"Text"},"key":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Key"},"dy":{"anyOf":[{"type":"integer","maximum":200000.0,"minimum":-200000.0},{"type":"null"}],"title":"Dy"}},"type":"object","required":["action"],"title":"ActRequest","description":"A human-style input on the session's visible page (issue #142). ``text`` is SENSITIVE\n(passwords/tokens) -- it is never logged or echoed back; only success/failure returns."},"AdminSessionResponse":{"properties":{"session_id":{"type":"string","title":"Session Id"},"owner":{"type":"string","title":"Owner"},"state":{"type":"string","title":"State"},"region":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Region"},"mode":{"type":"string","title":"Mode"},"age_s":{"type":"number","title":"Age S"}},"type":"object","required":["session_id","owner","state","mode","age_s"],"title":"AdminSessionResponse"},"AgentTaskRequest":{"properties":{"session_id":{"type":"string","maxLength":128,"title":"Session Id"},"task":{"type":"string","maxLength":128,"title":"Task"},"params":{"additionalProperties":true,"type":"object","maxProperties":100,"title":"Params"},"async_mode":{"type":"boolean","title":"Async Mode","default":false}},"type":"object","required":["session_id","task"],"title":"AgentTaskRequest"},"AgentTaskResponse":{"properties":{"session_id":{"type":"string","title":"Session Id"},"task":{"type":"string","title":"Task"},"ok":{"type":"boolean","title":"Ok"},"data":{"title":"Data"},"steps":{"items":{"type":"string"},"type":"array","title":"Steps","default":[]},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"meta":{"additionalProperties":true,"type":"object","title":"Meta","default":{}},"job_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Job Id"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},"type":"object","required":["session_id","task","ok"],"title":"AgentTaskResponse"},"BlockEventResponse":{"properties":{"block_id":{"type":"string","title":"Block Id"},"ts":{"type":"number","title":"Ts"},"owner":{"type":"string","title":"Owner"},"domain":{"type":"string","title":"Domain"},"url_path":{"type":"string","title":"Url Path"},"block_type":{"type":"string","title":"Block Type"},"vendor":{"type":"string","title":"Vendor"},"confidence":{"type":"number","title":"Confidence"},"http_status":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Http Status"},"signals":{"items":{"type":"string"},"type":"array","title":"Signals","default":[]}},"type":"object","required":["block_id","ts","owner","domain","url_path","block_type","vendor","confidence"],"title":"BlockEventResponse"},"CrawlRequest":{"properties":{"url":{"type":"string","maxLength":4096,"title":"Url"},"max_pages":{"type":"integer","maximum":100.0,"minimum":1.0,"title":"Max Pages","default":10},"depth":{"type":"integer","maximum":5.0,"minimum":1.0,"title":"Depth","default":2},"include_patterns":{"items":{"type":"string"},"type":"array","maxItems":20,"title":"Include Patterns"},"exclude_patterns":{"items":{"type":"string"},"type":"array","maxItems":20,"title":"Exclude Patterns"},"formats":{"items":{"type":"string","enum":["markdown","html","text"]},"type":"array","title":"Formats"},"residential":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Residential"},"region":{"anyOf":[{"type":"string","maxLength":32},{"type":"null"}],"title":"Region"}},"type":"object","required":["url"],"title":"CrawlRequest"},"CreateKeyRequest":{"properties":{"owner":{"type":"string","maxLength":200,"minLength":1,"title":"Owner"},"label":{"type":"string","maxLength":200,"title":"Label","default":""},"concurrency":{"type":"integer","maximum":1000.0,"minimum":1.0,"title":"Concurrency","default":100}},"type":"object","required":["owner"],"title":"CreateKeyRequest"},"CreateSessionRequest":{"properties":{"mode":{"type":"string","enum":["ephemeral","persistent"],"title":"Mode","default":"ephemeral"},"region":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Region"},"persona":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Persona"},"ttl":{"anyOf":[{"type":"number","maximum":86400.0,"minimum":1.0},{"type":"null"}],"title":"Ttl"},"idle_timeout":{"anyOf":[{"type":"number","maximum":3600.0,"minimum":1.0},{"type":"null"}],"title":"Idle Timeout"},"warm_up":{"type":"boolean","title":"Warm Up","default":false},"proxy_rotation":{"anyOf":[{"type":"string","enum":["per_session","per_request","manual"]},{"type":"null"}],"title":"Proxy Rotation"},"residential":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Residential"},"full_browser":{"type":"boolean","title":"Full Browser","default":false},"kiosk":{"type":"boolean","title":"Kiosk","default":false},"start_url":{"anyOf":[{"type":"string","maxLength":2048},{"type":"null"}],"title":"Start Url"},"stealth":{"type":"boolean","title":"Stealth","default":true},"block_ads":{"anyOf":[{"type":"boolean"},{"type":"string"}],"title":"Block Ads","default":false}},"type":"object","title":"CreateSessionRequest"},"CreatedKeyResponse":{"properties":{"id":{"type":"string","title":"Id"},"owner":{"type":"string","title":"Owner"},"label":{"type":"string","title":"Label"},"created_at":{"type":"number","title":"Created At"},"immutable":{"type":"boolean","title":"Immutable"},"token_masked":{"type":"string","title":"Token Masked"},"token":{"type":"string","title":"Token"}},"type":"object","required":["id","owner","label","created_at","immutable","token_masked","token"],"title":"CreatedKeyResponse"},"ExtractRequest":{"properties":{"session_id":{"type":"string","title":"Session Id"},"url":{"type":"string","maxLength":4096,"title":"Url"},"schema":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Schema"},"prompt":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Prompt"},"wait_ms":{"anyOf":[{"type":"integer","maximum":60000.0,"minimum":0.0},{"type":"null"}],"title":"Wait Ms"}},"type":"object","required":["session_id","url"],"title":"ExtractRequest"},"ExtractResponse":{"properties":{"data":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Data"},"extract_tokens":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Extract Tokens"},"session_id":{"type":"string","title":"Session Id"},"final_url":{"type":"string","title":"Final Url"},"status":{"type":"string","title":"Status","default":"ok"},"blocked_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Blocked Reason"},"self_healed":{"type":"boolean","title":"Self Healed","default":false},"premium_required":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Premium Required"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"markdown":{"type":"string","title":"Markdown","default":""},"markdown_len":{"type":"integer","title":"Markdown Len","default":0},"tokens_estimate":{"type":"integer","title":"Tokens Estimate","default":0}},"type":"object","required":["session_id","final_url"],"title":"ExtractResponse"},"FetchRequest":{"properties":{"session_id":{"type":"string","title":"Session Id"},"url":{"type":"string","maxLength":4096,"title":"Url"},"render":{"type":"boolean","title":"Render","default":true},"record":{"type":"boolean","title":"Record","default":false},"include_html":{"type":"boolean","title":"Include Html","default":false},"async_mode":{"type":"boolean","title":"Async Mode","default":false}},"type":"object","required":["session_id","url"],"title":"FetchRequest"},"FetchResponse":{"properties":{"session_id":{"type":"string","title":"Session Id"},"final_url":{"type":"string","title":"Final Url","default":""},"status":{"type":"string","title":"Status"},"job_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Job Id"},"captcha":{"type":"string","title":"Captcha","default":"none"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"text":{"type":"string","title":"Text","default":""},"html_len":{"type":"integer","title":"Html Len","default":0},"html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Html"},"self_healed":{"type":"boolean","title":"Self Healed","default":false},"recovery":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Recovery"},"replay_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Replay Url"},"detected":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Detected"},"content_ok":{"type":"boolean","title":"Content Ok","default":false},"status_reconciled":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status Reconciled"},"premium_required":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Premium Required"}},"type":"object","required":["session_id","status"],"title":"FetchResponse"},"FileFetchRequest":{"properties":{"url":{"type":"string","maxLength":4096,"title":"Url"},"max_bytes":{"anyOf":[{"type":"integer","minimum":1.0},{"type":"null"}],"title":"Max Bytes"}},"type":"object","required":["url"],"title":"FileFetchRequest"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"InspectRequest":{"properties":{"session_id":{"type":"string","title":"Session Id"},"url":{"type":"string","maxLength":4096,"title":"Url"},"duration":{"type":"number","minimum":0.0,"title":"Duration","default":60.0},"async_mode":{"type":"boolean","title":"Async Mode","default":false}},"type":"object","required":["session_id","url"],"title":"InspectRequest"},"JobResponse":{"properties":{"session_id":{"type":"string","title":"Session Id"},"job_id":{"type":"string","title":"Job Id"},"kind":{"type":"string","title":"Kind","default":"job"},"status":{"type":"string","title":"Status"},"result":{"title":"Result"}},"type":"object","required":["session_id","job_id","status"],"title":"JobResponse","description":"Generic async-job envelope for the shared poll GET /v1/job/{job_id}\n(fetch / inspect / agent). status: pending (running) | done | error."},"KeyResponse":{"properties":{"id":{"type":"string","title":"Id"},"owner":{"type":"string","title":"Owner"},"label":{"type":"string","title":"Label"},"created_at":{"type":"number","title":"Created At"},"immutable":{"type":"boolean","title":"Immutable"},"token_masked":{"type":"string","title":"Token Masked"}},"type":"object","required":["id","owner","label","created_at","immutable","token_masked"],"title":"KeyResponse"},"NavigateRequest":{"properties":{"url":{"type":"string","maxLength":4096,"title":"Url"},"session_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Id"},"tab_id":{"anyOf":[{"type":"string","maxLength":256},{"type":"null"}],"title":"Tab Id"}},"type":"object","required":["url"],"title":"NavigateRequest"},"OpenTabRequest":{"properties":{"url":{"anyOf":[{"type":"string","maxLength":4096},{"type":"null"}],"title":"Url"}},"type":"object","title":"OpenTabRequest"},"PlanRequest":{"properties":{"prompt":{"type":"string","maxLength":8000,"minLength":1,"title":"Prompt","description":"the natural-language task"},"answers":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Answers","description":"answers to a prior plan's clarifications"}},"type":"object","required":["prompt"],"title":"PlanRequest"},"PoolTargetRequest":{"properties":{"target":{"type":"integer","maximum":500.0,"minimum":0.0,"title":"Target","description":"Warm VMs to keep ready in this region. 0 disables the pool."}},"type":"object","required":["target"],"title":"PoolTargetRequest"},"ScrapeRequest":{"properties":{"url":{"type":"string","maxLength":4096,"title":"Url"},"formats":{"items":{"type":"string","enum":["markdown","html","text"]},"type":"array","title":"Formats"},"schema":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Schema"},"prompt":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Prompt"},"residential":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Residential"},"region":{"anyOf":[{"type":"string","maxLength":32},{"type":"null"}],"title":"Region"}},"type":"object","required":["url"],"title":"ScrapeRequest","description":"One-shot: no session required. The caller gets a page (or a site) and never manages a\nbrowser lifecycle -- the shape Firecrawl and Hyperbrowser sell and the one we lacked."},"SearchHitModel":{"properties":{"title":{"type":"string","title":"Title"},"url":{"type":"string","title":"Url"},"snippet":{"type":"string","title":"Snippet"},"rank":{"type":"integer","title":"Rank"},"engine":{"type":"string","title":"Engine"}},"type":"object","required":["title","url","snippet","rank","engine"],"title":"SearchHitModel"},"SearchRequest":{"properties":{"query":{"type":"string","maxLength":2000,"minLength":1,"title":"Query","description":"search string"},"engine":{"type":"string","title":"Engine","default":"bing"},"count":{"type":"integer","maximum":100.0,"minimum":1.0,"title":"Count","default":10},"offset":{"type":"integer","minimum":0.0,"title":"Offset","default":0},"session_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Id"},"collapse_domains":{"type":"boolean","title":"Collapse Domains","default":false}},"type":"object","required":["query"],"title":"SearchRequest"},"SearchResultModel":{"properties":{"query":{"type":"string","title":"Query"},"engine":{"type":"string","title":"Engine"},"count":{"type":"integer","title":"Count"},"offset":{"type":"integer","title":"Offset"},"total_found":{"type":"integer","title":"Total Found"},"has_more":{"type":"boolean","title":"Has More"},"results":{"items":{"$ref":"#/components/schemas/SearchHitModel"},"type":"array","title":"Results","default":[]},"status":{"type":"string","title":"Status","default":"ok"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"},"knowledge_graph":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Knowledge Graph"},"people_also_ask":{"items":{},"type":"array","title":"People Also Ask","default":[]},"related_searches":{"items":{},"type":"array","title":"Related Searches","default":[]},"answer_box":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Answer Box"}},"type":"object","required":["query","engine","count","offset","total_found","has_more"],"title":"SearchResultModel"},"SessionContextRequest":{"properties":{"context":{"additionalProperties":true,"type":"object","title":"Context"},"url":{"anyOf":[{"type":"string","maxLength":4096},{"type":"null"}],"title":"Url"}},"type":"object","title":"SessionContextRequest"},"SessionResponse":{"properties":{"session_id":{"type":"string","title":"Session Id"},"state":{"type":"string","title":"State"},"mode":{"type":"string","title":"Mode"},"region":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Region"},"owner":{"type":"string","title":"Owner"},"worker_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Worker Id"},"connect_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Connect Url"},"connect_expires_in":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Connect Expires In"},"full_browser":{"type":"boolean","title":"Full Browser","default":false}},"type":"object","required":["session_id","state","mode","owner"],"title":"SessionResponse"},"SiteHealthResponse":{"properties":{"owner":{"type":"string","title":"Owner"},"domain":{"type":"string","title":"Domain"},"blocks_total":{"type":"integer","title":"Blocks Total"},"heals_attempted":{"type":"integer","title":"Heals Attempted"},"heals_succeeded":{"type":"integer","title":"Heals Succeeded"},"heal_success_rate":{"type":"number","title":"Heal Success Rate"},"cost_usd_total":{"type":"number","title":"Cost Usd Total"},"block_rate_1h":{"type":"number","title":"Block Rate 1H"},"block_rate_24h":{"type":"number","title":"Block Rate 24H"},"top_block_types":{"items":{},"type":"array","title":"Top Block Types"},"best_strategy":{"anyOf":[{"items":{},"type":"array"},{"type":"null"}],"title":"Best Strategy"},"cb_state":{"type":"string","title":"Cb State"},"last_blocked_ts":{"type":"number","title":"Last Blocked Ts"},"last_healed_ts":{"type":"number","title":"Last Healed Ts"},"recommended_persona":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Recommended Persona"},"recommended_region":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Recommended Region"},"recommended_ip_class":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Recommended Ip Class"}},"type":"object","required":["owner","domain","blocks_total","heals_attempted","heals_succeeded","heal_success_rate","cost_usd_total","block_rate_1h","block_rate_24h","top_block_types","cb_state","last_blocked_ts","last_healed_ts"],"title":"SiteHealthResponse"},"TaskRequest":{"properties":{"domain":{"type":"string","maxLength":253,"title":"Domain","description":"site key the skill is keyed on"},"goal":{"type":"string","maxLength":2000,"title":"Goal","description":"natural-language intent"},"session_id":{"type":"string","maxLength":128,"title":"Session Id","description":"an existing session to drive"},"url":{"anyOf":[{"type":"string","maxLength":4096},{"type":"null"}],"title":"Url","description":"page to navigate for a cold derive"},"binding":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object","maxProperties":200},{"type":"null"}],"title":"Binding","description":"field -> 'selector' or 'selector@attr' extract map"},"wait_for":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Wait For","description":"optional signal, e.g. {'type':'selector','value':'div.x'}"},"schema_keys":{"anyOf":[{"items":{"type":"string"},"type":"array","maxItems":200},{"type":"null"}],"title":"Schema Keys","description":"expected output field names"},"variables":{"additionalProperties":true,"type":"object","maxProperties":200,"title":"Variables","description":"{slot} values"}},"type":"object","required":["domain","goal","session_id"],"title":"TaskRequest"},"TaskResponse":{"properties":{"data":{"additionalProperties":true,"type":"object","title":"Data"},"decision":{"type":"string","title":"Decision"},"success":{"type":"boolean","title":"Success"},"from_cache":{"type":"boolean","title":"From Cache"},"self_healed":{"type":"boolean","title":"Self Healed"},"tokens_used":{"type":"integer","title":"Tokens Used"},"tokens_saved":{"type":"integer","title":"Tokens Saved"},"skill_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Skill Id"},"reason":{"type":"string","title":"Reason"},"vertical":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vertical"},"archetype":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Archetype"},"warm_start":{"type":"boolean","title":"Warm Start","default":false},"guard_level":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Guard Level"}},"type":"object","required":["data","decision","success","from_cache","self_healed","tokens_used","tokens_saved","skill_id","reason"],"title":"TaskResponse"},"TemplateRunRequest":{"properties":{"session_id":{"type":"string","maxLength":128,"title":"Session Id"},"name":{"type":"string","maxLength":128,"title":"Name"},"params":{"additionalProperties":true,"type":"object","maxProperties":100,"title":"Params"},"async_mode":{"type":"boolean","title":"Async Mode","default":false}},"type":"object","required":["session_id","name"],"title":"TemplateRunRequest"},"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"},"WorkflowRequest":{"properties":{"prompt":{"type":"string","maxLength":8000,"minLength":1,"title":"Prompt"},"session_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Id","description":"drive this session's browser (owner-scoped)"},"answers":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Answers"},"max_records":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Records","description":"override the plan's target count"},"budget_tokens":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Budget Tokens","description":"hard token ceiling for execution"},"max_rows_in_response":{"type":"integer","maximum":5000.0,"minimum":1.0,"title":"Max Rows In Response","default":200}},"type":"object","required":["prompt"],"title":"WorkflowRequest"}},"securitySchemes":{"HTTPBearer":{"type":"http","scheme":"bearer"}}}}