{"components":{"responses":{"BadRequest":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Bad Request – invalid input"},"CapacityExhausted":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Capacity exhausted, unable to fulfill request at this time"},"Conflict":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Conflict – resource already exists"},"Forbidden":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Forbidden – insufficient permissions or plan"},"Gone":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Resource expired or no longer available"},"InternalError":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Internal Server Error"},"NotFound":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Resource not found"},"TooManyRequests":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Too Many Requests – rate limit exceeded","headers":{"Retry-After":{"description":"Seconds to wait before retrying","schema":{"type":"integer"}}}},"Unauthorized":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Unauthorized – missing or invalid authorization token"},"UnprocessableEntity":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Unprocessable Entity – request was valid but the operation failed"}},"schemas":{"ApiKey":{"properties":{"created_at":{"description":"When the API key was created","format":"date-time","type":"string"},"created_by":{"$ref":"#/components/schemas/ApiKeyCreator"},"deleted_at":{"description":"When the API key was deleted (soft-deleted). Null for keys that have not been deleted.","format":"date-time","nullable":true,"type":"string"},"expires_at":{"description":"When the API key expires","format":"date-time","nullable":true,"type":"string"},"id":{"description":"Unique API key identifier","example":"ckv9w8q2f000001l5r3j7k9m4","type":"string"},"masked_key":{"description":"Masked version of the API key","example":"sk_1234...abcd","type":"string"},"name":{"description":"Label for the API key. API keys are not addressable by name; use the ID or key identifier for stable references.","example":"production","type":"string"},"project_id":{"description":"Project identifier for project-scoped API keys. Null means org-wide.","example":"proj_abc123","nullable":true,"type":"string"},"project_name":{"description":"Project name for project-scoped API keys. Null means the key is org-wide or the project name is unavailable.","example":"Production","nullable":true,"type":"string"}},"required":["id","name","created_at","created_by","expires_at","deleted_at","project_id","project_name","masked_key"],"type":"object"},"ApiKeyCreator":{"properties":{"email":{"description":"Email address of the creator.","example":"user@example.com","format":"email","type":"string"},"id":{"description":"Kernel user ID of the creator.","example":"user-abc123","type":"string"},"name":{"description":"Display name of the creator, if available.","example":"Jane Doe","nullable":true,"type":"string"}},"required":["id","email","name"],"type":"object"},"AppAction":{"description":"An action available on the app","properties":{"input_schema":{"additionalProperties":true,"description":"JSON Schema (draft-07) describing the expected input payload. Null if schema could not be automatically generated.","nullable":true,"type":"object"},"name":{"description":"Name of the action","example":"analyze","type":"string"},"output_schema":{"additionalProperties":true,"description":"JSON Schema (draft-07) describing the expected output payload. Null if schema could not be automatically generated.","nullable":true,"type":"object"}},"required":["name"],"type":"object"},"AppVersionSummary":{"description":"Summary of an application version.","properties":{"actions":{"description":"List of actions available on the app","items":{"$ref":"#/components/schemas/AppAction"},"type":"array"},"app_name":{"description":"Name of the application","example":"my-app","type":"string"},"deployment":{"description":"Deployment ID","type":"string"},"env_vars":{"additionalProperties":{"type":"string"},"description":"Environment variables configured for this app version. Values are redacted for API key, OAuth, and managed-auth callers, which receive every key with an empty string value. Only dashboard sessions receive the actual values.","type":"object"},"id":{"description":"Unique identifier for the app version","example":"rr33xuugxj9h0bkf1rdt2bet","type":"string"},"region":{"const":"aws.us-east-1a","description":"Deployment region code","example":"aws.us-east-1a","type":"string"},"version":{"description":"Version label for the application","example":"1.0.0","type":"string"}},"required":["id","app_name","version","region","deployment","actions","env_vars"],"type":"object"},"AppVersionSummaryEvent":{"description":"Summary of an application version.","properties":{"actions":{"description":"List of actions available on the app","items":{"$ref":"#/components/schemas/AppAction"},"type":"array"},"app_name":{"description":"Name of the application","example":"my-app","type":"string"},"env_vars":{"additionalProperties":{"type":"string"},"description":"Environment variables configured for this app version. Not currently populated on streamed app_version_summary events.","type":"object"},"event":{"const":"app_version_summary","description":"Event type identifier (always \"app_version_summary\").","type":"string"},"id":{"description":"Unique identifier for the app version","example":"rr33xuugxj9h0bkf1rdt2bet","type":"string"},"region":{"const":"aws.us-east-1a","description":"Deployment region code","example":"aws.us-east-1a","type":"string"},"timestamp":{"description":"Time the state was reported.","format":"date-time","type":"string"},"version":{"description":"Version label for the application","example":"1.0.0","type":"string"}},"required":["event","timestamp","id","app_name","version","region","actions"],"type":"object"},"AuditLogEntry":{"properties":{"auth_strategy":{"description":"Authentication strategy used for the request.","type":"string"},"client_ip":{"description":"Client IP address.","type":"string"},"domain":{"description":"Request host.","type":"string"},"duration_ms":{"description":"Request duration in milliseconds.","type":"integer"},"email":{"description":"Email of the authenticated user at request time, if any.","type":"string"},"method":{"description":"HTTP method.","type":"string"},"path":{"description":"Request path.","type":"string"},"route":{"description":"Matched API route pattern, if available.","type":"string"},"status":{"description":"HTTP response status code.","type":"integer"},"timestamp":{"description":"UTC time when the request was received.","format":"date-time","type":"string"},"user_agent":{"description":"User agent header.","type":"string"},"user_id":{"description":"ID of the authenticated user, if any.","type":"string"}},"required":["timestamp","auth_strategy","user_id","email","status","method","path","route","domain","duration_ms","client_ip","user_agent"],"type":"object"},"AuditLogExportDestination":{"additionalProperties":false,"description":"An organization-scoped audit log export destination.\n\nDelivery is at-least-once for rows visible when their window is committed: a delivery that is retried rewrites the same object, and the same `event_id` can appear in more than one object, so consumers must deduplicate on `event_id`. Each event-time window is held for ten minutes before it commits; a row that becomes visible after its window is committed may not be delivered.\n\nObjects are written as `\u003cprefix\u003e/destination_id=\u003cdestination\u003e/org_id=\u003corg\u003e/date=\u003cYYYY-MM-DD\u003e/hour=\u003cHH\u003e/\u003cwindow\u003e-\u003cchunk\u003e.jsonl.gz`, where `date` and `hour` are the UTC calendar hour that fully contains every row in the object, so the layout is safe to register as a Hive-partitioned table. The object name is derived from the rows it holds, so a retried delivery rewrites its own object.","properties":{"bucket":{"maxLength":63,"minLength":3,"type":"string"},"consecutive_failures":{"minimum":0,"readOnly":true,"type":"integer","x-go-type-skip-optional-pointer":true,"x-omitempty":false},"created_at":{"format":"date-time","readOnly":true,"type":"string","x-go-type-skip-optional-pointer":true},"external_id":{"maxLength":128,"readOnly":true,"type":"string","x-go-type-skip-optional-pointer":true},"format":{"enum":["jsonl.gz"],"type":"string"},"id":{"maxLength":128,"readOnly":true,"type":"string","x-go-type-skip-optional-pointer":true},"kernel_role_arn":{"description":"The Kernel role that assumes `role_arn` in your account to deliver logs. Allow this role as the principal in your role's trust policy, and require `external_id` as the `sts:ExternalId` condition.\n\nRecreating a destination issues a new `external_id`, which the trust policy has to be updated to match.","maxLength":2048,"readOnly":true,"type":"string","x-go-type-skip-optional-pointer":true},"kms_key_id":{"maxLength":2048,"type":"string"},"last_error":{"description":"Sanitized description of the most recent delivery failure.","readOnly":true,"type":"string"},"last_error_at":{"format":"date-time","readOnly":true,"type":"string"},"last_exported_cursor":{"description":"Opaque, versioned checkpoint for forward-only continuous export. This value is not compatible with audit-log list page tokens.\n\nDelivery starts at the moment the destination is activated, so events recorded before that are not delivered. Pausing stops delivery and resuming starts again from the time of the resume: events recorded while a destination was paused are never exported, and pausing is not a way to defer delivery.","readOnly":true,"type":"string"},"last_success_at":{"format":"date-time","readOnly":true,"type":"string"},"next_attempt_at":{"format":"date-time","readOnly":true,"type":"string"},"prefix":{"maxLength":512,"type":"string"},"region":{"maxLength":128,"minLength":1,"type":"string"},"role_arn":{"maxLength":2048,"minLength":1,"type":"string"},"status":{"description":"Pausing prevents new delivery attempts. An S3 upload already in progress may complete after the pause response; its rows can appear again after the destination is resumed.","enum":["active","paused"],"type":"string"},"type":{"enum":["s3"],"type":"string"},"updated_at":{"format":"date-time","readOnly":true,"type":"string","x-go-type-skip-optional-pointer":true}},"required":["id","type","region","bucket","prefix","role_arn","external_id","kernel_role_arn","format","status","consecutive_failures","created_at","updated_at"],"type":"object"},"AuditLogExportDestinationTestResult":{"additionalProperties":false,"properties":{"error":{"additionalProperties":false,"properties":{"code":{"enum":["assume_role_failed","put_object_failed"],"type":"string"},"message":{"type":"string"}},"required":["code","message"],"type":"object"},"stage":{"enum":["assume_role","put_object","complete"],"type":"string"},"success":{"type":"boolean"}},"required":["success","stage"],"type":"object"},"AuthContext":{"description":"The identity and authorization context resolved for the current request.","properties":{"authentication":{"$ref":"#/components/schemas/AuthContextAuthentication"},"authorization":{"$ref":"#/components/schemas/AuthContextAuthorization"},"organization":{"$ref":"#/components/schemas/AuthContextOrganization"},"principal":{"$ref":"#/components/schemas/AuthContextPrincipal"}},"required":["authentication","principal","organization","authorization"],"type":"object"},"AuthContextAuthentication":{"properties":{"credential_id":{"description":"The API key ID when authenticated with an API key; null for session credentials.","type":["string","null"]},"method":{"description":"The credential format used to authenticate the request.","enum":["api_key","jwt"],"type":"string"},"source":{"description":"The source classification resolved by authentication middleware.","enum":["api_key","oauth","dashboard"],"type":"string"}},"required":["method","source","credential_id"],"type":"object"},"AuthContextAuthorization":{"description":"The credential's maximum scope and the effective scope selected for this request. Future permission data can be added without changing scope semantics.","properties":{"credential_scope":{"$ref":"#/components/schemas/AuthContextScope"},"effective_scope":{"$ref":"#/components/schemas/AuthContextScope"}},"required":["credential_scope","effective_scope"],"type":"object"},"AuthContextOrganization":{"properties":{"id":{"description":"The authenticated Kernel organization ID.","type":"string"}},"required":["id"],"type":"object"},"AuthContextPrincipal":{"properties":{"id":{"description":"The API key ID for API-key principals or user ID for user principals.","type":"string"},"type":{"description":"The kind of principal authenticated for the request.","enum":["api_key","user"],"type":"string"}},"required":["type","id"],"type":"object"},"AuthContextScope":{"description":"A scope within the authenticated organization. A null project_id represents organization-wide scope.","properties":{"project_id":{"description":"The Kernel project ID, or null when the scope is organization-wide.","type":["string","null"]}},"required":["project_id"],"type":"object"},"BatchComputerActionRequest":{"additionalProperties":false,"description":"A batch of computer actions to execute sequentially.","properties":{"actions":{"description":"Ordered list of actions to execute. Execution stops on the first error.","items":{"$ref":"#/components/schemas/ComputerAction"},"maxItems":100,"minItems":1,"type":"array"}},"required":["actions"],"type":"object"},"Browser":{"properties":{"base_url":{"description":"Metro-API HTTP base URL for this browser session.","example":"https://proxy.yul-upbeat-herschel.onkernel.com:8443/browser/kernel","type":"string"},"browser_live_view_url":{"description":"Remote URL for live viewing the browser session. Only available for non-headless browsers.","example":"https://proxy.yul-upbeat-herschel.onkernel.com:8443/browser/live?jwt=eyJ0eXAi...","type":"string"},"cdp_ws_url":{"description":"Websocket URL for Chrome DevTools Protocol connections to the browser session","example":"wss://proxy.yul-upbeat-herschel.onkernel.com:8443/browser/cdp?jwt=eyJ0eXAi...","type":"string"},"chrome_policy":{"additionalProperties":true,"description":"Custom Chrome enterprise policy overrides that were applied to this browser session, if any. Echoed back for verification. Keys are Chrome enterprise policy names.\n","type":"object"},"created_at":{"description":"When the browser session was created.","format":"date-time","type":"string"},"deleted_at":{"description":"When the browser session was soft-deleted. Only present for deleted sessions.","format":"date-time","type":"string"},"gpu":{"description":"Whether GPU acceleration is enabled for the browser session (only supported for headful sessions).","example":false,"type":"boolean"},"headless":{"description":"Whether the browser session is running in headless mode.","example":false,"type":"boolean"},"kiosk_mode":{"description":"Whether the browser session is running in kiosk mode.","example":false,"type":"boolean"},"name":{"description":"Human-readable name of the browser session, if one was set at creation.","example":"checkout-flow-1","type":"string"},"network":{"$ref":"#/components/schemas/BrowserNetworkConfig","description":"Network configuration the session was created with, if any. Omitted when the session has no network configuration."},"pool":{"$ref":"#/components/schemas/BrowserPoolRef"},"profile":{"$ref":"#/components/schemas/Profile"},"profile_save_changes":{"description":"Whether changes made during this browser session are saved back to its profile when the session ends. Omitted when no profile is attached.","type":"boolean"},"proxy":{"$ref":"#/components/schemas/BrowserProxy","description":"Resolved proxy configuration for this browser session."},"proxy_id":{"deprecated":true,"description":"ID of the proxy associated with this browser session, if any. Deprecated in favor of proxy.","type":"string","x-deprecated-reason":"Use proxy instead."},"region":{"$ref":"#/components/schemas/Region","description":"Geographic region of the browser session. Fixed once the session is created.\n"},"session_id":{"description":"Unique identifier for the browser session","example":"htzv5orfit78e1m2biiifpbv","type":"string"},"start_url":{"description":"URL the session was asked to navigate to on creation, if any. Recorded for debugging. Navigation is fire-and-forget — the URL is dispatched to the browser without waiting for it to load, and any errors (DNS failure, bad status, timeout) are silently dropped. Captures what was requested, not what the browser actually loaded.","example":"https://example.com","type":"string"},"stealth":{"description":"Whether the browser session is running in stealth mode.","example":false,"type":"boolean"},"tags":{"$ref":"#/components/schemas/Tags","description":"User-defined key-value tags that were set on this browser session, if any. Echoed back when present."},"telemetry":{"$ref":"#/components/schemas/BrowserTelemetryConfig","description":"Active telemetry configuration for the session, if any.","nullable":true},"timeout_seconds":{"description":"The number of seconds of inactivity before the browser session is terminated.","type":"integer"},"usage":{"$ref":"#/components/schemas/BrowserUsage"},"viewport":{"$ref":"#/components/schemas/BrowserViewport"},"webdriver_ws_url":{"description":"Websocket URL for WebDriver BiDi connections to the browser session","example":"wss://proxy.yul-upbeat-herschel.onkernel.com:8443/browser/webdriver/session?jwt=eyJ0eXAi...","type":"string"}},"required":["created_at","cdp_ws_url","webdriver_ws_url","session_id","region","stealth","headless","timeout_seconds"],"type":"object"},"BrowserApiCallEvent":{"description":"An agent-driven HTTP call handled by the in-VM API server.","properties":{"category":{"const":"control","type":"string"},"data":{"additionalProperties":false,"properties":{"duration_ms":{"description":"Wall-clock duration of the handler in milliseconds.","type":"number"},"operation_id":{"description":"OpenAPI operationId of the matched route (e.g. processExec, takeScreenshot).","type":"string"},"request_id":{"description":"Per-request identifier from the in-VM API request middleware.","type":"string"},"status":{"description":"HTTP response status code.","type":"integer"}},"required":["request_id","operation_id","status","duration_ms"],"type":"object"},"source":{"$ref":"#/components/schemas/BrowserEventSource"},"truncated":{"description":"True if the data field was truncated due to size limits.","type":"boolean"},"ts":{"description":"Event timestamp in Unix microseconds.","format":"int64","type":"integer"},"type":{"const":"api_call","type":"string"}},"required":["ts","type","category","source"],"type":"object"},"BrowserCallStack":{"description":"CDP Runtime.StackTrace representing the JavaScript call stack at the time of an event. Fields use CDP naming conventions rather than snake_case to match the Chrome DevTools Protocol wire format.","properties":{"callFrames":{"description":"Ordered list of call frames, outermost first.","items":{"properties":{"columnNumber":{"description":"Zero-based column number within the line.","type":"integer"},"functionName":{"description":"JavaScript function name, or empty string for anonymous functions.","type":"string"},"lineNumber":{"description":"Zero-based line number within the script.","type":"integer"},"scriptId":{"description":"CDP script identifier.","type":"string"},"url":{"description":"URL or name of the script file.","type":"string"}},"required":["functionName","scriptId","url","lineNumber","columnNumber"],"type":"object"},"type":"array"},"description":{"description":"Optional label for the stack trace (e.g. async cause).","type":"string"},"parent":{"$ref":"#/components/schemas/BrowserCallStack","description":"Parent stack trace for async stacks."}},"required":["callFrames"],"type":"object"},"BrowserCaptchaSolveResultEvent":{"description":"A captcha solve attempt reached a terminal outcome.","properties":{"category":{"const":"captcha","type":"string"},"data":{"additionalProperties":false,"properties":{"captcha_type":{"description":"Captcha vendor family. Provider-specific task names are normalized into this set; anything not covered is reported as other.","enum":["hcaptcha","recaptcha_v2","recaptcha_v3","turnstile","geetest","other"],"type":"string","x-go-type":"string"},"duration_ms":{"description":"Wall-clock duration from solve start to terminal outcome.","type":"number"},"error_code":{"description":"Solver-specific error code on failure (e.g. ERROR_CAPTCHA_UNSOLVABLE). Absent on success.","type":"string"},"status":{"description":"Terminal outcome. success: solver returned a usable solution. failure: solver returned an error (see error_code). timeout: solver did not return within the caller's wait budget. abandoned: caller cancelled or the page navigated away mid-solve.","enum":["success","failure","timeout","abandoned"],"type":"string","x-go-type":"string"},"task_id":{"description":"Solver-assigned identifier. Opaque, useful for support cross-references.","type":"string"},"website_host":{"description":"Host of the page where the captcha was solved.","type":"string"},"website_path":{"description":"Path of the page where the captcha was solved. Query string excluded.","type":"string"}},"required":["captcha_type","status","duration_ms"],"type":"object"},"source":{"$ref":"#/components/schemas/BrowserEventSource"},"truncated":{"description":"True if the data field was truncated due to size limits.","type":"boolean"},"ts":{"description":"Event timestamp in Unix microseconds.","format":"int64","type":"integer"},"type":{"const":"captcha_solve_result","type":"string"}},"required":["ts","type","category","source"],"type":"object"},"BrowserCdpConnectEvent":{"description":"An external client (e.g. customer SDK, Playwright, Puppeteer) connected to the CDP WebSocket proxy on this VM.","properties":{"category":{"const":"connection","type":"string"},"source":{"$ref":"#/components/schemas/BrowserEventSource"},"truncated":{"description":"True if the data field was truncated due to size limits.","type":"boolean"},"ts":{"description":"Event timestamp in Unix microseconds.","format":"int64","type":"integer"},"type":{"const":"cdp_connect","type":"string"}},"required":["ts","type","category","source"],"type":"object"},"BrowserCdpDisconnectEvent":{"description":"An external client disconnected from the CDP WebSocket proxy on this VM. Pair with the immediately preceding cdp_connect on the same stream.","properties":{"category":{"const":"connection","type":"string"},"data":{"additionalProperties":false,"properties":{"duration_ms":{"description":"Wall-clock duration of the connection in milliseconds.","type":"number"},"message_count":{"description":"Number of CDP messages relayed across the connection in either direction.","type":"integer"},"reason":{"description":"Why the connection ended. client_close: the client initiated the close. upstream_changed: Chromium restarted mid-session and the proxy tore down so the client could reconnect against the new upstream. upstream_error: upstream dial or message pump errored. context_cancelled: the request context was cancelled (typically server shutdown).","enum":["client_close","upstream_changed","upstream_error","context_cancelled"],"type":"string","x-go-type":"string"}},"required":["duration_ms","message_count","reason"],"type":"object"},"source":{"$ref":"#/components/schemas/BrowserEventSource"},"truncated":{"description":"True if the data field was truncated due to size limits.","type":"boolean"},"ts":{"description":"Event timestamp in Unix microseconds.","format":"int64","type":"integer"},"type":{"const":"cdp_disconnect","type":"string"}},"required":["ts","type","category","source"],"type":"object"},"BrowserConsoleErrorEvent":{"description":"A browser console error or uncaught JavaScript exception event. Emitted from two distinct CDP sources with different data shapes. Runtime.consoleAPICalled (console.error calls) produces level, text, args, and stack_trace. Runtime.exceptionThrown (uncaught exceptions) produces text, line, column, source_url, and stack_trace. Fields not applicable to the source are absent.\n","properties":{"category":{"const":"console","type":"string"},"data":{"allOf":[{"$ref":"#/components/schemas/BrowserEventContext"},{"properties":{"args":{"description":"All console arguments coerced to strings. Present only when sourced from Runtime.consoleAPICalled.","items":{"type":"string"},"type":"array"},"column":{"description":"Column number in the script where the exception was thrown. Present only when sourced from Runtime.exceptionThrown.","type":"integer"},"level":{"description":"CDP console type value, always \"error\". Present only when sourced from Runtime.consoleAPICalled.","type":"string"},"line":{"description":"Line number in the script where the exception was thrown. Present only when sourced from Runtime.exceptionThrown.","type":"integer"},"source_url":{"description":"URL of the script file that threw the exception. Present only when sourced from Runtime.exceptionThrown.","type":"string"},"stack_trace":{"$ref":"#/components/schemas/BrowserCallStack"},"text":{"description":"Human-readable error text, as the browser console would display it. For console.error() calls, the first argument coerced to a string. For uncaught exceptions, the prefix and error message, e.g. \"Uncaught Error: boom\" or \"Uncaught (in promise) TypeError: x is not a function\".\n","type":"string"}},"required":["text"],"type":"object"}]},"source":{"$ref":"#/components/schemas/BrowserEventSource"},"truncated":{"description":"True if the data field was truncated due to size limits.","type":"boolean"},"ts":{"description":"Event timestamp in Unix microseconds.","format":"int64","type":"integer"},"type":{"const":"console_error","type":"string"}},"required":["ts","type","category","source"],"title":"console_error","type":"object"},"BrowserConsoleLogEvent":{"description":"A browser console log event (console.log, console.info, console.warn, etc.).","properties":{"category":{"const":"console","type":"string"},"data":{"allOf":[{"$ref":"#/components/schemas/BrowserEventContext"},{"properties":{"args":{"description":"All console arguments coerced to strings.","items":{"type":"string"},"type":"array"},"level":{"description":"CDP Runtime.consoleAPICalled type, passed through unfiltered from Chrome. error is routed to console_error events instead; all other CDP console types appear here. See CDP spec for the full enum.","type":"string"},"stack_trace":{"$ref":"#/components/schemas/BrowserCallStack"},"text":{"description":"First console argument coerced to string.","type":"string"}},"type":"object"}]},"source":{"$ref":"#/components/schemas/BrowserEventSource"},"truncated":{"description":"True if the data field was truncated due to size limits.","type":"boolean"},"ts":{"description":"Event timestamp in Unix microseconds.","format":"int64","type":"integer"},"type":{"const":"console_log","type":"string"}},"required":["ts","type","category","source"],"title":"console_log","type":"object"},"BrowserCurlRequest":{"additionalProperties":false,"description":"Request to make an HTTP request through the browser's network stack.","properties":{"body":{"description":"Request body (for POST/PUT/PATCH).","type":"string"},"headers":{"additionalProperties":{"type":"string"},"description":"Custom headers merged with browser defaults.","type":"object"},"method":{"default":"GET","description":"HTTP method.","enum":["GET","HEAD","POST","PUT","PATCH","DELETE","OPTIONS"],"type":"string"},"response_encoding":{"default":"utf8","description":"Encoding for the response body. Use base64 for binary content.","enum":["utf8","base64"],"type":"string"},"timeout_ms":{"default":30000,"description":"Request timeout in milliseconds.","maximum":60000,"minimum":1000,"type":"integer"},"url":{"description":"Target URL (must be http or https).","type":"string"}},"required":["url"],"type":"object"},"BrowserCurlResult":{"additionalProperties":false,"description":"Structured response from the browser curl request.","properties":{"body":{"description":"Response body (UTF-8 string or base64 depending on request).","type":"string"},"duration_ms":{"description":"Total request duration in milliseconds.","type":"integer"},"headers":{"additionalProperties":{"items":{"type":"string"},"type":"array"},"description":"Response headers (multi-value).","type":"object"},"status":{"description":"HTTP status code from target.","type":"integer"}},"required":["status","headers","body","duration_ms"],"type":"object"},"BrowserCurlTransportError":{"additionalProperties":false,"description":"Transport-level error when the request could not complete.","properties":{"message":{"description":"Human-readable error description.","type":"string"},"net_error":{"description":"Chromium net error code.","type":"integer"},"net_error_name":{"description":"Chromium net error name.","type":"string"}},"required":["message"],"type":"object"},"BrowserEventContext":{"description":"Browser event context stamped by the browser monitor onto all CDP-sourced events. Identifies the target, frame, and navigation epoch in which the event occurred.","properties":{"frame_id":{"description":"CDP frame identifier within the target.","type":"string"},"loader_id":{"description":"CDP document loader identifier, reset on each navigation.","type":"string"},"nav_seq":{"description":"Monotonically increasing navigation sequence number, incremented on each top-level navigation within the target.","format":"int64","type":"integer"},"session_id":{"description":"CDP session identifier for the target connection.","type":"string"},"target_id":{"description":"Browser target identifier (stable across navigations within a tab).","type":"string"},"target_type":{"$ref":"#/components/schemas/BrowserTargetType"},"url":{"description":"URL relevant to this event — page URL for navigation and page events, request URL for network events.","type":"string"}},"type":"object"},"BrowserEventSource":{"description":"Provenance metadata identifying which producer emitted the event.","properties":{"event":{"description":"Producer-specific event name (e.g. Runtime.consoleAPICalled for CDP-sourced console events, Runtime.exceptionThrown for uncaught exceptions).","type":"string"},"kind":{"description":"Event producer. cdp: Chrome DevTools Protocol events from the browser. kernel_api: Kernel API server. extension: injected Chrome extension. local_process: system process running alongside the browser.","enum":["cdp","kernel_api","extension","local_process"],"type":"string"},"metadata":{"additionalProperties":{"type":"string"},"description":"Producer-specific context (e.g. CDP target/session/frame IDs).","type":"object"}},"required":["kind"],"type":"object"},"BrowserExtension":{"description":"Extension selection for the browser session. Provide either id or name of an extension uploaded to Kernel.\n","oneOf":[{"required":["id"]},{"required":["name"]}],"properties":{"id":{"description":"Extension ID to load for this browser session","type":"string"},"name":{"description":"Extension name to load for this browser session (instead of id). Must be 1-255 characters, using letters, numbers, dots, underscores, or hyphens.","maxLength":255,"minLength":1,"pattern":"^[a-zA-Z0-9._-]{1,255}$","type":"string"}},"type":"object"},"BrowserHttpHeaders":{"additionalProperties":true,"description":"HTTP headers map forwarded as-is from CDP without normalization. Values are typically strings but may be any JSON type.","type":"object"},"BrowserInteractionClickEvent":{"description":"A browser user click event captured via injected page script.","properties":{"category":{"const":"interaction","type":"string"},"data":{"allOf":[{"$ref":"#/components/schemas/BrowserEventContext"},{"properties":{"selector":{"description":"CSS selector path to the clicked element.","type":"string"},"tag":{"description":"HTML tag name of the clicked element in uppercase (e.g. BUTTON, A, DIV).","type":"string"},"text":{"description":"Visible text content of the clicked element, trimmed.","type":"string"},"true":{"description":"Viewport y-coordinate of the click in CSS pixels.","type":"integer"},"x":{"description":"Viewport x-coordinate of the click in CSS pixels.","type":"integer"}},"type":"object"}]},"source":{"$ref":"#/components/schemas/BrowserEventSource"},"truncated":{"description":"True if the data field was truncated due to size limits.","type":"boolean"},"ts":{"description":"Event timestamp in Unix microseconds.","format":"int64","type":"integer"},"type":{"const":"interaction_click","type":"string"}},"required":["ts","type","category","source"],"title":"interaction_click","type":"object"},"BrowserInteractionKeyEvent":{"description":"A browser keyboard event captured via injected page script.","properties":{"category":{"const":"interaction","type":"string"},"data":{"allOf":[{"$ref":"#/components/schemas/BrowserEventContext"},{"properties":{"key":{"description":"Key value from the KeyboardEvent (e.g. Enter, Backspace, a).","type":"string"},"selector":{"description":"CSS selector path to the element that had focus when the key was pressed.","type":"string"},"tag":{"description":"HTML tag name of the focused element in uppercase (e.g. INPUT, TEXTAREA, DIV).","type":"string"}},"type":"object"}]},"source":{"$ref":"#/components/schemas/BrowserEventSource"},"truncated":{"description":"True if the data field was truncated due to size limits.","type":"boolean"},"ts":{"description":"Event timestamp in Unix microseconds.","format":"int64","type":"integer"},"type":{"const":"interaction_key","type":"string"}},"required":["ts","type","category","source"],"title":"interaction_key","type":"object"},"BrowserInteractionScrollSettledEvent":{"description":"A browser scroll settled event emitted after scroll position stops changing, captured via injected page script.","properties":{"category":{"const":"interaction","type":"string"},"data":{"allOf":[{"$ref":"#/components/schemas/BrowserEventContext"},{"properties":{"from_x":{"description":"Scroll x-position at the start of the scroll gesture in CSS pixels.","type":"integer"},"from_y":{"description":"Scroll y-position at the start of the scroll gesture in CSS pixels.","type":"integer"},"target_selector":{"description":"CSS selector path to the scrolled element.","type":"string"},"to_x":{"description":"Final scroll x-position after the gesture settled in CSS pixels.","type":"integer"},"to_y":{"description":"Final scroll y-position after the gesture settled in CSS pixels.","type":"integer"}},"type":"object"}]},"source":{"$ref":"#/components/schemas/BrowserEventSource"},"truncated":{"description":"True if the data field was truncated due to size limits.","type":"boolean"},"ts":{"description":"Event timestamp in Unix microseconds.","format":"int64","type":"integer"},"type":{"const":"interaction_scroll_settled","type":"string"}},"required":["ts","type","category","source"],"title":"interaction_scroll_settled","type":"object"},"BrowserLiveViewConnectEvent":{"description":"A live view client connected to the headful browser's WebRTC server. Headful only; not emitted for headless images.","properties":{"category":{"const":"connection","type":"string"},"data":{"additionalProperties":false,"properties":{"session_id":{"description":"Live view session identifier. Stable across reconnects, so a transient network blip can emit two events with the same session_id.","type":"string"}},"required":["session_id"],"type":"object"},"source":{"$ref":"#/components/schemas/BrowserEventSource"},"truncated":{"description":"True if the data field was truncated due to size limits.","type":"boolean"},"ts":{"description":"Event timestamp in Unix microseconds.","format":"int64","type":"integer"},"type":{"const":"live_view_connect","type":"string"}},"required":["ts","type","category","source"],"type":"object"},"BrowserLiveViewDisconnectEvent":{"description":"A live view client disconnected from the headful browser's WebRTC server. Pair with live_view_connect by session_id.","properties":{"category":{"const":"connection","type":"string"},"data":{"additionalProperties":false,"properties":{"duration_ms":{"description":"Wall-clock duration of the connection in milliseconds.","type":"number"},"session_id":{"description":"Live view session identifier; matches the corresponding live_view_connect event.","type":"string"}},"required":["session_id","duration_ms"],"type":"object"},"source":{"$ref":"#/components/schemas/BrowserEventSource"},"truncated":{"description":"True if the data field was truncated due to size limits.","type":"boolean"},"ts":{"description":"Event timestamp in Unix microseconds.","format":"int64","type":"integer"},"type":{"const":"live_view_disconnect","type":"string"}},"required":["ts","type","category","source"],"type":"object"},"BrowserMonitorDisconnectedEvent":{"description":"The CDP connection to Chrome was lost. Telemetry events may be dropped until monitor_reconnected arrives. Treat any in-progress computed state (network_idle, page_layout_settled) as unreliable until then.","properties":{"category":{"const":"monitor","type":"string"},"data":{"additionalProperties":false,"properties":{"reason":{"description":"Reason for the disconnection. chrome_restarted: Chrome process restarted.","enum":["chrome_restarted"],"type":"string"}},"type":"object"},"source":{"$ref":"#/components/schemas/BrowserEventSource"},"truncated":{"description":"True if the data field was truncated due to size limits.","type":"boolean"},"ts":{"description":"Event timestamp in Unix microseconds.","format":"int64","type":"integer"},"type":{"const":"monitor_disconnected","type":"string"}},"required":["ts","type","category","source"],"title":"monitor_disconnected","type":"object"},"BrowserMonitorInitFailedEvent":{"description":"The CDP session could not be initialized.","properties":{"category":{"const":"monitor","type":"string"},"data":{"additionalProperties":false,"properties":{"step":{"description":"The CDP method or initialization step that failed (e.g. Target.setAutoAttach).","type":"string"}},"type":"object"},"source":{"$ref":"#/components/schemas/BrowserEventSource"},"truncated":{"description":"True if the data field was truncated due to size limits.","type":"boolean"},"ts":{"description":"Event timestamp in Unix microseconds.","format":"int64","type":"integer"},"type":{"const":"monitor_init_failed","type":"string"}},"required":["ts","type","category","source"],"title":"monitor_init_failed","type":"object"},"BrowserMonitorReconnectFailedEvent":{"description":"The CDP connection to Chrome could not be re-established after exhausting all reconnection attempts. No further telemetry events will arrive on this session.","properties":{"category":{"const":"monitor","type":"string"},"data":{"additionalProperties":false,"properties":{"reason":{"description":"Reason for the reconnection failure. reconnect_exhausted: all retry attempts were used up without successfully restoring the CDP connection.","enum":["reconnect_exhausted"],"type":"string"}},"type":"object"},"source":{"$ref":"#/components/schemas/BrowserEventSource"},"truncated":{"description":"True if the data field was truncated due to size limits.","type":"boolean"},"ts":{"description":"Event timestamp in Unix microseconds.","format":"int64","type":"integer"},"type":{"const":"monitor_reconnect_failed","type":"string"}},"required":["ts","type","category","source"],"title":"monitor_reconnect_failed","type":"object"},"BrowserMonitorReconnectedEvent":{"description":"The CDP connection to Chrome was successfully re-established after a disconnection. Events emitted during the gap are lost. Computed state is reset, so navigation and network tracking restart fresh from this point.","properties":{"category":{"const":"monitor","type":"string"},"data":{"additionalProperties":false,"properties":{"reconnect_duration_ms":{"description":"Wall-clock time in milliseconds taken to reconnect after the disconnection.","format":"int64","type":"integer"}},"type":"object"},"source":{"$ref":"#/components/schemas/BrowserEventSource"},"truncated":{"description":"True if the data field was truncated due to size limits.","type":"boolean"},"ts":{"description":"Event timestamp in Unix microseconds.","format":"int64","type":"integer"},"type":{"const":"monitor_reconnected","type":"string"}},"required":["ts","type","category","source"],"title":"monitor_reconnected","type":"object"},"BrowserMonitorScreenshotEvent":{"description":"A periodic screenshot of the browser viewport.","properties":{"category":{"const":"screenshot","type":"string"},"data":{"additionalProperties":false,"properties":{"png":{"contentEncoding":"base64","description":"Base64-encoded PNG screenshot of the browser viewport.","type":"string"}},"type":"object"},"source":{"$ref":"#/components/schemas/BrowserEventSource"},"truncated":{"description":"True if the data field was truncated due to size limits.","type":"boolean"},"ts":{"description":"Event timestamp in Unix microseconds.","format":"int64","type":"integer"},"type":{"const":"monitor_screenshot","type":"string"}},"required":["ts","type","category","source"],"title":"monitor_screenshot","type":"object"},"BrowserNetworkConfig":{"description":"Network configuration for a browser session or browser pool.\n","properties":{"private_hosts":{"description":"Destinations the browser reaches directly through the session's own network instead of through Kernel-managed egress — for private hosts reachable over a VPN or tunnel the session has joined (e.g. a Tailscale tailnet). By default, private IP ranges already route directly: RFC1918 (10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16), CGNAT/Tailscale (100.64.0.0/10), and IPv6 ULA (fc00::/7). An explicitly supplied list replaces those defaults with exactly the entries given, and an empty list ([]) disables them so all traffic uses Kernel-managed egress; omit private_hosts to keep the defaults. Entries are hostname patterns (\"*.example.ts.net\", \"preview.internal\") or IP/CIDR literals (\"100.64.0.0/10\", \"10.1.30.63\"). IP and CIDR entries only match URLs written with a literal IP address; they never match hostnames that resolve into the range, so private DNS names need a hostname entry even when they resolve inside the default ranges. CIDRs must be in canonical masked form (host bits zero), and only the private ranges listed above are accepted; public, loopback, link-local, and unspecified ranges are rejected. Exact IPv6 addresses must be bracketed (\"[fd00::1]\"); IPv6 CIDR ranges are unbracketed (\"fd00::/8\"). Wildcards are limited to one leading \"*.\" over a suffix with at least two labels that is not a public suffix (so \"*.co.uk\" or \"*.ts.net\" are rejected, while \"*.example.ts.net\" is accepted). Hostname and IP entries may carry a port; CIDR ranges may not. Hostname entries are not resolved during validation, so callers must ensure they identify private destinations. Not related to a proxy's bypass_hosts, which selects between upstream-proxy and Kernel-managed direct egress and cannot reach into a VPN.\n","example":["*.example.ts.net","100.64.0.0/10"],"items":{"maxLength":255,"type":"string"},"maxItems":32,"type":"array"}},"type":"object"},"BrowserNetworkIdleEvent":{"description":"A browser network idle event emitted after a 500ms quiet period with no in-flight HTTP requests.","properties":{"category":{"const":"network","type":"string"},"data":{"$ref":"#/components/schemas/BrowserEventContext"},"source":{"$ref":"#/components/schemas/BrowserEventSource"},"truncated":{"description":"True if the data field was truncated due to size limits.","type":"boolean"},"ts":{"description":"Event timestamp in Unix microseconds.","format":"int64","type":"integer"},"type":{"const":"network_idle","type":"string"}},"required":["ts","type","category","source"],"title":"network_idle","type":"object"},"BrowserNetworkLoadingFailedEvent":{"description":"A browser network loading failed event. If the request was already in flight when CDP attached (no prior network_request was emitted for it), url, frame_id, loader_id, and resource_type are absent; BrowserEventContext is partially populated in that case.","properties":{"category":{"const":"network","type":"string"},"data":{"allOf":[{"$ref":"#/components/schemas/BrowserEventContext"},{"properties":{"canceled":{"description":"True if the request was canceled by the browser or page script.","type":"boolean"},"error_text":{"description":"Network error description (e.g. net::ERR_CONNECTION_REFUSED).","type":"string"},"request_id":{"description":"CDP request identifier matching the originating network_request event.","type":"string"},"resource_type":{"description":"CDP Network.ResourceType for the request, passed through as-is from Chrome. Known values include Document, Fetch, XHR, Script, Stylesheet, Image, Media, Font, TextTrack, EventSource, WebSocket, Manifest, Prefetch, Other, and more.","type":"string"}},"type":"object"}]},"source":{"$ref":"#/components/schemas/BrowserEventSource"},"truncated":{"description":"True if the data field was truncated due to size limits.","type":"boolean"},"ts":{"description":"Event timestamp in Unix microseconds.","format":"int64","type":"integer"},"type":{"const":"network_loading_failed","type":"string"}},"required":["ts","type","category","source"],"title":"network_loading_failed","type":"object"},"BrowserNetworkRequestEvent":{"description":"A browser network request sent event.","properties":{"category":{"const":"network","type":"string"},"data":{"allOf":[{"$ref":"#/components/schemas/BrowserEventContext"},{"properties":{"document_url":{"description":"URL of the document that initiated the request.","type":"string"},"headers":{"$ref":"#/components/schemas/BrowserHttpHeaders","description":"Request headers."},"initiator_type":{"description":"CDP Initiator.type indicating what caused the request, passed through as-is from Chrome. Known values include script, parser, preload, and other.","type":"string"},"is_redirect":{"description":"True if this request is the result of a redirect.","type":"boolean"},"method":{"description":"HTTP method as sent on the wire (e.g. GET, POST).","type":"string"},"post_data":{"description":"Request body for POST/PUT requests, if available.","type":"string"},"redirect_url":{"description":"Original URL before the redirect, present when is_redirect is true.","type":"string"},"request_id":{"description":"CDP request identifier, unique within the session.","type":"string"},"resource_type":{"description":"CDP Network.ResourceType for the request, passed through as-is from Chrome. Known values include Document, Fetch, XHR, Script, Stylesheet, Image, Media, Font, TextTrack, EventSource, WebSocket, Manifest, Prefetch, Other, and more.","type":"string"}},"type":"object"}]},"source":{"$ref":"#/components/schemas/BrowserEventSource"},"truncated":{"description":"True if the data field was truncated due to size limits.","type":"boolean"},"ts":{"description":"Event timestamp in Unix microseconds.","format":"int64","type":"integer"},"type":{"const":"network_request","type":"string"}},"required":["ts","type","category","source"],"title":"network_request","type":"object"},"BrowserNetworkResponseEvent":{"description":"A browser network response received event. Fired after the response body is fully received, not when headers arrive.","properties":{"category":{"const":"network","type":"string"},"data":{"allOf":[{"$ref":"#/components/schemas/BrowserEventContext"},{"properties":{"body":{"description":"Truncated response body, present only for text MIME types.","type":"string"},"headers":{"$ref":"#/components/schemas/BrowserHttpHeaders","description":"Response headers."},"method":{"description":"HTTP method of the original request.","type":"string"},"mime_type":{"description":"MIME type of the response (e.g. text/html, application/json).","type":"string"},"request_id":{"description":"CDP request identifier matching the originating network_request event.","type":"string"},"resource_type":{"description":"CDP Network.ResourceType for the request, passed through as-is from Chrome. Known values include Document, Fetch, XHR, Script, Stylesheet, Image, Media, Font, TextTrack, EventSource, WebSocket, Manifest, Prefetch, Other, and more.","type":"string"},"status":{"description":"HTTP response status code.","type":"integer"},"status_text":{"description":"HTTP response status text (e.g. OK, Not Found).","type":"string"}},"type":"object"}]},"source":{"$ref":"#/components/schemas/BrowserEventSource"},"truncated":{"description":"True if the data field was truncated due to size limits.","type":"boolean"},"ts":{"description":"Event timestamp in Unix microseconds.","format":"int64","type":"integer"},"type":{"const":"network_response","type":"string"}},"required":["ts","type","category","source"],"title":"network_response","type":"object"},"BrowserPageDomContentLoadedEvent":{"description":"A browser DOMContentLoaded event (CDP Page.domContentEventFired).","properties":{"category":{"const":"page","type":"string"},"data":{"allOf":[{"$ref":"#/components/schemas/BrowserEventContext"},{"properties":{"cdp_timestamp":{"description":"Chrome monotonic clock value in seconds at which DOMContentLoaded fired, relative to browser process start (not Unix epoch). Use ts for wall-clock time.","type":"number"}},"type":"object"}]},"source":{"$ref":"#/components/schemas/BrowserEventSource"},"truncated":{"description":"True if the data field was truncated due to size limits.","type":"boolean"},"ts":{"description":"Event timestamp in Unix microseconds.","format":"int64","type":"integer"},"type":{"const":"page_dom_content_loaded","type":"string"}},"required":["ts","type","category","source"],"title":"page_dom_content_loaded","type":"object"},"BrowserPageLayoutSettledEvent":{"description":"A browser layout settled event emitted 1 second after page load with no intervening layout shifts, indicating visual stability. Each layout shift resets the 1-second timer.","properties":{"category":{"const":"page","type":"string"},"data":{"$ref":"#/components/schemas/BrowserEventContext"},"source":{"$ref":"#/components/schemas/BrowserEventSource"},"truncated":{"description":"True if the data field was truncated due to size limits.","type":"boolean"},"ts":{"description":"Event timestamp in Unix microseconds.","format":"int64","type":"integer"},"type":{"const":"page_layout_settled","type":"string"}},"required":["ts","type","category","source"],"title":"page_layout_settled","type":"object"},"BrowserPageLayoutShiftEvent":{"description":"A browser cumulative layout shift (CLS) event from the Performance Timeline API.","properties":{"category":{"const":"page","type":"string"},"data":{"allOf":[{"$ref":"#/components/schemas/BrowserEventContext"},{"properties":{"duration":{"description":"Duration of the layout shift entry in milliseconds (always 0 for layout shifts per spec).","type":"number"},"layout_shift_details":{"additionalProperties":false,"description":"PerformanceLayoutShift attributes from the Performance Timeline entry.","properties":{"had_recent_input":{"description":"True if the layout shift was preceded by user input within 500ms, excluding it from CLS.","type":"boolean"},"value":{"description":"Layout shift score for this entry (contribution to CLS).","type":"number"}},"type":"object"},"source_frame_id":{"description":"CDP frame identifier of the frame where the layout shift occurred.","type":"string"},"time":{"description":"Performance Timeline timestamp of the layout shift in milliseconds.","type":"number"}},"type":"object"}]},"source":{"$ref":"#/components/schemas/BrowserEventSource"},"truncated":{"description":"True if the data field was truncated due to size limits.","type":"boolean"},"ts":{"description":"Event timestamp in Unix microseconds.","format":"int64","type":"integer"},"type":{"const":"page_layout_shift","type":"string"}},"required":["ts","type","category","source"],"title":"page_layout_shift","type":"object"},"BrowserPageLcpEvent":{"description":"A browser Largest Contentful Paint (LCP) event from the Performance Timeline API.","properties":{"category":{"const":"page","type":"string"},"data":{"allOf":[{"$ref":"#/components/schemas/BrowserEventContext"},{"properties":{"lcp_details":{"additionalProperties":false,"description":"LargestContentfulPaint attributes from the Performance Timeline entry.","properties":{"element_id":{"description":"id attribute of the LCP element, if present.","type":"string"},"load_time":{"description":"Load time of the LCP element in milliseconds.","type":"number"},"node_id":{"description":"CDP DOM node identifier of the LCP element.","type":"integer"},"render_time":{"description":"Render time of the LCP element in milliseconds; 0 for cross-origin images without Timing-Allow-Origin.","type":"number"},"size":{"description":"Visible area of the LCP element in pixels squared.","type":"number"},"url":{"description":"URL of the LCP element for image or video elements.","type":"string"}},"type":"object"},"source_frame_id":{"description":"CDP frame identifier of the frame where the LCP element was rendered.","type":"string"},"time":{"description":"Performance Timeline timestamp of the LCP entry in milliseconds.","type":"number"}},"type":"object"}]},"source":{"$ref":"#/components/schemas/BrowserEventSource"},"truncated":{"description":"True if the data field was truncated due to size limits.","type":"boolean"},"ts":{"description":"Event timestamp in Unix microseconds.","format":"int64","type":"integer"},"type":{"const":"page_lcp","type":"string"}},"required":["ts","type","category","source"],"title":"page_lcp","type":"object"},"BrowserPageLoadEvent":{"description":"A browser page load event (CDP Page.loadEventFired).","properties":{"category":{"const":"page","type":"string"},"data":{"allOf":[{"$ref":"#/components/schemas/BrowserEventContext"},{"properties":{"cdp_timestamp":{"description":"Chrome monotonic clock value in seconds at which the load event fired, relative to browser process start (not Unix epoch). Use ts for wall-clock time.","type":"number"}},"type":"object"}]},"source":{"$ref":"#/components/schemas/BrowserEventSource"},"truncated":{"description":"True if the data field was truncated due to size limits.","type":"boolean"},"ts":{"description":"Event timestamp in Unix microseconds.","format":"int64","type":"integer"},"type":{"const":"page_load","type":"string"}},"required":["ts","type","category","source"],"title":"page_load","type":"object"},"BrowserPageNavigationEvent":{"description":"A browser page navigation started event (CDP Page.frameNavigated). Carries nav context fields inline but not nav_seq, as this event resets the navigation epoch.","properties":{"category":{"const":"page","type":"string"},"data":{"additionalProperties":false,"properties":{"frame_id":{"description":"CDP frame identifier of the navigated frame.","type":"string"},"loader_id":{"description":"New CDP document loader identifier assigned for this navigation.","type":"string"},"parent_frame_id":{"description":"Parent frame identifier for subframe navigations; absent for top-level navigations.","type":"string"},"session_id":{"description":"CDP session identifier.","type":"string"},"target_id":{"description":"Browser target identifier.","type":"string"},"target_type":{"$ref":"#/components/schemas/BrowserTargetType"},"url":{"description":"URL navigated to.","type":"string"}},"type":"object"},"source":{"$ref":"#/components/schemas/BrowserEventSource"},"truncated":{"description":"True if the data field was truncated due to size limits.","type":"boolean"},"ts":{"description":"Event timestamp in Unix microseconds.","format":"int64","type":"integer"},"type":{"const":"page_navigation","type":"string"}},"required":["ts","type","category","source"],"title":"page_navigation","type":"object"},"BrowserPageNavigationSettledEvent":{"description":"Emitted when page_dom_content_loaded and page_layout_settled have both fired for the same navigation, indicating the page is loaded and visually stable. Independent of network_idle; a single pending request does not block it.","properties":{"category":{"const":"page","type":"string"},"data":{"$ref":"#/components/schemas/BrowserEventContext"},"source":{"$ref":"#/components/schemas/BrowserEventSource"},"truncated":{"description":"True if the data field was truncated due to size limits.","type":"boolean"},"ts":{"description":"Event timestamp in Unix microseconds.","format":"int64","type":"integer"},"type":{"const":"page_navigation_settled","type":"string"}},"required":["ts","type","category","source"],"title":"page_navigation_settled","type":"object"},"BrowserPageTabOpenedEvent":{"description":"A new browser tab or target was opened (CDP Target.attachedToTarget for page targets). Fires before a CDP session is attached to the new target, so session_id, frame_id, loader_id, and nav_seq are absent; this event does not compose BrowserEventContext. Consumers reading context fields generically should treat it as a special case.","properties":{"category":{"const":"page","type":"string"},"data":{"additionalProperties":false,"properties":{"opener_id":{"description":"Target identifier of the tab that opened this one, if any.","type":"string"},"target_id":{"description":"CDP target identifier for the newly opened tab.","type":"string"},"target_type":{"$ref":"#/components/schemas/BrowserTargetType"},"title":{"description":"Initial page title of the new tab.","type":"string"},"url":{"description":"Initial URL of the new tab.","type":"string"}},"type":"object"},"source":{"$ref":"#/components/schemas/BrowserEventSource"},"truncated":{"description":"True if the data field was truncated due to size limits.","type":"boolean"},"ts":{"description":"Event timestamp in Unix microseconds.","format":"int64","type":"integer"},"type":{"const":"page_tab_opened","type":"string"}},"required":["ts","type","category","source"],"title":"page_tab_opened","type":"object"},"BrowserPool":{"description":"A browser pool containing multiple identically configured browsers.","properties":{"acquired_count":{"description":"Number of browsers currently acquired from the pool","example":15,"type":"integer"},"available_count":{"description":"Number of browsers currently available in the pool","example":85,"type":"integer"},"browser_pool_config":{"$ref":"#/components/schemas/BrowserPoolConfig","description":"Configuration used to create all browsers in this pool"},"created_at":{"description":"Timestamp when the browser pool was created","format":"date-time","type":"string"},"extension_ids":{"description":"Resolved extension IDs attached to the pool, in configured load order. Empty when no extensions are attached. Authoritative for programmatic consumers; the extensions inside `browser_pool_config` reflect the configured selector (echoed as sent on create).","items":{"type":"string"},"type":"array"},"id":{"description":"Unique identifier for the browser pool","example":"iv25ujqf37x3j07dwoffegqr","type":"string"},"name":{"description":"Browser pool name, if set","example":"my-pool","type":"string"},"profile_id":{"description":"Resolved profile ID the pool is attached to. Omitted when no profile is attached. Authoritative for programmatic consumers; the profile inside `browser_pool_config` reflects the configured selector (echoed as sent on create).","example":"iv25ujqf37x3j07dwoffegqr","type":"string"},"region":{"$ref":"#/components/schemas/Region","description":"Geographic region of the browser pool. Fixed once the pool is created.\n"}},"required":["id","available_count","acquired_count","created_at","region","browser_pool_config","extension_ids"],"type":"object"},"BrowserPoolAcquireRequest":{"description":"Request body for acquiring a browser from the pool.","properties":{"acquire_timeout_seconds":{"description":"Maximum number of seconds to wait for a browser to be available. Defaults to the calculated time it would take to fill the pool at the currently configured fill rate.","type":"integer"},"name":{"description":"Optional human-readable name for the acquired browser session, used to find it later in the dashboard. Must be unique among active sessions within the pool's project. Applies to this lease only and is cleared when the browser is released back to the pool.\n","example":"checkout-flow-1","maxLength":255,"minLength":1,"pattern":"^[a-zA-Z0-9._-]{1,255}$","type":"string"},"start_url":{"description":"Optional URL to navigate the acquired browser to. Overrides the pool's start_url for this acquire only. Best-effort: failures to navigate do not fail the acquire.","example":"https://example.com","type":"string"},"tags":{"$ref":"#/components/schemas/Tags","description":"Optional user-defined key-value tags for the acquired browser session, used to find and group sessions later. Applies to this lease only and are cleared when the browser is released back to the pool. Up to 50 pairs.\n"},"telemetry":{"$ref":"#/components/schemas/BrowserTelemetryRequestConfig","description":"Telemetry override for the acquired browser, applied to this lease only. Merges onto the browser's current (pool-inherited) telemetry using the same per-category semantics as PATCH /browsers: provided categories override the current configuration, omitted categories are inherited. Set enabled to true to resolve the config fresh from the default set, or enabled to false to stop capture. When the browser is released back to the pool with reuse, its telemetry is reset to the pool's baseline, so the override does not carry over to the next lease.\n","nullable":true}},"required":[],"type":"object"},"BrowserPoolConfig":{"description":"Effective browser pool configuration returned by the API.\n","properties":{"chrome_policy":{"additionalProperties":true,"description":"Custom Chrome enterprise policy overrides applied to all browsers in this pool. Keys are Chrome enterprise policy names; values must match their expected types. Blocked: kernel-managed policies (extensions, proxy, CDP/automation). See https://chromeenterprise.google/policies/ The serialized JSON payload is capped at 5 MiB.\n","type":"object"},"extensions":{"description":"List of browser extensions to load into the session. Provide each by id or name.","items":{"$ref":"#/components/schemas/BrowserExtension"},"maxItems":20,"type":"array"},"fill_rate_per_minute":{"description":"Percentage of the pool to fill per minute. The cap is 25 for most organizations but can be raised per-organization, so only the lower bound is enforced here.","minimum":0,"type":"integer"},"headless":{"description":"If true, launches the browser using a headless image.","example":false,"type":"boolean"},"kiosk_mode":{"description":"If true, launches the browser in kiosk mode to hide address bar and tabs in live view.","example":true,"type":"boolean"},"name":{"description":"Optional name for the browser pool. Must be unique within the project.","example":"my-pool","pattern":"^[a-zA-Z0-9._-]{1,255}$","type":"string"},"network":{"$ref":"#/components/schemas/BrowserNetworkConfig","description":"Network configuration applied to browsers in this pool, if any. Omitted when the pool has no network configuration."},"profile":{"allOf":[{"$ref":"#/components/schemas/BrowserPoolProfile"}],"description":"Profile selection for browsers in the pool."},"proxy_id":{"description":"Optional proxy associated to the browser session. References a proxy in the same project as the browser session.","type":"string"},"refresh_on_profile_update":{"description":"When true, flush idle browsers when the profile the pool uses is updated, so pool browsers\npick up the latest profile data. When a profile is provided during creation, this defaults\nto true. Requires a profile to be set on the pool.\n","example":true,"type":"boolean"},"size":{"description":"Number of browsers maintained in the pool. The maximum size is determined by your\norganization's pooled sessions limit (the sum of all pool sizes cannot exceed your limit).\n","example":10,"minimum":1,"type":"integer"},"start_url":{"description":"Optional URL to navigate to when a new browser is warmed into the pool. Best-effort:\nfailures to navigate do not fail pool fill. Only applied to newly-warmed browsers;\nbrowsers reused via release/acquire keep whatever URL the previous lease left them on.\nAccepts any URL Chromium can resolve, including chrome:// pages.\n","example":"https://example.com","maxLength":2048,"type":"string"},"stealth":{"description":"If true, launches the browser in stealth mode to reduce detection by anti-bot mechanisms.","example":true,"type":"boolean"},"telemetry":{"$ref":"#/components/schemas/BrowserTelemetryConfig","description":"Active telemetry configuration applied to browsers warmed into this pool, if any.","nullable":true},"timeout_seconds":{"description":"Default idle timeout in seconds for browsers acquired from this pool before they are destroyed. Minimum 10, maximum 259200 (72 hours).","maximum":259200,"minimum":10,"type":"integer"},"viewport":{"allOf":[{"$ref":"#/components/schemas/BrowserViewport"}],"description":"Browser viewport used for newly-warmed browsers in this pool."}},"required":["size"],"type":"object"},"BrowserPoolCreateRequest":{"description":"Parameters for creating a browser pool. All browsers in the pool will be created with the same configuration.\n","properties":{"chrome_policy":{"additionalProperties":true,"description":"Custom Chrome enterprise policy overrides applied to all browsers in this pool. Keys are Chrome enterprise policy names; values must match their expected types. Blocked: kernel-managed policies (extensions, proxy, CDP/automation). See https://chromeenterprise.google/policies/ The serialized JSON payload is capped at 5 MiB.\n","type":"object"},"extensions":{"description":"List of browser extensions to load into the session. Provide each by id or name.","items":{"$ref":"#/components/schemas/BrowserExtension"},"maxItems":20,"type":"array"},"fill_rate_per_minute":{"default":25,"description":"Percentage of the pool to fill per minute. Defaults to 25. The cap is 25 for most organizations but can be raised per-organization, so only the lower bound is enforced here.","minimum":0,"type":"integer"},"headless":{"default":false,"description":"If true, launches the browser using a headless image. Defaults to false.","example":false,"type":"boolean"},"kiosk_mode":{"default":false,"description":"If true, launches the browser in kiosk mode to hide address bar and tabs in live view. Defaults to false.","example":true,"type":"boolean"},"name":{"description":"Optional name for the browser pool. Must be unique within the project.","example":"my-pool","pattern":"^[a-zA-Z0-9._-]{1,255}$","type":"string"},"network":{"$ref":"#/components/schemas/BrowserNetworkConfig","description":"Network configuration applied to browsers in this pool.\n"},"profile":{"allOf":[{"$ref":"#/components/schemas/BrowserPoolProfile"}],"description":"Profile selection for browsers in the pool."},"proxy_id":{"description":"Optional proxy to associate to the browser session. Must reference a proxy in the same project as the browser session.","type":"string"},"refresh_on_profile_update":{"default":false,"description":"When true, flush idle browsers when the profile the pool uses is updated, so pool browsers\npick up the latest profile data. When a profile is provided during creation, this defaults\nto true. Requires a profile to be set on the pool.\n","example":true,"type":"boolean"},"region":{"$ref":"#/components/schemas/Region","description":"Geographic region for the browser pool. It is fixed once the pool is created. Region selection requires a Start-Up or Enterprise plan, defaults to us-east when omitted on create.\n"},"size":{"description":"Number of browsers to maintain in the pool. The maximum size is determined by your\norganization's pooled sessions limit (the sum of all pool sizes cannot exceed your limit).\n","example":10,"minimum":1,"type":"integer"},"start_url":{"description":"Optional URL to navigate to when a new browser is warmed into the pool. Best-effort:\nfailures to navigate do not fail pool fill. Only applied to newly-warmed browsers;\nbrowsers reused via release/acquire keep whatever URL the previous lease left them on.\nAccepts any URL Chromium can resolve, including chrome:// pages.\n","example":"https://example.com","maxLength":2048,"type":"string"},"stealth":{"default":false,"description":"If true, launches the browser in stealth mode to reduce detection by anti-bot mechanisms. Defaults to false.","example":true,"type":"boolean"},"telemetry":{"$ref":"#/components/schemas/BrowserTelemetryRequestConfig","description":"Telemetry configuration applied to browsers warmed into this pool. Set enabled to true to start capture using the default set, or provide browser category settings. If omitted, null, set to an empty object ({}), set to enabled: false without browser category settings, or all four CDP categories are explicitly disabled, no telemetry is configured on the pool. Only applied to newly-warmed browsers.\n","nullable":true},"timeout_seconds":{"default":600,"description":"Default idle timeout in seconds for browsers acquired from this pool before they are destroyed. Defaults to 600 seconds. Minimum 10, maximum 259200 (72 hours).","maximum":259200,"minimum":10,"type":"integer"},"viewport":{"allOf":[{"$ref":"#/components/schemas/BrowserViewport"}],"description":"Browser viewport used for newly-warmed browsers in this pool."}},"required":["size"],"type":"object"},"BrowserPoolDeleteRequest":{"description":"Parameters for deleting a browser pool.\n","properties":{"force":{"default":false,"description":"If true, force delete even if browsers are currently leased. Leased browsers will be terminated.","type":"boolean"}},"required":[],"type":"object"},"BrowserPoolProfile":{"description":"Profile configuration for browsers in a pool. Provide either id or name. Profiles must\nbe created beforehand. Unlike single browser sessions, pools load the profile read-only\nand never persist changes back to it, so save_changes is omitted here. Any save_changes\nvalue sent on a pool profile is silently ignored rather than rejected.\n","oneOf":[{"required":["id"]},{"required":["name"]}],"properties":{"id":{"description":"Profile ID to load for browsers in this pool","type":"string"},"name":{"description":"Profile name to load for browsers in this pool (instead of id). Must be 1-255 characters, using letters, numbers, dots, underscores, or hyphens.","maxLength":255,"minLength":1,"pattern":"^[a-zA-Z0-9._-]{1,255}$","type":"string"}},"type":"object"},"BrowserPoolRef":{"description":"Browser pool this session was acquired from, if any.","properties":{"id":{"description":"Browser pool ID","type":"string"},"name":{"description":"Browser pool name, if set","type":"string"}},"required":["id"],"type":"object"},"BrowserPoolReleaseRequest":{"description":"Request body for releasing a browser back to the pool.","properties":{"reuse":{"default":true,"description":"Whether to reuse the browser instance or destroy it and create a new one. Defaults to true. A reused browser keeps the configuration it was created with, so it does not pick up pool configuration changes made while it was in use. Release with `reuse: false`, or flush the pool afterward, to rebuild it with the current configuration.","example":false,"type":"boolean"},"session_id":{"description":"Browser session ID to release back to the pool","example":"ts8iy3sg25ibheguyni2lg9t","type":"string"}},"required":["session_id"],"type":"object"},"BrowserPoolUpdateRequest":{"description":"Parameters for updating a browser pool. Omitted fields leave existing values unchanged.\n","properties":{"chrome_policy":{"additionalProperties":true,"description":"If provided, replaces the custom Chrome enterprise policy overrides applied to all browsers in this pool. Empty object clears any previously-set policy. Keys are Chrome enterprise policy names; values must match their expected types. Blocked: kernel-managed policies (extensions, proxy, CDP/automation). See https://chromeenterprise.google/policies/ The serialized JSON payload is capped at 5 MiB.\n","type":"object"},"discard_all_idle":{"default":false,"description":"Whether to discard all idle browsers and rebuild them immediately with the new configuration. Defaults to false. Only browsers that are idle when the update runs are rebuilt. A browser that is in use during the update keeps its original configuration, and if it is later released with `reuse: true` it returns to the pool with that stale configuration until it is discarded (by this flag on a later update, or by flushing the pool).","example":false,"type":"boolean"},"extensions":{"description":"If provided, replaces the extension list. Empty array clears all previously-selected\nextensions. Omit this field to leave extensions unchanged.\n","items":{"$ref":"#/components/schemas/BrowserExtension"},"maxItems":20,"type":"array"},"fill_rate_per_minute":{"description":"If provided, replaces the percentage of the pool to fill per minute. The cap is 25\nfor most organizations but can be raised per-organization, so only the lower bound\nis enforced here.\n","minimum":0,"type":"integer"},"headless":{"description":"If provided, replaces whether browsers launch using a headless image.","example":false,"type":"boolean"},"kiosk_mode":{"description":"If provided, replaces whether browsers launch in kiosk mode.","example":true,"type":"boolean"},"name":{"description":"If provided, replaces the pool name. Empty string is a no-op; the pool name cannot\nbe cleared or reset to empty once assigned.\n","example":"my-pool","pattern":"^[a-zA-Z0-9._-]{1,255}$","type":"string"},"network":{"$ref":"#/components/schemas/BrowserNetworkConfig","description":"If provided, replaces the pool's network configuration. Omit to leave the existing configuration unchanged; an empty object ({}) removes it, while network: {private_hosts: []} sets an explicit empty list. Only applied to browsers created in the pool after the update; browsers already in the pool keep their configuration until discarded (see discard_all_idle).\n"},"profile":{"allOf":[{"$ref":"#/components/schemas/BrowserPoolProfile"}],"description":"If provided, replaces the previously-selected profile. To clear the profile reference,\nsend `{ \"id\": \"\" }` or `{ \"name\": \"\" }`. An empty object (no id or name) is rejected\nas 400.\n"},"proxy_id":{"description":"Empty string clears the previously-selected proxy. Omit this field to leave the proxy unchanged.","type":"string"},"refresh_on_profile_update":{"description":"If provided, replaces whether idle browsers are flushed when the profile the pool uses\nis updated. When the pool's profile reference is changed (including newly attached) and\nthis field is omitted, it defaults to true. Re-sending the same profile reference leaves\nthis setting unchanged. Clearing the profile also disables this setting. Requires a\nprofile to be set on the pool.\n","example":true,"type":"boolean"},"size":{"description":"If provided, replaces the number of browsers to maintain in the pool. The maximum\nsize is determined by your organization's pooled sessions limit (the sum of all\npool sizes cannot exceed your limit).\n","example":10,"minimum":1,"type":"integer"},"start_url":{"description":"If provided, replaces the URL to navigate to when a new browser is warmed into the pool.\nEmpty string clears the previously-set URL. Omit this field to leave it unchanged.\n","example":"https://example.com","maxLength":2048,"type":"string"},"stealth":{"description":"If provided, replaces whether browsers launch in stealth mode.","example":true,"type":"boolean"},"telemetry":{"$ref":"#/components/schemas/BrowserTelemetryRequestConfig","description":"If provided, updates the pool's telemetry configuration. Omit, set to null, or set to an empty object ({}) to leave the existing configuration unchanged. Set enabled to true to enable capture using the default set. Set enabled to false to clear the pool's telemetry. Provide browser category settings for per-category updates, merged onto the pool's current configuration. Only applied to browsers warmed after the update; browsers already in the pool keep their configuration until discarded.\n","nullable":true},"timeout_seconds":{"description":"If provided, replaces the default idle timeout in seconds for browsers acquired from this pool before they are destroyed. Minimum 10, maximum 259200 (72 hours).","maximum":259200,"minimum":10,"type":"integer"},"viewport":{"allOf":[{"$ref":"#/components/schemas/BrowserViewport"}],"description":"If provided, replaces the viewport with the new width/height/refresh_rate. Because\nwidth and height are required and must be positive, the viewport cannot be cleared;\nomit this field to leave it unchanged.\n"}},"type":"object"},"BrowserProfile":{"description":"Profile selection for the browser session. Provide either id or name. If specified, the\nmatching profile will be loaded into the browser session. Profiles must be created beforehand.\n","oneOf":[{"required":["id"]},{"required":["name"]}],"properties":{"id":{"description":"Profile ID to load for this browser session","type":"string"},"name":{"description":"Profile name to load for this browser session (instead of id). Must be 1-255 characters, using letters, numbers, dots, underscores, or hyphens.","maxLength":255,"minLength":1,"pattern":"^[a-zA-Z0-9._-]{1,255}$","type":"string"},"save_changes":{"default":false,"description":"If true, save changes made during the session back to the profile when the session ends.","type":"boolean"}},"type":"object"},"BrowserProxy":{"additionalProperties":false,"description":"Resolved proxy configuration for a browser session. Selected proxies are returned by stable ID.","oneOf":[{"required":["mode"]},{"required":["id"]},{"required":["name"]}],"properties":{"id":{"description":"Selected proxy ID.","minLength":1,"type":"string"},"mode":{"$ref":"#/components/schemas/BrowserProxyMode"},"name":{"description":"Selected proxy name.","minLength":1,"type":"string"}},"type":"object"},"BrowserProxyConfig":{"additionalProperties":false,"description":"Browser proxy configuration. Provide exactly one of mode, id, or name; an empty object is invalid.\nSet mode to direct for no proxy regardless of stealth. Set mode to default to use the browser's stealth-derived default: Kernel's default stealth proxy when stealth=true, or direct egress when stealth=false.\nSelect id or name to use that proxy regardless of stealth. The selected proxy must be in the same project as the browser. Names must match exactly one active proxy; use id for stable references.\nProxy configuration changes only egress and does not change stealth or CAPTCHA solver behavior. A stealth browser using mode=direct still runs in stealth mode with the CAPTCHA solver enabled.\nWhen proxy is omitted on browser creation, stealth browsers use Kernel's default stealth proxy and non-stealth browsers use direct egress. When omitted on update, the current configuration is unchanged.\n","oneOf":[{"required":["mode"]},{"required":["id"]},{"required":["name"]}],"properties":{"id":{"description":"Proxy ID.","minLength":1,"type":"string"},"mode":{"$ref":"#/components/schemas/BrowserProxyMode"},"name":{"description":"Proxy name. Must match exactly one active proxy in the project.","minLength":1,"type":"string"}},"type":"object"},"BrowserProxyMode":{"description":"Proxy egress mode. direct forces no proxy regardless of stealth. default uses the browser's stealth-derived default: Kernel's default stealth proxy when stealth=true, or direct egress when stealth=false.\ndefault is primarily useful on browser update to restore the browser default after selected-proxy egress.\n","enum":["direct","default"],"type":"string"},"BrowserReplay":{"description":"Information about a browser replay recording.","properties":{"finished_at":{"description":"Timestamp when replay finished","format":"date-time","nullable":true,"type":"string"},"replay_id":{"description":"Unique identifier for the replay recording.","type":"string"},"replay_view_url":{"description":"URL for viewing the replay recording.","example":"https://api.onkernel.com/browser/replays?jwt=eyJ0eXAi...\u0026replay_id=7e2c1a9f-1234-4cde-9abc-ffeedd001122","type":"string"},"started_at":{"description":"Timestamp when replay started","format":"date-time","nullable":true,"type":"string"}},"required":["replay_id"],"type":"object"},"BrowserRequest":{"description":"Parameters for creating a browser session.\n","properties":{"chrome_policy":{"additionalProperties":true,"description":"Custom Chrome enterprise policy overrides applied to this browser session. Keys are Chrome enterprise policy names; values must match their expected types. Blocked: kernel-managed policies (extensions, proxy, CDP/automation). See https://chromeenterprise.google/policies/\n","type":"object"},"extensions":{"description":"List of browser extensions to load into the session. Provide each by id or name.","items":{"$ref":"#/components/schemas/BrowserExtension"},"maxItems":20,"type":"array"},"gpu":{"description":"If true, enables GPU acceleration for the browser session. Requires Start-Up or Enterprise plan and headless=false.","example":false,"type":"boolean"},"headless":{"description":"If true, launches the browser using a headless image (no VNC/GUI). Defaults to false.","example":false,"type":"boolean"},"invocation_id":{"description":"action invocation ID","example":"rr33xuugxj9h0bkf1rdt2bet","type":"string"},"kiosk_mode":{"description":"If true, launches the browser in kiosk mode to hide address bar and tabs in live view.","example":true,"type":"boolean"},"name":{"description":"Optional human-readable name for the browser session, used to find it later in the dashboard. Must be unique among active sessions within the project. Can be changed later via PATCH /browsers/{id_or_name}.\n","example":"checkout-flow-1","maxLength":255,"minLength":1,"pattern":"^[a-zA-Z0-9._-]{1,255}$","type":"string"},"network":{"$ref":"#/components/schemas/BrowserNetworkConfig","description":"Network configuration for the browser session. Cannot be changed after creation.\n"},"profile":{"$ref":"#/components/schemas/BrowserProfile"},"proxy":{"$ref":"#/components/schemas/BrowserProxyConfig","description":"Proxy configuration for the browser session. Cannot be combined with proxy_id.\nOmit to use the browser default: stealth browsers use Kernel's default stealth proxy, while non-stealth browsers use direct egress.\nSet mode to direct to force direct egress regardless of stealth. Set mode to default to explicitly use the browser default: Kernel's default stealth proxy when stealth=true, or direct egress when stealth=false.\nSelect id or name to use that proxy regardless of stealth. Proxy selection does not change stealth or CAPTCHA solver behavior.\n"},"proxy_id":{"deprecated":true,"description":"Optional proxy to associate to the browser session. Must reference a proxy in the same project as the browser session. Deprecated in favor of proxy.","type":"string","x-deprecated-reason":"Use proxy instead."},"region":{"$ref":"#/components/schemas/Region","description":"Geographic region for the browser session. It is fixed once the session is created. Region selection requires a Start-Up or Enterprise plan, defaults to us-east when omitted on create.\n"},"start_url":{"description":"Optional URL to open when the browser session is created. Navigation is best-effort, so navigation failures do not prevent the session from being created.","example":"https://example.com","type":"string"},"stealth":{"description":"If true, launches the browser in stealth mode and enables the CAPTCHA solver. Defaults to false.\nWhen proxy is omitted, stealth browsers use Kernel's default stealth proxy and non-stealth browsers use direct egress.\nAn explicit proxy configuration changes only egress; it does not enable or disable stealth or the CAPTCHA solver.\n","example":true,"type":"boolean"},"tags":{"$ref":"#/components/schemas/Tags","description":"Optional user-defined key-value tags for the browser session, used to find and group sessions later. Can be changed later via PATCH /browsers/{id_or_name}. Up to 50 pairs.\n"},"telemetry":{"$ref":"#/components/schemas/BrowserTelemetryRequestConfig","description":"Telemetry configuration for the browser session. Set enabled to true to start capture using VM defaults, or provide browser category settings. If omitted, null, set to an empty object ({}), set to enabled: false without browser category settings, or all four categories are explicitly disabled, capture is not started.\n","nullable":true},"timeout_seconds":{"description":"The number of seconds of inactivity before the browser session is terminated. Activity includes CDP connections and live view connections. Defaults to 60 seconds. Minimum allowed is 10 seconds. Maximum allowed is 259200 (72 hours). We check for inactivity every 5 seconds, so the actual timeout behavior you will see is +/- 5 seconds around the specified value.","maximum":259200,"minimum":10,"type":"integer"},"viewport":{"$ref":"#/components/schemas/BrowserViewport"}},"required":[],"type":"object"},"BrowserServiceCrashedEvent":{"description":"A managed service exited unexpectedly. Intentional stops do not produce this event; only unexpected exits and terminal restart-give-up transitions do.","properties":{"category":{"const":"system","type":"string"},"data":{"additionalProperties":false,"properties":{"phase":{"description":"Lifecycle phase the crash occurred in. startup: the process died before reaching a healthy running state. running: a previously healthy process died unexpectedly. gave_up: the process manager exhausted its restart attempts and stopped trying.","enum":["startup","running","gave_up"],"type":"string","x-go-type":"string"},"pid":{"description":"PID of the crashed process. Absent when the process manager gave up after exhausting restart attempts.","type":"integer"},"service_name":{"description":"Program name of the crashed service (e.g. chromium, mutter, kernel-images-api).","type":"string"}},"required":["service_name","phase"],"type":"object"},"source":{"$ref":"#/components/schemas/BrowserEventSource"},"truncated":{"description":"True if the data field was truncated due to size limits.","type":"boolean"},"ts":{"description":"Event timestamp in Unix microseconds.","format":"int64","type":"integer"},"type":{"const":"service_crashed","type":"string"}},"required":["ts","type","category","source"],"type":"object"},"BrowserSystemOomKillEvent":{"description":"The Linux kernel OOM-killer terminated a process inside the VM. Fires for any process killed by the kernel due to memory exhaustion, including Chrome renderer subprocesses that are not supervised.","properties":{"category":{"const":"system","type":"string"},"data":{"additionalProperties":false,"properties":{"constraint":{"description":"Why the kernel decided to OOM-kill. none means global memory exhaustion; memcg means a cgroup memory limit was hit; cpuset / memory_policy are NUMA/policy-driven kills. Absent on kernels older than 5.0.","enum":["none","memcg","cpuset","memory_policy"],"type":"string","x-go-type":"string"},"mem_free_kb":{"description":"Free system memory in KiB at the time of the kill. Assumes a 4 KiB page size. Does not include reclaimable caches. Absent if the kernel did not emit a parseable Mem-Info section.","type":"integer"},"mem_total_kb":{"description":"Total system memory in KiB at the time of the kill. Assumes a 4 KiB page size. Absent if the kernel did not emit a parseable Mem-Info section.","type":"integer"},"pid":{"description":"PID of the killed process.","type":"integer"},"process_name":{"description":"Comm of the killed process as reported by the kernel (max 15 chars, truncated by the kernel).","type":"string"},"rss_kb":{"description":"Resident set size of the killed process in KiB (sum of anon-rss, file-rss, and shmem-rss).","type":"integer"},"top_tasks":{"description":"Top processes by resident-set-size at the moment of the kill, sorted descending. Empty if the kernel did not emit the Tasks state table. Capped at 5 entries.","items":{"additionalProperties":false,"properties":{"name":{"description":"Comm of the process (max 15 chars, truncated by the kernel).","type":"string"},"pid":{"description":"PID of the process.","type":"integer"},"rss_kb":{"description":"Resident set size in KiB at the moment of the kill.","type":"integer"}},"required":["pid","name","rss_kb"],"type":"object"},"maxItems":5,"type":"array"},"trigger_pid":{"description":"PID of the triggering process. Absent if the kernel did not emit the standard header line.","type":"integer"},"trigger_process_name":{"description":"Comm of the process whose allocation request caused the kernel to invoke the OOM-killer. Often the same as process_name but can differ. Max 15 chars.","type":"string"}},"required":["process_name","pid","rss_kb"],"type":"object"},"source":{"$ref":"#/components/schemas/BrowserEventSource"},"truncated":{"description":"True if the data field was truncated due to size limits.","type":"boolean"},"ts":{"description":"Event timestamp in Unix microseconds.","format":"int64","type":"integer"},"type":{"const":"system_oom_kill","type":"string"}},"required":["ts","type","category","source"],"type":"object"},"BrowserTargetType":{"description":"CDP target type of the page that produced the event.","enum":["page","background_page","service_worker","shared_worker","other"],"type":"string"},"BrowserTelemetryCategoriesConfig":{"description":"Per-category telemetry capture settings layered onto the default set. The operational signals (control, connection, system, captcha) are on by default and are opt-out: set one to enabled=false to stop capturing it. The CDP categories (console, network, page, interaction) and screenshot are off by default and are opt-in: set enabled=true to capture them.","properties":{"captcha":{"$ref":"#/components/schemas/BrowserTelemetryCategoryConfig","description":"Captcha solve attempt outcomes. On by default."},"connection":{"$ref":"#/components/schemas/BrowserTelemetryCategoryConfig","description":"Client attach/detach lifecycle for the CDP proxy and live view. On by default."},"console":{"$ref":"#/components/schemas/BrowserTelemetryCategoryConfig","description":"Console output (log, warn, error) and uncaught exceptions. CDP category; off by default."},"control":{"$ref":"#/components/schemas/BrowserTelemetryCategoryConfig","description":"Agent-driven actions against the browser, such as inbound calls to the in-VM API. On by default."},"interaction":{"$ref":"#/components/schemas/BrowserTelemetryCategoryConfig","description":"User interaction events including clicks, keydowns, and scroll-settled events. CDP category; off by default."},"network":{"$ref":"#/components/schemas/BrowserTelemetryCategoryConfig","description":"HTTP request and response metadata including URL, method, status code, and timing. Request post data is forwarded as-is from CDP. Text response bodies are truncated at 8 KB for structured types (JSON, XML, form data) and 4 KB for other text types. Binary responses (images, fonts, media) are excluded. CDP category; off by default."},"page":{"$ref":"#/components/schemas/BrowserTelemetryCategoryConfig","description":"Page lifecycle events including navigation, DOMContentLoaded, load, layout shifts, and LCP. CDP category; off by default."},"screenshot":{"$ref":"#/components/schemas/BrowserTelemetryCategoryConfig","description":"Periodic base64-encoded viewport screenshots. High volume; off by default and must be opted into."},"system":{"$ref":"#/components/schemas/BrowserTelemetryCategoryConfig","description":"Browser VM health, such as out-of-memory kills and managed-service crashes. On by default."}},"type":"object"},"BrowserTelemetryCategoryConfig":{"description":"Per-category telemetry configuration.","properties":{"enabled":{"description":"Whether this category is captured. Operational categories (control, connection, system, captcha) default to true; set false to opt out. CDP categories (console, network, page, interaction) and screenshot default to false; set true to opt in.","type":"boolean"}},"type":"object"},"BrowserTelemetryConfig":{"description":"Active telemetry configuration for a browser session.","properties":{"browser":{"$ref":"#/components/schemas/BrowserTelemetryCategoriesConfig","description":"Per-category enable/disable flags."},"export":{"$ref":"#/components/schemas/BrowserTelemetryExportConfig","description":"Where the session's captured telemetry is being exported. Omitted when the export state is unknown."}},"type":"object"},"BrowserTelemetryEvent":{"description":"Union type representing any browser telemetry event. Discriminated on `type`. Each event's `category` determines when it is captured. The CDP collector-health events (monitor_disconnected, monitor_reconnected, monitor_reconnect_failed, monitor_init_failed) use the `monitor` category, which is not user-configurable: it flows automatically whenever any CDP category (console, network, page, interaction) is captured, and is silent otherwise. monitor_screenshot uses the opt-in `screenshot` category. All other event types are controlled by their per-category enable/disable flags.\n","discriminator":{"mapping":{"api_call":"#/components/schemas/BrowserApiCallEvent","captcha_solve_result":"#/components/schemas/BrowserCaptchaSolveResultEvent","cdp_connect":"#/components/schemas/BrowserCdpConnectEvent","cdp_disconnect":"#/components/schemas/BrowserCdpDisconnectEvent","console_error":"#/components/schemas/BrowserConsoleErrorEvent","console_log":"#/components/schemas/BrowserConsoleLogEvent","interaction_click":"#/components/schemas/BrowserInteractionClickEvent","interaction_key":"#/components/schemas/BrowserInteractionKeyEvent","interaction_scroll_settled":"#/components/schemas/BrowserInteractionScrollSettledEvent","live_view_connect":"#/components/schemas/BrowserLiveViewConnectEvent","live_view_disconnect":"#/components/schemas/BrowserLiveViewDisconnectEvent","monitor_disconnected":"#/components/schemas/BrowserMonitorDisconnectedEvent","monitor_init_failed":"#/components/schemas/BrowserMonitorInitFailedEvent","monitor_reconnect_failed":"#/components/schemas/BrowserMonitorReconnectFailedEvent","monitor_reconnected":"#/components/schemas/BrowserMonitorReconnectedEvent","monitor_screenshot":"#/components/schemas/BrowserMonitorScreenshotEvent","network_idle":"#/components/schemas/BrowserNetworkIdleEvent","network_loading_failed":"#/components/schemas/BrowserNetworkLoadingFailedEvent","network_request":"#/components/schemas/BrowserNetworkRequestEvent","network_response":"#/components/schemas/BrowserNetworkResponseEvent","page_dom_content_loaded":"#/components/schemas/BrowserPageDomContentLoadedEvent","page_layout_settled":"#/components/schemas/BrowserPageLayoutSettledEvent","page_layout_shift":"#/components/schemas/BrowserPageLayoutShiftEvent","page_lcp":"#/components/schemas/BrowserPageLcpEvent","page_load":"#/components/schemas/BrowserPageLoadEvent","page_navigation":"#/components/schemas/BrowserPageNavigationEvent","page_navigation_settled":"#/components/schemas/BrowserPageNavigationSettledEvent","page_tab_opened":"#/components/schemas/BrowserPageTabOpenedEvent","service_crashed":"#/components/schemas/BrowserServiceCrashedEvent","system_oom_kill":"#/components/schemas/BrowserSystemOomKillEvent"},"propertyName":"type"},"oneOf":[{"$ref":"#/components/schemas/BrowserConsoleLogEvent"},{"$ref":"#/components/schemas/BrowserConsoleErrorEvent"},{"$ref":"#/components/schemas/BrowserNetworkRequestEvent"},{"$ref":"#/components/schemas/BrowserNetworkResponseEvent"},{"$ref":"#/components/schemas/BrowserNetworkLoadingFailedEvent"},{"$ref":"#/components/schemas/BrowserNetworkIdleEvent"},{"$ref":"#/components/schemas/BrowserPageNavigationEvent"},{"$ref":"#/components/schemas/BrowserPageDomContentLoadedEvent"},{"$ref":"#/components/schemas/BrowserPageLoadEvent"},{"$ref":"#/components/schemas/BrowserPageTabOpenedEvent"},{"$ref":"#/components/schemas/BrowserPageLayoutShiftEvent"},{"$ref":"#/components/schemas/BrowserPageLcpEvent"},{"$ref":"#/components/schemas/BrowserPageLayoutSettledEvent"},{"$ref":"#/components/schemas/BrowserPageNavigationSettledEvent"},{"$ref":"#/components/schemas/BrowserInteractionClickEvent"},{"$ref":"#/components/schemas/BrowserInteractionKeyEvent"},{"$ref":"#/components/schemas/BrowserInteractionScrollSettledEvent"},{"$ref":"#/components/schemas/BrowserMonitorScreenshotEvent"},{"$ref":"#/components/schemas/BrowserMonitorDisconnectedEvent"},{"$ref":"#/components/schemas/BrowserMonitorReconnectedEvent"},{"$ref":"#/components/schemas/BrowserMonitorReconnectFailedEvent"},{"$ref":"#/components/schemas/BrowserMonitorInitFailedEvent"},{"$ref":"#/components/schemas/BrowserApiCallEvent"},{"$ref":"#/components/schemas/BrowserCdpConnectEvent"},{"$ref":"#/components/schemas/BrowserCdpDisconnectEvent"},{"$ref":"#/components/schemas/BrowserLiveViewConnectEvent"},{"$ref":"#/components/schemas/BrowserLiveViewDisconnectEvent"},{"$ref":"#/components/schemas/BrowserCaptchaSolveResultEvent"},{"$ref":"#/components/schemas/BrowserSystemOomKillEvent"},{"$ref":"#/components/schemas/BrowserServiceCrashedEvent"}]},"BrowserTelemetryEventEnvelope":{"additionalProperties":false,"description":"Envelope wrapping a browser telemetry event with its monotonic sequence number. Each SSE data: frame carries one envelope as JSON. The seq value is also emitted as the SSE id: field so clients can pass it as Last-Event-ID on reconnect.\n","properties":{"event":{"$ref":"#/components/schemas/BrowserTelemetryEvent"},"seq":{"description":"Process-monotonic sequence number assigned by the browser VM. Pass as Last-Event-ID on reconnect to resume without gaps. Gaps in received seq values indicate dropped events.\n","format":"int64","minimum":1,"type":"integer"}},"required":["seq","event"],"type":"object"},"BrowserTelemetryExportConfig":{"description":"Active export state for a session's captured telemetry, by protocol.","properties":{"otlp":{"$ref":"#/components/schemas/BrowserTelemetryOTLPExportConfig","description":"Active OTLP export state."}},"type":"object"},"BrowserTelemetryExportRequestConfig":{"description":"Export destinations for a session's captured telemetry, by protocol. Honored when creating a browser, including the browser a managed auth connection creates for a login. Browser pools do not support export and reject it; on a browser update it is ignored, so the session keeps the destination it was created with.","properties":{"otlp":{"$ref":"#/components/schemas/BrowserTelemetryOTLPExportRequestConfig","description":"Export captured telemetry over OTLP to one of the org's configured destinations."}},"type":"object"},"BrowserTelemetryOTLPExportConfig":{"description":"Active OTLP export state for a browser session.","properties":{"destination":{"description":"ID of the OTLP destination the session is bound to. Omitted when the session is not exporting.","type":"string"},"enabled":{"description":"Whether the session is exporting captured telemetry over OTLP.","type":"boolean"}},"type":"object"},"BrowserTelemetryOTLPExportRequestConfig":{"description":"OTLP export settings for a browser session.","properties":{"destination":{"$ref":"#/components/schemas/OTLPDestinationRef","description":"OTLP destination to export this session's captured telemetry to. Provide either id or name. Requires telemetry capture to be enabled."},"enabled":{"description":"Whether to export captured telemetry over OTLP. Setting destination implies enabled=true, so this only needs to be set explicitly to disable export (enabled=false with a destination is rejected).","type":"boolean"}},"type":"object"},"BrowserTelemetryRequestConfig":{"description":"Telemetry request configuration for a browser session.","properties":{"browser":{"$ref":"#/components/schemas/BrowserTelemetryCategoriesConfig","description":"Per-category capture flags. The operational categories (control, connection, system, captcha) are captured whenever telemetry is enabled; set one to enabled=false to opt out. The CDP categories (console, network, page, interaction) and screenshot are off by default; set enabled=true to opt in. On create, provided categories layer onto the default set. On update, provided categories merge onto the session's current config; when no telemetry is active this falls back to the default set (matching create). If browser is omitted or empty, the default set is used. A browser config that disables every category stops capture on update and starts no capture on create."},"enabled":{"description":"Request shortcut for browser telemetry capture. True enables capture; with no browser category settings it captures the default set (control, connection, system, captcha), and any browser category settings are layered onto that default set. On update, enabled=true resolves the config fresh from the default set plus any provided categories, replacing the session's current selection rather than merging onto it; omit enabled to merge categories onto the current selection instead. False stops capture on update and starts no capture on create. enabled=false cannot be combined with browser category settings.","type":"boolean"},"export":{"$ref":"#/components/schemas/BrowserTelemetryExportRequestConfig","description":"Where to export this session's captured telemetry. Omit to capture without exporting."}},"type":"object"},"BrowserUpdateRequest":{"description":"Request body for updating a browser session.","properties":{"disable_default_proxy":{"deprecated":true,"description":"If true, stealth browsers connect directly instead of using the default stealth proxy. Deprecated in favor of proxy.mode.","type":"boolean","x-deprecated-reason":"Use proxy.mode instead."},"name":{"description":"Human-readable name for the browser session. Omit to leave unchanged, set to an empty string to clear the name. When set, must be unique among active sessions within the project.\n","example":"checkout-flow-1","maxLength":255,"minLength":1,"nullable":true,"pattern":"^[a-zA-Z0-9._-]{1,255}$","type":"string"},"profile":{"$ref":"#/components/schemas/BrowserProfile","description":"Profile to load into the browser session. Only allowed if the session does not already have a profile loaded."},"proxy":{"$ref":"#/components/schemas/BrowserProxyConfig","description":"Proxy configuration to apply. Omit to leave the current configuration unchanged. Cannot be combined with proxy_id or disable_default_proxy.\nSet mode to direct to switch to direct egress regardless of stealth. Set mode to default to restore the browser default after using a selected proxy: Kernel's default stealth proxy for a stealth browser, or direct egress for a non-stealth browser.\nUpdating proxy does not change stealth or CAPTCHA solver behavior.\n"},"proxy_id":{"deprecated":true,"description":"ID of the proxy to use. Omit to leave unchanged, set to empty string to remove proxy. Deprecated in favor of proxy.","nullable":true,"type":"string","x-deprecated-reason":"Use proxy instead."},"tags":{"$ref":"#/components/schemas/Tags","description":"User-defined key-value tags for the browser session. Omit to leave unchanged. Provide a map to replace the entire tag set (full replace, not a merge). Set to an empty object ({}) to clear all tags. Up to 50 pairs.\n","nullable":true},"telemetry":{"$ref":"#/components/schemas/BrowserTelemetryRequestConfig","description":"Telemetry configuration. Omit, set to null, or set to an empty object ({}) to leave the existing configuration unchanged. Set enabled to true to enable capture using VM defaults. Set enabled to false to stop capture. Provide browser category settings for per-category updates. Explicitly disabling all four categories also stops capture.\n","nullable":true},"viewport":{"$ref":"#/components/schemas/BrowserViewportUpdate","description":"Viewport configuration to apply to the browser session."}},"type":"object"},"BrowserUsage":{"description":"Session usage metrics.","properties":{"uptime_ms":{"description":"Time in milliseconds the session was actively running.","type":"integer"}},"required":["uptime_ms"],"type":"object"},"BrowserViewport":{"description":"Initial browser window size in pixels with optional refresh rate.\nIf omitted, image defaults apply (1920x1080@25).\nFor GPU images, the default is 1920x1080@60.\nArbitrary viewport dimensions and refresh rates are accepted.\nKnown-good presets include:\n2560x1440@10, 1920x1080@25, 1920x1200@25, 1440x900@25, 1280x800@60, 1024x768@60, 1200x800@60, 768x1024@60, 390x844@60.\nFor GPU images, recommended presets use one of these resolutions with refresh rates 60, 30, 25, or 10:\n800x600, 960x720, 1024x576, 1024x768, 1152x648, 1200x800, 1280x720, 1368x768, 1440x900, 1600x900, 1920x1080, 1920x1200, 390x844, 360x250, 768x1024, 800x1600.\nViewports outside this list may exhibit unstable live view or recording behavior.\nIf refresh_rate is not provided, it will be automatically determined based on the resolution\n(higher resolutions use lower refresh rates to keep bandwidth reasonable).\n","properties":{"height":{"description":"Browser window height in pixels. Any positive integer is accepted.","example":800,"minimum":1,"type":"integer"},"refresh_rate":{"description":"Display refresh rate in Hz. Any positive integer is accepted; if omitted, automatically determined from width and height.","example":60,"minimum":1,"type":"integer"},"width":{"description":"Browser window width in pixels. Any positive integer is accepted.","example":1280,"minimum":1,"type":"integer"}},"required":["width","height"],"type":"object"},"BrowserViewportUpdate":{"allOf":[{"$ref":"#/components/schemas/BrowserViewport"},{"properties":{"force":{"default":false,"description":"If true, allow the viewport change even when a live view or recording/replay is active.\nActive recordings will be gracefully stopped and restarted at the new resolution as\nseparate segments. If false (default), the resize is refused when a live view or recording is active.\n","type":"boolean"}},"type":"object"}],"description":"Viewport configuration for updating a browser session. Extends BrowserViewport with update-only options."},"ClickMouseRequest":{"additionalProperties":false,"properties":{"button":{"description":"Mouse button to interact with","enum":["left","right","middle","back","forward"],"type":"string"},"click_type":{"description":"Type of click action","enum":["down","up","click"],"type":"string"},"hold_keys":{"description":"Modifier keys to hold during the click","items":{"type":"string"},"type":"array"},"num_clicks":{"default":1,"description":"Number of times to repeat the click","type":"integer"},"true":{"description":"Y coordinate of the click position","type":"integer"},"x":{"description":"X coordinate of the click position","type":"integer"}},"required":["x",true],"type":"object"},"ClipboardContent":{"additionalProperties":false,"properties":{"text":{"description":"Current clipboard text content","type":"string"}},"required":["text"],"type":"object"},"ComputerAction":{"additionalProperties":false,"description":"A single computer action to execute as part of a batch. The `type` field selects which\naction to perform, and the corresponding field contains the action parameters.\nExactly one action field matching the type must be provided.\n","properties":{"click_mouse":{"$ref":"#/components/schemas/ClickMouseRequest"},"drag_mouse":{"$ref":"#/components/schemas/DragMouseRequest"},"move_mouse":{"$ref":"#/components/schemas/MoveMouseRequest"},"press_key":{"$ref":"#/components/schemas/PressKeyRequest"},"scroll":{"$ref":"#/components/schemas/ScrollRequest"},"set_cursor":{"$ref":"#/components/schemas/SetCursorRequest"},"sleep":{"$ref":"#/components/schemas/SleepAction"},"type":{"description":"The type of action to perform.","enum":["click_mouse","move_mouse","type_text","press_key","scroll","drag_mouse","set_cursor","sleep"],"type":"string"},"type_text":{"$ref":"#/components/schemas/TypeTextRequest"}},"required":["type"],"type":"object"},"CreateApiKeyRequest":{"properties":{"days_to_expire":{"description":"Number of days until expiry, up to 3650. Use null for never.","example":30,"maximum":3650,"minimum":1,"nullable":true,"type":"integer"},"name":{"description":"Label for the API key (1-255 characters). API keys are not addressable by name.","example":"staging","maxLength":255,"minLength":1,"type":"string"},"project_id":{"description":"Unique project identifier","example":"proj_abc123","nullable":true,"type":"string"}},"required":["name"],"type":"object"},"CreateAuditLogExportDestinationRequest":{"additionalProperties":false,"properties":{"bucket":{"maxLength":63,"minLength":3,"type":"string"},"format":{"enum":["jsonl.gz"],"type":"string"},"kms_key_id":{"maxLength":2048,"type":"string"},"prefix":{"maxLength":512,"type":"string"},"region":{"maxLength":128,"minLength":1,"type":"string"},"role_arn":{"maxLength":2048,"minLength":1,"type":"string"},"type":{"enum":["s3"],"type":"string"}},"required":["type","region","bucket","prefix","role_arn","format"],"type":"object"},"CreateCredentialProviderRequest":{"additionalProperties":false,"description":"Request to create an external credential provider","properties":{"cache_ttl_seconds":{"default":300,"description":"How long to cache credential lists (default 300 seconds)","example":300,"type":"integer"},"name":{"description":"Human-readable name for this provider instance (unique per org)","example":"my-1password","type":"string"},"provider_type":{"description":"Type of credential provider","enum":["onepassword"],"example":"onepassword","type":"string"},"token":{"description":"Service account token for the provider (e.g., 1Password service account token)","example":"ops_eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...","type":"string"}},"required":["provider_type","name","token"],"type":"object"},"CreateCredentialRequest":{"additionalProperties":false,"description":"Request to create a new credential","properties":{"domain":{"description":"Target domain this credential is for","example":"netflix.com","type":"string"},"name":{"description":"Unique name for the credential within the project","example":"my-netflix-login","type":"string"},"sso_provider":{"description":"If set, indicates this credential should be used with the specified SSO provider (e.g., google, github, microsoft). When the target site has a matching SSO button, it will be clicked first before filling credential values on the identity provider's login page.","example":"google","type":"string"},"totp_secret":{"description":"Base32-encoded TOTP secret for generating one-time passwords. Used for automatic 2FA during login.","example":"JBSWY3DPEHPK3PXP","type":"string"},"values":{"additionalProperties":{"type":"string"},"description":"Field name to value mapping (e.g., username, password)","example":{"password":"mysecretpassword","username":"user@example.com"},"type":"object"}},"required":["name","domain","values"],"type":"object"},"CreateCustomProxyConfig":{"description":"Configuration for a custom proxy (e.g., private proxy server).","properties":{"ca_bundle":{"description":"PEM-encoded CA certificate bundle the proxy re-signs upstream TLS with. Provide when the proxy terminates TLS (MITM) so the browser trusts its certificates. May contain multiple concatenated certificates.","example":"-----BEGIN CERTIFICATE-----\nMIIB...\n-----END CERTIFICATE-----\n","maxLength":65536,"type":"string"},"host":{"description":"Proxy host address or IP.","example":"127.0.0.1","type":"string"},"password":{"description":"Password for proxy authentication.","example":"secret","maxLength":4096,"type":"string"},"port":{"description":"Proxy port.","example":8080,"type":"integer"},"username":{"description":"Username for proxy authentication.","example":"user123","type":"string"}},"required":["host","port"],"title":"Custom","type":"object"},"CreateDirectoryRequest":{"additionalProperties":false,"properties":{"mode":{"description":"Optional directory mode (octal string, e.g. 755). Defaults to 755.","pattern":"^[0-7]{3,4}$","type":"string"},"path":{"description":"Absolute directory path to create.","pattern":"^/.*","type":"string"}},"required":["path"],"type":"object"},"CreateProjectRequest":{"properties":{"name":{"description":"Project name (1-255 Unicode code points; cannot contain `/` or `%`)","example":"staging","maxLength":255,"minLength":1,"type":"string"}},"required":["name"],"type":"object"},"CreatedApiKey":{"allOf":[{"$ref":"#/components/schemas/ApiKey"},{"properties":{"key":{"description":"Plaintext API key. Only returned once when the key is created.","example":"sk_1234abcd","type":"string"}},"required":["key"],"type":"object"}],"description":"API key returned immediately after creation. Includes the plaintext key once."},"Credential":{"additionalProperties":false,"description":"A stored credential for automatic re-authentication","properties":{"created_at":{"description":"When the credential was created","example":"2025-01-15T10:30:00Z","format":"date-time","type":"string"},"domain":{"description":"Target domain this credential is for","example":"netflix.com","type":"string"},"has_totp_secret":{"description":"Whether this credential has a TOTP secret configured for automatic 2FA","example":false,"type":"boolean"},"has_values":{"description":"Whether this credential has stored values (email, password, etc.)","example":true,"type":"boolean"},"id":{"description":"Unique identifier for the credential","example":"cred_abc123xyz","type":"string"},"name":{"description":"Unique name for the credential within the project","example":"my-netflix-login","type":"string"},"sso_provider":{"description":"If set, indicates this credential should be used with the specified SSO provider (e.g., google, github, microsoft). When the target site has a matching SSO button, it will be clicked first before filling credential values on the identity provider's login page.","example":"google","nullable":true,"type":"string"},"totp_code":{"description":"Current 6-digit TOTP code. Only included in create/update responses when totp_secret was just set.","example":"847291","type":"string"},"totp_code_expires_at":{"description":"When the totp_code expires. Only included when totp_code is present.","example":"2025-01-15T10:30:30Z","format":"date-time","type":"string"},"updated_at":{"description":"When the credential was last updated","example":"2025-01-15T10:30:00Z","format":"date-time","type":"string"},"value_keys":{"description":"The field names stored in this credential's values (e.g., username, password). Values themselves are never returned. Included on single-credential responses (create, get by id or name, update); omitted from list responses.","example":["username","password"],"items":{"type":"string"},"type":"array"}},"required":["id","name","domain","created_at","updated_at"],"type":"object"},"CredentialProvider":{"additionalProperties":false,"description":"An external credential provider (e.g., 1Password) for automatic credential lookup","properties":{"created_at":{"description":"When the credential provider was created","example":"2025-01-15T10:30:00Z","format":"date-time","type":"string"},"enabled":{"description":"Whether the provider is enabled for credential lookups","example":true,"type":"boolean"},"id":{"description":"Unique identifier for the credential provider","example":"credprov_abc123xyz","type":"string"},"name":{"description":"Human-readable name for this provider instance","example":"my-1password","type":"string"},"priority":{"description":"Priority order for credential lookups (lower numbers are checked first)","example":0,"type":"integer"},"provider_type":{"description":"Type of credential provider","enum":["onepassword"],"example":"onepassword","type":"string"},"updated_at":{"description":"When the credential provider was last updated","example":"2025-01-15T10:30:00Z","format":"date-time","type":"string"}},"required":["id","provider_type","name","enabled","priority","created_at","updated_at"],"type":"object"},"CredentialProviderItem":{"additionalProperties":false,"description":"A credential item from an external provider (e.g., a 1Password login item)","properties":{"id":{"description":"Unique identifier for the item within the provider","example":"abc123xyz","type":"string"},"path":{"description":"Path to reference this item (VaultName/ItemTitle format)","example":"Engineering/Netflix Login","type":"string"},"title":{"description":"Display name of the credential item","example":"Netflix Login","type":"string"},"urls":{"description":"URLs associated with this credential","example":["https://netflix.com","https://www.netflix.com"],"items":{"type":"string"},"type":"array"},"vault_id":{"description":"ID of the vault containing this item","example":"vault_abc123","type":"string"},"vault_name":{"description":"Name of the vault containing this item","example":"Engineering","type":"string"}},"required":["id","title","vault_id","vault_name","path"],"type":"object"},"CredentialProviderTestResult":{"additionalProperties":false,"description":"Result of testing a credential provider connection","properties":{"error":{"description":"Error message if the test failed","example":"Invalid token","type":"string"},"success":{"description":"Whether the connection test was successful","example":true,"type":"boolean"},"vaults":{"description":"List of vaults accessible by the service account","items":{"properties":{"id":{"description":"Vault ID","example":"abc123xyz","type":"string"},"name":{"description":"Vault name","example":"Shared Logins","type":"string"}},"required":["id","name"],"type":"object"},"type":"array"}},"required":["success","vaults"],"type":"object"},"CredentialReference":{"additionalProperties":false,"description":"Reference to credentials for the auth connection. Use one of:\n- { name } for Kernel credentials\n- { provider, path } for external provider item\n- { provider, auto: true } for external provider domain lookup\n","properties":{"auto":{"description":"If true, lookup by domain from the specified provider","example":true,"type":"boolean"},"name":{"description":"Kernel credential name","example":"my-netflix-creds","type":"string"},"path":{"description":"Provider-specific path (e.g., \"VaultName/ItemName\" for 1Password)","example":"Personal/Netflix","type":"string"},"provider":{"description":"External provider name (e.g., \"my-1p\")","example":"my-1p","type":"string"}},"type":"object"},"CustomProxyConfig":{"description":"Configuration for a custom proxy (e.g., private proxy server).","properties":{"has_ca_bundle":{"description":"Whether the proxy has a custom CA bundle configured.","example":true,"type":"boolean"},"has_password":{"description":"Whether the proxy has a password.","example":true,"type":"boolean"},"host":{"description":"Proxy host address or IP.","example":"127.0.0.1","type":"string"},"port":{"description":"Proxy port.","example":8080,"type":"integer"},"username":{"description":"Username for proxy authentication.","example":"user123","type":"string"}},"required":["host","port"],"title":"Custom","type":"object"},"DatacenterProxyConfig":{"description":"Configuration for a datacenter proxy.","properties":{"country":{"description":"ISO 3166 country code. Defaults to US if not provided.","example":"US","type":"string"}},"title":"Datacenter","type":"object"},"DeletePathRequest":{"additionalProperties":false,"properties":{"path":{"description":"Absolute path to delete.","pattern":"^/.*","type":"string"}},"required":["path"],"type":"object"},"Deployment":{"description":"Deployment record information.","properties":{"created_at":{"description":"Timestamp when the deployment was created","format":"date-time","type":"string"},"entrypoint_rel_path":{"description":"Relative path to the application entrypoint","example":"src/app.py","type":"string"},"env_vars":{"additionalProperties":{"type":"string"},"description":"Environment variables configured for this deployment. Values are redacted for API key, OAuth, and managed-auth callers, which receive every key with an empty string value. Only dashboard sessions receive the actual values.","type":"object"},"id":{"description":"Unique identifier for the deployment","example":"rr33xuugxj9h0bkf1rdt2bet","type":"string"},"region":{"const":"aws.us-east-1a","description":"Deployment region code","example":"aws.us-east-1a","type":"string"},"source_checksum":{"description":"Hex-encoded SHA-256 checksum of the source archive. For file uploads, this hashes the uploaded archive; for GitHub-sourced deployments, this hashes the GitHub archive downloaded by the API. Omitted for deployments created before this field was recorded.","example":"3f4d0ea1bd2c5c1a1a1f0e9d8c7b6a5948372615049382716a5b4c3d2e1f0a9b","type":"string"},"source_path":{"description":"For GitHub-sourced deployments, the subpath within the repository that was used as the deploy root. Omitted when the repo root was used or for file uploads.","example":"apps/api","type":"string"},"source_ref":{"description":"For GitHub-sourced deployments, the git ref as requested at deploy time (branch, tag, or commit SHA — not resolved to a commit). Omitted for file uploads.","example":"main","type":"string"},"source_type":{"description":"Origin of the deployed source code. This is read-only response provenance; `file` indicates an uploaded archive and `github` indicates a repository fetched by the API.","enum":["file","github"],"example":"github","type":"string","x-go-type-name":"DeploymentSourceOrigin"},"source_url":{"description":"For GitHub-sourced deployments, the repository URL that was fetched. Omitted for file uploads.","example":"https://github.com/org/repo","type":"string"},"status":{"description":"Current status of the deployment","enum":["queued","in_progress","running","failed","stopped"],"example":"queued","type":"string"},"status_reason":{"description":"Status reason","example":"Deployment in progress","type":"string"},"updated_at":{"description":"Timestamp when the deployment was last updated","format":"date-time","nullable":true,"type":"string"}},"required":["id","status","region","created_at"],"type":"object"},"DeploymentEvent":{"description":"Union type representing any deployment event.","discriminator":{"mapping":{"app_version_summary":"#/components/schemas/AppVersionSummary","deployment_state":"#/components/schemas/DeploymentStateEvent","error":"#/components/schemas/InternalError","log":"#/components/schemas/LogEvent","sse_heartbeat":"#/components/schemas/SSEHeartbeatEvent"},"propertyName":"event"},"oneOf":[{"$ref":"#/components/schemas/LogEvent"},{"$ref":"#/components/schemas/DeploymentStateEvent"},{"$ref":"#/components/schemas/AppVersionSummaryEvent"},{"$ref":"#/components/schemas/ErrorEvent"},{"$ref":"#/components/schemas/SSEHeartbeatEvent"}]},"DeploymentRequest":{"description":"App deployment request. Provide either file+entrypoint_rel_path or source.","oneOf":[{"required":["file","entrypoint_rel_path"]},{"required":["source"]}],"properties":{"entrypoint_rel_path":{"description":"Relative path to the entrypoint of the application","example":"src/app.py","type":"string"},"env_vars":{"additionalProperties":{"type":"string"},"description":"Map of environment variables to set for the deployed application. Each key-value pair represents an environment variable.","type":"object"},"file":{"description":"ZIP file containing the application source directory","example":"@path/to/file.zip","format":"binary","type":"string"},"force":{"default":false,"description":"Allow overwriting an existing app version","example":false,"type":"boolean"},"region":{"const":"aws.us-east-1a","default":"aws.us-east-1a","description":"Region for deployment. Currently we only support \"aws.us-east-1a\"","example":"aws.us-east-1a","type":"string"},"source":{"$ref":"#/components/schemas/DeploymentSource"},"version":{"default":"latest","description":"Version of the application. Can be any string.","example":"1.0.0","type":"string"}},"type":"object"},"DeploymentSource":{"description":"Source from which to fetch application code.","properties":{"auth":{"description":"Authentication for private repositories.","properties":{"method":{"description":"Auth method","enum":["github_token"],"example":"github_token","type":"string"},"token":{"description":"GitHub PAT or installation access token","example":"ghs_***","format":"password","type":"string"}},"required":["method","token"],"type":"object"},"entrypoint":{"description":"Relative path to the application entrypoint within the selected path.","example":"src/index.ts","type":"string"},"path":{"description":"Path within the repo to deploy (omit to use repo root).","example":"apps/api","type":"string"},"ref":{"description":"Git ref (branch, tag, or commit SHA) to fetch.","example":"main","type":"string"},"type":{"description":"Source type identifier.","enum":["github"],"example":"github","type":"string"},"url":{"description":"Base repository URL (without blob/tree suffixes).","example":"https://github.com/org/repo","type":"string"}},"required":["type","url","ref","entrypoint"],"type":"object"},"DeploymentStateEvent":{"description":"An event representing the current state of a deployment.","properties":{"deployment":{"$ref":"#/components/schemas/Deployment"},"event":{"const":"deployment_state","description":"Event type identifier (always \"deployment_state\").","type":"string"},"timestamp":{"description":"Time the state was reported.","format":"date-time","type":"string"}},"required":["event","deployment","timestamp"],"type":"object"},"DiscoveredField":{"additionalProperties":false,"description":"A discovered form field","properties":{"hint":{"description":"Contextual help text near the field that tells the user what to enter (e.g., \"Enter the phone ending in (***) ***-**92\")","example":"Enter the phone ending in (***) ***-**92","type":"string"},"label":{"description":"Field label","example":"Email address","type":"string"},"linked_mfa_type":{"$ref":"#/components/schemas/MFAType","description":"If this field is associated with an MFA option, the type of that option (e.g., password field linked to \"Enter password\" option)","nullable":true},"name":{"description":"Field name","example":"email","type":"string"},"placeholder":{"description":"Field placeholder","example":"you@example.com","type":"string"},"required":{"default":true,"description":"Whether field is required","example":true,"type":"boolean"},"selector":{"description":"CSS selector for the field","example":"input#email","type":"string"},"type":{"description":"Field type","enum":["text","email","password","tel","number","url","code","totp"],"example":"email","type":"string"}},"required":["name","type","label","selector"],"type":"object"},"DragMouseRequest":{"additionalProperties":false,"properties":{"button":{"description":"Mouse button to drag with","enum":["left","middle","right"],"type":"string"},"delay":{"default":0,"description":"Delay in milliseconds between button down and starting to move along the path.","minimum":0,"type":"integer"},"duration_ms":{"description":"Target total duration in milliseconds for the entire drag movement when smooth=true. Omit for automatic timing based on total path length.","maximum":10000,"minimum":50,"type":"integer"},"hold_keys":{"description":"Modifier keys to hold during the drag","items":{"type":"string"},"type":"array"},"path":{"description":"Ordered list of [x, y] coordinate pairs to move through while dragging. Must contain at least 2 points.","items":{"items":{"type":"integer"},"maxItems":2,"minItems":2,"type":"array"},"minItems":2,"type":"array"},"smooth":{"default":true,"description":"Use human-like Bezier curves between path waypoints instead of linear interpolation. When true, steps_per_segment and step_delay_ms are ignored.","type":"boolean"},"step_delay_ms":{"default":50,"description":"Delay in milliseconds between relative steps while dragging (not the initial delay).","minimum":0,"type":"integer"},"steps_per_segment":{"default":10,"description":"Number of relative move steps per segment in the path. Minimum 1.","minimum":1,"type":"integer"}},"required":["path"],"type":"object"},"Error":{"properties":{"code":{"description":"Application-specific error code (machine-readable)","example":"bad_request","type":"string"},"details":{"description":"Additional error details (for multiple errors)","items":{"$ref":"#/components/schemas/ErrorDetail"},"type":"array"},"inner_error":{"$ref":"#/components/schemas/ErrorDetail"},"message":{"description":"Human-readable error description for debugging","example":"Missing required field: app_name","type":"string"}},"required":["code","message"],"type":"object"},"ErrorDetail":{"properties":{"code":{"description":"Lower-level error code providing more specific detail","example":"invalid_input","type":"string"},"message":{"description":"Further detail about the error","example":"Provided version string is not semver compliant","type":"string"}},"type":"object"},"ErrorEvent":{"description":"An error event from the application.","properties":{"error":{"$ref":"#/components/schemas/Error"},"event":{"const":"error","description":"Event type identifier (always \"error\").","type":"string"},"timestamp":{"description":"Time the error occurred.","format":"date-time","type":"string"}},"required":["event","timestamp","error"],"type":"object"},"ExecutePlaywrightRequest":{"additionalProperties":false,"description":"Request to execute Playwright code","properties":{"code":{"description":"TypeScript/JavaScript code to execute. The code has access to 'page', 'context', and 'browser' variables.\nIt runs within a function, so you can use a return statement at the end to return a value.\nThis value is returned as the `result` property in the response.\nExample: \"await page.goto('https://example.com'); return await page.title();\"\n","type":"string"},"timeout_sec":{"default":60,"description":"Maximum execution time in seconds. Default is 60.","maximum":300,"minimum":1,"type":"integer"}},"required":["code"],"type":"object"},"ExecutePlaywrightResult":{"additionalProperties":false,"description":"Result of Playwright code execution","properties":{"error":{"description":"Error message if execution failed","type":"string"},"result":{"description":"The value returned by the code (if any)"},"stderr":{"description":"Standard error from the execution","type":"string"},"stdout":{"description":"Standard output from the execution","type":"string"},"success":{"description":"Whether the code executed successfully","type":"boolean"}},"required":["success"],"type":"object"},"Extension":{"description":"A browser extension uploaded to Kernel.","properties":{"checksum":{"description":"SHA-256 checksum, encoded as lowercase hexadecimal, of the exact uploaded extension archive bytes. This is not a normalized checksum of the extension contents; archive metadata, file ordering, and compression can change the checksum for otherwise identical contents. Omitted for legacy rows and server-repackaged Chrome Web Store extensions.","maxLength":64,"minLength":64,"nullable":true,"type":"string"},"created_at":{"description":"Timestamp when the extension was created","format":"date-time","type":"string"},"id":{"description":"Unique identifier for the extension","type":"string"},"last_used_at":{"description":"Timestamp when the extension was last used","format":"date-time","nullable":true,"type":"string"},"name":{"description":"Optional, easier-to-reference name for the extension. Must be unique within the project.","nullable":true,"type":"string"},"size_bytes":{"description":"Size of the extension archive in bytes","type":"integer"}},"required":["id","created_at","size_bytes"],"type":"object"},"FileInfo":{"properties":{"is_dir":{"description":"Whether the path is a directory.","type":"boolean"},"mod_time":{"description":"Last modification time.","format":"date-time","type":"string"},"mode":{"description":"File mode bits (e.g., \"drwxr-xr-x\" or \"-rw-r--r--\").","type":"string"},"name":{"description":"Base name of the file or directory.","type":"string"},"path":{"description":"Absolute path.","type":"string"},"size_bytes":{"description":"Size in bytes. 0 for directories.","type":"integer"}},"required":["name","path","size_bytes","is_dir","mod_time","mode"],"type":"object"},"FileSystemEvent":{"description":"Filesystem change event.","properties":{"is_dir":{"description":"Whether the affected path is a directory.","type":"boolean"},"name":{"description":"Base name of the file or directory affected.","type":"string"},"path":{"description":"Absolute path of the file or directory.","type":"string"},"type":{"description":"Event type.","enum":["CREATE","WRITE","DELETE","RENAME"],"type":"string"}},"required":["type","path"],"type":"object"},"Invocation":{"properties":{"action_name":{"description":"Name of the action invoked","example":"analyze","type":"string"},"app_name":{"description":"Name of the application","example":"my-app","type":"string"},"finished_at":{"description":"RFC 3339 Nanoseconds timestamp when the invocation finished (null if still running)","example":"2024-05-19T15:30:05.000000000Z07:00","format":"date-time","nullable":true,"type":"string"},"id":{"description":"ID of the invocation","example":"rr33xuugxj9h0bkf1rdt2bet","type":"string"},"output":{"description":"Output produced by the action, rendered as a JSON string. This could be: string, number, boolean, array, object, or null.","example":"{\"result\":\"success\",\"data\":\"processed input\"}","type":"string"},"payload":{"description":"Payload provided to the invocation. This is a string that can be parsed as JSON.","example":"{\"data\":\"example input\"}","type":"string"},"started_at":{"description":"RFC 3339 Nanoseconds timestamp when the invocation started","example":"2024-05-19T15:30:00.000000000Z07:00","format":"date-time","type":"string"},"status":{"description":"Status of the invocation","enum":["queued","running","succeeded","failed"],"example":"succeeded","type":"string"},"status_reason":{"description":"Status reason","example":"Invocation completed successfully","type":"string"},"version":{"description":"Version label for the application","example":"1.0.0","type":"string"}},"required":["id","app_name","version","action_name","started_at","status"],"type":"object"},"InvocationEvent":{"description":"Union type representing any invocation event.","discriminator":{"mapping":{"error":"#/components/schemas/ErrorEvent","invocation_state":"#/components/schemas/InvocationStateEvent","log":"#/components/schemas/LogEvent","sse_heartbeat":"#/components/schemas/SSEHeartbeatEvent"},"propertyName":"event"},"oneOf":[{"$ref":"#/components/schemas/LogEvent"},{"$ref":"#/components/schemas/InvocationStateEvent"},{"$ref":"#/components/schemas/ErrorEvent"},{"$ref":"#/components/schemas/SSEHeartbeatEvent"}]},"InvocationStateEvent":{"description":"An event representing the current state of an invocation.","properties":{"event":{"const":"invocation_state","description":"Event type identifier (always \"invocation_state\").","type":"string"},"invocation":{"$ref":"#/components/schemas/Invocation"},"timestamp":{"description":"Time the state was reported.","format":"date-time","type":"string"}},"required":["event","invocation","timestamp"],"type":"object"},"InvocationUpdateRequest":{"description":"Request body for updating an invocation.","properties":{"output":{"description":"Updated output of the invocation rendered as JSON string.","type":"string"},"status":{"description":"New status for the invocation.","enum":["succeeded","failed"],"type":"string"}},"required":["status"],"type":"object"},"InvokeResponse":{"properties":{"action_name":{"description":"Name of the action invoked","example":"analyze","type":"string"},"id":{"description":"ID of the invocation","example":"rr33xuugxj9h0bkf1rdt2bet","type":"string"},"output":{"description":"The return value of the action that was invoked, rendered as a JSON string. This could be: string, number, boolean, array, object, or null.","example":"{\"result\":\"success\",\"data\":\"processed input\"}","type":"string"},"status":{"description":"Status of the invocation","enum":["queued","running","succeeded","failed"],"example":"queued","type":"string"},"status_reason":{"description":"Status reason","example":"Invocation queued for execution","type":"string"}},"required":["id","action_name","status"],"type":"object"},"IspProxyConfig":{"description":"Configuration for an ISP proxy.","properties":{"country":{"description":"ISO 3166 country code. Defaults to US if not provided.","example":"US","type":"string"}},"title":"ISP","type":"object"},"ListFiles":{"description":"Array of file or directory information entries.","items":{"$ref":"#/components/schemas/FileInfo"},"type":"array"},"LogEvent":{"description":"A log entry from the application.","properties":{"event":{"const":"log","description":"Event type identifier (always \"log\").","type":"string"},"message":{"description":"Log message text.","type":"string"},"timestamp":{"description":"Time the log entry was produced.","format":"date-time","type":"string"}},"required":["event","message","timestamp"],"type":"object"},"LoginRequest":{"additionalProperties":false,"description":"Request to start a login flow","properties":{"browser":{"$ref":"#/components/schemas/ManagedAuthBrowserConfig","description":"Browser configuration override for this login. Omitted properties inherit the connection defaults."},"browser_telemetry":{"$ref":"#/components/schemas/BrowserTelemetryRequestConfig","deprecated":true,"description":"Deprecated. Use browser.telemetry. Retained during migration for existing clients.","nullable":true},"proxy":{"$ref":"#/components/schemas/ProxyRef","deprecated":true,"description":"Deprecated. Use browser.proxy. Retained during migration for existing clients."},"record_session":{"description":"Override the connection's default for recording this login's browser session. When omitted, the connection's record_session default is used.","example":true,"type":"boolean"}},"type":"object"},"LoginResponse":{"additionalProperties":false,"description":"Response from starting a login flow","properties":{"flow_expires_at":{"description":"When the login flow expires","example":"2025-11-05T20:00:00Z","format":"date-time","type":"string"},"flow_type":{"description":"Type of login flow started","enum":["LOGIN","REAUTH"],"example":"LOGIN","type":"string"},"handoff_code":{"description":"One-time code for handoff (internal use)","example":"aBcD123EfGh456IjKl789MnOp012QrStUvWxYzAbCdEf","type":"string"},"hosted_url":{"description":"URL to redirect user to for login","example":"https://auth.kernel.com/login/abc123xyz","format":"uri","type":"string"},"id":{"description":"Auth connection ID","example":"ma_abc123xyz","type":"string"},"live_view_url":{"description":"Browser live view URL for watching the login flow","example":"https://live.onkernel.com/abc123xyz","format":"uri","type":"string"}},"required":["id","flow_type","hosted_url","flow_expires_at"],"type":"object"},"MFAOption":{"additionalProperties":false,"description":"An MFA method option for verification","properties":{"description":{"description":"Additional instructions from the site","example":"We'll send a 6-digit code to your phone","nullable":true,"type":"string"},"label":{"description":"The visible option text","example":"Text me a code","type":"string"},"target":{"description":"The masked destination (phone/email) if shown","example":"***-***-5678","nullable":true,"type":"string"},"type":{"$ref":"#/components/schemas/MFAType"}},"required":["type","label"],"type":"object"},"MFAType":{"description":"The MFA delivery method type. Includes 'password' for auth method selection pages and 'switch' for generic method-switcher links like \"Use another method\" that do not name a specific method.","enum":["sms","call","email","totp","push","password","switch"],"example":"sms","type":"string"},"ManagedAuth":{"additionalProperties":false,"description":"Managed authentication that keeps a profile logged into a specific domain. Flow fields (flow_status, flow_step, discovered_fields, mfa_options) reflect the most recent login flow and are null when no flow has been initiated.","properties":{"allowed_domains":{"description":"Additional domains that are valid for this auth flow (besides the primary domain). Useful when login pages redirect to different domains.\n\nThe following SSO/OAuth provider domains are automatically allowed by default and do not need to be specified:\n- Google: accounts.google.com\n- Microsoft/Azure AD: login.microsoftonline.com, login.live.com\n- Okta: *.okta.com, *.oktapreview.com\n- Auth0: *.auth0.com, *.us.auth0.com, *.eu.auth0.com, *.au.auth0.com\n- Apple: appleid.apple.com\n- GitHub: github.com\n- Facebook/Meta: www.facebook.com\n- LinkedIn: www.linkedin.com\n- Amazon Cognito: *.amazoncognito.com\n- OneLogin: *.onelogin.com\n- Ping Identity: *.pingone.com, *.pingidentity.com\n","example":["login.netflix.com","auth.netflix.com"],"items":{"type":"string"},"type":"array"},"auto_reauth":{"description":"Whether automatic re-authentication is permitted for this connection. This is an opt-in\nflag only — it does not check whether re-auth is actually feasible. Even when true,\nre-auth only runs when the system has what it needs to perform it (for example, saved\ncredentials for the required login fields), and only after a scheduled health check\ndetects an expired session — so this flag has no effect when `health_checks` is false.\nWhen false, expired sessions detected by a health check are marked as `NEEDS_AUTH`\ninstead of attempting re-auth.\n","example":true,"type":"boolean"},"browser":{"$ref":"#/components/schemas/ManagedAuthBrowserConfig","description":"Default browser configuration for login, reauthentication, and health-check sessions."},"browser_session_id":{"description":"ID of the underlying browser session driving the current flow (present when flow in progress).\nUse this to inspect or terminate the browser session via the `/browsers` API.\n","example":"bs_abc123xyz","nullable":true,"type":"string"},"browser_telemetry":{"$ref":"#/components/schemas/BrowserTelemetryRequestConfig","deprecated":true,"description":"Deprecated. Use browser.telemetry. Retained during migration for existing clients.","nullable":true},"can_reauth":{"description":"Whether Kernel can automatically re-authenticate this connection when the session expires. Requires a prior successful login plus either a Kernel credential or an external credential reference. See `can_reauth_reason` for the specific outcome.","example":true,"type":"boolean"},"can_reauth_reason":{"description":"Machine-readable reason for the current value of `can_reauth`.\nAffirmative values (re-auth is possible):\n  - `external_credential` — an external credential provider is attached\n  - `cua_has_credential` — CUA flow with a stored credential\n  - `has_credential` — Kernel credential is attached (optimistic; plan viability not checked)\n  - `viable_plans_found` — at least one stored login plan can be replayed\n  - `no_requirements_recorded` — no recorded credential requirements to fail against\n  - `requirements_satisfiable` — recorded requirements can be met by the attached credential\n\nNegative values (a human must complete the login flow):\n  - `no_prior_successful_login` — connection has never completed a successful login\n  - `no_credential` — no Kernel or external credential attached\n  - `no_viable_plans` — credential attached but no replayable login plan exists yet\n  - `viable_plans_require_external_action` — stored plans need an external step (email link, push, etc.)\n  - `requires_external_action` — recorded requirements include an external step\n  - `requires_totp_without_secret` — flow needs a TOTP code but no TOTP secret is stored\n  - `requires_sms_code` — flow needs an SMS code that cannot be received automatically\n  - `requires_email_code` — flow needs an email code that cannot be received automatically\n  - `requires_customer_input` — flow needs another field or choice that is unavailable during unattended re-authentication","enum":["external_credential","cua_has_credential","has_credential","viable_plans_found","no_requirements_recorded","requirements_satisfiable","no_prior_successful_login","no_credential","no_viable_plans","viable_plans_require_external_action","requires_external_action","requires_totp_without_secret","requires_sms_code","requires_email_code","requires_customer_input"],"example":"has_credential","type":"string"},"choices":{"description":"Canonical choices awaiting selection. Prefer this over pending_sso_buttons, mfa_options, and sign_in_options when present.","items":{"$ref":"#/components/schemas/ManagedAuthChoice"},"nullable":true,"type":"array"},"credential":{"$ref":"#/components/schemas/CredentialReference"},"discovered_fields":{"description":"Fields awaiting input (present when flow_step=awaiting_input; may also be present with awaiting_external_action as fallback actions)","items":{"$ref":"#/components/schemas/DiscoveredField"},"nullable":true,"type":"array"},"domain":{"description":"Target domain for authentication","example":"netflix.com","type":"string"},"error_code":{"description":"Machine-readable error code (present when flow_status=failed)","nullable":true,"type":"string"},"error_message":{"description":"Error message (present when flow_status=failed)","example":"Invalid password","nullable":true,"type":"string"},"external_action_message":{"description":"Instructions for external action (present when flow_step=awaiting_external_action)","example":"Tap 'Yes' on the Google prompt on your phone","nullable":true,"type":"string"},"fields":{"description":"Canonical fields awaiting input. Prefer this over discovered_fields when present.","items":{"$ref":"#/components/schemas/ManagedAuthField"},"nullable":true,"type":"array"},"flow_expires_at":{"description":"When the current flow expires (null when no flow in progress). A flow past this timestamp is no longer valid and its `flow_status` will be `EXPIRED`. Clients may start a new login to supersede a stale `IN_PROGRESS` flow past this timestamp.","example":"2025-11-05T20:00:00Z","format":"date-time","nullable":true,"type":"string"},"flow_status":{"description":"Current flow status (null when no flow in progress)","enum":["IN_PROGRESS","SUCCESS","FAILED","EXPIRED","CANCELED"],"example":"IN_PROGRESS","nullable":true,"type":"string"},"flow_step":{"description":"Current step in the flow (null when no flow in progress)","enum":["DISCOVERING","AWAITING_INPUT","AWAITING_EXTERNAL_ACTION","SUBMITTING","COMPLETED"],"example":"AWAITING_INPUT","nullable":true,"type":"string"},"flow_type":{"description":"Type of the current flow (null when no flow in progress)","enum":["LOGIN","REAUTH"],"example":"LOGIN","nullable":true,"type":"string"},"health_check_interval":{"description":"Interval in seconds between automatic health checks. When set, the system periodically\nverifies the authentication status and triggers re-authentication if needed.\nMaximum is 86400 (24 hours). Default is 3600 (1 hour) or your plan minimum, whichever\nis larger. The minimum depends on your plan: Enterprise: 300 (5 minutes), Startup: 1200\n(20 minutes), Hobbyist: 3600 (1 hour), Free: 21600 (6 hours).\n","example":3600,"maximum":86400,"minimum":300,"nullable":true,"type":"integer"},"health_checks":{"description":"Whether periodic health checks are enabled for this connection. When false, the system\nwill not automatically verify authentication status, and `auto_reauth` has no effect on\nthe automatic flow (since re-auth is only triggered by a failed scheduled health check).\nManually triggering a health check via the API still works regardless of this setting.\n","example":true,"type":"boolean"},"hosted_url":{"description":"URL to redirect user to for hosted login (present when flow in progress)","example":"https://auth.kernel.com/login/abc123xyz","format":"uri","nullable":true,"type":"string"},"id":{"description":"Unique identifier for the auth connection","example":"ma_abc123xyz","type":"string"},"last_auth_at":{"deprecated":true,"description":"Deprecated alias for `last_auth_check_at`. Despite the name, this is the last health-check timestamp, not the last successful authentication. Use `last_auth_check_at` instead.","example":"2025-01-15T10:30:00Z","format":"date-time","type":"string"},"last_auth_check_at":{"description":"When the most recent auth health check ran for this connection, regardless of outcome. Updated on every health check and does not by itself indicate that the profile is currently authenticated - use `status` for that. May be newer than `flow_expires_at` when a flow is still in progress because health checks continue to run in parallel.","example":"2025-01-15T10:30:00Z","format":"date-time","type":"string"},"live_view_url":{"description":"Browser live view URL for debugging (present when flow in progress)","example":"https://live.kernel.com/abc123xyz","format":"uri","nullable":true,"type":"string"},"login_url":{"description":"Optional login page URL to skip discovery","example":"https://example.com/login","format":"uri","type":"string"},"mfa_options":{"description":"MFA method options (present when flow_step=awaiting_input; may also be present with awaiting_external_action as fallback actions)","items":{"$ref":"#/components/schemas/MFAOption"},"nullable":true,"type":"array"},"pending_sso_buttons":{"description":"SSO buttons available (present when flow_step=awaiting_input; may also be present with awaiting_external_action as fallback actions)","items":{"$ref":"#/components/schemas/SSOButton"},"nullable":true,"type":"array"},"post_login_url":{"description":"URL where the browser landed after successful login","example":"https://www.netflix.com/browse","format":"uri","type":"string"},"profile_name":{"description":"Name of the profile associated with this auth connection","example":"my-netflix-profile","type":"string"},"proxy_id":{"deprecated":true,"description":"Deprecated. Read browser.proxy instead. Retained during migration for existing clients.","type":"string"},"record_session":{"description":"Whether to record browser session replays for this connection by default. Useful for debugging login flows. Can be overridden per-login.","example":false,"type":"boolean"},"save_credentials":{"description":"Whether credentials are saved after every successful login. One-time codes (TOTP, SMS, etc.) are not saved.","example":true,"type":"boolean"},"sign_in_options":{"description":"Non-MFA choices presented during the auth flow, such as account selection or org pickers (present when flow_step=awaiting_input; may also be present with awaiting_external_action as fallback actions).","items":{"$ref":"#/components/schemas/SignInOption"},"nullable":true,"type":"array"},"sso_provider":{"description":"SSO provider being used (e.g., google, github, microsoft)","example":"google","nullable":true,"type":"string"},"status":{"description":"Current authentication status of the managed profile","enum":["AUTHENTICATED","NEEDS_AUTH"],"example":"AUTHENTICATED","type":"string"},"website_error":{"description":"Visible error message from the website (e.g., 'Incorrect password'). Present when the website displays an error during login.","nullable":true,"type":"string"}},"required":["id","profile_name","domain","status","save_credentials","record_session"],"type":"object"},"ManagedAuthBrowserConfig":{"additionalProperties":false,"description":"Browser configuration applied to browser sessions created for a managed auth connection. Managed auth controls the profile, headless mode, timeout, start URL, kiosk mode, and viewport.","properties":{"proxy":{"$ref":"#/components/schemas/BrowserProxyConfig","description":"Proxy configuration for managed auth browser sessions. Omit on create to derive the default from stealth, or on update and login to preserve or inherit the connection default."},"stealth":{"description":"Whether managed auth browser sessions use stealth mode. Defaults to true when omitted.","example":false,"type":"boolean"},"telemetry":{"$ref":"#/components/schemas/BrowserTelemetryRequestConfig","description":"Browser telemetry configuration using the same semantics as browser create.","nullable":true}},"type":"object"},"ManagedAuthChoice":{"additionalProperties":false,"description":"Canonical auth-flow choice awaiting user selection.","properties":{"description":{"description":"Additional context for the choice.","nullable":true,"type":"string"},"id":{"description":"Stable choice identifier for canonical submit.","example":"google","type":"string"},"label":{"description":"Human-readable choice label.","example":"Google","type":"string"},"observed_selector":{"description":"Selector for the visible choice, when available.","example":"button:has-text(\"Google\")","nullable":true,"type":"string"},"type":{"description":"Choice type.","enum":["mfa_method","sso_provider","sign_in_method","auth_method","identifier_method","account","other"],"example":"sso_provider","type":"string"}},"required":["id","type","label"],"type":"object"},"ManagedAuthCreateRequest":{"additionalProperties":false,"description":"Request to create an auth connection for a profile and domain","properties":{"allowed_domains":{"description":"Additional domains valid for this auth flow (besides the primary domain). Useful when login pages redirect to different domains.\n\nThe following SSO/OAuth provider domains are automatically allowed by default and do not need to be specified:\n- Google: accounts.google.com\n- Microsoft/Azure AD: login.microsoftonline.com, login.live.com\n- Okta: *.okta.com, *.oktapreview.com\n- Auth0: *.auth0.com, *.us.auth0.com, *.eu.auth0.com, *.au.auth0.com\n- Apple: appleid.apple.com\n- GitHub: github.com\n- Facebook/Meta: www.facebook.com\n- LinkedIn: www.linkedin.com\n- Amazon Cognito: *.amazoncognito.com\n- OneLogin: *.onelogin.com\n- Ping Identity: *.pingone.com, *.pingidentity.com\n","example":["login.netflix.com","auth.netflix.com"],"items":{"type":"string"},"type":"array"},"auto_reauth":{"default":true,"description":"Whether to permit automatic re-authentication when a scheduled health check detects an\nexpired session. This is an opt-in flag only — it does not check whether re-auth is\nactually feasible. Even when true, re-auth only runs when the system has what it needs\nto perform it (for example, saved credentials for the required login fields), and only\nafter a scheduled health check detects an expired session — so this flag has no effect\nwhen `health_checks` is false. When false, expired sessions are marked as `NEEDS_AUTH`\ninstead of attempting re-auth. Defaults to true.\n","example":true,"type":"boolean"},"browser":{"$ref":"#/components/schemas/ManagedAuthBrowserConfig","description":"Default browser configuration for login, reauthentication, and health-check sessions."},"browser_telemetry":{"$ref":"#/components/schemas/BrowserTelemetryRequestConfig","deprecated":true,"description":"Deprecated. Use browser.telemetry. Retained during migration for existing clients.","nullable":true},"credential":{"$ref":"#/components/schemas/CredentialReference"},"domain":{"description":"Domain for authentication","example":"netflix.com","type":"string"},"health_check_interval":{"description":"Interval in seconds between automatic health checks. When set, the system periodically\nverifies the authentication status and triggers re-authentication if needed.\nMaximum is 86400 (24 hours). Default is 3600 (1 hour) or your plan minimum, whichever\nis larger. The minimum depends on your plan: Enterprise: 300 (5 minutes), Startup: 1200\n(20 minutes), Hobbyist: 3600 (1 hour), Free: 21600 (6 hours).\n","example":3600,"maximum":86400,"minimum":300,"type":"integer"},"health_checks":{"default":true,"description":"Whether to enable periodic health checks. When false, the system will not automatically\nverify authentication status, and `auto_reauth` has no effect on the automatic flow\n(since re-auth is only triggered by a failed scheduled health check). Defaults to true.\n","example":true,"type":"boolean"},"login_url":{"description":"Optional login page URL to skip discovery","example":"https://netflix.com/login","format":"uri","type":"string"},"profile_name":{"description":"Name of the profile to manage authentication for. If the profile does not exist, it is created automatically.","example":"user-123","type":"string"},"proxy":{"$ref":"#/components/schemas/ProxyRef","deprecated":true,"description":"Deprecated. Use browser.proxy. Retained during migration for existing clients."},"record_session":{"default":false,"description":"Whether to record browser sessions for this connection by default. Useful for debugging. Can be overridden per-login. Defaults to false.","example":false,"type":"boolean"},"save_credentials":{"default":true,"description":"Whether to save credentials after every successful login. Defaults to true. One-time codes (TOTP, SMS, etc.) are not saved.","example":true,"type":"boolean"}},"required":["domain","profile_name"],"type":"object"},"ManagedAuthError":{"description":"Extended error response for managed auth operations with recovery context","properties":{"code":{"description":"Machine-readable error code for programmatic handling","enum":["login_form_not_found","navigation_confused","domain_not_allowed","stuck_in_loop","max_attempts_reached","website_error","network_error","element_not_found","credentials_invalid","mfa_required","external_action_required","unsupported_auth_method","bot_detected","captcha_blocked","session_expired","no_active_flow","flow_failed","awaiting_input_timeout","external_action_timeout","max_steps_exceeded","browser_error","internal_error"],"example":"login_form_not_found","type":"string"},"details":{"description":"Additional technical details for debugging (not shown to end users)","example":"Searched for login forms at https://example.com/login, found 0 form elements","type":"string"},"doc_url":{"description":"Link to documentation about this error","example":"https://docs.onkernel.com/errors/login_form_not_found","format":"uri","type":"string"},"message":{"description":"Human-readable error message suitable for display","example":"We couldn't find a login form on this page. The website may have changed its layout, or the login URL might be incorrect.","type":"string"},"recoverable":{"description":"Whether the user can retry or take action to resolve this error","example":true,"type":"boolean"}},"required":["code","message"],"type":"object"},"ManagedAuthEvent":{"description":"Union type representing any managed auth event.","discriminator":{"mapping":{"error":"#/components/schemas/ErrorEvent","managed_auth_state":"#/components/schemas/ManagedAuthStateEvent","sse_heartbeat":"#/components/schemas/SSEHeartbeatEvent"},"propertyName":"event"},"oneOf":[{"$ref":"#/components/schemas/ManagedAuthStateEvent"},{"$ref":"#/components/schemas/ErrorEvent"},{"$ref":"#/components/schemas/SSEHeartbeatEvent"}]},"ManagedAuthExchangeRequest":{"additionalProperties":false,"description":"Request to exchange handoff code for JWT","properties":{"code":{"description":"Handoff code from start endpoint","example":"abc123xyz","type":"string"}},"required":["code"],"type":"object"},"ManagedAuthExchangeResponse":{"additionalProperties":false,"description":"Response from exchange endpoint","properties":{"invocation_id":{"description":"Invocation ID","example":"abc123xyz","type":"string"},"jwt":{"description":"JWT token with invocation_id claim (30 minute TTL)","example":"eyJ0eXAi...","type":"string"}},"required":["invocation_id","jwt"],"type":"object"},"ManagedAuthField":{"additionalProperties":false,"description":"Canonical field awaiting user input.","properties":{"id":{"description":"Stable field identifier for canonical submit.","example":"field_email","type":"string"},"label":{"description":"Human-readable label shown to the user.","example":"Email address","type":"string"},"observed_selector":{"description":"Selector for the visible field, when available.","example":"input[name=\"identifier\"]","nullable":true,"type":"string"},"ref":{"description":"Credential reference name to store the submitted value under.","example":"email","type":"string"},"replace_existing":{"default":false,"description":"Whether the submitted value must replace an existing credential after explicit rejection.","type":"boolean"},"required":{"default":true,"description":"Whether this field is required.","type":"boolean"},"type":{"description":"Managed-auth field type.","enum":["identifier","password","code","totp_code","totp_secret","text"],"example":"identifier","type":"string"}},"required":["id","ref","type"],"type":"object"},"ManagedAuthStateEvent":{"description":"An event representing the current state of a managed auth flow.","properties":{"choices":{"description":"Canonical choices awaiting selection. Prefer this over pending_sso_buttons, mfa_options, and sign_in_options when present.","items":{"$ref":"#/components/schemas/ManagedAuthChoice"},"type":"array"},"discovered_fields":{"description":"Fields awaiting input (present when flow_step=AWAITING_INPUT; may also be present with AWAITING_EXTERNAL_ACTION as fallback actions).","items":{"$ref":"#/components/schemas/DiscoveredField"},"type":"array"},"error_code":{"description":"Machine-readable error code (present when flow_status=FAILED).","type":"string"},"error_message":{"description":"Error message (present when flow_status=FAILED).","type":"string"},"event":{"const":"managed_auth_state","description":"Event type identifier (always \"managed_auth_state\").","type":"string"},"external_action_message":{"description":"Instructions for external action (present when flow_step=AWAITING_EXTERNAL_ACTION).","type":"string"},"fields":{"description":"Canonical fields awaiting input. Prefer this over discovered_fields when present.","items":{"$ref":"#/components/schemas/ManagedAuthField"},"type":"array"},"flow_status":{"description":"Current flow status.","enum":["IN_PROGRESS","SUCCESS","FAILED","EXPIRED","CANCELED"],"type":"string"},"flow_step":{"description":"Current step in the flow.","enum":["DISCOVERING","AWAITING_INPUT","AWAITING_EXTERNAL_ACTION","SUBMITTING","COMPLETED"],"type":"string"},"flow_type":{"description":"Type of the current flow.","enum":["LOGIN","REAUTH"],"type":"string"},"hosted_url":{"description":"URL to redirect user to for hosted login.","format":"uri","type":"string"},"live_view_url":{"description":"Browser live view URL for debugging.","format":"uri","type":"string"},"mfa_options":{"description":"MFA method options (present when flow_step=AWAITING_INPUT; may also be present with AWAITING_EXTERNAL_ACTION as fallback actions).","items":{"$ref":"#/components/schemas/MFAOption"},"type":"array"},"pending_sso_buttons":{"description":"SSO buttons available (present when flow_step=AWAITING_INPUT; may also be present with AWAITING_EXTERNAL_ACTION as fallback actions).","items":{"$ref":"#/components/schemas/SSOButton"},"type":"array"},"post_login_url":{"description":"URL where the browser landed after successful login.","format":"uri","type":"string"},"sign_in_options":{"description":"Non-MFA choices presented during the auth flow, such as account selection or org pickers (present when flow_step=AWAITING_INPUT; may also be present with AWAITING_EXTERNAL_ACTION as fallback actions).","items":{"$ref":"#/components/schemas/SignInOption"},"type":"array"},"timestamp":{"description":"Time the state was reported.","format":"date-time","type":"string"},"website_error":{"description":"Visible error message from the website (e.g., 'Incorrect password'). Present when the website displays an error during login.","type":"string"}},"required":["event","timestamp","flow_status","flow_step"],"type":"object"},"ManagedAuthTimelineEvent":{"description":"A single event in an auth connection's history — a login attempt, an automatic re-auth attempt, or a health check.","properties":{"browser_session_id":{"description":"Browser session that produced the event, if one was created.","type":"string"},"error_code":{"description":"Machine-readable error code. Present when a login/reauth event failed.","type":"string"},"error_message":{"description":"Human-readable error message. Present when a login/reauth event failed.","type":"string"},"id":{"description":"Identifier of the underlying login/reauth session or health check.","type":"string"},"previous_status":{"description":"The session state observed before this event. Present for health_check events that recorded a prior state.","enum":["AUTHENTICATED","NEEDS_AUTH"],"type":"string"},"replay_id":{"description":"Replay recording ID for the event's browser session, if session recording was enabled.","type":"string"},"status":{"description":"Outcome of the event. For login/reauth events this is the flow status\n(IN_PROGRESS, SUCCESS, EXPIRED, CANCELED, FAILED). For health_check events\nit is the observed session state (AUTHENTICATED, NEEDS_AUTH).\n","enum":["IN_PROGRESS","SUCCESS","EXPIRED","CANCELED","FAILED","AUTHENTICATED","NEEDS_AUTH"],"type":"string"},"step":{"description":"The step the flow reached. Present for login/reauth events.","enum":["INITIALIZED","DISCOVERING","AWAITING_INPUT","AWAITING_EXTERNAL_ACTION","AWAITING_HUMAN_INTERVENTION","SUBMITTING","COMPLETED","EXPIRED"],"type":"string"},"telemetry_captured":{"description":"Whether browser telemetry capture started for this event's browser session.","type":"boolean"},"timestamp":{"description":"When the event occurred.","format":"date-time","type":"string"},"type":{"description":"The kind of event. \"login\" and \"reauth\" are authentication attempts; \"health_check\" is a periodic session-validity check.","enum":["login","reauth","health_check"],"type":"string"},"updated_at":{"description":"When the event was last updated. Present for login/reauth events.","format":"date-time","type":"string"},"website_error":{"description":"Visible error message from the website (e.g., 'Incorrect password'). Present when the website displayed an error during the attempt.","type":"string"}},"required":["type","id","timestamp","status"],"type":"object"},"ManagedAuthUpdateRequest":{"additionalProperties":false,"description":"Request to update an auth connection's configuration","properties":{"allowed_domains":{"description":"Additional domains valid for this auth flow (replaces existing list)","example":["login.netflix.com","auth.netflix.com"],"items":{"type":"string"},"type":"array"},"auto_reauth":{"description":"Whether automatic re-authentication is permitted for this connection. This is an opt-in\nflag only — it does not check whether re-auth is actually feasible. Even when true,\nre-auth only runs when the system has what it needs to perform it (for example, saved\ncredentials for the required login fields), and only after a scheduled health check\ndetects an expired session — so this flag has no effect when `health_checks` is false.\nWhen false, expired sessions detected by a health check are marked as `NEEDS_AUTH`\ninstead of attempting re-auth.\n","example":true,"type":"boolean"},"browser":{"$ref":"#/components/schemas/ManagedAuthBrowserConfig","description":"Browser configuration updates for future login, reauthentication, and health-check sessions. Omitted properties remain unchanged."},"browser_telemetry":{"$ref":"#/components/schemas/BrowserTelemetryRequestConfig","deprecated":true,"description":"Deprecated. Use browser.telemetry. Retained during migration for existing clients.","nullable":true},"credential":{"$ref":"#/components/schemas/CredentialReference"},"health_check_interval":{"description":"Interval in seconds between automatic health checks","example":3600,"maximum":86400,"minimum":300,"type":"integer"},"health_checks":{"description":"Whether periodic health checks are enabled. When set to false, the system will not\nautomatically verify authentication status, and `auto_reauth` has no effect on the\nautomatic flow (since re-auth is only triggered by a failed scheduled health check).\n","example":true,"type":"boolean"},"login_url":{"description":"Login page URL. Set to empty string to clear.","example":"https://netflix.com/login","format":"uri","type":"string"},"proxy":{"$ref":"#/components/schemas/ProxyRef","deprecated":true,"description":"Deprecated. Use browser.proxy. Retained during migration for existing clients."},"record_session":{"description":"Whether to record browser sessions for this connection by default","example":false,"type":"boolean"},"save_credentials":{"description":"Whether to save credentials after every successful login","example":true,"type":"boolean"}},"type":"object"},"MobileProxyConfig":{"description":"Configuration for mobile proxies.","properties":{"city":{"description":"Provider city alias. Mobile carrier routing can make observed geo vary.","example":"brooklyn","type":"string"},"country":{"description":"ISO 3166 country code","example":"US","type":"string"},"state":{"description":"US-only state code. Mobile carrier routing can make observed geo vary.","example":"NY","type":"string"}},"title":"Mobile","type":"object"},"MousePositionResponse":{"additionalProperties":false,"properties":{"true":{"description":"Y coordinate of the cursor","type":"integer"},"x":{"description":"X coordinate of the cursor","type":"integer"}},"required":["x",true],"type":"object"},"MoveMouseRequest":{"additionalProperties":false,"properties":{"duration_ms":{"description":"Target total duration in milliseconds for the mouse movement when smooth=true. Omit for automatic timing based on distance.","maximum":5000,"minimum":50,"type":"integer"},"hold_keys":{"description":"Modifier keys to hold during the move","items":{"type":"string"},"type":"array"},"smooth":{"default":true,"description":"Use human-like Bezier curve path instead of instant mouse movement.","type":"boolean"},"true":{"description":"Y coordinate to move the cursor to","type":"integer"},"x":{"description":"X coordinate to move the cursor to","type":"integer"}},"required":["x",true],"type":"object"},"MovePathRequest":{"additionalProperties":false,"properties":{"dest_path":{"description":"Absolute destination path.","pattern":"^/.*","type":"string"},"src_path":{"description":"Absolute source path.","pattern":"^/.*","type":"string"}},"required":["src_path","dest_path"],"type":"object"},"OTLPDestinationRef":{"description":"OTLP destination selection. Provide either id or name. The destination must belong to the caller's org.\nWhen selecting by name, the name must match exactly one destination in the org. Ambiguous names return a 400; use id for stable references.\n","oneOf":[{"required":["id"]},{"required":["name"]}],"properties":{"id":{"description":"OTLP destination ID","type":"string"},"name":{"description":"OTLP destination name","type":"string"}},"type":"object"},"OkResponse":{"additionalProperties":false,"description":"Generic OK response.","properties":{"ok":{"default":true,"description":"Indicates success.","type":"boolean"}},"required":["ok"],"type":"object"},"OrgLimits":{"properties":{"auth_connections_used":{"description":"The organization's current non-deleted managed auth connections, counted org-wide across every project. Compare against max_auth_connections to show remaining capacity before a create is rejected with 403 insufficient_plan.","example":2,"type":"integer"},"default_project_max_concurrent_sessions":{"description":"Default maximum concurrent browsers applied to every project that has no explicit per-project override. Null means no org-level default, so such projects are uncapped (only the org-wide limit applies). Applies to existing and newly created projects.","example":10,"nullable":true,"type":"integer"},"max_auth_connections":{"description":"Maximum managed auth connections the organization's plan allows. Null means unlimited. Counted org-wide, so it cannot be multiplied across projects.","example":3,"nullable":true,"type":"integer"},"max_concurrent_sessions":{"description":"The organization's effective concurrency limit — the maximum browsers running at once, covering both on-demand sessions and browser pool reservations — from its plan or an override. Read-only and shared across all projects in the org; a per-project default cannot exceed it.","example":500,"type":"integer"},"min_health_check_interval_seconds":{"description":"Smallest health_check_interval the organization's plan accepts on a managed auth connection. Requests below this are rejected with 400. Existing connections stored below the floor are grandfathered until edited.","example":21600,"type":"integer"}},"required":["max_auth_connections","auth_connections_used","min_health_check_interval_seconds"],"type":"object"},"PressKeyRequest":{"additionalProperties":false,"properties":{"duration":{"default":0,"description":"Duration to hold the keys down in milliseconds. If omitted or 0, keys are tapped.","minimum":0,"type":"integer"},"hold_keys":{"description":"Optional modifier keys to hold during the key press sequence.","items":{"type":"string"},"type":"array"},"keys":{"description":"List of key symbols to press. Each item should be a key symbol supported by xdotool\n(see X11 keysym definitions). Examples include \"Return\", \"Shift\", \"Ctrl\", \"Alt\", \"F5\".\nItems in this list could also be combinations, e.g. \"Ctrl+t\" or \"Ctrl+Shift+Tab\".\n","items":{"type":"string"},"type":"array"}},"required":["keys"],"type":"object"},"ProcessExecRequest":{"additionalProperties":false,"description":"Request to execute a command synchronously.","properties":{"args":{"default":[],"description":"Command arguments.","items":{"type":"string"},"type":"array"},"as_root":{"default":false,"description":"Run the process with root privileges.","type":"boolean"},"as_user":{"description":"Run the process as this user.","nullable":true,"type":"string"},"command":{"description":"Executable or shell command to run.","type":"string"},"cwd":{"description":"Working directory (absolute path) to run the command in.","nullable":true,"pattern":"^/.*","type":"string"},"env":{"additionalProperties":{"type":"string"},"default":{},"description":"Environment variables to set for the process.","type":"object"},"timeout_sec":{"description":"Maximum execution time in seconds.","nullable":true,"type":"integer"}},"required":["command"],"type":"object"},"ProcessExecResult":{"additionalProperties":false,"description":"Result of a synchronous command execution.","properties":{"duration_ms":{"description":"Execution duration in milliseconds.","type":"integer"},"exit_code":{"description":"Process exit code.","type":"integer"},"stderr_b64":{"description":"Base64-encoded stderr buffer.","type":"string"},"stdout_b64":{"description":"Base64-encoded stdout buffer.","type":"string"}},"type":"object"},"ProcessKillRequest":{"additionalProperties":false,"description":"Signal to send to the process.","properties":{"signal":{"default":"TERM","description":"Signal to send.","enum":["TERM","KILL","INT","HUP"],"type":"string"}},"required":["signal"],"type":"object"},"ProcessResizeRequest":{"additionalProperties":false,"description":"Resize a PTY-backed process terminal.","properties":{"cols":{"description":"New terminal columns.","maximum":65535,"minimum":1,"type":"integer"},"rows":{"description":"New terminal rows.","maximum":65535,"minimum":1,"type":"integer"}},"required":["rows","cols"],"type":"object"},"ProcessSpawnRequest":{"allOf":[{"$ref":"#/components/schemas/ProcessExecRequest"},{"properties":{"allocate_tty":{"default":false,"description":"Allocate a pseudo-terminal (PTY) for interactive shells.","type":"boolean"},"cols":{"description":"Initial terminal columns. Only used when allocate_tty is true.","maximum":65535,"minimum":1,"type":"integer"},"rows":{"description":"Initial terminal rows. Only used when allocate_tty is true.","maximum":65535,"minimum":1,"type":"integer"}},"type":"object"}]},"ProcessSpawnResult":{"additionalProperties":false,"description":"Information about a spawned process.","properties":{"pid":{"description":"OS process ID.","type":"integer"},"process_id":{"description":"Server-assigned identifier for the process.","format":"uuid","type":"string"},"started_at":{"description":"Timestamp when the process started.","format":"date-time","type":"string"}},"type":"object"},"ProcessStatus":{"additionalProperties":false,"description":"Current status of a process.","properties":{"cpu_pct":{"description":"Estimated CPU usage percentage.","type":"number"},"exit_code":{"description":"Exit code if the process has exited.","nullable":true,"type":"integer"},"mem_bytes":{"description":"Estimated resident memory usage in bytes.","type":"integer"},"state":{"description":"Process state.","enum":["running","exited"],"type":"string"}},"type":"object"},"ProcessStdinRequest":{"additionalProperties":false,"description":"Data to write to the process standard input.","properties":{"data_b64":{"description":"Base64-encoded data to write.","type":"string"}},"required":["data_b64"],"type":"object"},"ProcessStdinResult":{"additionalProperties":false,"description":"Result of writing to stdin.","properties":{"written_bytes":{"description":"Number of bytes written.","type":"integer"}},"type":"object"},"ProcessStreamEvent":{"additionalProperties":false,"description":"SSE payload representing process output or lifecycle events.","properties":{"data_b64":{"description":"Base64-encoded data from the process stream.","type":"string"},"event":{"description":"Lifecycle event type.","enum":["exit"],"type":"string"},"exit_code":{"description":"Exit code when the event is \"exit\".","type":"integer"},"stream":{"description":"Source stream of the data chunk.","enum":["stdout","stderr"],"type":"string"}},"type":"object"},"Profile":{"description":"Browser profile metadata.","properties":{"created_at":{"description":"Timestamp when the profile was created","format":"date-time","type":"string"},"id":{"description":"Unique identifier for the profile","type":"string"},"last_used_at":{"description":"Timestamp when the profile was last used","format":"date-time","type":"string"},"name":{"description":"Optional, easier-to-reference name for the profile","nullable":true,"type":"string"},"updated_at":{"description":"Timestamp when the profile was last updated","format":"date-time","type":"string"}},"required":["id","created_at"],"type":"object"},"ProfileRequest":{"description":"Request body for creating a profile.","properties":{"name":{"description":"Optional name of the profile. Must be unique within the logical project; during the default-project migration, unscoped profiles and profiles in the org default project are treated as the same project.","type":"string"}},"required":[],"type":"object"},"ProfileUpdateRequest":{"properties":{"name":{"description":"New profile name. Must be unique within the logical project; during the default-project migration, unscoped profiles and profiles in the org default project are treated as the same project.","example":"my-renamed-profile","maxLength":255,"minLength":1,"type":"string"}},"required":["name"],"type":"object"},"Project":{"properties":{"created_at":{"description":"When the project was created","format":"date-time","type":"string"},"id":{"description":"Unique project identifier","example":"proj_abc123","type":"string"},"name":{"description":"Project name","example":"production","type":"string"},"status":{"description":"Project status","enum":["active","archived"],"example":"active","type":"string"},"updated_at":{"description":"When the project was last updated","format":"date-time","type":"string"}},"required":["id","name","status","created_at","updated_at"],"type":"object"},"ProjectLimits":{"properties":{"max_concurrent_invocations":{"description":"Maximum concurrent app invocations for this project. Null means no project-level cap.","example":20,"nullable":true,"type":"integer"},"max_concurrent_sessions":{"description":"Maximum concurrent browsers for this project, covering both on-demand sessions (`browsers.create()`) and browser pool reservations. Null means no project-level cap.","example":10,"nullable":true,"type":"integer"},"max_pooled_sessions":{"deprecated":true,"description":"Deprecated: pooled browsers now count toward `max_concurrent_sessions`. Always null.","example":50,"nullable":true,"type":"integer"}},"type":"object"},"Proxy":{"description":"Configuration for routing traffic through a proxy.","discriminator":{"mapping":{"custom":"#/components/schemas/CustomProxyConfig","datacenter":"#/components/schemas/DatacenterProxyConfig","isp":"#/components/schemas/IspProxyConfig","mobile":"#/components/schemas/MobileProxyConfig","residential":"#/components/schemas/ResidentialProxyConfig"},"propertyName":"type"},"properties":{"bypass_hosts":{"description":"Hostnames that should bypass the parent proxy and connect directly.","items":{"type":"string"},"type":"array"},"config":{"description":"Configuration specific to the selected proxy `type`.","oneOf":[{"$ref":"#/components/schemas/DatacenterProxyConfig"},{"$ref":"#/components/schemas/IspProxyConfig"},{"$ref":"#/components/schemas/ResidentialProxyConfig"},{"$ref":"#/components/schemas/MobileProxyConfig"},{"$ref":"#/components/schemas/CustomProxyConfig"}]},"id":{"type":"string"},"ip_address":{"description":"IP address that the proxy uses when making requests.","example":"192.168.1.1","type":"string"},"last_checked":{"description":"Timestamp of the last health check performed on this proxy.","format":"date-time","type":"string"},"name":{"description":"Readable name of the proxy.","type":"string"},"protocol":{"default":"https","description":"Protocol to use for the proxy connection.","enum":["http","https"],"type":"string"},"status":{"description":"Current health status of the proxy.","enum":["available","unavailable"],"type":"string"},"type":{"description":"Proxy type to use. In terms of quality for avoiding bot-detection, from best to worst: `mobile` \u003e `residential` \u003e `isp` \u003e `datacenter`.\n","enum":["datacenter","isp","residential","mobile","custom"],"type":"string"}},"required":["type"],"type":"object"},"ProxyCheckRequest":{"description":"Optional parameters for the proxy health check.","properties":{"url":{"description":"An optional URL to test reachability against. If provided, the proxy check will test connectivity to this URL instead of the default test URLs. Only HTTP and HTTPS schemes are allowed, and the URL must resolve to a public IP address. For ISP and datacenter proxies, the exit IP is stable, so a successful check reliably indicates that subsequent browser sessions will reach the target site with the same IP. For residential and mobile proxies, the exit node changes between requests, so a successful check validates proxy configuration but does not guarantee that a subsequent browser session will use the same exit IP or reach the same site — it is useful for verifying credentials and connectivity, not for predicting site-specific behavior. When provided, the check result does not update the proxy's health status, since a failure may indicate a problem with the target site rather than the proxy itself.","example":"https://example.com","type":"string"}},"type":"object"},"ProxyCreateRequest":{"description":"Configuration for routing traffic through a proxy.","discriminator":{"mapping":{"custom":"#/components/schemas/CustomProxyConfig","datacenter":"#/components/schemas/DatacenterProxyConfig","isp":"#/components/schemas/IspProxyConfig","mobile":"#/components/schemas/MobileProxyConfig","residential":"#/components/schemas/ResidentialProxyConfig"},"propertyName":"type"},"properties":{"bypass_hosts":{"description":"Hostnames that should bypass the parent proxy and connect directly.","items":{"type":"string"},"type":"array"},"config":{"description":"Configuration specific to the selected proxy `type`.","oneOf":[{"$ref":"#/components/schemas/DatacenterProxyConfig"},{"$ref":"#/components/schemas/IspProxyConfig"},{"$ref":"#/components/schemas/ResidentialProxyConfig"},{"$ref":"#/components/schemas/MobileProxyConfig"},{"$ref":"#/components/schemas/CreateCustomProxyConfig"}]},"name":{"description":"Readable name of the proxy.","type":"string"},"protocol":{"default":"https","description":"Protocol to use for the proxy connection.","enum":["http","https"],"type":"string"},"type":{"description":"Proxy type to use. In terms of quality for avoiding bot-detection, from best to worst: `mobile` \u003e `residential` \u003e `isp` \u003e `datacenter`.\n","enum":["datacenter","isp","residential","mobile","custom"],"type":"string"}},"required":["type"],"type":"object"},"ProxyRef":{"description":"Proxy selection. Provide either id or name. The proxy must be in the same project as the resource referencing it.\nWhen selecting by name, the name must match exactly one active proxy in the project. Ambiguous names return a 400; use id for stable references.\n","oneOf":[{"required":["id"]},{"required":["name"]}],"properties":{"id":{"description":"Proxy ID","type":"string"},"name":{"description":"Proxy name","type":"string"}},"type":"object"},"ProxyUpdateRequest":{"properties":{"name":{"description":"New proxy name. Proxy names are trimmed and length-checked only; duplicates are allowed because proxies are updated by ID, not by name.","example":"my-renamed-proxy","maxLength":255,"minLength":1,"type":"string"}},"required":["name"],"type":"object"},"Region":{"description":"Geographic region for hosting browser sessions or pools.\n","enum":["us-east","eu-west"],"type":"string"},"ResidentialProxyConfig":{"description":"Configuration for residential proxies.","properties":{"asn":{"description":"Autonomous system number. See https://bgp.potaroo.net/cidr/autnums.html","example":"AS15169","type":"string"},"city":{"description":"City name (no spaces, e.g. `sanfrancisco`). If provided, `country` must also be provided.","example":"sanfrancisco","type":"string"},"country":{"description":"ISO 3166 country code.","example":"US","type":"string"},"os":{"deprecated":true,"description":"Operating system of the residential device.","enum":["windows","macos","android"],"type":"string","x-deprecated-reason":"os selection not supported by proxy provider"},"state":{"description":"Two-letter state code.","example":"CA","type":"string"},"zip":{"description":"US ZIP code.","example":"94107","type":"string"}},"title":"Residential","type":"object"},"RotateApiKeyRequest":{"properties":{"days_to_expire":{"description":"Lifetime in days for the new key, up to 3650. Omit to reuse the rotated key's original lifetime, or never-expires if it had none.","example":30,"maximum":3650,"minimum":1,"nullable":true,"type":"integer"},"expire_in_days":{"description":"Grace period in days before the rotated key expires. Use 0 to expire it immediately. Omit for the default grace period of 7 days.","example":7,"maximum":3650,"minimum":0,"nullable":true,"type":"integer"}},"type":"object"},"SSEHeartbeatEvent":{"description":"Heartbeat event sent periodically to keep SSE connection alive.","properties":{"event":{"const":"sse_heartbeat","description":"Event type identifier (always \"sse_heartbeat\").","type":"string"},"timestamp":{"description":"Time the heartbeat was sent.","format":"date-time","type":"string"}},"required":["event","timestamp"],"type":"object"},"SSOButton":{"additionalProperties":false,"description":"An SSO button for signing in with an external identity provider","properties":{"label":{"description":"Visible button text","example":"Continue with Google","type":"string"},"provider":{"description":"Identity provider name","example":"google","type":"string"},"selector":{"description":"XPath selector for the button","example":"xpath=//button[contains(text(), 'Continue with Google')]","type":"string"}},"required":["selector","provider","label"],"type":"object"},"ScreenshotRegion":{"additionalProperties":false,"properties":{"height":{"description":"Height of the region in pixels","type":"integer"},"true":{"description":"Y coordinate of the region's top-left corner","type":"integer"},"width":{"description":"Width of the region in pixels","type":"integer"},"x":{"description":"X coordinate of the region's top-left corner","type":"integer"}},"required":["x",true,"width","height"],"type":"object"},"ScreenshotRequest":{"additionalProperties":false,"properties":{"region":{"$ref":"#/components/schemas/ScreenshotRegion"}},"type":"object"},"ScrollRequest":{"additionalProperties":false,"properties":{"delta_x":{"default":0,"description":"Horizontal scroll amount in xdotool \"wheel units.\" Positive scrolls right, negative scrolls left.","type":"integer"},"delta_y":{"default":0,"description":"Vertical scroll amount in xdotool \"wheel units.\" Positive scrolls down, negative scrolls up.","type":"integer"},"hold_keys":{"description":"Modifier keys to hold during the scroll","items":{"type":"string"},"type":"array"},"true":{"description":"Y coordinate at which to perform the scroll","type":"integer"},"x":{"description":"X coordinate at which to perform the scroll","type":"integer"}},"required":["x",true],"type":"object"},"SetCursorRequest":{"additionalProperties":false,"properties":{"hidden":{"description":"Whether the cursor should be hidden or visible","type":"boolean"}},"required":["hidden"],"type":"object"},"SetFilePermissionsRequest":{"additionalProperties":false,"properties":{"group":{"description":"New group name or GID.","type":"string"},"mode":{"description":"File mode bits (octal string, e.g. 644).","pattern":"^[0-7]{3,4}$","type":"string"},"owner":{"description":"New owner username or UID.","type":"string"},"path":{"description":"Absolute path whose permissions are to be changed.","pattern":"^/.*","type":"string"}},"required":["path","mode"],"type":"object"},"SignInOption":{"additionalProperties":false,"description":"A non-MFA choice presented during the auth flow (e.g. account selection, org picker)","properties":{"description":{"description":"Additional context such as email address or org name","example":"user@company.com","nullable":true,"type":"string"},"id":{"description":"Unique identifier for this option (used to submit selection back)","example":"work-account","type":"string"},"label":{"description":"Display text for the option","example":"Work Account (user@company.com)","type":"string"}},"required":["id","label"],"type":"object"},"SleepAction":{"additionalProperties":false,"description":"Pause execution for a specified duration.","properties":{"duration_ms":{"description":"Duration to sleep in milliseconds.","maximum":30000,"minimum":0,"type":"integer"}},"required":["duration_ms"],"type":"object"},"StartFsWatchRequest":{"additionalProperties":false,"properties":{"path":{"description":"Directory to watch.","type":"string"},"recursive":{"default":false,"description":"Whether to watch recursively.","type":"boolean"}},"required":["path"],"type":"object"},"SubmitFieldsRequest":{"additionalProperties":false,"description":"Request to submit field values, click an SSO button, select an MFA method, or select a sign-in option. Prefer canonical selected_choice_id/field_values when the API returns fields/choices; legacy fields/sso_button_selector/sso_provider/mfa_option_id/sign_in_option_id remain supported during deprecation.","properties":{"field_values":{"additionalProperties":{"type":"string"},"description":"Canonical map of field ID to submitted value.","example":{"field_email":"user@example.com","field_password":"secret"},"type":"object"},"fields":{"additionalProperties":{"type":"string"},"description":"Map of field name to value","example":{"email":"user@example.com","password":"secret"},"type":"object"},"mfa_option_id":{"description":"The MFA method type to select (when mfa_options were returned)","example":"sms","type":"string"},"selected_choice_id":{"description":"Canonical choice ID selected by the user.","example":"google","type":"string"},"sign_in_option_id":{"description":"The sign-in option ID to select (when sign_in_options were returned)","example":"work-account","type":"string"},"sso_button_selector":{"description":"XPath selector for the SSO button to click (ODA). Use sso_provider instead for CUA.","example":"xpath=//button[contains(text(), 'Continue with Google')]","type":"string"},"sso_provider":{"description":"SSO provider to click, matching the provider field from pending_sso_buttons (e.g., \"google\", \"github\"). Cannot be used with sso_button_selector.","example":"google","type":"string"}},"type":"object"},"SubmitFieldsResponse":{"additionalProperties":false,"description":"Response from submitting field values","properties":{"accepted":{"description":"Whether the submission was accepted for processing","type":"boolean"}},"required":["accepted"],"type":"object"},"Tags":{"additionalProperties":{"maxLength":256,"minLength":0,"pattern":"^[A-Za-z0-9 _.:/=+@-]*$","type":"string"},"description":"User-defined key-value tags.","example":{"env":"staging","team":"backend"},"maxProperties":50,"propertyNames":{"maxLength":128,"minLength":1,"pattern":"^[A-Za-z0-9 _.:/=+@-]+$","type":"string"},"type":"object"},"TypeTextRequest":{"additionalProperties":false,"properties":{"delay":{"default":0,"description":"Delay in milliseconds between keystrokes","minimum":0,"type":"integer"},"text":{"description":"Text to type on the browser instance","type":"string"}},"required":["text"],"type":"object"},"UpdateApiKeyRequest":{"properties":{"name":{"description":"New API key name","example":"new-api-name","maxLength":255,"minLength":1,"type":"string"}},"required":["name"],"type":"object"},"UpdateAuditLogExportDestinationRequest":{"additionalProperties":false,"properties":{"bucket":{"maxLength":63,"minLength":3,"type":"string"},"kms_key_id":{"description":"KMS key ID, alias, or ARN. Set to an empty string to remove the configured KMS key; omit or send null to leave unchanged.","maxLength":2048,"type":"string"},"prefix":{"maxLength":512,"type":"string"},"region":{"maxLength":128,"minLength":1,"type":"string"},"role_arn":{"maxLength":2048,"minLength":1,"type":"string"},"status":{"enum":["active","paused"],"type":"string"}},"type":"object"},"UpdateCredentialProviderRequest":{"additionalProperties":false,"description":"Request to update a credential provider","properties":{"cache_ttl_seconds":{"description":"How long to cache credential lists","example":300,"type":"integer"},"enabled":{"description":"Whether the provider is enabled for credential lookups","example":true,"type":"boolean"},"name":{"description":"Human-readable name for this provider instance","example":"my-1password","type":"string"},"priority":{"description":"Priority order for credential lookups (lower numbers are checked first)","example":0,"type":"integer"},"token":{"description":"New service account token (to rotate credentials)","example":"ops_eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...","type":"string"}},"type":"object"},"UpdateCredentialRequest":{"additionalProperties":false,"description":"Request to update an existing credential","properties":{"name":{"description":"New name for the credential","example":"my-updated-login","type":"string"},"remove_value_keys":{"description":"Field names to remove from the credential's stored values. Removals are applied before `values` are merged, so a key present in both is kept with its new value.","example":["old_field"],"items":{"type":"string"},"type":"array"},"sso_provider":{"description":"If set, indicates this credential should be used with the specified SSO provider. Set to empty string or null to remove.","example":"google","nullable":true,"type":"string"},"totp_secret":{"description":"Base32-encoded TOTP secret for generating one-time passwords. Spaces and formatting are automatically normalized. Set to empty string to remove.","example":"JBSWY3DPEHPK3PXP","type":"string"},"values":{"additionalProperties":{"type":"string"},"description":"Field name to value mapping. Values are merged with existing values (new keys added, existing keys overwritten).","example":{"password":"newpassword","username":"user@example.com"},"type":"object"}},"type":"object"},"UpdateOrgLimitsRequest":{"properties":{"default_project_max_concurrent_sessions":{"description":"Default maximum concurrent browsers for projects without an explicit override. Set to 0 to remove the default; omit to leave unchanged. Cannot exceed the organization's concurrency limit.","nullable":true,"type":"integer"}},"type":"object"},"UpdateProjectLimitsRequest":{"properties":{"max_concurrent_invocations":{"description":"Maximum concurrent app invocations for this project. Set to 0 to remove the cap; omit to leave unchanged.","nullable":true,"type":"integer"},"max_concurrent_sessions":{"description":"Maximum concurrent browsers for this project, covering both on-demand sessions and browser pool reservations. Set to 0 to remove the cap; omit to leave unchanged.","nullable":true,"type":"integer"},"max_pooled_sessions":{"deprecated":true,"description":"Deprecated: pooled browsers now count toward `max_concurrent_sessions`. Requests that set this field are rejected with a 400.","nullable":true,"type":"integer"}},"type":"object"},"UpdateProjectRequest":{"properties":{"name":{"description":"New project name (1-255 Unicode code points; cannot contain `/` or `%`)","maxLength":255,"minLength":1,"type":"string"},"status":{"description":"New project status","enum":["active","archived"],"type":"string"}},"type":"object"},"WriteClipboardRequest":{"additionalProperties":false,"properties":{"text":{"description":"Text to write to the system clipboard","type":"string"}},"required":["text"],"type":"object"}},"securitySchemes":{"bearerAuth":{"scheme":"bearer","type":"http"}}},"info":{"description":"Developer tools and cloud infrastructure for AI agents to use web browsers","title":"Kernel API","version":"0.1.0"},"openapi":"3.1.0","paths":{"/apps":{"get":{"description":"List applications. Optionally filter by app name and/or version label.","operationId":"getApps","parameters":[{"description":"Filter results by application name.","in":"query","name":"app_name","required":false,"schema":{"type":"string"}},{"description":"Filter results by version label.","in":"query","name":"version","required":false,"schema":{"type":"string"}},{"description":"Limit the number of apps to return.","in":"query","name":"limit","required":false,"schema":{"default":20,"maximum":100,"minimum":1,"type":"integer"}},{"description":"Offset the number of apps to return.","in":"query","name":"offset","required":false,"schema":{"default":0,"minimum":0,"type":"integer"}},{"description":"Search apps by name.","in":"query","name":"query","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/AppVersionSummary"},"type":"array"}}},"description":"List of apps.","headers":{"X-Has-More":{"description":"Whether there are more apps to fetch.","schema":{"default":false,"type":"boolean"}},"X-Limit":{"description":"Limit the number of apps to return.","schema":{"default":20,"maximum":100,"minimum":1,"type":"integer"}},"X-Next-Offset":{"description":"The offset where the next page starts. 0 when there are no more results.","schema":{"nullable":true,"type":"integer"}},"X-Offset":{"description":"The offset of apps to return.","schema":{"default":0,"minimum":0,"type":"integer"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"List apps","tags":["Apps"]}},"/audit-logs":{"get":{"description":"API for searching audit logs. Limited to at most 30 day search, returns up to 100 records per page. Not recommended for bulk export.","operationId":"getAuditLogs","parameters":[{"description":"Lower bound (inclusive) for the audit record timestamp.","in":"query","name":"start","required":true,"schema":{"example":"2026-01-01T00:00:00Z","format":"date-time","type":"string"}},{"description":"Upper bound (exclusive) for the audit record timestamp.","in":"query","name":"end","required":true,"schema":{"example":"2026-01-02T00:00:00Z","format":"date-time","type":"string"}},{"description":"Filter by authentication strategy.","in":"query","name":"auth_strategy","required":false,"schema":{"type":"string"}},{"description":"Filter by service name.","in":"query","name":"service","required":false,"schema":{"type":"string"}},{"description":"Filter by HTTP method.","in":"query","name":"method","required":false,"schema":{"type":"string"}},{"description":"Filter out results by HTTP method.","explode":false,"in":"query","name":"exclude_method","required":false,"schema":{"items":{"type":"string"},"maxItems":10,"type":"array"},"style":"form"},{"description":"Free-text search over path, user ID, email, client IP, and status.","in":"query","name":"search","required":false,"schema":{"type":"string"}},{"description":"Additional user IDs to OR into free-text search.","explode":false,"in":"query","name":"search_user_id","required":false,"schema":{"items":{"type":"string"},"maxItems":100,"type":"array"},"style":"form"},{"description":"Maximum number of results to return.","in":"query","name":"limit","required":false,"schema":{"default":100,"maximum":100,"minimum":1,"type":"integer"}},{"description":"Opaque page token from X-Next-Page-Token for the next page of older records.","in":"query","name":"page_token","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/AuditLogEntry"},"type":"array"}}},"description":"A list of audit log records.","headers":{"X-Has-More":{"description":"Whether there are more records available beyond this page.","schema":{"default":false,"type":"boolean"}},"X-Limit":{"description":"The limit applied to the returned records.","schema":{"maximum":100,"minimum":1,"type":"integer"}},"X-Next-Page-Token":{"description":"Page token for the next page of older records, omitted when no more results.","schema":{"type":"string"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"List audit logs","tags":["Audit Logs"]}},"/audit-logs/export/chunk":{"get":{"description":"Download an organization's audit log records for a time range as a file, for archival, compliance, or offline analysis. For interactive browsing, use GET /audit-logs.","operationId":"getAuditLogsExportChunk","parameters":[{"description":"Lower bound (inclusive) for the audit record timestamp.","in":"query","name":"start","required":true,"schema":{"example":"2026-01-01T00:00:00Z","format":"date-time","type":"string"}},{"description":"Upper bound (exclusive) for the audit record timestamp.","in":"query","name":"end","required":true,"schema":{"example":"2026-01-02T00:00:00Z","format":"date-time","type":"string"}},{"description":"Filter by authentication strategy.","in":"query","name":"auth_strategy","required":false,"schema":{"type":"string"}},{"description":"Filter by service name.","in":"query","name":"service","required":false,"schema":{"type":"string"}},{"description":"Filter by HTTP method.","in":"query","name":"method","required":false,"schema":{"type":"string"}},{"description":"Filter out results by HTTP method.","explode":false,"in":"query","name":"exclude_method","required":false,"schema":{"items":{"type":"string"},"maxItems":10,"type":"array"},"style":"form"},{"description":"Free-text search over path, user ID, email, client IP, and status.","in":"query","name":"search","required":false,"schema":{"type":"string"}},{"description":"Additional user IDs to OR into free-text search.","explode":false,"in":"query","name":"search_user_id","required":false,"schema":{"items":{"type":"string"},"maxItems":100,"type":"array"},"style":"form"},{"description":"Opaque cursor from X-Next-Cursor for the next chunk of older records.","in":"query","name":"cursor","required":false,"schema":{"type":"string"}},{"description":"Maximum number of records to return in this chunk.","in":"query","name":"limit","required":false,"schema":{"default":50000,"maximum":50000,"minimum":1,"type":"integer"}},{"description":"Encoding for the returned chunk.","in":"query","name":"format","required":false,"schema":{"default":"jsonl.gz","enum":["jsonl","jsonl.gz"],"type":"string"}}],"responses":{"200":{"content":{"application/octet-stream":{"schema":{"format":"binary","type":"string"}}},"description":"One chunk of audit log records.","headers":{"X-Content-Sha256":{"description":"Hex SHA-256 of the response body.","schema":{"pattern":"^[a-f0-9]{64}$","type":"string"}},"X-Has-More":{"description":"Whether more records remain beyond this chunk.","schema":{"default":false,"type":"boolean"}},"X-Next-Cursor":{"description":"Cursor for the next chunk of older records, empty when no more results.","schema":{"type":"string"}},"X-Row-Count":{"description":"Number of records in this chunk.","schema":{"maximum":50000,"minimum":0,"type":"integer"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"Download an audit-log export chunk","tags":["Audit Logs"]}},"/audit-logs/export/destinations":{"get":{"description":"List audit log export destinations for the organization with pagination support.","operationId":"getAuditLogExportDestinations","parameters":[{"description":"Limit the number of destinations to return.","in":"query","name":"limit","required":false,"schema":{"default":20,"maximum":100,"minimum":1,"type":"integer"}},{"description":"Offset the number of destinations to return.","in":"query","name":"offset","required":false,"schema":{"default":0,"minimum":0,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/AuditLogExportDestination"},"type":"array"}}},"description":"Audit log export destinations for the organization","headers":{"X-Has-More":{"description":"Whether there are more destinations to fetch.","schema":{"default":false,"type":"boolean"}},"X-Limit":{"description":"Limit the number of destinations to return.","schema":{"default":20,"maximum":100,"minimum":1,"type":"integer"}},"X-Next-Offset":{"description":"The offset where the next page starts. 0 when there are no more results.","schema":{"nullable":true,"type":"integer"}},"X-Offset":{"description":"The offset of destinations to return.","schema":{"default":0,"minimum":0,"type":"integer"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"List audit log export destinations","tags":["Audit Logs"]},"post":{"description":"Create a paused destination. Activate it with a status update once the destination test passes. Requires an active Enterprise plan.","operationId":"postAuditLogExportDestinations","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateAuditLogExportDestinationRequest"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuditLogExportDestination"}}},"description":"Audit log export destination created"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"Create an audit log export destination","tags":["Audit Logs"]}},"/audit-logs/export/destinations/{id}":{"delete":{"description":"Soft delete the destination and prevent new delivery attempts. An S3 upload already in progress may complete after the response.","operationId":"deleteAuditLogExportDestinationsById","responses":{"204":{"description":"Audit log export destination deleted"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"Delete an audit log export destination","tags":["Audit Logs"]},"get":{"description":"Retrieve details for a single audit log export destination by its ID.","operationId":"getAuditLogExportDestinationsById","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuditLogExportDestination"}}},"description":"Audit log export destination"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"Retrieve an audit log export destination","tags":["Audit Logs"]},"parameters":[{"in":"path","name":"id","required":true,"schema":{"maxLength":128,"type":"string"}}],"patch":{"description":"Apply a partial update to a destination. Requires an active Enterprise plan. Returns 409 when the destination was changed concurrently, because the merged configuration this request validated is no longer the one that would be stored; retry against fresh state. Pausing prevents new delivery attempts, but an S3 upload already in progress may complete after the response.","operationId":"patchAuditLogExportDestinationsById","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateAuditLogExportDestinationRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuditLogExportDestination"}}},"description":"Audit log export destination updated"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"Update an audit log export destination","tags":["Audit Logs"]}},"/audit-logs/export/destinations/{id}/test":{"post":{"description":"Verify the destination is writable by assuming the configured role and uploading a temporary probe object with the same request metadata as a real delivery. Requires an active Enterprise plan.","operationId":"testAuditLogExportDestinationById","parameters":[{"in":"path","name":"id","required":true,"schema":{"maxLength":128,"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuditLogExportDestinationTestResult"}}},"description":"Audit log export destination test result"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"Test an audit log export destination","tags":["Audit Logs"]}},"/auth/connections":{"get":{"description":"List auth connections with optional filters for profile_name and domain.","operationId":"getAuthConnections","parameters":[{"description":"Filter by profile name","in":"query","name":"profile_name","required":false,"schema":{"type":"string"}},{"description":"Filter by domain","in":"query","name":"domain","required":false,"schema":{"type":"string"}},{"description":"Maximum number of results to return","in":"query","name":"limit","required":false,"schema":{"default":20,"maximum":100,"type":"integer"}},{"description":"Number of results to skip","in":"query","name":"offset","required":false,"schema":{"default":0,"type":"integer"}},{"description":"Search auth connections by ID, domain, or profile name.","in":"query","name":"query","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ManagedAuth"},"type":"array"}}},"description":"List of auth connections","headers":{"X-Has-More":{"description":"Whether there are more results","schema":{"type":"boolean"}},"X-Next-Offset":{"description":"The offset where the next page starts. 0 when there are no more results.","schema":{"type":"integer"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"List auth connections","tags":["Managed Auth"]},"post":{"description":"Creates an auth connection for a profile and domain combination. If the provided profile_name does not exist, it is created automatically. Returns 409 Conflict if an auth connection already exists for the given profile and domain.","operationId":"postAuthConnections","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ManagedAuthCreateRequest"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ManagedAuth"}}},"description":"Auth connection created"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"409":{"content":{"application/json":{"schema":{"properties":{"code":{"example":"already_exists","type":"string"},"existing_id":{"description":"ID of the existing auth connection","type":"string"},"message":{"example":"Auth connection already exists for this profile and domain","type":"string"}},"required":["code","message","existing_id"],"type":"object"}}},"description":"Auth connection already exists for this profile and domain"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"Create auth connection","tags":["Managed Auth"]}},"/auth/connections/{id}":{"delete":{"description":"Deletes an auth connection and terminates its workflow. This will:\n- Delete the auth connection record\n- Terminate the Temporal workflow\n- Cancel any in-progress login flows\n","operationId":"deleteAuthConnectionsById","parameters":[{"description":"Auth connection ID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"Auth connection deleted successfully"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"Delete auth connection","tags":["Managed Auth"]},"get":{"description":"Retrieve an auth connection by its ID. Includes current flow state if a login is in progress.","operationId":"getAuthConnectionsById","parameters":[{"description":"Auth connection ID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ManagedAuth"}}},"description":"Auth connection details"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"Get auth connection","tags":["Managed Auth"]},"patch":{"description":"Update an auth connection's configuration. Only the fields provided will be updated.","operationId":"patchAuthConnectionsById","parameters":[{"description":"Auth connection ID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ManagedAuthUpdateRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ManagedAuth"}}},"description":"Auth connection updated successfully"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"Update auth connection","tags":["Managed Auth"]}},"/auth/connections/{id}/events":{"get":{"description":"Establishes a Server-Sent Events (SSE) stream that delivers real-time\nlogin flow state updates. The stream terminates automatically once\nthe flow reaches a terminal state (SUCCESS, FAILED, EXPIRED, CANCELED).\n","operationId":"getAuthConnectionsEventsById","parameters":[{"description":"The auth connection ID to follow.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"text/event-stream":{"schema":{"$ref":"#/components/schemas/ManagedAuthEvent"}}},"description":"SSE stream of auth connection state updates.","headers":{"X-SSE-Content-Type":{"description":"Media type of SSE data events (always application/json).","schema":{"const":"application/json","type":"string"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"Stream login flow events via SSE","tags":["Managed Auth"]}},"/auth/connections/{id}/exchange":{"post":{"description":"Validates the handoff code and returns a JWT token for subsequent requests. Used by the hosted login UI.","operationId":"postAuthConnectionsExchange","parameters":[{"description":"Auth connection ID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ManagedAuthExchangeRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ManagedAuthExchangeResponse"}}},"description":"Exchange successful, JWT returned"},"400":{"$ref":"#/components/responses/BadRequest"},"404":{"$ref":"#/components/responses/NotFound"},"410":{"$ref":"#/components/responses/Gone"},"500":{"$ref":"#/components/responses/InternalError"}},"summary":"Exchange handoff code for JWT","tags":["Managed Auth"],"x-cli-skip":true,"x-hidden":true,"x-stainless-skip":true}},"/auth/connections/{id}/login":{"post":{"description":"Starts a login flow for the auth connection. Returns immediately with a hosted URL for the user to complete authentication, or triggers automatic re-auth if credentials are stored.","operationId":"postAuthConnectionsLogin","parameters":[{"description":"Auth connection ID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginRequest"}}},"required":false},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginResponse"}}},"description":"Login flow started"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Login flow already in progress"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"Start login flow","tags":["Managed Auth"]}},"/auth/connections/{id}/submit":{"post":{"description":"Submits field values for the login form. Poll the auth connection to track progress and get results.","operationId":"postAuthConnectionsSubmit","parameters":[{"description":"Auth connection ID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubmitFieldsRequest"}}},"required":true},"responses":{"202":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubmitFieldsResponse"}}},"description":"Submission accepted for processing"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"422":{"$ref":"#/components/responses/BadRequest"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"Submit field values","tags":["Managed Auth"]}},"/auth/connections/{id}/timeline":{"get":{"description":"Returns a chronological timeline of events for an auth connection —\nlogin attempts, automatic re-auth attempts, and health checks. Events\nare returned newest-first.\n","operationId":"getAuthConnectionsTimelineById","parameters":[{"description":"Auth connection ID","in":"path","name":"id","required":true,"schema":{"type":"string"}},{"description":"Filter the timeline to a single event type.","in":"query","name":"type","required":false,"schema":{"enum":["login","reauth","health_check"],"type":"string"}},{"description":"Maximum number of events to return","in":"query","name":"limit","required":false,"schema":{"default":20,"maximum":100,"type":"integer"}},{"description":"Number of events to skip","in":"query","name":"offset","required":false,"schema":{"default":0,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ManagedAuthTimelineEvent"},"type":"array"}}},"description":"Event timeline for the auth connection","headers":{"X-Has-More":{"description":"Whether there are more results","schema":{"type":"boolean"}},"X-Next-Offset":{"description":"The offset where the next page starts. 0 when there are no more results.","schema":{"type":"integer"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"Get auth connection event timeline","tags":["Managed Auth"]}},"/auth/context":{"get":{"description":"Returns the authenticated principal, organization, credential scope, and effective request scope. The response is derived from the verified request context and does not expose credential secrets.","operationId":"getAuthContext","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthContext"}}},"description":"Authentication context for the current request","headers":{"Cache-Control":{"schema":{"example":"private, no-store","type":"string"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"Get authentication context","tags":["Authentication"]}},"/browser_pools":{"get":{"description":"List browser pools in the resolved project.","operationId":"getBrowserPools","parameters":[{"description":"Limit the number of browser pools to return.","in":"query","name":"limit","required":false,"schema":{"default":20,"maximum":100,"minimum":1,"type":"integer"}},{"description":"Offset the number of browser pools to return.","in":"query","name":"offset","required":false,"schema":{"default":0,"minimum":0,"type":"integer"}},{"description":"Case-insensitive substring match against browser pool name. IDs match by exact value.","in":"query","name":"query","required":false,"schema":{"type":"string"}},{"description":"Exact-match filter on browser pool name using the database collation. In production, matching is case- and accent-insensitive. During the default-project migration, unscoped requests prefer a concrete default-project browser pool over a legacy unscoped browser pool with the same name.","in":"query","name":"name","required":false,"schema":{"type":"string"}},{"description":"Filter pools by geographic region. Omit to list pools in all regions.","in":"query","name":"region","required":false,"schema":{"$ref":"#/components/schemas/Region"}}],"responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/BrowserPool"},"type":"array"}}},"description":"List of browser pools","headers":{"X-Has-More":{"description":"Whether there are more browser pools to fetch.","schema":{"default":false,"type":"boolean"}},"X-Limit":{"description":"Limit the number of browser pools to return.","schema":{"default":20,"maximum":100,"minimum":1,"type":"integer"}},"X-Next-Offset":{"description":"The offset where the next page starts. 0 when there are no more results.","schema":{"nullable":true,"type":"integer"}},"X-Offset":{"description":"The offset of browser pools to return.","schema":{"default":0,"minimum":0,"type":"integer"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"List browser pools","tags":["Browser Pools"]},"post":{"description":"Create a new browser pool with the specified configuration and size.\nPooled browsers load their profile read-only: any save_changes on the profile is ignored\n(not rejected), so pooled browsers never persist changes back to the profile.\n","operationId":"postBrowserPools","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrowserPoolCreateRequest"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrowserPool"}}},"description":"Browser pool created successfully"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"Create a browser pool","tags":["Browser Pools"]}},"/browser_pools/{id_or_name}":{"delete":{"description":"Delete a browser pool and all browsers in it. By default, deletion is blocked if browsers are currently leased. Use force=true to terminate leased browsers.","operationId":"deleteBrowserPoolsByIdOrName","parameters":[{"description":"Browser pool ID or name","in":"path","name":"id_or_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrowserPoolDeleteRequest"}}},"required":false},"responses":{"204":{"description":"Browser pool deleted successfully"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"Delete a browser pool","tags":["Browser Pools"]},"get":{"description":"Retrieve details for a single browser pool by its ID or name.","operationId":"getBrowserPoolsByIdOrName","parameters":[{"description":"Browser pool ID or name","in":"path","name":"id_or_name","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrowserPool"}}},"description":"Browser pool details"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"Get browser pool details","tags":["Browser Pools"]},"patch":{"description":"Updates the configuration used to create browsers in the pool.\nAs with creation, save_changes on the pool profile is ignored (not rejected); pooled\nbrowsers never persist changes back to the profile.\nTo clear the profile reference, send `profile: { \"id\": \"\" }`. Clearing the profile\nalso disables `refresh_on_profile_update`.\n","operationId":"updateBrowserPoolsByIdOrName","parameters":[{"description":"Browser pool ID or name","in":"path","name":"id_or_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrowserPoolUpdateRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrowserPool"}}},"description":"Browser pool details"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"Update a browser pool","tags":["Browser Pools"]}},"/browser_pools/{id_or_name}/acquire":{"post":{"description":"Long-polling endpoint to acquire a browser from the pool. Returns immediately when a browser\nis available, or returns 204 No Content when the poll times out. The client should retry\nthe request to continue waiting for a browser. The acquired browser will use the pool's\ntimeout_seconds for its idle timeout.\n","operationId":"acquireFromBrowserPoolByIdOrName","parameters":[{"description":"Browser pool ID or name","in":"path","name":"id_or_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrowserPoolAcquireRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Browser"}}},"description":"Browser acquired successfully"},"204":{"description":"Poll timed out, no browser available. Retry the request to continue waiting."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"Acquire a browser from the pool","tags":["Browser Pools"]}},"/browser_pools/{id_or_name}/flush":{"post":{"description":"Destroys all idle browsers in the pool; leased browsers are not affected.","operationId":"flushBrowserPoolByIdOrName","parameters":[{"description":"Browser pool ID or name","in":"path","name":"id_or_name","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"Pool flushed successfully"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"Flush all idle browsers in the pool","tags":["Browser Pools"]}},"/browser_pools/{id_or_name}/release":{"post":{"description":"Release a browser back to the pool, optionally recreating the browser instance.","operationId":"releaseToBrowserPoolByIdOrName","parameters":[{"description":"Browser pool ID or name","in":"path","name":"id_or_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrowserPoolReleaseRequest"}}},"required":true},"responses":{"204":{"description":"Browser released successfully"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"Release a browser back to the pool","tags":["Browser Pools"]}},"/browsers":{"get":{"description":"List all browser sessions with pagination support. Use status parameter to filter by session state.","operationId":"getBrowsers","parameters":[{"description":"Filter sessions by status. \"active\" returns only active sessions (default), \"deleted\" returns only soft-deleted sessions, \"all\" returns both.","in":"query","name":"status","required":false,"schema":{"default":"active","enum":["active","deleted","all"],"type":"string"}},{"deprecated":true,"description":"Deprecated: Use status=all instead. When true, includes soft-deleted browser sessions in the results alongside active sessions.","in":"query","name":"include_deleted","required":false,"schema":{"default":false,"type":"boolean"}},{"description":"Maximum number of results to return. Defaults to 20, maximum 100.","in":"query","name":"limit","required":false,"schema":{"default":20,"maximum":100,"minimum":1,"type":"integer"}},{"description":"Number of results to skip. Defaults to 0.","in":"query","name":"offset","required":false,"schema":{"default":0,"minimum":0,"type":"integer"}},{"description":"Search browsers by name, session ID, profile name or ID, proxy ID, or pool name.","in":"query","name":"query","required":false,"schema":{"type":"string"}},{"description":"Filter sessions by tag key-value pairs using deepObject style, e.g. ?tags[team]=backend\u0026tags[env]=staging. Multiple pairs are ANDed: a session must match every supplied pair exactly.\n","explode":true,"in":"query","name":"tags","required":false,"schema":{"additionalProperties":{"type":"string"},"type":"object"},"style":"deepObject"},{"description":"Filter sessions by geographic region. Omit to list sessions in all regions.","in":"query","name":"region","required":false,"schema":{"$ref":"#/components/schemas/Region"}}],"responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/Browser"},"type":"array"}}},"description":"List of browsers","headers":{"X-Has-More":{"description":"Whether more results are available","schema":{"type":"boolean"}},"X-Limit":{"description":"The limit used for pagination","schema":{"type":"integer"}},"X-Next-Offset":{"description":"The offset where the next page starts. 0 when there are no more results.","schema":{"type":"integer"}},"X-Offset":{"description":"The offset used for pagination","schema":{"type":"integer"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"List browser sessions","tags":["Browsers"]},"post":{"description":"Create a new browser session from within an action.","operationId":"postBrowsers","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrowserRequest"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Browser"}}},"description":"Successful response"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/InternalError"},"529":{"$ref":"#/components/responses/CapacityExhausted"}},"security":[{"bearerAuth":[]}],"summary":"Create a browser session","tags":["Browsers"]}},"/browsers/{id_or_name}":{"delete":{"description":"Delete a browser session by ID or name","operationId":"deleteBrowsersByIdOrName","parameters":[{"description":"Browser session ID or name","example":"htzv5orfit78e1m2biiifpbv","in":"path","name":"id_or_name","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"Browser session deleted successfully"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"Delete a browser session by ID or name.","tags":["Browsers"]},"get":{"description":"Get information about a browser session.","operationId":"getBrowsersByIdOrName","parameters":[{"description":"Browser session ID or name","example":"htzv5orfit78e1m2biiifpbv","in":"path","name":"id_or_name","required":true,"schema":{"type":"string"}},{"description":"When true, includes soft-deleted browser sessions in the lookup.","in":"query","name":"include_deleted","required":false,"schema":{"default":false,"type":"boolean"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Browser"}}},"description":"Browser session retrieved successfully"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"Get browser session details","tags":["Browsers"]},"patch":{"description":"Update a browser session.","operationId":"patchBrowsersByIdOrName","parameters":[{"description":"Browser session ID or name","example":"htzv5orfit78e1m2biiifpbv","in":"path","name":"id_or_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrowserUpdateRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Browser"}}},"description":"Browser session updated successfully"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"Update browser session","tags":["Browsers"]}},"/browsers/{id}/computer/batch":{"post":{"description":"Send an array of computer actions to execute in order on the browser instance.\nExecution stops on the first error. This reduces network latency compared to\nsending individual action requests.\n","operationId":"batchComputerAction","parameters":[{"description":"Browser session ID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchComputerActionRequest"}}},"required":true},"responses":{"200":{"description":"All actions executed successfully"},"400":{"$ref":"#/components/responses/BadRequest"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"Execute a batch of computer actions sequentially","tags":["Browser Computer Controls"]}},"/browsers/{id}/computer/click_mouse":{"post":{"operationId":"clickMouse","parameters":[{"description":"Browser session ID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClickMouseRequest"}}},"required":true},"responses":{"200":{"description":"Mouse action performed"},"400":{"$ref":"#/components/responses/BadRequest"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"Simulate a mouse click action on the browser instance","tags":["Browser Computer Controls"]}},"/browsers/{id}/computer/clipboard/read":{"post":{"operationId":"readClipboard","parameters":[{"description":"Browser session ID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClipboardContent"}}},"description":"Clipboard content read successfully"},"400":{"$ref":"#/components/responses/BadRequest"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"Read text from the clipboard on the browser instance","tags":["Browser Computer Controls"]}},"/browsers/{id}/computer/clipboard/write":{"post":{"operationId":"writeClipboard","parameters":[{"description":"Browser session ID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WriteClipboardRequest"}}},"required":true},"responses":{"200":{"description":"Text written to clipboard successfully"},"400":{"$ref":"#/components/responses/BadRequest"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"Write text to the clipboard on the browser instance","tags":["Browser Computer Controls"]}},"/browsers/{id}/computer/cursor":{"post":{"operationId":"setCursor","parameters":[{"description":"Browser session ID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCursorRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OkResponse"}}},"description":"Cursor visibility set"},"400":{"$ref":"#/components/responses/BadRequest"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"Set cursor visibility","tags":["Browser Computer Controls"]}},"/browsers/{id}/computer/drag_mouse":{"post":{"operationId":"dragMouse","parameters":[{"description":"Browser session ID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DragMouseRequest"}}},"required":true},"responses":{"200":{"description":"Drag performed"},"400":{"$ref":"#/components/responses/BadRequest"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"Drag the mouse along a path","tags":["Browser Computer Controls"]}},"/browsers/{id}/computer/get_mouse_position":{"post":{"operationId":"getMousePosition","parameters":[{"description":"Browser session ID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MousePositionResponse"}}},"description":"Current mouse position"},"400":{"$ref":"#/components/responses/BadRequest"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"Get the current mouse cursor position on the browser instance","tags":["Browser Computer Controls"]}},"/browsers/{id}/computer/move_mouse":{"post":{"operationId":"moveMouse","parameters":[{"description":"Browser session ID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MoveMouseRequest"}}},"required":true},"responses":{"200":{"description":"Mouse cursor moved"},"400":{"$ref":"#/components/responses/BadRequest"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"Move the mouse cursor to the specified coordinates on the browser instance","tags":["Browser Computer Controls"]}},"/browsers/{id}/computer/press_key":{"post":{"operationId":"pressKey","parameters":[{"description":"Browser session ID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PressKeyRequest"}}},"required":true},"responses":{"200":{"description":"Keys pressed successfully"},"400":{"$ref":"#/components/responses/BadRequest"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"Press one or more keys on the host computer","tags":["Browser Computer Controls"]}},"/browsers/{id}/computer/screenshot":{"post":{"operationId":"takeScreenshot","parameters":[{"description":"Browser session ID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScreenshotRequest"}}},"required":false},"responses":{"200":{"content":{"image/png":{"schema":{"format":"binary","type":"string"}}},"description":"Screenshot image"},"400":{"$ref":"#/components/responses/BadRequest"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"Capture a screenshot of the browser instance","tags":["Browser Computer Controls"]}},"/browsers/{id}/computer/scroll":{"post":{"operationId":"scroll","parameters":[{"description":"Browser session ID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScrollRequest"}}},"required":true},"responses":{"200":{"description":"Scroll performed"},"400":{"$ref":"#/components/responses/BadRequest"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"Scroll the mouse wheel at a position on the host computer","tags":["Browser Computer Controls"]}},"/browsers/{id}/computer/type":{"post":{"operationId":"typeText","parameters":[{"description":"Browser session ID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TypeTextRequest"}}},"required":true},"responses":{"200":{"description":"Text typed successfully"},"400":{"$ref":"#/components/responses/BadRequest"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"Type text on the browser instance","tags":["Browser Computer Controls"]}},"/browsers/{id}/curl":{"post":{"description":"Sends an HTTP request through Chrome's HTTP request stack, inheriting\nthe browser's TLS fingerprint, cookies, proxy configuration, and headers.\nReturns a structured JSON response with status, headers, body, and timing.\n","operationId":"browserCurl","parameters":[{"description":"Browser session ID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrowserCurlRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrowserCurlResult"}}},"description":"Response from target URL"},"400":{"$ref":"#/components/responses/BadRequest"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrowserCurlTransportError"}}},"description":"Upstream transport failure"}},"security":[{"bearerAuth":[]}],"summary":"Make an HTTP request through the browser's network stack","tags":["Browsers"]}},"/browsers/{id}/extensions":{"post":{"description":"Loads one or more unpacked extensions and restarts Chromium on the browser instance.","operationId":"uploadExtensionsToBrowser","parameters":[{"description":"Browser session ID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"multipart/form-data":{"schema":{"properties":{"extensions":{"description":"List of extensions to upload and activate","items":{"properties":{"name":{"description":"Folder name to place the extension under /home/kernel/extensions/\u003cname\u003e","maxLength":255,"minLength":1,"pattern":"^[a-zA-Z0-9._-]{1,255}$","type":"string"},"zip_file":{"description":"Zip archive containing an unpacked Chromium extension (must include manifest.json)","format":"binary","type":"string"}},"required":["zip_file","name"],"type":"object"},"type":"array"}},"required":["extensions"],"type":"object"}}},"required":true},"responses":{"201":{"description":"Extensions uploaded, Chromium restarted, and DevTools is ready"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"Ad-hoc upload one or more unpacked extensions to a running browser instance.","tags":["Browsers"]}},"/browsers/{id}/fs/create_directory":{"put":{"operationId":"createDirectory","parameters":[{"description":"Browser session ID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateDirectoryRequest"}}},"required":true},"responses":{"201":{"description":"Directory created successfully"},"400":{"$ref":"#/components/responses/BadRequest"},"403":{"$ref":"#/components/responses/Forbidden"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"Create a new directory","tags":["Browser Filesystem"]}},"/browsers/{id}/fs/delete_directory":{"put":{"operationId":"deleteDirectory","parameters":[{"description":"Browser session ID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeletePathRequest"}}},"required":true},"responses":{"200":{"description":"Directory deleted"},"400":{"$ref":"#/components/responses/BadRequest"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"Delete a directory","tags":["Browser Filesystem"]}},"/browsers/{id}/fs/delete_file":{"put":{"operationId":"deleteFile","parameters":[{"description":"Browser session ID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeletePathRequest"}}},"required":true},"responses":{"200":{"description":"File deleted"},"400":{"$ref":"#/components/responses/BadRequest"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"Delete a file","tags":["Browser Filesystem"]}},"/browsers/{id}/fs/download_dir_zip":{"get":{"description":"Returns a ZIP file containing the contents of the specified directory.","operationId":"downloadDirZip","parameters":[{"description":"Browser session ID","in":"path","name":"id","required":true,"schema":{"type":"string"}},{"description":"Absolute directory path to archive and download.","in":"query","name":"path","required":true,"schema":{"pattern":"^/.*","type":"string"}}],"responses":{"200":{"content":{"application/zip":{"schema":{"format":"binary","type":"string"}}},"description":"ZIP archive of the requested directory"},"400":{"$ref":"#/components/responses/BadRequest"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"Download a directory as a ZIP archive","tags":["Browser Filesystem"]}},"/browsers/{id}/fs/file_info":{"get":{"operationId":"fileInfo","parameters":[{"description":"Browser session ID","in":"path","name":"id","required":true,"schema":{"type":"string"}},{"description":"Absolute path of the file or directory.","in":"query","name":"path","required":true,"schema":{"pattern":"^/.*","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FileInfo"}}},"description":"File information"},"400":{"$ref":"#/components/responses/BadRequest"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"Get information about a file or directory","tags":["Browser Filesystem"]}},"/browsers/{id}/fs/list_files":{"get":{"operationId":"listFiles","parameters":[{"description":"Browser session ID","in":"path","name":"id","required":true,"schema":{"type":"string"}},{"description":"Absolute directory path.","in":"query","name":"path","required":true,"schema":{"pattern":"^/.*","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListFiles"}}},"description":"Directory listing"},"400":{"$ref":"#/components/responses/BadRequest"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"List files in a directory","tags":["Browser Filesystem"]}},"/browsers/{id}/fs/move":{"put":{"operationId":"movePath","parameters":[{"description":"Browser session ID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MovePathRequest"}}},"required":true},"responses":{"200":{"description":"Move successful"},"400":{"$ref":"#/components/responses/BadRequest"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"Move or rename a file or directory","tags":["Browser Filesystem"]}},"/browsers/{id}/fs/read_file":{"get":{"operationId":"readFile","parameters":[{"description":"Browser session ID","in":"path","name":"id","required":true,"schema":{"type":"string"}},{"description":"Absolute file path to read.","in":"query","name":"path","required":true,"schema":{"pattern":"^/.*","type":"string"}}],"responses":{"200":{"content":{"application/octet-stream":{"schema":{"format":"binary","type":"string"}}},"description":"File read successfully"},"400":{"$ref":"#/components/responses/BadRequest"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"Read file contents","tags":["Browser Filesystem"]}},"/browsers/{id}/fs/set_file_permissions":{"put":{"operationId":"setFilePermissions","parameters":[{"description":"Browser session ID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetFilePermissionsRequest"}}},"required":true},"responses":{"200":{"description":"Permissions updated"},"400":{"$ref":"#/components/responses/BadRequest"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"Set file or directory permissions/ownership","tags":["Browser Filesystem"]}},"/browsers/{id}/fs/upload":{"post":{"description":"Allows uploading single or multiple files to the remote filesystem.","operationId":"uploadFiles","parameters":[{"description":"Browser session ID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"multipart/form-data":{"schema":{"properties":{"files":{"items":{"properties":{"dest_path":{"description":"Absolute destination path to write the file.","pattern":"^/.*","type":"string"},"file":{"format":"binary","type":"string"}},"required":["file","dest_path"],"type":"object"},"type":"array"}},"required":["files"],"type":"object"}}},"required":true},"responses":{"201":{"description":"Files uploaded successfully"},"400":{"$ref":"#/components/responses/BadRequest"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"Upload one or more files","tags":["Browser Filesystem"]}},"/browsers/{id}/fs/upload_zip":{"post":{"description":"Upload a zip file and extract its contents to the specified destination path.","operationId":"uploadZip","parameters":[{"description":"Browser session ID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"multipart/form-data":{"schema":{"properties":{"dest_path":{"description":"Absolute destination directory to extract the archive to.","pattern":"^/.*","type":"string"},"zip_file":{"format":"binary","type":"string"}},"required":["zip_file","dest_path"],"type":"object"}}},"required":true},"responses":{"201":{"description":"Zip uploaded and extracted successfully"},"400":{"$ref":"#/components/responses/BadRequest"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"Upload a zip archive and extract it","tags":["Browser Filesystem"]}},"/browsers/{id}/fs/watch":{"post":{"operationId":"startFsWatch","parameters":[{"description":"Browser session ID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StartFsWatchRequest"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"properties":{"watch_id":{"description":"Unique identifier for the directory watch","type":"string"}},"type":"object"}}},"description":"Watch started successfully"},"400":{"$ref":"#/components/responses/BadRequest"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"Watch a directory for changes","tags":["Browser Filesystem"]}},"/browsers/{id}/fs/watch/{watch_id}":{"delete":{"operationId":"stopFsWatch","parameters":[{"description":"Browser session ID","in":"path","name":"id","required":true,"schema":{"type":"string"}},{"in":"path","name":"watch_id","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"Watch stopped successfully"},"400":{"$ref":"#/components/responses/BadRequest"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"Stop watching a directory","tags":["Browser Filesystem"]}},"/browsers/{id}/fs/watch/{watch_id}/events":{"get":{"operationId":"streamFsEvents","parameters":[{"description":"Browser session ID","in":"path","name":"id","required":true,"schema":{"type":"string"}},{"in":"path","name":"watch_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"text/event-stream":{"schema":{"$ref":"#/components/schemas/FileSystemEvent"}}},"description":"SSE stream of filesystem events","headers":{"X-SSE-Content-Type":{"description":"Media type of SSE data events (application/json)","schema":{"const":"application/json","type":"string"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"Stream filesystem events for a watch","tags":["Browser Filesystem"]}},"/browsers/{id}/fs/write_file":{"put":{"operationId":"writeFile","parameters":[{"description":"Browser session ID","in":"path","name":"id","required":true,"schema":{"type":"string"}},{"description":"Destination absolute file path.","in":"query","name":"path","required":true,"schema":{"pattern":"^/.*","type":"string"}},{"description":"Optional file mode (octal string, e.g. 644). Defaults to 644.","in":"query","name":"mode","required":false,"schema":{"pattern":"^[0-7]{3,4}$","type":"string"}}],"requestBody":{"content":{"application/octet-stream":{"schema":{"format":"binary","type":"string"}}},"required":true},"responses":{"201":{"description":"File written successfully"},"400":{"$ref":"#/components/responses/BadRequest"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"Write or create a file","tags":["Browser Filesystem"]}},"/browsers/{id}/logs/stream":{"get":{"operationId":"logsStream","parameters":[{"description":"Browser session ID","in":"path","name":"id","required":true,"schema":{"type":"string"}},{"in":"query","name":"source","required":true,"schema":{"enum":["path","supervisor"],"type":"string"}},{"in":"query","name":"follow","required":false,"schema":{"default":true,"type":"boolean"}},{"description":"only required if source is path","in":"query","name":"path","required":false,"schema":{"type":"string"}},{"description":"only required if source is supervisor","in":"query","name":"supervisor_process","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"text/event-stream":{"schema":{"$ref":"#/components/schemas/LogEvent"}}},"description":"SSE stream of logs","headers":{"X-SSE-Content-Type":{"description":"Media type of SSE data events (application/json)","schema":{"const":"application/json","type":"string"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"Stream log files on the browser instance via SSE","tags":["Browser Logs"]}},"/browsers/{id}/playwright/execute":{"post":{"description":"Execute arbitrary Playwright code in a fresh execution context against the browser.\nThe code runs in the same VM as the browser, minimizing latency and maximizing throughput.\nIt has access to 'page', 'context', and 'browser' variables.\nIt can `return` a value, and this value is returned in the response.\n","operationId":"executePlaywrightCode","parameters":[{"description":"Browser session ID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExecutePlaywrightRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExecutePlaywrightResult"}}},"description":"Code executed successfully"},"400":{"$ref":"#/components/responses/BadRequest"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"Execute Playwright/TypeScript code against the browser","tags":["Browser Playwright"]}},"/browsers/{id}/process/exec":{"post":{"operationId":"processExec","parameters":[{"description":"Browser session ID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessExecRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessExecResult"}}},"description":"Execution result"},"400":{"$ref":"#/components/responses/BadRequest"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"Execute a command synchronously","tags":["Browser Processes"]}},"/browsers/{id}/process/spawn":{"post":{"operationId":"processSpawn","parameters":[{"description":"Browser session ID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessSpawnRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessSpawnResult"}}},"description":"Spawned"},"400":{"$ref":"#/components/responses/BadRequest"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"Execute a command asynchronously","tags":["Browser Processes"]}},"/browsers/{id}/process/{process_id}/kill":{"post":{"operationId":"processKill","parameters":[{"description":"Browser session ID","in":"path","name":"id","required":true,"schema":{"type":"string"}},{"in":"path","name":"process_id","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessKillRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OkResponse"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"Send signal to process","tags":["Browser Processes"]}},"/browsers/{id}/process/{process_id}/resize":{"post":{"operationId":"processResize","parameters":[{"description":"Browser session ID","in":"path","name":"id","required":true,"schema":{"type":"string"}},{"in":"path","name":"process_id","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessResizeRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OkResponse"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"Resize a PTY-backed process terminal","tags":["Browser Processes"]}},"/browsers/{id}/process/{process_id}/status":{"get":{"operationId":"processStatus","parameters":[{"description":"Browser session ID","in":"path","name":"id","required":true,"schema":{"type":"string"}},{"in":"path","name":"process_id","required":true,"schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessStatus"}}},"description":"Status"},"400":{"$ref":"#/components/responses/BadRequest"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"Get process status","tags":["Browser Processes"]}},"/browsers/{id}/process/{process_id}/stdin":{"post":{"operationId":"processStdin","parameters":[{"description":"Browser session ID","in":"path","name":"id","required":true,"schema":{"type":"string"}},{"in":"path","name":"process_id","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessStdinRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessStdinResult"}}},"description":"Bytes written"},"400":{"$ref":"#/components/responses/BadRequest"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"Write to process stdin","tags":["Browser Processes"]}},"/browsers/{id}/process/{process_id}/stdout/stream":{"get":{"operationId":"processStdoutStream","parameters":[{"description":"Browser session ID","in":"path","name":"id","required":true,"schema":{"type":"string"}},{"in":"path","name":"process_id","required":true,"schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"content":{"text/event-stream":{"schema":{"$ref":"#/components/schemas/ProcessStreamEvent"}}},"description":"SSE stream of process output and lifecycle events","headers":{"X-SSE-Content-Type":{"description":"Media type of SSE data events (application/json)","schema":{"const":"application/json","type":"string"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"Stream process stdout via SSE","tags":["Browser Processes"]}},"/browsers/{id}/replays":{"get":{"description":"List all replays for the specified browser session.","operationId":"listBrowsersReplays","parameters":[{"description":"Browser session ID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/BrowserReplay"},"type":"array"}}},"description":"List of replays retrieved successfully."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"List browser session replays","tags":["Browser Replays"]},"post":{"description":"Start recording the browser session and return a replay ID.","operationId":"startBrowserReplayRecording","parameters":[{"description":"Browser session ID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"framerate":{"description":"Recording framerate in fps. Values above 20 require GPU to be enabled on the browser session.","maximum":60,"minimum":1,"type":"integer"},"max_duration_in_seconds":{"description":"Maximum recording duration in seconds.","minimum":1,"type":"integer"},"record_audio":{"default":false,"description":"Record audio in addition to video. When false (the default), the recording is video-only.","type":"boolean"}},"type":"object"}}},"required":false},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrowserReplay"}}},"description":"Recording started successfully."},"400":{"$ref":"#/components/responses/BadRequest"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"Start a browser session replay recording","tags":["Browser Replays"]}},"/browsers/{id}/replays/{replay_id}":{"get":{"description":"Download or stream the specified replay recording.","operationId":"getBrowsersReplaysById","parameters":[{"description":"Browser session ID","in":"path","name":"id","required":true,"schema":{"type":"string"}},{"description":"Replay recording identifier","in":"path","name":"replay_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"video/mp4":{"schema":{"format":"binary","type":"string"}}},"description":"Replay recording retrieved successfully."},"202":{"description":"Replay recording is still in progress, please try again later","headers":{"Retry-After":{"description":"Suggested wait time in seconds before retrying","schema":{"minimum":1,"type":"integer"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"Download a replay recording","tags":["Browser Replays"]}},"/browsers/{id}/replays/{replay_id}/stop":{"post":{"description":"Stop the specified replay recording and persist the video.","operationId":"stopBrowserReplayRecording","parameters":[{"description":"Browser session ID","in":"path","name":"id","required":true,"schema":{"type":"string"}},{"description":"Replay recording identifier","in":"path","name":"replay_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Recording stopped successfully."},"400":{"$ref":"#/components/responses/BadRequest"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"Stop a browser session replay recording","tags":["Browser Replays"]}},"/browsers/{id}/telemetry/events":{"get":{"description":"Reads a page of telemetry events for the browser session. To page through results, pass the X-Next-Offset value from the previous response as offset and repeat while X-Has-More is true. Returns an empty list when telemetry data is unavailable.\n","operationId":"readBrowserTelemetryEvents","parameters":[{"description":"Browser session ID","in":"path","name":"id","required":true,"schema":{"type":"string"}},{"description":"Opaque pagination cursor: pass the X-Next-Offset value from the previous response to fetch the next page. When set, paging continues from this cursor and since is ignored, while until still bounds the page. It is not an event's seq field, so do not derive it from the response body.\n","in":"query","name":"offset","required":false,"schema":{"minimum":0,"type":"integer"}},{"description":"Start of the window: an RFC-3339 timestamp, or a duration like 5m meaning that long ago. Defaults to 5m. Ignored when offset is set.\n","in":"query","name":"since","required":false,"schema":{"type":"string"}},{"description":"End of the window (exclusive): an RFC-3339 timestamp, or a duration like 5m meaning that long ago.\n","in":"query","name":"until","required":false,"schema":{"type":"string"}},{"description":"Maximum number of events per page. Defaults to 20.","in":"query","name":"limit","required":false,"schema":{"default":20,"maximum":100,"minimum":1,"type":"integer"}},{"description":"Restrict results to these event categories. Repeat the parameter for multiple values.","in":"query","name":"category","required":false,"schema":{"items":{"enum":["console","network","page","interaction","control","connection","system","screenshot","captcha","monitor"],"type":"string"},"type":"array"}},{"description":"Read direction. asc (default) reads oldest first, starting from since or the offset cursor. desc reads newest first: each request returns one page of up to limit records ending at the offset cursor (or until, or the newest archived event); combining desc with since is rejected with a 400. In either direction the category filter applies within the page, so a filtered page may be empty while X-Has-More is true.\n","in":"query","name":"order","required":false,"schema":{"default":"asc","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/BrowserTelemetryEventEnvelope"},"type":"array"}}},"description":"A page of telemetry events.","headers":{"X-Has-More":{"description":"Whether more results are available","schema":{"type":"boolean"}},"X-Next-Offset":{"description":"The offset where the next page starts. 0 when there are no more results.","schema":{"type":"integer"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"Read telemetry events for a browser session","tags":["Browser Telemetry"]}},"/browsers/{id}/telemetry/stream":{"get":{"description":"Streams browser telemetry events as a server-sent events (SSE) stream. The stream closes when the browser session terminates. Each event frame includes an id: field containing a monotonically increasing sequence number; pass it as Last-Event-ID on reconnect to resume without gaps. The event: field is never set; all frames carry JSON in the data: field. A keepalive comment frame is sent every 15 seconds when no events arrive. Returns 404 if the browser session does not exist. If telemetry was not enabled on the session, the stream opens but no events are delivered. Fresh connections only see new events; pass replay=all to start from the oldest retained event instead.\n","operationId":"streamBrowserTelemetry","parameters":[{"description":"Browser session ID","in":"path","name":"id","required":true,"schema":{"type":"string"}},{"description":"Last event sequence number for SSE reconnection (sent by SSE clients on reconnect). Takes precedence over replay when both are present, so reconnect resumes instead of re-replaying.","in":"header","name":"Last-Event-ID","schema":{"type":"string"}},{"description":"Pass `all` to start from the oldest retained event instead of only new events; any other value is treated as from-now. The buffer is bounded, so the first event id may be greater than 1 if older events were evicted.","in":"query","name":"replay","schema":{"type":"string"}}],"responses":{"200":{"content":{"text/event-stream":{"schema":{"$ref":"#/components/schemas/BrowserTelemetryEventEnvelope"}}},"description":"SSE stream of telemetry events","headers":{"X-SSE-Content-Type":{"description":"Media type of SSE data events (always application/json).","schema":{"const":"application/json","type":"string"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"Stream telemetry events via SSE","tags":["Browser Telemetry"]}},"/credentials":{"get":{"description":"List credentials in the resolved project. Credential values are not returned.","operationId":"getCredentials","parameters":[{"description":"Filter by domain","in":"query","name":"domain","required":false,"schema":{"type":"string"}},{"description":"Maximum number of results to return","in":"query","name":"limit","required":false,"schema":{"default":20,"maximum":100,"type":"integer"}},{"description":"Number of results to skip","in":"query","name":"offset","required":false,"schema":{"default":0,"type":"integer"}},{"description":"Case-insensitive substring match against credential name or domain. IDs match by exact value.","in":"query","name":"query","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/Credential"},"type":"array"}}},"description":"List of credentials","headers":{"X-Has-More":{"description":"Whether there are more results","schema":{"type":"boolean"}},"X-Next-Offset":{"description":"The offset where the next page starts. 0 when there are no more results.","schema":{"type":"integer"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"List credentials","tags":["Credentials"],"x-hidden":true},"post":{"description":"Create a new credential for storing login information.","operationId":"postCredentials","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCredentialRequest"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Credential"}}},"description":"Credential created successfully"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"Create a credential","tags":["Credentials"],"x-hidden":true}},"/credentials/{id_or_name}":{"delete":{"description":"Delete a credential by its ID or name.","operationId":"deleteCredentialByIdOrName","parameters":[{"description":"Credential ID or name","in":"path","name":"id_or_name","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"Credential deleted successfully"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"Delete credential","tags":["Credentials"],"x-hidden":true},"get":{"description":"Retrieve a credential by its ID or name. Credential values are not returned.","operationId":"getCredentialByIdOrName","parameters":[{"description":"Credential ID or name","in":"path","name":"id_or_name","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Credential"}}},"description":"Credential details"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"Get credential by ID or name","tags":["Credentials"],"x-hidden":true},"patch":{"description":"Update a credential's name or values. When values are provided, they are merged with existing values (new keys are added, existing keys are overwritten).","operationId":"patchCredentialByIdOrName","parameters":[{"description":"Credential ID or name","in":"path","name":"id_or_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateCredentialRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Credential"}}},"description":"Credential updated successfully"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"Update credential","tags":["Credentials"],"x-hidden":true}},"/credentials/{id_or_name}/totp-code":{"get":{"description":"Returns the current 6-digit TOTP code for a credential with a configured totp_secret. Use this to complete 2FA setup on sites or when you need a fresh code.","operationId":"getCredentialTotpCodeByIdOrName","parameters":[{"description":"Credential ID or name","in":"path","name":"id_or_name","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"code":{"description":"Current 6-digit TOTP code","example":"847291","type":"string"},"expires_at":{"description":"When this code expires (ISO 8601 timestamp)","example":"2025-01-15T10:30:30Z","format":"date-time","type":"string"}},"required":["code","expires_at"],"type":"object"}}},"description":"TOTP code generated successfully"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Credential not found or has no TOTP secret configured"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"Generate TOTP code","tags":["Credentials"],"x-hidden":true}},"/deployments":{"get":{"description":"List deployments. Optionally filter by application name and version.","operationId":"getDeployments","parameters":[{"description":"Filter results by application name.","in":"query","name":"app_name","required":false,"schema":{"type":"string"}},{"description":"Filter results by application version. Requires app_name to be set.","in":"query","name":"app_version","required":false,"schema":{"type":"string"}},{"description":"Limit the number of deployments to return.","in":"query","name":"limit","required":false,"schema":{"default":20,"maximum":100,"minimum":1,"type":"integer"}},{"description":"Offset the number of deployments to return.","in":"query","name":"offset","required":false,"schema":{"default":0,"minimum":0,"type":"integer"}},{"description":"Search deployments by ID or app name.","in":"query","name":"query","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/Deployment"},"type":"array"}}},"description":"List of deployments.","headers":{"X-Has-More":{"description":"Whether there are more deployments to fetch.","schema":{"default":false,"type":"boolean"}},"X-Limit":{"description":"Limit the number of deployments to return.","schema":{"default":20,"maximum":100,"minimum":1,"type":"integer"}},"X-Next-Offset":{"description":"The offset where the next page starts. 0 when there are no more results.","schema":{"nullable":true,"type":"integer"}},"X-Offset":{"description":"The offset of deployments to return.","schema":{"default":0,"minimum":0,"type":"integer"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"List deployments","tags":["Deployments"]},"post":{"description":"Create a new deployment.","operationId":"postDeployments","requestBody":{"content":{"multipart/form-data":{"encoding":{"source":{"contentType":"application/json"}},"examples":{"github_private":{"summary":"Deploy from private GitHub repo","value":{"source":{"auth":{"method":"github_token","token":"ghs_***"},"entrypoint":"index.ts","path":"apps/service","ref":"main","type":"github","url":"https://github.com/org/private-repo"},"version":"latest"}},"github_public":{"summary":"Deploy from GitHub source","value":{"env_vars":{"FOO":"bar"},"force":false,"region":"aws.us-east-1a","source":{"entrypoint":"src/index.ts","path":"apps/api","ref":"main","type":"github","url":"https://github.com/org/repo"},"version":"1.0.0"}},"upload_zip":{"summary":"Upload a ZIP file","value":{"entrypoint_rel_path":"src/app.py","env_vars":{"FOO":"bar"},"file":"\u003cbinary\u003e","force":false,"region":"aws.us-east-1a","version":"1.0.0"}}},"schema":{"$ref":"#/components/schemas/DeploymentRequest"}}},"description":"App deployment data","required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Deployment"}}},"description":"Deployment created successfully"},"400":{"$ref":"#/components/responses/BadRequest"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"Create a deployment","tags":["Deployments"]}},"/deployments/{id}":{"delete":{"description":"Stops a running deployment and marks it for deletion. If the deployment is already in a terminal state (stopped or failed), returns immediately.","operationId":"deleteDeploymentsById","parameters":[{"description":"Deployment ID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"Deployment deleted successfully"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"Delete a deployment","tags":["Deployments"]},"get":{"description":"Get information about a deployment's status.","operationId":"getDeploymentsById","parameters":[{"description":"Deployment ID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Deployment"}}},"description":"Deployment retrieved successfully"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"Get deployment details","tags":["Deployments"]}},"/deployments/{id}/events":{"get":{"description":"Establishes a Server-Sent Events (SSE) stream that delivers real-time logs and\nstatus updates for a deployment. The stream terminates automatically\nonce the deployment reaches a terminal state.\n","operationId":"getDeploymentsEventsById","parameters":[{"description":"The deployment ID to follow.","in":"path","name":"id","required":true,"schema":{"type":"string"}},{"description":"Show logs since the given time (RFC timestamps or durations like 5m).","in":"query","name":"since","required":false,"schema":{"example":"2025-06-20T12:00:00Z","type":"string"}}],"responses":{"200":{"content":{"text/event-stream":{"schema":{"$ref":"#/components/schemas/DeploymentEvent"}}},"description":"SSE stream of deployment state updates and logs.","headers":{"X-SSE-Content-Type":{"description":"Media type of SSE data events (always application/json).","schema":{"const":"application/json","type":"string"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"Stream deployment events via SSE","tags":["Deployments"],"x-hidden":false}},"/extensions":{"get":{"description":"List extensions in the resolved project.","operationId":"getExtensions","parameters":[{"description":"Limit the number of extensions to return.","in":"query","name":"limit","required":false,"schema":{"default":20,"maximum":100,"minimum":1,"type":"integer"}},{"description":"Offset the number of extensions to return.","in":"query","name":"offset","required":false,"schema":{"default":0,"minimum":0,"type":"integer"}},{"description":"Case-insensitive substring match against extension name. IDs match by exact value.","in":"query","name":"query","required":false,"schema":{"type":"string"}},{"description":"Exact-match filter on extension name using the database collation. In production, matching is case- and accent-insensitive. During the default-project migration, unscoped requests prefer a concrete default-project extension over a legacy unscoped extension with the same name.","in":"query","name":"name","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/Extension"},"type":"array"}}},"description":"List of extensions","headers":{"X-Has-More":{"description":"Whether there are more extensions to fetch.","schema":{"default":false,"type":"boolean"}},"X-Limit":{"description":"Limit the number of extensions to return.","schema":{"default":20,"maximum":100,"minimum":1,"type":"integer"}},"X-Next-Offset":{"description":"The offset where the next page starts. 0 when there are no more results.","schema":{"nullable":true,"type":"integer"}},"X-Offset":{"description":"The offset of extensions to return.","schema":{"default":0,"minimum":0,"type":"integer"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"List browser extensions","tags":["Extensions"]},"post":{"description":"Upload a zip file containing an unpacked browser extension. Optionally provide a unique name for later reference.","operationId":"postExtensions","requestBody":{"content":{"multipart/form-data":{"schema":{"properties":{"file":{"description":"ZIP file containing the browser extension.","example":"@path/to/extension.zip","format":"binary","type":"string"},"name":{"description":"Optional unique name within the project to reference this extension.","pattern":"^[A-Za-z0-9._-]{1,255}$","type":"string"}},"required":["file"],"type":"object"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Extension"}}},"description":"Extension uploaded successfully"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"Upload a browser extension","tags":["Extensions"]}},"/extensions/from_chrome_store":{"get":{"description":"Returns a ZIP archive containing the unpacked extension fetched from the Chrome Web Store.","operationId":"getExtensionsFromChromeStore","parameters":[{"description":"Chrome Web Store URL for the extension.","in":"query","name":"url","required":true,"schema":{"type":"string"}},{"description":"Target operating system for the extension package. Defaults to linux.","in":"query","name":"os","required":false,"schema":{"default":"linux","enum":["win","mac","linux"],"type":"string"}}],"responses":{"200":{"content":{"application/octet-stream":{"schema":{"format":"binary","type":"string"}}},"description":"Extension ZIP archive"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"Download unpacked extension from Chrome Web Store","tags":["Extensions"]}},"/extensions/{id_or_name}":{"delete":{"description":"Delete an extension by its ID or by its name.","operationId":"deleteExtensionByIdOrName","parameters":[{"description":"Extension ID or extension name","in":"path","name":"id_or_name","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"Extension deleted successfully"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"Delete extension by ID or name","tags":["Extensions"]},"get":{"description":"Download the extension as a ZIP archive by ID or name.","operationId":"getExtensionByIdOrName","parameters":[{"description":"Extension ID or name","in":"path","name":"id_or_name","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/octet-stream":{"schema":{"format":"binary","type":"string"}}},"description":"Extension ZIP archive"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"Download extension archive","tags":["Extensions"]}},"/extensions/{id_or_name}/metadata":{"get":{"description":"Get an extension's metadata (name, size, timestamps) by ID or name, without downloading the archive.","operationId":"getExtensionByIdOrNameMetadata","parameters":[{"description":"Extension ID or name","in":"path","name":"id_or_name","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Extension"}}},"description":"Extension metadata"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"Get extension metadata","tags":["Extensions"]}},"/invocations":{"get":{"description":"List invocations. Optionally filter by application name, action name, status, deployment ID, or start time.","operationId":"getInvocations","parameters":[{"description":"Filter results by application name.","in":"query","name":"app_name","required":false,"schema":{"type":"string"}},{"description":"Filter results by application version.","in":"query","name":"version","required":false,"schema":{"type":"string"}},{"description":"Filter results by action name.","in":"query","name":"action_name","required":false,"schema":{"type":"string"}},{"description":"Filter results by deployment ID.","in":"query","name":"deployment_id","required":false,"schema":{"type":"string"}},{"description":"Filter results by invocation status.","in":"query","name":"status","required":false,"schema":{"enum":["queued","running","succeeded","failed"],"type":"string"}},{"description":"Show invocations that have started since the given time (RFC timestamps or durations like 5m).","in":"query","name":"since","required":false,"schema":{"example":"2025-06-20T12:00:00Z","type":"string"}},{"description":"Limit the number of invocations to return.","in":"query","name":"limit","required":false,"schema":{"default":20,"maximum":100,"minimum":1,"type":"integer"}},{"description":"Offset the number of invocations to return.","in":"query","name":"offset","required":false,"schema":{"default":0,"minimum":0,"type":"integer"}},{"description":"Search invocations by ID, app name, or action name.","in":"query","name":"query","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/Invocation"},"type":"array"}}},"description":"A list of invocations.","headers":{"X-Has-More":{"description":"Whether there are more invocations to fetch.","schema":{"default":false,"type":"boolean"}},"X-Limit":{"description":"The limit of invocations returned.","schema":{"type":"integer"}},"X-Next-Offset":{"description":"The offset where the next page starts. 0 when there are no more results.","schema":{"nullable":true,"type":"integer"}},"X-Offset":{"description":"The offset of invocations returned.","schema":{"type":"integer"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"List invocations","tags":["Invocations"]},"post":{"description":"Invoke an action.","operationId":"postInvocations","requestBody":{"content":{"application/json":{"schema":{"properties":{"action_name":{"description":"Name of the action to invoke","example":"analyze","type":"string"},"app_name":{"description":"Name of the application","example":"my-app","type":"string"},"async":{"default":false,"description":"If true, invoke asynchronously. When set, the API responds 202 Accepted with status \"queued\".","example":true,"type":"boolean"},"async_timeout_seconds":{"default":900,"description":"Timeout in seconds for async invocations (min 10, max 3600). Only applies when async is true.","example":600,"maximum":3600,"minimum":10,"type":"integer"},"payload":{"description":"Input data for the action, sent as a JSON string.","example":"{\"data\":\"example input\"}","type":"string"},"version":{"default":"latest","description":"Version of the application","example":"1.0.0","type":"string"}},"required":["app_name","version","action_name"],"type":"object"}}},"description":"Invocation parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvokeResponse"}}},"description":"Invocation created successfully"},"202":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvokeResponse"}}},"description":"Invocation queued successfully (asynchronous invocation)"},"400":{"$ref":"#/components/responses/BadRequest"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/InternalError"},"529":{"$ref":"#/components/responses/CapacityExhausted"}},"security":[{"bearerAuth":[]}],"summary":"Invoke an action","tags":["Invocations"]}},"/invocations/{id}":{"get":{"description":"Get details about an invocation's status and output.","operationId":"getInvocationsById","parameters":[{"description":"The invocation ID","example":"rr33xuugxj9h0bkf1rdt2bet","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Invocation"}}},"description":"App invocation retrieved successfully"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"Get invocation details","tags":["Invocations"]},"patch":{"description":"Update an invocation's status or output. This can be used to cancel an invocation by setting the status to \"failed\".","operationId":"patchInvocationsById","parameters":[{"description":"Invocation ID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvocationUpdateRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Invocation"}}},"description":"Invocation updated successfully"},"400":{"$ref":"#/components/responses/BadRequest"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"Update invocation","tags":["Invocations"]}},"/invocations/{id}/browsers":{"delete":{"description":"Delete all browser sessions created within the specified invocation.","operationId":"deleteInvocationsBrowsersById","parameters":[{"description":"Invocation ID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"Browser sessions deleted successfully"},"400":{"$ref":"#/components/responses/BadRequest"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"Delete browser sessions for an invocation","tags":["Invocations"]},"get":{"description":"Returns all active browser sessions created within the specified invocation.","operationId":"getInvocationsBrowsersById","parameters":[{"description":"Invocation ID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"browsers":{"items":{"$ref":"#/components/schemas/Browser"},"type":"array"}},"required":["browsers"],"type":"object"}}},"description":"List of browsers for this invocation"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"List browsers for an invocation","tags":["Invocations"]}},"/invocations/{id}/events":{"get":{"description":"Establishes a Server-Sent Events (SSE) stream that delivers real-time logs and\nstatus updates for an invocation. The stream terminates automatically\nonce the invocation reaches a terminal state.\n","operationId":"getInvocationsEventsById","parameters":[{"description":"The invocation ID to follow.","in":"path","name":"id","required":true,"schema":{"type":"string"}},{"description":"Show logs since the given time (RFC timestamps or durations like 5m).","in":"query","name":"since","required":false,"schema":{"example":"2025-06-20T12:00:00Z","type":"string"}}],"responses":{"200":{"content":{"text/event-stream":{"schema":{"$ref":"#/components/schemas/InvocationEvent"}}},"description":"SSE stream of invocation state updates and logs.","headers":{"X-SSE-Content-Type":{"description":"Media type of SSE data events (always application/json).","schema":{"const":"application/json","type":"string"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"Stream invocation events via SSE","tags":["Invocations"],"x-hidden":false}},"/org/api_keys":{"get":{"description":"List API keys for the authenticated organization. API keys are masked.","operationId":"listApiKeys","parameters":[{"description":"Maximum number of results to return","in":"query","name":"limit","required":false,"schema":{"default":20,"maximum":100,"type":"integer"}},{"description":"Number of results to skip","in":"query","name":"offset","required":false,"schema":{"default":0,"type":"integer"}},{"description":"Case-insensitive substring match against API key name, creator, and project. API key identifiers and masked keys match by exact value or prefix.","in":"query","name":"query","required":false,"schema":{"type":"string"}},{"description":"Exact-match filter on API key name using the database collation. In production, matching is case- and accent-insensitive. Names are not required to be unique, so multiple keys may match. When status=all or include_deleted=true is set, soft-deleted keys with the same name may also match.","in":"query","name":"name","required":false,"schema":{"type":"string"}},{"description":"Field to sort API keys by.","in":"query","name":"sort_by","required":false,"schema":{"default":"created_at","enum":["created_at","name","expires_at"],"type":"string"}},{"description":"Sort direction for API keys.","in":"query","name":"sort_direction","required":false,"schema":{"default":"desc","enum":["asc","desc"],"type":"string"}},{"description":"Filter API keys by status. \"active\" returns keys that are not deleted (default; expired-but-not-deleted keys are still included), \"deleted\" returns only soft-deleted keys, \"all\" returns both.","in":"query","name":"status","required":false,"schema":{"default":"active","enum":["active","deleted","all"],"type":"string"}},{"deprecated":true,"description":"Deprecated: use status=all instead. When true, include deleted (soft-deleted) API keys in the results for audit purposes.","in":"query","name":"include_deleted","required":false,"schema":{"default":false,"type":"boolean"}}],"responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ApiKey"},"type":"array"}}},"description":"List of API keys","headers":{"X-Has-More":{"description":"Whether there are more results","schema":{"type":"boolean"}},"X-Next-Offset":{"description":"The offset where the next page starts. 0 when there are no more results.","schema":{"type":"integer"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"List API keys","tags":["API Keys"]},"post":{"description":"Create a new API key within the authenticated organization.","operationId":"postApiKeys","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateApiKeyRequest"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatedApiKey"}}},"description":"API key created successfully"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"Create an API key","tags":["API Keys"]}},"/org/api_keys/{id}":{"delete":{"description":"Delete an API key. A key cannot delete itself; use a different key to delete this one.","operationId":"deleteApiKeysById","parameters":[{"description":"API key ID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"API key deleted."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"Delete an API key","tags":["API Keys"]},"get":{"description":"Retrieve an API key by ID for the authenticated organization. API keys are masked.","operationId":"getApiKeysById","parameters":[{"description":"API key ID","in":"path","name":"id","required":true,"schema":{"type":"string"}},{"description":"When true, return the API key even if it has been deleted (soft-deleted), for audit purposes. Defaults to false, which returns 404 for a deleted key.","in":"query","name":"include_deleted","required":false,"schema":{"default":false,"type":"boolean"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKey"}}},"description":"API key details"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"Get an API key","tags":["API Keys"]},"patch":{"description":"Update an API key's name.","operationId":"patchApiKeysById","parameters":[{"description":"API key ID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateApiKeyRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKey"}}},"description":"API key updated"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"Update an API key","tags":["API Keys"]}},"/org/api_keys/{id}/rotate":{"post":{"description":"Rotate an API key. Issues a new key that copies the name and project of the rotated key, and schedules the rotated key to expire after a grace period so in-flight callers can swap over. The new plaintext key is returned once.","operationId":"rotateApiKey","parameters":[{"description":"API key ID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RotateApiKeyRequest"}}},"required":false},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatedApiKey"}}},"description":"New API key created from the rotation"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"Rotate an API key","tags":["API Keys"]}},"/org/credential_providers":{"get":{"description":"List external credential providers configured for the organization.","operationId":"getCredentialProviders","parameters":[{"description":"Limit the number of credential providers to return.","in":"query","name":"limit","required":false,"schema":{"default":20,"maximum":100,"minimum":1,"type":"integer"}},{"description":"Offset the number of credential providers to return.","in":"query","name":"offset","required":false,"schema":{"default":0,"minimum":0,"type":"integer"}},{"description":"Case-insensitive substring match against credential provider name. IDs match by exact value.","in":"query","name":"query","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/CredentialProvider"},"type":"array"}}},"description":"List of credential providers","headers":{"X-Has-More":{"description":"Whether there are more credential providers to fetch.","schema":{"default":false,"type":"boolean"}},"X-Limit":{"description":"Limit the number of credential providers to return.","schema":{"default":20,"maximum":100,"minimum":1,"type":"integer"}},"X-Next-Offset":{"description":"The offset where the next page starts. 0 when there are no more results.","schema":{"nullable":true,"type":"integer"}},"X-Offset":{"description":"The offset of credential providers to return.","schema":{"default":0,"minimum":0,"type":"integer"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"List credential providers","tags":["Credential Providers"],"x-hidden":true},"post":{"description":"Configure an external credential provider (e.g., 1Password) for automatic credential lookup.","operationId":"postCredentialProviders","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCredentialProviderRequest"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CredentialProvider"}}},"description":"Credential provider created successfully"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"Create a credential provider","tags":["Credential Providers"],"x-hidden":true}},"/org/credential_providers/{id}":{"delete":{"description":"Delete a credential provider by its ID.","operationId":"deleteCredentialProvidersById","parameters":[{"description":"Credential provider ID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"Credential provider deleted successfully"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"Delete credential provider","tags":["Credential Providers"],"x-hidden":true},"get":{"description":"Retrieve a credential provider by its ID.","operationId":"getCredentialProvidersById","parameters":[{"description":"Credential provider ID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CredentialProvider"}}},"description":"Credential provider details"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"Get credential provider by ID","tags":["Credential Providers"],"x-hidden":true},"patch":{"description":"Update a credential provider's configuration.","operationId":"patchCredentialProvidersById","parameters":[{"description":"Credential provider ID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateCredentialProviderRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CredentialProvider"}}},"description":"Credential provider updated successfully"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"Update credential provider","tags":["Credential Providers"],"x-hidden":true}},"/org/credential_providers/{id}/items":{"get":{"description":"Returns available credential items (e.g., 1Password login items) from the provider.","operationId":"getCredentialProviderItems","parameters":[{"description":"Credential provider ID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"items":{"items":{"$ref":"#/components/schemas/CredentialProviderItem"},"type":"array"}},"type":"object"}}},"description":"List of credential items"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"List items from a credential provider","tags":["Credential Providers"],"x-hidden":true}},"/org/credential_providers/{id}/test":{"post":{"description":"Validate the credential provider's token and list accessible vaults.","operationId":"testCredentialProviderById","parameters":[{"description":"Credential provider ID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CredentialProviderTestResult"}}},"description":"Connection test successful"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"Test credential provider connection","tags":["Credential Providers"],"x-hidden":true}},"/org/limits":{"get":{"description":"Get the organization's effective limits and managed auth usage.","operationId":"getOrgLimits","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrgLimits"}}},"description":"Organization limits"},"401":{"$ref":"#/components/responses/Unauthorized"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"Get organization limits","tags":["Organization"]},"patch":{"description":"Set the default per-project concurrency cap applied to projects without an explicit override. Set the value to 0 to remove the default; omit to leave it unchanged. The default cannot exceed the organization's concurrency limit.","operationId":"patchOrgLimits","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateOrgLimitsRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrgLimits"}}},"description":"Organization limits updated"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"Update organization limits","tags":["Organization"]}},"/org/projects":{"get":{"description":"List projects for the authenticated organization.","operationId":"getOrgProjects","parameters":[{"description":"Maximum number of results to return","in":"query","name":"limit","required":false,"schema":{"default":20,"maximum":100,"type":"integer"}},{"description":"Number of results to skip","in":"query","name":"offset","required":false,"schema":{"default":0,"type":"integer"}},{"description":"Case-insensitive substring match against project name","in":"query","name":"query","required":false,"schema":{"type":"string"}},{"description":"Exact-match filter on project name using the database collation. In production, matching is case- and accent-insensitive.","in":"query","name":"name","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/Project"},"type":"array"}}},"description":"List of projects","headers":{"X-Has-More":{"description":"Whether there are more results","schema":{"type":"boolean"}},"X-Next-Offset":{"description":"The offset where the next page starts. 0 when there are no more results.","schema":{"type":"integer"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"List projects","tags":["Projects"]},"post":{"description":"Create a new project within the authenticated organization.","operationId":"postOrgProjects","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateProjectRequest"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Project"}}},"description":"Project created successfully"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"Create a project","tags":["Projects"]}},"/org/projects/{id_or_name}":{"delete":{"description":"Soft-delete a project. The project must be empty (no active resources).","operationId":"deleteOrgProjectsId","parameters":[{"description":"Project ID or name","in":"path","name":"id_or_name","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"Project deleted"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Project deletion conflict. Returns `project_not_empty` when active\nresources remain; remove them and retry. Returns `last_active_project`\nwhen deletion would remove the organization's final active project.\n"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"Delete a project by ID or name","tags":["Projects"]},"get":{"description":"Get a project by its ID or by its name. Names are unique within an organization.","operationId":"getOrgProjectsId","parameters":[{"description":"Project ID or name","in":"path","name":"id_or_name","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Project"}}},"description":"Project details"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"Get a project by ID or name","tags":["Projects"]},"patch":{"description":"Update a project's name or status.","operationId":"patchOrgProjectsId","parameters":[{"description":"Project ID or name","in":"path","name":"id_or_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateProjectRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Project"}}},"description":"Project updated"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"Update a project by ID or name","tags":["Projects"]}},"/org/projects/{id_or_name}/limits":{"get":{"description":"Get the resource limit overrides for a project. Null values mean no project-level cap (org limit applies).","operationId":"getOrgProjectLimits","parameters":[{"description":"Project ID or name","in":"path","name":"id_or_name","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectLimits"}}},"description":"Project limits"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"Get project limits by ID or name","tags":["Projects"]},"patch":{"description":"Update resource limit overrides for a project. Only fields present in the request are modified. Set a field to 0 to remove that limit cap; omit a field to leave it unchanged.","operationId":"patchOrgProjectLimits","parameters":[{"description":"Project ID or name","in":"path","name":"id_or_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateProjectLimitsRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectLimits"}}},"description":"Project limits updated"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"Update project limits by ID or name","tags":["Projects"]}},"/profiles":{"get":{"description":"List profiles with optional filtering and pagination.","operationId":"getProfiles","parameters":[{"description":"Limit the number of profiles to return.","in":"query","name":"limit","required":false,"schema":{"default":20,"maximum":100,"minimum":1,"type":"integer"}},{"description":"Offset the number of profiles to return.","in":"query","name":"offset","required":false,"schema":{"default":0,"minimum":0,"type":"integer"}},{"description":"Case-insensitive substring match against profile name or ID.","in":"query","name":"query","required":false,"schema":{"type":"string"}},{"description":"Exact-match filter on profile name using the database collation. In production, matching is case- and accent-insensitive. During the default-project migration, unscoped requests prefer a concrete default-project profile over a legacy unscoped profile with the same name.","in":"query","name":"name","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/Profile"},"type":"array"}}},"description":"List of profiles","headers":{"X-Has-More":{"description":"Whether there are more profiles to fetch.","schema":{"default":false,"type":"boolean"}},"X-Limit":{"description":"Limit the number of profiles to return.","schema":{"default":20,"maximum":100,"minimum":1,"type":"integer"}},"X-Next-Offset":{"description":"The offset where the next page starts. 0 when there are no more results.","schema":{"nullable":true,"type":"integer"}},"X-Offset":{"description":"The offset of profiles to return.","schema":{"default":0,"minimum":0,"type":"integer"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"List profiles","tags":["Profiles"]},"post":{"description":"Create a browser profile that can be used to load state into future browser sessions.","operationId":"postProfiles","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProfileRequest"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Profile"}}},"description":"Profile created successfully"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"Create a new profile","tags":["Profiles"]}},"/profiles/{id_or_name}":{"delete":{"description":"Delete a profile by its ID or by its name.","operationId":"deleteProfileByIdOrName","parameters":[{"description":"Profile ID or profile name","in":"path","name":"id_or_name","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"Profile deleted successfully"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"Delete profile by ID or name","tags":["Profiles"]},"get":{"description":"Retrieve details for a single profile by its ID or name.","operationId":"getProfileByIdOrName","parameters":[{"description":"Profile ID or name","in":"path","name":"id_or_name","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Profile"}}},"description":"Profile details"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"Get profile by ID or name","tags":["Profiles"]},"patch":{"description":"Update a profile's name. Names must be unique within the logical project; during the default-project migration, unscoped profiles and profiles in the org default project are treated as the same project. Duplicate-name conflicts are checked before update but are best-effort because there is no backing unique index. Renaming a profile while a browser session references it by name may prevent that session's changes from saving; prefer renaming when the profile is not in use.","operationId":"patchProfileByIdOrName","parameters":[{"description":"Profile ID or profile name","in":"path","name":"id_or_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProfileUpdateRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Profile"}}},"description":"Profile updated"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"Rename profile by ID or name","tags":["Profiles"]}},"/profiles/{id_or_name}/download":{"get":{"description":"Downloads the profile in its stored format by default. Current profiles are returned as\nzstd-compressed tar archives, while legacy profiles remain JSON. Set `format=tar` to\ndecompress current profiles during download; legacy profiles remain JSON.\n","operationId":"downloadProfileByIdOrName","parameters":[{"description":"Profile ID or name","in":"path","name":"id_or_name","required":true,"schema":{"type":"string"}},{"description":"Response format for current profile archives. Legacy profiles are always returned as JSON.","in":"query","name":"format","required":false,"schema":{"default":"tar.zst","enum":["tar.zst","tar"],"type":"string"}}],"responses":{"200":{"content":{"application/octet-stream":{"schema":{"format":"binary","type":"string"}},"application/x-tar":{"schema":{"format":"binary","type":"string"}},"application/zstd":{"schema":{"format":"binary","type":"string"}}},"description":"Profile data in the requested format, or JSON for a legacy profile.","headers":{"Content-Disposition":{"description":"Attachment filename matching the returned profile format.","schema":{"type":"string"}}}},"202":{"description":"Profile exists but has not yet captured any state. Use it in a browser session first to capture state."},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"Download profile archive","tags":["Profiles"]}},"/projects":{"get":{"deprecated":true,"description":"Deprecated: use `GET /org/projects` instead. This route will be removed on 2026-11-24.\n\nList projects for the authenticated organization.\n","operationId":"getProjects","parameters":[{"description":"Maximum number of results to return","in":"query","name":"limit","required":false,"schema":{"default":20,"maximum":100,"type":"integer"}},{"description":"Number of results to skip","in":"query","name":"offset","required":false,"schema":{"default":0,"type":"integer"}},{"description":"Case-insensitive substring match against project name","in":"query","name":"query","required":false,"schema":{"type":"string"}},{"description":"Exact-match filter on project name using the database collation. In production, matching is case- and accent-insensitive.","in":"query","name":"name","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/Project"},"type":"array"}}},"description":"List of projects","headers":{"X-Has-More":{"description":"Whether there are more results","schema":{"type":"boolean"}},"X-Next-Offset":{"description":"The offset where the next page starts. 0 when there are no more results.","schema":{"type":"integer"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"List projects","tags":["Projects"]},"post":{"deprecated":true,"description":"Deprecated: use `POST /org/projects` instead. This route will be removed on 2026-11-24.\n\nCreate a new project within the authenticated organization.\n","operationId":"postProjects","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateProjectRequest"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Project"}}},"description":"Project created successfully"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"Create a project","tags":["Projects"]}},"/projects/{id_or_name}":{"delete":{"deprecated":true,"description":"Deprecated: use `DELETE /org/projects/{id_or_name}` instead. This route will be removed on 2026-11-24.\n\nSoft-delete a project. The project must be empty (no active resources).\n","operationId":"deleteProjectsId","parameters":[{"description":"Project ID or name","in":"path","name":"id_or_name","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"Project deleted"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"Delete a project by ID or name","tags":["Projects"]},"get":{"deprecated":true,"description":"Deprecated: use `GET /org/projects/{id_or_name}` instead. This route will be removed on 2026-11-24.\n\nGet a project by ID or name.\n","operationId":"getProjectsId","parameters":[{"description":"Project ID or name","in":"path","name":"id_or_name","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Project"}}},"description":"Project details"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"Get a project by ID or name","tags":["Projects"]},"patch":{"deprecated":true,"description":"Deprecated: use `PATCH /org/projects/{id_or_name}` instead. This route will be removed on 2026-11-24.\n\nUpdate a project's name or status.\n","operationId":"patchProjectsId","parameters":[{"description":"Project ID or name","in":"path","name":"id_or_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateProjectRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Project"}}},"description":"Project updated"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"Update a project by ID or name","tags":["Projects"]}},"/projects/{id_or_name}/limits":{"get":{"deprecated":true,"description":"Deprecated: use `GET /org/projects/{id_or_name}/limits` instead. This route will be removed on 2026-11-24.\n\nGet the resource limit overrides for a project. Null values mean no project-level cap (org limit applies).\n","operationId":"getProjectLimits","parameters":[{"description":"Project ID or name","in":"path","name":"id_or_name","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectLimits"}}},"description":"Project limits"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"Get project limits by ID or name","tags":["Projects"]},"patch":{"deprecated":true,"description":"Deprecated: use `PATCH /org/projects/{id_or_name}/limits` instead. This route will be removed on 2026-11-24.\n\nUpdate resource limit overrides for a project. Only fields present in the request are modified. Set a field to 0 to remove that limit cap; omit a field to leave it unchanged.\n","operationId":"patchProjectLimits","parameters":[{"description":"Project ID or name","in":"path","name":"id_or_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateProjectLimitsRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectLimits"}}},"description":"Project limits updated"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"Update project limits by ID or name","tags":["Projects"]}},"/proxies":{"get":{"description":"List proxies in the resolved project.","operationId":"getProxies","parameters":[{"description":"Limit the number of proxies to return.","in":"query","name":"limit","required":false,"schema":{"default":20,"maximum":100,"minimum":1,"type":"integer"}},{"description":"Offset the number of proxies to return.","in":"query","name":"offset","required":false,"schema":{"default":0,"minimum":0,"type":"integer"}},{"description":"Case-insensitive substring match against proxy name, host, or IP address. IDs match by exact value.","in":"query","name":"query","required":false,"schema":{"type":"string"}},{"description":"Exact-match filter on proxy name using the database collation. In production, matching is case- and accent-insensitive. Names are not required to be unique, so multiple proxies may match.","in":"query","name":"name","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/Proxy"},"type":"array"}}},"description":"List of proxies","headers":{"X-Has-More":{"description":"Whether there are more proxies to fetch.","schema":{"default":false,"type":"boolean"}},"X-Limit":{"description":"Limit the number of proxies to return.","schema":{"default":20,"maximum":100,"minimum":1,"type":"integer"}},"X-Next-Offset":{"description":"The offset where the next page starts. 0 when there are no more results.","schema":{"nullable":true,"type":"integer"}},"X-Offset":{"description":"The offset of proxies to return.","schema":{"default":0,"minimum":0,"type":"integer"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"List proxies","tags":["Proxies"]},"post":{"description":"Create a new proxy configuration in the resolved project.","operationId":"postProxies","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProxyCreateRequest"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Proxy"}}},"description":"Proxy created successfully"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"Create a proxy","tags":["Proxies"]}},"/proxies/{id}":{"delete":{"description":"Soft delete a proxy. Sessions referencing it are not modified.","operationId":"deleteProxiesById","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"Proxy deleted"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"Delete proxy by ID","tags":["Proxies"]},"get":{"description":"Retrieve a proxy in the resolved project by ID.","operationId":"getProxiesById","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Proxy"}}},"description":"Proxy retrieved"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"Get proxy by ID","tags":["Proxies"]},"patch":{"description":"Update a proxy's name. Proxy names are not unique and are not ID-or-name addressable on this endpoint; duplicate names are allowed. Name-based session-create lookups can remain ambiguous until callers resolve proxies by ID or the API adds a stronger uniqueness contract.","operationId":"patchProxiesById","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProxyUpdateRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Proxy"}}},"description":"Proxy updated"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"Rename proxy by ID","tags":["Proxies"]}},"/proxies/{id}/check":{"post":{"description":"Run a health check on the proxy to verify it's working. Optionally specify a URL to test reachability against a specific target. For ISP and datacenter proxies, this reliably tests whether the target site is reachable from the proxy's stable exit IP. For residential and mobile proxies, the exit node varies between requests, so this validates proxy configuration and connectivity rather than guaranteeing site-specific reachability.","operationId":"postProxiesByIdCheck","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProxyCheckRequest"}}},"required":false},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Proxy"}}},"description":"Health check completed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"422":{"$ref":"#/components/responses/UnprocessableEntity"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"bearerAuth":[]}],"summary":"Check proxy health","tags":["Proxies"]}}},"security":[{"bearerAuth":[]}],"servers":[{"description":"API Server","url":"https://api.onkernel.com"}],"tags":[{"description":"Create and manage browser sessions.","name":"Browsers"},{"description":"Control mouse, keyboard, and screen on the browser instance.","name":"Browser Computer Controls"},{"description":"Execute Playwright code against the browser instance.","name":"Browser Playwright"},{"description":"Read, write, and manage files on the browser instance.","name":"Browser Filesystem"},{"description":"Execute and manage processes on the browser instance.","name":"Browser Processes"},{"description":"Record and manage browser session video replays.","name":"Browser Replays"},{"description":"Stream logs from the browser instance.","name":"Browser Logs"},{"description":"Stream live telemetry events from a browser session.","name":"Browser Telemetry"},{"description":"Create, list, retrieve, and delete browser profiles.","name":"Profiles"},{"description":"Create and manage proxy configurations for routing browser traffic.","name":"Proxies"},{"description":"Create, list, retrieve, and delete browser extensions.","name":"Extensions"},{"description":"Create and manage browser pools for acquiring and releasing browsers.","name":"Browser Pools"},{"description":"Inspect the identity and authorization context for the current request.","name":"Authentication"},{"description":"Create and manage auth connections for automated credential capture and login.","name":"Managed Auth"},{"description":"Create and manage credentials for authentication.","name":"Credentials"},{"description":"Configure external credential providers like 1Password.","name":"Credential Providers"},{"description":"List applications and versions.","name":"Apps"},{"description":"Create and manage app deployments and stream deployment events.","name":"Deployments"},{"description":"Invoke actions and stream or query invocation status and events.","name":"Invocations"},{"description":"Read and manage organization-level limits.","name":"Organization"},{"description":"Create and manage projects for resource isolation within an organization.\nWhen projects are disabled for the organization, project operations return\n`404` with code `projects_disabled`.\n","name":"Projects"},{"description":"Create and manage API keys for organization and project-scoped access.","name":"API Keys"},{"description":"Read audit log records for the authenticated organization.","name":"Audit Logs"}]}