[{"id":"action_board","name":"Action Board","alias":"ActionBoard","aliases":[],"description_short":"Retrieve actions from ActionBoard for your projects.","description_long":"Retrieve actions from ActionBoard for your projects.","description_tool_prompt":"Retrieve actions from ActionBoard for your projects.","source":"Botify ActionBoard","conversation_examples":["Show me my current ActionBoard items and their status","What critical SEO issues need my attention right now?","What are the high-priority technical SEO problems to fix?","Show me all semantic issues from ActionBoard"],"tags":[],"available_in_chat":true,"available_in_deepthink":true,"available_in_mcp":true,"mcp_audience":"all","config":{"type":"object","properties":{},"required":[]},"item":{"type":"object","properties":{},"required":[]},"response":{"$defs":{"ActionBoardCanvas":{"properties":{"title":{"title":"Title","type":"string"},"description":{"title":"Description","type":"string"},"config":{"additionalProperties":true,"title":"Config","type":"object"}},"required":["title","description","config"],"title":"ActionBoardCanvas","type":"object"},"ActionBoardResult":{"properties":{"name":{"title":"Name","type":"string"},"description":{"title":"Description","type":"string"},"relevance":{"anyOf":[{"enum":["LOW","MIDDLE","HIGH"],"type":"string"},{"type":"null"}],"title":"Relevance"},"impact_metrics":{"$ref":"#/$defs/ImpactedMetric"},"canvas":{"items":{"$ref":"#/$defs/ActionBoardCanvas"},"title":"Canvas","type":"array"}},"required":["name","description","relevance","impact_metrics","canvas"],"title":"ActionBoardResult","type":"object"},"ImpactedMetric":{"properties":{"total_urls_affected":{"title":"Total Urls Affected","type":"integer"},"previous_total_urls_affected":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Previous Total Urls Affected"},"active_urls_affected":{"title":"Active Urls Affected","type":"integer"},"previous_active_urls_affected":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Previous Active Urls Affected"},"page_rank_impact":{"title":"Page Rank Impact","type":"number"},"previous_page_rank_impact":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Previous Page Rank Impact"}},"required":["total_urls_affected","previous_total_urls_affected","active_urls_affected","previous_active_urls_affected","page_rank_impact","previous_page_rank_impact"],"title":"ImpactedMetric","type":"object"}},"properties":{"results":{"description":"Action board results","items":{"$ref":"#/$defs/ActionBoardResult"},"title":"Results","type":"array"}},"required":["results"],"title":"ActionBoardProcessedItem","type":"object"},"has_canvas":false,"open_canvas_automatically":false},{"id":"agentic_catalog_sources","name":"Agentic Catalog Sources","alias":"AgenticCatalogSources","aliases":[],"description_short":"List the AgenticCatalog sources of a project","description_long":"\n    List every source configured on a project's AgenticCatalog (Products Feeds), with its name,\n    description, config, and destinations.\n    ","description_tool_prompt":"\n    List every source configured on a project's AgenticCatalog (Products Feeds), with its name,\n    description, config, and destinations.\n    ","source":"AgenticCatalog","conversation_examples":[],"tags":[],"available_in_chat":true,"available_in_deepthink":true,"available_in_mcp":true,"mcp_audience":"all","config":{"type":"object","properties":{},"required":[]},"item":{"type":"object","properties":{},"required":[]},"response":{"$defs":{"AgenticCatalogDestination":{"description":"One destination configured on an AgenticCatalog source.","properties":{"type":{"description":"Destination type. Filter `destination` on this value in `agentic_catalog_destinations_push`. `dummy` is a no-op and never appears in that table.","title":"Type","type":"string"},"name":{"description":"Human-readable destination name.","title":"Name","type":"string"},"config":{"additionalProperties":true,"description":"Destination settings (credentials are masked).","title":"Config","type":"object"}},"required":["type","name","config"],"title":"AgenticCatalogDestination","type":"object"},"AgenticCatalogSource":{"description":"One AgenticCatalog source configured on the project.","properties":{"id":{"description":"Source identifier. Filter `source_id` on this value in the AgenticCatalog BigQuery tables.","title":"Id","type":"string"},"name":{"description":"Human-readable source name.","title":"Name","type":"string"},"description":{"description":"Optional source description.","title":"Description","type":"string"},"config":{"additionalProperties":true,"description":"Source-level settings (datasource, enrichment, language, ...). Secrets are masked.","title":"Config","type":"object"},"destinations":{"description":"Destinations this source is configured to push to.","items":{"$ref":"#/$defs/AgenticCatalogDestination"},"title":"Destinations","type":"array"}},"required":["id","name","description","config","destinations"],"title":"AgenticCatalogSource","type":"object"}},"properties":{"sources":{"description":"Every source configured on the project, pulled or not. `id` is what to filter `source_id` on in the AgenticCatalog BigQuery tables; `destinations[].type` is what to filter `destination` on. Empty means the project has no AgenticCatalog.","items":{"$ref":"#/$defs/AgenticCatalogSource"},"title":"Sources","type":"array"}},"required":["sources"],"title":"AgenticCatalogSourcesProcessedItem","type":"object"},"has_canvas":false,"open_canvas_automatically":false},{"id":"ai_decisions_gateway","name":"AI Decisions Gateway","alias":"AiDecisionsGateway","aliases":[],"description_short":"Classify text with typed questions and get each answer's confidence","description_long":"\n    Answer typed questions about a text with OpenAI's Decisions API, which picks\n    answers instead of writing them: faster and cheaper than ai_gateway for\n    classifying, routing, flagging or scoring, and every answer comes with how\n    sure the model is. Use ai_gateway when something has to be written.\n\n    The text to judge goes in user_prompt. The questions go in\n    structured_output_json_schema, one per field, with the field's description as\n    its question, and system_prompt holds framing shared by every question. A\n    field name cannot contain a dot. Put a description on every field: a field\n    without one is asked by its name.\n    Each field must be one of: boolean (yes/no); enum of strings or whole numbers (pick one, up to 255 options); array of an enum (yes/no per option); number with minimum 0 and maximum 1 (the probability itself); integer levels 0..N with a description per level in anyOf/const (a score, up to 10 levels); or an object of these. At most 200 questions per text, counting one per\n    option of an array field.\n\n    structured_output mirrors the schema, with each field replaced by\n    {\"value\": ..., \"confidence\": ..., \"probabilities\": ..., \"score\": ...}, so it\n    does not validate against the schema itself. confidence runs from 0 to 1; a\n    probability field has none, being a probability already. A score's value is\n    its continuous score rounded to the nearest level, which can land between two\n    likely levels on one the model gave no weight to: read probabilities for the\n    likeliest level.\n    ","description_tool_prompt":"\n    Answer typed questions about a text with OpenAI's Decisions API, which picks\n    answers instead of writing them: faster and cheaper than ai_gateway for\n    classifying, routing, flagging or scoring, and every answer comes with how\n    sure the model is. Use ai_gateway when something has to be written.\n\n    The text to judge goes in user_prompt. The questions go in\n    structured_output_json_schema, one per field, with the field's description as\n    its question, and system_prompt holds framing shared by every question. A\n    field name cannot contain a dot. Put a description on every field: a field\n    without one is asked by its name.\n    Each field must be one of: boolean (yes/no); enum of strings or whole numbers (pick one, up to 255 options); array of an enum (yes/no per option); number with minimum 0 and maximum 1 (the probability itself); integer levels 0..N with a description per level in anyOf/const (a score, up to 10 levels); or an object of these. At most 200 questions per text, counting one per\n    option of an array field.\n\n    structured_output mirrors the schema, with each field replaced by\n    {\"value\": ..., \"confidence\": ..., \"probabilities\": ..., \"score\": ...}, so it\n    does not validate against the schema itself. confidence runs from 0 to 1; a\n    probability field has none, being a probability already. A score's value is\n    its continuous score rounded to the nearest level, which can land between two\n    likely levels on one the model gave no weight to: read probabilities for the\n    likeliest level.\n    ","source":null,"conversation_examples":[],"tags":[],"available_in_chat":false,"available_in_deepthink":false,"available_in_mcp":true,"mcp_audience":"all","config":{"type":"object","properties":{"prefeed":{"default":[],"description":"List of agent pre-calls whose results are injected into the user prompt before the LLM runs.","items":{"$ref":"#/$defs/PrefeedCall"},"title":"Prefeed","type":"array"},"system_prompt":{"default":"","description":"Framing shared by every question: what the texts are and what they are judged for.","title":"System Prompt","type":"string"},"structured_output_json_schema":{"additionalProperties":true,"description":"A JSON Schema of \"type\": \"object\" whose properties are the questions: each property is one question, its description is the question asked, and its type is the kind of answer. Each field must be one of: boolean (yes/no); enum of strings or whole numbers (pick one, up to 255 options); array of an enum (yes/no per option); number with minimum 0 and maximum 1 (the probability itself); integer levels 0..N with a description per level in anyOf/const (a score, up to 10 levels); or an object of these. See the example for one field of each kind.","examples":[{"properties":{"team":{"description":"Which team should handle this ticket?","enum":["billing","logistics","tech"]},"angry":{"description":"Is the customer angry?","type":"boolean"},"topics":{"description":"Which topics does the ticket raise?","items":{"enum":["refund","delay","damage"]},"type":"array"},"refund_likelihood":{"description":"How likely is the customer to ask for a refund?","maximum":1,"minimum":0,"type":"number"},"severity":{"anyOf":[{"const":0,"description":"cosmetic"},{"const":1,"description":"annoying"},{"const":2,"description":"blocking"},{"const":3,"description":"data loss"}],"description":"How severe is the issue?","type":"integer"}},"required":["team","angry","topics","refund_likelihood","severity"],"type":"object"}],"title":"Structured Output Json Schema","type":"object"},"model_settings":{"$ref":"#/$defs/OpenAIDecisionsSettings","description":"The decision model and how it turns probabilities into answers"}},"required":["structured_output_json_schema"],"$defs":{"OpenAIDecisionsSettings":{"description":"A model on OpenAI's Decisions API.","properties":{"boolean_threshold":{"default":0.5,"description":"How likely a yes has to be before a boolean field is true, from 0 to 1. Raise it where a false positive is the expensive mistake.","maximum":1.0,"minimum":0.0,"title":"Boolean Threshold","type":"number"},"model":{"const":"gpt-6-luna","description":"The model, by its bare name (no provider prefix).","title":"Model","type":"string"}},"required":["model"],"title":"OpenAIDecisionsSettings","type":"object"},"PrefeedCall":{"description":"A pre-call to an agent whose result is injected into the user prompt before the LLM runs.","properties":{"description":{"description":"Description of the prefeed result (used as context label in the prompt)","title":"Description","type":"string"},"agent":{"description":"Agent ID to call","title":"Agent","type":"string"},"item":{"additionalProperties":true,"description":"Item payload for the agent","title":"Item","type":"object"},"config":{"additionalProperties":true,"default":{},"description":"Optional config payload for the agent","title":"Config","type":"object"}},"required":["description","agent","item"],"title":"PrefeedCall","type":"object"}}},"item":{"type":"object","properties":{"prefeed":{"default":[],"description":"List of agent pre-calls whose results are injected into the user prompt before the LLM runs.","items":{"$ref":"#/$defs/PrefeedCall"},"title":"Prefeed","type":"array"},"user_prompt":{"description":"The text to judge. Put the questions in structured_output_json_schema and system_prompt: a question written here is judged as text, not asked.","examples":["My parcel never arrived and nobody answers. Refund me now!"],"title":"User Prompt","type":"string"}},"required":["user_prompt"],"$defs":{"PrefeedCall":{"description":"A pre-call to an agent whose result is injected into the user prompt before the LLM runs.","properties":{"description":{"description":"Description of the prefeed result (used as context label in the prompt)","title":"Description","type":"string"},"agent":{"description":"Agent ID to call","title":"Agent","type":"string"},"item":{"additionalProperties":true,"description":"Item payload for the agent","title":"Item","type":"object"},"config":{"additionalProperties":true,"default":{},"description":"Optional config payload for the agent","title":"Config","type":"object"}},"required":["description","agent","item"],"title":"PrefeedCall","type":"object"}}},"response":{"description":"The answers, each with how sure the model is","properties":{"structured_output":{"additionalProperties":true,"description":"The schema's fields, each replaced by {value, confidence, probabilities, score}; keys that do not apply to a field are left out.","title":"Structured Output","type":"object"}},"required":["structured_output"],"title":"AIDecisionsGatewayProcessedItem","type":"object"},"has_canvas":false,"open_canvas_automatically":false},{"id":"ai_gateway","name":"AI Responses Gateway","alias":"AiGateway","aliases":["llm_wrapper","LlmWrapper"],"description_short":"Generate structured output from text input","description_long":"\n    Generate structured output from unstructured text input based on\n    configurable item definitions. It can extract specific information types (strings,\n    numbers, booleans) from text according to custom instructions.\n\n    Supports both OpenAI and Gemini models.\n    \n    Recommended flavors right now: FLASH (gpt-6-luna), LITE (gpt-6-luna), PRO (gpt-6-sol).\n\n    Can also use other tools from complex reasoning tasks. Some of those tools\n    write data (tables_create, tables_insert, tables_load): only list them in\n    `agents` when the user asked for that change.\n    ","description_tool_prompt":"\n    Generate structured output from unstructured text input based on\n    configurable item definitions. It can extract specific information types (strings,\n    numbers, booleans) from text according to custom instructions.\n\n    Supports both OpenAI and Gemini models.\n    \n    Recommended flavors right now: FLASH (gpt-6-luna), LITE (gpt-6-luna), PRO (gpt-6-sol).\n\n    Can also use other tools from complex reasoning tasks. Some of those tools\n    write data (tables_create, tables_insert, tables_load): only list them in\n    `agents` when the user asked for that change.\n    ","source":null,"conversation_examples":[],"tags":[],"available_in_chat":false,"available_in_deepthink":false,"available_in_mcp":true,"mcp_audience":"all","config":{"type":"object","properties":{"prefeed":{"default":[],"description":"List of agent pre-calls whose results are injected into the user prompt before the LLM runs.","items":{"$ref":"#/$defs/PrefeedCall"},"title":"Prefeed","type":"array"},"prompt_cache_prefix":{"default":"","description":"Prompt-cache prefix. When set, a cache breakpoint is placed immediately after it: this text is cached, and the system prompt and user prompt that follow are not.","title":"Prompt Cache Prefix","type":"string"},"system_prompt":{"default":"","description":"System prompt used to generate the items","title":"System Prompt","type":"string"},"structured_output_json_schema":{"additionalProperties":true,"description":"JSON Schema for the structured output","title":"Structured Output Json Schema","type":"object"},"model_settings":{"description":"The settings for the AI model","discriminator":{"mapping":{"gemini-3-flash-preview":"#/$defs/Gemini3FlashSettings","gemini-3.1-flash-lite":"#/$defs/Gemini31FlashSettings","gemini-3.1-pro-preview":"#/$defs/Gemini31Settings","gemini-3.5-flash":"#/$defs/Gemini35FlashSettings","gpt-5-mini":"#/$defs/OpenAISettings","gpt-5-nano":"#/$defs/OpenAISettings","gpt-5.1":"#/$defs/OpenAISettings","gpt-5.2":"#/$defs/OpenAI52Settings","gpt-5.4":"#/$defs/OpenAI54Settings","gpt-5.4-mini":"#/$defs/OpenAI54Settings","gpt-5.4-nano":"#/$defs/OpenAI54Settings","gpt-5.5":"#/$defs/OpenAI55Settings","gpt-5.6-luna":"#/$defs/OpenAI56Settings","gpt-5.6-terra":"#/$defs/OpenAI56Settings","gpt-6-luna":"#/$defs/OpenAI6Settings","gpt-6-sol":"#/$defs/OpenAI6Settings"},"propertyName":"model"},"oneOf":[{"$ref":"#/$defs/Gemini3FlashSettings"},{"$ref":"#/$defs/Gemini31FlashSettings"},{"$ref":"#/$defs/Gemini31Settings"},{"$ref":"#/$defs/Gemini35FlashSettings"},{"$ref":"#/$defs/OpenAISettings"},{"$ref":"#/$defs/OpenAI52Settings"},{"$ref":"#/$defs/OpenAI54Settings"},{"$ref":"#/$defs/OpenAI55Settings"},{"$ref":"#/$defs/OpenAI56Settings"},{"$ref":"#/$defs/OpenAI6Settings"}],"title":"Model Settings"},"agents":{"description":"List of agent IDs to be used as tools.","items":{"enum":["action_board","agentic_catalog_sources","ai_visibility_campaigns_list","botify_config","get_credit_usage","google_people_also_ask","google_serp","google_trends","html_code_executor","html_code_executor_batch","html_fetch","html_grep","html_grep_batch","html_question","knowledge","list_annotations","perplexity","quality_control","robots_txt_check","screenshot","search_console_keywords_groups","speedworkers_config","speedworkers_inventory","speedworkers_page_history","speedworkers_page_preview","speedworkers_page_snapshot","speedworkers_versions","tables_create","tables_insert","tables_list","tables_load","tables_query","tables_schema","text_hash","tmp_storage_grep","tmp_storage_grep_batch","tmp_storage_jq","tmp_storage_jq_batch","tmp_storage_read","tmp_storage_read_batch","tool_documentation","topics_extractor","web_search"]},"title":"Agents","type":"array"},"is_gzip":{"default":false,"description":"If True, the user_prompt is expected to be base64-encoded and gzip-compressed. The agent will decode base64, then decompress gzip, and use the resulting UTF-8 string as the prompt. Enable this if your prompt is transmitted in this format, regardless of the processing mode (batch or not). This can be used to reduce payload size in any context.","title":"Is Gzip","type":"boolean"},"toon_tool_results":{"default":false,"description":"Serialize agent tool results as TOON instead of JSON","title":"Toon Tool Results","type":"boolean"}},"required":["structured_output_json_schema","model_settings"],"$defs":{"Gemini31FlashSettings":{"description":"Settings specific to Gemini 3.1 Flash model","properties":{"temperature":{"default":0.3,"description":"The temperature for the AI model","maximum":2.0,"minimum":0.0,"title":"Temperature","type":"number"},"max_tokens":{"anyOf":[{"minimum":0,"type":"integer"},{"type":"null"}],"default":null,"description":"The maximum number of tokens for the AI model","title":"Max Tokens"},"service_tier_flex_fallback_to_default":{"default":false,"description":"If True and service_tier is 'flex'-like, fallback to 'default' tier on errors (429 rate limit, unsupported flex tier).","title":"Service Tier Flex Fallback To Default","type":"boolean"},"model":{"const":"gemini-3.1-flash-lite","description":"The model to use for the Gemini model","title":"Model","type":"string"},"service_tier":{"anyOf":[{"enum":["default","flex","flex_only"],"type":"string"},{"type":"null"}],"default":null,"description":"Service tier for Google Models: 'default', 'flex', or 'flex_only'.","title":"Service Tier"},"thinking_level":{"anyOf":[{"enum":["minimal","low","medium","high"],"type":"string"},{"type":"null"}],"default":null,"description":"Thinking level: 'minimal', 'low', 'medium', or 'high'. Controls the depth of reasoning.","title":"Thinking Level"}},"required":["model"],"title":"Gemini31FlashSettings","type":"object"},"Gemini31Settings":{"description":"Settings specific to Gemini 3.1 models","properties":{"temperature":{"default":0.3,"description":"The temperature for the AI model","maximum":2.0,"minimum":0.0,"title":"Temperature","type":"number"},"max_tokens":{"anyOf":[{"minimum":0,"type":"integer"},{"type":"null"}],"default":null,"description":"The maximum number of tokens for the AI model","title":"Max Tokens"},"service_tier_flex_fallback_to_default":{"default":false,"description":"If True and service_tier is 'flex'-like, fallback to 'default' tier on errors (429 rate limit, unsupported flex tier).","title":"Service Tier Flex Fallback To Default","type":"boolean"},"model":{"const":"gemini-3.1-pro-preview","description":"The model to use for the Gemini model","title":"Model","type":"string"},"service_tier":{"anyOf":[{"enum":["default","flex","flex_only"],"type":"string"},{"type":"null"}],"default":null,"description":"Service tier for Google Models: 'default', 'flex', or 'flex_only'.","title":"Service Tier"},"thinking_level":{"anyOf":[{"enum":["low","medium","high"],"type":"string"},{"type":"null"}],"default":null,"description":"Thinking level: 'low', 'medium', or 'high'. Controls the depth of reasoning.","title":"Thinking Level"}},"required":["model"],"title":"Gemini31Settings","type":"object"},"Gemini35FlashSettings":{"description":"Settings specific to Gemini 3.5 Flash model","properties":{"temperature":{"default":0.3,"description":"The temperature for the AI model","maximum":2.0,"minimum":0.0,"title":"Temperature","type":"number"},"max_tokens":{"anyOf":[{"minimum":0,"type":"integer"},{"type":"null"}],"default":null,"description":"The maximum number of tokens for the AI model","title":"Max Tokens"},"service_tier_flex_fallback_to_default":{"default":false,"description":"If True and service_tier is 'flex'-like, fallback to 'default' tier on errors (429 rate limit, unsupported flex tier).","title":"Service Tier Flex Fallback To Default","type":"boolean"},"model":{"const":"gemini-3.5-flash","description":"The model to use for the Gemini model","title":"Model","type":"string"},"service_tier":{"anyOf":[{"enum":["default","flex","flex_only"],"type":"string"},{"type":"null"}],"default":null,"description":"Service tier for Google Models: 'default', 'flex', or 'flex_only'.","title":"Service Tier"},"thinking_level":{"anyOf":[{"enum":["minimal","low","medium","high"],"type":"string"},{"type":"null"}],"default":null,"description":"Thinking level: 'minimal', 'low', 'medium', or 'high'. Controls the depth of reasoning.","title":"Thinking Level"}},"required":["model"],"title":"Gemini35FlashSettings","type":"object"},"Gemini3FlashSettings":{"description":"Settings specific to Gemini 3 Flash model","properties":{"temperature":{"default":0.3,"description":"The temperature for the AI model","maximum":2.0,"minimum":0.0,"title":"Temperature","type":"number"},"max_tokens":{"anyOf":[{"minimum":0,"type":"integer"},{"type":"null"}],"default":null,"description":"The maximum number of tokens for the AI model","title":"Max Tokens"},"service_tier_flex_fallback_to_default":{"default":false,"description":"If True and service_tier is 'flex'-like, fallback to 'default' tier on errors (429 rate limit, unsupported flex tier).","title":"Service Tier Flex Fallback To Default","type":"boolean"},"model":{"const":"gemini-3-flash-preview","description":"The model to use for the Gemini model","title":"Model","type":"string"},"service_tier":{"anyOf":[{"enum":["default","flex","flex_only"],"type":"string"},{"type":"null"}],"default":null,"description":"Service tier for Google Models: 'default', 'flex', or 'flex_only'.","title":"Service Tier"},"thinking_level":{"anyOf":[{"enum":["minimal","low","medium","high"],"type":"string"},{"type":"null"}],"default":null,"description":"Thinking level: 'minimal', 'low', 'medium', or 'high'. Controls the depth of reasoning.","title":"Thinking Level"}},"required":["model"],"title":"Gemini3FlashSettings","type":"object"},"OpenAI52Settings":{"description":"Settings specific to OpenAI 5.2 models","properties":{"temperature":{"default":0.3,"description":"The temperature for the AI model","maximum":2.0,"minimum":0.0,"title":"Temperature","type":"number"},"max_tokens":{"anyOf":[{"minimum":0,"type":"integer"},{"type":"null"}],"default":null,"description":"The maximum number of tokens for the AI model","title":"Max Tokens"},"service_tier_flex_fallback_to_default":{"default":false,"description":"If True and service_tier is 'flex'-like, fallback to 'default' tier on errors (429 rate limit, unsupported flex tier).","title":"Service Tier Flex Fallback To Default","type":"boolean"},"verbosity":{"anyOf":[{"enum":["low","medium","high"],"type":"string"},{"type":"null"}],"default":null,"description":"Text verbosity level: 'low', 'medium', or 'high'. Controls how concise or verbose the model's text response is.","title":"Verbosity"},"service_tier":{"anyOf":[{"enum":["default","flex","priority"],"type":"string"},{"type":"null"}],"default":null,"description":"Service tier for OpenAI API: 'default', 'flex', or 'priority'.","title":"Service Tier"},"model":{"const":"gpt-5.2","description":"The model to use for the OpenAI model","title":"Model","type":"string"},"reasoning_effort":{"anyOf":[{"enum":["low","medium","high","xhigh"],"type":"string"},{"type":"null"}],"default":"high","description":"Reasoning effort level: 'low', 'medium', 'high', or 'xhigh'. Controls the depth of reasoning for reasoning models.","title":"Reasoning Effort"}},"required":["model"],"title":"OpenAI52Settings","type":"object"},"OpenAI54Settings":{"description":"Settings specific to OpenAI 5.4 models","properties":{"temperature":{"default":0.3,"description":"The temperature for the AI model","maximum":2.0,"minimum":0.0,"title":"Temperature","type":"number"},"max_tokens":{"anyOf":[{"minimum":0,"type":"integer"},{"type":"null"}],"default":null,"description":"The maximum number of tokens for the AI model","title":"Max Tokens"},"service_tier_flex_fallback_to_default":{"default":false,"description":"If True and service_tier is 'flex'-like, fallback to 'default' tier on errors (429 rate limit, unsupported flex tier).","title":"Service Tier Flex Fallback To Default","type":"boolean"},"verbosity":{"anyOf":[{"enum":["low","medium","high"],"type":"string"},{"type":"null"}],"default":null,"description":"Text verbosity level: 'low', 'medium', or 'high'. Controls how concise or verbose the model's text response is.","title":"Verbosity"},"service_tier":{"anyOf":[{"enum":["default","flex","priority"],"type":"string"},{"type":"null"}],"default":null,"description":"Service tier for OpenAI API: 'default', 'flex', or 'priority'.","title":"Service Tier"},"model":{"description":"The model to use for the OpenAI model","enum":["gpt-5.4","gpt-5.4-mini","gpt-5.4-nano"],"title":"Model","type":"string"},"reasoning_effort":{"anyOf":[{"enum":["none","low","medium","high","xhigh"],"type":"string"},{"type":"null"}],"default":null,"description":"Reasoning effort level: 'none', 'low', 'medium', 'high', or 'xhigh'. Controls the depth of reasoning for GPT-5.4 models.","title":"Reasoning Effort"}},"required":["model"],"title":"OpenAI54Settings","type":"object"},"OpenAI55Settings":{"description":"Settings specific to OpenAI 5.5 models","properties":{"temperature":{"default":0.3,"description":"The temperature for the AI model","maximum":2.0,"minimum":0.0,"title":"Temperature","type":"number"},"max_tokens":{"anyOf":[{"minimum":0,"type":"integer"},{"type":"null"}],"default":null,"description":"The maximum number of tokens for the AI model","title":"Max Tokens"},"service_tier_flex_fallback_to_default":{"default":false,"description":"If True and service_tier is 'flex'-like, fallback to 'default' tier on errors (429 rate limit, unsupported flex tier).","title":"Service Tier Flex Fallback To Default","type":"boolean"},"verbosity":{"anyOf":[{"enum":["low","medium","high"],"type":"string"},{"type":"null"}],"default":null,"description":"Text verbosity level: 'low', 'medium', or 'high'. Controls how concise or verbose the model's text response is.","title":"Verbosity"},"service_tier":{"anyOf":[{"enum":["default","flex","priority"],"type":"string"},{"type":"null"}],"default":null,"description":"Service tier for OpenAI API: 'default', 'flex', or 'priority'.","title":"Service Tier"},"model":{"const":"gpt-5.5","description":"The model to use for the OpenAI model","title":"Model","type":"string"},"reasoning_effort":{"anyOf":[{"enum":["none","low","medium","high","xhigh"],"type":"string"},{"type":"null"}],"default":null,"description":"Reasoning effort level: 'none', 'low', 'medium', 'high', or 'xhigh'. Controls the depth of reasoning for GPT-5.5 models.","title":"Reasoning Effort"}},"required":["model"],"title":"OpenAI55Settings","type":"object"},"OpenAI56Settings":{"description":"Settings specific to OpenAI 5.6 models","properties":{"temperature":{"default":0.3,"description":"The temperature for the AI model","maximum":2.0,"minimum":0.0,"title":"Temperature","type":"number"},"max_tokens":{"anyOf":[{"minimum":0,"type":"integer"},{"type":"null"}],"default":null,"description":"The maximum number of tokens for the AI model","title":"Max Tokens"},"service_tier_flex_fallback_to_default":{"default":false,"description":"If True and service_tier is 'flex'-like, fallback to 'default' tier on errors (429 rate limit, unsupported flex tier).","title":"Service Tier Flex Fallback To Default","type":"boolean"},"verbosity":{"anyOf":[{"enum":["low","medium","high"],"type":"string"},{"type":"null"}],"default":null,"description":"Text verbosity level: 'low', 'medium', or 'high'. Controls how concise or verbose the model's text response is.","title":"Verbosity"},"service_tier":{"anyOf":[{"enum":["default","flex","priority"],"type":"string"},{"type":"null"}],"default":null,"description":"Service tier for OpenAI API: 'default', 'flex', or 'priority'.","title":"Service Tier"},"model":{"description":"The model to use for the OpenAI model","enum":["gpt-5.6-luna","gpt-5.6-terra"],"title":"Model","type":"string"},"reasoning_effort":{"anyOf":[{"enum":["none","low","medium","high","xhigh"],"type":"string"},{"type":"null"}],"default":null,"description":"Reasoning effort level: 'none', 'low', 'medium', 'high', or 'xhigh'. Controls the depth of reasoning for GPT-5.6 models.","title":"Reasoning Effort"}},"required":["model"],"title":"OpenAI56Settings","type":"object"},"OpenAI6Settings":{"description":"Settings specific to OpenAI 6 models","properties":{"temperature":{"default":0.3,"description":"The temperature for the AI model","maximum":2.0,"minimum":0.0,"title":"Temperature","type":"number"},"max_tokens":{"anyOf":[{"minimum":0,"type":"integer"},{"type":"null"}],"default":null,"description":"The maximum number of tokens for the AI model","title":"Max Tokens"},"service_tier_flex_fallback_to_default":{"default":false,"description":"If True and service_tier is 'flex'-like, fallback to 'default' tier on errors (429 rate limit, unsupported flex tier).","title":"Service Tier Flex Fallback To Default","type":"boolean"},"verbosity":{"anyOf":[{"enum":["low","medium","high"],"type":"string"},{"type":"null"}],"default":null,"description":"Text verbosity level: 'low', 'medium', or 'high'. Controls how concise or verbose the model's text response is.","title":"Verbosity"},"service_tier":{"anyOf":[{"enum":["default","flex","fast"],"type":"string"},{"type":"null"}],"default":null,"description":"Service tier for the OpenAI API: 'default', 'flex', or 'fast'. Fast costs twice the standard rate.","title":"Service Tier"},"model":{"description":"The model to use for the OpenAI model","enum":["gpt-6-luna","gpt-6-sol"],"title":"Model","type":"string"},"reasoning_effort":{"anyOf":[{"enum":["none","low","medium","high","xhigh","max"],"type":"string"},{"type":"null"}],"default":null,"description":"Reasoning effort level: 'none', 'low', 'medium', 'high', 'xhigh', or 'max'. Controls the depth of reasoning for GPT-6 models.","title":"Reasoning Effort"}},"required":["model"],"title":"OpenAI6Settings","type":"object"},"OpenAISettings":{"description":"Settings specific to OpenAI models","properties":{"temperature":{"default":0.3,"description":"The temperature for the AI model","maximum":2.0,"minimum":0.0,"title":"Temperature","type":"number"},"max_tokens":{"anyOf":[{"minimum":0,"type":"integer"},{"type":"null"}],"default":null,"description":"The maximum number of tokens for the AI model","title":"Max Tokens"},"service_tier_flex_fallback_to_default":{"default":false,"description":"If True and service_tier is 'flex'-like, fallback to 'default' tier on errors (429 rate limit, unsupported flex tier).","title":"Service Tier Flex Fallback To Default","type":"boolean"},"verbosity":{"anyOf":[{"enum":["low","medium","high"],"type":"string"},{"type":"null"}],"default":null,"description":"Text verbosity level: 'low', 'medium', or 'high'. Controls how concise or verbose the model's text response is.","title":"Verbosity"},"service_tier":{"anyOf":[{"enum":["default","flex","priority"],"type":"string"},{"type":"null"}],"default":null,"description":"Service tier for OpenAI API: 'default', 'flex', or 'priority'.","title":"Service Tier"},"model":{"description":"The model to use for the OpenAI model","enum":["gpt-5.1","gpt-5-mini","gpt-5-nano"],"title":"Model","type":"string"},"reasoning_effort":{"anyOf":[{"enum":["low","medium","high"],"type":"string"},{"type":"null"}],"default":null,"description":"Reasoning effort level: 'low', 'medium', or 'high'. Controls the depth of reasoning for reasoning models.","title":"Reasoning Effort"}},"required":["model"],"title":"OpenAISettings","type":"object"},"PrefeedCall":{"description":"A pre-call to an agent whose result is injected into the user prompt before the LLM runs.","properties":{"description":{"description":"Description of the prefeed result (used as context label in the prompt)","title":"Description","type":"string"},"agent":{"description":"Agent ID to call","title":"Agent","type":"string"},"item":{"additionalProperties":true,"description":"Item payload for the agent","title":"Item","type":"object"},"config":{"additionalProperties":true,"default":{},"description":"Optional config payload for the agent","title":"Config","type":"object"}},"required":["description","agent","item"],"title":"PrefeedCall","type":"object"}}},"item":{"type":"object","properties":{"prefeed":{"default":[],"description":"List of agent pre-calls whose results are injected into the user prompt before the LLM runs.","items":{"$ref":"#/$defs/PrefeedCall"},"title":"Prefeed","type":"array"},"user_prompt":{"description":"User prompt for the LLM","title":"User Prompt","type":"string"}},"required":["user_prompt"],"$defs":{"PrefeedCall":{"description":"A pre-call to an agent whose result is injected into the user prompt before the LLM runs.","properties":{"description":{"description":"Description of the prefeed result (used as context label in the prompt)","title":"Description","type":"string"},"agent":{"description":"Agent ID to call","title":"Agent","type":"string"},"item":{"additionalProperties":true,"description":"Item payload for the agent","title":"Item","type":"object"},"config":{"additionalProperties":true,"default":{},"description":"Optional config payload for the agent","title":"Config","type":"object"}},"required":["description","agent","item"],"title":"PrefeedCall","type":"object"}}},"response":{"description":"Output from AI text generation","properties":{"structured_output":{"additionalProperties":true,"description":"Structured output based on input configuration","title":"Structured Output","type":"object"}},"required":["structured_output"],"title":"AIGatewayProcessedItem","type":"object"},"has_canvas":false,"open_canvas_automatically":false},{"id":"ai_visibility_campaigns_list","name":"AI Visibility Campaigns List","alias":"AiVisibilityCampaignsList","aliases":[],"description_short":"List the AI Visibility campaigns configured on the current project.","description_long":"List the AI Visibility campaigns configured on the current project: name, id, status, platforms, countries, and how prompts are sourced.","description_tool_prompt":"List AI Visibility campaigns on the current project. Each campaign is a named set of prompts tracked on one or more AI platforms (ChatGPT, Gemini, AI Overviews, AI Mode, Perplexity), in one or more countries. Use this to find a campaign id and name before filtering AI Visibility results, or when the user asks which campaigns exist, which are active, or which platforms and countries a campaign covers. Deleted campaigns are omitted unless include_deleted is true. Intent all, or an empty intents list, means the campaign keeps every prompt intent.","source":"Botify","conversation_examples":["List my AI Visibility campaigns","Which AI Visibility campaigns are active on this project?"],"tags":["competitive analysis"],"available_in_chat":true,"available_in_deepthink":true,"available_in_mcp":true,"mcp_audience":"all","config":{"type":"object","properties":{},"required":[]},"item":{"type":"object","properties":{"include_deleted":{"default":false,"description":"When true, include campaigns with status deleted. Defaults to false.","title":"Include Deleted","type":"boolean"}},"required":[]},"response":{"$defs":{"AiVisibilityCampaign":{"description":"One AI Visibility campaign, reduced to the fields a caller needs to pick one.","properties":{"id":{"description":"Campaign id","title":"Id","type":"string"},"name":{"description":"Campaign name","title":"Name","type":"string"},"campaign_type":{"description":"How prompts are sourced: top_gsc_keywords (Search Console), categories (one list of topics per country), or csv_import","enum":["top_gsc_keywords","categories","csv_import"],"title":"Campaign Type","type":"string"},"status":{"description":"active, inactive, or deleted","enum":["active","inactive","deleted"],"title":"Status","type":"string"},"providers":{"description":"AI platforms the campaign tracks, such as chatgpt, google_gemini, google_ai_overview, google_ai_mode, perplexity","items":{"type":"string"},"title":"Providers","type":"array"},"size":{"description":"Number of prompts the campaign is budgeted to run","title":"Size","type":"integer"},"countries":{"description":"ISO 3166-1 alpha-3 country codes the campaign runs in","items":{"type":"string"},"title":"Countries","type":"array"},"categories":{"description":"Topic names for a categories campaign, in source order. Empty for the other campaign types.","items":{"type":"string"},"title":"Categories","type":"array"},"intents":{"description":"Prompt intents the campaign keeps: informational, commercial, transactional, or all. all and an empty list both mean every intent.","items":{"enum":["informational","commercial","transactional","all"],"type":"string"},"title":"Intents","type":"array"},"contains_brand":{"description":"Whether prompts must mention the brand: all_prompts, branded_only, or non_branded_only","enum":["all_prompts","branded_only","non_branded_only"],"title":"Contains Brand","type":"string"},"created_date":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"default":null,"description":"When the campaign was created","title":"Created Date"},"modified_date":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"default":null,"description":"When the campaign was last modified","title":"Modified Date"}},"required":["id","name","campaign_type","status","providers","size","countries","categories","intents","contains_brand"],"title":"AiVisibilityCampaign","type":"object"}},"properties":{"campaigns":{"description":"AI Visibility campaigns on the project","items":{"$ref":"#/$defs/AiVisibilityCampaign"},"title":"Campaigns","type":"array"},"count":{"description":"Number of campaigns returned after filtering","title":"Count","type":"integer"}},"required":["campaigns","count"],"title":"AiVisibilityCampaignsListProcessedItem","type":"object"},"has_canvas":false,"open_canvas_automatically":false},{"id":"batch_run","name":"Batch Run","alias":"BatchRun","aliases":[],"description_short":"Run any other tool over many records, from a list, a SQL query, a table or an uploaded CSV, and collect the results in a file or a table.","description_long":"Run one tool over many records at once.\n\n    This is the only way to fan a tool out: every other tool takes exactly one item.\n\n    Sources: `rows` (records in the call itself), `sql` (a BigQuery query),\n    `table` (a whole catalog table), `file` (a CSV/TSV uploaded at\n    https://app.botify.com/:organization/:project/o/storage/tmp, or the output of\n    a previous batch).\n\n    Small sources run immediately and return their results. Larger ones run as a\n    background job: you get a job_id to poll with batch_status, and the records\n    never enter this conversation.\n\n    The output is a temporary JSONL file whose URL is directly usable as the\n    `file` source of a next batch, which is how several tools are chained. Each\n    line is {row, item, response, error} -- the original row and mapped item are\n    both kept, so results stay attributable and source columns survive chaining.\n\n    Use tool_documentation on the target tool first: item_map has to match its\n    item schema. Use dry_run to check a mapping against real records before\n    paying for the whole source.\n\n    The target can be a tool that writes data (tables_insert, ...): only batch\n    such a tool when the user asked for that change.\n    ","description_tool_prompt":"Run another tool over many records (a list, a SQL query, a table or an uploaded CSV) and write the results to a file or a table. Use it when each record needs one tool call; for one record, call the tool directly. Read the target tool's schema with tool_documentation before writing item_map, and use dry_run to validate it on a few records first. The target can be a tool that writes data (tables_insert, ...): only batch such a tool when the user asked for that change.","source":null,"conversation_examples":[],"tags":[],"available_in_chat":false,"available_in_deepthink":false,"available_in_mcp":true,"mcp_audience":"all","config":{"type":"object","properties":{"on_error":{"$ref":"#/$defs/OnError","default":"skip","description":"skip: record the failure and carry on. fail_job: stop the whole batch on the first failing record."},"chunk_size":{"default":50,"description":"Records sent to the tool at once.","maximum":500,"minimum":1,"title":"Chunk Size","type":"integer"},"inline_max_rows":{"default":10,"description":"Above this many records, the batch runs as a job.","maximum":100,"minimum":1,"title":"Inline Max Rows","type":"integer"}},"required":[],"$defs":{"OnError":{"enum":["skip","fail_job"],"type":"string"}}},"item":{"type":"object","properties":{"tool":{"description":"Id of the tool to run over every record. Use tool_documentation to read its item schema before writing item_map.","title":"Tool","type":"string"},"source":{"$ref":"#/$defs/SourceSpec","description":"Where the records come from."},"item_map":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"default":null,"description":"Projection from a source record onto the tool's item, using {{row.<column>}} (ex: {\"url\": \"{{row.page_url}}\"}). Omit it when the records already have the tool's item shape.","title":"Item Map"},"sink":{"anyOf":[{"$ref":"#/$defs/SinkSpec"},{"type":"null"}],"default":null,"description":"Where results go. Defaults to a temporary gzipped JSONL file whose URL can be passed straight back as a file source."},"tool_config":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"default":null,"description":"The target tool's own config, shared by every record.","title":"Tool Config"},"dry_run":{"default":false,"description":"Run only the first 5 records and return them in full, launching nothing. Use it to check a mapping or a prompt against a large source in one turn.","title":"Dry Run","type":"boolean"}},"required":["tool","source"],"$defs":{"FileFormat":{"enum":["auto","jsonl","csv","tsv"],"type":"string"},"FileSink":{"description":"A temporary JSONL file in project storage, readable back as a source.","properties":{"type":{"const":"file","default":"file","title":"Type","type":"string"},"gzip":{"default":true,"description":"Compress the output.","title":"Gzip","type":"boolean"}},"title":"FileSink","type":"object"},"FileSource":{"description":"Rows from an uploaded CSV/TSV, or from a previous batch's JSONL output.","properties":{"type":{"const":"file","default":"file","title":"Type","type":"string"},"url":{"description":"File URL. Upload a local file at https://app.botify.com/:organization/:project/o/storage/tmp and pass the returned URL, or reuse the sink URL of a previous batch. Public HTTP(S) URLs are accepted too. CSV, TSV and JSONL, gzip allowed.","title":"Url","type":"string"},"format":{"$ref":"#/$defs/FileFormat","default":"auto","description":"File format, or auto-detect."}},"required":["url"],"title":"FileSource","type":"object"},"RowsSource":{"description":"Records passed directly in the call.","properties":{"type":{"const":"rows","default":"rows","title":"Type","type":"string"},"rows":{"description":"The records to process, one object per call.","items":{"additionalProperties":true,"type":"object"},"minItems":1,"title":"Rows","type":"array"}},"required":["rows"],"title":"RowsSource","type":"object"},"SinkSpec":{"discriminator":{"mapping":{"file":"#/$defs/FileSink","table":"#/$defs/TableSink"},"propertyName":"type"},"oneOf":[{"$ref":"#/$defs/FileSink"},{"$ref":"#/$defs/TableSink"}]},"SourceSpec":{"discriminator":{"mapping":{"file":"#/$defs/FileSource","rows":"#/$defs/RowsSource","sql":"#/$defs/SqlSource","table":"#/$defs/TableSource"},"propertyName":"type"},"oneOf":[{"$ref":"#/$defs/RowsSource"},{"$ref":"#/$defs/SqlSource"},{"$ref":"#/$defs/TableSource"},{"$ref":"#/$defs/FileSource"}]},"SqlSource":{"description":"Rows from a BigQuery query over the project's catalog.","properties":{"type":{"const":"sql","default":"sql","title":"Type","type":"string"},"query":{"description":"BigQuery Standard SQL over catalog tables. Prefix every table with \"catalog.\" (ex: catalog.crawl_pages_20251201). Same access as tables_query.","title":"Query","type":"string"},"limit":{"anyOf":[{"minimum":1,"type":"integer"},{"type":"null"}],"default":null,"description":"Stop after this many rows.","title":"Limit"}},"required":["query"],"title":"SqlSource","type":"object"},"TableSink":{"description":"A table in the project's editable catalog.","properties":{"type":{"const":"table","default":"table","title":"Type","type":"string"},"table":{"description":"Destination table in the catalog.","pattern":"^[A-Za-z_][A-Za-z0-9_]{0,1023}$","title":"Table","type":"string"},"row_map":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"default":null,"description":"Column projection, using {{item.<field>}}, {{response.<field>}}, {{error}} and {{row.<column>}}. Defaults to `row`, `item`, `response` and `error` columns.","title":"Row Map"},"replace_existing":{"default":false,"description":"Replace the table instead of appending to it.","title":"Replace Existing","type":"boolean"}},"required":["table"],"title":"TableSink","type":"object"},"TableSource":{"description":"Every row of one catalog table.","properties":{"type":{"const":"table","default":"table","title":"Type","type":"string"},"table":{"description":"Table name, with or without the \"catalog.\" prefix.","pattern":"^(?:catalog\\.)?[A-Za-z_][A-Za-z0-9_]*$","title":"Table","type":"string"},"limit":{"anyOf":[{"minimum":1,"type":"integer"},{"type":"null"}],"default":null,"description":"Stop after this many rows.","title":"Limit"}},"required":["table"],"title":"TableSource","type":"object"}}},"response":{"$defs":{"SinkPointer":{"description":"Where a batch's output landed.","properties":{"type":{"enum":["file","table"],"title":"Type","type":"string"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Sink file URL, reusable as the source of a next batch.","title":"Url"},"table":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Destination table.","title":"Table"},"rows_written":{"default":0,"description":"Records written.","title":"Rows Written","type":"integer"}},"required":["type"],"title":"SinkPointer","type":"object"}},"description":"What a batch returns, whichever path it took.","properties":{"mode":{"description":"dry_run and inline carry their results; job carries a job_id to poll with batch_status.","enum":["dry_run","inline","job"],"title":"Mode","type":"string"},"tool":{"description":"The tool that was run.","title":"Tool","type":"string"},"results":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"default":null,"description":"One {item, response, error} object per record.","title":"Results"},"job_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Poll it with batch_status.","title":"Job Id"},"execution_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Underlying Cloud Run execution.","title":"Execution Id"},"rows_total":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"Records the batch will process.","title":"Rows Total"},"rows_ok":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"Records that succeeded.","title":"Rows Ok"},"rows_error":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"Records that failed.","title":"Rows Error"},"estimated_credits":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"Credits the batch is expected to cost.","title":"Estimated Credits"},"sink":{"anyOf":[{"$ref":"#/$defs/SinkPointer"},{"type":"null"}],"default":null,"description":"Where the output landed."},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"One line about the outcome.","title":"Message"}},"required":["mode","tool"],"title":"BatchRunResult","type":"object"},"has_canvas":false,"open_canvas_automatically":false},{"id":"botify_config","name":"Botify Config","alias":"BotifyConfig","aliases":[],"description_short":"Get Botify product configurations (PageWorkers, Botify Core)","description_long":"\n    Retrieve configuration information for Botify products.\n    \n    Supports:\n    - PageWorkers: Get modules status and deployment information\n    - Botify Core: Get project configuration including URL, timezone, allowed domains for SiteCrawler, Configured analytics providers (Google Analytics, Adobe Analytics..), Google Search Console properties...\n    \n    Multiple products can be requested in a single call.\n\n    For the SpeedWorkers configuration, use the speedworkers_config agent instead.\n    ","description_tool_prompt":"\n    Retrieve configuration information for Botify products.\n    \n    Supports:\n    - PageWorkers: Get modules status and deployment information\n    - Botify Core: Get project configuration including URL, timezone, allowed domains for SiteCrawler, Configured analytics providers (Google Analytics, Adobe Analytics..), Google Search Console properties...\n    \n    Multiple products can be requested in a single call.\n\n    For the SpeedWorkers configuration, use the speedworkers_config agent instead.\n    ","source":"Botify Activation API","conversation_examples":[],"tags":[],"available_in_chat":true,"available_in_deepthink":true,"available_in_mcp":true,"mcp_audience":"all","config":{"type":"object","properties":{},"required":[]},"item":{"type":"object","properties":{"products":{"description":"List of products to get configuration for. Can be 'pageworkers', 'botify_core', or both. For SpeedWorkers, use the speedworkers_config agent.","items":{"enum":["pageworkers","botify_core"],"type":"string"},"title":"Products","type":"array"}},"required":["products"]},"response":{"properties":{"pageworkers":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"default":null,"description":"PageWorkers configuration if requested","title":"Pageworkers"},"botify_core":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"default":null,"description":"Botify Core project configuration if requested","title":"Botify Core"}},"title":"BotifyConfigProcessedItem","type":"object"},"has_canvas":false,"open_canvas_automatically":false},{"id":"botify_data","name":"Botify Data","alias":"BotifyData","aliases":[],"description_short":"Query your Botify data.","description_long":"Query your Botify data.","description_tool_prompt":"Get data from the Botify Datamodel (Crawl Data, Search Console Data, Sitemaps, Logs, Core Web Vitals, etc). Supports multiple time periods in a single query for comparison over time. Always use one query for date range comparisons (ideally two periods), not separate queries. IMPORTANT: When the user specifies a data source (crawl, search_console, logs), always preserve it explicitly in the query.Will internally translate to a SQL query, please give one question at a time.","source":"Botify","conversation_examples":["List me indexable URLs filtered on product pages","Give me average links per pagetype"],"tags":[],"available_in_chat":true,"available_in_deepthink":false,"available_in_mcp":false,"mcp_audience":"all","config":{"type":"object","properties":{"run_query":{"default":true,"description":"Whether to run the query","title":"Run Query","type":"boolean"}},"required":[]},"item":{"type":"object","properties":{"query":{"description":"Human readable query to get data from (ex: indexable URLs by depth, avg outlinks by pagetype, impressions by country last month, etc)","title":"Query","type":"string"}},"required":["query"]},"response":{"$defs":{"BQLMetadata":{"properties":{"fields":{"items":{"$ref":"#/$defs/BQLResultField"},"title":"Fields","type":"array"},"is_bql_v2":{"default":true,"title":"Is Bql V2","type":"boolean"}},"required":["fields"],"title":"BQLMetadata","type":"object"},"BQLResultField":{"properties":{"kind":{"enum":["dimension","metric"],"title":"Kind","type":"string"},"name":{"title":"Name","type":"string"},"type":{"title":"Type","type":"string"},"subtype":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Subtype"},"metadata":{"$ref":"#/$defs/FieldMetadata"},"multiple":{"title":"Multiple","type":"boolean"}},"required":["kind","name","type","metadata","multiple"],"title":"BQLResultField","type":"object"},"FieldMetadata":{"properties":{"period_comment":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Period Comment"}},"title":"FieldMetadata","type":"object"}},"properties":{"bql_query":{"additionalProperties":true,"description":"Generated BQL query","title":"Bql Query","type":"object"},"results":{"anyOf":[{"items":{},"type":"array"},{"type":"null"}],"description":"Results of the BQL query","title":"Results"},"metadata":{"$ref":"#/$defs/BQLMetadata","description":"Metadata of the BQL query"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Query requested by the user","title":"Title"}},"required":["bql_query","results","metadata"],"title":"BQLProcessedItem","type":"object"},"has_canvas":true,"open_canvas_automatically":true},{"id":"calculator","name":"Calculator","alias":"Calculator","aliases":[],"description_short":"Perform basic arithmetic operations.","description_long":"Perform basic arithmetic operations (add, subtract, multiply, divide).","description_tool_prompt":"Perform basic arithmetic operations (add, subtract, multiply, divide).","source":null,"conversation_examples":["5 + 10 * 2 / 4"],"tags":[],"available_in_chat":true,"available_in_deepthink":true,"available_in_mcp":true,"mcp_audience":"all","config":{"type":"object","properties":{},"required":[]},"item":{"type":"object","properties":{"expression":{"description":"Arithmetic expression to evaluate","title":"Expression","type":"string"}},"required":["expression"]},"response":{"properties":{"result":{"anyOf":[{"type":"integer"},{"type":"number"}],"description":"Arithmetic expression evaluation result","title":"Result"}},"required":["result"],"title":"CalculatorProcessedItem","type":"object"},"has_canvas":false,"open_canvas_automatically":false},{"id":"chatgpt_websearch","name":"Chatgpt Websearch","alias":"ChatgptWebsearch","aliases":[],"description_short":"Call ChatGPT.com using web search tool to get real-time responses and information.","description_long":"\n    Use ChatGPT's web interface to search for information and get responses. This agent\n    interacts with ChatGPT's web interface and retrieve answers\n    to queries in real-time.\n\n    This agent can help you:\n    - Get answers to questions from ChatGPT's web interface\n    - Access ChatGPT's knowledge and capabilities through web scraping\n    - Get location-specific results by specifying a country code\n    ","description_tool_prompt":"\n    Use ChatGPT's web interface to search for information and get responses. This agent\n    interacts with ChatGPT's web interface and retrieve answers\n    to queries in real-time.\n\n    This agent can help you:\n    - Get answers to questions from ChatGPT's web interface\n    - Access ChatGPT's knowledge and capabilities through web scraping\n    - Get location-specific results by specifying a country code\n    ","source":null,"conversation_examples":["What are the best hotels in New York?","Explain quantum computing in simple terms","What's the weather like in Paris today?"],"tags":["web search"],"available_in_chat":false,"available_in_deepthink":false,"available_in_mcp":null,"mcp_audience":"all","config":{"type":"object","properties":{"country":{"default":"","description":"ISO 3166-1 alpha-2 country code for location-based results (e.g., 'US', 'FR')","title":"Country","type":"string"}},"required":[]},"item":{"type":"object","properties":{"query":{"description":"The search query to send to ChatGPT","minLength":1,"title":"Query","type":"string"}},"required":["query"]},"response":{"$defs":{"Citation":{"description":"A source cited in the response with metadata.","properties":{"url":{"title":"Url","type":"string"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Description"},"icon":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Icon"},"domain":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Domain"},"cited":{"title":"Cited","type":"boolean"}},"required":["url","cited"],"title":"Citation","type":"object"},"Link":{"description":"An inline citation link extracted from the answer.","properties":{"url":{"title":"Url","type":"string"},"text":{"title":"Text","type":"string"},"position":{"title":"Position","type":"integer"}},"required":["url","text","position"],"title":"Link","type":"object"},"SearchSource":{"description":"A search result source with snippet and ranking info.","properties":{"url":{"title":"Url","type":"string"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Title"},"snippet":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Snippet"},"rank":{"title":"Rank","type":"integer"},"date_published":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Date Published"}},"required":["url","rank"],"title":"SearchSource","type":"object"},"Shopping":{"description":"A shopping result item.","properties":{"title":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Title"},"image":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Image"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Description"},"link":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Link"},"tag":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Tag"},"all_images":{"default":[],"items":{"type":"string"},"title":"All Images","type":"array"},"rating":{"anyOf":[{"type":"number"},{"type":"null"}],"default":null,"title":"Rating"},"purchasing_options":{"default":[],"items":{"$ref":"#/$defs/ShoppingPurchasingOption"},"title":"Purchasing Options","type":"array"},"reviews":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"title":"Reviews"},"why_you_might_like_this":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Why You Might Like This"},"what_people_are_saying":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"What People Are Saying"},"merchants":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Free-form merchant label as reported by the scraper (e.g. 'Dunelm + others'). Used to render a fallback merchant name when no direct seller URL is available.","title":"Merchants"}},"title":"Shopping","type":"object"},"ShoppingPurchasingOption":{"description":"A purchasing option for a shopping item.","properties":{"price":{"title":"Price","type":"number"},"currency":{"title":"Currency","type":"string"},"website":{"title":"Website","type":"string"},"buy_link":{"title":"Buy Link","type":"string"}},"required":["price","currency","website","buy_link"],"title":"ShoppingPurchasingOption","type":"object"}},"description":"Unified output item for ChatGPT web search agents.","properties":{"query":{"description":"The search query that was executed","title":"Query","type":"string"},"answer_text_markdown":{"description":"The markdown response from ChatGPT","title":"Answer Text Markdown","type":"string"},"links":{"description":"Inline citation links from the response","items":{"$ref":"#/$defs/Link"},"title":"Links","type":"array"},"citations":{"description":"Sources cited in the response","items":{"$ref":"#/$defs/Citation"},"title":"Citations","type":"array"},"shopping":{"description":"Shopping results if any","items":{"$ref":"#/$defs/Shopping"},"title":"Shopping","type":"array"},"shopping_visible":{"description":"Whether shopping results are visible","title":"Shopping Visible","type":"boolean"},"web_search_triggered":{"description":"Whether the answer shows evidence of a web search (citations, search sources, search queries, inline citation links, or shopping items)","title":"Web Search Triggered","type":"boolean"},"search_sources":{"description":"Search result sources with snippets","items":{"$ref":"#/$defs/SearchSource"},"title":"Search Sources","type":"array"},"model":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Name / version of the model used by ChatGPT (e.g., 'gpt-4o')","title":"Model"},"search_queries":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"default":null,"description":"Web search queries used during processing","title":"Search Queries"}},"required":["query","answer_text_markdown","links","citations","shopping","shopping_visible","web_search_triggered","search_sources"],"title":"ChatGPTWebSearchProcessedItem","type":"object"},"has_canvas":false,"open_canvas_automatically":false},{"id":"embed","name":"Embed","alias":"Embed","aliases":[],"description_short":"Generate embeddings from text","description_long":"Generate embeddings from text input. Currently supports text-multilingual-embedding-002 model. Returns a vector representation of the input text that can be used for semantic search, similarity comparison, and other machine learning tasks.","description_tool_prompt":"Generate embeddings from text input. Currently supports text-multilingual-embedding-002 model. Returns a vector representation of the input text that can be used for semantic search, similarity comparison, and other machine learning tasks.","source":null,"conversation_examples":[],"tags":[],"available_in_chat":false,"available_in_deepthink":false,"available_in_mcp":null,"mcp_audience":"all","config":{"type":"object","properties":{"model":{"const":"text-multilingual-embedding-002","default":"text-multilingual-embedding-002","description":"The embedding model to use","title":"Model","type":"string"}},"required":[]},"item":{"type":"object","properties":{"text":{"description":"The text to generate an embedding for","title":"Text","type":"string"}},"required":["text"]},"response":{"properties":{"embedding":{"description":"The embedding vector as a list of floats","items":{"type":"number"},"title":"Embedding","type":"array"}},"required":["embedding"],"title":"EmbedProcessedItem","type":"object"},"has_canvas":false,"open_canvas_automatically":false},{"id":"get_credit_usage","name":"Credit Consumption","alias":"CreditConsumption","aliases":[],"description_short":"Report how much of this project's agent credit allowance is used, daily and monthly, and who used it.","description_long":"\n    Report how far through its agent credit allowance the project is, over both\n    windows that carry one: the day and the calendar month, and how this month's\n    consumption splits between the people and service accounts that caused it.\n\n    The allowance is a project-wide pool shared by every member, not a personal\n    one, and passing it warns rather than blocks: calls keep being served up to a\n    higher ceiling. The per-user breakdown says who drew from that shared pool,\n    as each one's share of the month's consumption. Reading consumption through\n    this agent is itself free and consumes no credits.\n    ","description_tool_prompt":"Report how much of its Botify agent credit allowance the current project has consumed, both for today and for the current calendar month, as a percentage per window with that window's status and reset time, plus a per-user breakdown of this month's consumption ordered from the biggest consumer down. Use when the user asks how much of their allowance or envelope they have used, how many credits they have left, when their credits reset, whether they are close to or over their limit, or who on the project is consuming the credits. Answers in percentages only: the number of credits used, left, or allowed is not reported and must not be inferred or estimated from the percentage. The two kinds of percentage are not comparable and must not be mixed: a window's percentage is of the allowance, while a user's share is of what the project consumed, so the shares sum to 100% whatever the allowance figures say. This agent is free and consumes no credits.","source":"Botify","conversation_examples":["How many Botify credits do we have left this month?","How much of our credit allowance have we used today?","Are we close to our agent credit limit?","When do our credits reset?","Who is using the most credits on this project?","Break down this month's credit consumption per user."],"tags":[],"available_in_chat":true,"available_in_deepthink":true,"available_in_mcp":true,"mcp_audience":"all","config":{"type":"object","properties":{},"required":[]},"item":{"type":"object","properties":{},"required":[]},"response":{"$defs":{"CreditWindow":{"description":"How far through its allowance one window is, and where that stands.","properties":{"usage_percent":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Share of the window's allowance that has been consumed, above 100 once the allowance is passed. Null when there is no allowance to take a share of -- not a statement that calls are blocked","title":"Usage Percent"},"status":{"description":"Where this window's consumption stands, and the only field that says whether calls are still being served: they are refused on ``blocked`` alone","enum":["healthy","warning","over","blocked"],"title":"Status","type":"string"},"resets_at":{"description":"When the window rolls over and consumption returns to 0","format":"date-time","title":"Resets At","type":"string"}},"required":["usage_percent","status","resets_at"],"title":"CreditWindow","type":"object"},"UserConsumption":{"description":"One client's share of what the project spent this month.","properties":{"client_id":{"description":"How the agent recorded the caller, usually the email of the Botify user. A client id no user answers to is a service account, and keeps a null name","title":"Client Id","type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The Botify user's full name, null when the client id belongs to no user or to one who filled in neither name","title":"Name"},"share_percent":{"description":"Share of everything the project spent this month that went to this client, as a percentage. A share of the project's own consumption, not of its allowance: these sum to 100 however full the envelope is","title":"Share Percent","type":"number"},"last_activity":{"description":"When this client last spent any of the project's credits","format":"date-time","title":"Last Activity","type":"string"}},"required":["client_id","name","share_percent","last_activity"],"title":"UserConsumption","type":"object"}},"properties":{"credit_status":{"description":"Where the project stands overall: the worse of the daily and the monthly credit status","enum":["healthy","warning","over","blocked"],"title":"Credit Status","type":"string"},"daily":{"$ref":"#/$defs/CreditWindow","description":"Information about the daily allowance usage"},"monthly":{"$ref":"#/$defs/CreditWindow","description":"Information about the monthly allowance usage"},"users":{"description":"The users active on this project this month, biggest share first. Each share is a percentage of what the project consumed, not of its allowance, so they sum to 100 rather than to the monthly usage. Clients whose share rounds to nothing are left out, and the list is empty for a project that has spent nothing this month","items":{"$ref":"#/$defs/UserConsumption"},"title":"Users","type":"array"},"summary":{"description":"A paragraph summarizing where usage sits expressed in natural language","title":"Summary","type":"string"}},"required":["credit_status","daily","monthly","users","summary"],"title":"GetCreditUsageProcessedItem","type":"object"},"has_canvas":false,"open_canvas_automatically":false},{"id":"google_ads_keyword_suggestions","name":"Google Ads Keyword Suggestions","alias":"GoogleAdsKeywordSuggestions","aliases":["keywords_suggestions_google_ads_planner_raw"],"description_short":"Get keyword suggestions from Google Ads Keywords Planner.","description_long":"\n    Discover a comprehensive list of related keywords based on a seed keyword, including synonyms, variations, and related topics from Google Ads data.\n    This tool identifies valuable keyword opportunities for your SEO strategy and includes detailed metrics for each keyword such as search volume, CPC, competition level, and search intent.\n    This facilitates content planning, PPC campaigns, and identifying new market opportunities in your niche.\n    ","description_tool_prompt":"\n    Discover a comprehensive list of related keywords based on a seed keyword, including synonyms, variations, and related topics from Google Ads data.\n    This tool identifies valuable keyword opportunities for your SEO strategy and includes detailed metrics for each keyword such as search volume, CPC, competition level, and search intent.\n    This facilitates content planning, PPC campaigns, and identifying new market opportunities in your niche.\n    ","source":"Google Ads Planner","conversation_examples":[],"tags":["keywords","google"],"available_in_chat":false,"available_in_deepthink":false,"available_in_mcp":true,"mcp_audience":"all","config":{"type":"object","properties":{"location_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"Location ID (optional)","title":"Location Id"},"location_request":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Location request (ex: Paris, FR), will translate to location ID","title":"Location Request"},"country_code":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"ISO3166 country code (ex: GB)","title":"Country Code"},"lang_code":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"BCP47 language code (ex: \"en\", \"en-GB\")","title":"Lang Code"},"device":{"default":"mobile","description":"Device to use for search (optional - defaults to mobile)","enum":["mobile","desktop"],"title":"Device","type":"string"}},"required":[]},"item":{"type":"object","properties":{"keywords":{"description":"List of seed keywords","items":{"type":"string"},"maxItems":20,"title":"Keywords","type":"array"},"location_request":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Location request, will translate to location ID","examples":["Paris, FR"],"title":"Location Request"}},"required":["keywords"]},"response":{"$defs":{"SearchLocation":{"properties":{"code":{"title":"Code","type":"integer"},"name":{"title":"Name","type":"string"},"lang":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Lang"}},"required":["code","name"],"title":"SearchLocation","type":"object"}},"properties":{"location":{"$ref":"#/$defs/SearchLocation"},"results":{"items":{"additionalProperties":true,"type":"object"},"title":"Results","type":"array"}},"required":["location","results"],"title":"GoogleAdsKeywordSuggestionsProcessedItem","type":"object"},"has_canvas":false,"open_canvas_automatically":false},{"id":"google_ads_search_volume","name":"Google Ads Search Volume","alias":"GoogleAdsSearchVolume","aliases":[],"description_short":"Fetches Google Ads search volume data for keywords.","description_long":"\n    This agent retrieves Google Ads search volume data for specified keywords.\n    \n    It provides information including:\n    - Monthly average search volume\n    - Competition level and index\n    - Cost per click (CPC)\n    - Top of page bid estimates\n    - Monthly search volume history\n    - Location and language targeting data\n    \n    The agent supports location and language targeting to get region-specific search volume data.\n    ","description_tool_prompt":"\n    This agent retrieves Google Ads search volume data for specified keywords.\n    \n    It provides information including:\n    - Monthly average search volume\n    - Competition level and index\n    - Cost per click (CPC)\n    - Top of page bid estimates\n    - Monthly search volume history\n    - Location and language targeting data\n    \n    The agent supports location and language targeting to get region-specific search volume data.\n    ","source":"Google Ads Search Volume API","conversation_examples":["Get search volume for 'digital marketing'","What's the search volume for 'python programming' in the US?","Show me competition data for 'e-commerce platform'"],"tags":["keywords","competitive analysis"],"available_in_chat":false,"available_in_deepthink":false,"available_in_mcp":null,"mcp_audience":"all","config":{"type":"object","properties":{"location_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"Location ID (optional)","title":"Location Id"},"location_request":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Location request (ex: Paris, FR), will translate to location ID","title":"Location Request"},"country_code":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"ISO3166 country code (ex: GB)","title":"Country Code"},"lang_code":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"BCP47 language code (ex: \"en\", \"en-GB\")","title":"Lang Code"},"device":{"default":"mobile","description":"Device to use for search (optional - defaults to mobile)","enum":["mobile","desktop"],"title":"Device","type":"string"}},"required":[]},"item":{"type":"object","properties":{"query":{"description":"The keyword to analyze. Limited to 80 characters.","maxLength":80,"title":"Query","type":"string"}},"required":["query"]},"response":{"$defs":{"MonthlySearchData":{"description":"Monthly search volume data for a keyword.","properties":{"year":{"title":"Year","type":"integer"},"month":{"title":"Month","type":"integer"},"search_volume":{"title":"Search Volume","type":"integer"}},"required":["year","month","search_volume"],"title":"MonthlySearchData","type":"object"}},"description":"Processed item containing Google Ads search volume data.","properties":{"keyword":{"description":"The keyword that was searched","title":"Keyword","type":"string"},"search_volume":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Monthly average search volume","title":"Search Volume"},"competition":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Competition level (HIGH, MEDIUM, LOW)","title":"Competition"},"competition_index":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Competition index (0-100)","title":"Competition Index"},"cpc":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Cost per click","title":"Cpc"},"low_top_of_page_bid":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Minimum bid for top of page","title":"Low Top Of Page Bid"},"high_top_of_page_bid":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Maximum bid for top of page","title":"High Top Of Page Bid"},"monthly_searches":{"anyOf":[{"items":{"$ref":"#/$defs/MonthlySearchData"},"type":"array"},{"type":"null"}],"description":"Monthly search volume data","title":"Monthly Searches"},"location_code":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Location code used for search","title":"Location Code"},"language_code":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Language code used for search","title":"Language Code"},"search_partners":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Whether search partners data is included","title":"Search Partners"}},"required":["keyword","search_volume","competition","competition_index","cpc","low_top_of_page_bid","high_top_of_page_bid","monthly_searches","location_code","language_code","search_partners"],"title":"GoogleAdsSearchVolumeProcessedItem","type":"object"},"has_canvas":false,"open_canvas_automatically":false},{"id":"google_ai_mode","name":"Google AI Mode","alias":"GoogleAIMode","aliases":[],"description_short":"Query Google AI Mode to get AI-generated search results and insights.","description_long":"\n        Retrieve AI-powered search results from Google AI Mode.\n        Get comprehensive AI-generated answers, featured snippets, and search insights for any query.\n\n        When `save_to_tmp_storage` is enabled, the results are written to temporary\n        project storage and a URL is returned instead of inline results.\n    ","description_tool_prompt":"Query Google AI Mode to get AI-generated search results, featured snippets, and comprehensive answers for any search query.","source":"Google","conversation_examples":["What does Google AI Mode say about 'best pizza in New York'?","What are the latest trends in AI according to Google AI Mode?","What does Google AI Mode recommend for 'travel planning tips'?"],"tags":["google","web search"],"available_in_chat":true,"available_in_deepthink":true,"available_in_mcp":true,"mcp_audience":"all","config":{"type":"object","properties":{"location_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"Location ID (optional)","title":"Location Id"},"location_request":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Location request (ex: Paris, FR), will translate to location ID","title":"Location Request"},"country_code":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"ISO3166 country code (ex: GB)","title":"Country Code"},"lang_code":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"BCP47 language code (ex: \"en\", \"en-GB\")","title":"Lang Code"},"device":{"default":"mobile","description":"Device to use for search (optional - defaults to mobile)","enum":["mobile","desktop"],"title":"Device","type":"string"},"save_to_tmp_storage":{"default":false,"description":"Save the bulky result payload to Botify temporary storage and return the temporary URL instead of the payload. Use this to save output tokens.","title":"Save To Temporary Storage","type":"boolean"}},"required":[]},"item":{"type":"object","properties":{"query":{"description":"The search query to analyze","maxLength":700,"title":"Query","type":"string"}},"required":["query"]},"response":{"$defs":{"GooglAiOverviewReference":{"properties":{"type":{"title":"Type","type":"string"},"source":{"title":"Source","type":"string"},"domain":{"title":"Domain","type":"string"},"url":{"title":"Url","type":"string"},"title":{"title":"Title","type":"string"},"text":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Text"}},"required":["type","source","domain","url","title"],"title":"GooglAiOverviewReference","type":"object"},"GoogleAiModeResults":{"properties":{"type":{"const":"ai_mode","default":"ai_mode","title":"Type","type":"string"},"rank_group":{"title":"Rank Group","type":"integer"},"rank_absolute":{"title":"Rank Absolute","type":"integer"},"markdown":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Markdown"},"items":{"anyOf":[{"items":{"anyOf":[{"$ref":"#/$defs/GoogleAiOverviewElement"},{"additionalProperties":true,"type":"object"}]},"type":"array"},{"type":"null"}],"default":null,"title":"Items"},"model":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Name / version of the model used","title":"Model"}},"required":["rank_group","rank_absolute","markdown"],"title":"GoogleAiModeResults","type":"object"},"GoogleAiOverviewElement":{"properties":{"type":{"title":"Type","type":"string"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Title"},"text":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Text"},"markdown":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Markdown"},"links":{"anyOf":[{"items":{"$ref":"#/$defs/GoogleAiOverviewLinkElement"},"type":"array"},{"type":"null"}],"default":null,"title":"Links"},"images":{"anyOf":[{"items":{"$ref":"#/$defs/GoogleAiOverviewImageElement"},"type":"array"},{"type":"null"}],"default":null,"title":"Images"},"references":{"anyOf":[{"items":{"$ref":"#/$defs/GooglAiOverviewReference"},"type":"array"},{"type":"null"}],"default":null,"title":"References"}},"required":["type"],"title":"GoogleAiOverviewElement","type":"object"},"GoogleAiOverviewImageElement":{"properties":{"type":{"title":"Type","type":"string"},"alt":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Alt"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Url"},"image_url":{"title":"Image Url","type":"string"}},"required":["type","image_url"],"title":"GoogleAiOverviewImageElement","type":"object"},"GoogleAiOverviewLinkElement":{"properties":{"type":{"title":"Type","type":"string"},"title":{"title":"Title","type":"string"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Description"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Url"},"domain":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Domain"}},"required":["type","title"],"title":"GoogleAiOverviewLinkElement","type":"object"}},"description":"AI Mode result that can offload `results` to temporary storage.","properties":{"query":{"description":"The original search query","title":"Query","type":"string"},"location_name":{"description":"The location used for the search, if any","title":"Location Name","type":"string"},"results":{"anyOf":[{"$ref":"#/$defs/GoogleAiModeResults"},{"type":"null"}],"default":null,"description":"The AI-generated search results. Omitted when `save_to_tmp_storage` is True; see `results_tmp_storage_url` instead."},"results_tmp_storage_url":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Temporary storage URL of the AI Mode results. Returned instead of `results` when `save_to_tmp_storage` is True.","title":"Results Tmp Storage Url"}},"required":["query","location_name"],"title":"GoogleAiModeProcessedItem","type":"object"},"has_canvas":true,"open_canvas_automatically":false},{"id":"google_ai_overview","name":"Google Ai Overview","alias":"GoogleAiOverview","aliases":[],"description_short":"Query Google AI Overview to get an AI-generated summary from a query.","description_long":"\n    Fetch the AI-powered summary from Google AI Overview, a snapshot of key\n    information about a topic or question with links.\n\n    When `save_to_tmp_storage` is enabled, the summary is written to temporary\n    project storage and a URL is returned instead of the inline results.\n    ","description_tool_prompt":"\n    Fetch the AI-powered summary from Google AI Overview, a snapshot of key\n    information about a topic or question with links.\n\n    When `save_to_tmp_storage` is enabled, the summary is written to temporary\n    project storage and a URL is returned instead of the inline results.\n    ","source":"Google","conversation_examples":["What does Google AI Mode say about 'best pizza in New York'?","What are the latest trends in AI according to Google AI Mode?","What does Google AI Mode recommend for 'travel planning tips'?"],"tags":["google","web search"],"available_in_chat":false,"available_in_deepthink":false,"available_in_mcp":null,"mcp_audience":"all","config":{"type":"object","properties":{"location_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"Location ID (optional)","title":"Location Id"},"location_request":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Location request (ex: Paris, FR), will translate to location ID","title":"Location Request"},"country_code":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"ISO3166 country code (ex: GB)","title":"Country Code"},"lang_code":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"BCP47 language code (ex: \"en\", \"en-GB\")","title":"Lang Code"},"device":{"default":"mobile","description":"Device to use for search (optional - defaults to mobile)","enum":["mobile","desktop"],"title":"Device","type":"string"},"save_to_tmp_storage":{"default":false,"description":"Save the bulky result payload to Botify temporary storage and return the temporary URL instead of the payload. Use this to save output tokens.","title":"Save To Temporary Storage","type":"boolean"}},"required":[]},"item":{"type":"object","properties":{"query":{"description":"The search query to analyze","maxLength":700,"title":"Query","type":"string"}},"required":["query"]},"response":{"$defs":{"GooglAiOverviewReference":{"properties":{"type":{"title":"Type","type":"string"},"source":{"title":"Source","type":"string"},"domain":{"title":"Domain","type":"string"},"url":{"title":"Url","type":"string"},"title":{"title":"Title","type":"string"},"text":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Text"}},"required":["type","source","domain","url","title"],"title":"GooglAiOverviewReference","type":"object"},"GoogleAiOverviewElement":{"properties":{"type":{"title":"Type","type":"string"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Title"},"text":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Text"},"markdown":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Markdown"},"links":{"anyOf":[{"items":{"$ref":"#/$defs/GoogleAiOverviewLinkElement"},"type":"array"},{"type":"null"}],"default":null,"title":"Links"},"images":{"anyOf":[{"items":{"$ref":"#/$defs/GoogleAiOverviewImageElement"},"type":"array"},{"type":"null"}],"default":null,"title":"Images"},"references":{"anyOf":[{"items":{"$ref":"#/$defs/GooglAiOverviewReference"},"type":"array"},{"type":"null"}],"default":null,"title":"References"}},"required":["type"],"title":"GoogleAiOverviewElement","type":"object"},"GoogleAiOverviewImageElement":{"properties":{"type":{"title":"Type","type":"string"},"alt":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Alt"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Url"},"image_url":{"title":"Image Url","type":"string"}},"required":["type","image_url"],"title":"GoogleAiOverviewImageElement","type":"object"},"GoogleAiOverviewLinkElement":{"properties":{"type":{"title":"Type","type":"string"},"title":{"title":"Title","type":"string"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Description"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Url"},"domain":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Domain"}},"required":["type","title"],"title":"GoogleAiOverviewLinkElement","type":"object"},"GoogleAiOverviewResults":{"properties":{"type":{"title":"Type","type":"string"},"markdown":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Markdown"},"items":{"anyOf":[{"items":{"anyOf":[{"$ref":"#/$defs/GoogleAiOverviewElement"},{"additionalProperties":true,"type":"object"}]},"type":"array"},{"type":"null"}],"default":null,"title":"Items"},"model":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Name / version of the model used","title":"Model"}},"required":["type"],"title":"GoogleAiOverviewResults","type":"object"}},"description":"AI Overview result that can offload `results` to temporary storage.","properties":{"query":{"description":"The original search query","title":"Query","type":"string"},"location_name":{"description":"The location used for the search, if any","title":"Location Name","type":"string"},"results":{"anyOf":[{"$ref":"#/$defs/GoogleAiOverviewResults"},{"type":"null"}],"default":null,"description":"The AI-generated search results. Omitted when `save_to_tmp_storage` is True; see `results_tmp_storage_url` instead."},"results_tmp_storage_url":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Temporary storage URL of the AI Overview results. Returned instead of `results` when `save_to_tmp_storage` is True.","title":"Results Tmp Storage Url"}},"required":["query","location_name"],"title":"GoogleAiOverviewProcessedItem","type":"object"},"has_canvas":false,"open_canvas_automatically":false},{"id":"google_gemini","name":"Google Gemini","alias":"GoogleGemini","aliases":[],"description_short":"Query Google Gemini to get AI-generated search results and insights.","description_long":"\n        Retrieve AI-powered search results from Google Gemini.\n        Get comprehensive AI-generated answers with structured text, tables,\n        and source citations for any query.\n    ","description_tool_prompt":"Query Google Gemini to get AI-generated search results, structured answers, and source citations for any search query.","source":"Gemini","conversation_examples":["What does Google Gemini say about 'best pizza in New York'?","What are the latest trends in AI according to Google Gemini?","What does Google Gemini recommend for 'travel planning tips'?"],"tags":["google","web search"],"available_in_chat":false,"available_in_deepthink":false,"available_in_mcp":null,"mcp_audience":"all","config":{"type":"object","properties":{"location_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"Location ID (optional)","title":"Location Id"},"location_request":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Location request (ex: Paris, FR), will translate to location ID","title":"Location Request"},"country_code":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"ISO3166 country code (ex: GB)","title":"Country Code"},"lang_code":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"BCP47 language code (ex: \"en\", \"en-GB\")","title":"Lang Code"},"device":{"default":"mobile","description":"Device to use for search (optional - defaults to mobile)","enum":["mobile","desktop"],"title":"Device","type":"string"}},"required":[]},"item":{"type":"object","properties":{"query":{"description":"The search query to analyze","maxLength":700,"title":"Query","type":"string"}},"required":["query"]},"response":{"$defs":{"GeminiImageElement":{"description":"An image element inside a gemini_images item.","properties":{"type":{"title":"Type","type":"string"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Url"},"alt":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Alt"},"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Image Url"},"markdown":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Markdown"}},"required":["type"],"title":"GeminiImageElement","type":"object"},"GeminiLLMScraperResult":{"description":"Result from the Gemini LLM scraper.","properties":{"keyword":{"title":"Keyword","type":"string"},"location_code":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"title":"Location Code"},"language_code":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Language Code"},"model":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Model"},"datetime":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Datetime"},"markdown":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Markdown"},"sources":{"anyOf":[{"items":{"$ref":"#/$defs/GeminiSource"},"type":"array"},{"type":"null"}],"default":null,"title":"Sources"},"se_results_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"title":"Se Results Count"},"item_types":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"default":null,"title":"Item Types"},"items_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"title":"Items Count"},"items":{"anyOf":[{"items":{"$ref":"#/$defs/GeminiResponseItem"},"type":"array"},{"type":"null"}],"default":null,"title":"Items"}},"required":["keyword"],"title":"GeminiLLMScraperResult","type":"object"},"GeminiResponseItem":{"additionalProperties":true,"description":"A response item from Gemini LLM Scraper.\n\nCan be of types: gemini_text, gemini_table, gemini_images.","properties":{"type":{"title":"Type","type":"string"},"rank_group":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"title":"Rank Group"},"rank_absolute":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"title":"Rank Absolute"},"markdown":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Markdown"},"original_text":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Original Text"},"sources":{"anyOf":[{"items":{"$ref":"#/$defs/GeminiSource"},"type":"array"},{"type":"null"}],"default":null,"title":"Sources"},"table":{"anyOf":[{"$ref":"#/$defs/GeminiTable"},{"type":"null"}],"default":null},"items":{"anyOf":[{"items":{"anyOf":[{"$ref":"#/$defs/GeminiImageElement"},{"additionalProperties":true,"type":"object"}]},"type":"array"},{"type":"null"}],"default":null,"title":"Items"}},"required":["type"],"title":"GeminiResponseItem","type":"object"},"GeminiSource":{"description":"A source cited by Gemini in its response.","properties":{"type":{"title":"Type","type":"string"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Title"},"snippet":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Snippet"},"domain":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Domain"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Url"},"thumbnail":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Thumbnail"},"source_name":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Source Name"},"publication_date":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Publication Date"},"markdown":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Markdown"}},"required":["type"],"title":"GeminiSource","type":"object"},"GeminiTable":{"description":"A table structure in Gemini's response.","properties":{"table_header":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"default":null,"title":"Table Header"},"table_content":{"anyOf":[{"items":{"items":{"type":"string"},"type":"array"},"type":"array"},{"type":"null"}],"default":null,"title":"Table Content"}},"title":"GeminiTable","type":"object"}},"properties":{"query":{"description":"The original search query","title":"Query","type":"string"},"location_name":{"description":"The location used for the search, if any","title":"Location Name","type":"string"},"results":{"$ref":"#/$defs/GeminiLLMScraperResult","description":"The Gemini search results"}},"required":["query","location_name","results"],"title":"GoogleGeminiProcessedItem","type":"object"},"has_canvas":true,"open_canvas_automatically":false},{"id":"google_knowledge_graph","name":"Google Knowledge Graph","alias":"GoogleKnowledgeGraph","aliases":[],"description_short":"Search Google Knowledge Graph for entities about people, places, and things.","description_long":"Search the Google Knowledge Graph to find information about millions of real-world entities and their relationships, like people, places, organizations, and things.","description_tool_prompt":"\n    Search the Google Knowledge Graph to find information about real-world entities like people, places, organizations,\n    and things. The Knowledge Graph contains millions of entries that describe entities and their relationships.\n\n    This agent can help you:\n    - Find information about celebrities, historical figures, and public figures\n    - Get details about places, landmarks, and locations\n    - Discover information about organizations, companies, and institutions\n    - Learn about books, movies, music, and other cultural entities\n    - Find factual information about various topics and subjects\n    ","source":null,"conversation_examples":["What is the entity for the term: The Very Hungry Caterpillar?","What is the entity for the term: Taylor Swift?"],"tags":["google"],"available_in_chat":true,"available_in_deepthink":true,"available_in_mcp":true,"mcp_audience":"all","config":{"type":"object","properties":{"limit":{"default":10,"description":"Maximum number of entities to return (1-50)","maximum":50,"minimum":1,"title":"Result limit","type":"integer"},"types":{"description":"Filter results by entity types (e.g., Person, Place, Organization)","items":{"type":"string"},"title":"Entity Types","type":"array"},"languages":{"description":"Filter results by language codes (e.g., en, fr, es)","items":{"pattern":"^[a-z]{2}$","type":"string"},"title":"Languages","type":"array"}},"required":[]},"item":{"type":"object","properties":{"query":{"description":"The entity or topic to search for in the Knowledge Graph","minLength":1,"title":"Query","type":"string"}},"required":["query"]},"response":{"$defs":{"Entity":{"properties":{"name":{"title":"Name","type":"string"},"description":{"default":"","title":"Description","type":"string"},"types":{"items":{"type":"string"},"title":"Types","type":"array"},"result_score":{"default":0.0,"title":"Result Score","type":"number"},"url":{"default":"","title":"Url","type":"string"},"image":{"default":"","title":"Image","type":"string"},"detailed_description":{"default":"","title":"Detailed Description","type":"string"},"detailed_description_url":{"default":"","title":"Detailed Description Url","type":"string"}},"required":["name"],"title":"Entity","type":"object"}},"properties":{"query":{"description":"The search query that was executed","title":"Query","type":"string"},"entities":{"description":"List of found entities with their information","items":{"$ref":"#/$defs/Entity"},"title":"Entities","type":"array"},"total_count":{"description":"Total number of entities found","title":"Total Count","type":"integer"}},"required":["query","entities","total_count"],"title":"GoogleKnowledgeGraphProcessedItem","type":"object"},"has_canvas":false,"open_canvas_automatically":false},{"id":"google_people_also_ask","name":"Google People Also Ask","alias":"GooglePeopleAlsoAsk","aliases":[],"description_short":"Retrieve Google 'People Also Ask' questions for a specific query.","description_long":"\n    Retrieve the Google 'People Also Ask' questions for a specific query.\n\n    When `save_to_tmp_storage` is enabled, the questions are written to temporary\n    project storage and a URL is returned instead of the inline results.\n    ","description_tool_prompt":"\n    Retrieve the Google 'People Also Ask' questions for a specific query.\n\n    When `save_to_tmp_storage` is enabled, the questions are written to temporary\n    project storage and a URL is returned instead of the inline results.\n    ","source":"Google","conversation_examples":["What are the 'People Also Ask' questions on Google for 'how to make pizza'?","What are the 'People Also Ask' questions on Google for 'best running shoes'?","What are the 'People Also Ask' questions on Google for 'climate change'?"],"tags":["keywords","google"],"available_in_chat":true,"available_in_deepthink":true,"available_in_mcp":true,"mcp_audience":"all","config":{"type":"object","properties":{"location_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"Location ID (optional)","title":"Location Id"},"location_request":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Location request (ex: Paris, FR), will translate to location ID","title":"Location Request"},"country_code":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"ISO3166 country code (ex: GB)","title":"Country Code"},"lang_code":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"BCP47 language code (ex: \"en\", \"en-GB\")","title":"Lang Code"},"device":{"default":"mobile","description":"Device to use for search (optional - defaults to mobile)","enum":["mobile","desktop"],"title":"Device","type":"string"},"save_to_tmp_storage":{"default":false,"description":"Save the bulky result payload to Botify temporary storage and return the temporary URL instead of the payload. Use this to save output tokens.","title":"Save To Temporary Storage","type":"boolean"}},"required":[]},"item":{"type":"object","properties":{"query":{"description":"The search query to analyze","maxLength":700,"title":"Query","type":"string"}},"required":["query"]},"response":{"$defs":{"PeopleAlsoAskItem":{"properties":{"question":{"title":"Question","type":"string"},"type":{"title":"Type","type":"string"}},"required":["question","type"],"title":"PeopleAlsoAskItem","type":"object"}},"properties":{"results":{"anyOf":[{"items":{"$ref":"#/$defs/PeopleAlsoAskItem"},"type":"array"},{"type":"null"}],"default":null,"description":"List of People Also Ask questions with their details. Omitted when `save_to_tmp_storage` is True; see `results_tmp_storage_url` instead.","title":"Results"},"results_tmp_storage_url":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Temporary storage URL of the People Also Ask results. Returned instead of `results` when `save_to_tmp_storage` is True.","title":"Results Tmp Storage Url"}},"title":"GooglePeopleAlsoAskProcessedItem","type":"object"},"has_canvas":false,"open_canvas_automatically":false},{"id":"google_people_also_search","name":"Google People Also Search","alias":"GooglePeopleAlsoSearch","aliases":[],"description_short":"Retrieve the Google 'People Also Search' questions for a specific query","description_long":"Retrieve the Google 'People Also Search' questions for a specific query","description_tool_prompt":"Retrieve the Google 'People Also Search' questions for a specific query","source":"Google","conversation_examples":["What are the 'People Also Search' queries on Google for 'iphone 15'?","What are the 'People Also Search' queries on Google for 'best running shoes'?","What are the 'People Also Search' queries on Google for 'climate change'?"],"tags":["keywords","google"],"available_in_chat":false,"available_in_deepthink":false,"available_in_mcp":null,"mcp_audience":"all","config":{"type":"object","properties":{"location_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"Location ID (optional)","title":"Location Id"},"location_request":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Location request (ex: Paris, FR), will translate to location ID","title":"Location Request"},"country_code":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"ISO3166 country code (ex: GB)","title":"Country Code"},"lang_code":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"BCP47 language code (ex: \"en\", \"en-GB\")","title":"Lang Code"},"device":{"default":"mobile","description":"Device to use for search (optional - defaults to mobile)","enum":["mobile","desktop"],"title":"Device","type":"string"}},"required":[]},"item":{"type":"object","properties":{"query":{"description":"The search query to analyze","maxLength":700,"title":"Query","type":"string"}},"required":["query"]},"response":{"properties":{"results":{"description":"List of People Also Search questions with their details","items":{"type":"string"},"title":"Results","type":"array"}},"required":["results"],"title":"GooglePeopleAlsoSearchProcessedItem","type":"object"},"has_canvas":false,"open_canvas_automatically":false},{"id":"google_position_opportunities","name":"Google Position-based Click Opportunities","alias":"GooglePositionOpportunities","aliases":[],"description_short":"Analyze potential click gains from ranking position improvements.","description_long":"\n    Analyze potential click gains from improving search ranking positions for specific URLs or keywords.\n    \n    This agent uses historical Search Console data to calculate the expected additional clicks you could\n    gain by improving from your current position to better positions, broken down by device type\n    (mobile and desktop/tablet).\n    ","description_tool_prompt":"\n    Analyze potential click gains from improving search ranking positions for specific URLs or keywords.\n    \n    This agent uses historical Search Console data to calculate the expected additional clicks you could\n    gain by improving from your current position to better positions, broken down by device type\n    (mobile and desktop/tablet).\n    ","source":null,"conversation_examples":[],"tags":[],"available_in_chat":false,"available_in_deepthink":false,"available_in_mcp":null,"mcp_audience":"all","config":{"type":"object","properties":{},"required":[]},"item":{"type":"object","properties":{"period":{"description":"Time period to analyze","enum":["last_7d","last_28d"],"title":"Period","type":"string"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Specific URL to analyze (optional)","title":"Url"},"keyword":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Specific keyword to analyze (optional)","title":"Keyword"}},"required":["period"]},"response":{"$defs":{"CTRDataPoint":{"properties":{"avg_position":{"description":"Average ranking position","title":"Avg Position","type":"integer"},"device":{"description":"Device type","title":"Device","type":"string"},"nb_urls":{"description":"Number of URLs","title":"Nb Urls","type":"integer"},"pct_urls_with_clicks":{"description":"Percentage of URLs with clicks","title":"Pct Urls With Clicks","type":"number"},"impressions":{"description":"Total impressions","title":"Impressions","type":"integer"},"clicks":{"description":"Total clicks","title":"Clicks","type":"integer"},"ctr_global":{"description":"Global CTR","title":"Ctr Global","type":"number"}},"required":["avg_position","device","nb_urls","pct_urls_with_clicks","impressions","clicks","ctr_global"],"title":"CTRDataPoint","type":"object"},"DeviceOpportunity":{"properties":{"position":{"description":"Target ranking position","title":"Position","type":"integer"},"additional_clicks":{"description":"Additional clicks expected at this position","title":"Additional Clicks","type":"number"},"target_ctr":{"description":"Expected CTR at target position (as %)","title":"Target Ctr","type":"number"},"current_ctr":{"description":"Current CTR (as %)","title":"Current Ctr","type":"number"}},"required":["position","additional_clicks","target_ctr","current_ctr"],"title":"DeviceOpportunity","type":"object"},"FilteredCTRMetrics":{"properties":{"impressions":{"title":"Impressions","type":"integer"},"clicks":{"title":"Clicks","type":"integer"},"ctr":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Ctr"},"avg_position":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Position"},"desktop_tablet_impressions":{"title":"Desktop Tablet Impressions","type":"integer"},"desktop_tablet_clicks":{"title":"Desktop Tablet Clicks","type":"integer"},"desktop_tablet_ctr":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Desktop Tablet Ctr"},"desktop_tablet_avg_position":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Desktop Tablet Avg Position"},"mobile_impressions":{"title":"Mobile Impressions","type":"integer"},"mobile_clicks":{"title":"Mobile Clicks","type":"integer"},"mobile_ctr":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Mobile Ctr"},"mobile_avg_position":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Mobile Avg Position"}},"required":["impressions","clicks","ctr","avg_position","desktop_tablet_impressions","desktop_tablet_clicks","desktop_tablet_ctr","desktop_tablet_avg_position","mobile_impressions","mobile_clicks","mobile_ctr","mobile_avg_position"],"title":"FilteredCTRMetrics","type":"object"},"OpportunitiesByDevice":{"properties":{"mobile":{"description":"Opportunities for mobile devices","items":{"$ref":"#/$defs/DeviceOpportunity"},"title":"Mobile","type":"array"},"desktop":{"description":"Opportunities for desktop devices","items":{"$ref":"#/$defs/DeviceOpportunity"},"title":"Desktop","type":"array"}},"required":["mobile","desktop"],"title":"OpportunitiesByDevice","type":"object"}},"properties":{"global_ctr_mobile":{"description":"Global CTR data for mobile devices by position","items":{"$ref":"#/$defs/CTRDataPoint"},"title":"Global Ctr Mobile","type":"array"},"global_ctr_desktop_and_tablet":{"description":"Global CTR data for desktop and tablet devices by position","items":{"$ref":"#/$defs/CTRDataPoint"},"title":"Global Ctr Desktop And Tablet","type":"array"},"ctr_for_filter":{"anyOf":[{"items":{"$ref":"#/$defs/FilteredCTRMetrics"},"type":"array"},{"type":"null"}],"description":"CTR metrics for the specific URL or keyword filter","title":"Ctr For Filter"},"opportunities":{"anyOf":[{"$ref":"#/$defs/OpportunitiesByDevice"},{"type":"null"}],"description":"Potential additional clicks by improving to each position"},"opportunities_explanations":{"description":"Explanation of what the opportunities data represents","title":"Opportunities Explanations","type":"string"}},"required":["global_ctr_mobile","global_ctr_desktop_and_tablet","ctr_for_filter","opportunities","opportunities_explanations"],"title":"GooglePositionOpportunitiesProcessedItem","type":"object"},"has_canvas":false,"open_canvas_automatically":false},{"id":"google_search","name":"Google Search","alias":"GoogleSearch","aliases":[],"description_short":"Ask a question about Google Search results","description_long":"Get feature snippets (e.g., Google shopping, images, video, people also search/ask), blue links, and knowledge graphs from real-time Google results.","description_tool_prompt":"Get feature snippets (e.g., Google shopping, images, video, people also search/ask), blue links, and knowledge graphs from real-time Google results.","source":"Browser Fetching on Google Search","conversation_examples":["What are the main SERP features for 'how to make pizza'?","Who ranks in the top 3 for 'best running shoes'?","What questions appear in People Also Ask for 'climate change'?","Is there a knowledge graph for 'Albert Einstein'?","What shopping results appear for 'wireless headphones'?"],"tags":["keywords","web search","google"],"available_in_chat":true,"available_in_deepthink":true,"available_in_mcp":false,"mcp_audience":"all","config":{"type":"object","properties":{"location_request":{"description":"Location request (ex: Paris, FR), will translate to location ID","title":"Location Request","type":"string"},"device":{"default":"mobile","description":"Device to use for search","enum":["mobile","desktop"],"title":"Device","type":"string"}},"required":["location_request"]},"item":{"type":"object","properties":{"query":{"description":"The search query to analyze","title":"Query","type":"string"},"question":{"description":"What do you want to know about the search results?","title":"Question","type":"string"}},"required":["query","question"]},"response":{"$defs":{"GoogleSearchRawResults":{"properties":{"keyword":{"title":"Keyword","type":"string"},"type":{"title":"Type","type":"string"},"se_domain":{"title":"Se Domain","type":"string"},"location_code":{"title":"Location Code","type":"integer"},"language_code":{"title":"Language Code","type":"string"},"check_url":{"title":"Check Url","type":"string"},"datetime":{"title":"Datetime","type":"string"},"spell":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Spell"},"item_types":{"items":{"type":"string"},"title":"Item Types","type":"array"},"se_results_count":{"title":"Se Results Count","type":"integer"},"items_count":{"title":"Items Count","type":"integer"},"items":{"items":{"additionalProperties":true,"type":"object"},"title":"Items","type":"array"}},"required":["keyword","type","se_domain","location_code","language_code","check_url","datetime","spell","item_types","se_results_count","items_count","items"],"title":"GoogleSearchRawResults","type":"object"}},"properties":{"answer":{"description":"The answer to the question","title":"Answer","type":"string"},"results":{"$ref":"#/$defs/GoogleSearchRawResults","description":"The SERP results used to generate the answer"}},"required":["answer","results"],"title":"GoogleSearchProcessedItem","type":"object"},"has_canvas":true,"open_canvas_automatically":false},{"id":"google_serp","name":"Google SERP","alias":"GoogleSerp","aliases":["google_search_raw"],"description_short":"Fetch the Google SERP for a given query (returns all data)","description_long":"\n    Fetch the Google SERP for a given query (returns all data).\n\n    When `save_to_tmp_storage` is enabled, the SERP results are written to\n    temporary project storage and a URL is returned instead of the inline results.\n    ","description_tool_prompt":"\n    Fetch the Google SERP for a given query (returns all data).\n\n    When `save_to_tmp_storage` is enabled, the SERP results are written to\n    temporary project storage and a URL is returned instead of the inline results.\n    ","source":"Google","conversation_examples":[],"tags":["keywords","web search"],"available_in_chat":false,"available_in_deepthink":false,"available_in_mcp":true,"mcp_audience":"all","config":{"type":"object","properties":{"location_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"Location ID (optional)","title":"Location Id"},"location_request":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Location request (ex: Paris, FR), will translate to location ID","title":"Location Request"},"country_code":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"ISO3166 country code (ex: GB)","title":"Country Code"},"lang_code":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"BCP47 language code (ex: \"en\", \"en-GB\")","title":"Lang Code"},"device":{"default":"mobile","description":"Device to use for search (optional - defaults to mobile)","enum":["mobile","desktop"],"title":"Device","type":"string"},"save_to_tmp_storage":{"default":false,"description":"Save the bulky result payload to Botify temporary storage and return the temporary URL instead of the payload. Use this to save output tokens.","title":"Save To Temporary Storage","type":"boolean"},"limit":{"default":30,"description":"Limit the number of results (optional - defaults to 30)","title":"Limit","type":"integer"},"data_level":{"default":"main","description":"Should we return just main information (item_type (organic, shopping, knowledge_graph, people_also_ask, people_also_search...), title, description, rank), or all information (featured snippets, ratings, prices, refinement chips...)","enum":["main","all"],"title":"Data Level","type":"string"}},"required":[]},"item":{"type":"object","properties":{"query":{"description":"The search query to analyze","maxLength":700,"title":"Query","type":"string"}},"required":["query"]},"response":{"$defs":{"GoogleSearchRawResults":{"properties":{"keyword":{"title":"Keyword","type":"string"},"type":{"title":"Type","type":"string"},"se_domain":{"title":"Se Domain","type":"string"},"location_code":{"title":"Location Code","type":"integer"},"language_code":{"title":"Language Code","type":"string"},"check_url":{"title":"Check Url","type":"string"},"datetime":{"title":"Datetime","type":"string"},"spell":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Spell"},"item_types":{"items":{"type":"string"},"title":"Item Types","type":"array"},"se_results_count":{"title":"Se Results Count","type":"integer"},"items_count":{"title":"Items Count","type":"integer"},"items":{"items":{"additionalProperties":true,"type":"object"},"title":"Items","type":"array"}},"required":["keyword","type","se_domain","location_code","language_code","check_url","datetime","spell","item_types","se_results_count","items_count","items"],"title":"GoogleSearchRawResults","type":"object"}},"properties":{"results":{"anyOf":[{"$ref":"#/$defs/GoogleSearchRawResults"},{"type":"null"}],"default":null,"description":"The SERP results. Omitted when `save_to_tmp_storage` is True; see `results_tmp_storage_url` instead."},"results_tmp_storage_url":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Temporary storage URL of the SERP results. Returned instead of `results` when `save_to_tmp_storage` is True.","title":"Results Tmp Storage Url"},"location_name":{"description":"description of output2","title":"Location Name","type":"string"},"query":{"description":"The search query to analyze","title":"Query","type":"string"}},"required":["location_name","query"],"title":"GoogleSearchRawProcessedItem","type":"object"},"has_canvas":false,"open_canvas_automatically":false},{"id":"google_trends","name":"Google Trends","alias":"GoogleTrends","aliases":[],"description_short":"Get Google Trends data for one or more keywords.","description_long":"\n    Analyze search trend data to understand how interest in specific keywords has\n    changed over time, compare keyword popularity, and discover seasonal trends.\n    Data is worldwide unless a location is set; cities are widened to their region\n    or country. Related topics and related queries are only returned when a single\n    keyword is requested; with several keywords, only the interest-over-time graph\n    is returned.\n\n    When `save_to_tmp_storage` is enabled, the trend results are written to\n    temporary project storage and a URL is returned instead of the inline payload.\n    ","description_tool_prompt":"\n    Analyze search trend data to understand how interest in specific keywords has\n    changed over time, compare keyword popularity, and discover seasonal trends.\n    Data is worldwide unless a location is set; cities are widened to their region\n    or country. Related topics and related queries are only returned when a single\n    keyword is requested; with several keywords, only the interest-over-time graph\n    is returned.\n\n    When `save_to_tmp_storage` is enabled, the trend results are written to\n    temporary project storage and a URL is returned instead of the inline payload.\n    ","source":"Browser Fetching on Google Trends","conversation_examples":["Compare the search trends for 'artificial intelligence' and 'machine learning' over the last year","What are the seasonal trends for 'winter boots'?","Show me the rising interest in 'sustainable fashion' in the US","Has interest in 'work from home' decreased since 2021?","Compare trends for 'iPhone' vs 'Samsung' during product launch months"],"tags":["keywords"],"available_in_chat":true,"available_in_deepthink":true,"available_in_mcp":true,"mcp_audience":"all","config":{"type":"object","properties":{"location_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"Location ID (optional)","title":"Location Id"},"location_request":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Location request (ex: Paris, FR), will translate to the closest Google Trends location (country or region). Leave empty or use \"Worldwide\" for worldwide data.","title":"Location Request"},"country_code":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"ISO3166 country code (ex: GB)","title":"Country Code"},"lang_code":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"BCP47 language code (ex: \"en\", \"en-GB\")","title":"Lang Code"},"save_to_tmp_storage":{"default":false,"description":"Save the bulky result payload to Botify temporary storage and return the temporary URL instead of the payload. Use this to save output tokens.","title":"Save To Temporary Storage","type":"boolean"}},"required":[]},"item":{"type":"object","properties":{"keywords":{"description":"List of keywords to analyze (up to 5)","items":{"type":"string"},"maxItems":5,"title":"Keywords","type":"array"}},"required":["keywords"]},"response":{"properties":{"keywords":{"description":"List of keywords analyzed","items":{"type":"string"},"title":"Keywords","type":"array"},"date_from":{"description":"Start date of the trends data in YYYY-MM-DD format","title":"Date From","type":"string"},"date_to":{"description":"End date of the trends data in YYYY-MM-DD format","title":"Date To","type":"string"},"location_id":{"description":"Location ID used for the Google Trends request (0 means worldwide). It can be a parent of the requested location because Google Trends does not support cities.","title":"Location Id","type":"integer"},"location_name":{"description":"Name of the location used for the Google Trends request (ex: \"Ile-de-France,France\", or \"Worldwide\")","title":"Location Name","type":"string"},"lang_code":{"description":"Language code used for the Google Trends request","title":"Lang Code","type":"string"},"graph":{"anyOf":[{"additionalProperties":true,"description":"Graph data showing search interest over time. Omitted when `save_to_tmp_storage` is True; see `results_tmp_storage_url` instead.","type":"object"},{"type":"null"}],"default":null,"title":"Graph"},"topics":{"anyOf":[{"additionalProperties":true,"description":"Topics data related to the keywords. Omitted when `save_to_tmp_storage` is True; see `results_tmp_storage_url` instead.","type":"object"},{"type":"null"}],"default":null,"title":"Topics"},"queries":{"anyOf":[{"additionalProperties":true,"description":"Queries data related to the keywords. Omitted when `save_to_tmp_storage` is True; see `results_tmp_storage_url` instead.","type":"object"},{"type":"null"}],"default":null,"title":"Queries"},"results_tmp_storage_url":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Temporary storage URL of the trends payload (`graph`, `topics` and `queries`). Returned instead of those fields when `save_to_tmp_storage` is True.","title":"Results Tmp Storage Url"}},"required":["keywords","date_from","date_to","location_id","location_name","lang_code"],"title":"GoogleTrendsProcessedItem","type":"object"},"has_canvas":true,"open_canvas_automatically":true},{"id":"google_url_inspection","name":"Google URL Inspection","alias":"GoogleURLInspection","aliases":[],"description_short":"Get Google URL Inspection data for a specific URL.","description_long":"Get information about Google's indexed version of a page from the URL Inspection Tool, including indexing problems encountered and structured data, video, linked AMP, and indexability details.","description_tool_prompt":"Get information about Google's indexed version of a page from the URL Inspection Tool, including indexing problems encountered and structured data, video, linked AMP, and indexability details.","source":"Google Search Console API","conversation_examples":["Run Google URL Inspection for https://www.example.org/p/5866-toothbrush?","Is https://www.example.org/p/5866-toothbrush indexed by Google?"],"tags":["google"],"available_in_chat":true,"available_in_deepthink":true,"available_in_mcp":true,"mcp_audience":"all","config":{"type":"object","properties":{"include_summary":{"default":true,"description":"When true, generate an LLM summary of the inspection; when false, summary is null.","title":"Include Summary","type":"boolean"}},"required":[]},"item":{"type":"object","properties":{"url":{"description":"The URL to inspect","title":"URL","type":"string"}},"required":["url"]},"response":{"properties":{"url":{"description":"The URL that was inspected","title":"Url","type":"string"},"inspection_result":{"additionalProperties":true,"description":"The result of the URL inspection","title":"Inspection Result","type":"object"},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Summary of the URL inspection result; null when disabled","title":"Summary"}},"required":["url","inspection_result","summary"],"title":"GoogleURLInspectionProcessedItem","type":"object"},"has_canvas":true,"open_canvas_automatically":false},{"id":"html_code_executor","name":"HTML Executor","alias":"HtmlCodeExecutor","aliases":[],"description_short":"Execute a JavaScript function on HTML from SiteCrawler crawls.","description_long":"\n    Execute custom JavaScript extraction functions on HTML content from SiteCrawler.\n\n    This agent is optimized for batch processing - when processing multiple URLs,\n    they are sent to javascript executor together for better performance.\n\n    The JavaScript function should be in the format 'function() { ... }' and has\n    access to a `document` object for DOM traversal (querySelector, querySelectorAll, etc.).\n\n    If no crawl is specified (analysis_slug in config), the last successful crawl is used.\n    Temporary uploaded URLs on https://app.botify.com/:organization/:project/o/storage/tmp\n    are resolved from project storage and do not require a crawl.\n\n    Each input URL may carry a list of quality control expectations. When set,\n    the agent evaluates them against the extracted JSON result and reports, per\n    item, whether all expectations passed and the details of any failures.\n    ","description_tool_prompt":"\n    Execute a JavaScript function on HTML from a SiteCrawler crawl or a\n    temporary uploaded file.\n\n    The function must be written as `function() { ... }` and return\n    JSON-serializable data. A `document` object is pre-created for DOM queries.\n\n    For the full JavaScript API (Document, Element, helpers, runtime\n    differences vs a browser), call tool_documentation with\n    tool_name=\"html_code_executor\".\n\n    If no crawl is specified (analysis_slug), the last successful regular crawl\n    is used. Temporary uploaded URLs on\n    https://app.botify.com/:organization/:project/o/storage/tmp are resolved\n    from project storage and do not require a crawl.\n\n    Each input URL may carry quality control expectations evaluated against the\n    extracted JSON.\n    ","source":null,"conversation_examples":[],"tags":[],"available_in_chat":true,"available_in_deepthink":true,"available_in_mcp":true,"mcp_audience":"all","config":{"type":"object","properties":{"function":{"description":"JavaScript function to execute on the HTML. Should be in the format 'function() { ... }' and return the extracted data.","title":"JavaScript Function","type":"string"}},"required":["function"]},"item":{"type":"object","properties":{"url":{"description":"URL to execute the JavaScript function on. Temporary uploaded URLs on https://app.botify.com/:organization/:project/o/storage/tmp are allowed.","title":"URL","type":"string"},"expectations":{"default":[],"description":"Quality control expectations the extracted result must satisfy. When provided, the agent evaluates them against the extracted JSON and reports any failures.","items":{"$ref":"#/$defs/Expectation"},"title":"Expectations","type":"array"}},"required":["url"],"$defs":{"ArrayItemMatch":{"description":"A sub-object pattern that at least one array item must match.\n\nThe mapping ``fields`` is keyed by the sub-object's attribute names\n(e.g. ``{\"review_text\": \"great\", \"review_rating\": 5}``). Keys not\nlisted here are not checked.\n\nFor convenience, a bare sub-object is accepted as a shorthand for\n``fields``: ``{\"name\": \"Année\", \"value\": \"1982\"}`` is normalised to\n``{\"fields\": {\"name\": \"Année\", \"value\": \"1982\"}}``. To match an array of\n*scalars* (e.g. a list of URLs), pass the scalar directly in\n``expected_array_items`` rather than an :class:`ArrayItemMatch`.","properties":{"fields":{"additionalProperties":true,"description":"Sub-object fields to match (subset, no exhaustivity required)","title":"Fields","type":"object"},"instructions":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Free-form note describing how to locate this item in the page. Never used by the evaluator — purely informational.","title":"Instructions"}},"title":"ArrayItemMatch","type":"object"},"Expectation":{"description":"An expectation about a single field of the extracted JSON.\n\nExactly one of ``expected_value`` (for scalar fields),\n``expected_array_items`` (for array-item patterns) or\n``expected_length`` (for the length of an array field) must be set. The\n``operator`` is only meaningful for scalar and length expectations.","properties":{"field":{"description":"Name of the extracted JSON field to check. Supports dotted paths for nested objects (e.g. ``dimensions.width``).","title":"Field","type":"string"},"operator":{"default":"equals","description":"Predicate applied between the actual value and ``expected_value`` (scalar expectations) or between the array length and ``expected_length`` (length expectations). Defaults to ``equals``. Length expectations support only ``equals`` / ``gt`` / ``gte`` / ``lt`` / ``lte``.","enum":["equals","contains","matches_regex","gt","gte","lt","lte"],"title":"Operator","type":"string"},"expected_value":{"anyOf":[{},{"type":"null"}],"default":null,"description":"Expected scalar value (set when the field is a scalar)","title":"Expected Value"},"expected_array_items":{"anyOf":[{"items":{"anyOf":[{"$ref":"#/$defs/ArrayItemMatch"},{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"}]},"type":"array"},{"type":"null"}],"default":null,"description":"Patterns to match against array items (set when the field is an array). Each pattern is either a scalar — the array must contain an item equal to it (use this for arrays of strings or numbers, e.g. image URLs) — or a sub-object of fields, in which case at least one array item must match all the listed fields. For each pattern, at least one item must match.","title":"Expected Array Items"},"expected_length":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"Expected number of items of an array field (set to assert on the array length). Combined with ``operator`` (equals / gt / gte / lt / lte).","title":"Expected Length"},"instructions":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Free-form note describing how to locate this field on the page. Never used by the evaluator — purely informational.","title":"Instructions"}},"required":["field"],"title":"Expectation","type":"object"}}},"response":{"$defs":{"ExpectationFailure":{"description":"A single expectation that did not hold against the extracted JSON.","properties":{"attribute":{"description":"The (possibly dotted) field that failed","title":"Attribute","type":"string"},"expected":{"anyOf":[{},{"type":"null"}],"default":null,"description":"What was expected (scalar value or array patterns)","title":"Expected"},"result":{"anyOf":[{},{"type":"null"}],"default":null,"description":"The value actually extracted (None when absent/null)","title":"Result"},"message":{"description":"Human-readable error message","title":"Message","type":"string"}},"required":["attribute","message"],"title":"ExpectationFailure","type":"object"}},"description":"Output from HTML executor agent.","properties":{"url":{"description":"The URL that was processed","title":"Url","type":"string"},"crawl":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Crawl Slug from SiteCrawler","title":"Crawl"},"url_found":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":false,"description":"Whether the URL was found in the crawl index","title":"Url Found"},"result":{"anyOf":[{},{"type":"null"}],"default":null,"description":"Result of executing the function on the HTML","title":"Result"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Error if function execution failed","title":"Error"},"quality_control_passed":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"description":"True when every expectation holds against the extracted result, False when at least one fails, None when no expectations were provided.","title":"Quality Control Passed"},"quality_control_failures":{"default":[],"description":"One entry per failed expectation (empty when passed or when no expectations were provided).","items":{"$ref":"#/$defs/ExpectationFailure"},"title":"Quality Control Failures","type":"array"}},"required":["url"],"title":"HTMLExecutorProcessedItem","type":"object"},"has_canvas":false,"open_canvas_automatically":false},{"id":"html_extract_images","name":"HTML Extract Images","alias":"HTMLExtractImages","aliases":[],"description_short":"Extract main images from a webpage with URLs and copyright info.","description_long":"\n    Extract main images from a webpage (excluding logos, icons, and decorative elements) to analyze visual content, build new web pages, and ensure proper image attribution.\n    This agent focuses on important content images and provides image URLs, titles, and copyright information, when available.\n    ","description_tool_prompt":"\n    Extract main images from a webpage (excluding logos, icons, and decorative elements) to analyze visual content, build new web pages, and ensure proper image attribution.\n    This agent focuses on important content images and provides image URLs, titles, and copyright information, when available.\n    ","source":"Page content","conversation_examples":["Extract images from https://www.example.com/p/my-product","Write an HTML page of Things to do in NYC. Ask @perplexity things to do in New York, and fetch images from the first 3 resources to enrich the page."],"tags":["content"],"available_in_chat":true,"available_in_deepthink":true,"available_in_mcp":false,"mcp_audience":"all","config":{"type":"object","properties":{},"required":[]},"item":{"type":"object","properties":{"url":{"description":"The URL to extract images fro","title":"URL","type":"string"},"country_code":{"anyOf":[{"type":"string"},{"type":"null"}],"default":"us","description":"The country code to use for the real-time fetch. 2 letters lowercase.","title":"Country Code"}},"required":["url"]},"response":{"$defs":{"HTMLExtractImage":{"properties":{"image_url":{"description":"Image URL. If the image is relative, make it absolute (user will provide the domain)","title":"Image Url","type":"string"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Title (if available from alt text, title attribute or nearby headings)","title":"Title"},"copyright":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Copyright information (if available)","title":"Copyright"}},"required":["image_url","title","copyright"],"title":"HTMLExtractImage","type":"object"}},"properties":{"images":{"description":"The list of images extracted from the HTML page","items":{"$ref":"#/$defs/HTMLExtractImage"},"title":"Images","type":"array"}},"required":["images"],"title":"HTMLExtractImagesProcessedItem","type":"object"},"has_canvas":true,"open_canvas_automatically":false},{"id":"html_extractor_css_selector","name":"HTML Extractor through CSS Selector","alias":"HTMLExtractorCSSSelector","aliases":[],"description_short":"Generate a CSS selector to extract data from a given HTML page.","description_long":"\n    Get the CSS selector for a given element.\n    ","description_tool_prompt":"\n    Get the CSS selector for a given element.\n    ","source":"SiteCrawler or Browser fetching","conversation_examples":["Related products section, product count, right navigation bar."],"tags":["content"],"available_in_chat":true,"available_in_deepthink":true,"available_in_mcp":false,"mcp_audience":"all","config":{"type":"object","properties":{},"required":[]},"item":{"type":"object","properties":{"url":{"description":"The URL to be used","title":"Url","type":"string"},"extract_description":{"description":"The description of the element for which we want the CSS selector","title":"Extract Description","type":"string"}},"required":["url","extract_description"]},"response":{"$defs":{"CssSelectorPreview":{"properties":{"descriptors":{"anyOf":[{"items":{"$ref":"#/$defs/PreviewDescriptor"},"type":"array"},{"type":"null"}],"default":null,"title":"Descriptors"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Error"}},"title":"CssSelectorPreview","type":"object"},"PreviewAttribute":{"properties":{"key":{"title":"Key","type":"string"},"value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Value"},"truncated":{"title":"Truncated","type":"boolean"}},"required":["key","value","truncated"],"title":"PreviewAttribute","type":"object"},"PreviewDescriptor":{"properties":{"tag":{"title":"Tag","type":"string"},"first_attributes":{"items":{"$ref":"#/$defs/PreviewAttribute"},"title":"First Attributes","type":"array"},"inner_html_excerpt":{"$ref":"#/$defs/PreviewExcerpt"},"inner_text_excerpt":{"$ref":"#/$defs/PreviewExcerpt"},"has_other_attributes":{"title":"Has Other Attributes","type":"boolean"}},"required":["tag","first_attributes","inner_html_excerpt","inner_text_excerpt","has_other_attributes"],"title":"PreviewDescriptor","type":"object"},"PreviewExcerpt":{"properties":{"value":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Value"},"truncated":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"title":"Truncated"}},"title":"PreviewExcerpt","type":"object"}},"properties":{"crawl":{"anyOf":[{"type":"string"},{"type":"null"}],"default":"","description":"If fetched from sitecrawler, the crawl where the URL was found","title":"Crawl"},"css_selector":{"anyOf":[{"type":"string"},{"type":"null"}],"default":"","description":"The CSS selector extracted for the user description","title":"Css Selector"},"preview":{"anyOf":[{"$ref":"#/$defs/CssSelectorPreview"},{"type":"null"}],"default":null,"description":"Preview of the extracted data using the CSS selector"},"validation":{"anyOf":[{"type":"string"},{"type":"null"}],"default":"Error during validation","description":"Validation status or error message","title":"Validation"}},"title":"HtmlExtractorCssSelectorProcessedItem","type":"object"},"has_canvas":false,"open_canvas_automatically":false},{"id":"html_fetch","name":"HTML Fetch","alias":"HtmlFetch","aliases":[],"description_short":"Get the HTML of a given URL.","description_long":"\n    Fetch the HTML of a URL, from the Botify SiteCrawler archive by default, or\n    live through a real-time fetch or the rendering farm (which executes the page\n    JavaScript) when `origin` asks for it.\n\n    The HTML is cleaned before being returned: `remove_tags` drops the listed tags,\n    `only_body` keeps the body only and `only_text` strips the markup down to text.\n\n    Set `save_to_tmp_storage` to upload the HTML to temporary project storage and\n    return its URL instead of the HTML inline. This option writes a new temporary\n    object.\n\n    A rendering-farm fetch leaves from the same network the project's own crawl\n    renders from, resolved from the project settings against the execution\n    environments the farm offers. It falls back to the farm's default\n    environment when those settings or that list are out of reach, or when no\n    environment serves the project's network. `rendering_farm_network` renders\n    from a named network instead, and fails rather than falling back.\n    ","description_tool_prompt":"\n    Fetch the HTML of a URL, from the Botify SiteCrawler archive by default, or\n    live through a real-time fetch or the rendering farm (which executes the page\n    JavaScript) when `origin` asks for it.\n\n    The HTML is cleaned before being returned: `remove_tags` drops the listed tags,\n    `only_body` keeps the body only and `only_text` strips the markup down to text.\n\n    Set `save_to_tmp_storage` to upload the HTML to temporary project storage and\n    return its URL instead of the HTML inline. This option writes a new temporary\n    object.\n\n    A rendering-farm fetch leaves from the same network the project's own crawl\n    renders from, resolved from the project settings against the execution\n    environments the farm offers. It falls back to the farm's default\n    environment when those settings or that list are out of reach, or when no\n    environment serves the project's network. `rendering_farm_network` renders\n    from a named network instead, and fails rather than falling back.\n    ","source":null,"conversation_examples":[],"tags":[],"available_in_chat":false,"available_in_deepthink":false,"available_in_mcp":true,"mcp_audience":"all","config":{"type":"object","properties":{"save_to_tmp_storage":{"default":false,"description":"Save the fetched HTML to Botify temporary storage and return the temporary URL instead of the HTML. Use this to save output tokens. The returned URL can be passed to `tmp_storage_read`, `tmp_storage_grep`, `tmp_storage_jq`, and other HTML-processing tools.","title":"Save To Temporary Storage","type":"boolean"}},"required":[]},"item":{"type":"object","properties":{"url":{"description":"The URL to fetch HTML for. Temporary uploaded URLs on https://app.botify.com/:organization/:project/o/storage/tmp are allowed.","title":"URL","type":"string"},"origin":{"$ref":"#/$defs/OriginEnum","default":"site_crawler","description":"The origin of the URL","enumNames":["Botify SiteCrawler","Real Time Fetch URL","Rendering Farm","Temporary upload"],"title":"Origin"},"country_code":{"default":"us","description":"The country code to use for the real-time fetch. 2 letters lowercase","title":"Country Code","type":"string"},"fallback_real_time_fetch":{"default":false,"description":"Fallback to real_time_fetch_url if the URL is not found in SiteCrawler","title":"Fallback To Real Time Fetch","type":"boolean"},"only_text":{"default":false,"description":"Only return the text of the page","title":"Only Text","type":"boolean"},"only_body":{"default":false,"description":"Only return the body of the page","title":"Only Body","type":"boolean"},"remove_tags":{"default":["script","noscript","style","header","footer","nav","aside","form","svg","iframe"],"description":"Remove all tags from the HTML","items":{"description":"The tag to remove","title":"Tag","type":"string"},"title":"Remove Tags","type":"array"}},"required":["url"],"$defs":{"OriginEnum":{"enum":["site_crawler","real_time_fetch_url","rendering_farm","temporary_upload"],"title":"OriginEnum","type":"string"}}},"response":{"$defs":{"OriginEnum":{"enum":["site_crawler","real_time_fetch_url","rendering_farm","temporary_upload"],"title":"OriginEnum","type":"string"}},"properties":{"origin":{"anyOf":[{"$ref":"#/$defs/OriginEnum"},{"type":"null"}],"default":null,"description":"The origin of the HTML (site_crawler, real_time_fetch_url, rendering_farm, or temporary_upload)"},"crawl":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Crawl Slug from SiteCrawler","title":"Crawl"},"html":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"HTML content of the page. Omitted when `save_to_tmp_storage` is True; see `html_tmp_storage_url` instead.","title":"Html"},"html_tmp_storage_url":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Temporary storage URL of the HTML page. Returned instead of `html` when `save_to_tmp_storage` is True. Can be passed to `tmp_storage_read`, `tmp_storage_grep`, `tmp_storage_jq`, and other HTML-processing tools.","title":"Html Tmp Storage Url"},"status_code":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"HTTP status code of the response","title":"Status Code"},"headers":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"default":null,"description":"HTTP headers of the response","title":"Headers"},"iframe_allowed":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"description":"Whether iframes are allowed in the response","title":"Iframe Allowed"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Reason for failure, if any","title":"Reason"}},"title":"HTMLFetchProcessedItem","type":"object"},"has_canvas":false,"open_canvas_automatically":false},{"id":"html_grep","name":"HTML Grep","alias":"HTMLGrep","aliases":[],"description_short":"Search expressions in a page HTML and return surrounding context.","description_long":"\n    Fetch the HTML of a given URL and search for one or more expressions in it.\n\n    For each occurrence found, the agent returns the matching text along with\n    a configurable number of characters of context on each side. Each expression\n    can be a literal substring (default) or a Python regular expression, and is\n    configured independently (case sensitivity, max matches, context size).\n    ","description_tool_prompt":"\n    Fetch the HTML of a given URL and search for one or more expressions in it.\n\n    For each occurrence found, the agent returns the matching text along with\n    a configurable number of characters of context on each side. Each expression\n    can be a literal substring (default) or a Python regular expression, and is\n    configured independently (case sensitivity, max matches, context size).\n    ","source":"SiteCrawler or Browser fetching","conversation_examples":["Find every occurrence of \"add to cart\" in https://www.example.com/p/123","Grep the regex \"price\\s*:\\s*\\$\\d+\" on https://www.example.com"],"tags":["content"],"available_in_chat":true,"available_in_deepthink":true,"available_in_mcp":true,"mcp_audience":"all","config":{"type":"object","properties":{"save_to_tmp_storage":{"default":false,"description":"Save the fetched HTML to Botify temporary storage and return the temporary URL instead of the HTML. Use this to save output tokens. The returned URL can be passed to `tmp_storage_read`, `tmp_storage_grep`, `tmp_storage_jq`, and other HTML-processing tools.","title":"Save To Temporary Storage","type":"boolean"},"queries":{"description":"List of search queries to run against the fetched HTML. Each query is processed independently and shared by all items in a batch.","items":{"$ref":"#/$defs/HtmlGrepQuery"},"minItems":1,"title":"Queries","type":"array"}},"required":["queries"],"$defs":{"HtmlGrepQuery":{"properties":{"expression":{"description":"Expression to search in the HTML. Interpreted as a literal substring unless `is_regex` is True.","minLength":1,"title":"Expression","type":"string"},"n_chars":{"default":100,"description":"Number of characters of context to keep on each side of the match.","minimum":0,"title":"N Chars","type":"integer"},"is_regex":{"default":false,"description":"If True, `expression` is interpreted as a Python regular expression. Otherwise, it is treated as a literal substring.","title":"Is Regex","type":"boolean"},"case_sensitive":{"default":true,"description":"If True, the search is case-sensitive.","title":"Case Sensitive","type":"boolean"},"max_matches":{"default":10,"description":"Maximum number of matches returned for this query. Use 0 (or a negative value) to return all matches.","title":"Max Matches","type":"integer"}},"required":["expression"],"title":"HtmlGrepQuery","type":"object"}}},"item":{"type":"object","properties":{"url":{"description":"The URL to fetch the HTML from. Temporary uploaded URLs on https://app.botify.com/:organization/:project/o/storage/tmp are allowed.","title":"Url","type":"string"}},"required":["url"]},"response":{"$defs":{"HtmlGrepMatch":{"properties":{"match":{"description":"The exact substring that matched","title":"Match","type":"string"},"context":{"description":"The match with up to `n_chars` characters around it","title":"Context","type":"string"},"start":{"description":"Start offset of the match in the HTML","title":"Start","type":"integer"},"end":{"description":"End offset of the match in the HTML","title":"End","type":"integer"}},"required":["match","context","start","end"],"title":"HtmlGrepMatch","type":"object"},"HtmlGrepQuery":{"properties":{"expression":{"description":"Expression to search in the HTML. Interpreted as a literal substring unless `is_regex` is True.","minLength":1,"title":"Expression","type":"string"},"n_chars":{"default":100,"description":"Number of characters of context to keep on each side of the match.","minimum":0,"title":"N Chars","type":"integer"},"is_regex":{"default":false,"description":"If True, `expression` is interpreted as a Python regular expression. Otherwise, it is treated as a literal substring.","title":"Is Regex","type":"boolean"},"case_sensitive":{"default":true,"description":"If True, the search is case-sensitive.","title":"Case Sensitive","type":"boolean"},"max_matches":{"default":10,"description":"Maximum number of matches returned for this query. Use 0 (or a negative value) to return all matches.","title":"Max Matches","type":"integer"}},"required":["expression"],"title":"HtmlGrepQuery","type":"object"},"HtmlGrepQueryResult":{"properties":{"query":{"$ref":"#/$defs/HtmlGrepQuery","description":"The query this result corresponds to (echoed back)"},"matches":{"default":[],"description":"Matches found for this query, up to `max_matches`","items":{"$ref":"#/$defs/HtmlGrepMatch"},"title":"Matches","type":"array"},"total_matches":{"default":0,"description":"Total number of matches found in the HTML for this query (may be greater than `len(matches)` when truncated).","title":"Total Matches","type":"integer"},"truncated":{"default":false,"description":"True if results were truncated by `max_matches`.","title":"Truncated","type":"boolean"}},"required":["query"],"title":"HtmlGrepQueryResult","type":"object"}},"properties":{"crawl":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"If fetched from SiteCrawler, the crawl slug used","title":"Crawl"},"results":{"default":[],"description":"One result per input query, in the same order as `queries`.","items":{"$ref":"#/$defs/HtmlGrepQueryResult"},"title":"Results","type":"array"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Reason for an empty result, if any","title":"Reason"}},"title":"HtmlGrepProcessedItem","type":"object"},"has_canvas":false,"open_canvas_automatically":false},{"id":"html_lang","name":"HTML Lang","alias":"HtmlLang","aliases":[],"description_short":"Get the language of a given HTML page (BCP47 format)","description_long":"A simple agent that returns the language of a given HTML page (BCP47 format).\nFirst, we try to read the lang attribute on the html tag.\nIf we don't find it, extract the text from the html and ask to a LLM.","description_tool_prompt":"A simple agent that returns the language of a given HTML page (BCP47 format).\nFirst, we try to read the lang attribute on the html tag.\nIf we don't find it, extract the text from the html and ask to a LLM.","source":null,"conversation_examples":[],"tags":[],"available_in_chat":false,"available_in_deepthink":false,"available_in_mcp":null,"mcp_audience":"all","config":{"type":"object","properties":{"default_to":{"default":"","description":"If we don't find, return this value (if not empty) instead of an error.","title":"Default To","type":"string"}},"required":[]},"item":{"type":"object","properties":{"html_code":{"description":"HTML code of the page to process","title":"Html Code","type":"string"}},"required":["html_code"]},"response":{"properties":{"bcp47_lang_code":{"description":"BCP47 language code of the page","title":"Bcp47 Lang Code","type":"string"},"source":{"description":"Source of the language code (html_attribute, llm or default)","title":"Source","type":"string"}},"required":["bcp47_lang_code","source"],"title":"HtmlLangProcessedItem","type":"object"},"has_canvas":false,"open_canvas_automatically":false},{"id":"html_pageworkers_preview","name":"HTML PageWorkers Preview","alias":"HtmlPageWorkersPreview","aliases":[],"description_short":"Preview PageWorkers.","description_long":"\n    Get the preview for PageWorkers descriptor for a selector or templates rendering.\n    ","description_tool_prompt":"\n    Get the preview for PageWorkers descriptor for a selector or templates rendering.\n    ","source":"SiteCrawler or Browser fetching","conversation_examples":[],"tags":["content"],"available_in_chat":true,"available_in_deepthink":false,"available_in_mcp":true,"mcp_audience":"all","config":{"type":"object","properties":{},"required":[]},"item":{"type":"object","properties":{"url":{"description":"The URL to be used","title":"Url","type":"string"},"options":{"$ref":"#/$defs/PreviewOptions","default":{"use_liquid_engine":false},"description":"Preview options"},"selectors":{"anyOf":[{"items":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"string"}]},"type":"array"},{"type":"null"}],"default":null,"description":"Optional list of extracts to preview. Each entry is an ExtractPreviewConfig object (kind: singleValue / multiValue / arrayOfObjects / jsonLd, with `type` for jsonLd) — the same shape as `extracts`. Config keys use snake_case (css_selector, container_selector, extract_type) and are converted to camelCase before hitting the JS engine. A bare string is also accepted as shorthand for a singleValue CSS selector (the legacy `list[str]` contract). Each entry returns the touched element descriptors plus the extracted value, serialized and truncated for display.","title":"Selectors"},"templates":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"default":null,"description":"Optional list of PageWorkers templates to preview. Each entry should be a JSON stringified version of a template, with the `extract` and `context` fields.","title":"Templates"},"extracts":{"anyOf":[{"additionalProperties":{"additionalProperties":true,"type":"object"},"type":"object"},{"type":"null"}],"default":null,"description":"Optional map of named extracts to resolve against the page. Each value follows the ExtractPreviewConfig shape (singleValue / multiValue / arrayOfObjects / jsonLd). Config keys use snake_case (css_selector, container_selector, extract_type) to match the rest of the API; they are converted to camelCase before being passed to the JS engine. Unlike templates, the raw extracted values are returned to the caller without template rendering or truncation.","title":"Extracts"},"detect_json_ld_types":{"default":false,"description":"If true, return the list of unique @type values found in the page's JSON-LD blocks. Useful to discover what structured data is available before requesting an `extracts` with kind: jsonLd.","title":"Detect Json Ld Types","type":"boolean"},"include_default_variables":{"default":false,"description":"If true, also return the PageWorkers default variables of the page (`_currentUrl`, `_currentTitle`...), the values the tag gives every template.","title":"Include Default Variables","type":"boolean"}},"required":["url"],"$defs":{"PreviewOptions":{"properties":{"use_liquid_engine":{"default":false,"description":"Whether or not to use liquid engine","title":"Use Liquid Engine","type":"boolean"}},"title":"PreviewOptions","type":"object"}}},"response":{"$defs":{"CssSelectorPreview":{"properties":{"descriptors":{"anyOf":[{"items":{"$ref":"#/$defs/PreviewDescriptor"},"type":"array"},{"type":"null"}],"default":null,"title":"Descriptors"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Error"}},"title":"CssSelectorPreview","type":"object"},"DefaultVariables":{"description":"The PageWorkers default variables of the page, as the tag gives them to\nevery template. A template reads each one under two names: `current_url`\nis `_currentUrl` and `$currentUrl`.\n\nThey are computed the way the server-side tag computes them: the protocol\nhas no `:` and the query string no `?`. The bot id, device and environment\nare fixed preview values, as there is no requester here.","properties":{"current_url":{"title":"Current Url","type":"string"},"current_protocol":{"title":"Current Protocol","type":"string"},"current_host":{"title":"Current Host","type":"string"},"current_path":{"title":"Current Path","type":"string"},"current_query_string":{"title":"Current Query String","type":"string"},"current_title":{"title":"Current Title","type":"string"},"current_description":{"title":"Current Description","type":"string"},"current_canonical":{"title":"Current Canonical","type":"string"},"current_h1":{"title":"Current H1","type":"string"},"current_bot_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Current Bot Id"},"current_device":{"title":"Current Device","type":"string"},"current_environment":{"title":"Current Environment","type":"string"}},"required":["current_url","current_protocol","current_host","current_path","current_query_string","current_title","current_description","current_canonical","current_h1","current_bot_id","current_device","current_environment"],"title":"DefaultVariables","type":"object"},"ExtractResult":{"properties":{"value":{"anyOf":[{},{"type":"null"}],"default":null,"title":"Value"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Error"}},"title":"ExtractResult","type":"object"},"PreviewAttribute":{"properties":{"key":{"title":"Key","type":"string"},"value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Value"},"truncated":{"title":"Truncated","type":"boolean"}},"required":["key","value","truncated"],"title":"PreviewAttribute","type":"object"},"PreviewDescriptor":{"properties":{"tag":{"title":"Tag","type":"string"},"first_attributes":{"items":{"$ref":"#/$defs/PreviewAttribute"},"title":"First Attributes","type":"array"},"inner_html_excerpt":{"$ref":"#/$defs/PreviewExcerpt"},"inner_text_excerpt":{"$ref":"#/$defs/PreviewExcerpt"},"has_other_attributes":{"title":"Has Other Attributes","type":"boolean"}},"required":["tag","first_attributes","inner_html_excerpt","inner_text_excerpt","has_other_attributes"],"title":"PreviewDescriptor","type":"object"},"PreviewExcerpt":{"properties":{"value":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Value"},"truncated":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"title":"Truncated"}},"title":"PreviewExcerpt","type":"object"},"TemplatePreview":{"properties":{"result":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Result"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Error"},"truncated":{"default":false,"title":"Truncated","type":"boolean"}},"title":"TemplatePreview","type":"object"}},"properties":{"crawl":{"anyOf":[{"type":"string"},{"type":"null"}],"default":"","description":"If fetched from sitecrawler, the crawl where the URL was found","title":"Crawl"},"selectors_preview":{"anyOf":[{"items":{"$ref":"#/$defs/CssSelectorPreview"},"type":"array"},{"type":"null"}],"default":null,"description":"Preview of the elements matched by the CSS selectors","title":"Selectors Preview"},"templates_preview":{"anyOf":[{"items":{"$ref":"#/$defs/TemplatePreview"},"type":"array"},{"type":"null"}],"default":null,"description":"Preview of the rendered templates","title":"Templates Preview"},"extracts":{"anyOf":[{"additionalProperties":{"$ref":"#/$defs/ExtractResult"},"type":"object"},{"type":"null"}],"default":null,"description":"Resolved extracts for the requested keys. Each entry holds the native extracted value and a per-key error if extraction failed for that key on this page.","title":"Extracts"},"json_ld_types":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"default":null,"description":"Unique JSON-LD @type values present on the page, when `detect_json_ld_types` was requested.","title":"Json Ld Types"},"default_variables":{"anyOf":[{"$ref":"#/$defs/DefaultVariables"},{"type":"null"}],"default":null,"description":"The PageWorkers default variables of the page, when `include_default_variables` was requested and they could be read."}},"title":"HtmlPageWorkersPreviewProcessedItem","type":"object"},"has_canvas":false,"open_canvas_automatically":false},{"id":"html_question","name":"HTML Question","alias":"HTML","aliases":[],"description_short":"Ask any question about an HTML Page.","description_long":"\n    Ask about a page's semantic structure, HTML elements, and technical aspects.\n    Inquire about HTML tags, DOM structure, meta information, or how to access elements with CSS selectors.\n    This agent can also extract and analyze structured data (e.g., JSON-LD, microdata, RDFa), understand semantic hierarchy, find specific attributes or values, and provide insights about a page's technical implementation.\n    ","description_tool_prompt":"\n    Ask any question about the semantic structure, HTML elements, and technical aspects of a webpage.\n    You can inquire about specific HTML tags, DOM structure, meta information, or how to access particular elements using CSS selectors.\n    This agent can also help you extract and analyze structured data (like JSON-LD, microdata, or RDFa), understand the semantic hierarchy of content, find specific attributes or values, and provide insights about the technical implementation of any webpage.\n    ","source":"Page content","conversation_examples":["What is the price of this product for https://www.example.org/p/5866-toothbrush ?","Give me the ld+json structured data for this page https://www.example.org/p/5866-toothbrush","What are the first 5 pages ranking for 'electric toothbrush' in the US? Extract the main terms for each of those URLs."],"tags":["url data"],"available_in_chat":true,"available_in_deepthink":true,"available_in_mcp":false,"mcp_audience":"all","config":{"type":"object","properties":{"tone_of_voice":{"default":"","description":"IA tone of voice","title":"Tone Of Voice","type":"string"},"response_lang":{"default":"auto","description":"Language of the response (must be a BCP47 lang code or 'auto' (default) to use the HTML page language)","title":"Response Lang","type":"string"},"country_code":{"default":"us","description":"Country code to use for real-time fetches (2 letters lowercase)","title":"Country Code","type":"string"},"remove_tags":{"description":"List of HTML tags to remove from the page before processing","items":{"type":"string"},"title":"Remove Tags","type":"array"},"only_text":{"default":true,"description":"If set to True, extract the text before the LLM","title":"Only Text","type":"boolean"},"fallback_real_time_fetch":{"default":true,"description":"Fall back to real-time ScrapingBee fetch when URL not in SiteCrawler","title":"Fallback Real Time Fetch","type":"boolean"}},"required":[]},"item":{"type":"object","properties":{"url":{"description":"Source URL to ask question about","title":"Url","type":"string"},"question":{"description":"Question to ask","title":"Question","type":"string"}},"required":["url","question"]},"response":{"properties":{"url_found":{"description":"Whether the URL was found and the HTML was fetched","title":"Url Found","type":"boolean"},"answer":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Answer to given question (if the URL was found)","title":"Answer"},"confidence_score":{"anyOf":[{"maximum":100,"minimum":0,"type":"integer"},{"type":"null"}],"description":"A score between 0 (lowest confidence) and 100 (best confidence) representing the confidence that the answer was accurately and completely extracted","title":"Confidence Score"},"url":{"description":"Source URL used to answer the question","title":"Url","type":"string"},"question":{"description":"Question that was asked","title":"Question","type":"string"},"iframe_allowed":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"description":"Whether iframes are allowed in the answer","title":"Iframe Allowed"}},"required":["url_found","answer","confidence_score","url","question"],"title":"HTMLQuestionProcessedItem","type":"object"},"has_canvas":true,"open_canvas_automatically":false},{"id":"html_structured_data","name":"HTML Structured Data","alias":"HTMLStructuredData","aliases":[],"description_short":"Extract structured data (JSON-LD) from HTML pages.","description_long":"\n    Extract structured data from HTML pages in JSON-LD format.\n    ","description_tool_prompt":"\n    Extract structured data from HTML pages in JSON-LD format.\n    ","source":"Browser Fetching or SiteCrawler","conversation_examples":["Extract the structured data from https://www.example.org/p/5866-toothbrush","Extract the structured data from https://www.example.org/p/1234-phone for the types 'Product'"],"tags":["url data"],"available_in_chat":true,"available_in_deepthink":true,"available_in_mcp":true,"mcp_audience":"all","config":{"type":"object","properties":{"country_code":{"default":"us","description":"The country code to use for the real-time fetch. 2 letters lowercase","title":"Country Code","type":"string"},"types":{"description":"The types of structured data to extract. Will extract all if not provided.","items":{"type":"string"},"title":"Types","type":"array"},"fallback_real_time_fetch":{"default":false,"description":"Fallback to real_time_fetch_url if the URL is not found in SiteCrawler","title":"Fallback To Real Time Fetch","type":"boolean"}},"required":[]},"item":{"type":"object","properties":{"url":{"description":"The URL of the page to extract structured data from","title":"Url","type":"string"}},"required":["url"]},"response":{"$defs":{"HTMLStructuredData":{"description":"Represents a structured data object found in a page.","properties":{"type":{"anyOf":[{"type":"string"},{"items":{"type":"string"},"type":"array"}],"description":"JSON-LD @type: a single type name or a list of types (e.g. Book and Product).","title":"Type"},"data":{"additionalProperties":true,"description":"The structured data in JSON-LD format","title":"Data","type":"object"}},"required":["type","data"],"title":"HTMLStructuredData","type":"object"},"HTMLStructuredDataParsingError":{"description":"Represents an error that occurred while parsing structured data.","properties":{"error":{"description":"The error message","title":"Error","type":"string"},"raw_json":{"description":"The raw JSON that caused the error","title":"Raw Json","type":"string"}},"required":["error","raw_json"],"title":"HTMLStructuredDataParsingError","type":"object"},"OriginEnum":{"enum":["site_crawler","real_time_fetch_url","rendering_farm","temporary_upload"],"title":"OriginEnum","type":"string"}},"properties":{"origin":{"anyOf":[{"$ref":"#/$defs/OriginEnum"},{"type":"null"}],"default":null,"description":"The origin of the HTML (site_crawler, real_time_fetch_url, or rendering_farm)"},"status_code":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"HTTP status code of the fetched page","title":"Status Code"},"url_found":{"default":true,"description":"Whether the URL was found in the crawl","title":"Url Found","type":"boolean"},"objects":{"description":"List of extracted structured data objects","items":{"$ref":"#/$defs/HTMLStructuredData"},"title":"Objects","type":"array"},"has_objects":{"description":"Whether any structured data objects were found","title":"Has Objects","type":"boolean"},"has_errors":{"description":"Whether any errors were reported in `errors` (currently JSON-LD extraction/parsing; may include other kinds later)","title":"Has Errors","type":"boolean"},"errors":{"description":"List of errors encountered during extraction","items":{"$ref":"#/$defs/HTMLStructuredDataParsingError"},"title":"Errors","type":"array"},"title":{"description":"Title indicating the source URL","title":"Title","type":"string"}},"required":["objects","has_objects","has_errors","errors","title"],"title":"HTMLStructuredDataProcessedItem","type":"object"},"has_canvas":true,"open_canvas_automatically":false},{"id":"html_to_text","name":"HTML To Text","alias":"HtmlToText","aliases":[],"description_short":"Extract text from a given HTML page","description_long":"A simple agent that returns the text of a given HTML page.\nFirst, we try to extract the text from the html with the readability tool.\nIf we don't find it, extract the text from the html with the beautifulsoup library.","description_tool_prompt":"A simple agent that returns the text of a given HTML page.\nFirst, we try to extract the text from the html with the readability tool.\nIf we don't find it, extract the text from the html with the beautifulsoup library.","source":null,"conversation_examples":[],"tags":[],"available_in_chat":false,"available_in_deepthink":false,"available_in_mcp":null,"mcp_audience":"all","config":{"type":"object","properties":{},"required":[]},"item":{"type":"object","properties":{"html_code":{"description":"HTML code of the page to process","title":"Html Code","type":"string"}},"required":["html_code"]},"response":{"properties":{"text":{"description":"Text extracted from the html","title":"Text","type":"string"}},"required":["text"],"title":"HtmlToTextProcessedItem","type":"object"},"has_canvas":false,"open_canvas_automatically":false},{"id":"keywords_clustering","name":"Keywords Clustering","alias":"KeywordsClustering","aliases":[],"description_short":"Cluster keywords into groups.","description_long":"\n    This tool groups keywords provided by @KeywordsSuggestions or @KeywordsSuggestionsGoogleAdsPlanner into thematic clusters based on user intent and behavior.\n    The clustering reveals content opportunities by combining related terms, considering search volume, competition, and commercial intent.\n    These clusters inform content strategy by highlighting topic hierarchies, gaps, and potential site structure improvements.\n    Each cluster includes a relevance assessment to guide content prioritization.\n    ","description_tool_prompt":"Analyze and organize keywords into meaningful, thematic clusters that reflect user search intent and behavioral patterns. This advanced clustering process helps identify content opportunities by grouping semantically related search terms, considering factors like search volume, competition, and commercial intent.\n\nThe clusters enable strategic content planning by revealing topic hierarchies, content gaps, and potential site structure improvements. Each cluster includes a detailed rationale and relevance assessment based on your website's context, making it easier to prioritize content creation and optimization efforts.\n\nKeywords must be provided by **@KeywordsSuggestions** or **@KeywordsSuggestionsGoogleAdsPlanner**","source":null,"conversation_examples":["Do a keywords clustering for related keywords to 'best electric toothbrush'","Do a keyword research for 'sustainable fashion' with Google Ads Planner and then cluster them"],"tags":["keywords"],"available_in_chat":true,"available_in_deepthink":true,"available_in_mcp":false,"mcp_audience":"all","config":{"type":"object","properties":{"location_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"Location ID (optional)","title":"Location Id"},"location_request":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Location request (ex: Paris, FR), will translate to location ID","title":"Location Request"},"country_code":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"ISO3166 country code (ex: GB)","title":"Country Code"},"lang_code":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"BCP47 language code (ex: \"en\", \"en-GB\")","title":"Lang Code"},"device":{"default":"mobile","description":"Device to use for search (optional - defaults to mobile)","enum":["mobile","desktop"],"title":"Device","type":"string"}},"required":[]},"item":{"type":"object","properties":{"tool_origin":{"description":"Tool origin to get keywords from","enum":["keywords_suggestions","keywords_suggestions_google_ads_planner"],"title":"Tool Origin","type":"string"},"language":{"default":"en","description":"Target language for clusters","title":"Language","type":"string"},"keywords":{"description":"List of keywords to cluster","items":{"type":"string"},"maxItems":20,"title":"Keywords","type":"array"}},"required":["tool_origin","keywords"]},"response":{"$defs":{"KeywordsCluster":{"properties":{"name":{"description":"Name of the keywords cluster","title":"Name","type":"string"},"main_keyword":{"description":"The main keyword representing the cluster","title":"Main Keyword","type":"string"},"keywords":{"description":"List of keywords belonging to this cluster","items":{"type":"string"},"title":"Keywords","type":"array"},"rationale":{"description":"Explanation of why these keywords are grouped together","title":"Rationale","type":"string"},"relevant_for_website":{"description":"Whether this cluster is relevant for the website based on its description","title":"Relevant For Website","type":"boolean"}},"required":["name","main_keyword","keywords","rationale","relevant_for_website"],"title":"KeywordsCluster","type":"object"}},"properties":{"clusters":{"description":"List of keyword clusters","items":{"$ref":"#/$defs/KeywordsCluster"},"title":"Clusters","type":"array"},"website_description_used_for_clustering":{"description":"The website description that was used to assess cluster relevance","title":"Website Description Used For Clustering","type":"string"},"website_description_used_for_clustering__notes":{"description":"Notes about the website description used for clustering","title":"Website Description Used For Clustering  Notes","type":"string"}},"required":["clusters","website_description_used_for_clustering","website_description_used_for_clustering__notes"],"title":"KeywordsClusteringProcessedItem","type":"object"},"has_canvas":true,"open_canvas_automatically":false},{"id":"keywords_extractor","name":"Keywords Extractor","alias":"KeywordsExtractor","aliases":[],"description_short":"Extract top X keywords from given URLs","description_long":"\n    Extract top X keywords from given URLs.\n\n    ","description_tool_prompt":"\n    Extract top X keywords from given URLs.\n\n    ","source":"Botify","conversation_examples":[],"tags":["keywords"],"available_in_chat":false,"available_in_deepthink":false,"available_in_mcp":null,"mcp_audience":"all","config":{"type":"object","properties":{"limit":{"default":10,"description":"Limit of top keywords to retrieve per URL","title":"Limit","type":"integer"},"start_date":{"default":"2026-10-01","description":"Start date of the period (format YYYY-MM-DD)","title":"Start Date","type":"string"},"end_date":{"default":"2026-10-31","description":"End date of the period","title":"End Date","type":"string"},"exclude_branded":{"default":true,"description":"Whether to exclude branded keywords","title":"Exclude Branded","type":"boolean"},"min_ctr":{"anyOf":[{"type":"number"},{"type":"null"}],"default":null,"description":"Minimum CTR to filter keywords (between 0 and 1)","title":"Min Ctr"},"sort":{"default":"impressions","description":"Metric to sort keywords by (descending order)","enum":["impressions","clicks"],"title":"Sort","type":"string"}},"required":[]},"item":{"type":"object","properties":{"urls":{"description":"List of URLs we want to retrieve the keywords","items":{"type":"string"},"title":"Urls","type":"array"}},"required":["urls"]},"response":{"$defs":{"KeywordsExtractorEntity":{"properties":{"url":{"title":"Url","type":"string"},"keywords":{"items":{"type":"string"},"title":"Keywords","type":"array"}},"required":["url","keywords"],"title":"KeywordsExtractorEntity","type":"object"}},"properties":{"results":{"anyOf":[{"items":{"$ref":"#/$defs/KeywordsExtractorEntity"},"type":"array"},{"type":"null"}],"description":"List of keywords per URL","title":"Results"}},"required":["results"],"title":"KeywordsExtractorProcessedItem","type":"object"},"has_canvas":false,"open_canvas_automatically":false},{"id":"keywords_suggestions","name":"Keyword Suggestions","alias":"KeywordSuggestions","aliases":[],"description_short":"Get organic keyword suggestions from a given keyword.","description_long":"\n    Discover a comprehensive list of related keywords based on a seed keyword, including synonyms, variations, and related topics from Google search data.\n    This tool identifies valuable keyword opportunities for your SEO strategy and includes detailed metrics for each keyword such as search volume, CPC, competition level, and search intent.\n    This facilitates content planning, PPC campaigns, and identifying new market opportunities in your niche.\n    ","description_tool_prompt":"\n    Analyze Google Ads keyword data and answer questions about:\n        - Search volumes and trends\n        - Competition levels\n        - CPC and bidding metrics\n        - Top performing keywords\n        - Keyword patterns and themes\n        And more...\n    ","source":null,"conversation_examples":["What are the top 5 keywords by search volume for 'electric toothbrush'?","Which keywords have informational intent for 'running shoes'?","What's the average competition level for keywords related to 'organic food'?","Show me keywords with featured snippets for 'yoga mat'"],"tags":["keywords","google"],"available_in_chat":true,"available_in_deepthink":true,"available_in_mcp":false,"mcp_audience":"all","config":{"type":"object","properties":{"location_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"Location ID (optional)","title":"Location Id"},"location_request":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Location request (ex: Paris, FR), will translate to location ID","title":"Location Request"},"country_code":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"ISO3166 country code (ex: GB)","title":"Country Code"},"lang_code":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"BCP47 language code (ex: \"en\", \"en-GB\")","title":"Lang Code"},"device":{"default":"mobile","description":"Device to use for search (optional - defaults to mobile)","enum":["mobile","desktop"],"title":"Device","type":"string"}},"required":[]},"item":{"type":"object","properties":{"seed_keyword":{"description":"Seed keyword to get suggestions for.","title":"Seed Keyword","type":"string"},"question":{"description":"What data to get from the keyword.","title":"Question","type":"string"},"country":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Country for the analysis.","title":"Country"}},"required":["seed_keyword","question"]},"response":{"properties":{"answer":{"description":"Answer to the question.","title":"Answer","type":"string"},"results":{"description":"List of keywords data.","items":{"additionalProperties":true,"type":"object"},"title":"Results","type":"array"}},"required":["answer","results"],"title":"KeywordsSuggestionsProcessedItem","type":"object"},"has_canvas":true,"open_canvas_automatically":false},{"id":"keywords_suggestions_google_ads_planner","name":"Keywords Suggestions From Google Ads Planner","alias":"KeywordSuggestionsGoogleAdsPlanner","aliases":[],"description_short":"Get keyword suggestions from Google Ads Keywords Planner.","description_long":"\n    Discover a comprehensive list of related keywords based on a seed keyword, including synonyms, variations, and related topics from Google Ads data.\n    This tool identifies valuable keyword opportunities for your SEO strategy and includes detailed metrics for each keyword such as search volume, CPC, competition level, and search intent.\n    This facilitates content planning, PPC campaigns, and identifying new market opportunities in your niche.\n    ","description_tool_prompt":"Analyze Google Ads keyword data and answer questions about:\n    - Search volumes and trends\n    - Competition levels\n    - CPC and bidding metrics\n    - Top performing keywords\n    - Keyword patterns and themes\n    And more...\n    ","source":"Google Ads Planner","conversation_examples":["What are the top 5 keywords by search volume for 'electric toothbrush'?","Which keywords have the highest CPC for 'running shoes'?","What's the average competition level for keywords related to 'organic food'?","Show me low competition keywords for 'yoga mat' with over 1000 searches"],"tags":["keywords","google"],"available_in_chat":true,"available_in_deepthink":true,"available_in_mcp":false,"mcp_audience":"all","config":{"type":"object","properties":{"location_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"Location ID (optional)","title":"Location Id"},"location_request":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Location request (ex: Paris, FR), will translate to location ID","title":"Location Request"},"country_code":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"ISO3166 country code (ex: GB)","title":"Country Code"},"lang_code":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"BCP47 language code (ex: \"en\", \"en-GB\")","title":"Lang Code"},"device":{"default":"mobile","description":"Device to use for search (optional - defaults to mobile)","enum":["mobile","desktop"],"title":"Device","type":"string"}},"required":[]},"item":{"type":"object","properties":{"keywords":{"description":"List of keywords to get suggestions for","items":{"type":"string"},"maxItems":20,"title":"Keywords","type":"array"},"question":{"description":"What data to get from the keywords","title":"Question","type":"string"},"location_request":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Location to get suggestions for.","title":"Location Request"}},"required":["keywords","question"]},"response":{"properties":{"answer":{"description":"The answer to the question","title":"Answer","type":"string"},"results":{"description":"List of keyword data","items":{"additionalProperties":true,"type":"object"},"title":"Results","type":"array"}},"required":["answer","results"],"title":"KeywordsSuggestionsGoogleAdsPlannerProcessedItem","type":"object"},"has_canvas":true,"open_canvas_automatically":false},{"id":"knowledge","name":"Knowledge","alias":"Knowledge","aliases":[],"description_short":"Find answers to how to use Botify.","description_long":"Answer questions about the Botify application to understand product features, technical concepts, and best practices for using Botify effectively.In any case but the build of a query, if user asks what a specific filter means (for example a dimension, metric, or UI filter) and strictly for the meaning, query the Knowledge tool using the filter name plus the keyword “filters”, then explain the filter to the user using the field description and any relevant documentation you find.","description_tool_prompt":"Answer questions about the Botify application to understand product features, technical concepts, and best practices for using Botify effectively.In any case but the build of a query, if user asks what a specific filter means (for example a dimension, metric, or UI filter) and strictly for the meaning, query the Knowledge tool using the filter name plus the keyword “filters”, then explain the filter to the user using the field description and any relevant documentation you find.","source":"Botify Documentation","conversation_examples":["How do I set up a custom alert in Botify?","How can I export my data from Botify?","What can I do with SmartIndex in Botify?"],"tags":["web search"],"available_in_chat":true,"available_in_deepthink":true,"available_in_mcp":true,"mcp_audience":"all","config":{"type":"object","properties":{},"required":[]},"item":{"type":"object","properties":{"query":{"description":"The question you want to ask to the Knowledge Agent","minLength":5,"title":"Query","type":"string"}},"required":["query"]},"response":{"$defs":{"DiscoveryEngineModelScoresResult":{"properties":{"relevance_score":{"items":{"type":"number"},"title":"Relevance Score","type":"array"}},"required":["relevance_score"],"title":"DiscoveryEngineModelScoresResult","type":"object"},"DiscoveryEngineSearchResult":{"properties":{"document":{"anyOf":[{"$ref":"#/$defs/DiscoveryEngineStructuredDocumentResult"},{"$ref":"#/$defs/DiscoveryEngineUnstructuredDocumentResult"}],"title":"Document"},"model_scores":{"$ref":"#/$defs/DiscoveryEngineModelScoresResult"}},"required":["document","model_scores"],"title":"DiscoveryEngineSearchResult","type":"object"},"DiscoveryEngineStructuredDocumentResult":{"properties":{"body":{"title":"Body","type":"string"},"link":{"title":"Link","type":"string"},"title":{"title":"Title","type":"string"},"sequenced_group_name":{"title":"Sequenced Group Name","type":"string"},"dataset_name":{"title":"Dataset Name","type":"string"},"description":{"title":"Description","type":"string"}},"required":["body","link","title","sequenced_group_name","dataset_name","description"],"title":"DiscoveryEngineStructuredDocumentResult","type":"object"},"DiscoveryEngineUnstructuredDocumentResult":{"properties":{"extractive_answers":{"items":{"type":"string"},"title":"Extractive Answers","type":"array"},"link":{"title":"Link","type":"string"},"title":{"title":"Title","type":"string"}},"required":["extractive_answers","link","title"],"title":"DiscoveryEngineUnstructuredDocumentResult","type":"object"}},"properties":{"search_results":{"description":"List of search results used to generate the answer","items":{"$ref":"#/$defs/DiscoveryEngineSearchResult"},"title":"Search Results","type":"array"},"answer":{"description":"The answer generated by the Knowledge Agent","title":"Answer","type":"string"}},"required":["search_results","answer"],"title":"KnowledgeAgentProcessedItem","type":"object"},"has_canvas":false,"open_canvas_automatically":false},{"id":"list_annotations","name":"List Annotations","alias":"ListAnnotations","aliases":[],"description_short":"Retrieve annotations logged on your project.","description_long":"Retrieve annotations logged on your project.","description_tool_prompt":"List chart annotations on the current project: dated notes and markers on Botify time-series charts (site changes, campaigns, releases, commercial events, incidents). Use when correlating traffic or ranking shifts with known timeline events, or when the user asks what was logged on specific dates.","source":"Botify","conversation_examples":["Show me my annotations","List all annotations from the last 6 months"],"tags":["web search"],"available_in_chat":true,"available_in_deepthink":true,"available_in_mcp":true,"mcp_audience":"all","config":{"type":"object","properties":{},"required":[]},"item":{"type":"object","properties":{"period_start":{"anyOf":[{"format":"date","type":"string"},{"type":"null"}],"default":null,"description":"Optional inclusive start of the period filter (ISO date, e.g. 2024-01-01). Annotations whose start_date falls within this period are returned.","title":"Period Start"},"period_end":{"anyOf":[{"format":"date","type":"string"},{"type":"null"}],"default":null,"description":"Optional inclusive end of the period filter (ISO date, e.g. 2024-12-31). Annotations whose start_date falls within this period are returned.","title":"Period End"}},"required":[]},"response":{"$defs":{"ChartAnnotation":{"description":"Project chart annotation with only the fields exposed by the agent.","properties":{"start_date":{"description":"Annotation start date and time","format":"date-time","title":"Start Date","type":"string"},"data":{"anyOf":[{"$ref":"#/$defs/ChartAnnotationData"},{"type":"null"}],"default":null,"description":"Annotation payload (typically includes content text)"}},"required":["start_date"],"title":"ChartAnnotation","type":"object"},"ChartAnnotationData":{"additionalProperties":true,"properties":{"content":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Content"}},"title":"ChartAnnotationData","type":"object"}},"properties":{"annotations":{"description":"Project chart annotations for the project","items":{"$ref":"#/$defs/ChartAnnotation"},"title":"Annotations","type":"array"},"count":{"description":"Number of annotations returned after filtering","title":"Count","type":"integer"},"total_count":{"description":"Total number of annotations on the project before filtering","title":"Total Count","type":"integer"}},"required":["annotations","count","total_count"],"title":"ListAnnotationsProcessedItem","type":"object"},"has_canvas":false,"open_canvas_automatically":false},{"id":"nearest_page_for_topic","name":"Find Nearest Pages for Topic","alias":"NearestPages","aliases":[],"description_short":"Get the nearest page for a given topic.","description_long":"\n    Find your five most relevant pages for a given topic from Google search results.\n    This can help you evaluate your pages' relevance to identify internal linking opportunities and content optimization.\n    ","description_tool_prompt":"Get the nearest page (for current project) for a given topic","source":"Browser Fetching on Google Search","conversation_examples":["Find the nearest pages for 'electric toothbrush'","Do a keyword research for 'sustainable fashion' with @KeywordsSuggestionsGoogleAdsPlanner and then find the nearest pages for the 5 keywords with most search volume"],"tags":[],"available_in_chat":true,"available_in_deepthink":true,"available_in_mcp":false,"mcp_audience":"all","config":{"type":"object","properties":{},"required":[]},"item":{"type":"object","properties":{"topic":{"description":"The topic to analyze.","title":"Topic","type":"string"},"country":{"description":"The country to search for.","title":"Country","type":"string"}},"required":["topic","country"]},"response":{"$defs":{"TopicPage":{"properties":{"url":{"description":"URL of the page.","title":"Url","type":"string"},"title":{"description":"Title of the page.","title":"Title","type":"string"},"description":{"description":"Description of the page.","title":"Description","type":"string"},"relevance_score":{"description":"Relevance score.","title":"Relevance Score","type":"number"},"explanation":{"description":"Explanation of the relevance score.","title":"Explanation","type":"string"}},"required":["url","title","description","relevance_score","explanation"],"title":"TopicPage","type":"object"}},"properties":{"pages":{"description":"List of evaluated topic pages.","items":{"$ref":"#/$defs/TopicPage"},"title":"Pages","type":"array"}},"required":["pages"],"title":"NearestPageForTopicProcessedItem","type":"object"},"has_canvas":true,"open_canvas_automatically":false},{"id":"organic_keyword_suggestions","name":"Organic Keyword Suggestions","alias":"OrganicKeywordSuggestions","aliases":["keywords_suggestions_raw"],"description_short":"Get organic keyword suggestions from a given keyword.","description_long":"\n    Discover a comprehensive list of related keywords based on a seed keyword, including synonyms, variations, and related topics from Google search data.\n    This tool identifies valuable keyword opportunities for your SEO strategy and includes detailed metrics for each keyword such as search volume, CPC, competition level, and search intent.\n    This facilitates content planning, PPC campaigns, and identifying new market opportunities in your niche.\n\n    When `save_to_tmp_storage` is enabled, the keyword suggestions are written to\n    temporary project storage and a URL is returned instead of the inline payload.\n    ","description_tool_prompt":"\n    Discover a comprehensive list of related keywords based on a seed keyword, including synonyms, variations, and related topics from Google search data.\n    This tool identifies valuable keyword opportunities for your SEO strategy and includes detailed metrics for each keyword such as search volume, CPC, competition level, and search intent.\n    This facilitates content planning, PPC campaigns, and identifying new market opportunities in your niche.\n\n    When `save_to_tmp_storage` is enabled, the keyword suggestions are written to\n    temporary project storage and a URL is returned instead of the inline payload.\n    ","source":"Botify","conversation_examples":["What are the related keywords for 'toothbrush'?","I need to do a keywords research for valentine's day","Show me related terms for 'healthy recipes'","Research keywords for 'sustainable fashion'"],"tags":["keywords","google"],"available_in_chat":false,"available_in_deepthink":false,"available_in_mcp":true,"mcp_audience":"all","config":{"type":"object","properties":{"location_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"Location ID (optional)","title":"Location Id"},"location_request":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Location request (ex: Paris, FR), will translate to location ID","title":"Location Request"},"country_code":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"ISO3166 country code (ex: GB)","title":"Country Code"},"lang_code":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"BCP47 language code (ex: \"en\", \"en-GB\")","title":"Lang Code"},"device":{"default":"mobile","description":"Device to use for search (optional - defaults to mobile)","enum":["mobile","desktop"],"title":"Device","type":"string"},"save_to_tmp_storage":{"default":false,"description":"Save the bulky keyword suggestions to Botify temporary storage and return the temporary URL instead of the payload. Use this to save output tokens.","title":"Save To Temporary Storage","type":"boolean"}},"required":[]},"item":{"type":"object","properties":{"seed_keyword":{"description":"Seed Keyword","title":"Keyword","type":"string"},"country":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Country","title":"Country"},"columns":{"default":["keyword","search_volume","competition","cpc","main_intent"],"description":"Columns to display","items":{"enum":["keyword","serp_item_types","results_count","search_volume","cpc","competition","monthly_searches","backlinks_info","main_intent","foreign_intent"],"type":"string"},"title":"Columns","type":"array"}},"required":["seed_keyword"]},"response":{"properties":{"location_code":{"description":"Location code used for the analysis","title":"Location Code","type":"integer"},"language_code":{"description":"Language code used for the analysis","title":"Language Code","type":"string"},"results":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"default":null,"description":"List of keyword suggestions. Omitted when `save_to_tmp_storage` is True; see `results_tmp_storage_url` instead.","title":"Results"},"results_tmp_storage_url":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Temporary storage URL of the keyword suggestions. Returned instead of `results` when `save_to_tmp_storage` is True.","title":"Results Tmp Storage Url"}},"required":["location_code","language_code"],"title":"OrganicKeywordSuggestionsProcessedItem","type":"object"},"has_canvas":false,"open_canvas_automatically":false},{"id":"pageworkers_generic_urls_actions","name":"PageWorkers Generic URLs Actions","alias":"PageWorkersGenericUrlsActions","aliases":["pageworkers","PageWorkers"],"description_short":"Update metadata or apply custom changes to URLs (PageWorkers).","description_long":"\n    This agent creates a PageWorkers optimization for a page from your most recent crawl to update its title, description, or H1 tag.\n    ","description_tool_prompt":"\n    Update any title/description/h1 for a list of URLs through PageWorkers, and apply custom changes to specific elements.\n    ","source":"Botify","conversation_examples":["Update title for https://www.example.org/p/5866-toothbrush with 'The Best Electric Toothbrush' and description with 'Discover the best electric toothbrush: infinite battery life, 3 modes, and more'","Add custom changes to https://www.example.org/p/5866-toothbrush: prepend 'NEW! ' to the product name element"],"tags":["collaboration"],"available_in_chat":true,"available_in_deepthink":true,"available_in_mcp":true,"mcp_audience":"all","config":{"type":"object","properties":{},"required":[]},"item":{"type":"object","properties":{"urls":{"description":"List of URLs and their metadata updates","items":{"$ref":"#/$defs/URLMetadataUpdate"},"title":"URLs","type":"array"}},"required":["urls"],"$defs":{"CustomChange":{"description":"A custom change to apply to the page.","properties":{"selector":{"description":"CSS selector of the element to update (ex: \"h1\", \".article-count\", etc).","title":"Selector","type":"string"},"strategy":{"description":"Update strategy to use","enum":["prepend","append","insertAfter","insertBefore","replace","replaceElement"],"title":"Strategy","type":"string"},"value":{"description":"Value to update","title":"Value","type":"string"},"max_date":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Maximum date to apply the update (YYYY-MM-DD format)","title":"Max Date"}},"required":["selector","strategy","value"],"title":"CustomChange","type":"object"},"URLMetadataUpdate":{"description":"Metadata updates to apply to a specific URL.","properties":{"url":{"description":"Specific URL to update (wildcards like '*' are not allowed)","title":"Url","type":"string"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"New title to set for the page","title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"New description to set for the page","title":"Description"},"h1":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"New H1 to set for the page","title":"H1"},"custom_changes":{"default":[],"description":"List of custom changes to apply to specific elements on the page","items":{"$ref":"#/$defs/CustomChange"},"maxItems":10,"title":"Custom Changes","type":"array"}},"required":["url"],"title":"URLMetadataUpdate","type":"object"}}},"response":{"$defs":{"CustomChange":{"description":"A custom change to apply to the page.","properties":{"selector":{"description":"CSS selector of the element to update (ex: \"h1\", \".article-count\", etc).","title":"Selector","type":"string"},"strategy":{"description":"Update strategy to use","enum":["prepend","append","insertAfter","insertBefore","replace","replaceElement"],"title":"Strategy","type":"string"},"value":{"description":"Value to update","title":"Value","type":"string"},"max_date":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Maximum date to apply the update (YYYY-MM-DD format)","title":"Max Date"}},"required":["selector","strategy","value"],"title":"CustomChange","type":"object"},"URLMetadataUpdate":{"description":"Metadata updates to apply to a specific URL.","properties":{"url":{"description":"Specific URL to update (wildcards like '*' are not allowed)","title":"Url","type":"string"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"New title to set for the page","title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"New description to set for the page","title":"Description"},"h1":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"New H1 to set for the page","title":"H1"},"custom_changes":{"default":[],"description":"List of custom changes to apply to specific elements on the page","items":{"$ref":"#/$defs/CustomChange"},"maxItems":10,"title":"Custom Changes","type":"array"}},"required":["url"],"title":"URLMetadataUpdate","type":"object"}},"properties":{"websiteId":{"description":"The website ID","title":"Websiteid","type":"string"},"moduleId":{"description":"The PageWorkers module ID","title":"Moduleid","type":"string"},"urls":{"description":"List of URLs and their metadata updates","items":{"$ref":"#/$defs/URLMetadataUpdate"},"title":"Urls","type":"array"},"message":{"description":"Message about the operation","title":"Message","type":"string"},"organization":{"description":"The organization slug","title":"Organization","type":"string"},"project":{"description":"The project slug","title":"Project","type":"string"},"demo":{"description":"Whether the operation was run in demo mode","title":"Demo","type":"boolean"}},"required":["websiteId","moduleId","urls","message","organization","project","demo"],"title":"PageWorkersProcessedItem","type":"object"},"has_canvas":false,"open_canvas_automatically":false},{"id":"pageworkers_get_or_create_optimization","name":"Get or create a PageWorkers optimization","alias":"PageWorkersGetOrCreateOptimization","aliases":[],"description_short":"Get an existing or create a new PageWorkers optimization (PAGE_EDITOR module).","description_long":"\n    This agent looks for an existing PageWorkers optimization by name for the given website.\n    If a matching optimization is found, it is returned. Otherwise, a new PAGE_EDITOR optimization\n    is created with the provided configuration (actions, data schema, dataset entries, etc.).\n    The result includes the app URL of the optimization.\n    ","description_tool_prompt":"\n    Get or create a PageWorkers PAGE_EDITOR optimization. Searches existing modules by name and returns\n    the matching one, or creates a new module with the specified configuration.\n    The result includes the app URL of the optimization.\n    ","source":"Botify","conversation_examples":["Create a PageWorkers optimization named 'FAQ Section' that inserts FAQ content after #description","Get or create an optimization to add structured data to product pages"],"tags":["collaboration"],"available_in_chat":false,"available_in_deepthink":false,"available_in_mcp":true,"mcp_audience":"all","config":{"type":"object","properties":{},"required":[]},"item":{"type":"object","properties":{"name":{"description":"Name of the optimization","title":"Name","type":"string"},"description":{"default":"","description":"Description of the optimization","title":"Description","type":"string"},"actions":{"description":"List of actions to apply in the optimization","items":{"$ref":"#/$defs/Action"},"title":"Actions","type":"array"},"data_schema":{"description":"Schema for the main dataset (list of field definitions)","items":{"$ref":"#/$defs/DataSchemaField"},"title":"Data Schema","type":"array"},"entries":{"description":"Initial dataset entries (URLs and their variable values)","items":{"$ref":"#/$defs/DatasetEntry"},"title":"Entries","type":"array"},"split_testing_variant_group_size_percentage":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"Split testing variant group size percentage (null for no split testing)","title":"Split Testing Variant Group Size Percentage"}},"required":["name","actions","data_schema","entries"],"$defs":{"Action":{"description":"An action to apply in the optimization.","properties":{"actionType":{"default":"elementInnerHtml","description":"Type of action (e.g. 'elementInnerHtml')","title":"Actiontype","type":"string"},"transformationType":{"default":"template","description":"Type of transformation (e.g. 'template')","title":"Transformationtype","type":"string"},"actionConfig":{"$ref":"#/$defs/ActionConfig","description":"Action target configuration"},"transformationConfig":{"$ref":"#/$defs/TransformationConfig","description":"Transformation configuration"}},"required":["actionConfig","transformationConfig"],"title":"Action","type":"object"},"ActionConfig":{"description":"Configuration for an action's target element.","properties":{"cssSelector":{"description":"CSS selector for the target element","title":"Cssselector","type":"string"},"cssStrategy":{"description":"Strategy for element placement","enum":["insertAfter","insertBefore","append","prepend","replace"],"title":"Cssstrategy","type":"string"}},"required":["cssSelector","cssStrategy"],"title":"ActionConfig","type":"object"},"DataSchemaField":{"description":"A field in the main dataset data schema.","properties":{"identifier":{"description":"Unique identifier for the field","title":"Identifier","type":"string"},"name":{"description":"Display name for the field","title":"Name","type":"string"},"type":{"default":"string","description":"Data type of the field (e.g. 'string')","title":"Type","type":"string"},"required":{"default":false,"description":"Whether the field is required","title":"Required","type":"boolean"}},"required":["identifier","name"],"title":"DataSchemaField","type":"object"},"DatasetEntry":{"additionalProperties":true,"description":"An entry in the dataset (URL + variable values).","properties":{"url":{"description":"URL for this dataset entry","title":"Url","type":"string"}},"required":["url"],"title":"DatasetEntry","type":"object"},"TransformationConfig":{"description":"Configuration for an action's transformation.","properties":{"template":{"description":"HTML template with {{ variable }} placeholders","title":"Template","type":"string"}},"required":["template"],"title":"TransformationConfig","type":"object"}}},"response":{"description":"Output of the PageWorkers get-or-create optimization agent.","properties":{"websiteId":{"description":"The website ID","title":"Websiteid","type":"string"},"module":{"additionalProperties":true,"description":"The PageWorkers module data","title":"Module","type":"object"},"created":{"description":"Whether the module was created (True) or already existed (False)","title":"Created","type":"boolean"},"url":{"description":"App URL of the optimization","title":"Url","type":"string"},"message":{"description":"Message about the operation","title":"Message","type":"string"}},"required":["websiteId","module","created","url","message"],"title":"PageWorkersGetOrCreateProcessedItem","type":"object"},"has_canvas":false,"open_canvas_automatically":false},{"id":"pageworkers_push_items_to_optimization","name":"Push items to a PageWorkers optimization","alias":"PageworkersPushItemsToOptimization","aliases":[],"description_short":"Run a SQL query, generate a CSV, and upload it to a PageWorkers optimization via the Activation API.","description_long":"\n    This agent executes a BigQuery SQL query, converts the results into a CSV file,\n    obtains a signed upload URL from the Activation API, and uploads the CSV to the\n    optimization module's dataset.\n    Always prefix tables with \"catalog.\" (e.g. catalog.crawl_pages_20251201).\n    ","description_tool_prompt":"\n    Push items to a PageWorkers optimization. Runs a SQL query, generates a CSV from the results,\n    and uploads it to the specified optimization module.\n    ","source":"Botify","conversation_examples":["Push SQL query results as CSV to PageWorkers optimization module XYZ","Upload data from a SQL query to the optimization dataset"],"tags":["collaboration"],"available_in_chat":false,"available_in_deepthink":false,"available_in_mcp":true,"mcp_audience":"all","config":{"type":"object","properties":{},"required":[]},"item":{"type":"object","properties":{"module_id":{"description":"The stable ID of the PageWorkers optimization module to push items to","title":"Module Id","type":"string"},"query":{"description":"BigQuery SQL query whose results will be exported as CSV and uploaded to the optimization. Prefix tables with \"catalog.\" (e.g. catalog.crawl_pages_20251201).","title":"Query","type":"string"}},"required":["module_id","query"]},"response":{"description":"Output of the PageWorkers push-items-to-optimization agent.","properties":{"websiteId":{"description":"The website ID","title":"Websiteid","type":"string"},"module_id":{"description":"The optimization module stable ID","title":"Module Id","type":"string"},"filename":{"description":"The filename of the uploaded CSV","title":"Filename","type":"string"},"row_count":{"description":"Number of rows exported and uploaded","title":"Row Count","type":"integer"},"message":{"description":"Message about the operation","title":"Message","type":"string"}},"required":["websiteId","module_id","filename","row_count","message"],"title":"PageworkersPushItemsProcessedItem","type":"object"},"has_canvas":false,"open_canvas_automatically":false},{"id":"perplexity","name":"Perplexity","alias":"Perplexity","aliases":[],"description_short":"Ask a question to Perplexity.","description_long":"Leverage Perplexity AI's robust knowledge base for accurate, current answers to your questions. This agent combines advanced language models with real-time information to provide comprehensive responses with relevant citations.","description_tool_prompt":"\n    Ask a question to Perplexity when you need to ground the web for a specific question.\n    Will return an answer with citations and related questions.\n\n    This agent can help you:\n    - Get up-to-date information from web sources\n    - Find answers with credible citations\n    - Discover related questions on the topic\n    ","source":"Perplexity API","conversation_examples":["What are the best running shoes?","What's trending in fashion in the UK?","What are the TV shows to watch in 2026?"],"tags":["web search"],"available_in_chat":true,"available_in_deepthink":true,"available_in_mcp":true,"mcp_audience":"all","config":{"type":"object","properties":{"model":{"default":"sonar","description":"Perplexity model to use","title":"Model","type":"string"},"temperature":{"default":0.3,"description":"Temperature for the Perplexity model","maximum":2.0,"minimum":0.0,"title":"Temperature","type":"number"}},"required":[]},"item":{"type":"object","properties":{"question":{"description":"The question you want to ask Perplexity","minLength":1,"title":"Question","type":"string"}},"required":["question"]},"response":{"$defs":{"PerplexitySearchResult":{"properties":{"url":{"title":"Url","type":"string"},"title":{"title":"Title","type":"string"},"date":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Date"},"last_updated":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Last Updated"},"snippet":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Snippet"},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Source"}},"required":["url","title"],"title":"PerplexitySearchResult","type":"object"}},"properties":{"answer":{"description":"The answer from Perplexity","title":"Answer","type":"string"},"citations":{"description":"List of citation URLs","items":{"type":"string"},"title":"Citations","type":"array"},"search_results":{"description":"List of search results used to generate the answer","items":{"$ref":"#/$defs/PerplexitySearchResult"},"title":"Search Results","type":"array"},"related_questions":{"description":"List of related questions","items":{"type":"string"},"title":"Related Questions","type":"array"},"model":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Name / version of the model used","title":"Model"}},"required":["answer","citations","search_results","related_questions"],"title":"PerplexityProcessedItem","type":"object"},"has_canvas":true,"open_canvas_automatically":false},{"id":"project_metadata","name":"Project Memory","alias":"ProjectMemory","aliases":[],"description_short":"Get or patch information about the project (tone of voice, website description...)","description_long":"Store and retrieve key project metadata, such as tone of voice, website description, and internationalization strategy, to ensure consistency across content and SEO efforts. This agent helps maintain alignment by using stored data to generate relevant, on-brand outputs.","description_tool_prompt":"Store and retrieve key project metadata, such as tone of voice, website description, and internationalization strategy, to ensure consistency across content and SEO efforts. This agent helps maintain alignment by using stored data to generate relevant, on-brand outputs.","source":null,"conversation_examples":[],"tags":["content"],"available_in_chat":true,"available_in_deepthink":true,"available_in_mcp":true,"mcp_audience":"all","config":{"type":"object","properties":{},"required":[]},"item":{"type":"object","properties":{"method":{"description":"Method to execute: 'get' or 'patch'","enum":["get","patch"],"title":"Method","type":"string"},"keys":{"description":"The metadata keys to retrieve or store","items":{"enum":["brand_name","website_description","internationalization_strategy","tone_of_voice","currency","revenue_per_visit_desktop","revenue_per_visit_tablet","revenue_per_visit_mobile"],"type":"string"},"title":"Keys","type":"array"},"values":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"default":null,"description":"The values to store for given keys, for patch only.It must be the same length as keys and all values must be strings, including numeric ones.","title":"Values"}},"required":["method","keys"]},"response":{"properties":{"values":{"additionalProperties":{"anyOf":[{"type":"string"},{"type":"number"}]},"description":"Retrieved metadata values","propertyNames":{"enum":["brand_name","website_description","internationalization_strategy","tone_of_voice","currency","revenue_per_visit_desktop","revenue_per_visit_tablet","revenue_per_visit_mobile"]},"title":"Values","type":"object"},"not_set_values":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"default":null,"description":"Keys that were requested but not set","title":"Not Set Values"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Message describing the result","title":"Message"}},"required":["values"],"title":"ProjectMetadataProcessedItem","type":"object"},"has_canvas":false,"open_canvas_automatically":false},{"id":"robots_txt_check","name":"Robots.txt Check","alias":"RobotsTxtCheck","aliases":[],"description_short":"Fetch a host's robots.txt and optionally test URLs against a user-agent","description_long":"\n    Fetch robots.txt for a domain and optionally check whether URLs are allowed\n    or disallowed for a given user-agent.\n\n    Matching uses Google's robots.txt parser. A 2xx body (including an empty\n    file) is passed to the matcher. A 4xx response other than 429 is treated as\n    no robots.txt, so every URL is allowed. A 429, a 5xx response, or a transport\n    failure is treated as a temporary full disallow, so every URL is disallowed.\n\n    The matcher does not fold a more specific bot such as Googlebot-Image into\n    Googlebot. Pass the user-agent token you want to test.\n    ","description_tool_prompt":"\n    Fetch robots.txt for a domain and optionally check whether URLs are allowed\n    or disallowed for a given user-agent.\n\n    Matching uses Google's robots.txt parser. A 2xx body (including an empty\n    file) is passed to the matcher. A 4xx response other than 429 is treated as\n    no robots.txt, so every URL is allowed. A 429, a 5xx response, or a transport\n    failure is treated as a temporary full disallow, so every URL is disallowed.\n\n    The matcher does not fold a more specific bot such as Googlebot-Image into\n    Googlebot. Pass the user-agent token you want to test.\n    ","source":"The site's robots.txt, matched with Google's robots.txt parser","conversation_examples":["Fetch robots.txt for example.com","Is https://example.com/admin allowed for Googlebot?","Check /cart and /about against Bingbot on www.example.com"],"tags":["url data"],"available_in_chat":false,"available_in_deepthink":false,"available_in_mcp":true,"mcp_audience":"all","config":{"type":"object","properties":{},"required":[]},"item":{"type":"object","properties":{"domain":{"description":"Hostname (www.example.com) or absolute URL. Reduced to an origin (scheme + host + port). https is assumed when the scheme is omitted.","title":"Domain","type":"string"},"urls":{"default":[],"description":"URLs to test against the fetched robots.txt. Absolute http(s) URLs, or paths (/private) resolved against the origin. Each URL must use the same scheme, host, and port. At most 20.","items":{"type":"string"},"maxItems":20,"title":"URLs","type":"array"},"user_agent":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"User-agent token passed to the matcher. Required when urls is non-empty. Not defaulted; a specific bot such as Googlebot-Image is not folded into Googlebot.","title":"User Agent"}},"required":["domain"]},"response":{"$defs":{"RobotsTxtUrlCheck":{"description":"Whether one URL is allowed or disallowed by robots.txt.","properties":{"url":{"description":"The absolute URL that was matched","title":"URL","type":"string"},"allowed":{"description":"True when the URL passes robots.txt, false when it is disallowed","title":"Allowed","type":"boolean"}},"required":["url","allowed"],"title":"RobotsTxtUrlCheck","type":"object"}},"properties":{"found":{"description":"True when the fetch returned HTTP 2xx, including an empty file","title":"Found","type":"boolean"},"content":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"robots.txt body on 2xx, truncated to 500 KiB. Null when found is false. Empty file is found=true and content=''.","title":"Content"},"status_code":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"HTTP status of the robots.txt response, or null on transport failure","title":"Status Code"},"url":{"description":"The robots.txt URL that was requested","title":"Robots.txt URL","type":"string"},"checks":{"default":[],"description":"One entry per input URL, in order. Empty when urls was omitted. allowed is true when the URL passes robots.txt.","items":{"$ref":"#/$defs/RobotsTxtUrlCheck"},"title":"Checks","type":"array"}},"required":["found","content","status_code","url"],"title":"RobotsTxtCheckProcessedItem","type":"object"},"has_canvas":false,"open_canvas_automatically":false},{"id":"screenshot","name":"Screenshot","alias":"Screenshot","aliases":[],"description_short":"Capture a screenshot of a webpage and return a URL for the screenshot and an optional animated GIF","description_long":"\n    Take a screenshot of a webpage.\n    \n    The agent can optionally focus on a specific element using a CSS selector.\n    \n    Features:\n    - Full page screenshots\n    - Optional CSS selector to highlight specific elements\n    - Animated GIF generation (zoom into elements or scroll through page)\n    - Returns a URL that logged-in Botify users can open\n    \n    Animation Feature:\n    When animate=true:\n    - With a CSS selector: generates an animated GIF that:\n      1. Starts with a full page view from the top\n      2. Zooms into the first element (1-3 slides based on element size/depth)\n      3. Loops over up to 3 additional elements with smooth zoom animations\n    - Without a CSS selector: generates an animated GIF that scrolls from top to bottom of the page\n    ","description_tool_prompt":"\n    Take a screenshot of a webpage.\n    \n    The agent can optionally focus on a specific element using a CSS selector.\n    \n    Features:\n    - Full page screenshots\n    - Optional CSS selector to highlight specific elements\n    - Animated GIF generation (zoom into elements or scroll through page)\n    - Returns a URL that logged-in Botify users can open\n    \n    Animation Feature:\n    When animate=true:\n    - With a CSS selector: generates an animated GIF that:\n      1. Starts with a full page view from the top\n      2. Zooms into the first element (1-3 slides based on element size/depth)\n      3. Loops over up to 3 additional elements with smooth zoom animations\n    - Without a CSS selector: generates an animated GIF that scrolls from top to bottom of the page\n    ","source":"Web","conversation_examples":[],"tags":[],"available_in_chat":false,"available_in_deepthink":false,"available_in_mcp":null,"mcp_audience":"all","config":{"type":"object","properties":{},"required":[]},"item":{"type":"object","properties":{"url":{"description":"URL of the page to screenshot","title":"Url","type":"string"},"css_selector_highlight":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Optional CSS selector to highlight/focus on a specific element on the page","title":"Css Selector Highlight"},"animate":{"default":false,"description":"Generate an animated GIF that zooms into highlighted elements (if CSS selector provided) or scrolls through the page (if no CSS selector)","title":"Animate","type":"boolean"}},"required":["url"]},"response":{"properties":{"screenshot_url":{"description":"URL of the screenshot, served by the Botify API to logged-in users","title":"Screenshot Url","type":"string"},"animated_screenshot_url":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"URL of the animated GIF, served by the Botify API to logged-in users","title":"Animated Screenshot Url"}},"required":["screenshot_url"],"title":"ScreenshotProcessedItem","type":"object"},"has_canvas":false,"open_canvas_automatically":false},{"id":"search_console_keywords_groups","name":"Search Console Keywords Groups","alias":"SearchConsoleKeywordsGroups","aliases":[],"description_short":"List the keyword groups configured on the current project.","description_long":"List the keyword groups configured on the current project: id, name, slug, description, and match rules.","description_tool_prompt":"List keyword groups on the current project. Each group has an id, a name, and match rules (values and excluded_values). The id is the integer stored in search_console_keywords_groups.keywords_groups_ids and search_console_by_property_keywords_groups.keywords_groups_ids. Use this to find a group id and name before filtering those tables, or when the user asks which keyword groups exist. Filter with the group id as a literal, for example `42 IN UNNEST(keywords_groups_ids)`.","source":"Botify","conversation_examples":["List the keyword groups on this project","Which keyword groups exist, and what are their ids?"],"tags":["keywords"],"available_in_chat":true,"available_in_deepthink":true,"available_in_mcp":true,"mcp_audience":"all","config":{"type":"object","properties":{},"required":[]},"item":{"type":"object","properties":{},"required":[]},"response":{"$defs":{"KeywordGroup":{"description":"One keyword group, reduced to the fields needed to filter Search Console.","properties":{"id":{"description":"Keyword group id stored in keywords_groups_ids. Filter with the group id as a literal, for example `42 IN UNNEST(keywords_groups_ids)`.","title":"Id","type":"integer"},"name":{"description":"Keyword group name","title":"Name","type":"string"},"slug":{"description":"Stable slug derived from the name","title":"Slug","type":"string"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Optional description of the keyword group","title":"Description"},"values":{"description":"Rules that include a keyword in the group","items":{"$ref":"#/$defs/KeywordGroupRule"},"title":"Values","type":"array"},"excluded_values":{"description":"Rules that exclude a keyword from the group","items":{"$ref":"#/$defs/KeywordGroupRule"},"title":"Excluded Values","type":"array"}},"required":["id","name","slug","values","excluded_values"],"title":"KeywordGroup","type":"object"},"KeywordGroupRule":{"description":"One match rule of a keyword group.","properties":{"predicate":{"description":"How the keyword is matched: eq, contains, or re","enum":["eq","contains","re"],"title":"Predicate","type":"string"},"value":{"description":"Exact keyword, substring, or regular expression","title":"Value","type":"string"}},"required":["predicate","value"],"title":"KeywordGroupRule","type":"object"}},"properties":{"keyword_groups":{"description":"Keyword groups configured on the project","items":{"$ref":"#/$defs/KeywordGroup"},"title":"Keyword Groups","type":"array"},"count":{"description":"Number of keyword groups returned","title":"Count","type":"integer"}},"required":["keyword_groups","count"],"title":"SearchConsoleKeywordsGroupsProcessedItem","type":"object"},"has_canvas":false,"open_canvas_automatically":false},{"id":"searchgpt","name":"SearchGPT","alias":"SearchGPT","aliases":[],"description_short":"Search the web and get AI-powered answers with citations.","description_long":"Use GPT with web browsing capabilities to search the internet and provide accurate, up-to-date answers to your questions. Perfect for research, fact-checking, and getting comprehensive information about any topic.","description_tool_prompt":"Use GPT with web browsing capabilities to search the internet and provide accurate, up-to-date answers to your questions. Perfect for research, fact-checking, and getting comprehensive information about any topic.","source":"ChatGPT API","conversation_examples":["What are the latest developments in AI?","Tell me about the history of coffee","What are the best practices for SEO in 2026?","Explain the current situation in renewable energy"],"tags":["web search"],"available_in_chat":true,"available_in_deepthink":true,"available_in_mcp":true,"mcp_audience":"all","config":{"type":"object","properties":{"model":{"default":"gpt-5-mini","description":"OpenAI model to use for search","title":"Model","type":"string"}},"required":[]},"item":{"type":"object","properties":{"question":{"description":"What would you like to search for?","title":"Question","type":"string"},"city":{"default":"","description":"The city to search for","title":"City","type":"string"},"country":{"default":"","description":"The country to search for. ISO 3166-1 alpha-2 country code, e.g. \"US\".","title":"Country","type":"string"}},"required":["question"]},"response":{"$defs":{"SearchGptLink":{"properties":{"url":{"title":"Url","type":"string"},"title":{"title":"Title","type":"string"},"position":{"title":"Position","type":"integer"}},"required":["url","title","position"],"title":"SearchGptLink","type":"object"}},"properties":{"model":{"description":"Model used for the search","title":"Model","type":"string"},"answer":{"description":"AI-powered answer to the search query","title":"Answer","type":"string"},"links":{"description":"List of source links with titles, URLs and positions","items":{"$ref":"#/$defs/SearchGptLink"},"title":"Links","type":"array"}},"required":["model","answer","links"],"title":"SearchGptProcessedItem","type":"object"},"has_canvas":true,"open_canvas_automatically":false},{"id":"share_of_voice_analysis","name":"Share Of Voice Analysis","alias":"ShareOfVoiceAnalysis","aliases":[],"description_short":"Analyze the share of voice (no brand config required)","description_long":"Analyze the share of voice with per-brand sentiment and addressed topics","description_tool_prompt":"Analyze the share of voice with per-brand sentiment and addressed topics","source":"Targeted Provider (ChatGPT, Google AI Mode, Perplexity,etc.)","conversation_examples":[],"tags":["competitive analysis"],"available_in_chat":false,"available_in_deepthink":false,"available_in_mcp":null,"mcp_audience":"all","config":{"type":"object","properties":{"llm_model":{"default":"google:gemini-3.1-flash-lite","description":"Override LLM model (provider:model_name)","title":"Llm Model","type":"string"}},"required":[]},"item":{"type":"object","properties":{"query":{"description":"The search query to analyze","title":"Query","type":"string"},"text":{"description":"The text to analyze","title":"Text","type":"string"},"links":{"description":"The links to analyze","items":{"$ref":"#/$defs/Link"},"title":"Links","type":"array"},"provider_name":{"description":"The provider name","title":"Provider Name","type":"string"}},"required":["query","text","links","provider_name"],"$defs":{"Link":{"properties":{"url":{"title":"Url","type":"string"},"position":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"title":"Position"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Title"},"text":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Text"}},"required":["url"],"title":"Link","type":"object"}}},"response":{"$defs":{"AddressedTopic":{"description":"A topic addressed about a brand with its sentiment.","properties":{"topic":{"description":"Topic addressed (1-3 words, e.g. 'pricing', 'reliability')","title":"Topic","type":"string"},"sentiment":{"description":"Sentiment for this topic about this brand (positive, negative, or neutral)","enum":["positive","negative","neutral"],"title":"Sentiment","type":"string"}},"required":["topic","sentiment"],"title":"AddressedTopic","type":"object"},"BrandMention":{"description":"A brand mentioned in the AI answer with rationale and per-topic sentiments.","properties":{"name":{"description":"Brand name (lowercase, no duplicates, max 100 characters)","maxLength":100,"title":"Name","type":"string"},"rationale":{"description":"Concise explanation (1 sentence) of where/how the brand appears in the answer.\nExample: \"Recommended as budget option in the comparison section.\"\nExample: \"Listed among alternatives without detailed evaluation.\"\nExample: \"Mentioned as market leader in the introduction.\"","title":"Rationale","type":"string"},"addressed_topics":{"default":[],"description":"Topics discussed about THIS BRAND with their sentiment (max 3).\nEach topic should be 1-3 words (e.g. \"pricing\", \"reliability\", \"customer support\").\nExample for Nike: [{\"topic\": \"durability\", \"sentiment\": \"positive\"}, {\"topic\": \"pricing\", \"sentiment\": \"negative\"}, {\"topic\": \"delivery\", \"sentiment\": \"neutral\"}]","items":{"$ref":"#/$defs/AddressedTopic"},"maxItems":3,"title":"Addressed Topics","type":"array"}},"required":["name","rationale"],"title":"BrandMention","type":"object"},"DomainCitation":{"properties":{"domain":{"title":"Domain","type":"string"},"best_position":{"title":"Best Position","type":"integer"}},"required":["domain","best_position"],"title":"DomainCitation","type":"object"},"DomainsAnalysis":{"properties":{"domains_citations":{"items":{"$ref":"#/$defs/DomainCitation"},"title":"Domains Citations","type":"array"}},"required":["domains_citations"],"title":"DomainsAnalysis","type":"object"}},"properties":{"summary":{"description":"Summary of brand mentions and analysis","title":"Summary","type":"string"},"all_brands_with_sentiment":{"description":"List of brands mentioned with their sentiment, rationale, and topics","items":{"$ref":"#/$defs/BrandMention"},"title":"All Brands With Sentiment","type":"array"},"domain_analysis":{"$ref":"#/$defs/DomainsAnalysis","description":"Domain analysis"}},"required":["summary","all_brands_with_sentiment","domain_analysis"],"title":"ShareOfVoiceAnalysisProcessedItem","type":"object"},"has_canvas":false,"open_canvas_automatically":false},{"id":"site_crawler_url_detail","name":"Site Crawler URL Detail","alias":"URLDetail","aliases":[],"description_short":"Fetch site crawler crawl data for a given URL.","description_long":"\n    Get data for a URL from the latest successful site crawler analysis, including:\n\n* Core metadata: title, meta description, H1s, H2s\n\n* Technical details: HTTP status code, response time, content type\n\n* Link relationships: canonical URLs, hreflang tags\n\n* Link graph analysis: internal links, external links, incoming links\n\n* Page content: structured data, main content analysis\n\n* JavaScript rendering: rendered vs HTML content, JS dependencies\n\n* Crawl data: crawl date, crawl depth, crawl path\n\nWhen `save_to_tmp_storage` is enabled, the URL details are written to temporary\nproject storage and a URL is returned instead of the inline payload.\n    ","description_tool_prompt":"\n    Get data for a URL from the latest successful site crawler analysis, including:\n\n* Core metadata: title, meta description, H1s, H2s\n\n* Technical details: HTTP status code, response time, content type\n\n* Link relationships: canonical URLs, hreflang tags\n\n* Link graph analysis: internal links, external links, incoming links\n\n* Page content: structured data, main content analysis\n\n* JavaScript rendering: rendered vs HTML content, JS dependencies\n\n* Crawl data: crawl date, crawl depth, crawl path\n\nWhen `save_to_tmp_storage` is enabled, the URL details are written to temporary\nproject storage and a URL is returned instead of the inline payload.\n    ","source":"Botify","conversation_examples":["Get the crawl data for https://www.example.com/page","Fetch SiteCrawler URL details for https://www.example.com/page"],"tags":["url data"],"available_in_chat":false,"available_in_deepthink":false,"available_in_mcp":true,"mcp_audience":"all","config":{"type":"object","properties":{"save_to_tmp_storage":{"default":false,"description":"Save the bulky URL details to Botify temporary storage and return the temporary URL instead of the payload. Use this to save output tokens.","title":"Save To Temporary Storage","type":"boolean"}},"required":[]},"item":{"type":"object","properties":{"url":{"description":"The URL to look up","title":"URL","type":"string"}},"required":["url"]},"response":{"properties":{"url_data":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"default":null,"description":"Raw URL details from the latest successful crawl. Omitted when `save_to_tmp_storage` is True; see `url_data_tmp_storage_url` instead.","title":"Url Data"},"url_data_tmp_storage_url":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Temporary storage URL of the raw URL details. Returned instead of `url_data` when `save_to_tmp_storage` is True.","title":"Url Data Tmp Storage Url"},"url_details_href":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"A link to the detailed URL analysis in Botify Analytics","title":"Url Details Href"},"error":{"anyOf":[{"enum":["no_crawl_data","url_not_crawled"],"type":"string"},{"type":"null"}],"default":null,"description":"Set when crawl data could not be returned. `no_crawl_data`: the project has no successful crawl. `url_not_crawled`: the URL is missing from the latest successful crawl.","title":"Error"}},"title":"SiteCrawlerURLDetailProcessedItem","type":"object"},"has_canvas":false,"open_canvas_automatically":false},{"id":"site_crawler_url_details","name":"URL Details from Botify SiteCrawler","alias":"URLDetails","aliases":[],"description_short":"Find crawl data for a given URL.","description_long":"\n    Get comprehensive URL analysis from Botify's latest crawl, including:\n\n* Core metadata: title, meta description, H1s, H2s\n\n* Technical details: HTTP status code, response time, content type\n\n* Link relationships: canonical URLs, hreflang tags\n\n* Link graph analysis: internal links, external links, incoming links\n\n* Page content: structured data, main content analysis\n\n* JavaScript rendering: rendered vs HTML content, JS dependencies\n\n* Crawl data: crawl date, crawl depth, crawl path\n    ","description_tool_prompt":"\n    Get comprehensive URL analysis from Botify's latest crawl, including:\n\n* Core metadata: title, meta description, H1s, H2s\n\n* Technical details: HTTP status code, response time, content type\n\n* Link relationships: canonical URLs, hreflang tags\n\n* Link graph analysis: internal links, external links, incoming links\n\n* Page content: structured data, main content analysis\n\n* JavaScript rendering: rendered vs HTML content, JS dependencies\n\n* Crawl data: crawl date, crawl depth, crawl path\n    ","source":"Botify","conversation_examples":["What are the title, description, canonical and pagerank of https://www.example.com/page","List incoming links to https://www.example.com/page","Do I have hreflang issues with https://www.example.com/page"],"tags":["url data"],"available_in_chat":true,"available_in_deepthink":true,"available_in_mcp":false,"mcp_audience":"all","config":{"type":"object","properties":{},"required":[]},"item":{"type":"object","properties":{"url":{"description":"The URL to analyze","title":"URL","type":"string"},"question":{"description":"What information would you like to know about this URL","title":"Question","type":"string"}},"required":["url","question"]},"response":{"properties":{"summary":{"description":"A summary of the URL details","title":"Summary","type":"string"},"url_details_href":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"A link to the detailed URL analysis in Botify Analytics","title":"Url Details Href"}},"required":["summary"],"title":"SiteCrawlerURLDetailsProcessedItem","type":"object"},"has_canvas":false,"open_canvas_automatically":false},{"id":"sitemaps_detection","name":"Sitemaps Detection","alias":"SitemapsDetection","aliases":[],"description_short":"Find the sitemaps declared in the robots.txt of a site's start URLs","description_long":"\n    Read the robots.txt of each origin of the given start URLs and return the\n    sitemap URLs it declares (Sitemap: lines). Only absolute http(s) URLs are\n    kept. Invalid start URLs and unreachable or failing robots.txt files are\n    skipped (they yield no sitemap); the call errors only when no start URL is\n    usable.\n    The robots.txt is fetched like robots_txt_check does: without the\n    project's user agent or authentication headers.\n    ","description_tool_prompt":"\n    Read the robots.txt of each origin of the given start URLs and return the\n    sitemap URLs it declares (Sitemap: lines). Only absolute http(s) URLs are\n    kept. Invalid start URLs and unreachable or failing robots.txt files are\n    skipped (they yield no sitemap); the call errors only when no start URL is\n    usable.\n    The robots.txt is fetched like robots_txt_check does: without the\n    project's user agent or authentication headers.\n    ","source":null,"conversation_examples":[],"tags":["url data"],"available_in_chat":false,"available_in_deepthink":false,"available_in_mcp":true,"mcp_audience":"all","config":{"type":"object","properties":{},"required":[]},"item":{"type":"object","properties":{"start_urls":{"description":"Start URLs of the crawl. The robots.txt of each distinct origin (scheme, host, port) is read once. An explicit default port (:443 for https, :80 for http) is the same origin.","items":{"type":"string"},"maxItems":20,"minItems":1,"title":"Start Urls","type":"array"}},"required":["start_urls"]},"response":{"$defs":{"RobotsTxtSource":{"description":"The robots.txt read for one origin.","properties":{"url":{"description":"The robots.txt URL that was requested","title":"Url","type":"string"},"found":{"description":"Whether a robots.txt was returned (2xx)","title":"Found","type":"boolean"},"status_code":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"HTTP status, or null on transport failure","title":"Status Code"}},"required":["url","found","status_code"],"title":"RobotsTxtSource","type":"object"}},"properties":{"sitemaps":{"description":"Sitemap URLs declared in the robots.txt files, in order, without duplicates","items":{"type":"string"},"title":"Sitemaps","type":"array"},"robots_txt":{"description":"One entry per origin, in the order of the start URLs","items":{"$ref":"#/$defs/RobotsTxtSource"},"title":"Robots Txt","type":"array"}},"required":["sitemaps","robots_txt"],"title":"SitemapsDetectionProcessedItem","type":"object"},"has_canvas":false,"open_canvas_automatically":false},{"id":"speedworkers_config","name":"Speedworkers Config","alias":"SpeedworkersConfig","aliases":[],"description_short":"Get the SpeedWorkers configuration of the production version (default), the draft version, or a specific version","description_long":"\n    Retrieve the SpeedWorkers configuration of a project.\n\n    The version can be:\n    - 'production' (default): the version currently live\n    - 'draft': the version being edited, not yet pushed to production\n    - a version number (e.g. 42) as shown in SpeedWorkers versioning (the\n      speedworkers_versions agent lists the available ones)\n\n    Returns website-level info (beam domain, delivery stop, interceptor checks) and the\n    configuration of the requested version: settings (hosts, max speeds, cache refresh,\n    refresh intervals...), versioning metadata (comment, release date, last editor),\n    sections (cache behaviors and inventory optimization rules, with their refresh\n    rules and markdown rules), JS snippets (code per rendering or delivery step,\n    active or not, with sections_stable_ids for the sections they are declared on,\n    or applied to the whole site), rendering configs, inventory sources, Live Update\n    feeds and quality controls.\n    ","description_tool_prompt":"\n    Retrieve the SpeedWorkers configuration of a project.\n\n    The version can be:\n    - 'production' (default): the version currently live\n    - 'draft': the version being edited, not yet pushed to production\n    - a version number (e.g. 42) as shown in SpeedWorkers versioning (the\n      speedworkers_versions agent lists the available ones)\n\n    Returns website-level info (beam domain, delivery stop, interceptor checks) and the\n    configuration of the requested version: settings (hosts, max speeds, cache refresh,\n    refresh intervals...), versioning metadata (comment, release date, last editor),\n    sections (cache behaviors and inventory optimization rules, with their refresh\n    rules and markdown rules), JS snippets (code per rendering or delivery step,\n    active or not, with sections_stable_ids for the sections they are declared on,\n    or applied to the whole site), rendering configs, inventory sources, Live Update\n    feeds and quality controls.\n    ","source":"Botify Activation API","conversation_examples":[],"tags":[],"available_in_chat":true,"available_in_deepthink":true,"available_in_mcp":true,"mcp_audience":"all","config":{"type":"object","properties":{},"required":[]},"item":{"type":"object","properties":{"version":{"anyOf":[{"enum":["production","draft"],"type":"string"},{"exclusiveMinimum":0,"type":"integer"}],"default":"production","description":"SpeedWorkers version to get the configuration of: 'production' (default), 'draft', or a version number as shown in SpeedWorkers versioning (e.g. 42)","title":"Version"}},"required":[]},"response":{"properties":{"website":{"additionalProperties":true,"description":"Website-level SpeedWorkers info (beam domain, delivery stop, interceptor checks)","title":"Website","type":"object"},"version":{"additionalProperties":true,"description":"Configuration of the requested version (settings, sections/cache behaviors, JS snippets with their code per step and sections_stable_ids (or applied to the whole site), rendering configs, inventory sources, Live Update feeds, quality controls)","title":"Version","type":"object"}},"required":["website","version"],"title":"SpeedworkersConfigProcessedItem","type":"object"},"has_canvas":false,"open_canvas_automatically":false},{"id":"speedworkers_inventory","name":"Speedworkers Inventory","alias":"SpeedworkersInventory","aliases":[],"description_short":"Get the daily SpeedWorkers inventory of the project (pages in index, stale, expired, not indexed) and whether the rendering speed keeps up with it","description_long":"\n    Get the SpeedWorkers inventory of a project: how many pages are in each state, day\n    by day, and whether the rendering capacity is enough to keep them fresh.\n\n    The inventory is a daily snapshot of the pages SpeedWorkers knows about, counted by\n    state:\n    - in index: fresh pages, delivered\n    - stale: past their refresh time but within their max stale time, still delivered\n      while waiting to be re-rendered\n    - expired: past their max stale time, no longer delivered\n    - not indexed: in the inputs but never successfully rendered\n\n    There is one row per day, broken down by the requested dimensions (by section by\n    default):\n    - section_name: SpeedWorkers section\n    - config_id: SpeedWorkers config id\n    - priority: refresh priority (emergency, high, medium or low)\n    - refresh_frequency: refresh frequency of the pages, in minutes\n    An empty list of dimensions returns one total per day. Rows can include up to 5\n    sample URLs per state.\n\n    The crawl stats compare today's inventory to the max rendering speed of the\n    production version: the required speed is what refreshing every page at its\n    section refresh frequency needs, and a load above 1 means pages will go stale or\n    expire. They are null when the inventory has never been computed, which is the\n    case until the cache refresh is enabled on the production version.\n\n    Use the speedworkers_config tool to see the sections and their refresh settings.\n    ","description_tool_prompt":"\n    Get the SpeedWorkers inventory of a project: how many pages are in each state, day\n    by day, and whether the rendering capacity is enough to keep them fresh.\n\n    The inventory is a daily snapshot of the pages SpeedWorkers knows about, counted by\n    state:\n    - in index: fresh pages, delivered\n    - stale: past their refresh time but within their max stale time, still delivered\n      while waiting to be re-rendered\n    - expired: past their max stale time, no longer delivered\n    - not indexed: in the inputs but never successfully rendered\n\n    There is one row per day, broken down by the requested dimensions (by section by\n    default):\n    - section_name: SpeedWorkers section\n    - config_id: SpeedWorkers config id\n    - priority: refresh priority (emergency, high, medium or low)\n    - refresh_frequency: refresh frequency of the pages, in minutes\n    An empty list of dimensions returns one total per day. Rows can include up to 5\n    sample URLs per state.\n\n    The crawl stats compare today's inventory to the max rendering speed of the\n    production version: the required speed is what refreshing every page at its\n    section refresh frequency needs, and a load above 1 means pages will go stale or\n    expire. They are null when the inventory has never been computed, which is the\n    case until the cache refresh is enabled on the production version.\n\n    Use the speedworkers_config tool to see the sections and their refresh settings.\n    ","source":"Botify Activation API","conversation_examples":[],"tags":[],"available_in_chat":true,"available_in_deepthink":true,"available_in_mcp":true,"mcp_audience":"all","config":{"type":"object","properties":{},"required":[]},"item":{"type":"object","properties":{"date_start":{"anyOf":[{"format":"date","type":"string"},{"type":"null"}],"default":null,"description":"Inclusive start of the inventory period (ISO date, e.g. 2026-09-01). Defaults to 29 days before date_end.","title":"Date Start"},"date_end":{"anyOf":[{"format":"date","type":"string"},{"type":"null"}],"default":null,"description":"Inclusive end of the inventory period (ISO date, e.g. 2026-09-30). Defaults to today (UTC).","title":"Date End"},"dimensions":{"default":["section_name"],"description":"Dimensions the daily inventory is broken down by, on top of the date (always included). Allowed values: 'section_name' (SpeedWorkers section), 'config_id' (SpeedWorkers config id), 'priority' (refresh priority: emergency, high, medium or low), 'refresh_frequency' (refresh frequency of the pages, in minutes). Each dimension added multiplies the number of rows. An empty list returns one total per day. Defaults to ['section_name'].","items":{"$ref":"#/$defs/SpeedworkersInventoryDimension"},"title":"Dimensions","type":"array"},"include_samples":{"default":false,"description":"Whether to return up to 5 sample URLs per page state (in index, stale, expired, not indexed) for each row","title":"Include Samples","type":"boolean"}},"required":[],"$defs":{"SpeedworkersInventoryDimension":{"enum":["section_name","config_id","priority","refresh_frequency"],"type":"string"}}},"response":{"$defs":{"CrawlStats":{"properties":{"max_speed":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Max rendering speed of the production version, in pages/s","title":"Max Speed"},"required_speed":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Rendering speed needed to refresh the whole inventory at the sections refresh frequencies, in pages/s","title":"Required Speed"},"max_pages_refresh":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Pages that can be rendered per day at max speed","title":"Max Pages Refresh"},"required_pages_refresh":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Pages that must be rendered per day to stay fresh","title":"Required Pages Refresh"},"pages_in_inventory":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Pages in today's inventory","title":"Pages In Inventory"},"load":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"required_speed / max_speed: above 1, the website cannot refresh its inventory in time and pages go stale or expire","title":"Load"},"info":{"$ref":"#/$defs/CrawlStatsInfo","description":"success, or why the speeds could not be computed (no max speed, no pages in today's inventory, a section without refresh frequency...)"},"sections":{"description":"Load of each delivered section","items":{"$ref":"#/$defs/CrawlStatsSection"},"title":"Sections","type":"array"}},"required":["max_speed","required_speed","max_pages_refresh","required_pages_refresh","pages_in_inventory","load","info","sections"],"title":"CrawlStats","type":"object"},"CrawlStatsInfo":{"enum":["success","no_config_js","no_website_max_speed","no_pages_in_inventory","invalid_refresh_frequency"],"type":"string"},"CrawlStatsSection":{"properties":{"name":{"description":"SpeedWorkers section","title":"Name","type":"string"},"load":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Share of the website max speed this section requires","title":"Load"}},"required":["name","load"],"title":"CrawlStatsSection","type":"object"},"InventorySample":{"properties":{"url":{"description":"Sample URL","title":"Url","type":"string"},"device":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Device the URL is cached for","title":"Device"}},"required":["url","device"],"title":"InventorySample","type":"object"},"InventoryStatsRow":{"properties":{"date":{"description":"Day of the inventory snapshot","format":"date","title":"Date","type":"string"},"section_name":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"SpeedWorkers section (only with the section_name dimension)","title":"Section Name"},"config_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"SpeedWorkers config id (only with the config_id dimension)","title":"Config Id"},"priority":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Refresh priority: emergency, high, medium or low (only with the priority dimension)","title":"Priority"},"refresh_frequency":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"Refresh frequency of the pages, in minutes (only with the refresh_frequency dimension)","title":"Refresh Frequency"},"count":{"description":"Number of pages in the inventory","title":"Count","type":"integer"},"count_in_index":{"description":"Pages that are fresh and delivered by SpeedWorkers","title":"Count In Index","type":"integer"},"count_in_stale":{"description":"Pages past their refresh time but within their max stale time: still delivered, waiting to be re-rendered","title":"Count In Stale","type":"integer"},"count_expired":{"description":"Pages past their max stale time: no longer delivered","title":"Count Expired","type":"integer"},"count_not_indexed":{"description":"Pages in the inputs that were never successfully rendered (render pending or failed)","title":"Count Not Indexed","type":"integer"},"samples_in_index":{"anyOf":[{"items":{"$ref":"#/$defs/InventorySample"},"type":"array"},{"type":"null"}],"default":null,"description":"Sample in index URLs (only with include_samples)","title":"Samples In Index"},"samples_in_stale":{"anyOf":[{"items":{"$ref":"#/$defs/InventorySample"},"type":"array"},{"type":"null"}],"default":null,"description":"Sample stale URLs (only with include_samples)","title":"Samples In Stale"},"samples_expired":{"anyOf":[{"items":{"$ref":"#/$defs/InventorySample"},"type":"array"},{"type":"null"}],"default":null,"description":"Sample expired URLs (only with include_samples)","title":"Samples Expired"},"samples_not_indexed":{"anyOf":[{"items":{"$ref":"#/$defs/InventorySample"},"type":"array"},{"type":"null"}],"default":null,"description":"Sample not indexed URLs (only with include_samples)","title":"Samples Not Indexed"}},"required":["date","count","count_in_index","count_in_stale","count_expired","count_not_indexed"],"title":"InventoryStatsRow","type":"object"}},"properties":{"date_start":{"description":"Inclusive start of the inventory period","format":"date","title":"Date Start","type":"string"},"date_end":{"description":"Inclusive end of the inventory period","format":"date","title":"Date End","type":"string"},"inventory_stats":{"description":"Daily inventory snapshots, one row per date and combination of dimension values, ordered by date. A day without a snapshot has no row. When truncated, a day only partly within the limit is left out, unless it is the only one.","items":{"$ref":"#/$defs/InventoryStatsRow"},"title":"Inventory Stats","type":"array"},"truncated":{"description":"Whether the oldest days were left out to stay within 2000 rows: shorten the period or use fewer dimensions","title":"Truncated","type":"boolean"},"crawl_stats":{"anyOf":[{"$ref":"#/$defs/CrawlStats"},{"type":"null"}],"description":"Rendering capacity against today's inventory. Null when the inventory has never been computed for the website, i.e. the cache refresh is not enabled on the production version."}},"required":["date_start","date_end","inventory_stats","truncated","crawl_stats"],"title":"SpeedworkersInventoryProcessedItem","type":"object"},"has_canvas":false,"open_canvas_automatically":false},{"id":"speedworkers_page_history","name":"SpeedWorkers Page History","alias":"SpeedworkersPageHistory","aliases":[],"description_short":"Get the SpeedWorkers indexation history of URLs: when they were cached, with which status code and whether they could be served to bots.","description_long":"\n    List the past indexations of one or more URLs by Botify SpeedWorkers, newest\n    first: date, whether the page was stored in the cache, HTTP status code\n    returned by the origin, device variant, page size, matching cache behavior,\n    whether the page could be served to bots (and why not), canonical URL, next\n    refresh and expiration times, fetching and rendering times.\n\n    Pass every URL in a single call. Each call scans the SpeedWorkers indexation\n    table once, however many URLs it lists, so calling this tool with several\n    URLs at once is what keeps the number of scans down.\n\n    SpeedWorkers stores the history under the URL resolved before caching\n    (ignored query parameters removed...): by default each URL is resolved\n    first, and the requested URL is used when the resolved one has no history.\n\n    Each event has an `event_id`: pass it to `speedworkers_page_snapshot` to get\n    the HTML stored during this indexation. Use `speedworkers_page_preview` for\n    the page currently delivered to bots.\n\n    The project must have SpeedWorkers enabled.\n    ","description_tool_prompt":"\n    List the past indexations of one or more URLs by Botify SpeedWorkers, newest\n    first: date, whether the page was stored in the cache, HTTP status code\n    returned by the origin, device variant, page size, matching cache behavior,\n    whether the page could be served to bots (and why not), canonical URL, next\n    refresh and expiration times, fetching and rendering times.\n\n    Pass every URL in a single call. Each call scans the SpeedWorkers indexation\n    table once, however many URLs it lists, so calling this tool with several\n    URLs at once is what keeps the number of scans down.\n\n    SpeedWorkers stores the history under the URL resolved before caching\n    (ignored query parameters removed...): by default each URL is resolved\n    first, and the requested URL is used when the resolved one has no history.\n\n    Each event has an `event_id`: pass it to `speedworkers_page_snapshot` to get\n    the HTML stored during this indexation. Use `speedworkers_page_preview` for\n    the page currently delivered to bots.\n\n    The project must have SpeedWorkers enabled.\n    ","source":"Botify SpeedWorkers","conversation_examples":[],"tags":["url data"],"available_in_chat":true,"available_in_deepthink":true,"available_in_mcp":true,"mcp_audience":"all","config":{"type":"object","properties":{},"required":[]},"item":{"type":"object","properties":{"urls":{"description":"URLs to get the SpeedWorkers indexation history of. Pass several URLs in one call: they are read in a single scan of the indexation table. One call returns at most 10000 events (URLs x limit). Resolving URLs counts each URL twice, once for the resolved form and once for the requested one.","items":{"type":"string"},"maxItems":1000,"minItems":1,"title":"URLs","type":"array"},"days":{"default":15,"description":"Number of past days to look for indexation events in.","maximum":90,"minimum":1,"title":"Days","type":"integer"},"limit":{"default":50,"description":"Maximum number of indexation events to return per URL, newest first.","maximum":500,"minimum":1,"title":"Limit","type":"integer"},"resolve_url":{"default":true,"description":"Resolve each URL the way SpeedWorkers does before caching it (ignored query parameters removed...), since the indexation history is stored under the resolved URL.","title":"Resolve URL","type":"boolean"}},"required":["urls"]},"response":{"$defs":{"SpeedWorkersIndexationEvent":{"properties":{"event_id":{"description":"Opaque ID of the indexation event. Pass it to the `speedworkers_page_snapshot` tool to get the HTML SpeedWorkers stored during this indexation.","title":"Event Id","type":"string"},"indexed_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"default":null,"description":"When the indexation happened","title":"Indexed At"},"indexed":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"description":"Whether the page was stored in the SpeedWorkers cache","title":"Indexed"},"http_code":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"HTTP status code returned by the origin","title":"Http Code"},"device":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Device variant (desktop, mobile, na)","title":"Device"},"page_size":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"Page size, in bytes","title":"Page Size"},"section_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"ID of the matching cache behavior (section)","title":"Section Id"},"section_name":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Name of the matching cache behavior (section)","title":"Section Name"},"ready_to_be_served":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"description":"Whether the page can be served to bots (indexed, a servable status code, and no failed or errored quality control)","title":"Ready To Be Served"},"not_ready_to_be_served_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Why the page cannot be served to bots (status_code, quality_controls, not_indexed)","title":"Not Ready To Be Served Reason"},"not_deliverable_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Why the page would not be delivered to bots (e.g. not_cached, quality_controls_failed, last_refresh_5xx). `delivered` when it was delivered, `cached` when it was served from cache with no blocking reason.","title":"Not Deliverable Reason"},"canonical_url":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Canonical URL found in the page","title":"Canonical Url"},"canonical_equal":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"description":"Whether the canonical URL is the page URL","title":"Canonical Equal"},"next_refresh_time":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"default":null,"description":"When the page is due for a refresh","title":"Next Refresh Time"},"expiration_time":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"default":null,"description":"When the cached page expires","title":"Expiration Time"},"ttl_minutes":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"Time between the indexation and the next refresh, in minutes","title":"Ttl Minutes"},"time_to_fetch_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"Time spent fetching the page, in ms","title":"Time To Fetch Ms"},"time_to_render_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"Time spent rendering the page, in ms","title":"Time To Render Ms"}},"required":["event_id"],"title":"SpeedWorkersIndexationEvent","type":"object"},"SpeedWorkersUrlHistory":{"properties":{"queried_url":{"description":"The URL from the request","title":"Queried Url","type":"string"},"resolved_url":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"The URL as resolved by SpeedWorkers before caching, when it differs from the requested one","title":"Resolved Url"},"events":{"default":[],"description":"Indexation events, newest first","items":{"$ref":"#/$defs/SpeedWorkersIndexationEvent"},"title":"Events","type":"array"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Why no indexation event was returned, if any","title":"Reason"}},"required":["queried_url"],"title":"SpeedWorkersUrlHistory","type":"object"}},"properties":{"pages":{"description":"Indexation history of each requested URL, in the order given","items":{"$ref":"#/$defs/SpeedWorkersUrlHistory"},"title":"Pages","type":"array"}},"required":["pages"],"title":"SpeedWorkersPageHistoryProcessedItem","type":"object"},"has_canvas":false,"open_canvas_automatically":false},{"id":"speedworkers_page_preview","name":"SpeedWorkers Page Preview","alias":"SpeedworkersPagePreview","aliases":[],"description_short":"Get the HTML, headers and metadata SpeedWorkers delivers to bots for a URL.","description_long":"\n    Preview what Botify SpeedWorkers delivers to search and AI bots for a URL:\n    the pre-rendered HTML (or markdown) served from the SpeedWorkers cache, the\n    HTTP status code and headers bots receive, and the delivery metadata (where\n    the page was delivered from, why it would not be delivered, last cache and\n    next refresh times, matching cache behavior, quality controls results,\n    inventory sources and page properties).\n\n    The HTML is returned as delivered, without any cleaning. With\n    `save_to_tmp_storage`, the HTML is saved to temporary storage and its URL is\n    returned instead, while the headers and metadata are still returned. This\n    option writes a new temporary object to project storage.\n\n    The project must have SpeedWorkers enabled.\n    ","description_tool_prompt":"\n    Preview what Botify SpeedWorkers delivers to search and AI bots for a URL:\n    the pre-rendered HTML (or markdown) served from the SpeedWorkers cache, the\n    HTTP status code and headers bots receive, and the delivery metadata (where\n    the page was delivered from, why it would not be delivered, last cache and\n    next refresh times, matching cache behavior, quality controls results,\n    inventory sources and page properties).\n\n    The HTML is returned as delivered, without any cleaning. With\n    `save_to_tmp_storage`, the HTML is saved to temporary storage and its URL is\n    returned instead, while the headers and metadata are still returned. This\n    option writes a new temporary object to project storage.\n\n    The project must have SpeedWorkers enabled.\n    ","source":"Botify SpeedWorkers","conversation_examples":[],"tags":["content"],"available_in_chat":true,"available_in_deepthink":true,"available_in_mcp":true,"mcp_audience":"all","config":{"type":"object","properties":{"save_to_tmp_storage":{"default":false,"description":"Save the fetched HTML to Botify temporary storage and return the temporary URL instead of the HTML. Use this to save output tokens. The returned URL can be passed to other HTML-processing tools. Headers and metadata are still returned.","title":"Save To Temporary Storage","type":"boolean"}},"required":[]},"item":{"type":"object","properties":{"url":{"description":"The URL to get the SpeedWorkers preview for.","title":"URL","type":"string"},"device":{"$ref":"#/$defs/SpeedWorkersDevice","default":"desktop","description":"The device variant of the cached page. When `desktop` or `mobile` is not cached, SpeedWorkers falls back to the device-agnostic (`na`) variant.","enumNames":["Desktop","Mobile","Not applicable"],"title":"Device"},"output_format":{"anyOf":[{"$ref":"#/$defs/SpeedWorkersOutputFormat"},{"type":"null"}],"default":null,"description":"Force the delivered format (`html`, `markdown` for markdown embedded in an HTML page, `pure_markdown` for raw markdown). By default, the format the page's cache behavior delivers to bots.","title":"Output Format"}},"required":["url"],"$defs":{"SpeedWorkersDevice":{"enum":["desktop","mobile","na"],"title":"SpeedWorkersDevice","type":"string"},"SpeedWorkersOutputFormat":{"enum":["html","markdown","pure_markdown"],"title":"SpeedWorkersOutputFormat","type":"string"}}},"response":{"$defs":{"SpeedWorkersInput":{"properties":{"stable_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Stable ID of the input","title":"Stable Id"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Name of the input","title":"Name"},"input_type":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Type of the input","title":"Input Type"}},"title":"SpeedWorkersInput","type":"object"},"SpeedWorkersPreviewMetadata":{"properties":{"delivered_from":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Where the page was delivered from (cache, fetch, liverender, section, ignoredparams, livefetch, nowhere)","title":"Delivered From"},"not_delivered_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Why the page would not be delivered to bots (e.g. not_cached, quality_controls_failed), `cached` otherwise","title":"Not Delivered Reason"},"redirect_url":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Redirect target, when the page redirects","title":"Redirect Url"},"output_format":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Format actually delivered (html, markdown, pure_markdown)","title":"Output Format"},"last_index_time":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"default":null,"description":"When the page was last cached","title":"Last Index Time"},"refresh_time":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"default":null,"description":"When the page is due for a refresh","title":"Refresh Time"},"original_processing_time_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"Time spent fetching and rendering the page, in ms","title":"Original Processing Time Ms"},"beam_processing_time_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"Time spent by SpeedWorkers to deliver the page, in ms","title":"Beam Processing Time Ms"},"section":{"anyOf":[{"$ref":"#/$defs/SpeedWorkersSection"},{"type":"null"}],"default":null,"description":"Cache behavior (section) matching the page"},"quality_controls":{"default":[],"description":"Quality controls run on the page","items":{"$ref":"#/$defs/SpeedWorkersQualityControl"},"title":"Quality Controls","type":"array"},"inputs":{"default":[],"description":"Inventory sources the page comes from","items":{"$ref":"#/$defs/SpeedWorkersInput"},"title":"Inputs","type":"array"},"properties":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"default":null,"description":"Page properties extracted from the HTML","title":"Properties"},"js_error":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"JavaScript error raised during delivery","title":"Js Error"}},"title":"SpeedWorkersPreviewMetadata","type":"object"},"SpeedWorkersQualityControl":{"properties":{"id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"ID of the quality control","title":"Id"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Name of the quality control","title":"Name"},"status":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"Result of the quality control (0 = success, 3 = error)","title":"Status"},"severity":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Severity of the quality control","title":"Severity"}},"title":"SpeedWorkersQualityControl","type":"object"},"SpeedWorkersSection":{"properties":{"id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Stable ID of the cache behavior","title":"Id"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Name of the cache behavior","title":"Name"}},"title":"SpeedWorkersSection","type":"object"}},"properties":{"html":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"HTML (or markdown) of the page as delivered to bots by SpeedWorkers. Omitted when `save_to_tmp_storage` is True; see `html_tmp_storage_url` instead.","title":"Html"},"html_tmp_storage_url":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Temporary storage URL of the HTML page. Returned instead of `html` when `save_to_tmp_storage` is True. Can be passed to other HTML-processing tools.","title":"Html Tmp Storage Url"},"status_code":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"HTTP status code delivered to bots","title":"Status Code"},"headers":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"default":null,"description":"HTTP headers delivered to bots","title":"Headers"},"metadata":{"anyOf":[{"$ref":"#/$defs/SpeedWorkersPreviewMetadata"},{"type":"null"}],"default":null,"description":"SpeedWorkers delivery metadata of the page"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Why no HTML was returned, if any","title":"Reason"}},"title":"SpeedWorkersPagePreviewProcessedItem","type":"object"},"has_canvas":false,"open_canvas_automatically":false},{"id":"speedworkers_page_snapshot","name":"SpeedWorkers Page Snapshot","alias":"SpeedworkersPageSnapshot","aliases":[],"description_short":"Get the HTML SpeedWorkers stored for a URL during a past indexation.","description_long":"\n    Get what Botify SpeedWorkers stored during one past indexation of a page:\n    the HTML received (and rendered) from the origin, the URL fetched, the HTTP\n    status code and headers returned by the origin, the canonical URL, a summary\n    of the JavaScript rendering, and the indexation job (cache behavior,\n    rendering config, inventory sources and page properties).\n\n    The indexation event is identified by the `event_id` returned by\n    `speedworkers_page_history`. Old events may no longer be available. Use\n    `speedworkers_page_preview` for the page currently delivered to bots.\n\n    Header values that may hold credentials (cookies, authorization...) and\n    credentials in URLs are masked. With `save_to_tmp_storage`, the HTML is saved\n    to temporary storage and its URL is returned instead. This option writes a\n    new temporary object to project storage.\n\n    The project must have SpeedWorkers enabled.\n    ","description_tool_prompt":"\n    Get what Botify SpeedWorkers stored during one past indexation of a page:\n    the HTML received (and rendered) from the origin, the URL fetched, the HTTP\n    status code and headers returned by the origin, the canonical URL, a summary\n    of the JavaScript rendering, and the indexation job (cache behavior,\n    rendering config, inventory sources and page properties).\n\n    The indexation event is identified by the `event_id` returned by\n    `speedworkers_page_history`. Old events may no longer be available. Use\n    `speedworkers_page_preview` for the page currently delivered to bots.\n\n    Header values that may hold credentials (cookies, authorization...) and\n    credentials in URLs are masked. With `save_to_tmp_storage`, the HTML is saved\n    to temporary storage and its URL is returned instead. This option writes a\n    new temporary object to project storage.\n\n    The project must have SpeedWorkers enabled.\n    ","source":"Botify SpeedWorkers","conversation_examples":[],"tags":["url data"],"available_in_chat":true,"available_in_deepthink":true,"available_in_mcp":true,"mcp_audience":"all","config":{"type":"object","properties":{"save_to_tmp_storage":{"default":false,"description":"Save the HTML to Botify temporary storage and return the temporary URL instead of the HTML. Use this to save output tokens. The returned URL can be passed to other HTML-processing tools. Headers and details are still returned.","title":"Save To Temporary Storage","type":"boolean"}},"required":[]},"item":{"type":"object","properties":{"event_id":{"description":"The `event_id` of an indexation event, as returned by the `speedworkers_page_history` tool.","title":"Event ID","type":"string"}},"required":["event_id"]},"response":{"$defs":{"SpeedWorkersCanonical":{"properties":{"has_canonical":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"description":"Whether the page declares a canonical URL","title":"Has Canonical"},"canonical_url":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Canonical URL declared by the page","title":"Canonical Url"},"canonical_equal":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"description":"Whether the canonical URL is the page URL","title":"Canonical Equal"}},"title":"SpeedWorkersCanonical","type":"object"},"SpeedWorkersIndexationJob":{"properties":{"section_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"ID of the matching cache behavior (section)","title":"Section Id"},"config_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"ID of the rendering config used","title":"Config Id"},"config_type":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Type of the rendering config (device)","title":"Config Type"},"input_ids":{"default":[],"description":"IDs of the inventory sources of the page","items":{"type":"string"},"title":"Input Ids","type":"array"},"page_properties":{"default":[],"description":"Page properties at the time of the indexation","items":{"$ref":"#/$defs/SpeedWorkersPageProperty"},"title":"Page Properties","type":"array"},"status_code":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"Status code of the page known before the job","title":"Status Code"},"previous_status_code":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"Previous status code of the page","title":"Previous Status Code"},"batch_date":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Date of the indexation batch","title":"Batch Date"}},"title":"SpeedWorkersIndexationJob","type":"object"},"SpeedWorkersJsRendering":{"properties":{"device":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Rendering device","title":"Device"},"rendered":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"description":"Whether the page was rendered with JavaScript","title":"Rendered"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Rendering status","title":"Status"},"redirect_url":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Redirect target found during the rendering","title":"Redirect Url"},"version_code":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Version of the rendering engine","title":"Version Code"},"rendering_time_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"Rendering time, in ms","title":"Rendering Time Ms"},"nb_resources":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"Number of resources requested by the page","title":"Nb Resources"},"nb_resources_error":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"Number of resources that failed to load","title":"Nb Resources Error"}},"title":"SpeedWorkersJsRendering","type":"object"},"SpeedWorkersPageProperty":{"properties":{"input":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"ID of the inventory source of the property","title":"Input"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Property name","title":"Name"},"value":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Property value","title":"Value"}},"title":"SpeedWorkersPageProperty","type":"object"}},"properties":{"html":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"HTML of the page as stored by SpeedWorkers during this indexation. Omitted when `save_to_tmp_storage` is True; see `html_tmp_storage_url` instead.","title":"Html"},"html_tmp_storage_url":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Temporary storage URL of the HTML page. Returned instead of `html` when `save_to_tmp_storage` is True. Can be passed to other HTML-processing tools.","title":"Html Tmp Storage Url"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"URL fetched by SpeedWorkers from the origin","title":"Url"},"indexed_at":{"description":"When the indexation happened","format":"date-time","title":"Indexed At","type":"string"},"status_code":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"HTTP status code returned by the origin","title":"Status Code"},"headers":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"default":null,"description":"HTTP headers returned by the origin; values that may hold credentials (cookies, authorization...) are masked with `**`","title":"Headers"},"canonical":{"anyOf":[{"$ref":"#/$defs/SpeedWorkersCanonical"},{"type":"null"}],"default":null,"description":"Canonical URL found in the page"},"js_rendering":{"anyOf":[{"$ref":"#/$defs/SpeedWorkersJsRendering"},{"type":"null"}],"default":null,"description":"Summary of the JavaScript rendering"},"job":{"anyOf":[{"$ref":"#/$defs/SpeedWorkersIndexationJob"},{"type":"null"}],"default":null,"description":"Indexation job: cache behavior, rendering config, inventory sources and page properties"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Why no HTML was returned, if any","title":"Reason"}},"required":["indexed_at"],"title":"SpeedWorkersPageSnapshotProcessedItem","type":"object"},"has_canvas":false,"open_canvas_automatically":false},{"id":"speedworkers_versions","name":"Speedworkers Versions","alias":"SpeedworkersVersions","aliases":[],"description_short":"List the SpeedWorkers versions of the project (version number, production release date, last editor, comment)","description_long":"\n    List the SpeedWorkers settings versions of a project, most recent first.\n\n    For each version: its number, when it was pushed to production (null if it never\n    was, e.g. the current draft), the last user who edited it or pushed it, and the\n    comment entered when it was pushed to production.\n\n    Use a version number with the speedworkers_config agent to get the full\n    configuration of that version.\n    ","description_tool_prompt":"\n    List the SpeedWorkers settings versions of a project, most recent first.\n\n    For each version: its number, when it was pushed to production (null if it never\n    was, e.g. the current draft), the last user who edited it or pushed it, and the\n    comment entered when it was pushed to production.\n\n    Use a version number with the speedworkers_config agent to get the full\n    configuration of that version.\n    ","source":"Botify Activation API","conversation_examples":[],"tags":[],"available_in_chat":true,"available_in_deepthink":true,"available_in_mcp":true,"mcp_audience":"all","config":{"type":"object","properties":{},"required":[]},"item":{"type":"object","properties":{},"required":[]},"response":{"$defs":{"SpeedworkersVersionSummary":{"properties":{"version":{"description":"Version number, as shown in SpeedWorkers versioning","title":"Version","type":"integer"},"date_released_on_production":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"description":"When this version was pushed to production (null if it never was, e.g. the current draft)","title":"Date Released On Production"},"last_edited_by":{"description":"Last user who edited this version (or pushed it to production)","title":"Last Edited By","type":"string"},"comment":{"description":"Comment entered when the version was pushed to production (empty if none)","title":"Comment","type":"string"}},"required":["version","date_released_on_production","last_edited_by","comment"],"title":"SpeedworkersVersionSummary","type":"object"}},"properties":{"versions":{"description":"SpeedWorkers versions, most recent first","items":{"$ref":"#/$defs/SpeedworkersVersionSummary"},"title":"Versions","type":"array"}},"required":["versions"],"title":"SpeedworkersVersionsProcessedItem","type":"object"},"has_canvas":false,"open_canvas_automatically":false},{"id":"tables_create","name":"Tables Create","alias":"TablesCreate","aliases":[],"description_short":"Agent that creates a BigQuery table in the customer's catalog dataset","description_long":"Create a new table in the project's catalog.\n    Provide a table name and a list of column definitions (name, type, mode, description).\n    ","description_tool_prompt":"Create a new table in the project's catalog.\n    Provide a table name and a list of column definitions (name, type, mode, description).\n    ","source":null,"conversation_examples":[],"tags":[],"available_in_chat":false,"available_in_deepthink":false,"available_in_mcp":true,"mcp_audience":"all","config":{"type":"object","properties":{},"required":[]},"item":{"type":"object","properties":{"table_name":{"description":"Name of the table to create (will be prefixed with the project catalog and must not match a managed table family)","title":"Table Name","type":"string"},"columns":{"description":"List of column definitions for the table","items":{"$ref":"#/$defs/ColumnDefinition"},"title":"Columns","type":"array"},"ttl_hours":{"anyOf":[{"type":"number"},{"type":"null"}],"default":null,"description":"Optional time-to-live in hours. If set, the table will be automatically deleted after this duration.","title":"Ttl Hours"}},"required":["table_name","columns"],"$defs":{"ColumnDefinition":{"description":"Definition of a column in the table.","properties":{"name":{"description":"Name of the column","title":"Name","type":"string"},"type":{"description":"BigQuery column type","enum":["STRING","BYTES","INTEGER","INT64","FLOAT","FLOAT64","NUMERIC","BIGNUMERIC","BOOLEAN","BOOL","TIMESTAMP","DATE","TIME","DATETIME","GEOGRAPHY","RECORD","STRUCT","JSON"],"title":"Type","type":"string"},"mode":{"default":"NULLABLE","description":"Column mode","enum":["NULLABLE","REQUIRED","REPEATED"],"title":"Mode","type":"string"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Optional description of the column","title":"Description"},"fields":{"anyOf":[{"items":{"$ref":"#/$defs/ColumnDefinition"},"type":"array"},{"type":"null"}],"default":null,"description":"Nested fields for RECORD type columns","title":"Fields"}},"required":["name","type"],"title":"ColumnDefinition","type":"object"}}},"response":{"properties":{"table_name":{"description":"Name of the created table","title":"Table Name","type":"string"},"created":{"description":"Whether the table was created","title":"Created","type":"boolean"},"message":{"description":"Status message","title":"Message","type":"string"}},"required":["table_name","created","message"],"title":"TablesCreateProcessedItem","type":"object"},"has_canvas":false,"open_canvas_automatically":false},{"id":"tables_insert","name":"Tables Insert","alias":"TablesInsert","aliases":[],"description_short":"Agent that inserts data into a BigQuery table in the customer's editable catalog dataset","description_long":"Insert rows into a table in the project's editable catalog.\n    Only tables created manually by project members can be modified.\n    The table name is specified in the config, and each item contains a single row.\n    Use batch mode to insert multiple rows efficiently.\n    ","description_tool_prompt":"Insert rows into a table in the project's editable catalog.\n    Only tables created manually by project members can be modified.\n    The table name is specified in the config, and each item contains a single row.\n    Use batch mode to insert multiple rows efficiently.\n    ","source":null,"conversation_examples":[],"tags":[],"available_in_chat":false,"available_in_deepthink":false,"available_in_mcp":true,"mcp_audience":"all","config":{"type":"object","properties":{"table_name":{"description":"Name of the table to insert data into (must be in the editable catalog)","title":"Table Name","type":"string"}},"required":["table_name"]},"item":{"type":"object","properties":{"row":{"additionalProperties":true,"description":"A single row to insert as a dictionary","title":"Row","type":"object"}},"required":["row"]},"response":{"properties":{"table_name":{"description":"Name of the table","title":"Table Name","type":"string"},"rows_inserted":{"description":"Number of rows inserted","title":"Rows Inserted","type":"integer"},"errors":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"description":"Any errors that occurred during insertion","title":"Errors"}},"required":["table_name","rows_inserted","errors"],"title":"TablesInsertProcessedItem","type":"object"},"has_canvas":false,"open_canvas_automatically":false},{"id":"tables_list","name":"Tables List","alias":"TablesList","aliases":["tables_list_condensed"],"description_short":"Agent that lists BigQuery table families with condensed values","description_long":"List all tables families with condensed values over the entire datamodel,\n    plus every table of the project's editable catalog.\n\n    text_filters narrows the list to the families matching at least one of its\n    plain-words descriptions, in the same shape.\n    ","description_tool_prompt":"List all tables families with condensed values over the entire datamodel.\n\nCrawl families are listed twice: once for SiteCrawler crawls (e.g. crawl_pages_*) and once for AlertPanel crawls (e.g. alert_panel_crawl_pages_*).\n\nTables of the project's editable catalog (created by tables_create, tables_query or tables_load) are listed individually, without extract values.\n\nSet text_filters to only get the table families matching at least one plain-words description, e.g. \"logs tables in 2026\" or \"latest crawl of 2026\"; a family comes back with all its extract values.\n\nCrawl tables exist in two flavours: SiteCrawler (catalog.crawl_pages_<crawl>) and AlertPanel (catalog.alert_panel_crawl_pages_<crawl>). AlertPanel crawls only cover a small subset of URLs, so use the SiteCrawler table by default - including when picking the most recent crawl - and only use an alert_panel_ table when AlertPanel data is explicitly requested.\n\nA table growing without bound over time (Search Console, analytics reports, served pages...) comes with a `time_filter`: the column, its type, an example and, when known, the first and last days with data in the project (`date_start`, `date_end`). tables_query rejects a query reading such a table unless a comparison on that column bounds it in the WHERE clause of the SELECT reading it (a filter on a CTE or subquery wrapping the table does not count).","source":null,"conversation_examples":[],"tags":[],"available_in_chat":true,"available_in_deepthink":true,"available_in_mcp":true,"mcp_audience":"all","config":{"type":"object","properties":{},"required":[]},"item":{"type":"object","properties":{"text_filters":{"default":[],"description":"Tables to keep, described in plain words, e.g. \"logs tables in 2026\", \"latest crawl of 2026\" or \"Google Search Console table\". A table family is returned, with all its extract values, when it matches at least one of them. Leave empty to list every table.","examples":[["logs tables in 2026","Google Search Console table"]],"items":{"minLength":1,"type":"string"},"maxItems":20,"title":"Text Filters","type":"array"}},"required":[]},"response":{"$defs":{"CondensedTableFamily":{"properties":{"condensed_value":{"title":"Condensed Value","type":"string"},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Source"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"extract_values":{"items":{"anyOf":[{"type":"string"},{"type":"null"}]},"title":"Extract Values","type":"array"},"time_filter":{"anyOf":[{"$ref":"#/$defs/TimeFilter"},{"type":"null"}],"default":null,"description":"Set when the table grows without bound over time: a query reading it must filter on this column, or it is rejected. Absent otherwise."},"retention_floor":{"anyOf":[{"$ref":"#/$defs/RetentionFloor"},{"type":"null"}],"default":null,"description":"Set when this table only serves part of its history: data before this date is no longer served, here or anywhere else in Botify, and a query asking for it comes back empty. Absent when the whole table is served."}},"required":["condensed_value","description","extract_values"],"title":"CondensedTableFamily","type":"object"},"RetentionFloor":{"description":"Oldest data a table serves, the same as everywhere else in Botify.","properties":{"column":{"description":"Column the floor applies to","title":"Column","type":"string"},"date":{"description":"Oldest date served: data before it is no longer served","format":"date","title":"Date","type":"string"}},"required":["column","date"],"title":"RetentionFloor","type":"object"},"TimeFilter":{"description":"Column a query must filter on to read a table that grows without bound over time.","properties":{"column":{"description":"Column to filter on in the WHERE clause of the SELECT reading the table, or the query is rejected","title":"Column","type":"string"},"type":{"description":"BigQuery type of the column","title":"Type","type":"string"},"example":{"description":"Example of such a filter","title":"Example","type":"string"},"date_start":{"anyOf":[{"format":"date","type":"string"},{"type":"null"}],"default":null,"description":"First day with data in the project. Absent when unknown.","title":"Date Start"},"date_end":{"anyOf":[{"format":"date","type":"string"},{"type":"null"}],"default":null,"description":"Last day with data in the project. Absent when unknown.","title":"Date End"}},"required":["column","type","example"],"title":"TimeFilter","type":"object"}},"properties":{"families":{"description":"List of table families with condensed values and their extracted values","items":{"$ref":"#/$defs/CondensedTableFamily"},"title":"Families","type":"array"}},"required":["families"],"title":"TablesListProcessedItem","type":"object"},"has_canvas":false,"open_canvas_automatically":false},{"id":"tables_load","name":"Tables Load","alias":"TablesLoad","aliases":[],"description_short":"Load a CSV or TSV file into the current project's editable BigQuery catalog","description_long":"Load a CSV or TSV file into the project's editable BigQuery catalog.\n\n    The file can be provided by a public HTTP(S) URL or Base64 content.\n    The first line is skipped as a header unless has_header is false.\n    For a local file, upload it at https://app.botify.com/:organization/:project/o/storage/tmp and pass the returned URL as source_url.\n    A temporary upload may hold up to 5 GiB once decompressed; other URLs and Base64 content are limited to 15 MB.\n\n    CSV/TSV files may be gzip compressed.\n    The operation fails when the destination table exists unless replace_existing is explicitly enabled.\n    ","description_tool_prompt":"Load a CSV or TSV file into the project's editable BigQuery catalog.\n\n    The file can be provided by a public HTTP(S) URL or Base64 content.\n    The first line is skipped as a header unless has_header is false.\n    For a local file, upload it at https://app.botify.com/:organization/:project/o/storage/tmp and pass the returned URL as source_url.\n    A temporary upload may hold up to 5 GiB once decompressed; other URLs and Base64 content are limited to 15 MB.\n\n    CSV/TSV files may be gzip compressed.\n    The operation fails when the destination table exists unless replace_existing is explicitly enabled.\n    ","source":null,"conversation_examples":[],"tags":[],"available_in_chat":false,"available_in_deepthink":false,"available_in_mcp":true,"mcp_audience":"all","config":{"type":"object","properties":{},"required":[]},"item":{"type":"object","properties":{"table_name":{"description":"Destination table name in the editable catalog; must not match a managed table family","pattern":"^[A-Za-z_][A-Za-z0-9_]{0,1023}$","title":"Table Name","type":"string"},"table_description":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Optional BigQuery table description","title":"Table Description"},"source_url":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"HTTP(S) URL of the source file. Temporary uploaded URLs on https://app.botify.com/:organization/:project/o/storage/tmp are allowed.","title":"Source Url"},"content_base64":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Base64-encoded file content. Prefer source_url for large files.","title":"Content Base64"},"format":{"$ref":"#/$defs/DelimitedFormat","default":"auto","description":"Delimited input format, or auto-detect from the filename"},"columns":{"anyOf":[{"items":{"$ref":"#/$defs/ColumnDefinition"},"type":"array"},{"type":"null"}],"default":null,"description":"Optional explicit BigQuery schema. When omitted, BigQuery infers the schema from the file header and rows.","title":"Columns"},"replace_existing":{"default":false,"description":"Replace an existing table. Disabled by default to prevent unintentional data loss.","title":"Replace Existing","type":"boolean"},"has_header":{"default":true,"description":"Whether the first line is a header, skipped when loading. Set it to false to load every line as a row, so that a file with no header keeps its first row.","title":"Has Header","type":"boolean"}},"required":["table_name"],"$defs":{"ColumnDefinition":{"description":"Definition of a column in the table.","properties":{"name":{"description":"Name of the column","title":"Name","type":"string"},"type":{"description":"BigQuery column type","enum":["STRING","BYTES","INTEGER","INT64","FLOAT","FLOAT64","NUMERIC","BIGNUMERIC","BOOLEAN","BOOL","TIMESTAMP","DATE","TIME","DATETIME","GEOGRAPHY","RECORD","STRUCT","JSON"],"title":"Type","type":"string"},"mode":{"default":"NULLABLE","description":"Column mode","enum":["NULLABLE","REQUIRED","REPEATED"],"title":"Mode","type":"string"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Optional description of the column","title":"Description"},"fields":{"anyOf":[{"items":{"$ref":"#/$defs/ColumnDefinition"},"type":"array"},{"type":"null"}],"default":null,"description":"Nested fields for RECORD type columns","title":"Fields"}},"required":["name","type"],"title":"ColumnDefinition","type":"object"},"DelimitedFormat":{"enum":["auto","csv","tsv"],"type":"string"}}},"response":{"properties":{"table_name":{"description":"Created or loaded table name","title":"Table Name","type":"string"},"rows_loaded":{"description":"Number of rows loaded","title":"Rows Loaded","type":"integer"},"format":{"description":"Detected file format","title":"Format","type":"string"},"replaced_existing":{"description":"Whether an existing table was replaced","title":"Replaced Existing","type":"boolean"}},"required":["table_name","rows_loaded","format","replaced_existing"],"title":"TablesLoadProcessedItem","type":"object"},"has_canvas":false,"open_canvas_automatically":false},{"id":"tables_query","name":"Tables Query","alias":"TablesQuery","aliases":[],"description_short":"Query any table in the data model with BigQuery Standard SQL syntax. Always prefix tables with \"catalog.\" (ex: catalog.crawl_pages_20251201).","description_long":"Query any data-model table with\n    BigQuery Standard SQL syntax. Always prefix tables with \"catalog.\" (for example,\n    catalog.crawl_pages_20251201).\n\n    The following query-string functions are supported:\n    - query_string_keys(input): returns ARRAY<STRING> with query-string keys.\n    - query_string_params(input): returns\n      ARRAY<STRUCT<key STRING, value STRING>> with query-string key/value pairs.\n    - remove_query_string(url, keys): removes URL query-string parameters whose keys\n      are in an ARRAY<STRING>. It removes the \"?\" when no parameter remains.\n\n    The parsing functions accept a raw query string with or without a leading \"?\",\n    or a complete URL. They preserve parameter order and duplicate keys, ignore\n    empty keys, and do not URL-decode values. remove_query_string accepts a complete URL.\n    For example:\n    SELECT query_string_params(url) FROM catalog.crawl_pages_20251201\n    SELECT remove_query_string(url, ['bar']) FROM catalog.crawl_pages_20251201\n\n    The logs crawls and visits tables (catalog.logs_google_crawls) have a\n    virtual `url` column, resolved from `url_hash` after the query runs. It can\n    only be selected, grouped by or counted: to filter, join, sort or transform\n    URLs, join catalog.logs_urls on url_hash.\n    ","description_tool_prompt":"Query any table in the data model with BigQuery Standard SQL syntax.\nAlways prefix tables with \"catalog.\" (ex: catalog.crawl_pages_20251201).\n\nCrawl tables exist in two flavours: SiteCrawler (catalog.crawl_pages_<crawl>) and AlertPanel (catalog.alert_panel_crawl_pages_<crawl>). AlertPanel crawls only cover a small subset of URLs, so use the SiteCrawler table by default - including when picking the most recent crawl - and only use an alert_panel_ table when AlertPanel data is explicitly requested.\n\nA table growing without bound over time (Search Console, analytics reports, served pages...) comes with a `time_filter`: the column, its type, an example and, when known, the first and last days with data in the project (`date_start`, `date_end`). tables_query rejects a query reading such a table unless a comparison on that column bounds it in the WHERE clause of the SELECT reading it (a filter on a CTE or subquery wrapping the table does not count).\n\nSupported query-string functions:\n- query_string_keys(input): returns ARRAY<STRING> with query-string keys.\n- query_string_params(input): returns ARRAY<STRUCT<key STRING, value STRING>> with query-string key/value pairs.\n- remove_query_string(url, keys): removes parameters whose key is included in an ARRAY<STRING> from a complete URL, and removes '?' when none remain.\n\nLogs crawls and visits tables (logs_<engine>_crawls, logs_<engine>_visits) have a virtual `url` column, resolved from url_hash after the query runs. Select it instead of joining logs_urls when you only need to show URLs. It can only be selected, grouped by or counted, not filtered, joined, sorted or passed to a function: for those, join catalog.logs_urls on url_hash.\n\nWrites: this tool can also run statements that modify data (CREATE, DROP, INSERT, UPDATE, DELETE), but only on tables the user created. Tables managed by Botify (crawl, logs, Search Console, ...) are read-only and can never be modified or dropped. Only modify or drop a table when the user asks for it.","source":null,"conversation_examples":[],"tags":[],"available_in_chat":true,"available_in_deepthink":true,"available_in_mcp":true,"mcp_audience":"all","config":{"type":"object","properties":{"bigquery_billing":{"default":"auto","description":"Who pays BigQuery for the query. 'botify': Botify runs it, and the data it scans is charged in credits. 'organization': it runs in your organization's own GCP project, configured by Botify, which Google bills directly; a flat fee per query is charged in credits instead of the scan. 'auto': your organization's project when one is configured, else Botify.","enum":["auto","botify","organization"],"title":"Bigquery Billing","type":"string"}},"required":[]},"item":{"type":"object","properties":{"query":{"description":"BigQuery SQL query to execute","title":"Query","type":"string"},"max_results":{"default":10000,"description":"Maximum number of results to return","maximum":10000,"minimum":1,"title":"Max Results","type":"integer"}},"required":["query"]},"response":{"properties":{"fields":{"description":"Field definitions with name and type","items":{"additionalProperties":{"type":"string"},"type":"object"},"title":"Fields","type":"array"},"results":{"description":"Query execution results as list of lists","items":{"additionalProperties":true,"type":"object"},"title":"Results","type":"array"}},"required":["fields","results"],"title":"TablesQueryProcessedItem","type":"object"},"has_canvas":false,"open_canvas_automatically":false},{"id":"tables_query_export","name":"Tables Query Export","alias":"TablesQueryExport","aliases":[],"description_short":"Export BigQuery query results to CSV or Parquet and upload to GCS for download","description_long":"Export query results to a CSV file, or to Parquet (gz or zstd).\n    The query must be a single read-only statement: use tables_query to create\n    or remove catalog tables.\n    Always prefix tables with \"catalog.\" (ex: catalog.crawl_pages_20251201).\n    Give the user web_url. It works for users logged in to Botify with access to\n    the project. To fetch the file from a program, use temporary_url. It needs no\n    login and expires 15 minutes after the export.\n    The agent answers once BigQuery has written the file. A large export takes minutes: call the agent with async_process and poll the batch. The rows come in no set order: an ORDER BY in the query is not kept.\n    ","description_tool_prompt":"Export query results to a CSV file, or to Parquet (gz or zstd). Give the user web_url. It works for users logged in to Botify with access to the project. To fetch the file from a program, use temporary_url. It needs no login and expires 15 minutes after the export.\nThe agent answers once BigQuery has written the file. A large export takes minutes: call the agent with async_process and poll the batch. The rows come in no set order: an ORDER BY in the query is not kept.\nThe query must be a single read-only statement: use tables_query to create or remove catalog tables.\nAlways prefix tables with \"catalog.\" (ex: catalog.crawl_pages_20251201).\n\nCrawl tables exist in two flavours: SiteCrawler (catalog.crawl_pages_<crawl>) and AlertPanel (catalog.alert_panel_crawl_pages_<crawl>). AlertPanel crawls only cover a small subset of URLs, so use the SiteCrawler table by default - including when picking the most recent crawl - and only use an alert_panel_ table when AlertPanel data is explicitly requested.","source":null,"conversation_examples":[],"tags":[],"available_in_chat":false,"available_in_deepthink":false,"available_in_mcp":true,"mcp_audience":"all","config":{"type":"object","properties":{"bigquery_billing":{"default":"auto","description":"Who pays BigQuery for the query. 'botify': Botify runs it, and the data it scans is charged in credits. 'organization': it runs in your organization's own GCP project, configured by Botify, which Google bills directly; a flat fee per query is charged in credits instead of the scan. 'auto': your organization's project when one is configured, else Botify.","enum":["auto","botify","organization"],"title":"Bigquery Billing","type":"string"}},"required":[]},"item":{"type":"object","properties":{"query":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"BigQuery SQL query to execute (a single SELECT statement). Omit it to report the export that export_id names, or to get a fresh link to it.","title":"Query"},"format":{"default":"csv","description":"Export format: csv or parquet. A csv export is one file. Above 1 GB, a parquet export is several files.","enum":["csv","parquet"],"title":"Format","type":"string"},"compression":{"default":"gz","description":"csv: none, the only choice: a csv export is one plain text file. parquet: gz (the default), zstd or none.","enum":["gz","zstd","none"],"title":"Compression","type":"string"},"max_rows":{"anyOf":[{"minimum":1,"type":"integer"},{"type":"null"}],"default":null,"description":"Maximum number of rows to export (no limit if null)","title":"Max Rows"},"export_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"The same id gives the same job and file, so a repeated request finds the running export. When null: derived from the request and the day if export_name is given, a new id otherwise.","title":"Export Id"},"query_parameters":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"default":null,"description":"Values of the query's @name parameters, in the BigQuery REST format. The values stay parameters: they are never written into the SQL.","title":"Query Parameters"},"label_columns_of":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Catalog table, without the catalog. prefix, whose label columns the file gets: each label column whose source column is in the query result follows that column. Example: ai_visibility_results adds campaign_names after campaign_ids.","title":"Label Columns Of"},"column_labels":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"default":null,"description":"csv only: header of a result column, by column name. Only the header changes: the query keeps its column names, so a label can hold any character.","title":"Column Labels"},"export_name":{"anyOf":[{"pattern":"^[a-z][A-Za-z0-9_-]{0,99}$","type":"string"},{"type":"null"}],"default":null,"description":"Names a reusable export: the same request with the same export_name on the same day gets the same job and file back, and runs no new query. Without it, every call writes a new file. Also starts the export_id and the file name: a lowercase letter, then letters, digits, '_' or '-'.","title":"Export Name"},"file_name":{"anyOf":[{"pattern":"^[A-Za-z0-9][A-Za-z0-9._-]{0,199}$","type":"string"},{"type":"null"}],"default":null,"description":"Name a browser saves the file under when it opens temporary_url. Without it, the browser takes the name from the URL. Applies to an export in one file only.","title":"File Name"},"restart_failed":{"default":true,"description":"Start the export again when its last job failed. With false, the agent reports the failure.","title":"Restart Failed","type":"boolean"}},"required":[]},"response":{"properties":{"export_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Pass it back as export_id, with no query, to get a fresh link to this export on any later day too.","title":"Export Id"},"download_url":{"description":"Original storage URL for the file","title":"Download Url","type":"string"},"web_url":{"description":"Download URL served by the Botify API. Open it in a browser while logged in to Botify with access to the project.","title":"Web Url","type":"string"},"temporary_url":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Download URL that needs no login, for a program that fetches the file. It expires 15 minutes after the export. Null when the URL could not be signed.","title":"Temporary Url"},"format":{"description":"Export format used","title":"Format","type":"string"},"compression":{"description":"Compression type used","title":"Compression","type":"string"},"row_count":{"description":"Number of rows exported","title":"Row Count","type":"integer"},"file_count":{"default":1,"description":"Number of files. Above 1 GB, a parquet export is several files: web_url and temporary_url name the first, web_urls and temporary_urls all of them.","title":"File Count","type":"integer"},"web_urls":{"default":[],"description":"web_url of every file, in order","items":{"type":"string"},"title":"Web Urls","type":"array"},"temporary_urls":{"default":[],"description":"temporary_url of every file, in order","items":{"anyOf":[{"type":"string"},{"type":"null"}]},"title":"Temporary Urls","type":"array"}},"required":["download_url","web_url","format","compression","row_count"],"title":"TablesQueryExportProcessedItem","type":"object"},"has_canvas":false,"open_canvas_automatically":false},{"id":"tables_schema","name":"Tables Schema","alias":"TablesSchema","aliases":[],"description_short":"Agent that retrieves the schema (field names and types) for a given table","description_long":"List all fields from a given table, including enum values when known.","description_tool_prompt":"List all fields (names, types, and enum values when known) from a given table. When a field has `enum`, use those values in filters. If `bitmask` is true, test nonzero flags with `column & value != 0` (values are combinable); for a zero/no-flags value, use `column = 0`. When a `*_name` / `*Name` column follows an id column (e.g. `bot_name` for `bot_id`), use it to display or group by names instead of writing CASE mappings. A field name containing `{a|b|...}` groups is a compact notation for several columns sharing the same type and mode: expand every group (cartesian product) to get the real column names, e.g. `x__{a|b}__{c|d}` stands for `x__a__c`, `x__a__d`, `x__b__c` and `x__b__d`. Use the expanded names in SQL, never the braces. A table growing without bound over time (Search Console, analytics reports, served pages...) comes with a `time_filter`: the column, its type, an example and, when known, the first and last days with data in the project (`date_start`, `date_end`). tables_query rejects a query reading such a table unless a comparison on that column bounds it in the WHERE clause of the SELECT reading it (a filter on a CTE or subquery wrapping the table does not count).","source":null,"conversation_examples":[],"tags":[],"available_in_chat":true,"available_in_deepthink":true,"available_in_mcp":true,"mcp_audience":"all","config":{"type":"object","properties":{},"required":[]},"item":{"type":"object","properties":{"table_name":{"description":"Name of the table to get schema for. Wildcard not allowed.","title":"Table Name","type":"string"}},"required":["table_name"]},"response":{"$defs":{"RetentionFloor":{"description":"Oldest data a table serves, the same as everywhere else in Botify.","properties":{"column":{"description":"Column the floor applies to","title":"Column","type":"string"},"date":{"description":"Oldest date served: data before it is no longer served","format":"date","title":"Date","type":"string"}},"required":["column","date"],"title":"RetentionFloor","type":"object"},"TableField":{"properties":{"name":{"title":"Name","type":"string"},"type":{"title":"Type","type":"string"},"mode":{"default":"nullable","description":"`repeated` or `required`; omitted when `nullable` (the default)","title":"Mode","type":"string"},"fields":{"anyOf":[{"items":{"$ref":"#/$defs/TableField"},"type":"array"},{"type":"null"}],"default":null,"title":"Fields"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Optional documentation for this field","title":"Description"},"enum":{"anyOf":[{"items":{"$ref":"#/$defs/TableFieldEnumValue"},"type":"array"},{"type":"null"}],"default":null,"description":"Known discrete values for this field. Each entry has value, name, and optional extra; for name columns, entries only carry value. Absent when the field is not an enum.","title":"Enum"},"bitmask":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"description":"If true, enum values are combinable flags. Test a nonzero flag with `column & value != 0`; for a zero/no-flags value, use `column = 0`.","title":"Bitmask"}},"required":["name","type"],"title":"TableField","type":"object"},"TableFieldEnumValue":{"description":"One known discrete value of a table field (regular enum or bitmask flag).","properties":{"value":{"anyOf":[{"type":"integer"},{"type":"string"}],"title":"Value"},"name":{"title":"Name","type":"string"},"extra":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Extra"}},"required":["value","name"],"title":"TableFieldEnumValue","type":"object"},"TimeFilter":{"description":"Column a query must filter on to read a table that grows without bound over time.","properties":{"column":{"description":"Column to filter on in the WHERE clause of the SELECT reading the table, or the query is rejected","title":"Column","type":"string"},"type":{"description":"BigQuery type of the column","title":"Type","type":"string"},"example":{"description":"Example of such a filter","title":"Example","type":"string"},"date_start":{"anyOf":[{"format":"date","type":"string"},{"type":"null"}],"default":null,"description":"First day with data in the project. Absent when unknown.","title":"Date Start"},"date_end":{"anyOf":[{"format":"date","type":"string"},{"type":"null"}],"default":null,"description":"Last day with data in the project. Absent when unknown.","title":"Date End"}},"required":["column","type","example"],"title":"TimeFilter","type":"object"}},"properties":{"table_name":{"description":"Name of the table","title":"Table Name","type":"string"},"fields":{"description":"List of field definitions with name, type, and enum values when known. A field name containing `{a|b|...}` groups is a compact notation for several columns sharing the same type and mode: expand every group (cartesian product) to get the real column names, e.g. `x__{a|b}__{c|d}` stands for `x__a__c`, `x__a__d`, `x__b__c` and `x__b__d`. Use the expanded names in SQL, never the braces.","items":{"$ref":"#/$defs/TableField"},"title":"Fields","type":"array"},"found":{"description":"Whether the table was found in the available tables","title":"Found","type":"boolean"},"time_filter":{"anyOf":[{"$ref":"#/$defs/TimeFilter"},{"type":"null"}],"default":null,"description":"Set when the table grows without bound over time: a query reading it must filter on this column, or it is rejected. Absent otherwise."},"retention_floor":{"anyOf":[{"$ref":"#/$defs/RetentionFloor"},{"type":"null"}],"default":null,"description":"Set when this table only serves part of its history: data before this date is no longer served, here or anywhere else in Botify, and a query asking for it comes back empty. Absent when the whole table is served."}},"required":["table_name","fields","found"],"title":"TablesSchemaProcessedItem","type":"object"},"has_canvas":false,"open_canvas_automatically":false},{"id":"tables_text_to_sql","name":"Tables Text To Sql","alias":"TablesTextToSql","aliases":[],"description_short":"Convert natural language to SQL queries","description_long":"\n    This agent converts natural language descriptions into BigQuery SQL query.\n\n    You can optionally execute the generated query and get results directly.\n    ","description_tool_prompt":"\n    This agent converts natural language descriptions into BigQuery SQL query.\n\n    You can optionally execute the generated query and get results directly.\n    ","source":null,"conversation_examples":[],"tags":[],"available_in_chat":false,"available_in_deepthink":false,"available_in_mcp":null,"mcp_audience":"all","config":{"type":"object","properties":{"reasoning_effort":{"default":"low","description":"Thinking level for the LLM: 'low' for simple queries, 'high' for complex ones","enum":["low","high"],"title":"Reasoning Effort","type":"string"},"service_tier":{"$ref":"#/$defs/ServiceTier","default":"standard","description":"LLM service tier: 'standard', 'flex' (cheaper but slower, falls back to standard when unavailable) or 'fast' (quicker, costs more)."},"run_query":{"default":true,"description":"If true, execute the generated query and return results. If false, only return the generated SQL.","title":"Run Query","type":"boolean"},"sample_size":{"anyOf":[{"maximum":10000,"minimum":1,"type":"integer"},{"type":"null"}],"default":null,"description":"Number of rows to return in `results` when the query is run. Unlike max_rows, the SQL is left untouched: only the returned sample is capped.","title":"Sample Size"},"include_total_count":{"default":false,"description":"If true, also return in `total_count` the number of rows the query yields when run in full, whatever the sample size. Works with run_query=false too. This runs a count query, which scans the data again when the query itself is run, unless its LIMIT is small enough for the returned rows to be all of them.","title":"Include Total Count","type":"boolean"},"allow_empty_results":{"default":true,"description":"If true, a query returning zero rows is a valid answer. Set it to false in workflows, so the node fails (and retries) instead of passing empty data to the downstream nodes.","title":"Allow Empty Results","type":"boolean"}},"required":[],"$defs":{"ServiceTier":{"enum":["standard","flex","fast"],"type":"string"}}},"item":{"type":"object","properties":{"text_query":{"description":"Natural language description of the data you want to query. Avoid writing SQL syntax.","title":"Text Query","type":"string"},"max_rows":{"anyOf":[{"minimum":1,"type":"integer"},{"type":"null"}],"default":null,"description":"Maximum number of rows to return. Enforces a LIMIT in the SQL and caps results at the API level.","title":"Max Rows"},"output_fields":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"default":null,"description":"Optional. Restrict the query output to exactly these column names and no others. Keeps downstream steps stable while the agent stays agnostic. Other columns may still be used in WHERE/ORDER BY/GROUP BY.","title":"Output Fields"}},"required":["text_query"]},"response":{"properties":{"query":{"description":"The generated BigQuery SQL query","title":"Query","type":"string"},"rationale":{"default":"","description":"Short explanation of how the tables, fields and conditions were chosen","title":"Rationale","type":"string"},"fields":{"description":"Field definitions with name and type (empty if run_query=false)","items":{"additionalProperties":{"type":"string"},"type":"object"},"title":"Fields","type":"array"},"results":{"description":"Query execution results (empty if run_query=false)","items":{"additionalProperties":true,"type":"object"},"title":"Results","type":"array"},"total_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"Number of rows the full query yields (only if include_total_count=true)","title":"Total Count"}},"required":["query","fields","results"],"title":"TablesTextToSqlProcessedItem","type":"object"},"has_canvas":false,"open_canvas_automatically":false},{"id":"template_generator","name":"PageWorkers Template Generator","alias":"TemplateGenerator","aliases":[],"description_short":"Generate a template based on HTML structure and available variables.","description_long":"Generate a template based on HTML structure and available variables.","description_tool_prompt":"Generate a template based on HTML structure and available variables.","source":null,"conversation_examples":[],"tags":[],"available_in_chat":false,"available_in_deepthink":false,"available_in_mcp":null,"mcp_audience":"all","config":{"type":"object","properties":{},"required":[]},"item":{"type":"object","properties":{"url":{"description":"An example URL of the page to generate the template for.","title":"Example URL","type":"string"},"template_engine":{"default":"nunjucks","description":"Template engine to target (nunjucks or liquid)","enum":["nunjucks","liquid"],"title":"Template Engine","type":"string"},"element_type":{"default":"customHtml","description":"Type of element for which to generate the template. Can be one of: title, description, h1, canonical or customHtml.","enum":["title","description","h1","canonical","customHtml"],"title":"Element type","type":"string"},"variables_description":{"description":"Describe the available variables and their structure.","format":"textarea","title":"Variables Description","type":"string"},"template_requirements":{"description":"Describe what you want to generate in the template.","format":"textarea","title":"Template Requirements","type":"string"}},"required":["url","variables_description","template_requirements"]},"response":{"properties":{"template":{"description":"The template code","title":"Template","type":"string"},"explanation":{"description":"A brief explanation of the template","title":"Explanation","type":"string"}},"required":["template","explanation"],"title":"TemplateGeneratorProcessedItem","type":"object"},"has_canvas":false,"open_canvas_automatically":false},{"id":"tmp_storage_grep","name":"Temporary Storage Grep","alias":"TmpStorageGrep","aliases":[],"description_short":"Search expressions in a temporary upload, line by line.","description_long":"\n    Search one or more expressions in a file stored in the project's temporary\n    upload storage. Works on HTML, JSON, JSONL, CSV, and plain text, including\n    gzip-compressed uploads.\n\n    Each match comes back with its line number and a short slice of the line\n    around it. Expressions are literal substrings by default, or RE2 regular\n    expressions. Matches do not span lines. Output is capped, so prefer a few\n    specific queries over broad ones.\n    ","description_tool_prompt":"\n    Search one or more expressions in a file stored in the project's temporary\n    upload storage. Works on HTML, JSON, JSONL, CSV, and plain text, including\n    gzip-compressed uploads.\n\n    Each match comes back with its line number and a short slice of the line\n    around it. Expressions are literal substrings by default, or RE2 regular\n    expressions. Matches do not span lines. Output is capped, so prefer a few\n    specific queries over broad ones.\n    ","source":"Temporary project storage","conversation_examples":["Find every occurrence of organic in the temporary SERP upload","Grep the regex \"price\" on the uploaded JSONL file"],"tags":["content"],"available_in_chat":true,"available_in_deepthink":true,"available_in_mcp":true,"mcp_audience":"all","config":{"type":"object","properties":{"queries":{"description":"Search queries to run against the file. Each query is processed independently. Matches never span lines.","items":{"$ref":"#/$defs/TmpStorageGrepQuery"},"maxItems":20,"minItems":1,"title":"Queries","type":"array"}},"required":["queries"],"$defs":{"TmpStorageGrepQuery":{"properties":{"expression":{"description":"Expression to search for. Interpreted as a literal substring unless `is_regex` is True.","maxLength":1000,"minLength":1,"title":"Expression","type":"string"},"n_chars":{"default":100,"description":"Number of characters of context to keep on each side of the match (at most 500), clipped to the matching line.","maximum":500,"minimum":0,"title":"N Chars","type":"integer"},"is_regex":{"default":false,"description":"If True, `expression` is a RE2 regular expression (no lookaround, no backreferences). Otherwise it is a literal substring.","title":"Is Regex","type":"boolean"},"case_sensitive":{"default":true,"description":"If True, the search is case-sensitive.","title":"Case Sensitive","type":"boolean"},"max_matches":{"default":10,"description":"Maximum number of matches returned for this query. The file is always scanned to the end, so `total_matches` counts matches past this limit.","maximum":1000,"minimum":1,"title":"Max Matches","type":"integer"}},"required":["expression"],"title":"TmpStorageGrepQuery","type":"object"}}},"item":{"type":"object","properties":{"url":{"description":"Temporary upload to search. Temporary uploaded URLs on https://app.botify.com/:organization/:project/o/storage/tmp are allowed.","title":"Url","type":"string"}},"required":["url"]},"response":{"$defs":{"TmpStorageGrepMatch":{"properties":{"match":{"description":"The exact substring that matched, cut to its first 1000 characters","title":"Match","type":"string"},"match_truncated":{"default":false,"description":"True if the match was longer than 1000","title":"Match Truncated","type":"boolean"},"line_number":{"description":"1-based line number of the match","minimum":1,"title":"Line Number","type":"integer"},"column":{"description":"0-based character offset of the match within the line","minimum":0,"title":"Column","type":"integer"},"context":{"description":"The match with up to `n_chars` characters on each side, clipped to the line","title":"Context","type":"string"}},"required":["match","line_number","column","context"],"title":"TmpStorageGrepMatch","type":"object"},"TmpStorageGrepQuery":{"properties":{"expression":{"description":"Expression to search for. Interpreted as a literal substring unless `is_regex` is True.","maxLength":1000,"minLength":1,"title":"Expression","type":"string"},"n_chars":{"default":100,"description":"Number of characters of context to keep on each side of the match (at most 500), clipped to the matching line.","maximum":500,"minimum":0,"title":"N Chars","type":"integer"},"is_regex":{"default":false,"description":"If True, `expression` is a RE2 regular expression (no lookaround, no backreferences). Otherwise it is a literal substring.","title":"Is Regex","type":"boolean"},"case_sensitive":{"default":true,"description":"If True, the search is case-sensitive.","title":"Case Sensitive","type":"boolean"},"max_matches":{"default":10,"description":"Maximum number of matches returned for this query. The file is always scanned to the end, so `total_matches` counts matches past this limit.","maximum":1000,"minimum":1,"title":"Max Matches","type":"integer"}},"required":["expression"],"title":"TmpStorageGrepQuery","type":"object"},"TmpStorageGrepQueryResult":{"properties":{"query":{"$ref":"#/$defs/TmpStorageGrepQuery","description":"The query this result corresponds to (echoed back)"},"matches":{"default":[],"description":"Matches found for this query, up to `max_matches`","items":{"$ref":"#/$defs/TmpStorageGrepMatch"},"title":"Matches","type":"array"},"total_matches":{"default":0,"description":"Total number of matches in the file for this query (may be greater than `len(matches)` when truncated).","title":"Total Matches","type":"integer"},"truncated":{"default":false,"description":"True if results were truncated by `max_matches` or by the 1000000 character cap shared by all queries.","title":"Truncated","type":"boolean"}},"required":["query"],"title":"TmpStorageGrepQueryResult","type":"object"}},"properties":{"size_bytes":{"default":0,"description":"Size of the decompressed file, in bytes","title":"Size Bytes","type":"integer"},"line_count":{"default":0,"description":"Number of lines in the decompressed file","title":"Line Count","type":"integer"},"results":{"default":[],"description":"One result per input query, in the same order as `queries`.","items":{"$ref":"#/$defs/TmpStorageGrepQueryResult"},"title":"Results","type":"array"}},"title":"TmpStorageGrepProcessedItem","type":"object"},"has_canvas":false,"open_canvas_automatically":false},{"id":"tmp_storage_jq","name":"Temporary Storage jq","alias":"TmpStorageJq","aliases":[],"description_short":"Run a jq expression on a JSON or JSONL temporary upload.","description_long":"\n    Run a jq expression on a file stored in the project's temporary upload\n    storage. The file may be one JSON document or JSONL (one JSON value per\n    line), optionally gzip-compressed.\n\n    Without `slurp`, the expression is applied to each JSON value, like `jq`.\n    With `slurp`, every value is gathered into one array first, like `jq -s`.\n    When the shape is unknown, start with `keys`, or with `.[0:3]` and\n    `slurp` set, before writing a narrower expression.\n    ","description_tool_prompt":"\n    Run a jq expression on a file stored in the project's temporary upload\n    storage. The file may be one JSON document or JSONL (one JSON value per\n    line), optionally gzip-compressed.\n\n    Without `slurp`, the expression is applied to each JSON value, like `jq`.\n    With `slurp`, every value is gathered into one array first, like `jq -s`.\n    When the shape is unknown, start with `keys`, or with `.[0:3]` and\n    `slurp` set, before writing a narrower expression.\n    ","source":"Temporary project storage","conversation_examples":["On the temporary SERP upload, run .items[] | select(.type == \"organic\") | .url","Discover an uploaded JSONL file with keys, or .[0:3] when slurp is true"],"tags":["content"],"available_in_chat":true,"available_in_deepthink":true,"available_in_mcp":true,"mcp_audience":"all","config":{"type":"object","properties":{"expression":{"description":"jq expression. The file may be one JSON document or a stream of JSON values (JSONL); each value is filtered on its own unless `slurp` is true. Start with `keys` to learn the shape of one object, or `.[0:3]` with `slurp` to see the first records of a stream. Module directives (`import`, `include`) and comments (`#`) are not available.","maxLength":10000,"minLength":1,"title":"Expression","type":"string"},"slurp":{"default":false,"description":"If true, every JSON value in the file is gathered into one array before the expression runs, like `jq -s`.","title":"Slurp","type":"boolean"},"max_results":{"default":100,"description":"Maximum number of values to return.","maximum":1000,"minimum":1,"title":"Max Results","type":"integer"}},"required":["expression"]},"item":{"type":"object","properties":{"url":{"description":"Temporary upload to query. Temporary uploaded URLs on https://app.botify.com/:organization/:project/o/storage/tmp are allowed.","title":"Url","type":"string"}},"required":["url"]},"response":{"properties":{"results":{"default":[],"description":"Values produced by the jq expression, up to `max_results`","items":{},"title":"Results","type":"array"},"results_count":{"default":0,"description":"Number of values in `results`","title":"Results Count","type":"integer"},"truncated":{"default":false,"description":"True if output was cut by `max_results` or the size cap","title":"Truncated","type":"boolean"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"jq runtime error, if the expression failed on this file. `results` still holds values produced before the error. An invalid expression is rejected instead of being reported here.","title":"Error"}},"title":"TmpStorageJqProcessedItem","type":"object"},"has_canvas":false,"open_canvas_automatically":false},{"id":"tmp_storage_read","name":"Temporary Storage Read","alias":"TmpStorageRead","aliases":[],"description_short":"Return the full text of a temporary upload.","description_long":"\n    Read a file stored in the project's temporary upload storage and return\n    its whole text. Works on HTML, JSON, JSONL, CSV, and plain text, including\n    gzip-compressed uploads.\n\n    The file is decoded as UTF-8. A file larger than 1 MiB is refused rather\n    than cut short: use tmp_storage_grep or tmp_storage_jq to look inside it.\n    ","description_tool_prompt":"\n    Read a file stored in the project's temporary upload storage and return\n    its whole text. Works on HTML, JSON, JSONL, CSV, and plain text, including\n    gzip-compressed uploads.\n\n    The file is decoded as UTF-8. A file larger than 1 MiB is refused rather\n    than cut short: use tmp_storage_grep or tmp_storage_jq to look inside it.\n    ","source":"Temporary project storage","conversation_examples":["Read the temporary SERP upload in full","Show the whole uploaded HTML file"],"tags":["content"],"available_in_chat":true,"available_in_deepthink":true,"available_in_mcp":true,"mcp_audience":"all","config":{"type":"object","properties":{},"required":[]},"item":{"type":"object","properties":{"url":{"description":"Temporary upload to read. Temporary uploaded URLs on https://app.botify.com/:organization/:project/o/storage/tmp are allowed.","title":"Url","type":"string"}},"required":["url"]},"response":{"properties":{"content":{"default":"","description":"Full text of the decompressed file","title":"Content","type":"string"},"size_bytes":{"default":0,"description":"Size of the decompressed file, in bytes","title":"Size Bytes","type":"integer"}},"title":"TmpStorageReadProcessedItem","type":"object"},"has_canvas":false,"open_canvas_automatically":false},{"id":"tool_documentation","name":"Tool Documentation","alias":"ToolDocumentation","aliases":[],"description_short":"Load extended markdown documentation for a dinosaur tool by id.","description_long":"Return the sidecar documentation.md of another tool. Use this when a tool's short description is not enough (for example the JavaScript DOM API of html_code_executor). Select the tool from the tool_name enum.","description_tool_prompt":"Load extended markdown documentation for another tool by id. Call this when a tool's description says to use tool_documentation for full API details (for example the JavaScript DOM API of html_code_executor). Select the tool from the tool_name enum.","source":null,"conversation_examples":[],"tags":[],"available_in_chat":true,"available_in_deepthink":true,"available_in_mcp":true,"mcp_audience":"all","config":{"type":"object","properties":{},"required":[]},"item":{"type":"object","properties":{"tool_name":{"const":"html_code_executor","description":"Id of the tool to document.","title":"Tool Name","type":"string"}},"required":["tool_name"]},"response":{"description":"Output from the tool_documentation agent.","properties":{"tool_name":{"description":"Resolved tool id (batch suffix stripped).","title":"Tool Name","type":"string"},"documentation":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Extended markdown documentation, if any.","title":"Documentation"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Set when the tool is unknown or has no extended documentation.","title":"Error"}},"required":["tool_name"],"title":"ToolDocumentationProcessedItem","type":"object"},"has_canvas":false,"open_canvas_automatically":false},{"id":"url_keywords","name":"Keywords performance for URL (From Google Search Console)","alias":"URLKeywords","aliases":[],"description_short":"Get GSC keywords for a given URL.","description_long":"\n    Get Google Search Console keyword performance metrics for a specific URL (i.e., clicks, impressions, position).\n    ","description_tool_prompt":"\n    Get Google Search Console keyword performance metrics for a specific URL (i.e., clicks, impressions, position).\n    ","source":"Google Search Console API","conversation_examples":["Show me the keywords performance for https://www.example.org/p/5866-toothbrush","What is the top keyword for https://www.example.org/p/5866-toothbrush in the last 30 days?"],"tags":["keywords","google"],"available_in_chat":true,"available_in_deepthink":true,"available_in_mcp":true,"mcp_audience":"all","config":{"type":"object","properties":{},"required":[]},"item":{"type":"object","properties":{"url":{"description":"The URL to analyze.","title":"Url","type":"string"},"period":{"description":"Time period to analyze.","enum":["last_7d","last_30d","last_90d"],"title":"Time Period","type":"string"}},"required":["url","period"]},"response":{"$defs":{"KeywordPerformance":{"properties":{"keyword":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The keyword.","title":"Keyword"},"clicks":{"description":"Number of clicks.","title":"Clicks","type":"number"},"impressions":{"description":"Number of impressions.","title":"Impressions","type":"number"},"position":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Average position.","title":"Position"},"ctr":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Click-through rate (CTR).","title":"Ctr"},"estimated_revenue":{"description":"Estimated revenue for this keyword.","title":"Estimated Revenue","type":"number"},"predictions":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"description":"Predicted metrics for different devices.","title":"Predictions"},"smart_keyword_in_metadata":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"description":"Whether the keyword is present in the page title or description.","title":"Smart Keyword In Metadata"}},"required":["keyword","clicks","impressions","position","ctr","estimated_revenue","predictions"],"title":"KeywordPerformance","type":"object"},"ProjectMetadataProcessedItem":{"properties":{"values":{"additionalProperties":{"anyOf":[{"type":"string"},{"type":"number"}]},"description":"Retrieved metadata values","propertyNames":{"enum":["brand_name","website_description","internationalization_strategy","tone_of_voice","currency","revenue_per_visit_desktop","revenue_per_visit_tablet","revenue_per_visit_mobile"]},"title":"Values","type":"object"},"not_set_values":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"default":null,"description":"Keys that were requested but not set","title":"Not Set Values"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Message describing the result","title":"Message"}},"required":["values"],"title":"ProjectMetadataProcessedItem","type":"object"}},"properties":{"project_metadata":{"$ref":"#/$defs/ProjectMetadataProcessedItem","description":"Project metadata information."},"period":{"description":"The time period analyzed.","title":"Period","type":"string"},"keywords":{"description":"List of keyword performance metrics.","items":{"$ref":"#/$defs/KeywordPerformance"},"title":"Keywords","type":"array"},"metrics":{"additionalProperties":true,"description":"Top-level metrics for the URL.","title":"Metrics","type":"object"},"estimated_revenue":{"description":"Estimated revenue based on keyword performance.","title":"Estimated Revenue","type":"number"},"estimated_revenue_currency":{"description":"Currency of the estimated revenue.","title":"Estimated Revenue Currency","type":"string"},"predictions_agg":{"additionalProperties":{"additionalProperties":{"type":"number"},"type":"object"},"description":"Aggregated predictions for different devices.","title":"Predictions Agg","type":"object"},"estimated_revenue_comments":{"description":"Comments on how the estimated revenue was calculated.","title":"Estimated Revenue Comments","type":"string"},"keywords_comments":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Comments on the keyword performance metrics provided.","title":"Keywords Comments"}},"required":["project_metadata","period","keywords","metrics","estimated_revenue","estimated_revenue_currency","predictions_agg","estimated_revenue_comments"],"title":"URLKeywordsProcessedItem","type":"object"},"has_canvas":true,"open_canvas_automatically":false}]