{"openapi":"3.1.0","info":{"title":"Crawl4AI API","version":"1.0.0"},"paths":{"/":{"get":{"summary":"Root","operationId":"root__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/metrics":{"get":{"summary":"Metrics","operationId":"metrics_metrics_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/llm/job":{"post":{"summary":"Llm Job Enqueue","operationId":"llm_job_enqueue_llm_job_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LlmJobPayload"}}},"required":true},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/llm/job/{task_id}":{"get":{"summary":"Llm Job Status","operationId":"llm_job_status_llm_job__task_id__get","parameters":[{"name":"task_id","in":"path","required":true,"schema":{"type":"string","title":"Task Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/crawl/job":{"post":{"summary":"Crawl Job Enqueue","operationId":"crawl_job_enqueue_crawl_job_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CrawlJobPayload"}}},"required":true},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/crawl/job/{task_id}":{"get":{"summary":"Crawl Job Status","operationId":"crawl_job_status_crawl_job__task_id__get","parameters":[{"name":"task_id","in":"path","required":true,"schema":{"type":"string","title":"Task Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/monitor/health":{"get":{"tags":["monitor"],"summary":"Get Health","description":"Get current system health snapshot.","operationId":"get_health_monitor_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/monitor/requests":{"get":{"tags":["monitor"],"summary":"Get Requests","description":"Get active and completed requests.\n\nArgs:\n    status: Filter by 'active', 'completed', 'success', 'error', or 'all'\n    limit: Max number of completed requests to return (default 50)","operationId":"get_requests_monitor_requests_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"type":"string","default":"all","title":"Status"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/monitor/browsers":{"get":{"tags":["monitor"],"summary":"Get Browsers","description":"Get detailed browser pool information.","operationId":"get_browsers_monitor_browsers_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/monitor/endpoints/stats":{"get":{"tags":["monitor"],"summary":"Get Endpoint Stats","description":"Get aggregated endpoint statistics.","operationId":"get_endpoint_stats_monitor_endpoints_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/monitor/timeline":{"get":{"tags":["monitor"],"summary":"Get Timeline","description":"Get timeline data for charts.\n\nArgs:\n    metric: 'memory', 'requests', or 'browsers'\n    window: Time window (only '5m' supported for now)","operationId":"get_timeline_monitor_timeline_get","parameters":[{"name":"metric","in":"query","required":false,"schema":{"type":"string","default":"memory","title":"Metric"}},{"name":"window","in":"query","required":false,"schema":{"type":"string","default":"5m","title":"Window"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/monitor/logs/janitor":{"get":{"tags":["monitor"],"summary":"Get Janitor Log","description":"Get recent janitor cleanup events.","operationId":"get_janitor_log_monitor_logs_janitor_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/monitor/logs/errors":{"get":{"tags":["monitor"],"summary":"Get Errors Log","description":"Get recent errors.","operationId":"get_errors_log_monitor_logs_errors_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/monitor/actions/cleanup":{"post":{"tags":["monitor"],"summary":"Force Cleanup","description":"Force immediate janitor cleanup (kills idle cold pool browsers).","operationId":"force_cleanup_monitor_actions_cleanup_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/monitor/actions/kill_browser":{"post":{"tags":["monitor"],"summary":"Kill Browser","description":"Kill a specific browser by signature (hot or cold only).\n\nArgs:\n    sig: Browser config signature (first 8 chars)","operationId":"kill_browser_monitor_actions_kill_browser_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/KillBrowserRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/monitor/actions/restart_browser":{"post":{"tags":["monitor"],"summary":"Restart Browser","description":"Restart a browser (kill + recreate). Works for permanent too.\n\nArgs:\n    sig: Browser config signature (first 8 chars), or \"permanent\"","operationId":"restart_browser_monitor_actions_restart_browser_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/KillBrowserRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/monitor/stats/reset":{"post":{"tags":["monitor"],"summary":"Reset Stats","description":"Reset today's endpoint counters.","operationId":"reset_stats_monitor_stats_reset_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/token":{"post":{"summary":"Get Token","operationId":"get_token_token_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/config/dump":{"post":{"summary":"Config Dump","operationId":"config_dump_config_dump_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Data"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/md":{"post":{"summary":"Get Markdown","description":"Convert a web page into Markdown format.\n\nSupports multiple extraction modes:\n- fit (default): Readability-based extraction for clean content\n- raw: Direct DOM to Markdown conversion\n- bm25: BM25 relevance ranking with optional query\n- llm: LLM-based summarization with optional query\n\nUse this tool when you need clean, readable text from web pages.","operationId":"get_markdown_md_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarkdownRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/html":{"post":{"summary":"Generate Html","description":"Crawls the URL, preprocesses the raw HTML for schema extraction, and returns the processed HTML.\nUse when you need sanitized HTML structures for building schemas or further processing.","operationId":"generate_html_html_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTMLRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/artifacts/{artifact_id}":{"get":{"summary":"Get Artifact","description":"Fetch a previously generated artifact by its opaque id (authed).","operationId":"get_artifact_artifacts__artifact_id__get","parameters":[{"name":"artifact_id","in":"path","required":true,"schema":{"type":"string","title":"Artifact Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/screenshot":{"post":{"summary":"Generate Screenshot","description":"Capture a full-page PNG screenshot of the specified URL, waiting an optional delay before capture.\nUse when you need an image snapshot of the rendered page. The image is also written to the\nsandboxed artifact store; the response includes an `artifact_id` and a `url` to fetch it.","operationId":"generate_screenshot_screenshot_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScreenshotRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/pdf":{"post":{"summary":"Generate Pdf","description":"Generate a PDF document of the specified URL.\nUse when you need a printable or archivable snapshot of the page. The PDF is also written to the\nsandboxed artifact store; the response includes an `artifact_id` and a `url` to fetch it.","operationId":"generate_pdf_pdf_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PDFRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/execute_js":{"post":{"summary":"Execute Js","description":"Execute a sequence of JavaScript snippets on the specified URL.\nReturn the full CrawlResult JSON (first result).\nUse this when you need to interact with dynamic pages using JS.\nREMEMBER: Scripts accept a list of separated JS snippets to execute and execute them in order.\nIMPORTANT: Each script should be an expression that returns a value. It can be an IIFE or an async function. You can think of it as such.\n    Your script will replace '{script}' and execute in the browser context. So provide either an IIFE or a sync/async function that returns a value.\nReturn Format:\n    - The return result is an instance of CrawlResult, so you have access to markdown, links, and other stuff. If this is enough, you don't need to call again for other endpoints.\n\n    ```python\n    class CrawlResult(BaseModel):\n        url: str\n        html: str\n        success: bool\n        cleaned_html: Optional[str] = None\n        media: Dict[str, List[Dict]] = {}\n        links: Dict[str, List[Dict]] = {}\n        downloaded_files: Optional[List[str]] = None\n        js_execution_result: Optional[Dict[str, Any]] = None\n        screenshot: Optional[str] = None\n        pdf: Optional[bytes] = None\n        mhtml: Optional[str] = None\n        _markdown: Optional[MarkdownGenerationResult] = PrivateAttr(default=None)\n        extracted_content: Optional[str] = None\n        metadata: Optional[dict] = None\n        error_message: Optional[str] = None\n        session_id: Optional[str] = None\n        response_headers: Optional[dict] = None\n        status_code: Optional[int] = None\n        ssl_certificate: Optional[SSLCertificate] = None\n        dispatch_result: Optional[DispatchResult] = None\n        redirected_url: Optional[str] = None\n        network_requests: Optional[List[Dict[str, Any]]] = None\n        console_messages: Optional[List[Dict[str, Any]]] = None\n\n    class MarkdownGenerationResult(BaseModel):\n        raw_markdown: str\n        markdown_with_citations: str\n        references_markdown: str\n        fit_markdown: Optional[str] = None\n        fit_html: Optional[str] = None\n    ```","operationId":"execute_js_execute_js_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JSEndpointRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/llm/{url}":{"get":{"summary":"Llm Endpoint","operationId":"llm_endpoint_llm__url__get","parameters":[{"name":"url","in":"path","required":true,"schema":{"type":"string","title":"Url"}},{"name":"q","in":"query","required":true,"schema":{"type":"string","title":"Q"}},{"name":"provider","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"LLM provider override, e.g. 'openai/gpt-4o-mini'","title":"Provider"},"description":"LLM provider override, e.g. 'openai/gpt-4o-mini'"},{"name":"temperature","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"LLM temperature override","title":"Temperature"},"description":"LLM temperature override"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/schema":{"get":{"summary":"Get Schema","operationId":"get_schema_schema_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/hooks/info":{"get":{"summary":"Get Hooks Info","description":"Enumerate the available declarative hook actions and their parameter schemas.\n\nArbitrary hook code is no longer accepted (it was an exec()-based RCE\nsurface). Each action maps to a server-authored, single-purpose Playwright\noperation; clients select an action and supply schema-validated params.","operationId":"get_hooks_info_hooks_info_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/health":{"get":{"summary":"Health","operationId":"health_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/crawl":{"post":{"summary":"Crawl","description":"Crawl a list of URLs and return the results as JSON.\nFor streaming responses, use /crawl/stream endpoint.\nSupports optional user-provided hook functions for customization.","operationId":"crawl_crawl_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CrawlRequestWithHooks"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/crawl/stream":{"post":{"summary":"Crawl Stream","operationId":"crawl_stream_crawl_stream_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CrawlRequestWithHooks"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ask":{"get":{"summary":"Get Context","description":"This end point is design for any questions about Crawl4ai library. It returns a plain text markdown with extensive information about Crawl4ai. \nYou can use this as a context for any AI assistant. Use this endpoint for AI assistants to retrieve library context for decision making or code generation tasks.\nAlway is BEST practice you provide a query to filter the context. Otherwise the lenght of the response will be very long.\n\nParameters:\n- context_type: Specify \"code\" for code context, \"doc\" for documentation context, or \"all\" for both.\n- query: RECOMMENDED search query to filter paragraphs using BM25. You can leave this empty to get all the context.\n- score_ratio: Minimum score as a fraction of the maximum score for filtering results.\n- max_results: Maximum number of results to return. Default is 20.\n\nReturns:\n- JSON response with the requested context.\n- If \"code\" is specified, returns the code context.\n- If \"doc\" is specified, returns the documentation context.\n- If \"all\" is specified, returns both code and documentation contexts.","operationId":"get_context_ask_get","parameters":[{"name":"context_type","in":"query","required":false,"schema":{"type":"string","pattern":"^(code|doc|all)$","default":"all","title":"Context Type"}},{"name":"query","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"search query to filter chunks","title":"Query"},"description":"search query to filter chunks"},{"name":"score_ratio","in":"query","required":false,"schema":{"type":"number","maximum":1.0,"minimum":0.0,"description":"min score as fraction of max_score","default":0.5,"title":"Score Ratio"},"description":"min score as fraction of max_score"},{"name":"max_results","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"absolute cap on returned chunks","default":20,"title":"Max Results"},"description":"absolute cap on returned chunks"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/mcp/schema":{"get":{"summary":" Schema Endpoint","operationId":"_schema_endpoint_mcp_schema_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}}},"components":{"schemas":{"CrawlJobPayload":{"properties":{"urls":{"items":{"type":"string","maxLength":2083,"minLength":1,"format":"uri"},"type":"array","title":"Urls"},"browser_config":{"additionalProperties":true,"type":"object","title":"Browser Config","default":{}},"crawler_config":{"additionalProperties":true,"type":"object","title":"Crawler Config","default":{}},"webhook_config":{"anyOf":[{"$ref":"#/components/schemas/WebhookConfig"},{"type":"null"}]}},"type":"object","required":["urls"],"title":"CrawlJobPayload"},"CrawlRequestWithHooks":{"properties":{"urls":{"items":{"type":"string"},"type":"array","maxItems":100,"minItems":1,"title":"Urls"},"browser_config":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Browser Config"},"crawler_config":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Crawler Config"},"crawler_configs":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Crawler Configs","description":"List of per-URL CrawlerRunConfig dicts for arun_many(). When provided, each config can include a 'url_matcher' pattern to match against specific URLs. Takes precedence over crawler_config."},"hooks":{"anyOf":[{"$ref":"#/components/schemas/HookConfig"},{"type":"null"}],"description":"Optional user-provided hook functions"}},"type":"object","required":["urls"],"title":"CrawlRequestWithHooks","description":"Extended crawl request with hooks support"},"FilterType":{"type":"string","enum":["raw","fit","bm25","llm"],"title":"FilterType"},"HTMLRequest":{"properties":{"url":{"type":"string","title":"Url"}},"type":"object","required":["url"],"title":"HTMLRequest"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"HookConfig":{"properties":{"hooks":{"items":{"$ref":"#/components/schemas/HookSpec"},"type":"array","maxItems":10,"title":"Hooks","description":"Declarative hook specs (action + params), max 10"},"timeout":{"type":"integer","maximum":120.0,"minimum":1.0,"title":"Timeout","description":"Timeout in seconds for each hook execution","default":30}},"type":"object","title":"HookConfig","description":"Configuration for declarative hooks.","example":{"hooks":[{"action":"block_resources","params":{"resource_types":["image","font"]}},{"action":"scroll_to_bottom","params":{"delay_ms":500,"max_steps":10}}],"timeout":30}},"HookSpec":{"properties":{"action":{"type":"string","title":"Action","description":"One of the registered hook actions"},"params":{"additionalProperties":true,"type":"object","title":"Params","description":"Action parameters"}},"type":"object","required":["action"],"title":"HookSpec","description":"A single declarative hook: a fixed action plus schema-validated params.\n\nArbitrary Python (the old `code` map) is no longer accepted - it was an\nexec()-based RCE surface. Available actions are enumerated by GET /hooks/info\nand validated server-side by hook_registry.py."},"JSEndpointRequest":{"properties":{"url":{"type":"string","title":"Url"},"scripts":{"items":{"type":"string"},"type":"array","title":"Scripts","description":"List of separated JavaScript snippets to execute"}},"type":"object","required":["url","scripts"],"title":"JSEndpointRequest"},"KillBrowserRequest":{"properties":{"sig":{"type":"string","title":"Sig"}},"type":"object","required":["sig"],"title":"KillBrowserRequest"},"LlmJobPayload":{"properties":{"url":{"type":"string","maxLength":2083,"minLength":1,"format":"uri","title":"Url"},"q":{"type":"string","title":"Q"},"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Schema"},"cache":{"type":"boolean","title":"Cache","default":false},"provider":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Provider"},"webhook_config":{"anyOf":[{"$ref":"#/components/schemas/WebhookConfig"},{"type":"null"}]},"temperature":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Temperature"}},"type":"object","required":["url","q"],"title":"LlmJobPayload"},"MarkdownRequest":{"properties":{"url":{"type":"string","title":"Url","description":"Absolute http/https URL to fetch"},"f":{"$ref":"#/components/schemas/FilterType","description":"Content‑filter strategy: fit, raw, bm25, or llm","default":"fit"},"q":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q","description":"Query string used by BM25/LLM filters"},"c":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"C","description":"Cache‑bust / revision counter","default":"0"},"provider":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Provider","description":"LLM provider override (e.g., 'anthropic/claude-3-opus')"},"temperature":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Temperature","description":"LLM temperature override (0.0-2.0)"}},"type":"object","required":["url"],"title":"MarkdownRequest","description":"Request body for the /md endpoint."},"PDFRequest":{"properties":{"url":{"type":"string","title":"Url"}},"type":"object","required":["url"],"title":"PDFRequest"},"ScreenshotRequest":{"properties":{"url":{"type":"string","title":"Url"},"screenshot_wait_for":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Screenshot Wait For","default":2},"wait_for_images":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Wait For Images","default":false}},"type":"object","required":["url"],"title":"ScreenshotRequest"},"TokenRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"api_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Token"}},"type":"object","required":["email"],"title":"TokenRequest"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"WebhookConfig":{"properties":{"webhook_url":{"type":"string","maxLength":2083,"minLength":1,"format":"uri","title":"Webhook Url"},"webhook_data_in_payload":{"type":"boolean","title":"Webhook Data In Payload","default":false},"webhook_headers":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Webhook Headers"}},"type":"object","required":["webhook_url"],"title":"WebhookConfig","description":"Configuration for webhook notifications."}}}}