{"openapi":"3.1.0","info":{"title":"Conversion API","description":"Convert files between formats","version":"1.0.0"},"paths":{"/v1/auth/token":{"post":{"tags":["v1","v1-auth"],"summary":"Exchange Token","description":"Exchange public API key for short-lived JWT.\nTurnstile verification required only for widget-based requests.\nAlso sets a refresh token in HTTP-only cookie for seamless token renewal.","operationId":"exchange_token_v1_auth_token_post","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/auth/refresh":{"post":{"tags":["v1","v1-auth"],"summary":"Refresh Token","description":"Refresh access token using refresh token from HTTP-only cookie.\nReturns a new access token and refresh token.","operationId":"refresh_token_v1_auth_refresh_post","parameters":[{"name":"refresh_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Refresh Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/auth/branding":{"get":{"tags":["v1","v1-auth"],"summary":"Get Branding","description":"Return whether widget embeds must show the 'Powered by EnConvert' branding.\n\nTrue for free plans (branding cannot be hidden), False for paid plans\n(the embedder may choose to hide it via plugin settings).\n\nPublic API keys (pk_*) are permitted to call this endpoint directly so\nplugins can decide rendering before exchanging for a JWT.","operationId":"get_branding_v1_auth_branding_get","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrandingResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/auth/verify":{"get":{"tags":["v1","v1-auth"],"summary":"Verify Auth","description":"Verify authentication is working\n\nUseful for:\n- Testing API keys\n- Checking domain restrictions\n- Debugging auth issues","operationId":"verify_auth_v1_auth_verify_get","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/convert/url-to-pdf":{"post":{"tags":["v1","v1-convert"],"summary":"Url To Pdf","description":"Convert URL(s) to PDF. Supports sync/async, direct download, batch ZIP.","operationId":"url_to_pdf_v1_convert_url_to_pdf_post","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/convert/url-to-screenshot":{"post":{"tags":["v1","v1-convert"],"summary":"Url To Screenshot","description":"Convert URL(s) to screenshot. Supports sync/async, direct download, batch ZIP.","operationId":"url_to_screenshot_v1_convert_url_to_screenshot_post","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/convert/url-to-markdown":{"post":{"tags":["v1","v1-convert"],"summary":"Url To Markdown","description":"Convert URL(s) to clean Markdown (article content + YAML frontmatter metadata).","operationId":"url_to_markdown_v1_convert_url_to_markdown_post","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/convert/website-to-pdf":{"post":{"tags":["v1","v1-convert"],"summary":"Website To Pdf","description":"Convert all pages of a website to PDFs. Supports sitemap-only and full crawl modes. Async-only, returns ZIP.","operationId":"website_to_pdf_v1_convert_website_to_pdf_post","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/convert/website-to-screenshot":{"post":{"tags":["v1","v1-convert"],"summary":"Website To Screenshot","description":"Screenshot all pages of a website. Supports sitemap-only and full crawl modes. Async-only, returns ZIP.","operationId":"website_to_screenshot_v1_convert_website_to_screenshot_post","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/convert/json-to-xml":{"post":{"tags":["v1","v1-convert"],"summary":"Json To Xml","description":"Convert JSON to XML\n\nArgs:\n    file: JSON file to convert\n    output_filename: Optional custom output filename. If not provided, uses input filename with .xml extension.\n    direct_download: If True (default), return file directly. Set to False for JSON metadata.","operationId":"json_to_xml_v1_convert_json_to_xml_post","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_json_to_xml_v1_convert_json_to_xml_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/convert/xml-to-json":{"post":{"tags":["v1","v1-convert"],"summary":"Xml To Json","description":"Convert XML to JSON\n\nArgs:\n    file: XML file to convert\n    output_filename: Optional custom output filename. If not provided, uses input filename with .json extension.\n    direct_download: If True (default), return file directly. Set to False for JSON metadata.","operationId":"xml_to_json_v1_convert_xml_to_json_post","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_xml_to_json_v1_convert_xml_to_json_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/convert/json-to-yaml":{"post":{"tags":["v1","v1-convert"],"summary":"Json To Yaml","description":"Convert JSON to YAML\n\nArgs:\n    file: JSON file to convert\n    output_filename: Optional custom output filename. If not provided, uses input filename with .yaml extension.\n    direct_download: If True (default), return file directly. Set to False for JSON metadata.","operationId":"json_to_yaml_v1_convert_json_to_yaml_post","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_json_to_yaml_v1_convert_json_to_yaml_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/convert/yaml-to-json":{"post":{"tags":["v1","v1-convert"],"summary":"Yaml To Json","description":"Convert YAML to JSON\n\nArgs:\n    file: YAML file to convert\n    output_filename: Optional custom output filename. If not provided, uses input filename with .json extension.\n    direct_download: If True (default), return file directly. Set to False for JSON metadata.","operationId":"yaml_to_json_v1_convert_yaml_to_json_post","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_yaml_to_json_v1_convert_yaml_to_json_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/convert/csv-to-json":{"post":{"tags":["v1","v1-convert"],"summary":"Csv To Json","description":"Convert CSV to JSON\n\nArgs:\n    file: CSV file to convert\n    output_filename: Optional custom output filename. If not provided, uses input filename with .json extension.\n    direct_download: If True (default), return file directly. Set to False for JSON metadata.","operationId":"csv_to_json_v1_convert_csv_to_json_post","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_csv_to_json_v1_convert_csv_to_json_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/convert/json-to-csv":{"post":{"tags":["v1","v1-convert"],"summary":"Json To Csv","description":"Convert json to csv\n\nArgs:\n    file: JSON file (.json) to convert\n    output_filename: Optional custom output filename. If not provided, uses input filename with new extension.\n    direct_download: If True (default), return file directly. Set to False for JSON metadata.","operationId":"json_to_csv_v1_convert_json_to_csv_post","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_json_to_csv_v1_convert_json_to_csv_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/convert/json-to-toml":{"post":{"tags":["v1","v1-convert"],"summary":"Json To Toml","description":"Convert JSON to TOML\n\nArgs:\n    file: JSON file to convert\n    output_filename: Optional custom output filename. If not provided, uses input filename with .toml extension.\n    direct_download: If True (default), return file directly. Set to False for JSON metadata.","operationId":"json_to_toml_v1_convert_json_to_toml_post","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_json_to_toml_v1_convert_json_to_toml_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/convert/toml-to-json":{"post":{"tags":["v1","v1-convert"],"summary":"Toml To Json","description":"Convert TOML to JSON\n\nArgs:\n    file: TOML file to convert\n    output_filename: Optional custom output filename. If not provided, uses input filename with .json extension.\n    direct_download: If True (default), return file directly. Set to False for JSON metadata.","operationId":"toml_to_json_v1_convert_toml_to_json_post","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_toml_to_json_v1_convert_toml_to_json_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/convert/csv-to-xml":{"post":{"tags":["v1","v1-convert"],"summary":"Csv To Xml","description":"Convert CSV to XML\n\nArgs:\n    file: CSV file to convert\n    output_filename: Optional custom output filename. If not provided, uses input filename with .xml extension.\n    direct_download: If True (default), return file directly. Set to False for JSON metadata.","operationId":"csv_to_xml_v1_convert_csv_to_xml_post","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_csv_to_xml_v1_convert_csv_to_xml_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/convert/xml-to-csv":{"post":{"tags":["v1","v1-convert"],"summary":"Xml To Csv","description":"Convert XML to CSV\n\nArgs:\n    file: XML file to convert\n    output_filename: Optional custom output filename. If not provided, uses input filename with .csv extension.\n    direct_download: If True (default), return file directly. Set to False for JSON metadata.","operationId":"xml_to_csv_v1_convert_xml_to_csv_post","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_xml_to_csv_v1_convert_xml_to_csv_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/convert/markdown-to-html":{"post":{"tags":["v1","v1-convert"],"summary":"Markdown To Html","description":"Convert Markdown to HTML\n\nArgs:\n    file: Markdown file to convert\n    output_filename: Optional custom output filename. If not provided, uses input filename with .html extension.\n    direct_download: If True (default), return file directly. Set to False for JSON metadata.","operationId":"markdown_to_html_v1_convert_markdown_to_html_post","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_markdown_to_html_v1_convert_markdown_to_html_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/convert/doc-to-pdf":{"post":{"tags":["v1","v1-convert"],"summary":"Doc To Pdf","description":"Convert Word document to PDF\n\nArgs:\n    file: Word document (.doc) to convert\n    output_filename: Optional custom output filename. If not provided, uses input filename with .pdf extension.\n    direct_download: If True (default), return file directly. Set to False for JSON metadata.\n    pdf_options: Optional JSON string. Supports 'grayscale' only — this\n        format is rendered by LibreOffice, whose page layout comes from the\n        source document — so an explicitly-set geometry option (page_size,\n        page_width/height, orientation, margins, scale, header, footer) is\n        rejected with a 400.","operationId":"doc_to_pdf_v1_convert_doc_to_pdf_post","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_doc_to_pdf_v1_convert_doc_to_pdf_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/convert/excel-to-pdf":{"post":{"tags":["v1","v1-convert"],"summary":"Excel To Pdf","description":"Convert Excel spreadsheet to PDF\n\nArgs:\n    file: Excel spreadsheet (.excel) to convert\n    output_filename: Optional custom output filename. If not provided, uses input filename with .pdf extension.\n    direct_download: If True (default), return file directly. Set to False for JSON metadata.\n    pdf_options: Optional JSON string. Supports 'grayscale' only — this\n        format is rendered by LibreOffice, whose page layout comes from the\n        source document — so an explicitly-set geometry option (page_size,\n        page_width/height, orientation, margins, scale, header, footer) is\n        rejected with a 400.","operationId":"excel_to_pdf_v1_convert_excel_to_pdf_post","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_excel_to_pdf_v1_convert_excel_to_pdf_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/convert/html-to-pdf":{"post":{"tags":["v1","v1-convert"],"summary":"Html To Pdf","description":"Convert HTML to PDF\n\nArgs:\n    file: HTML file to convert\n    output_filename: Optional custom output filename. If not provided, uses input filename with .pdf extension.\n    direct_download: If True (default), return file directly. Set to False for JSON metadata.\n    pdf_options: Optional JSON string with PDF output configuration (page size, margins, etc.)","operationId":"html_to_pdf_v1_convert_html_to_pdf_post","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_html_to_pdf_v1_convert_html_to_pdf_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/convert/markdown-to-pdf":{"post":{"tags":["v1","v1-convert"],"summary":"Markdown To Pdf","description":"Convert Markdown to PDF\n\nArgs:\n    file: Markdown file to convert\n    output_filename: Optional custom output filename. If not provided, uses input filename with .pdf extension.\n    direct_download: If True (default), return file directly. Set to False for JSON metadata.\n    pdf_options: Optional JSON string with PDF output configuration (page size, margins, etc.)","operationId":"markdown_to_pdf_v1_convert_markdown_to_pdf_post","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_markdown_to_pdf_v1_convert_markdown_to_pdf_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/convert/anything-to-markdown":{"post":{"tags":["v1","v1-convert"],"summary":"Anything To Markdown","description":"Convert an uploaded file to clean Markdown (RAG ingestion building block).\n\nAuto-detects the input format by extension and dispatches to the right\nextractor: PDF, DOCX, PPTX, XLSX, CSV, HTML, EPUB, plain text/Markdown, and\nlegacy/ODF office (DOC/PPT/XLS/ODT/ODS/ODP/RTF via unoserver). The output is\na single .md file with heading-aware structure suited to semantic chunking.\n\nArgs:\n    file: The document to convert.\n    output_filename: Optional custom output name (defaults to input name .md).\n    direct_download: If True (default), return the file; else JSON metadata.","operationId":"anything_to_markdown_v1_convert_anything_to_markdown_post","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_anything_to_markdown_v1_convert_anything_to_markdown_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/convert/anything-to-pdf":{"post":{"tags":["v1","v1-convert"],"summary":"Anything To Pdf","description":"Convert an uploaded file of (almost) any format to PDF.\n\nFile-based only (no URLs). Auto-detects the input format by extension and\ndispatches to the right engine: LibreOffice (DOC/DOCX/XLS/XLSX/PPT/PPTX/ODF/\nPages/Numbers/RTF/CSV), WeasyPrint (HTML/Markdown/plain text/EPUB), Pillow\n(PNG/JPEG/GIF/BMP/TIFF/WebP/HEIC) or CairoSVG (SVG). A PDF upload is accepted\nand passed through, which — with pdf_options.grayscale — doubles as a PDF\ngrayscale/normalise path.\n\nArgs:\n    file: The document or image to convert.\n    output_filename: Optional custom output name (defaults to input name .pdf).\n    direct_download: If True (default), return the file; else JSON metadata.\n    pdf_options: Optional JSON string. Page geometry (page_size, page_width/\n        height, orientation, margins, scale, header, footer) is honoured for\n        HTML/Markdown/plain text/EPUB/image/SVG input. Office and PDF input\n        support ``grayscale`` only — their page layout comes from the source\n        document — and reject an explicitly-set geometry option with a 400.","operationId":"anything_to_pdf_v1_convert_anything_to_pdf_post","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_anything_to_pdf_v1_convert_anything_to_pdf_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/convert/thumbnail":{"post":{"tags":["v1","v1-convert"],"summary":"Generate Thumbnail","description":"Generate thumbnail from media file\n\nArgs:\n    file: Media file to generate thumbnail from\n    output_filename: Optional custom output filename. If not provided, uses input filename with thumbnail extension.\n    direct_download: If True (default), return file directly. Set to False for JSON metadata.","operationId":"generate_thumbnail_v1_convert_thumbnail_post","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_generate_thumbnail_v1_convert_thumbnail_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/convert/video":{"post":{"tags":["v1","v1-convert"],"summary":"Transcode Video","description":"Transcode video\n\nArgs:\n    file: Video file to transcode\n    output_filename: Optional custom output filename. If not provided, uses input filename with new extension.\n    direct_download: If True (default), return file directly. Set to False for JSON metadata.","operationId":"transcode_video_v1_convert_video_post","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_transcode_video_v1_convert_video_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/convert/ocr":{"post":{"tags":["v1","v1-convert"],"summary":"Extract Text Ocr","description":"Extract text from image or PDF using OCR\n\nArgs:\n    file: Image or PDF file to extract text from\n    output_filename: Optional custom output filename. If not provided, uses input filename with .txt extension.\n    direct_download: If True (default), return file directly. Set to False for JSON metadata.","operationId":"extract_text_ocr_v1_convert_ocr_post","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_extract_text_ocr_v1_convert_ocr_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/convert/speech-to-text":{"post":{"tags":["v1","v1-convert"],"summary":"Transcribe Audio","description":"Transcribe audio to text\n\nArgs:\n    file: Audio file to transcribe\n    output_filename: Optional custom output filename. If not provided, uses input filename with .txt extension.\n    direct_download: If True (default), return file directly. Set to False for JSON metadata.","operationId":"transcribe_audio_v1_convert_speech_to_text_post","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_transcribe_audio_v1_convert_speech_to_text_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/convert/text-to-speech":{"post":{"tags":["v1","v1-convert"],"summary":"Synthesize Speech","description":"Convert text to speech\n\nArgs:\n    file: Text file to convert to speech\n    output_filename: Optional custom output filename. If not provided, uses input filename with audio extension.\n    direct_download: If True (default), return file directly. Set to False for JSON metadata.","operationId":"synthesize_speech_v1_convert_text_to_speech_post","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_synthesize_speech_v1_convert_text_to_speech_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/convert/status/{job_id}":{"get":{"tags":["v1","v1-convert"],"summary":"Get Conversion Status","description":"Poll conversion job status. Used by Playground/Widget when the\ninitial conversion request times out due to reverse proxy limits.","operationId":"get_conversion_status_v1_convert_status__job_id__get","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/convert/batch/{batch_id}":{"get":{"tags":["v1","v1-convert"],"summary":"Get Batch Status Endpoint","description":"Poll the status of an async batch conversion job.\n\nReturns aggregate status, per-URL statuses, and presigned download\nURLs for completed files. Private keys only.","operationId":"get_batch_status_endpoint_v1_convert_batch__batch_id__get","parameters":[{"name":"batch_id","in":"path","required":true,"schema":{"type":"string","title":"Batch Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/convert/download/{object_key}":{"get":{"tags":["v1","v1-convert"],"summary":"Download File","description":"Proxy file download from DO Spaces through the API.\nAvoids CORS issues and prevents auto-download with garbled filenames\nby setting Content-Disposition: inline with the correct filename.\n\nStreams the object through in ~64KB chunks: buffering the whole file\n(up to the 150MB Business ceiling) held the entire payload in the heap\nfor the whole client transfer — a slow client pinned it for minutes —\nand glibc kept the freed pages afterwards (2026-07-28 memory incident).","operationId":"download_file_v1_convert_download__object_key__get","parameters":[{"name":"object_key","in":"path","required":true,"schema":{"type":"string","title":"Object Key"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/convert/ppt-to-pdf":{"post":{"tags":["v1","v1-convert"],"summary":"Ppt To Pdf","description":"Convert power point to PDF\n\nArgs:\n    file: power point (.ppt) to convert\n    output_filename: Optional custom output filename. If not provided, uses input filename with .pdf extension.\n    direct_download: If True (default), return file directly. Set to False for JSON metadata.\n    pdf_options: Optional JSON string. Supports 'grayscale' only — this\n        format is rendered by LibreOffice, whose page layout comes from the\n        source document — so an explicitly-set geometry option (page_size,\n        page_width/height, orientation, margins, scale, header, footer) is\n        rejected with a 400.","operationId":"ppt_to_pdf_v1_convert_ppt_to_pdf_post","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_ppt_to_pdf_v1_convert_ppt_to_pdf_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/convert/odt-to-pdf":{"post":{"tags":["v1","v1-convert"],"summary":"Odt To Pdf","description":"Convert open office to PDF\n\nArgs:\n    file: open office (.odt) to convert\n    output_filename: Optional custom output filename. If not provided, uses input filename with .pdf extension.\n    direct_download: If True (default), return file directly. Set to False for JSON metadata.\n    pdf_options: Optional JSON string. Supports 'grayscale' only — this\n        format is rendered by LibreOffice, whose page layout comes from the\n        source document — so an explicitly-set geometry option (page_size,\n        page_width/height, orientation, margins, scale, header, footer) is\n        rejected with a 400.","operationId":"odt_to_pdf_v1_convert_odt_to_pdf_post","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_odt_to_pdf_v1_convert_odt_to_pdf_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/convert/ods-to-pdf":{"post":{"tags":["v1","v1-convert"],"summary":"Ods To Pdf","description":"Convert open office to PDF\n\nArgs:\n    file: open office (.ods) to convert\n    output_filename: Optional custom output filename. If not provided, uses input filename with .pdf extension.\n    direct_download: If True (default), return file directly. Set to False for JSON metadata.\n    pdf_options: Optional JSON string. Supports 'grayscale' only — this\n        format is rendered by LibreOffice, whose page layout comes from the\n        source document — so an explicitly-set geometry option (page_size,\n        page_width/height, orientation, margins, scale, header, footer) is\n        rejected with a 400.","operationId":"ods_to_pdf_v1_convert_ods_to_pdf_post","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_ods_to_pdf_v1_convert_ods_to_pdf_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/convert/odp-to-pdf":{"post":{"tags":["v1","v1-convert"],"summary":"Odp To Pdf","description":"Convert open office to PDF\n\nArgs:\n    file: open office (.odp) to convert\n    output_filename: Optional custom output filename. If not provided, uses input filename with .pdf extension.\n    direct_download: If True (default), return file directly. Set to False for JSON metadata.\n    pdf_options: Optional JSON string. Supports 'grayscale' only — this\n        format is rendered by LibreOffice, whose page layout comes from the\n        source document — so an explicitly-set geometry option (page_size,\n        page_width/height, orientation, margins, scale, header, footer) is\n        rejected with a 400.","operationId":"odp_to_pdf_v1_convert_odp_to_pdf_post","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_odp_to_pdf_v1_convert_odp_to_pdf_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/convert/ots-to-pdf":{"post":{"tags":["v1","v1-convert"],"summary":"Ots To Pdf","description":"Convert open office to PDF\n\nArgs:\n    file: open office (.ots) to convert\n    output_filename: Optional custom output filename. If not provided, uses input filename with .pdf extension.\n    direct_download: If True (default), return file directly. Set to False for JSON metadata.\n    pdf_options: Optional JSON string. Supports 'grayscale' only — this\n        format is rendered by LibreOffice, whose page layout comes from the\n        source document — so an explicitly-set geometry option (page_size,\n        page_width/height, orientation, margins, scale, header, footer) is\n        rejected with a 400.","operationId":"ots_to_pdf_v1_convert_ots_to_pdf_post","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_ots_to_pdf_v1_convert_ots_to_pdf_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/convert/pages-to-pdf":{"post":{"tags":["v1","v1-convert"],"summary":"Pages To Pdf","description":"Convert apple pages to PDF\n\nArgs:\n    file: apple pages (.pages) to convert\n    output_filename: Optional custom output filename. If not provided, uses input filename with .pdf extension.\n    direct_download: If True (default), return file directly. Set to False for JSON metadata.\n    pdf_options: Optional JSON string. Supports 'grayscale' only — this\n        format is rendered by LibreOffice, whose page layout comes from the\n        source document — so an explicitly-set geometry option (page_size,\n        page_width/height, orientation, margins, scale, header, footer) is\n        rejected with a 400.","operationId":"pages_to_pdf_v1_convert_pages_to_pdf_post","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_pages_to_pdf_v1_convert_pages_to_pdf_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/convert/numbers-to-pdf":{"post":{"tags":["v1","v1-convert"],"summary":"Numbers To Pdf","description":"Convert apple numbers to PDF\n\nArgs:\n    file: apple numbers (.numbers) to convert\n    output_filename: Optional custom output filename. If not provided, uses input filename with .pdf extension.\n    direct_download: If True (default), return file directly. Set to False for JSON metadata.\n    pdf_options: Optional JSON string. Supports 'grayscale' only — this\n        format is rendered by LibreOffice, whose page layout comes from the\n        source document — so an explicitly-set geometry option (page_size,\n        page_width/height, orientation, margins, scale, header, footer) is\n        rejected with a 400.","operationId":"numbers_to_pdf_v1_convert_numbers_to_pdf_post","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_numbers_to_pdf_v1_convert_numbers_to_pdf_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/convert/jpeg-to-png":{"post":{"tags":["v1","v1-convert"],"summary":"Jpeg To Png","description":"Convert jpeg to png\n\nArgs:\n    file: jpeg image file (.jpeg) to convert\n    output_filename: Optional custom output filename. If not provided, uses input filename with new extension.\n    direct_download: If True (default), return file directly. Set to False for JSON metadata.","operationId":"jpeg_to_png_v1_convert_jpeg_to_png_post","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_jpeg_to_png_v1_convert_jpeg_to_png_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/convert/png-to-jpeg":{"post":{"tags":["v1","v1-convert"],"summary":"Png To Jpeg","description":"Convert png to jpeg\n\nArgs:\n    file: png image file (.png) to convert\n    output_filename: Optional custom output filename. If not provided, uses input filename with new extension.\n    direct_download: If True (default), return file directly. Set to False for JSON metadata.","operationId":"png_to_jpeg_v1_convert_png_to_jpeg_post","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_png_to_jpeg_v1_convert_png_to_jpeg_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/convert/jpeg-to-svg":{"post":{"tags":["v1","v1-convert"],"summary":"Jpeg To Svg","description":"Convert jpeg to svg\n\nArgs:\n    file: JPEG image file (.jpeg/.jpeg) to convert\n    output_filename: Optional custom output filename. If not provided, uses input filename with new extension.\n    direct_download: If True (default), return file directly. Set to False for JSON metadata.","operationId":"jpeg_to_svg_v1_convert_jpeg_to_svg_post","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_jpeg_to_svg_v1_convert_jpeg_to_svg_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/convert/svg-to-jpeg":{"post":{"tags":["v1","v1-convert"],"summary":"Svg To Jpeg","description":"Convert svg to jpeg\n\nArgs:\n    file: SVG image file (.svg) to convert\n    width: Optional output width in pixels (1-10000). Alone, height is derived from the SVG's aspect ratio.\n    height: Optional output height in pixels (1-10000). Alone, width is derived from the SVG's aspect ratio.\n    output_filename: Optional custom output filename. If not provided, uses input filename with new extension.\n    direct_download: If True (default), return file directly. Set to False for JSON metadata.","operationId":"svg_to_jpeg_v1_convert_svg_to_jpeg_post","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_svg_to_jpeg_v1_convert_svg_to_jpeg_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/convert/jpeg-to-heic":{"post":{"tags":["v1","v1-convert"],"summary":"Jpeg To Heic","description":"Convert jpeg to heic\n\nArgs:\n    file: JPEG image file (.jpeg/.jpeg) to convert\n    output_filename: Optional custom output filename. If not provided, uses input filename with new extension.\n    direct_download: If True (default), return file directly. Set to False for JSON metadata.","operationId":"jpeg_to_heic_v1_convert_jpeg_to_heic_post","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_jpeg_to_heic_v1_convert_jpeg_to_heic_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/convert/heic-to-jpeg":{"post":{"tags":["v1","v1-convert"],"summary":"Heic To Jpeg","description":"Convert heic to jpeg\n\nArgs:\n    file: HEIC image file (.heic/.heif) to convert\n    output_filename: Optional custom output filename. If not provided, uses input filename with new extension.\n    direct_download: If True (default), return file directly. Set to False for JSON metadata.","operationId":"heic_to_jpeg_v1_convert_heic_to_jpeg_post","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_heic_to_jpeg_v1_convert_heic_to_jpeg_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/convert/jpeg-to-webp":{"post":{"tags":["v1","v1-convert"],"summary":"Jpeg To Webp","description":"Convert jpeg to webp\n\nArgs:\n    file: JPEG image file (.jpeg/.jpeg) to convert\n    output_filename: Optional custom output filename. If not provided, uses input filename with new extension.\n    direct_download: If True (default), return file directly. Set to False for JSON metadata.","operationId":"jpeg_to_webp_v1_convert_jpeg_to_webp_post","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_jpeg_to_webp_v1_convert_jpeg_to_webp_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/convert/webp-to-jpeg":{"post":{"tags":["v1","v1-convert"],"summary":"Webp To Jpeg","description":"Convert webp to jpeg\n\nArgs:\n    file: WEBP image file (.webp) to convert\n    output_filename: Optional custom output filename. If not provided, uses input filename with new extension.\n    direct_download: If True (default), return file directly. Set to False for JSON metadata.","operationId":"webp_to_jpeg_v1_convert_webp_to_jpeg_post","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_webp_to_jpeg_v1_convert_webp_to_jpeg_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/convert/png-to-svg":{"post":{"tags":["v1","v1-convert"],"summary":"Png To Svg","description":"Convert png to svg\n\nArgs:\n    file: PNG image file (.png) to convert\n    output_filename: Optional custom output filename. If not provided, uses input filename with new extension.\n    direct_download: If True (default), return file directly. Set to False for JSON metadata.","operationId":"png_to_svg_v1_convert_png_to_svg_post","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_png_to_svg_v1_convert_png_to_svg_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/convert/svg-to-png":{"post":{"tags":["v1","v1-convert"],"summary":"Svg To Png","description":"Convert svg to png\n\nArgs:\n    file: SVG image file (.svg) to convert\n    width: Optional output width in pixels (1-10000). Alone, height is derived from the SVG's aspect ratio.\n    height: Optional output height in pixels (1-10000). Alone, width is derived from the SVG's aspect ratio.\n    output_filename: Optional custom output filename. If not provided, uses input filename with new extension.\n    direct_download: If True (default), return file directly. Set to False for JSON metadata.","operationId":"svg_to_png_v1_convert_svg_to_png_post","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_svg_to_png_v1_convert_svg_to_png_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/convert/png-to-heic":{"post":{"tags":["v1","v1-convert"],"summary":"Png To Heic","description":"Convert png to heic\n\nArgs:\n    file: PNG image file (.png) to convert\n    output_filename: Optional custom output filename. If not provided, uses input filename with new extension.\n    direct_download: If True (default), return file directly. Set to False for JSON metadata.","operationId":"png_to_heic_v1_convert_png_to_heic_post","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_png_to_heic_v1_convert_png_to_heic_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/convert/heic-to-png":{"post":{"tags":["v1","v1-convert"],"summary":"Heic To Png","description":"Convert heic to png\n\nArgs:\n    file: HEIC image file (.heic/.heif) to convert\n    output_filename: Optional custom output filename. If not provided, uses input filename with new extension.\n    direct_download: If True (default), return file directly. Set to False for JSON metadata.","operationId":"heic_to_png_v1_convert_heic_to_png_post","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_heic_to_png_v1_convert_heic_to_png_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/convert/png-to-webp":{"post":{"tags":["v1","v1-convert"],"summary":"Png To Webp","description":"Convert png to webp\n\nArgs:\n    file: PNG image file (.png) to convert\n    output_filename: Optional custom output filename. If not provided, uses input filename with new extension.\n    direct_download: If True (default), return file directly. Set to False for JSON metadata.","operationId":"png_to_webp_v1_convert_png_to_webp_post","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_png_to_webp_v1_convert_png_to_webp_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/convert/webp-to-png":{"post":{"tags":["v1","v1-convert"],"summary":"Webp To Png","description":"Convert webp to png\n\nArgs:\n    file: WebP image file (.webp) to convert\n    output_filename: Optional custom output filename. If not provided, uses input filename with new extension.\n    direct_download: If True (default), return file directly. Set to False for JSON metadata.","operationId":"webp_to_png_v1_convert_webp_to_png_post","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_webp_to_png_v1_convert_webp_to_png_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/convert/svg-to-heic":{"post":{"tags":["v1","v1-convert"],"summary":"Svg To Heic","description":"Convert svg to heic\n\nArgs:\n    file: SVG image file (.svg) to convert\n    output_filename: Optional custom output filename. If not provided, uses input filename with new extension.\n    direct_download: If True (default), return file directly. Set to False for JSON metadata.","operationId":"svg_to_heic_v1_convert_svg_to_heic_post","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_svg_to_heic_v1_convert_svg_to_heic_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/convert/heic-to-svg":{"post":{"tags":["v1","v1-convert"],"summary":"Heic To Svg","description":"Convert heic to svg\n\nArgs:\n    file: HEIC image file (.heic/.heif) to convert\n    output_filename: Optional custom output filename. If not provided, uses input filename with new extension.\n    direct_download: If True (default), return file directly. Set to False for JSON metadata.","operationId":"heic_to_svg_v1_convert_heic_to_svg_post","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_heic_to_svg_v1_convert_heic_to_svg_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/convert/svg-to-webp":{"post":{"tags":["v1","v1-convert"],"summary":"Svg To Webp","description":"Convert svg to webp\n\nArgs:\n    file: SVG image file (.svg) to convert\n    width: Optional output width in pixels (1-10000). Alone, height is derived from the SVG's aspect ratio.\n    height: Optional output height in pixels (1-10000). Alone, width is derived from the SVG's aspect ratio.\n    output_filename: Optional custom output filename. If not provided, uses input filename with new extension.\n    direct_download: If True (default), return file directly. Set to False for JSON metadata.","operationId":"svg_to_webp_v1_convert_svg_to_webp_post","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_svg_to_webp_v1_convert_svg_to_webp_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/convert/webp-to-svg":{"post":{"tags":["v1","v1-convert"],"summary":"Webp To Svg","description":"Convert webp to svg\n\nArgs:\n    file: WebP image file (.webp) to convert\n    output_filename: Optional custom output filename. If not provided, uses input filename with new extension.\n    direct_download: If True (default), return file directly. Set to False for JSON metadata.","operationId":"webp_to_svg_v1_convert_webp_to_svg_post","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_webp_to_svg_v1_convert_webp_to_svg_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/convert/heic-to-webp":{"post":{"tags":["v1","v1-convert"],"summary":"Heic To Webp","description":"Convert heic to webp\n\nArgs:\n    file: HEIC image file (.heic/.heif) to convert\n    output_filename: Optional custom output filename. If not provided, uses input filename with new extension.\n    direct_download: If True (default), return file directly. Set to False for JSON metadata.","operationId":"heic_to_webp_v1_convert_heic_to_webp_post","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_heic_to_webp_v1_convert_heic_to_webp_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/convert/webp-to-heic":{"post":{"tags":["v1","v1-convert"],"summary":"Webp To Heic","description":"Convert webp to heic\n\nArgs:\n    file: WebP image file (.webp) to convert\n    output_filename: Optional custom output filename. If not provided, uses input filename with new extension.\n    direct_download: If True (default), return file directly. Set to False for JSON metadata.","operationId":"webp_to_heic_v1_convert_webp_to_heic_post","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_webp_to_heic_v1_convert_webp_to_heic_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/convert/pdf-to-jpeg":{"post":{"tags":["v1","v1-convert"],"summary":"Pdf To Jpeg","description":"Convert pdf to jpeg\n\nArgs:\n    file: PDF file (.pdf) to convert\n    output_filename: Optional custom output filename. If not provided, uses input filename with new extension.\n    direct_download: If True (default), return file directly. Set to False for JSON metadata.","operationId":"pdf_to_jpeg_v1_convert_pdf_to_jpeg_post","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_pdf_to_jpeg_v1_convert_pdf_to_jpeg_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/convert/compress-image":{"post":{"tags":["v1","v1-convert"],"summary":"Compress Image","description":"Compress a PNG, JPEG or WebP image without changing its format.\n\nLossless-first: metadata is stripped (ICC profile and EXIF orientation are\npreserved) and the image is re-encoded with the format's strongest\nlossless settings; the result is never larger than the input. When\ntarget_size_kb is given and lossless compression alone can't reach it, the\nimage is downscaled with the aspect ratio locked until it fits (best\neffort — an unreachable target returns the smallest achievable file).\n\nArgs:\n    file: PNG, JPEG or WebP image file (.png/.jpg/.jpeg/.webp) to compress\n    target_size_kb: Optional size budget in KB. Omitted -> lossless-only.\n    output_filename: Optional custom output filename. If not provided, uses input filename (extension is preserved).\n    direct_download: If True (default), return file directly. Set to False for JSON metadata.","operationId":"compress_image_v1_convert_compress_image_post","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_compress_image_v1_convert_compress_image_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/widget/{widget_id}/config":{"get":{"tags":["v1","v1-widget"],"summary":"Get Widget Config","operationId":"get_widget_config_v1_widget__widget_id__config_get","parameters":[{"name":"widget_id","in":"path","required":true,"schema":{"type":"string","title":"Widget Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/widget/{widget_id}/token":{"post":{"tags":["v1","v1-widget"],"summary":"Get Widget Token","description":"Issue a short-lived JWT for a widget without exposing the API key.\nThe widget is identified by its UUID; the caller's domain is validated\nagainst the widget's allowed_domains list.","operationId":"get_widget_token_v1_widget__widget_id__token_post","parameters":[{"name":"widget_id","in":"path","required":true,"schema":{"type":"string","title":"Widget Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WidgetTokenRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/widget/{widget_id}/refresh":{"post":{"tags":["v1","v1-widget"],"summary":"Refresh Widget Token","description":"Refresh an expired widget JWT using the httpOnly refresh_token cookie.\nNo Turnstile challenge required — the refresh token proves the user\npreviously passed bot verification.","operationId":"refresh_widget_token_v1_widget__widget_id__refresh_post","parameters":[{"name":"widget_id","in":"path","required":true,"schema":{"type":"string","title":"Widget Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/extension/capture":{"post":{"tags":["v1","v1-extension"],"summary":"Upload Capture","description":"Log a browser extension capture and optionally store the file.\n\nEvery call counts as a conversion (billing + activity tracking).\nWhen store_file=true, the actual file is uploaded to cloud storage.","operationId":"upload_capture_v1_extension_capture_post","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_capture_v1_extension_capture_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/":{"get":{"tags":["v1","v1-info"],"summary":"V1 Info","description":"V1 API Information","operationId":"v1_info_v1__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/whoami":{"get":{"tags":["v1","v1-info"],"summary":"Whoami","description":"Resolve an sk_ API key to its project identity so an external client (the\nMCP server) can attach a PostHog project group. Pure pass-through — no DB\nquery; get_current_user already resolved everything.","operationId":"whoami_v1_whoami_get","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WhoAmIResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/perceive":{"post":{"tags":["v2","v2-perceive"],"summary":"Perceive","description":"Single-URL perception: render once, return every requested output.\n\nWith ``direct_download=true`` the response body IS the artifact bytes\n(metadata rides in X- headers) — no second fetch to a signed URL.","operationId":"perceive_v2_perceive_post","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PerceiveRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PerceiveResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/perceive/batch":{"post":{"tags":["v2","v2-perceive"],"summary":"Perceive Batch","description":"Bulk perception: <= 10 URLs inline (200), larger queued (202).\n\nGate order matters: nothing is persisted until every gate passed —\na 403/402/422 must leave zero rows behind.","operationId":"perceive_batch_v2_perceive_batch_post","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PerceiveBatchRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PerceiveBatchResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/perceive/batch/{job_id}":{"get":{"tags":["v2","v2-perceive"],"summary":"Perceive Batch Status","description":"Aggregate one batch from its operation rows (project-scoped 404).\n\n``?direct_download=true`` streams the batch ZIP archive directly\n(only for output_mode='zip' batches whose archive is ready).","operationId":"perceive_batch_status_v2_perceive_batch__job_id__get","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}},{"name":"direct_download","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Direct Download"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PerceiveBatchResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["v2","v2-perceive"],"summary":"Perceive Batch Cancel","description":"Cancel a batch (idempotent). The worker stops between URLs; already\ncompleted URLs keep their artifacts. Project-scoped 404.","operationId":"perceive_batch_cancel_v2_perceive_batch__job_id__delete","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PerceiveBatchResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/perceive/{operation_id}":{"get":{"tags":["v2","v2-perceive"],"summary":"Perceive Status","description":"Look up one perceive operation with refreshed signed URLs.\n\nWith ``direct_download=true`` the response body IS the artifact.","operationId":"perceive_status_v2_perceive__operation_id__get","parameters":[{"name":"operation_id","in":"path","required":true,"schema":{"type":"string","title":"Operation Id"}},{"name":"direct_download","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Direct Download"}},{"name":"output","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Output"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PerceiveResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/public/check/{operation_id}":{"get":{"tags":["v2","v2-public"],"summary":"Public Check","description":"Public verdict of one playground read; 404 for anything else.","operationId":"public_check_v2_public_check__operation_id__get","parameters":[{"name":"operation_id","in":"path","required":true,"schema":{"type":"string","title":"Operation Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicCheck"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/discover":{"post":{"tags":["v2","v2-discover"],"summary":"Discover","description":"List a site's URLs with no browser (sitemap + HTTP-only crawl).","operationId":"discover_v2_discover_post","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DiscoverRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DiscoverResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/lookup":{"post":{"tags":["v2","v2-lookup"],"summary":"Lookup","description":"Search the web via Serper, optionally auto-perceiving top results.","operationId":"lookup_v2_lookup_post","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LookupRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LookupResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/distill":{"post":{"tags":["v2","v2-distill"],"summary":"Distill","description":"Schema-driven structured extraction (CSS-first, LLM fallback).","operationId":"distill_v2_distill_post","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DistillRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DistillResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/ingest":{"post":{"tags":["v2","v2-ingest"],"summary":"Ingest","description":"Create an ingest job and enqueue it (202 + job_id).\n\nGate order matters: nothing is persisted until the quota gate passes — a\n402 leaves zero rows behind. SSRF screening runs in the worker (the seed\nvia discover_flow, each page via render_html), so submit stays instant.","operationId":"ingest_v2_ingest_post","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IngestRequest"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IngestJobResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["v2","v2-ingest"],"summary":"Ingest List","description":"Newest-first page of this project's ingest jobs (dashboard, H.8).\n\nFetches ``limit + 1`` rows to set ``has_more`` without a COUNT. Read-only —\nit consumes no quota and creates no activity row.","operationId":"ingest_list_v2_ingest_get","parameters":[{"name":"skip","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Skip"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":20,"title":"Limit"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IngestJobListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/ingest/files":{"post":{"tags":["v2","v2-ingest"],"summary":"Ingest Files","description":"Ingest uploaded FILES into RAG-ready chunks (202 + job_id).\n\nThe file counterpart of ``POST /v2/ingest``: each uploaded document (PDF,\nDOCX, PPTX, XLSX, CSV, HTML, EPUB, TXT/MD, and legacy/ODF office) is converted\nto Markdown, split by the SAME heading-aware chunker, and assembled into the\nsame single JSONL deliverable — one pipeline for both web and file RAG\ningestion. Always asynchronous: the durable ingest worker drains it, and\n``GET`` / ``DELETE /v2/ingest/{job_id}`` report status and cancel it.\n\nFiles are stored to object storage at submit (so the durable resume can\nre-read them) and deleted once the JSONL is assembled. Bills one op per\nfile against the unified ops quota, re-checked per file in the worker.","operationId":"ingest_files_v2_ingest_files_post","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_ingest_files_v2_ingest_files_post"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IngestJobResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/ingest/webhook-secret":{"get":{"tags":["v2","v2-ingest"],"summary":"Ingest Webhook Secret","description":"Reveal the project's webhook signing secret, creating it on first call.\n\nSENSITIVE: this is the only surface that exposes the secret, and only over\nthe authenticated dashboard channel, so a customer can configure HMAC\nverification on their endpoint.","operationId":"ingest_webhook_secret_v2_ingest_webhook_secret_get","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookSecretResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/ingest/webhook-secret/rotate":{"post":{"tags":["v2","v2-ingest"],"summary":"Ingest Webhook Secret Rotate","description":"Rotate the project's webhook signing secret.\n\nEvery signature computed with the previous secret stops verifying the moment\nthis commits — use after a suspected leak, then update the consumer.","operationId":"ingest_webhook_secret_rotate_v2_ingest_webhook_secret_rotate_post","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookSecretResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/ingest/{job_id}":{"get":{"tags":["v2","v2-ingest"],"summary":"Ingest Status","description":"Lifecycle status of one ingest job (project-scoped 404).","operationId":"ingest_status_v2_ingest__job_id__get","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IngestJobResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["v2","v2-ingest"],"summary":"Ingest Cancel","description":"Cancel an ingest job (idempotent; terminal jobs return unchanged).","operationId":"ingest_cancel_v2_ingest__job_id__delete","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IngestJobResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/ingest/{job_id}/retry-webhook":{"post":{"tags":["v2","v2-ingest"],"summary":"Ingest Retry Webhook","description":"Manually redeliver a completed job's signed completion webhook (H.8).\n\nProject-scoped 404. 400 when no webhook is configured (or the stored URL now\nresolves to a private/internal address), 409 when the job has not completed.\nOtherwise re-signs and re-POSTs with the same retry/back-off policy as the\nauto-fire path, then reports the outcome.","operationId":"ingest_retry_webhook_v2_ingest__job_id__retry_webhook_post","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookRetryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/watch":{"post":{"tags":["v2","v2-watch"],"summary":"Create Watch","description":"Create a watcher (201). Gates first: nothing is persisted until the plan\ngate AND the SSRF screen pass, so a 402/4xx leaves zero rows behind.","operationId":"create_watch_v2_watch_post","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WatchCreateRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WatcherResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["v2","v2-watch"],"summary":"List Watch","description":"Newest-first page of this project's live watchers (read-only).","operationId":"list_watch_v2_watch_get","parameters":[{"name":"skip","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Skip"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":20,"title":"Limit"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WatcherListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/watch/{watcher_id}":{"get":{"tags":["v2","v2-watch"],"summary":"Get Watch","description":"Show one watcher (project-scoped 404; a tombstone reads as gone).","operationId":"get_watch_v2_watch__watcher_id__get","parameters":[{"name":"watcher_id","in":"path","required":true,"schema":{"type":"string","title":"Watcher Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WatcherResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["v2","v2-watch"],"summary":"Update Watch","description":"Update cadence / diff settings / active-paused status (project-scoped).","operationId":"update_watch_v2_watch__watcher_id__patch","parameters":[{"name":"watcher_id","in":"path","required":true,"schema":{"type":"string","title":"Watcher Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WatchUpdateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WatcherResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["v2","v2-watch"],"summary":"Delete Watch","description":"Soft-delete a watcher (idempotent; returns the tombstoned row).","operationId":"delete_watch_v2_watch__watcher_id__delete","parameters":[{"name":"watcher_id","in":"path","required":true,"schema":{"type":"string","title":"Watcher Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WatcherResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/watch/{watcher_id}/snapshots":{"get":{"tags":["v2","v2-watch"],"summary":"List Watch Snapshots","description":"Newest-first snapshot timeline for one watcher (project-scoped 404).\n\nOwnership is verified here (``get_watcher_for_project``) before the\nsnapshot read, per the I.3 store-tenancy contract.","operationId":"list_watch_snapshots_v2_watch__watcher_id__snapshots_get","parameters":[{"name":"watcher_id","in":"path","required":true,"schema":{"type":"string","title":"Watcher Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":20,"title":"Limit"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WatcherSnapshotListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/":{"get":{"tags":["v2","v2-info"],"summary":"V2 Info","description":"V2 API information.","operationId":"v2_info_v2__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response V2 Info V2  Get"}}}}}}},"/internal/cleanup-file":{"post":{"summary":"Cleanup File","description":"Delete one expired file (manual / straggler Cloud-Task trigger).\n\nRoutine retention now runs in-process via services/retention_worker.py; this\nroute stays for manual ops and any legacy Cloud Task still pointed at it, and\nshares the same deletion + storage-reconciliation primitive so both paths\nbehave identically.","operationId":"cleanup_file_internal_cleanup_file_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/internal/rotate-usage-period":{"post":{"summary":"Rotate Usage Period","description":"Rotate one project's usage period on demand.\n\nRotation is now driven by the droplet-local poller\n(services/billing_rotation.py, started from main.py's lifespan) —\nthe no-GCP replacement for the Cloud Tasks trigger, which was not\nfiring and left periods unrotated (usage uncounted AND ungated once\nthe first period lapsed). This route stays for manual triggering and\nany straggler Cloud Task still pointed at it; both paths share the\nsame idempotent, FOR-UPDATE-guarded implementation, so a double\ntrigger is a harmless skip. The old per-call Cloud Tasks\nre-scheduling is gone.","operationId":"rotate_usage_period_internal_rotate_usage_period_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/email/unsubscribe":{"get":{"tags":["lifecycle-public"],"summary":"Unsubscribe Get","description":"Human click-through from the visible footer link.","operationId":"unsubscribe_get_email_unsubscribe_get","parameters":[{"name":"t","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"T"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["lifecycle-public"],"summary":"Unsubscribe Post","description":"RFC 8058 one-click POST from the mail client (List-Unsubscribe-Post).","operationId":"unsubscribe_post_email_unsubscribe_post","parameters":[{"name":"t","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"T"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/email/webhooks/brevo":{"post":{"tags":["lifecycle-public"],"summary":"Brevo Webhook","description":"Suppression webhook: hard_bounce marks the address undeliverable; spam\nadditionally opts the user out of lifecycle mail. Always 200.","operationId":"brevo_webhook_email_webhooks_brevo_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/":{"get":{"tags":["root"],"summary":"Root","description":"API Information","operationId":"root__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/health":{"get":{"tags":["system"],"summary":"Health Check","description":"Health check endpoint.\n\nProbes the three critical subsystems — database, object storage, and the\nheadless browser — and returns 503 if any is unhealthy so a load balancer\ndrains/restarts the node. The browser check is a read-only CDP round-trip\n(BrowserManager.is_browser_healthy) that never triggers recovery, and the\nresponse carries saturation stats (in-use slots, queue depth, crash\nrecoveries) for observability. The blocking DB/storage probes run off the\nevent loop via to_thread so the async handler never stalls.","operationId":"health_check_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}}},"components":{"schemas":{"Body_anything_to_markdown_v1_convert_anything_to_markdown_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"},"output_filename":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Output Filename"},"direct_download":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Direct Download","default":true},"job_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Job Id"}},"type":"object","required":["file"],"title":"Body_anything_to_markdown_v1_convert_anything_to_markdown_post"},"Body_anything_to_pdf_v1_convert_anything_to_pdf_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"},"output_filename":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Output Filename"},"direct_download":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Direct Download","default":true},"job_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Job Id"},"pdf_options":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pdf Options"}},"type":"object","required":["file"],"title":"Body_anything_to_pdf_v1_convert_anything_to_pdf_post"},"Body_compress_image_v1_convert_compress_image_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"},"target_size_kb":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Target Size Kb"},"output_filename":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Output Filename"},"direct_download":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Direct Download","default":true},"job_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Job Id"}},"type":"object","required":["file"],"title":"Body_compress_image_v1_convert_compress_image_post"},"Body_csv_to_json_v1_convert_csv_to_json_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"},"output_filename":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Output Filename"},"direct_download":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Direct Download","default":true},"job_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Job Id"}},"type":"object","required":["file"],"title":"Body_csv_to_json_v1_convert_csv_to_json_post"},"Body_csv_to_xml_v1_convert_csv_to_xml_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"},"output_filename":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Output Filename"},"direct_download":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Direct Download","default":true},"job_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Job Id"}},"type":"object","required":["file"],"title":"Body_csv_to_xml_v1_convert_csv_to_xml_post"},"Body_doc_to_pdf_v1_convert_doc_to_pdf_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"},"output_filename":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Output Filename"},"direct_download":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Direct Download","default":true},"job_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Job Id"},"pdf_options":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pdf Options"}},"type":"object","required":["file"],"title":"Body_doc_to_pdf_v1_convert_doc_to_pdf_post"},"Body_excel_to_pdf_v1_convert_excel_to_pdf_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"},"output_filename":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Output Filename"},"direct_download":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Direct Download","default":true},"job_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Job Id"},"pdf_options":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pdf Options"}},"type":"object","required":["file"],"title":"Body_excel_to_pdf_v1_convert_excel_to_pdf_post"},"Body_extract_text_ocr_v1_convert_ocr_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"},"output_filename":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Output Filename"},"direct_download":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Direct Download","default":true},"job_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Job Id"}},"type":"object","required":["file"],"title":"Body_extract_text_ocr_v1_convert_ocr_post"},"Body_generate_thumbnail_v1_convert_thumbnail_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"},"output_filename":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Output Filename"},"direct_download":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Direct Download","default":true},"job_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Job Id"}},"type":"object","required":["file"],"title":"Body_generate_thumbnail_v1_convert_thumbnail_post"},"Body_heic_to_jpeg_v1_convert_heic_to_jpeg_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"},"output_filename":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Output Filename"},"direct_download":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Direct Download","default":true},"job_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Job Id"}},"type":"object","required":["file"],"title":"Body_heic_to_jpeg_v1_convert_heic_to_jpeg_post"},"Body_heic_to_png_v1_convert_heic_to_png_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"},"output_filename":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Output Filename"},"direct_download":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Direct Download","default":true},"job_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Job Id"}},"type":"object","required":["file"],"title":"Body_heic_to_png_v1_convert_heic_to_png_post"},"Body_heic_to_svg_v1_convert_heic_to_svg_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"},"output_filename":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Output Filename"},"direct_download":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Direct Download","default":true},"job_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Job Id"}},"type":"object","required":["file"],"title":"Body_heic_to_svg_v1_convert_heic_to_svg_post"},"Body_heic_to_webp_v1_convert_heic_to_webp_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"},"output_filename":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Output Filename"},"direct_download":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Direct Download","default":true},"job_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Job Id"}},"type":"object","required":["file"],"title":"Body_heic_to_webp_v1_convert_heic_to_webp_post"},"Body_html_to_pdf_v1_convert_html_to_pdf_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"},"output_filename":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Output Filename"},"direct_download":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Direct Download","default":true},"job_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Job Id"},"pdf_options":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pdf Options"}},"type":"object","required":["file"],"title":"Body_html_to_pdf_v1_convert_html_to_pdf_post"},"Body_ingest_files_v2_ingest_files_post":{"properties":{"files":{"items":{"type":"string","format":"binary"},"type":"array","title":"Files","description":"Documents to ingest."},"max_words":{"type":"integer","title":"Max Words","default":512},"sentence_overlap":{"type":"integer","title":"Sentence Overlap","default":1},"webhook_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Webhook Url"}},"type":"object","required":["files"],"title":"Body_ingest_files_v2_ingest_files_post"},"Body_jpeg_to_heic_v1_convert_jpeg_to_heic_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"},"output_filename":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Output Filename"},"direct_download":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Direct Download","default":true},"job_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Job Id"}},"type":"object","required":["file"],"title":"Body_jpeg_to_heic_v1_convert_jpeg_to_heic_post"},"Body_jpeg_to_png_v1_convert_jpeg_to_png_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"},"output_filename":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Output Filename"},"direct_download":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Direct Download","default":true},"job_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Job Id"}},"type":"object","required":["file"],"title":"Body_jpeg_to_png_v1_convert_jpeg_to_png_post"},"Body_jpeg_to_svg_v1_convert_jpeg_to_svg_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"},"output_filename":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Output Filename"},"direct_download":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Direct Download","default":true},"job_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Job Id"}},"type":"object","required":["file"],"title":"Body_jpeg_to_svg_v1_convert_jpeg_to_svg_post"},"Body_jpeg_to_webp_v1_convert_jpeg_to_webp_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"},"output_filename":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Output Filename"},"direct_download":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Direct Download","default":true},"job_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Job Id"}},"type":"object","required":["file"],"title":"Body_jpeg_to_webp_v1_convert_jpeg_to_webp_post"},"Body_json_to_csv_v1_convert_json_to_csv_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"},"output_filename":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Output Filename"},"direct_download":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Direct Download","default":true},"job_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Job Id"}},"type":"object","required":["file"],"title":"Body_json_to_csv_v1_convert_json_to_csv_post"},"Body_json_to_toml_v1_convert_json_to_toml_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"},"output_filename":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Output Filename"},"direct_download":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Direct Download","default":true},"job_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Job Id"}},"type":"object","required":["file"],"title":"Body_json_to_toml_v1_convert_json_to_toml_post"},"Body_json_to_xml_v1_convert_json_to_xml_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"},"output_filename":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Output Filename"},"direct_download":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Direct Download","default":true},"job_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Job Id"}},"type":"object","required":["file"],"title":"Body_json_to_xml_v1_convert_json_to_xml_post"},"Body_json_to_yaml_v1_convert_json_to_yaml_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"},"output_filename":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Output Filename"},"direct_download":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Direct Download","default":true},"job_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Job Id"}},"type":"object","required":["file"],"title":"Body_json_to_yaml_v1_convert_json_to_yaml_post"},"Body_markdown_to_html_v1_convert_markdown_to_html_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"},"output_filename":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Output Filename"},"direct_download":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Direct Download","default":true},"job_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Job Id"}},"type":"object","required":["file"],"title":"Body_markdown_to_html_v1_convert_markdown_to_html_post"},"Body_markdown_to_pdf_v1_convert_markdown_to_pdf_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"},"output_filename":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Output Filename"},"direct_download":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Direct Download","default":true},"job_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Job Id"},"pdf_options":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pdf Options"}},"type":"object","required":["file"],"title":"Body_markdown_to_pdf_v1_convert_markdown_to_pdf_post"},"Body_numbers_to_pdf_v1_convert_numbers_to_pdf_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"},"output_filename":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Output Filename"},"direct_download":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Direct Download","default":true},"job_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Job Id"},"pdf_options":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pdf Options"}},"type":"object","required":["file"],"title":"Body_numbers_to_pdf_v1_convert_numbers_to_pdf_post"},"Body_odp_to_pdf_v1_convert_odp_to_pdf_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"},"output_filename":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Output Filename"},"direct_download":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Direct Download","default":true},"job_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Job Id"},"pdf_options":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pdf Options"}},"type":"object","required":["file"],"title":"Body_odp_to_pdf_v1_convert_odp_to_pdf_post"},"Body_ods_to_pdf_v1_convert_ods_to_pdf_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"},"output_filename":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Output Filename"},"direct_download":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Direct Download","default":true},"job_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Job Id"},"pdf_options":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pdf Options"}},"type":"object","required":["file"],"title":"Body_ods_to_pdf_v1_convert_ods_to_pdf_post"},"Body_odt_to_pdf_v1_convert_odt_to_pdf_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"},"output_filename":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Output Filename"},"direct_download":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Direct Download","default":true},"job_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Job Id"},"pdf_options":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pdf Options"}},"type":"object","required":["file"],"title":"Body_odt_to_pdf_v1_convert_odt_to_pdf_post"},"Body_ots_to_pdf_v1_convert_ots_to_pdf_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"},"output_filename":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Output Filename"},"direct_download":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Direct Download","default":true},"job_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Job Id"},"pdf_options":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pdf Options"}},"type":"object","required":["file"],"title":"Body_ots_to_pdf_v1_convert_ots_to_pdf_post"},"Body_pages_to_pdf_v1_convert_pages_to_pdf_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"},"output_filename":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Output Filename"},"direct_download":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Direct Download","default":true},"job_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Job Id"},"pdf_options":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pdf Options"}},"type":"object","required":["file"],"title":"Body_pages_to_pdf_v1_convert_pages_to_pdf_post"},"Body_pdf_to_jpeg_v1_convert_pdf_to_jpeg_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"},"output_filename":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Output Filename"},"direct_download":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Direct Download","default":true},"job_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Job Id"}},"type":"object","required":["file"],"title":"Body_pdf_to_jpeg_v1_convert_pdf_to_jpeg_post"},"Body_png_to_heic_v1_convert_png_to_heic_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"},"output_filename":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Output Filename"},"direct_download":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Direct Download","default":true},"job_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Job Id"}},"type":"object","required":["file"],"title":"Body_png_to_heic_v1_convert_png_to_heic_post"},"Body_png_to_jpeg_v1_convert_png_to_jpeg_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"},"output_filename":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Output Filename"},"direct_download":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Direct Download","default":true},"job_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Job Id"}},"type":"object","required":["file"],"title":"Body_png_to_jpeg_v1_convert_png_to_jpeg_post"},"Body_png_to_svg_v1_convert_png_to_svg_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"},"output_filename":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Output Filename"},"direct_download":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Direct Download","default":true},"job_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Job Id"}},"type":"object","required":["file"],"title":"Body_png_to_svg_v1_convert_png_to_svg_post"},"Body_png_to_webp_v1_convert_png_to_webp_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"},"output_filename":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Output Filename"},"direct_download":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Direct Download","default":true},"job_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Job Id"}},"type":"object","required":["file"],"title":"Body_png_to_webp_v1_convert_png_to_webp_post"},"Body_ppt_to_pdf_v1_convert_ppt_to_pdf_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"},"output_filename":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Output Filename"},"direct_download":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Direct Download","default":true},"job_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Job Id"},"pdf_options":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pdf Options"}},"type":"object","required":["file"],"title":"Body_ppt_to_pdf_v1_convert_ppt_to_pdf_post"},"Body_svg_to_heic_v1_convert_svg_to_heic_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"},"output_filename":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Output Filename"},"direct_download":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Direct Download","default":true},"job_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Job Id"}},"type":"object","required":["file"],"title":"Body_svg_to_heic_v1_convert_svg_to_heic_post"},"Body_svg_to_jpeg_v1_convert_svg_to_jpeg_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"},"width":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Width"},"height":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Height"},"output_filename":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Output Filename"},"direct_download":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Direct Download","default":true},"job_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Job Id"}},"type":"object","required":["file"],"title":"Body_svg_to_jpeg_v1_convert_svg_to_jpeg_post"},"Body_svg_to_png_v1_convert_svg_to_png_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"},"width":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Width"},"height":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Height"},"output_filename":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Output Filename"},"direct_download":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Direct Download","default":true},"job_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Job Id"}},"type":"object","required":["file"],"title":"Body_svg_to_png_v1_convert_svg_to_png_post"},"Body_svg_to_webp_v1_convert_svg_to_webp_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"},"width":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Width"},"height":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Height"},"output_filename":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Output Filename"},"direct_download":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Direct Download","default":true},"job_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Job Id"}},"type":"object","required":["file"],"title":"Body_svg_to_webp_v1_convert_svg_to_webp_post"},"Body_synthesize_speech_v1_convert_text_to_speech_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"},"output_filename":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Output Filename"},"direct_download":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Direct Download","default":true},"job_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Job Id"}},"type":"object","required":["file"],"title":"Body_synthesize_speech_v1_convert_text_to_speech_post"},"Body_toml_to_json_v1_convert_toml_to_json_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"},"output_filename":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Output Filename"},"direct_download":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Direct Download","default":true},"job_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Job Id"}},"type":"object","required":["file"],"title":"Body_toml_to_json_v1_convert_toml_to_json_post"},"Body_transcode_video_v1_convert_video_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"},"output_filename":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Output Filename"},"direct_download":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Direct Download","default":true},"job_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Job Id"}},"type":"object","required":["file"],"title":"Body_transcode_video_v1_convert_video_post"},"Body_transcribe_audio_v1_convert_speech_to_text_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"},"output_filename":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Output Filename"},"direct_download":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Direct Download","default":true},"job_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Job Id"}},"type":"object","required":["file"],"title":"Body_transcribe_audio_v1_convert_speech_to_text_post"},"Body_upload_capture_v1_extension_capture_post":{"properties":{"capture_type":{"type":"string","title":"Capture Type"},"source_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Url"},"page_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Page Title"},"file_size":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"File Size"},"output_filename":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Output Filename"},"store_file":{"type":"boolean","title":"Store File","default":false},"file":{"anyOf":[{"type":"string","format":"binary"},{"type":"null"}],"title":"File"}},"type":"object","required":["capture_type"],"title":"Body_upload_capture_v1_extension_capture_post"},"Body_webp_to_heic_v1_convert_webp_to_heic_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"},"output_filename":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Output Filename"},"direct_download":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Direct Download","default":true},"job_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Job Id"}},"type":"object","required":["file"],"title":"Body_webp_to_heic_v1_convert_webp_to_heic_post"},"Body_webp_to_jpeg_v1_convert_webp_to_jpeg_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"},"output_filename":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Output Filename"},"direct_download":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Direct Download","default":true},"job_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Job Id"}},"type":"object","required":["file"],"title":"Body_webp_to_jpeg_v1_convert_webp_to_jpeg_post"},"Body_webp_to_png_v1_convert_webp_to_png_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"},"output_filename":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Output Filename"},"direct_download":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Direct Download","default":true},"job_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Job Id"}},"type":"object","required":["file"],"title":"Body_webp_to_png_v1_convert_webp_to_png_post"},"Body_webp_to_svg_v1_convert_webp_to_svg_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"},"output_filename":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Output Filename"},"direct_download":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Direct Download","default":true},"job_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Job Id"}},"type":"object","required":["file"],"title":"Body_webp_to_svg_v1_convert_webp_to_svg_post"},"Body_xml_to_csv_v1_convert_xml_to_csv_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"},"output_filename":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Output Filename"},"direct_download":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Direct Download","default":true},"job_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Job Id"}},"type":"object","required":["file"],"title":"Body_xml_to_csv_v1_convert_xml_to_csv_post"},"Body_xml_to_json_v1_convert_xml_to_json_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"},"output_filename":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Output Filename"},"direct_download":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Direct Download","default":true},"job_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Job Id"}},"type":"object","required":["file"],"title":"Body_xml_to_json_v1_convert_xml_to_json_post"},"Body_yaml_to_json_v1_convert_yaml_to_json_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"},"output_filename":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Output Filename"},"direct_download":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Direct Download","default":true},"job_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Job Id"}},"type":"object","required":["file"],"title":"Body_yaml_to_json_v1_convert_yaml_to_json_post"},"BrandingResponse":{"properties":{"required":{"type":"boolean","title":"Required"}},"type":"object","required":["required"],"title":"BrandingResponse"},"ChunkOptions":{"properties":{"max_words":{"type":"integer","maximum":4000.0,"minimum":32.0,"title":"Max Words","description":"Soft cap on words per chunk. Code blocks and tables stay atomic and may exceed this.","default":512},"sentence_overlap":{"type":"integer","maximum":10.0,"minimum":0.0,"title":"Sentence Overlap","description":"Sentences repeated between consecutive prose chunks of the same section (0 disables overlap).","default":1}},"additionalProperties":false,"type":"object","title":"ChunkOptions","description":"Heading-aware chunker parameters (bounds mirror chunking.semantic)."},"CssField":{"properties":{"name":{"type":"string","maxLength":128,"minLength":1,"title":"Name"},"type":{"type":"string","enum":["text","attribute","html","regex","nested","list","nested_list"],"title":"Type"},"selector":{"anyOf":[{"type":"string","maxLength":1024},{"type":"null"}],"title":"Selector"},"attribute":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Attribute"},"pattern":{"anyOf":[{"type":"string","maxLength":1024},{"type":"null"}],"title":"Pattern"},"default":{"anyOf":[{},{"type":"null"}],"title":"Default"},"transform":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Transform"},"fields":{"anyOf":[{"items":{"$ref":"#/components/schemas/CssField"},"type":"array","maxItems":64},{"type":"null"}],"title":"Fields"}},"additionalProperties":false,"type":"object","required":["name","type"],"title":"CssField","description":"One field in a Crawl4AI CSS extraction schema.\n\nMirrors the library's field dict (``name``, ``selector``, ``type``,\n``attribute``, ``pattern``, ``default``, ``fields``) so it serializes\nstraight through ``to_crawl4ai`` with no re-mapping. ``fields`` makes\nthe model recursive for ``nested`` / ``list`` / ``nested_list``."},"CssSchema":{"properties":{"baseSelector":{"type":"string","maxLength":1024,"minLength":1,"title":"Baseselector"},"fields":{"items":{"$ref":"#/components/schemas/CssField"},"type":"array","maxItems":128,"minItems":1,"title":"Fields"},"name":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Name"},"target_field":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Target Field","description":"Top-level output-schema property the CSS records fill. Array property -> full list; scalar/object property -> first record. Inferred when omitted and the schema has one array property."}},"additionalProperties":false,"type":"object","required":["baseSelector","fields"],"title":"CssSchema","description":"A Crawl4AI CSS extraction schema (no-LLM, free first pass).\n\n``base_selector`` matches the repeating container (one extracted\nrecord per match); ``fields`` are read out of each. ``target_field``\nnames the top-level output-schema property the records fill — an\narray property receives the full list, a scalar/object property the\nfirst record. When omitted, the flow infers the single array property\nif there is exactly one."},"DiscoverFrom":{"properties":{"url":{"type":"string","maxLength":2048,"title":"Url"},"mode":{"type":"string","enum":["sitemap","crawl","hybrid"],"title":"Mode","default":"hybrid"},"max_pages":{"type":"integer","maximum":50.0,"minimum":1.0,"title":"Max Pages","description":"Cap on URLs discovered AND distilled. Each is a full render, so this is bounded by MAX_DISTILL_URLS.","default":10}},"additionalProperties":false,"type":"object","required":["url"],"title":"DiscoverFrom","description":"Crawl-then-distill source: discover a site's URLs, then distill each."},"DiscoverRequest":{"properties":{"url":{"type":"string","maxLength":2048,"title":"Url"},"mode":{"type":"string","enum":["sitemap","crawl","hybrid"],"title":"Mode","default":"hybrid"},"max_urls":{"type":"integer","maximum":1000.0,"minimum":1.0,"title":"Max Urls","default":100},"max_depth":{"type":"integer","maximum":5.0,"minimum":1.0,"title":"Max Depth","default":2},"include_patterns":{"items":{"type":"string"},"type":"array","maxItems":50,"title":"Include Patterns","description":"Regex (re.search) allowlist; a URL must match at least one to be returned. Empty = allow all."},"exclude_patterns":{"items":{"type":"string"},"type":"array","maxItems":50,"title":"Exclude Patterns","description":"Regex (re.search) denylist; a URL matching any is dropped. Applied after include_patterns."},"same_domain_only":{"type":"boolean","title":"Same Domain Only","default":true},"respect_robots":{"type":"boolean","title":"Respect Robots","description":"When true, robots.txt Disallow rules are applied to the RETURNED list (disallowed URLs are dropped). NOTE: crawl4ai 0.8.9 has no native robots gate, so in crawl/hybrid mode pages may still be fetched over HTTP and then discarded — robots is enforced at output-filter time, not fetch time.","default":false},"render_js":{"type":"string","enum":["auto","never","always"],"title":"Render Js","description":"Browser-rendered discovery for JS/SPA sites (crawl/hybrid modes only). 'auto' renders only when the HTTP-only crawl returns a JS shell (<=1 URL); 'always' forces a bounded browser crawl; 'never' disables it. Uses the singleton Chromium, so it is capped to a few pages (DISCOVER_JS_MAX_PAGES).","default":"auto"}},"additionalProperties":false,"type":"object","required":["url"],"title":"DiscoverRequest","description":"One /v2/discover request (plan section 4).\n\n``extra=\"forbid\"``: unknown keys 422 with the field name instead of\nbeing silently dropped (2026-08-06 QA root-cause report, fix A1)."},"DiscoverResponse":{"properties":{"url":{"type":"string","title":"Url"},"mode":{"type":"string","enum":["sitemap","crawl","hybrid"],"title":"Mode"},"total":{"type":"integer","title":"Total"},"urls":{"items":{"type":"string"},"type":"array","title":"Urls"},"pages_crawled":{"type":"integer","title":"Pages Crawled","default":0},"truncated":{"type":"boolean","title":"Truncated","description":"True when more URLs were discovered than max_urls allowed; the list was capped.","default":false},"robots_respected":{"type":"boolean","title":"Robots Respected","default":false},"sources":{"additionalProperties":{"type":"integer"},"type":"object","title":"Sources","description":"Raw URL count contributed by each source before dedup/filter, e.g. {'sitemap': 42, 'crawl': 30}."},"warnings":{"items":{"type":"string"},"type":"array","title":"Warnings"}},"type":"object","required":["url","mode","total"],"title":"DiscoverResponse","description":"Flat URL list + provenance for one /v2/discover call."},"DistillItemResult":{"additionalProperties":true,"type":"object"},"DistillRequest":{"properties":{"urls":{"anyOf":[{"items":{"type":"string"},"type":"array","maxItems":50},{"type":"null"}],"title":"Urls","description":"Explicit URLs to distill. Mutually exclusive with discover_from; exactly one is required."},"discover_from":{"anyOf":[{"$ref":"#/components/schemas/DiscoverFrom"},{"type":"null"}]},"schema":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Schema","description":"Output shape: a JSON-Schema object or a flat {field: description} map. The response data is guaranteed to match this shape. Optional when 'prompt' is supplied — the schema is then synthesized from the prompt."},"prompt":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Prompt","description":"Natural-language description of what to extract. When given without a 'schema', the extraction schema is synthesized from this prompt (single-model LLM). Ignored when 'schema' is present."},"css_schema":{"anyOf":[{"$ref":"#/components/schemas/CssSchema"},{"type":"null"}]},"wait_for":{"anyOf":[{"type":"string","maxLength":1024},{"type":"null"}],"title":"Wait For"},"wait_timeout_ms":{"type":"integer","maximum":60000.0,"minimum":0.0,"title":"Wait Timeout Ms","default":30000},"headers":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Headers"},"cookies":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Cookies"},"respect_robots":{"type":"boolean","title":"Respect Robots","default":false}},"additionalProperties":false,"type":"object","title":"DistillRequest","description":"One /v2/distill request (plan section 4 / section 8 Task H.5)."},"DistillResponse":{"properties":{"operation_id":{"type":"string","title":"Operation Id"},"total":{"type":"integer","title":"Total","default":0},"completed":{"type":"integer","title":"Completed","default":0},"failed":{"type":"integer","title":"Failed","default":0},"results":{"items":{"$ref":"#/components/schemas/DistillItemResult"},"type":"array","title":"Results"},"total_cost_cents":{"type":"number","title":"Total Cost Cents","default":0.0},"synthesized_schema":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Synthesized Schema","description":"When 'prompt' was used without a 'schema', the schema that was synthesized from the prompt and used for extraction."},"warnings":{"items":{"type":"string"},"type":"array","title":"Warnings"}},"type":"object","required":["operation_id"],"title":"DistillResponse","description":"Schema-driven extraction results for one /v2/distill call."},"DistillTokens":{"properties":{"input":{"type":"integer","title":"Input","default":0},"output":{"type":"integer","title":"Output","default":0}},"type":"object","title":"DistillTokens"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"IngestJobListResponse":{"properties":{"jobs":{"items":{"$ref":"#/components/schemas/IngestJobSummary"},"type":"array","title":"Jobs"},"skip":{"type":"integer","title":"Skip","default":0},"limit":{"type":"integer","title":"Limit","default":20},"has_more":{"type":"boolean","title":"Has More","description":"True when more jobs exist beyond this page.","default":false}},"type":"object","title":"IngestJobListResponse","description":"One newest-first page of a project's ingest jobs (Task H.8)."},"IngestJobResponse":{"properties":{"job_id":{"type":"string","title":"Job Id"},"status":{"type":"string","enum":["queued","discovering","processing","completed","failed","canceled"],"title":"Status"},"mode":{"type":"string","enum":["urls","sitemap","crawl","files"],"title":"Mode"},"pages_discovered":{"type":"integer","title":"Pages Discovered","default":0},"pages_found":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Pages Found","description":"Unique eligible URLs discovery yielded BEFORE the max_pages cap (sitemap: true unique count; crawl: bounded by the crawl budget, so a lower bound). Absent for explicit-urls jobs and jobs created before migration 026."},"discovery_truncated":{"type":"boolean","title":"Discovery Truncated","description":"True when discovery found more unique URLs than max_pages allowed the job to enqueue.","default":false},"pages_processed":{"type":"integer","title":"Pages Processed","default":0},"pages_failed":{"type":"integer","title":"Pages Failed","default":0},"total_chunks":{"type":"integer","title":"Total Chunks","default":0},"output_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Output Url","description":"Signed URL to the final JSONL; present once completed."},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"webhook_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Webhook Url","description":"Completion-webhook target registered for this job, if any."},"webhook_delivered":{"type":"boolean","title":"Webhook Delivered","description":"True once the signed completion webhook got a 2xx (H.8).","default":false},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completed At"},"warnings":{"items":{"type":"string"},"type":"array","title":"Warnings"}},"type":"object","required":["job_id","status","mode"],"title":"IngestJobResponse","description":"Lifecycle view of one ingest job (POST 202, GET, DELETE all share it)."},"IngestJobSummary":{"properties":{"job_id":{"type":"string","title":"Job Id"},"status":{"type":"string","enum":["queued","discovering","processing","completed","failed","canceled"],"title":"Status"},"mode":{"type":"string","enum":["urls","sitemap","crawl","files"],"title":"Mode"},"pages_discovered":{"type":"integer","title":"Pages Discovered","default":0},"pages_found":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Pages Found"},"discovery_truncated":{"type":"boolean","title":"Discovery Truncated","default":false},"pages_processed":{"type":"integer","title":"Pages Processed","default":0},"pages_failed":{"type":"integer","title":"Pages Failed","default":0},"total_chunks":{"type":"integer","title":"Total Chunks","default":0},"output_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Output Url","description":"Signed URL to the final JSONL; present once completed."},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"webhook_configured":{"type":"boolean","title":"Webhook Configured","description":"True when a completion-webhook URL is registered.","default":false},"webhook_delivered":{"type":"boolean","title":"Webhook Delivered","default":false},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completed At"}},"type":"object","required":["job_id","status","mode"],"title":"IngestJobSummary","description":"Compact job row for the dashboard list (GET /v2/ingest, Task H.8)."},"IngestRequest":{"properties":{"mode":{"type":"string","enum":["urls","sitemap","crawl","files"],"title":"Mode","default":"urls"},"url":{"anyOf":[{"type":"string","maxLength":2048},{"type":"null"}],"title":"Url","description":"Seed URL for sitemap/crawl mode (the site to ingest)."},"urls":{"anyOf":[{"items":{"type":"string"},"type":"array","maxItems":1000},{"type":"null"}],"title":"Urls","description":"Explicit URLs to ingest (urls mode). Mutually exclusive with url."},"max_pages":{"type":"integer","maximum":1000.0,"minimum":1.0,"title":"Max Pages","description":"Cap on URLs discovered AND ingested in sitemap/crawl mode.","default":50},"max_depth":{"type":"integer","maximum":5.0,"minimum":1.0,"title":"Max Depth","default":2},"same_domain_only":{"type":"boolean","title":"Same Domain Only","default":true},"include_patterns":{"items":{"type":"string"},"type":"array","maxItems":50,"title":"Include Patterns"},"exclude_patterns":{"items":{"type":"string"},"type":"array","maxItems":50,"title":"Exclude Patterns"},"respect_robots":{"type":"boolean","title":"Respect Robots","default":false},"wait_for":{"anyOf":[{"type":"string","maxLength":1024},{"type":"null"}],"title":"Wait For"},"wait_timeout_ms":{"type":"integer","maximum":60000.0,"minimum":0.0,"title":"Wait Timeout Ms","default":30000},"only_main_content":{"type":"boolean","title":"Only Main Content","description":"When true (default), each page's markdown strips site chrome (navigation, header, footer, sidebars, cookie banners, hidden nodes) behind a fidelity guard that falls back to the full page when stripping would remove too much real content. When false, the full page is chunked as-is.","default":true},"truncate_data_arrays":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Truncate Data Arrays","description":"Collapse long runs of numeric literals (raw embedding vectors, tensor dumps in notebook output cells) to a leading sample plus a count. Unset (the default) follows only_main_content."},"chunk":{"$ref":"#/components/schemas/ChunkOptions"},"webhook_url":{"anyOf":[{"type":"string","maxLength":2048},{"type":"null"}],"title":"Webhook Url"}},"additionalProperties":false,"type":"object","title":"IngestRequest","description":"One /v2/ingest job request (plan section 4 / section 8 Task H.7)."},"LookupEnrich":{"properties":{"outputs":{"items":{"type":"string","enum":["markdown","html_cleaned","html_raw","screenshot","screenshot_full_page","pdf","links","images","structured"]},"type":"array","maxItems":8,"title":"Outputs","description":"Perceive outputs to produce per enriched result (markdown, html_cleaned, links, screenshot, structured, ...). Defaults to markdown."},"concurrency":{"type":"integer","maximum":5.0,"minimum":1.0,"title":"Concurrency","description":"How many result URLs to enrich in parallel. Markdown/HTML renders use the no-browser TLS path and truly parallelize; screenshot/pdf renders serialize on the shared browser.","default":3},"schema":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Schema","description":"When set, run structured extraction against each enriched result (JSON-Schema object or flat {field: description} map). The extracted data appears under each result's perceive.structured."},"synthesize_answer":{"type":"boolean","title":"Synthesize Answer","description":"Synthesize one cited, grounded answer to the query across the enriched results (LLM). Returned on the response as 'answer'.","default":false},"answer_prompt":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Answer Prompt","description":"Optional question to answer instead of the raw query (only used when synthesize_answer is true)."}},"additionalProperties":false,"type":"object","title":"LookupEnrich","description":"Optional high-value enrichment for /v2/lookup's top-N results.\n\nWhen present (with ``perceive_top > 0``), the top-N result URLs are\nrendered CONCURRENTLY (bounded) in the requested output formats — not just\nmarkdown, and not one-at-a-time — and can additionally run schema-driven\nstructured extraction per result and synthesize one cited answer across\nthem. This is what makes lookup beat a plain \"search + scrape\"."},"LookupRequest":{"properties":{"query":{"type":"string","maxLength":512,"minLength":1,"title":"Query"},"category":{"type":"string","enum":["web","news","images","scholar","patents","maps"],"title":"Category","default":"web"},"country":{"anyOf":[{"type":"string","maxLength":8},{"type":"null"}],"title":"Country","description":"Google 'gl' country code (e.g. 'us', 'in')."},"locale":{"anyOf":[{"type":"string","maxLength":16},{"type":"null"}],"title":"Locale","description":"Google 'hl' interface language (e.g. 'en')."},"time_filter":{"anyOf":[{"type":"string","enum":["hour","day","week","month","year"]},{"type":"null"}],"title":"Time Filter","description":"Restrict to results from the past hour / day / week / month / year."},"num_results":{"type":"integer","maximum":100.0,"minimum":1.0,"title":"Num Results","description":"Serper 'num' page size (results per page).","default":10},"page":{"type":"integer","maximum":10.0,"minimum":1.0,"title":"Page","default":1},"location":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Location","description":"Full-text location string (e.g. 'Austin, Texas')."},"autocorrect":{"type":"boolean","title":"Autocorrect","default":true},"perceive_top":{"type":"integer","maximum":10.0,"minimum":0.0,"title":"Perceive Top","description":"Auto-perceive the top-N result URLs through /v2/perceive. Each one is a full browser render that runs sequentially through the shared singleton and consumes one perceive operation from your quota, so this is capped low; use /v2/perceive/batch for larger sets. 0 disables auto-perceive.","default":0},"enrich":{"anyOf":[{"$ref":"#/components/schemas/LookupEnrich"},{"type":"null"}],"description":"High-value enrichment tuning for the top-N results (concurrent multi-format rendering, structured extraction, and a synthesized cited answer). When omitted, perceive_top keeps its legacy behavior: markdown-only, one result at a time."}},"additionalProperties":false,"type":"object","required":["query"],"title":"LookupRequest","description":"One /v2/lookup request (plan section 4 / section 8 Task H.3).\n\n``extra=\"forbid\"``: unknown keys 422 with the field name instead of\nbeing silently dropped (2026-08-06 QA root-cause report, fix A1)."},"LookupResponse":{"properties":{"lookup_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Lookup Id","description":"ch_lookup_queries row id for support correlation (null if the audit write failed; the results are still valid)."},"query":{"type":"string","title":"Query"},"category":{"type":"string","enum":["web","news","images","scholar","patents","maps"],"title":"Category"},"country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country"},"locale":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Locale"},"time_filter":{"anyOf":[{"type":"string","enum":["hour","day","week","month","year"]},{"type":"null"}],"title":"Time Filter"},"total":{"type":"integer","title":"Total","default":0},"results":{"items":{"$ref":"#/components/schemas/LookupResult"},"type":"array","title":"Results"},"perceive_top":{"type":"integer","title":"Perceive Top","description":"How many results were actually perceived (<= the requested perceive_top; lower if quota ran out or URLs failed).","default":0},"perceive_operation_ids":{"items":{"type":"string"},"type":"array","title":"Perceive Operation Ids"},"answer_box":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Answer Box"},"knowledge_graph":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Knowledge Graph"},"answer":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Answer","description":"Synthesized cited answer across the enriched results (present only when enrich.synthesize_answer is true and it succeeded)."},"answer_sources":{"items":{"type":"string"},"type":"array","title":"Answer Sources","description":"URLs used as grounding for 'answer', in citation order."},"credits":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Credits","description":"Serper credits consumed by this query."},"cost_cents":{"type":"number","title":"Cost Cents","default":0.0},"warnings":{"items":{"type":"string"},"type":"array","title":"Warnings"}},"type":"object","required":["query","category"],"title":"LookupResponse","description":"Search results + provenance for one /v2/lookup call."},"LookupResult":{"properties":{"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"snippet":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Snippet"},"position":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Position"},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"},"date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Date"},"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url"},"thumbnail_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thumbnail Url"},"extra":{"additionalProperties":true,"type":"object","title":"Extra"},"perceive":{"anyOf":[{"$ref":"#/components/schemas/PerceiveResponse"},{"type":"null"}],"description":"Present only for the top-N results when perceive_top > 0 and the perception succeeded."}},"type":"object","title":"LookupResult","description":"One provider-neutral search hit, optionally perceived."},"OutputArtifact":{"properties":{"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url","description":"Pre-signed download URL (15 min)."},"object_key":{"type":"string","title":"Object Key"},"size_bytes":{"type":"integer","title":"Size Bytes","default":0},"content_type":{"type":"string","title":"Content Type","default":"application/octet-stream"},"expires_in":{"type":"integer","title":"Expires In","default":900}},"type":"object","required":["object_key"],"title":"OutputArtifact","description":"A rendered output stored in Spaces, addressed by signed URL only."},"PdfHeaderFooter":{"properties":{"content":{"type":"string","title":"Content","default":""},"height":{"type":"number","title":"Height","default":15}},"type":"object","title":"PdfHeaderFooter"},"PdfMargins":{"properties":{"top":{"type":"number","title":"Top","default":10},"bottom":{"type":"number","title":"Bottom","default":10},"left":{"type":"number","title":"Left","default":10},"right":{"type":"number","title":"Right","default":10}},"type":"object","title":"PdfMargins"},"PdfOptions":{"properties":{"page_size":{"type":"string","title":"Page Size","default":"A4"},"page_width":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Page Width"},"page_height":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Page Height"},"orientation":{"type":"string","title":"Orientation","default":"portrait"},"margins":{"$ref":"#/components/schemas/PdfMargins","default":{"top":10.0,"bottom":10.0,"left":10.0,"right":10.0}},"scale":{"type":"number","title":"Scale","default":1.0},"grayscale":{"type":"boolean","title":"Grayscale","default":false},"header":{"anyOf":[{"$ref":"#/components/schemas/PdfHeaderFooter"},{"type":"null"}]},"footer":{"anyOf":[{"$ref":"#/components/schemas/PdfHeaderFooter"},{"type":"null"}]}},"type":"object","title":"PdfOptions"},"PerceiveAuth":{"properties":{"username":{"type":"string","maxLength":256,"minLength":1,"title":"Username"},"password":{"type":"string","maxLength":256,"minLength":1,"title":"Password"}},"additionalProperties":false,"type":"object","required":["username","password"],"title":"PerceiveAuth"},"PerceiveBatchRequest":{"properties":{"urls":{"items":{"type":"string"},"type":"array","maxItems":1000,"minItems":1,"title":"Urls"},"options":{"$ref":"#/components/schemas/PerceiveOptionsBase"},"output_mode":{"type":"string","enum":["manifest","zip"],"title":"Output Mode","default":"manifest"}},"additionalProperties":false,"type":"object","required":["urls"],"title":"PerceiveBatchRequest","description":"POST /v2/perceive/batch (Task F.8, no-GCP revision).\n\n``urls`` share one ``options`` block; each URL becomes a full\nPerceiveRequest. The plan's batch_limit gates the count; 1000 is a\nschema-level backstop above every plan limit."},"PerceiveBatchResponse":{"properties":{"job_id":{"type":"string","title":"Job Id"},"status":{"type":"string","enum":["queued","processing","completed","failed","partial","canceled"],"title":"Status"},"output_mode":{"type":"string","enum":["manifest","zip"],"title":"Output Mode","default":"manifest"},"total":{"type":"integer","title":"Total"},"completed":{"type":"integer","title":"Completed","default":0},"failed":{"type":"integer","title":"Failed","default":0},"pending":{"type":"integer","title":"Pending","default":0},"zip":{"anyOf":[{"$ref":"#/components/schemas/OutputArtifact"},{"type":"null"}]},"items":{"items":{"$ref":"#/components/schemas/PerceiveResponse"},"type":"array","title":"Items"},"warnings":{"items":{"type":"string"},"type":"array","title":"Warnings"}},"type":"object","required":["job_id","status","total"],"title":"PerceiveBatchResponse","description":"Shared by POST (inline 200 / queued 202) and the status GET.\n\n``items`` carry one PerceiveResponse per URL: fully populated on the\ninline path and on status polls; empty on the initial 202 (poll the\nstatus endpoint with ``job_id``). ``zip`` appears once a\n``output_mode=\"zip\"`` batch has bundled its artifacts."},"PerceiveOptionsBase":{"properties":{"outputs":{"items":{"type":"string","enum":["markdown","html_cleaned","html_raw","screenshot","screenshot_full_page","pdf","links","images","structured"]},"type":"array","title":"Outputs"},"only_main_content":{"type":"boolean","title":"Only Main Content","description":"When true (default), the markdown output and the main_content extract strip site chrome (navigation, header, footer, sidebars, cookie banners, hidden nodes) behind a fidelity guard that falls back to the full page when stripping would remove too much real content. When false, the full page content is kept with no stripping.","default":true},"truncate_data_arrays":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Truncate Data Arrays","description":"Collapse long runs of numeric literals (raw embedding vectors, tensor dumps in notebook output cells) to a leading sample plus a count. Unset (the default) follows only_main_content: on when the page is being curated, off when the caller asked for the page as-is. Set true/false to control it explicitly."},"allow_degraded":{"type":"boolean","title":"Allow Degraded","description":"Deprecated and ignored. A content-free anti-bot block now always returns 200 with is_blocked=true, the render-quality deductions and no artifacts (it is not billed). Sending true adds a deprecation warning to the response.","default":false},"direct_download":{"type":"boolean","title":"Direct Download","description":"When true, the response body IS the artifact bytes (no second fetch to a signed URL). Requires exactly one artifact-producing output. Not available on the batch endpoint (use output_mode='zip' there).","default":false},"extract":{"items":{"type":"string","enum":["tables","prices","contacts","metadata","main_content","headings","structured_data","technologies","all"]},"type":"array","title":"Extract"},"schema":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Schema","description":"JSON schema for structured extraction (Tier-3 LLM path lands in Sprint F.6; accepted and stored today)."},"wait_for":{"anyOf":[{"type":"string","maxLength":1024},{"type":"null"}],"title":"Wait For","description":"CSS selector (optionally 'css:...') or 'js:<expr>' to await after navigation."},"wait_timeout_ms":{"type":"integer","maximum":60000.0,"minimum":0.0,"title":"Wait Timeout Ms","default":30000},"js_code":{"anyOf":[{"type":"string","maxLength":20000},{"type":"null"}],"title":"Js Code"},"viewport":{"anyOf":[{"$ref":"#/components/schemas/PerceiveViewport"},{"type":"null"}]},"headers":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Headers"},"cookies":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Cookies"},"auth":{"anyOf":[{"$ref":"#/components/schemas/PerceiveAuth"},{"type":"null"}]},"proxy_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Proxy Url","description":"Business+; not yet available (422)."},"geolocation":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Geolocation","description":"Not yet available (422)."},"action_chain":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Action Chain","description":"Not yet available (422)."},"cache_mode":{"type":"string","enum":["enabled","bypass","refresh"],"title":"Cache Mode","default":"enabled"},"pdf_options":{"anyOf":[{"$ref":"#/components/schemas/PdfOptions"},{"type":"null"}]},"block_resources":{"items":{"type":"string","enum":["image","media","font","stylesheet","script","xhr","fetch","websocket","manifest","other"]},"type":"array","title":"Block Resources"},"respect_robots":{"type":"boolean","title":"Respect Robots","default":false},"mobile":{"type":"boolean","title":"Mobile","default":false}},"additionalProperties":false,"type":"object","title":"PerceiveOptionsBase","description":"Per-render options shared by /v2/perceive and the batch endpoint.\n\n``extra=\"forbid\"``: an unknown key is a 422 naming the field, never a\nsilent no-op. The 2026-08-06 QA cycle filed 22 findings against a\n``content_only`` parameter this API never had, because the schema\nsilently swallowed it — an unknown key MUST fail loudly."},"PerceiveRequest":{"properties":{"outputs":{"items":{"type":"string","enum":["markdown","html_cleaned","html_raw","screenshot","screenshot_full_page","pdf","links","images","structured"]},"type":"array","title":"Outputs"},"only_main_content":{"type":"boolean","title":"Only Main Content","description":"When true (default), the markdown output and the main_content extract strip site chrome (navigation, header, footer, sidebars, cookie banners, hidden nodes) behind a fidelity guard that falls back to the full page when stripping would remove too much real content. When false, the full page content is kept with no stripping.","default":true},"truncate_data_arrays":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Truncate Data Arrays","description":"Collapse long runs of numeric literals (raw embedding vectors, tensor dumps in notebook output cells) to a leading sample plus a count. Unset (the default) follows only_main_content: on when the page is being curated, off when the caller asked for the page as-is. Set true/false to control it explicitly."},"allow_degraded":{"type":"boolean","title":"Allow Degraded","description":"Deprecated and ignored. A content-free anti-bot block now always returns 200 with is_blocked=true, the render-quality deductions and no artifacts (it is not billed). Sending true adds a deprecation warning to the response.","default":false},"direct_download":{"type":"boolean","title":"Direct Download","description":"When true, the response body IS the artifact bytes (no second fetch to a signed URL). Requires exactly one artifact-producing output. Not available on the batch endpoint (use output_mode='zip' there).","default":false},"extract":{"items":{"type":"string","enum":["tables","prices","contacts","metadata","main_content","headings","structured_data","technologies","all"]},"type":"array","title":"Extract"},"schema":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Schema","description":"JSON schema for structured extraction (Tier-3 LLM path lands in Sprint F.6; accepted and stored today)."},"wait_for":{"anyOf":[{"type":"string","maxLength":1024},{"type":"null"}],"title":"Wait For","description":"CSS selector (optionally 'css:...') or 'js:<expr>' to await after navigation."},"wait_timeout_ms":{"type":"integer","maximum":60000.0,"minimum":0.0,"title":"Wait Timeout Ms","default":30000},"js_code":{"anyOf":[{"type":"string","maxLength":20000},{"type":"null"}],"title":"Js Code"},"viewport":{"anyOf":[{"$ref":"#/components/schemas/PerceiveViewport"},{"type":"null"}]},"headers":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Headers"},"cookies":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Cookies"},"auth":{"anyOf":[{"$ref":"#/components/schemas/PerceiveAuth"},{"type":"null"}]},"proxy_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Proxy Url","description":"Business+; not yet available (422)."},"geolocation":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Geolocation","description":"Not yet available (422)."},"action_chain":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Action Chain","description":"Not yet available (422)."},"cache_mode":{"type":"string","enum":["enabled","bypass","refresh"],"title":"Cache Mode","default":"enabled"},"pdf_options":{"anyOf":[{"$ref":"#/components/schemas/PdfOptions"},{"type":"null"}]},"block_resources":{"items":{"type":"string","enum":["image","media","font","stylesheet","script","xhr","fetch","websocket","manifest","other"]},"type":"array","title":"Block Resources"},"respect_robots":{"type":"boolean","title":"Respect Robots","default":false},"mobile":{"type":"boolean","title":"Mobile","default":false},"url":{"type":"string","maxLength":2048,"title":"Url"}},"additionalProperties":false,"type":"object","required":["url"],"title":"PerceiveRequest"},"PerceiveResponse":{"properties":{"operation_id":{"type":"string","title":"Operation Id"},"status":{"type":"string","enum":["queued","processing","completed","failed"],"title":"Status"},"url":{"type":"string","title":"Url"},"url_final":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url Final"},"content_hash":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content Hash"},"status_code":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Status Code","description":"HTTP status of the final main-document response (e.g. 200, 404). None when the engine could not observe it."},"render_quality":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Render Quality","description":"0.0-1.0; populated by the F.7 scorer."},"deductions":{"additionalProperties":{"type":"number"},"type":"object","title":"Deductions","description":"Named render-quality deductions that fired for this render (e.g. {'http_error': 0.7}). Empty on a clean render."},"is_blocked":{"type":"boolean","title":"Is Blocked","description":"True when the scorer judged the render an anti-bot challenge or WAF block page. A block with no page content behind it returns 200 with this flag set and outputs={}.","default":false},"billed":{"type":"boolean","title":"Billed","description":"Whether this operation consumed one op from the monthly quota. False for blocked reads and for renders whose deductions include http_error or login_wall; cache hits bill.","default":false},"options_echo":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Options Echo","description":"Echo of the request options the server honoured (secrets redacted to booleans), so a caller can verify what was actually applied."},"cache_hit":{"type":"boolean","title":"Cache Hit","default":false},"outputs":{"additionalProperties":{"$ref":"#/components/schemas/OutputArtifact"},"type":"object","title":"Outputs"},"structured":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Structured"},"extraction_tier":{"anyOf":[{"type":"string","enum":["heuristic","css","llm"]},{"type":"null"}],"title":"Extraction Tier"},"tokens":{"$ref":"#/components/schemas/PerceiveTokens"},"cost_cents":{"type":"number","title":"Cost Cents","default":0.0},"duration_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Duration Ms"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"warnings":{"items":{"type":"string"},"type":"array","title":"Warnings"}},"type":"object","required":["operation_id","status","url"],"title":"PerceiveResponse"},"PerceiveTokens":{"properties":{"input":{"type":"integer","title":"Input","default":0},"output":{"type":"integer","title":"Output","default":0}},"type":"object","title":"PerceiveTokens"},"PerceiveViewport":{"properties":{"width":{"type":"integer","maximum":3840.0,"minimum":320.0,"title":"Width","default":1920},"height":{"type":"integer","maximum":2160.0,"minimum":240.0,"title":"Height","default":1080}},"additionalProperties":false,"type":"object","title":"PerceiveViewport"},"PublicCheck":{"properties":{"operation_id":{"type":"string","title":"Operation Id"},"url":{"type":"string","title":"Url"},"render_quality":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Render Quality"},"is_blocked":{"type":"boolean","title":"Is Blocked"},"deductions":{"additionalProperties":{"type":"number"},"type":"object","title":"Deductions"},"status_code":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Status Code"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["operation_id","url","render_quality","is_blocked","deductions","status_code","created_at"],"title":"PublicCheck"},"TokenRequest":{"properties":{"turnstile_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Turnstile Token"}},"type":"object","title":"TokenRequest"},"TokenResponse":{"properties":{"token":{"type":"string","title":"Token"},"token_type":{"type":"string","title":"Token Type","default":"Bearer"},"expires_in":{"type":"integer","title":"Expires In"}},"type":"object","required":["token","expires_in"],"title":"TokenResponse"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"WatchCreateRequest":{"properties":{"url":{"type":"string","maxLength":2048,"title":"Url","description":"The page to monitor."},"frequency_minutes":{"type":"integer","maximum":43200.0,"minimum":60.0,"title":"Frequency Minutes","description":"Minutes between checks. Hourly floor: minimum 60.","default":60},"diff_mode":{"type":"string","enum":["auto","text","structured","tables","metadata"],"title":"Diff Mode","default":"auto"},"track_fields":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Track Fields","description":"Optional field/selector subset to track (Task I.3)."},"webhook_url":{"anyOf":[{"type":"string","maxLength":2048},{"type":"null"}],"title":"Webhook Url","description":"Optional change-notification webhook (delivery in I.4)."},"notify_email":{"type":"boolean","title":"Notify Email","default":true}},"additionalProperties":false,"type":"object","required":["url"],"title":"WatchCreateRequest","description":"Create one watcher (POST /v2/watch, Task I.2)."},"WatchUpdateRequest":{"properties":{"frequency_minutes":{"anyOf":[{"type":"integer","maximum":43200.0,"minimum":60.0},{"type":"null"}],"title":"Frequency Minutes"},"diff_mode":{"anyOf":[{"type":"string","enum":["auto","text","structured","tables","metadata"]},{"type":"null"}],"title":"Diff Mode"},"track_fields":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Track Fields"},"webhook_url":{"anyOf":[{"type":"string","maxLength":2048},{"type":"null"}],"title":"Webhook Url"},"notify_email":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Notify Email"},"status":{"anyOf":[{"type":"string","enum":["active","paused"]},{"type":"null"}],"title":"Status"}},"additionalProperties":false,"type":"object","title":"WatchUpdateRequest","description":"Patch a watcher (PATCH /v2/watch/{watcher_id}, Task I.2).\n\nEvery field is optional — only the keys present in the body are applied.\n``status`` toggles active/paused (resume re-arms the schedule, pause stops\nit); the terminal ``deleted`` state is reached through DELETE, not here."},"WatcherListResponse":{"properties":{"watchers":{"items":{"$ref":"#/components/schemas/WatcherSummary"},"type":"array","title":"Watchers"},"skip":{"type":"integer","title":"Skip","default":0},"limit":{"type":"integer","title":"Limit","default":20},"has_more":{"type":"boolean","title":"Has More","description":"True when more watchers exist beyond this page.","default":false}},"type":"object","title":"WatcherListResponse","description":"One newest-first page of a project's watchers (Task I.2/I.4)."},"WatcherResponse":{"properties":{"watcher_id":{"type":"string","title":"Watcher Id"},"url":{"type":"string","title":"Url"},"status":{"type":"string","enum":["active","paused","deleted"],"title":"Status"},"frequency_minutes":{"type":"integer","title":"Frequency Minutes"},"diff_mode":{"type":"string","enum":["auto","text","structured","tables","metadata"],"title":"Diff Mode"},"track_fields":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Track Fields"},"webhook_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Webhook Url"},"notify_email":{"type":"boolean","title":"Notify Email","default":true},"consecutive_errors":{"type":"integer","title":"Consecutive Errors","default":0},"checks_count":{"type":"integer","title":"Checks Count","default":0},"last_check_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Check At"},"next_check_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Next Check At"},"last_change_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Change At"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["watcher_id","url","status","frequency_minutes","diff_mode"],"title":"WatcherResponse","description":"Full view of one watcher (POST/GET/PATCH/DELETE share it)."},"WatcherSnapshotListResponse":{"properties":{"watcher_id":{"type":"string","title":"Watcher Id"},"snapshots":{"items":{"$ref":"#/components/schemas/WatcherSnapshotResponse"},"type":"array","title":"Snapshots"},"limit":{"type":"integer","title":"Limit","default":20}},"type":"object","required":["watcher_id"],"title":"WatcherSnapshotListResponse","description":"Newest-first page of a watcher's snapshots (Task I.4)."},"WatcherSnapshotResponse":{"properties":{"checked_at":{"type":"string","format":"date-time","title":"Checked At"},"has_changes":{"type":"boolean","title":"Has Changes","default":false},"similarity":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Similarity"},"render_quality":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Render Quality"},"change_count":{"type":"integer","title":"Change Count","default":0},"changes":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Changes"}},"type":"object","required":["checked_at"],"title":"WatcherSnapshotResponse","description":"One check's result for the dashboard timeline (Task I.4).\n\n``changes`` is the I.3 diff verdict (already bounded + value-capped by the\ndiff engine); the values are untrusted page content, so any HTML consumer\nmust escape them."},"WatcherSummary":{"properties":{"watcher_id":{"type":"string","title":"Watcher Id"},"url":{"type":"string","title":"Url"},"status":{"type":"string","enum":["active","paused","deleted"],"title":"Status"},"frequency_minutes":{"type":"integer","title":"Frequency Minutes"},"checks_count":{"type":"integer","title":"Checks Count","default":0},"consecutive_errors":{"type":"integer","title":"Consecutive Errors","default":0},"last_check_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Check At"},"next_check_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Next Check At"},"last_change_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Change At"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"}},"type":"object","required":["watcher_id","url","status","frequency_minutes"],"title":"WatcherSummary","description":"Compact watcher row for the dashboard list (Task I.4)."},"WebhookRetryResponse":{"properties":{"job_id":{"type":"string","title":"Job Id"},"delivered":{"type":"boolean","title":"Delivered"},"attempts":{"type":"integer","title":"Attempts","description":"Number of POST attempts made."},"status_code":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Status Code","description":"HTTP status of the last attempt (null on network error)."},"detail":{"type":"string","title":"Detail","description":"Human-readable delivery outcome."}},"type":"object","required":["job_id","delivered","attempts","detail"],"title":"WebhookRetryResponse","description":"Result of a manual completion-webhook redelivery (Task H.8)."},"WebhookSecretResponse":{"properties":{"secret":{"type":"string","title":"Secret"},"signature_header":{"type":"string","title":"Signature Header","default":"X-Enconvert-Signature"},"timestamp_header":{"type":"string","title":"Timestamp Header","default":"X-Enconvert-Timestamp"},"signature_scheme":{"type":"string","title":"Signature Scheme","default":"sha256"},"replay_tolerance_seconds":{"type":"integer","title":"Replay Tolerance Seconds","default":300},"rotated":{"type":"boolean","title":"Rotated","default":false}},"type":"object","required":["secret"],"title":"WebhookSecretResponse","description":"A project's webhook signing secret plus the headers a consumer verifies.\n\nSENSITIVE: returned only over the authenticated dashboard channel so a\ncustomer can configure signature verification on their endpoint. ``rotated``\nis True when this response just replaced the previous secret (signatures\ncomputed with the old secret stop verifying immediately)."},"WhoAmIResponse":{"properties":{"project_id":{"type":"string","title":"Project Id"},"plan_slug":{"type":"string","title":"Plan Slug"}},"type":"object","required":["project_id","plan_slug"],"title":"WhoAmIResponse","description":"Minimal identity pass-through: only what the MCP server needs to attach a\nPostHog project group. Deliberately excludes key_type, domains, and limits."},"WidgetTokenRequest":{"properties":{"turnstile_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Turnstile Token"}},"type":"object","title":"WidgetTokenRequest"}}}}