{
 "openapi": "3.1.0",
 "info": {
  "title": "Wrenfield Data tools API",
  "version": "2026-10-27",
  "description": "Every public Wrenfield Data tool as one synchronous endpoint: POST the input JSON, get the result rows. Runs on the Apify API; authenticate with an Apify API token (Bearer). Prices per result are in x-pricing (USD, Apify Free plan; paid plans pay less). Add maxTotalChargeUsd to cap spend per call.",
  "contact": {
   "email": "hello@wrenfielddata.com",
   "url": "https://wrenfielddata.com/agents/"
  }
 },
 "servers": [
  {
   "url": "https://api.apify.com/v2"
  }
 ],
 "security": [
  {
   "bearer": []
  }
 ],
 "components": {
  "securitySchemes": {
   "bearer": {
    "type": "http",
    "scheme": "bearer",
    "description": "Apify API token"
   }
  },
  "schemas": {
   "AgencyAiVisibilityReportsInput": {
    "type": "object",
    "properties": {
     "clientsCsv": {
      "title": "Client book (CSV)",
      "type": "string",
      "description": "One row per client. Columns: <code>client</code>, <code>domain</code>, <code>brand</code> (optional; add spelling variants with <code>|</code>), <code>competitors</code> (separate with <code>;</code>, e.g. <code>Zendesk | zendesk.com; Intercom | intercom.com</code>), <code>questions</code> (up to 20, separated with <code>;</code>) or <code>category</code> (we write 6 neutral buyer questions for you), <code>keywords</code> (optional, up to 10 Google keywords, <code>;</code>-separated), <code>location</code> and <code>language</code> (optional). Export it from Google Sheets as CSV and paste it here."
     },
     "agencyName": {
      "title": "Agency name",
      "type": "string",
      "description": "Shown on every packet and the portfolio page (white label: Wrenfield Data is not mentioned)."
     },
     "agencyLogoUrl": {
      "title": "Agency logo URL",
      "type": "string",
      "description": "Optional. Public PNG or JPG URL; shown top left of each packet."
     },
     "accentColor": {
      "title": "Accent color",
      "type": "string",
      "description": "Optional. Hex color for headings and charts, e.g. <code>#1F4E79</code>.",
      "default": "#1F4E79"
     },
     "reportTitle": {
      "title": "Report title",
      "type": "string",
      "description": "Optional. Default: <i>AI Search Visibility Report</i>."
     },
     "engines": {
      "title": "AI engines",
      "type": "array",
      "description": "Engines each question is asked on. Default: the four consumer AI search surfaces.",
      "items": {
       "type": "string",
       "enum": [
        "chatgpt",
        "perplexity",
        "gemini",
        "google_ai_mode",
        "google_ai_overview",
        "claude",
        "chatgpt_api"
       ],
       "enumTitles": [
        "ChatGPT (web search)",
        "Perplexity",
        "Gemini",
        "Google AI Mode",
        "Google AI Overviews",
        "Claude (API, no web search)",
        "ChatGPT API (no web search)"
       ]
      },
      "default": [
       "chatgpt",
       "perplexity",
       "gemini",
       "google_ai_mode"
      ]
     },
     "country": {
      "title": "Default country",
      "type": "string",
      "description": "Used for rows without a <code>location</code>. Country name or 2-letter code.",
      "default": "United States"
     },
     "language": {
      "title": "Default language",
      "type": "string",
      "description": "Used for rows without a <code>language</code>.",
      "default": "English"
     },
     "quoteOnly": {
      "title": "Quote only (run nothing)",
      "type": "boolean",
      "description": "Validate the book and show the number of packets, checks and the maximum price, without running checks or charging.",
      "default": false
     },
     "bookId": {
      "title": "Book ID",
      "type": "string",
      "description": "Name of this client book. Runs with the same ID compare each client with the previous week. Default: built from the agency name."
     },
     "forceRefresh": {
      "title": "Re-collect this week",
      "type": "boolean",
      "description": "By default a re-run in the same week reuses the stored packets for free. Turn on to ask every question again (charged again).",
      "default": false
     },
     "includePdf": {
      "title": "PDF packets",
      "type": "boolean",
      "description": "Also save a PDF of each packet.",
      "default": true
     },
     "clients": {
      "title": "Clients (JSON)",
      "type": "array",
      "description": "Alternative to the CSV for API and agent use: an array of objects with the same fields, e.g. <code>[{\"client\":\"Acme\",\"domain\":\"acme.com\",\"competitors\":\"Rival | rival.com\",\"category\":\"project management software\"}]</code>."
     }
    }
   },
   "AgencyAiVisibilityReportsRow": {
    "type": "object"
   },
   "AiAnswerScraperInput": {
    "type": "object",
    "properties": {
     "prompts": {
      "title": "Prompts",
      "type": "array",
      "description": "Questions to ask, one per line (up to 500 characters each, up to 500 prompts). Each prompt is sent to every selected engine. Coming from Apify's ChatGPT / Perplexity / Gemini / AI Mode scrapers? You can send your existing <code>queries</code> input unchanged instead.",
      "items": {
       "type": "string"
      }
     },
     "engines": {
      "title": "AI engines",
      "type": "array",
      "description": "Engines to ask. One answer row per prompt and engine. Default: ChatGPT + Perplexity.",
      "items": {
       "type": "string",
       "enum": [
        "chatgpt",
        "perplexity",
        "gemini",
        "google_ai_mode",
        "google_ai_overview",
        "claude",
        "chatgpt_api"
       ],
       "enumTitles": [
        "ChatGPT (web answer with search)",
        "Perplexity (Sonar)",
        "Google Gemini",
        "Google AI Mode",
        "Google AI Overviews",
        "Claude API (no web search)",
        "ChatGPT API (official OpenAI API, no web search)"
       ]
      },
      "default": [
       "chatgpt",
       "perplexity"
      ]
     },
     "country": {
      "title": "Country",
      "type": "string",
      "description": "Country the answers are localized to (web search location): name, 2-letter code or location code. Default: United States."
     },
     "language": {
      "title": "Language",
      "type": "string",
      "description": "Language name or code (<code>English</code>, <code>de</code>).",
      "default": "English"
     },
     "chatgptWebSearch": {
      "title": "ChatGPT: force web search",
      "type": "boolean",
      "description": "Make ChatGPT search the web, so the answer has cited sources (what most users see for buying questions).",
      "default": true
     },
     "includeAnswerText": {
      "title": "Include answer text",
      "type": "boolean",
      "description": "Turn off to get only citations, cited domains and brands (smaller output for agents).",
      "default": true
     },
     "maxAnswerChars": {
      "title": "Max answer length",
      "minimum": 500,
      "maximum": 100000,
      "type": "integer",
      "description": "Answer text is cut to this length.",
      "default": 20000
     },
     "queries": {
      "title": "Queries (Apify-compatible)",
      "type": "string",
      "description": "Same as <code>queries</code> in Apify's AI scrapers: one query per line. Added to Prompts. When used, each row also gets Apify-style fields (<code>query</code>, <code>text</code>, <code>sources</code>, <code>citationUrls</code>)."
     },
     "countryCode": {
      "title": "Country code (Apify-compatible)",
      "type": "string",
      "description": "Lowercase 2-letter country code as in Apify's AI scrapers (e.g. <code>us</code>, <code>gb</code>). Used when Country is empty."
     },
     "perplexitySearch": {
      "title": "Perplexity options (Apify-compatible)",
      "type": "object",
      "description": "Accepted for compatibility with apify/perplexity-search-scraper. Images, related questions and search recency are not supported and are ignored (noted in the run summary)."
     },
     "apifyCompatibleFields": {
      "title": "Add Apify-style output fields",
      "type": "boolean",
      "description": "Add <code>query</code>, <code>text</code>, <code>sources</code>, <code>citationUrls</code>, <code>relatedQuestions</code> and <code>images</code> to every row, matching Apify's AI scrapers. Default: on when you use <code>queries</code>, off otherwise."
     }
    }
   },
   "AiAnswerScraperRow": {
    "$schema": "http://json-schema.org/draft-07/schema#",
    "type": "object",
    "properties": {
     "prompt": {
      "type": "string",
      "description": "Prompt that was asked"
     },
     "engine": {
      "type": "string",
      "description": "Engine key",
      "enum": [
       "chatgpt",
       "perplexity",
       "gemini",
       "google_ai_mode",
       "google_ai_overview",
       "claude",
       "chatgpt_api"
      ]
     },
     "engine_name": {
      "type": "string",
      "description": "Engine name, e.g. ChatGPT"
     },
     "model": {
      "type": [
       "string",
       "null"
      ],
      "description": "Model that answered, when reported (e.g. sonar, gpt-..., google-ai-mode)"
     },
     "status": {
      "type": "string",
      "description": "ok = answer returned; no_answer = the engine showed no AI answer (e.g. no AI Overview for the query); error = the engine did not respond (not charged); incomplete = the engine returned a cut-off answer twice (not charged)",
      "enum": [
       "ok",
       "no_answer",
       "error",
       "incomplete"
      ]
     },
     "answer_markdown": {
      "type": [
       "string",
       "null"
      ],
      "description": "Answer as markdown (images removed)"
     },
     "answer_text": {
      "type": [
       "string",
       "null"
      ],
      "description": "Answer as plain text"
     },
     "answer_word_count": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Words in the answer"
     },
     "citations": {
      "type": [
       "array",
       "null"
      ],
      "description": "Sources the answer cites: url, domain, title",
      "items": {
       "type": "object",
       "properties": {
        "url": {
         "type": "string"
        },
        "domain": {
         "type": [
          "string",
          "null"
         ]
        },
        "title": {
         "type": [
          "string",
          "null"
         ]
        }
       }
      }
     },
     "citation_count": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Number of cited sources"
     },
     "cited_domains": {
      "type": [
       "array",
       "null"
      ],
      "description": "Unique cited domains in order of first citation",
      "items": {
       "type": "string"
      }
     },
     "brands": {
      "type": [
       "array",
       "null"
      ],
      "description": "Brands and products the answer recommends, in the order they first appear (all engines). Each: name, rank, mentions, cited (the answer cites a domain of that brand), cited_domain, confidence (high/low), source (answer, provider or answer+provider).",
      "items": {
       "type": "object",
       "properties": {
        "name": {
         "type": "string"
        },
        "rank": {
         "type": "integer"
        },
        "mentions": {
         "type": "integer"
        },
        "cited": {
         "type": "boolean"
        },
        "cited_domain": {
         "type": [
          "string",
          "null"
         ]
        },
        "confidence": {
         "type": "string",
         "enum": [
          "high",
          "low"
         ]
        },
        "source": {
         "type": "string"
        },
        "first_offset": {
         "type": "integer"
        }
       }
      }
     },
     "brands_mentioned": {
      "type": [
       "array",
       "null"
      ],
      "items": {
       "type": "string"
      },
      "description": "Names of high-confidence brands, in answer order (ready for share-of-voice counts)"
     },
     "first_brand": {
      "type": [
       "string",
       "null"
      ],
      "description": "First high-confidence brand the answer names (the \"top pick\")"
     },
     "brand_entities": {
      "type": [
       "array",
       "null"
      ],
      "description": "Brands / products the engine highlighted (ChatGPT, Gemini)",
      "items": {
       "type": "string"
      }
     },
     "fan_out_queries": {
      "type": [
       "array",
       "null"
      ],
      "description": "Web searches the engine ran to answer (ChatGPT, Perplexity when reported)",
      "items": {
       "type": "string"
      }
     },
     "organic_results": {
      "type": [
       "array",
       "null"
      ],
      "description": "Google AI Overviews only: top organic results on the same page (rank, domain, url)"
     },
     "country": {
      "type": [
       "string",
       "null"
      ],
      "description": "Country used"
     },
     "language": {
      "type": [
       "string",
       "null"
      ],
      "description": "Language used"
     },
     "response_time_secs": {
      "type": [
       "number",
       "null"
      ],
      "description": "Seconds the engine took to answer"
     },
     "note": {
      "type": [
       "string",
       "null"
      ],
      "description": "Explanation when there is no answer"
     },
     "scraped_at": {
      "type": [
       "string",
       "null"
      ],
      "description": "When the answer was retrieved (ISO 8601, UTC)"
     },
     "query": {
      "type": [
       "string",
       "null"
      ],
      "description": "Apify-compatible alias of prompt (only with Apify-style input or apifyCompatibleFields)"
     },
     "text": {
      "type": [
       "string",
       "null"
      ],
      "description": "Apify-compatible alias of answer_markdown"
     },
     "sources": {
      "type": [
       "array",
       "null"
      ],
      "description": "Apify-compatible list of cited sources: id, title, url, section",
      "items": {
       "type": "object"
      }
     },
     "citationUrls": {
      "type": [
       "array",
       "null"
      ],
      "description": "Apify-compatible list of cited URLs",
      "items": {
       "type": "string"
      }
     },
     "relatedQuestions": {
      "type": [
       "array",
       "null"
      ],
      "description": "Apify-compatible field; always empty",
      "items": {
       "type": "string"
      }
     },
     "images": {
      "type": [
       "array",
       "null"
      ],
      "description": "Apify-compatible field; always empty",
      "items": {
       "type": "object"
      }
     }
    },
    "required": [
     "prompt",
     "engine",
     "engine_name",
     "status"
    ]
   },
   "AiSearchVisibilityTrackerInput": {
    "type": "object",
    "required": [
     "brands"
    ],
    "properties": {
     "brands": {
      "title": "Your brand(s)",
      "minItems": 1,
      "type": "array",
      "description": "Your brand name, one per line. Add spelling variants after a <code>|</code>, e.g. <code>HubSpot | HubSpot CRM</code>. A token that looks like a domain (<code>hubspot.com</code>) is used as your domain. Matching is case-insensitive and whole-word.",
      "items": {
       "type": "string"
      }
     },
     "domains": {
      "title": "Your domain(s)",
      "type": "array",
      "description": "Your website domain(s), e.g. <code>hubspot.com</code>. Used to check whether AI answers <b>cite</b> your site (subdomains count). Writing the domain in the answer text also counts as a mention.",
      "items": {
       "type": "string"
      }
     },
     "competitors": {
      "title": "Competitors (optional)",
      "type": "array",
      "description": "Competitor brands to compare with, one per line: <code>Name | variant | domain.com</code>. Used for share of voice, rank and citation comparisons.",
      "items": {
       "type": "string"
      }
     },
     "prompts": {
      "title": "Prompts (questions)",
      "type": "array",
      "description": "Questions your buyers ask AI assistants, one per line, e.g. <code>What is the best CRM for a small business?</code>. Max 500 characters each. Every prompt is checked on every selected engine (1 prompt x 3 engines = 3 checks). Leave empty if you use seed topics.",
      "items": {
       "type": "string"
      }
     },
     "seedTopics": {
      "title": "Seed topics (generate prompts)",
      "type": "array",
      "description": "Optional: product categories such as <code>CRM software</code> or <code>running shoes for flat feet</code>. The Actor generates buyer-intent questions (\"What is the best ...\", \"alternatives to <competitor>\", ...) for each topic and checks them too.",
      "items": {
       "type": "string"
      }
     },
     "promptsPerTopic": {
      "title": "Prompts per seed topic",
      "minimum": 1,
      "maximum": 10,
      "type": "integer",
      "description": "How many questions to generate per seed topic.",
      "default": 3
     },
     "promptGeneration": {
      "title": "Prompt generation",
      "enum": [
       "templates",
       "ai"
      ],
      "type": "string",
      "description": "<b>Templates</b>: proven buyer-intent question patterns (stable from run to run, best for monitoring). <b>AI-written</b>: an AI model writes natural, varied buyer questions for each topic (at no extra charge; up to 20 topics).",
      "default": "templates"
     },
     "engines": {
      "title": "AI engines",
      "type": "array",
      "description": "Engines to check every prompt on. Each prompt x engine is one check. ChatGPT, Gemini, Google AI Overviews and Google AI Mode are the real consumer answers (localized); Perplexity and Claude come from their official models.",
      "items": {
       "type": "string",
       "enum": [
        "chatgpt",
        "perplexity",
        "gemini",
        "google_ai_overview",
        "google_ai_mode",
        "claude"
       ],
       "enumTitles": [
        "ChatGPT (with web search)",
        "Perplexity (Sonar)",
        "Gemini",
        "Google AI Overviews",
        "Google AI Mode",
        "Claude (Haiku, no web search)"
       ]
      },
      "default": [
       "chatgpt",
       "perplexity",
       "google_ai_overview"
      ]
     },
     "country": {
      "title": "Country",
      "type": "string",
      "description": "Where the questions are asked from: country name (<code>Germany</code>), 2-letter code (<code>DE</code>) or location code (<code>2276</code>). 190+ countries.",
      "default": "United States"
     },
     "language": {
      "title": "Language",
      "type": "string",
      "description": "Language name (<code>German</code>) or code (<code>de</code>). Write your prompts in this language.",
      "default": "English"
     },
     "monitoringMode": {
      "title": "Monitoring mode (compare with previous run)",
      "type": "boolean",
      "description": "Save results to a named key-value store and compare each prompt x engine with the previous run: flags gained/lost mentions, citations and rank changes, and adds share-of-voice changes to the summary. Schedule the Actor (e.g. weekly) to track AI visibility over time.",
      "default": false
     },
     "trackingId": {
      "title": "Tracking ID",
      "type": "string",
      "description": "Name of this tracking project, e.g. <code>hubspot-us</code>. Runs with the same ID are compared with each other. Default: derived from your brand, country and language."
     },
     "monitoringStoreName": {
      "title": "Monitoring store name",
      "type": "string",
      "description": "Named key-value store (in your Apify account) that keeps the previous results.",
      "default": "ai-visibility-monitor"
     },
     "maxChecks": {
      "title": "Max checks per run",
      "minimum": 1,
      "maximum": 10000,
      "type": "integer",
      "description": "Upper limit of prompt x engine checks per run (cost control). The run also stops cleanly at your Maximum cost per run.",
      "default": 200
     },
     "chatgptWebSearch": {
      "title": "Force ChatGPT web search",
      "type": "boolean",
      "description": "Ask ChatGPT to search the web (like ChatGPT Search) so answers cite sources. Turn off to see what ChatGPT says from memory.",
      "default": true
     },
     "includeAnswerText": {
      "title": "Include full answer text",
      "type": "boolean",
      "description": "Save the complete AI answer (markdown) in each row.",
      "default": true
     },
     "caseSensitive": {
      "title": "Case-sensitive brand matching",
      "type": "boolean",
      "description": "Turn on for brand names that are also common words (e.g. <code>Notion</code>, <code>Monday</code>) to count only capitalized mentions.",
      "default": false
     },
     "maxConcurrency": {
      "title": "Max parallel checks",
      "minimum": 1,
      "maximum": 20,
      "type": "integer",
      "description": "How many checks run at the same time.",
      "default": 5
     }
    }
   },
   "AiSearchVisibilityTrackerRow": {
    "type": "object",
    "properties": {
     "type": {
      "type": "string",
      "description": "check = one prompt answered by one AI engine; summary = share-of-voice row for one engine (or \"all\") and one brand"
     },
     "prompt": {
      "type": [
       "string",
       "null"
      ],
      "description": "The question sent to the AI engine"
     },
     "prompt_source": {
      "type": [
       "string",
       "null"
      ],
      "description": "input, template (generated from a seed topic) or ai (generated by AI from a seed topic)"
     },
     "seed_topic": {
      "type": [
       "string",
       "null"
      ],
      "description": "Seed topic the prompt was generated from"
     },
     "engine": {
      "type": [
       "string",
       "null"
      ],
      "description": "chatgpt, perplexity, gemini, google_ai_overview, google_ai_mode, claude (summary rows: also \"all\")"
     },
     "engine_name": {
      "type": [
       "string",
       "null"
      ],
      "description": "Engine display name"
     },
     "model": {
      "type": [
       "string",
       "null"
      ],
      "description": "Model / surface that produced the answer"
     },
     "country": {
      "type": [
       "string",
       "null"
      ],
      "description": "Country used for the check"
     },
     "language": {
      "type": [
       "string",
       "null"
      ],
      "description": "Language code"
     },
     "status": {
      "type": [
       "string",
       "null"
      ],
      "description": "ok = answer received; no_answer = the engine showed no AI answer (e.g. no AI Overview for this query); error = check failed (not charged); incomplete = the engine returned a cut-off answer twice (not charged)"
     },
     "note": {
      "type": [
       "string",
       "null"
      ],
      "description": "Explanation for no_answer / error / incomplete"
     },
     "brand": {
      "type": [
       "string",
       "null"
      ],
      "description": "Your brand(s)"
     },
     "brand_mentioned": {
      "type": [
       "boolean",
       "null"
      ],
      "description": "Your brand is mentioned in the answer"
     },
     "brand_position": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Rank of your brand among all tracked brands by first mention (1 = mentioned first)"
     },
     "brand_mention_count": {
      "type": [
       "integer",
       "null"
      ],
      "description": "How many times your brand is mentioned"
     },
     "brand_sentiment": {
      "type": [
       "string",
       "null"
      ],
      "description": "positive, neutral, negative or mixed (wording around your brand)"
     },
     "brand_snippet": {
      "type": [
       "string",
       "null"
      ],
      "description": "Sentence where your brand is first mentioned"
     },
     "your_domain_cited": {
      "type": [
       "boolean",
       "null"
      ],
      "description": "One of your domains is cited as a source (null if you gave no domain)"
     },
     "your_cited_urls": {
      "type": [
       "array",
       "null"
      ],
      "description": "Your URLs cited as sources"
     },
     "your_organic_rank": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Google AI Overview engine only: rank of your domain in the top-10 organic results"
     },
     "competitors_mentioned": {
      "type": [
       "array",
       "null"
      ],
      "description": "Tracked competitors mentioned in the answer"
     },
     "first_mentioned_brand": {
      "type": [
       "string",
       "null"
      ],
      "description": "Tracked brand mentioned first"
     },
     "brands_mentioned_count": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Number of tracked brands mentioned"
     },
     "brand_results": {
      "type": [
       "array",
       "null"
      ],
      "description": "Per tracked brand: mentioned, mention_count, position, sentiment, snippet, cited, cited_urls, position_among_all_brands, organic_rank"
     },
     "other_brands_mentioned": {
      "type": [
       "array",
       "null"
      ],
      "description": "Other (untracked) brands the engine recognized in the answer (ChatGPT)"
     },
     "cited_domains": {
      "type": [
       "array",
       "null"
      ],
      "description": "Unique domains cited as sources"
     },
     "citations": {
      "type": [
       "array",
       "integer",
       "null"
      ],
      "description": "Check rows: cited sources. Summary rows: checks citing the brand domain"
     },
     "citations_count": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Number of unique cited URLs"
     },
     "fan_out_queries": {
      "type": [
       "array",
       "null"
      ],
      "description": "Web searches the engine ran to answer the prompt"
     },
     "answer_text": {
      "type": [
       "string",
       "null"
      ],
      "description": "Full answer (markdown)"
     },
     "answer_length": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Answer length in characters"
     },
     "change_status": {
      "type": [
       "string",
       "null"
      ],
      "description": "Monitoring: first_check, gained_mention, lost_mention, gained_citation, lost_citation, position_changed, competitors_changed, unchanged"
     },
     "mention_change": {
      "type": [
       "string",
       "null"
      ],
      "description": "Monitoring: gained, lost or unchanged"
     },
     "citation_change": {
      "type": [
       "string",
       "null"
      ],
      "description": "Monitoring: gained, lost or unchanged"
     },
     "position_change": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Monitoring: positions moved up (+) or down (-) since the previous run"
     },
     "brands_gained": {
      "type": [
       "array",
       "null"
      ],
      "description": "Monitoring: tracked brands newly mentioned"
     },
     "brands_lost": {
      "type": [
       "array",
       "null"
      ],
      "description": "Monitoring: tracked brands no longer mentioned"
     },
     "previous_checked_at": {
      "type": [
       "string",
       "null"
      ],
      "description": "Monitoring: time of the previous check"
     },
     "is_your_brand": {
      "type": [
       "boolean",
       "null"
      ],
      "description": "Summary: the row is about your brand"
     },
     "checks": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Summary: completed checks"
     },
     "answers": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Summary: checks with an AI answer"
     },
     "mentions": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Summary: checks mentioning the brand"
     },
     "mention_rate": {
      "type": [
       "number",
       "null"
      ],
      "description": "Summary: mentions / checks (0-1)"
     },
     "share_of_voice": {
      "type": [
       "number",
       "null"
      ],
      "description": "Summary: brand mentions / all tracked-brand mentions (0-1)"
     },
     "avg_position": {
      "type": [
       "number",
       "null"
      ],
      "description": "Summary: average rank among tracked brands when mentioned"
     },
     "top_position_rate": {
      "type": [
       "number",
       "null"
      ],
      "description": "Summary: share of checks where the brand is mentioned first"
     },
     "citation_rate": {
      "type": [
       "number",
       "null"
      ],
      "description": "Summary: checks citing the brand domain / checks (null if no domain given)"
     },
     "mention_rate_change": {
      "type": [
       "number",
       "null"
      ],
      "description": "Summary + monitoring: change vs previous run"
     },
     "share_of_voice_change": {
      "type": [
       "number",
       "null"
      ],
      "description": "Summary + monitoring: change vs previous run"
     },
     "citation_rate_change": {
      "type": [
       "number",
       "null"
      ],
      "description": "Summary + monitoring: change vs previous run"
     },
     "checked_at": {
      "type": [
       "string",
       "null"
      ],
      "description": "When the row was produced (UTC)"
     }
    }
   },
   "AmazonKeywordResearchInput": {
    "type": "object",
    "required": [
     "mode"
    ],
    "properties": {
     "mode": {
      "title": "Mode",
      "enum": [
       "reverse_asin",
       "keyword_ideas",
       "search_volume"
      ],
      "type": "string",
      "description": "What to look up.",
      "default": "reverse_asin"
     },
     "asins": {
      "title": "ASINs",
      "type": "array",
      "description": "Reverse ASIN mode: ASINs or Amazon product URLs (up to 50).",
      "items": {
       "type": "string"
      }
     },
     "keywords": {
      "title": "Keywords",
      "type": "array",
      "description": "Keyword ideas mode: seed keywords (up to 20). Search volume mode: your keyword list (up to 10,000).",
      "items": {
       "type": "string"
      }
     },
     "marketplace": {
      "title": "Marketplace",
      "enum": [
       "amazon.com",
       "amazon.sa",
       "amazon.ae",
       "amazon.eg"
      ],
      "type": "string",
      "description": "Amazon marketplace of the data.",
      "default": "amazon.com"
     },
     "maxKeywords": {
      "title": "Max keywords",
      "minimum": 1,
      "maximum": 10000,
      "type": "integer",
      "description": "Max keyword rows per ASIN or seed keyword. The default of 100 finishes in a few seconds.",
      "default": 100
     },
     "minSearchVolume": {
      "title": "Min search volume",
      "minimum": 0,
      "type": "integer",
      "description": "Only keywords with at least this many monthly Amazon searches.",
      "default": 0
     },
     "maxRank": {
      "title": "Max rank (reverse ASIN)",
      "minimum": 1,
      "maximum": 1000,
      "type": "integer",
      "description": "Only keywords where the product ranks in this position or better."
     },
     "mustContainSeed": {
      "title": "Keyword ideas: must contain the seed",
      "type": "boolean",
      "description": "Keep only ideas that contain the seed phrase (long-tail variations).",
      "default": false
     },
     "depth": {
      "title": "Keyword ideas depth",
      "minimum": 1,
      "maximum": 4,
      "type": "integer",
      "description": "How many levels of related keywords to follow (1-4).",
      "default": 2
     }
    }
   },
   "AmazonKeywordResearchRow": {
    "$schema": "http://json-schema.org/draft-07/schema#",
    "type": "object",
    "properties": {
     "mode": {
      "type": "string",
      "description": "reverse_asin, keyword_ideas or search_volume",
      "enum": [
       "reverse_asin",
       "keyword_ideas",
       "search_volume"
      ]
     },
     "keyword": {
      "type": "string",
      "description": "Amazon search keyword"
     },
     "search_volume": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Estimated monthly Amazon searches"
     },
     "asin": {
      "type": [
       "string",
       "null"
      ],
      "description": "reverse_asin: the product"
     },
     "seed_keyword": {
      "type": [
       "string",
       "null"
      ],
      "description": "keyword_ideas: seed the idea came from"
     },
     "rank": {
      "type": [
       "integer",
       "null"
      ],
      "description": "reverse_asin: organic rank of the product for the keyword"
     },
     "rank_absolute": {
      "type": [
       "integer",
       "null"
      ],
      "description": "reverse_asin: rank counting all result types"
     },
     "is_amazon_choice": {
      "type": [
       "boolean",
       "null"
      ],
      "description": "reverse_asin: shown with the Amazon's Choice badge"
     },
     "is_best_seller": {
      "type": [
       "boolean",
       "null"
      ],
      "description": "reverse_asin: shown with the Best Seller badge"
     },
     "product_title": {
      "type": [
       "string",
       "null"
      ],
      "description": "reverse_asin: product title in the results"
     },
     "price": {
      "type": [
       "number",
       "null"
      ],
      "description": "reverse_asin: price shown"
     },
     "currency": {
      "type": [
       "string",
       "null"
      ],
      "description": "Currency"
     },
     "rating": {
      "type": [
       "number",
       "null"
      ],
      "description": "reverse_asin: star rating"
     },
     "reviews_count": {
      "type": [
       "integer",
       "null"
      ],
      "description": "reverse_asin: ratings count"
     },
     "bought_past_month": {
      "type": [
       "integer",
       "null"
      ],
      "description": "reverse_asin: \"bought in past month\" figure shown"
     },
     "product_url": {
      "type": [
       "string",
       "null"
      ],
      "description": "reverse_asin: product page"
     },
     "search_results_count": {
      "type": [
       "integer",
       "null"
      ],
      "description": "reverse_asin: total results for the keyword"
     },
     "related_keywords": {
      "type": [
       "array",
       "null"
      ],
      "description": "keyword_ideas: keywords related to this one",
      "items": {
       "type": "string"
      }
     },
     "depth": {
      "type": [
       "integer",
       "null"
      ],
      "description": "keyword_ideas: 0 = the seed, 1-4 = related-keyword hops"
     },
     "marketplace": {
      "type": "string",
      "description": "Amazon marketplace"
     },
     "data_updated_at": {
      "type": [
       "string",
       "null"
      ],
      "description": "When the data was last updated (ISO 8601, UTC)"
     },
     "scraped_at": {
      "type": "string",
      "description": "When the row was produced (ISO 8601, UTC)"
     }
    },
    "required": [
     "mode",
     "keyword",
     "marketplace",
     "scraped_at"
    ]
   },
   "AtsJobsApiInput": {
    "type": "object",
    "required": [
     "companies"
    ],
    "properties": {
     "companies": {
      "title": "Companies (domains, careers URLs, ATS URLs or board tokens)",
      "minItems": 1,
      "type": "array",
      "description": "One company per line. Accepted formats:<br>\u2022 Company domain: <code>stripe.com</code> (careers page is scanned and ATS boards are probed)<br>\u2022 Careers page URL: <code>https://www.figma.com/careers/</code><br>\u2022 ATS board URL: <code>https://boards.greenhouse.io/stripe</code>, <code>https://jobs.lever.co/spotify</code>, <code>https://jobs.ashbyhq.com/notion</code>, <code>https://apply.workable.com/huggingface</code>, <code>https://jobs.smartrecruiters.com/BoschGroup</code>, <code>https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite</code><br>\u2022 Board token: <code>notion</code> (all token-based ATSs are tried)<br>\u2022 Prefixed token to skip detection: <code>greenhouse:stripe</code>, <code>lever:spotify</code>, <code>ashby:notion</code>, <code>workable:huggingface</code>, <code>smartrecruiters:BoschGroup</code><br>Workday sites must be given as a URL (or found on the company's careers page).",
      "items": {
       "type": "string"
      }
     },
     "maxJobsPerCompany": {
      "title": "Max jobs per company",
      "minimum": 0,
      "type": "integer",
      "description": "Maximum number of job postings to save per company (after filters). Leave empty or 0 for no limit. Large Workday and SmartRecruiters employers can have thousands of open roles."
     },
     "maxItems": {
      "title": "Max jobs in total",
      "minimum": 0,
      "type": "integer",
      "description": "Stop after saving this many jobs across all companies. Leave empty or 0 for no limit. The run also stops automatically when your 'Maximum cost per run' is reached."
     },
     "keywords": {
      "title": "Keywords (match any)",
      "type": "array",
      "description": "Keep only jobs whose title contains at least one of these words or phrases (case-insensitive, whole words). Example: <code>engineer</code>, <code>data scientist</code>, <code>product manager</code>.",
      "items": {
       "type": "string"
      }
     },
     "excludeKeywords": {
      "title": "Exclude keywords",
      "type": "array",
      "description": "Drop jobs whose title contains any of these words. Example: <code>intern</code>, <code>senior</code>.",
      "items": {
       "type": "string"
      }
     },
     "searchInDescription": {
      "title": "Also match keywords in job description",
      "type": "boolean",
      "description": "When enabled, keywords are matched against the title and the full job description.",
      "default": false
     },
     "locations": {
      "title": "Locations (match any)",
      "type": "array",
      "description": "Keep only jobs where any location (or the country) contains one of these words or phrases, case-insensitive, whole words (<code>US</code> won't match <i>Austria</i>). Remote jobs also match <code>Remote</code>. Example: <code>New York</code>, <code>London</code>, <code>Germany</code>, <code>Remote</code>.",
      "items": {
       "type": "string"
      }
     },
     "remoteOnly": {
      "title": "Remote jobs only",
      "type": "boolean",
      "description": "Keep only jobs marked as remote by the ATS (or with 'Remote' in the location).",
      "default": false
     },
     "postedWithinDays": {
      "title": "Posted within last N days",
      "minimum": 0,
      "type": "integer",
      "description": "Keep only jobs first published within this many days. Jobs whose ATS does not expose a posting date are kept."
     },
     "departments": {
      "title": "Departments / teams (match any)",
      "type": "array",
      "description": "Keep only jobs whose department or team contains one of these strings. Example: <code>Engineering</code>, <code>Sales</code>.",
      "items": {
       "type": "string"
      }
     },
     "employmentTypes": {
      "title": "Employment types (match any)",
      "type": "array",
      "description": "Keep only these normalized employment types: <code>Full-time</code>, <code>Part-time</code>, <code>Contract</code>, <code>Internship</code>, <code>Temporary</code>. Jobs whose ATS doesn't publish an employment type (common on Greenhouse) are kept.",
      "items": {
       "type": "string"
      }
     },
     "monitoringMode": {
      "title": "Only new or changed jobs since last run (monitoring)",
      "type": "boolean",
      "description": "Remember every job saved per company in a named key-value store and on later runs save only postings that are new (or changed, see below). Perfect for scheduled runs that feed alerts, Slack, CRMs or job boards. The first run saves everything and creates the baseline. Jobs skipped because of the max-jobs limits are not remembered, so they show up on a later run.",
      "default": false
     },
     "monitoringIncludeChanged": {
      "title": "Also output changed postings",
      "type": "boolean",
      "description": "In monitoring mode, also save jobs whose title, location, department, employment type or salary changed since they were last seen (marked with changeType = 'changed').",
      "default": true
     },
     "monitoringStoreName": {
      "title": "Monitoring state store name",
      "type": "string",
      "description": "Name of the key-value store holding the 'already seen' state. Use a different name for each independent monitor (e.g. one per schedule or client).",
      "default": "ats-jobs-monitor"
     },
     "includeDescription": {
      "title": "Include job descriptions",
      "type": "boolean",
      "description": "Save the full description as plain text and HTML. Turn off for faster, smaller runs (Workday and SmartRecruiters need one extra request per job for descriptions).",
      "default": true
     },
     "fetchGreenhouseSalary": {
      "title": "Fetch structured Greenhouse pay ranges",
      "type": "boolean",
      "description": "Greenhouse only exposes structured pay ranges per job. Enable to make one extra request per Greenhouse job to get exact min/max salary. When disabled, salary is still extracted from the description text when present.",
      "default": false
     },
     "maxConcurrency": {
      "title": "Companies processed in parallel",
      "minimum": 1,
      "maximum": 20,
      "type": "integer",
      "description": "How many companies are scraped at the same time.",
      "default": 5
     }
    }
   },
   "AtsJobsApiRow": {
    "type": "object",
    "properties": {
     "company": {
      "type": "string",
      "description": "Company name"
     },
     "title": {
      "type": "string",
      "description": "Job title"
     },
     "department": {
      "type": [
       "string",
       "null"
      ]
     },
     "team": {
      "type": [
       "string",
       "null"
      ]
     },
     "location": {
      "type": [
       "string",
       "null"
      ],
      "description": "Primary location"
     },
     "locations": {
      "type": "array",
      "description": "All locations of the posting"
     },
     "country": {
      "type": [
       "string",
       "null"
      ]
     },
     "remote": {
      "type": [
       "boolean",
       "null"
      ]
     },
     "workplaceType": {
      "type": [
       "string",
       "null"
      ],
      "description": "Remote, Hybrid or On-site"
     },
     "employmentType": {
      "type": [
       "string",
       "null"
      ],
      "description": "Full-time, Part-time, Contract, Internship, Temporary"
     },
     "postedAt": {
      "type": [
       "string",
       "null"
      ],
      "description": "First published (ISO 8601, UTC)"
     },
     "updatedAt": {
      "type": [
       "string",
       "null"
      ]
     },
     "salaryMin": {
      "type": [
       "number",
       "null"
      ]
     },
     "salaryMax": {
      "type": [
       "number",
       "null"
      ]
     },
     "salaryCurrency": {
      "type": [
       "string",
       "null"
      ]
     },
     "salaryInterval": {
      "type": [
       "string",
       "null"
      ],
      "description": "YEAR, MONTH or HOUR"
     },
     "salaryText": {
      "type": [
       "string",
       "null"
      ]
     },
     "salarySource": {
      "type": [
       "string",
       "null"
      ],
      "description": "structured (from ATS) or description (parsed from text)"
     },
     "descriptionText": {
      "type": [
       "string",
       "null"
      ]
     },
     "descriptionHtml": {
      "type": [
       "string",
       "null"
      ]
     },
     "jobUrl": {
      "type": [
       "string",
       "null"
      ]
     },
     "applyUrl": {
      "type": [
       "string",
       "null"
      ]
     },
     "ats": {
      "type": "string",
      "description": "greenhouse, lever, ashby, workable, smartrecruiters or workday"
     },
     "atsBoardToken": {
      "type": "string"
     },
     "atsBoardUrl": {
      "type": "string"
     },
     "jobId": {
      "type": "string"
     },
     "requisitionId": {
      "type": [
       "string",
       "null"
      ]
     },
     "sourceInput": {
      "type": "string"
     },
     "scrapedAt": {
      "type": "string"
     },
     "changeType": {
      "type": [
       "string",
       "null"
      ],
      "description": "Monitoring mode only: new or changed"
     }
    },
    "required": [
     "company",
     "title",
     "ats",
     "jobId"
    ]
   },
   "BulkPagespeedCheckerInput": {
    "type": "object",
    "required": [
     "urls"
    ],
    "properties": {
     "urls": {
      "title": "URLs",
      "minItems": 1,
      "type": "array",
      "description": "Pages to test, one per line (up to 5,000). <code>https://</code> is added when missing.",
      "items": {
       "type": "string"
      }
     },
     "devices": {
      "title": "Devices",
      "type": "array",
      "description": "Each URL is tested once per device.",
      "items": {
       "type": "string",
       "enum": [
        "mobile",
        "desktop"
       ],
       "enumTitles": [
        "Mobile",
        "Desktop"
       ]
      },
      "default": [
       "mobile"
      ]
     },
     "categories": {
      "title": "Lighthouse categories",
      "type": "array",
      "description": "Scores to include. Performance is always included.",
      "items": {
       "type": "string",
       "enum": [
        "performance",
        "accessibility",
        "best-practices",
        "seo"
       ],
       "enumTitles": [
        "Performance",
        "Accessibility",
        "Best practices",
        "SEO"
       ]
      },
      "default": [
       "performance",
       "seo"
      ]
     },
     "maxOpportunities": {
      "title": "Top fixes per page",
      "minimum": 0,
      "maximum": 20,
      "type": "integer",
      "description": "How many improvement opportunities (with estimated savings) to list per test.",
      "default": 5
     },
     "googleApiKey": {
      "title": "Your Google API key (optional)",
      "type": "string",
      "description": "Optional free PageSpeed Insights API key from Google Cloud, for very large jobs. Not needed: the Actor has its own."
     },
     "useBackupService": {
      "title": "Use the backup Lighthouse service",
      "type": "boolean",
      "description": "If Google PageSpeed Insights is over its quota, test pages on a backup Lighthouse service instead (lab data only, no real-user Core Web Vitals; <code>lighthouse-test</code> event).",
      "default": true
     }
    }
   },
   "BulkPagespeedCheckerRow": {
    "$schema": "http://json-schema.org/draft-07/schema#",
    "type": "object",
    "properties": {
     "url": {
      "type": "string",
      "description": "URL tested"
     },
     "device": {
      "type": "string",
      "description": "mobile or desktop",
      "enum": [
       "mobile",
       "desktop"
      ]
     },
     "status": {
      "type": "string",
      "description": "ok or error",
      "enum": [
       "ok",
       "error"
      ]
     },
     "error": {
      "type": [
       "string",
       "null"
      ],
      "description": "Why the test failed"
     },
     "engine": {
      "type": [
       "string",
       "null"
      ],
      "description": "pagespeed_insights (Google, lab + real-user data) or lighthouse_backup (lab data only)"
     },
     "final_url": {
      "type": [
       "string",
       "null"
      ],
      "description": "URL after redirects"
     },
     "redirected": {
      "type": [
       "boolean",
       "null"
      ],
      "description": "The URL redirected"
     },
     "performance_score": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Lighthouse performance score 0-100"
     },
     "accessibility_score": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Accessibility score 0-100 (if requested)"
     },
     "best_practices_score": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Best practices score 0-100 (if requested)"
     },
     "seo_score": {
      "type": [
       "integer",
       "null"
      ],
      "description": "SEO score 0-100 (if requested)"
     },
     "cwv_assessment": {
      "type": [
       "string",
       "null"
      ],
      "description": "Core Web Vitals assessment from real users (CrUX): passed, failed or no_data"
     },
     "field_data_scope": {
      "type": [
       "string",
       "null"
      ],
      "description": "url = real-user data for this page; origin = whole-site data (page has too little traffic)"
     },
     "origin_cwv_assessment": {
      "type": [
       "string",
       "null"
      ],
      "description": "Core Web Vitals assessment for the whole site"
     },
     "field_lcp_p75": {
      "type": [
       "number",
       "null"
      ],
      "description": "Real-user LCP at the 75th percentile (ms)"
     },
     "field_inp_p75": {
      "type": [
       "number",
       "null"
      ],
      "description": "Real-user INP at the 75th percentile (ms)"
     },
     "field_cls_p75": {
      "type": [
       "number",
       "null"
      ],
      "description": "Real-user CLS at the 75th percentile (unitless)"
     },
     "field_fcp_p75": {
      "type": [
       "number",
       "null"
      ],
      "description": "Real-user FCP at the 75th percentile (ms)"
     },
     "field_ttfb_p75": {
      "type": [
       "number",
       "null"
      ],
      "description": "Real-user TTFB at the 75th percentile (ms)"
     },
     "field_lcp_rating": {
      "type": [
       "string",
       "null"
      ],
      "description": "Real-user LCP rating: fast, average or slow"
     },
     "field_inp_rating": {
      "type": [
       "string",
       "null"
      ],
      "description": "Real-user INP rating: fast, average or slow"
     },
     "field_cls_rating": {
      "type": [
       "string",
       "null"
      ],
      "description": "Real-user CLS rating: fast, average or slow"
     },
     "field_fcp_rating": {
      "type": [
       "string",
       "null"
      ],
      "description": "Real-user FCP rating: fast, average or slow"
     },
     "field_ttfb_rating": {
      "type": [
       "string",
       "null"
      ],
      "description": "Real-user TTFB rating: fast, average or slow"
     },
     "lab_fcp_ms": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Lab First Contentful Paint (ms)"
     },
     "lab_lcp_ms": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Lab Largest Contentful Paint (ms)"
     },
     "lab_tbt_ms": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Lab Total Blocking Time (ms)"
     },
     "lab_cls": {
      "type": [
       "number",
       "null"
      ],
      "description": "Lab Cumulative Layout Shift"
     },
     "lab_speed_index_ms": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Lab Speed Index (ms)"
     },
     "lab_tti_ms": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Lab Time to Interactive (ms)"
     },
     "lab_server_response_ms": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Server response time (ms)"
     },
     "page_weight_bytes": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Total page weight (bytes)"
     },
     "requests_count": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Network requests"
     },
     "opportunities": {
      "type": [
       "array",
       "null"
      ],
      "description": "Top fixes with estimated savings",
      "items": {
       "type": "object",
       "properties": {
        "id": {
         "type": "string"
        },
        "title": {
         "type": [
          "string",
          "null"
         ]
        },
        "savings_ms": {
         "type": [
          "integer",
          "null"
         ]
        },
        "savings_bytes": {
         "type": [
          "integer",
          "null"
         ]
        }
       }
      }
     },
     "failed_audits": {
      "type": [
       "array",
       "null"
      ],
      "description": "Common audits the page fails (compression, render-blocking, images, meta description, ...)",
      "items": {
       "type": "string"
      }
     },
     "lighthouse_version": {
      "type": [
       "string",
       "null"
      ],
      "description": "Lighthouse version"
     },
     "checked_at": {
      "type": "string",
      "description": "When the test ran (ISO 8601, UTC)"
     }
    },
    "required": [
     "url",
     "device",
     "status",
     "checked_at"
    ]
   },
   "BusinessesWithoutWebsitesInput": {
    "type": "object",
    "required": [
     "searchTerms"
    ],
    "properties": {
     "searchTerms": {
      "title": "Business types",
      "minItems": 1,
      "type": "array",
      "description": "What to search on Google Maps, e.g. <code>plumber</code>, <code>hair salon</code>, <code>dentist</code>. Up to 50.",
      "items": {
       "type": "string"
      }
     },
     "locations": {
      "title": "Locations",
      "type": "array",
      "description": "Cities, areas or ZIP codes, e.g. <code>Austin, TX</code>, <code>Leeds</code>, <code>90210</code>. Each business type is searched in each location (up to 100). Leave empty to search the whole country.",
      "items": {
       "type": "string"
      }
     },
     "country": {
      "title": "Country",
      "type": "string",
      "description": "Country: name (<code>United States</code>), 2-letter code (<code>DE</code>) or location code (<code>2840</code>).",
      "default": "United States"
     },
     "leadType": {
      "title": "Which businesses to keep",
      "enum": [
       "no_real_website",
       "no_website",
       "weak_website",
       "all"
      ],
      "type": "string",
      "description": "Which businesses become leads.",
      "default": "no_real_website"
     },
     "auditWebsites": {
      "title": "Audit websites",
      "type": "boolean",
      "description": "Check each business website (one page load): unreachable, no HTTPS / SSL error, not mobile-friendly, outdated copyright year, very slow, parked page, site builder. Adds the <code>website-audit</code> event. Always on for \"weak_website\".",
      "default": false
     },
     "maxPlacesPerSearch": {
      "title": "Places per search",
      "minimum": 20,
      "maximum": 700,
      "type": "integer",
      "description": "How many Google Maps results to scan per business type and location (in steps of 100, up to 700). Google shows about 100-120 for most searches.",
      "default": 100
     },
     "maxLeads": {
      "title": "Max leads",
      "minimum": 1,
      "maximum": 100000,
      "type": "integer",
      "description": "Stop after this many leads in total.",
      "default": 1000
     },
     "minReviews": {
      "title": "Min reviews",
      "minimum": 0,
      "type": "integer",
      "description": "Only businesses with at least this many Google reviews (real, active businesses).",
      "default": 0
     },
     "minRating": {
      "title": "Min rating",
      "type": "string",
      "description": "Only businesses rated at least this (e.g. <code>4</code>)."
     },
     "requirePhone": {
      "title": "Only with a phone number",
      "type": "boolean",
      "description": "Skip businesses without a phone number.",
      "default": false
     },
     "language": {
      "title": "Language",
      "type": "string",
      "description": "Language of the results (name or code). Default: English."
     }
    }
   },
   "BusinessesWithoutWebsitesRow": {
    "$schema": "http://json-schema.org/draft-07/schema#",
    "type": "object",
    "properties": {
     "business_name": {
      "type": "string",
      "description": "Business name on Google Maps"
     },
     "category": {
      "type": [
       "string",
       "null"
      ],
      "description": "Main Google category"
     },
     "additional_categories": {
      "type": [
       "array",
       "null"
      ],
      "description": "Other categories",
      "items": {
       "type": "string"
      }
     },
     "phone": {
      "type": [
       "string",
       "null"
      ],
      "description": "Phone number"
     },
     "address": {
      "type": [
       "string",
       "null"
      ],
      "description": "Full address"
     },
     "street": {
      "type": [
       "string",
       "null"
      ],
      "description": "Street address"
     },
     "city": {
      "type": [
       "string",
       "null"
      ],
      "description": "City"
     },
     "postal_code": {
      "type": [
       "string",
       "null"
      ],
      "description": "ZIP / postal code"
     },
     "region": {
      "type": [
       "string",
       "null"
      ],
      "description": "State / region"
     },
     "country_code": {
      "type": [
       "string",
       "null"
      ],
      "description": "2-letter country code"
     },
     "latitude": {
      "type": [
       "number",
       "null"
      ],
      "description": "Latitude"
     },
     "longitude": {
      "type": [
       "number",
       "null"
      ],
      "description": "Longitude"
     },
     "rating": {
      "type": [
       "number",
       "null"
      ],
      "description": "Google rating 1-5"
     },
     "reviews_count": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Number of Google reviews"
     },
     "is_claimed": {
      "type": [
       "boolean",
       "null"
      ],
      "description": "Owner has claimed the Google Business Profile"
     },
     "business_status": {
      "type": [
       "string",
       "null"
      ],
      "description": "Opening status when checked (open, close, closed_forever, temporarily_closed)"
     },
     "price_level": {
      "type": [
       "string",
       "null"
      ],
      "description": "Price level, e.g. $$"
     },
     "total_photos": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Photos on the listing"
     },
     "website": {
      "type": [
       "string",
       "null"
      ],
      "description": "Website on the listing (null = none)"
     },
     "website_type": {
      "type": "string",
      "description": "none = no website; social = only a social media page; directory = only a directory/booking page; own = a real website",
      "enum": [
       "none",
       "social",
       "directory",
       "own"
      ]
     },
     "has_real_website": {
      "type": "boolean",
      "description": "true when the listing links to its own website"
     },
     "lead_score": {
      "type": "integer",
      "description": "Lead score 0-100: no/weak website, contactable, active and reviewed businesses score higher"
     },
     "lead_reason": {
      "type": "string",
      "description": "Why this business is a lead"
     },
     "website_audited": {
      "type": "boolean",
      "description": "The website was checked (auditWebsites)"
     },
     "website_audit_status": {
      "type": [
       "string",
       "null"
      ],
      "description": "ok, blocked (bot protection or access denied: the site works for people, so no issues are reported) or unreachable"
     },
     "website_issues": {
      "type": "array",
      "description": "Problems found: unreachable, broken (404/5xx), ssl_error, no_https, not_mobile_friendly, no_title, outdated, parked_or_empty, slow (over 20 s)",
      "items": {
       "type": "string"
      }
     },
     "website_reachable": {
      "type": [
       "boolean",
       "null"
      ],
      "description": "Website loaded"
     },
     "website_status_code": {
      "type": [
       "integer",
       "null"
      ],
      "description": "HTTP status of the homepage"
     },
     "website_final_url": {
      "type": [
       "string",
       "null"
      ],
      "description": "URL after redirects"
     },
     "website_https": {
      "type": [
       "boolean",
       "null"
      ],
      "description": "Served over HTTPS"
     },
     "website_ssl_error": {
      "type": [
       "boolean",
       "null"
      ],
      "description": "SSL certificate problem"
     },
     "website_mobile_friendly": {
      "type": [
       "boolean",
       "null"
      ],
      "description": "Has a mobile viewport tag"
     },
     "website_load_secs": {
      "type": [
       "number",
       "null"
      ],
      "description": "Seconds to load the homepage HTML"
     },
     "website_copyright_year": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Latest copyright year on the page"
     },
     "website_platform": {
      "type": [
       "string",
       "null"
      ],
      "description": "Site builder / CMS detected (wix, squarespace, wordpress, godaddy, ...)"
     },
     "website_title": {
      "type": [
       "string",
       "null"
      ],
      "description": "Homepage title"
     },
     "google_maps_url": {
      "type": [
       "string",
       "null"
      ],
      "description": "Google Maps link to the listing"
     },
     "place_id": {
      "type": [
       "string",
       "null"
      ],
      "description": "Google place ID"
     },
     "cid": {
      "type": [
       "string",
       "null"
      ],
      "description": "Google CID"
     },
     "search_term": {
      "type": "string",
      "description": "Business type searched"
     },
     "search_location": {
      "type": [
       "string",
       "null"
      ],
      "description": "Location searched"
     },
     "rank_in_search": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Position in the Google Maps results"
     },
     "scraped_at": {
      "type": "string",
      "description": "When the row was produced (ISO 8601, UTC)"
     }
    },
    "required": [
     "business_name",
     "website_type",
     "has_real_website",
     "lead_score",
     "lead_reason",
     "website_audited",
     "website_issues",
     "search_term",
     "scraped_at"
    ]
   },
   "CompanyNameToDomainInput": {
    "type": "object",
    "properties": {
     "companies": {
      "title": "Company names",
      "type": "array",
      "description": "One company per line. Optionally add a hint after a <code>|</code> to tell similar names apart: a city, country or industry, e.g. <code>Delta | airline</code>, <code>Franklin Barbecue | Austin, TX</code>, <code>Rossmann | Germany</code>. Legal suffixes like Inc, LLC or GmbH are handled automatically.",
      "items": {
       "type": "string"
      }
     },
     "records": {
      "title": "Company records (JSON)",
      "type": "array",
      "description": "Optional. Company objects, e.g. <code>[{\"name\": \"Bolt\", \"country\": \"Estonia\", \"industry\": \"ride-hailing\", \"id\": \"crm-123\"}]</code>. Recognized keys: <code>name</code>/<code>company</code>, <code>country</code>, <code>city</code>/<code>location</code>, <code>industry</code>/<code>category</code>, <code>hint</code>. The whole record is returned in <code>inputRecord</code> so you can join results back to your CRM."
     },
     "csvData": {
      "title": "CSV rows",
      "type": "string",
      "description": "Optional. Paste CSV (comma, semicolon or tab separated). With a header row, the column named <code>name</code>/<code>company</code> is used and <code>country</code>, <code>city</code>, <code>industry</code> columns become hints. Without a header, the first column is the company name and the other columns are used as hints."
     },
     "country": {
      "title": "Default country",
      "type": "string",
      "description": "Optional country applied to every company without its own country (name or 2-letter code, e.g. <code>Germany</code> or <code>DE</code>). Prefers that country's domains (e.g. .de) and companies registered there."
     },
     "minConfidence": {
      "title": "Minimum confidence (0-100)",
      "minimum": 0,
      "maximum": 100,
      "type": "integer",
      "description": "A domain is returned (and charged) only when its confidence score is at least this value. Default 60 was ~98-100% precise on our test sets. Raise it to 80 for even fewer false positives; lower it to get more best guesses.",
      "default": 60
     },
     "searchFallback": {
      "title": "Web search fallback",
      "enum": [
       "auto",
       "always",
       "never"
      ],
      "type": "string",
      "description": "<b>Auto</b> (recommended): search the web only when the free sources are not confident enough. <b>Always</b>: search for every company (slower). <b>Never</b>: only Clearbit autocomplete, Wikidata and domain guesses.",
      "default": "auto"
     },
     "searchEngine": {
      "title": "Search engine for the fallback",
      "enum": [
       "bing",
       "google"
      ],
      "type": "string",
      "description": "<b>Bing / DuckDuckGo</b> via Apify Proxy. <b>Google</b> via Apify's Google SERP proxy gives the best results for small local businesses (only works on the Apify platform).",
      "default": "bing"
     },
     "useClearbit": {
      "title": "Use Clearbit autocomplete",
      "type": "boolean",
      "description": "Use the free public Clearbit company autocomplete as one of the candidate sources.",
      "default": true
     },
     "useWikidata": {
      "title": "Use Wikidata",
      "type": "boolean",
      "description": "Use the official website (P856) recorded on Wikidata as one of the candidate sources.",
      "default": true
     },
     "includeUnresolved": {
      "title": "Include unresolved companies",
      "type": "boolean",
      "description": "Also output a row (free of charge) for companies where no domain reached the minimum confidence, with the best guess and alternatives, so your output has one row per input.",
      "default": true
     },
     "maxAlternatives": {
      "title": "Max alternative domains per company",
      "minimum": 0,
      "maximum": 10,
      "type": "integer",
      "description": "How many runner-up candidate domains to include (with their own confidence).",
      "default": 3
     },
     "maxConcurrency": {
      "title": "Max concurrency",
      "minimum": 1,
      "maximum": 50,
      "type": "integer",
      "description": "How many companies are resolved in parallel.",
      "default": 20
     },
     "proxyConfiguration": {
      "title": "Proxy configuration",
      "type": "object",
      "description": "Proxy used for the web search fallback (Bing / DuckDuckGo). Homepages, Clearbit and Wikidata are fetched directly.",
      "default": {
       "useApifyProxy": true
      }
     }
    }
   },
   "CompanyNameToDomainRow": {
    "type": "object",
    "properties": {
     "input": {
      "type": "string",
      "description": "The input line / name as given"
     },
     "companyName": {
      "type": "string",
      "description": "Company name that was looked up"
     },
     "status": {
      "type": "string",
      "description": "found (charged), low_confidence, not_found or error (free)"
     },
     "domain": {
      "type": [
       "string",
       "null"
      ],
      "description": "Best official website domain (registrable domain, e.g. stripe.com)"
     },
     "confidence": {
      "type": "integer",
      "description": "Confidence score 0-100"
     },
     "website": {
      "type": [
       "string",
       "null"
      ],
      "description": "Homepage URL after redirects"
     },
     "companyNameFound": {
      "type": [
       "string",
       "null"
      ],
      "description": "Company name as found on the website / sources"
     },
     "title": {
      "type": [
       "string",
       "null"
      ],
      "description": "Homepage <title>"
     },
     "description": {
      "type": [
       "string",
       "null"
      ],
      "description": "Homepage meta description"
     },
     "linkedinUrl": {
      "type": [
       "string",
       "null"
      ],
      "description": "LinkedIn company page linked from the homepage"
     },
     "logoUrl": {
      "type": [
       "string",
       "null"
      ],
      "description": "Logo URL found on the homepage"
     },
     "faviconUrl": {
      "type": [
       "string",
       "null"
      ],
      "description": "Favicon URL"
     },
     "finalUrl": {
      "type": [
       "string",
       "null"
      ],
      "description": "Final URL after redirects"
     },
     "redirectedFrom": {
      "type": [
       "string",
       "null"
      ],
      "description": "Original candidate domain if it redirected to the returned domain"
     },
     "isLive": {
      "type": [
       "boolean",
       "null"
      ],
      "description": "Homepage answered over HTTP(S)"
     },
     "httpStatus": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Homepage HTTP status"
     },
     "sources": {
      "type": "array",
      "description": "Signals that pointed to this domain: clearbit, wikidata, search, guess"
     },
     "wikidataId": {
      "type": [
       "string",
       "null"
      ],
      "description": "Wikidata entity ID if matched"
     },
     "alternatives": {
      "type": "array",
      "description": "Runner-up candidates: {domain, confidence, sources, title, isLive, isParked}"
     },
     "bestGuess": {
      "type": [
       "object",
       "null"
      ],
      "description": "Top candidate when below the confidence threshold"
     },
     "hint": {
      "type": [
       "object",
       "null"
      ],
      "description": "Hints used (country, city, industry, text)"
     },
     "inputRecord": {
      "type": [
       "object",
       "null"
      ],
      "description": "Your original record (records / CSV input)"
     },
     "error": {
      "type": [
       "string",
       "null"
      ]
     },
     "checkedAt": {
      "type": "string",
      "description": "UTC timestamp"
     }
    },
    "required": [
     "input",
     "companyName",
     "status",
     "confidence"
    ]
   },
   "CompetitorKeywordsInput": {
    "type": "object",
    "required": [
     "domains"
    ],
    "properties": {
     "domains": {
      "title": "Domains or page URLs",
      "minItems": 1,
      "type": "array",
      "description": "Competitor domains (e.g. <code>example.com</code>) or full page URLs (e.g. <code>https://example.com/blog/post</code>), one per line. <code>https://</code> and <code>www.</code> are removed automatically for domains.",
      "items": {
       "type": "string"
      }
     },
     "location": {
      "title": "Country",
      "type": "string",
      "description": "Country of the Google results: name (<code>United States</code>), 2-letter code (<code>GB</code>) or location code (<code>2840</code>).",
      "default": "United States"
     },
     "language": {
      "title": "Language",
      "type": "string",
      "description": "Language name or code (<code>English</code>, <code>de</code>). Leave empty for the main language of the country."
     },
     "maxKeywordsPerDomain": {
      "title": "Max keywords per domain",
      "minimum": 1,
      "maximum": 50000,
      "type": "integer",
      "description": "How many ranked keywords to return for each domain (up to 50,000). You pay per keyword returned.",
      "default": 100
     },
     "sortBy": {
      "title": "Sort by",
      "enum": [
       "search_volume",
       "traffic",
       "position"
      ],
      "type": "string",
      "description": "Which keywords come first (and are kept when you limit the number of keywords).",
      "default": "search_volume"
     },
     "minSearchVolume": {
      "title": "Minimum search volume",
      "minimum": 0,
      "type": "integer",
      "description": "Only return keywords with at least this many monthly searches. 0 = all.",
      "default": 0
     },
     "maxPosition": {
      "title": "Worst position to include",
      "minimum": 1,
      "maximum": 100,
      "type": "integer",
      "description": "Only return keywords where the domain ranks at this position or better (e.g. <code>10</code> = first page only). 100 = all.",
      "default": 100
     },
     "resultTypes": {
      "title": "Result types",
      "enum": [
       "organic",
       "organic_paid",
       "all"
      ],
      "type": "string",
      "description": "Which Google result types count as a ranking.",
      "default": "organic"
     },
     "includeSubdomains": {
      "title": "Include subdomains",
      "type": "boolean",
      "description": "Count rankings of subdomains (e.g. <code>blog.example.com</code>) for a domain.",
      "default": true
     }
    }
   },
   "CompetitorKeywordsRow": {
    "$schema": "http://json-schema.org/draft-07/schema#",
    "type": "object",
    "properties": {
     "domain": {
      "type": "string",
      "description": "Domain or page URL the keywords were looked up for"
     },
     "keyword": {
      "type": "string",
      "description": "Keyword the domain ranks for in Google"
     },
     "position": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Google rank among results of the same type (1 = top)"
     },
     "position_absolute": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Absolute position on the results page, counting all SERP elements"
     },
     "result_type": {
      "type": [
       "string",
       "null"
      ],
      "description": "Type of the ranking result: organic, paid, featured_snippet, local_pack or ai_overview_reference"
     },
     "url": {
      "type": [
       "string",
       "null"
      ],
      "description": "URL of the ranking page"
     },
     "title": {
      "type": [
       "string",
       "null"
      ],
      "description": "Title of the ranking result"
     },
     "search_volume": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Average monthly Google searches for the keyword"
     },
     "cpc": {
      "type": [
       "number",
       "null"
      ],
      "description": "Average Google Ads cost per click (USD)"
     },
     "competition": {
      "type": [
       "string",
       "null"
      ],
      "description": "Google Ads competition level: LOW, MEDIUM or HIGH"
     },
     "keyword_difficulty": {
      "type": [
       "integer",
       "null"
      ],
      "description": "SEO keyword difficulty, 0-100 (higher = harder to rank)"
     },
     "search_intent": {
      "type": [
       "string",
       "null"
      ],
      "description": "Main search intent: informational, navigational, commercial or transactional"
     },
     "estimated_traffic": {
      "type": [
       "number",
       "null"
      ],
      "description": "Estimated monthly organic visits this ranking brings the domain"
     },
     "estimated_traffic_cost_usd": {
      "type": [
       "number",
       "null"
      ],
      "description": "What that traffic would cost per month in Google Ads (USD)"
     },
     "previous_position": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Previous absolute position, when known"
     },
     "position_change": {
      "type": [
       "string",
       "null"
      ],
      "description": "Change since the previous check: new, up, down or same"
     },
     "serp_features": {
      "type": [
       "array",
       "null"
      ],
      "description": "SERP feature types present on the results page (e.g. people_also_ask, ai_overview)",
      "items": {
       "type": "string"
      }
     },
     "is_featured_snippet": {
      "type": [
       "boolean",
       "null"
      ],
      "description": "True when the ranking result is a featured snippet"
     },
     "search_volume_trend": {
      "type": [
       "object",
       "null"
      ],
      "description": "Search volume change in % (monthly, quarterly, yearly)"
     },
     "location": {
      "type": [
       "string",
       "null"
      ],
      "description": "Country the data is for, e.g. \"United States\""
     },
     "language": {
      "type": [
       "string",
       "null"
      ],
      "description": "Language name, e.g. \"English\""
     },
     "serp_checked_at": {
      "type": [
       "string",
       "null"
      ],
      "description": "When the Google results page was last checked (ISO 8601, UTC)"
     },
     "scraped_at": {
      "type": [
       "string",
       "null"
      ],
      "description": "When this row was produced (ISO 8601, UTC)"
     }
    },
    "required": [
     "domain",
     "keyword"
    ]
   },
   "DomainAuthorityTrafficCheckerInput": {
    "type": "object",
    "required": [
     "domains"
    ],
    "properties": {
     "domains": {
      "title": "Domains or URLs",
      "minItems": 1,
      "type": "array",
      "description": "One domain or URL per line (e.g. <code>stripe.com</code>, <code>https://www.shopify.com/</code>). Domains are normalized (scheme and <code>www.</code> stripped). Page URLs are kept when they include a path. Up to 100,000; processed in batches of 1,000. Duplicates are removed.",
      "items": {
       "type": "string"
      }
     },
     "mode": {
      "title": "Mode",
      "enum": [
       "bulk",
       "report"
      ],
      "type": "string",
      "description": "<b>Bulk</b>: one flat metrics row per domain (thousands supported). <b>Deep report</b>: one domain with top backlinks, referring domains, organic keywords and competitors (charged as a report).",
      "default": "bulk"
     },
     "metrics": {
      "title": "Metric groups (bulk mode)",
      "uniqueItems": true,
      "type": "array",
      "description": "Which metrics to fetch. <b>traffic</b> uses DataForSEO Labs only (works without the Backlinks API). Authority, backlinks, spam and new/lost need the Backlinks API (pay-as-you-go, no monthly commitment as of Jul 2026). <b>trafficValue</b> is a per-domain Labs call and costs more at scale.",
      "items": {
       "type": "string",
       "enum": [
        "traffic",
        "authority",
        "backlinks",
        "spamScore",
        "newLost",
        "trafficValue"
       ],
       "enumTitles": [
        "Traffic estimate (Labs)",
        "Domain rank / authority (Backlinks)",
        "Backlinks + referring domains (Backlinks)",
        "Spam score (Backlinks)",
        "New & lost links (Backlinks)",
        "Traffic value USD (Labs, per-domain)"
       ]
      },
      "default": [
       "traffic",
       "authority",
       "backlinks",
       "spamScore"
      ]
     },
     "location": {
      "title": "Location (for traffic metrics)",
      "type": "string",
      "description": "Country for organic/paid traffic estimates. Name or code: <code>United States</code>, <code>US</code>, <code>2840</code>.",
      "default": "United States"
     },
     "language": {
      "title": "Language (for traffic metrics)",
      "type": "string",
      "description": "Language name or code (<code>English</code>, <code>en</code>).",
      "default": "English"
     },
     "rankScale": {
      "title": "Domain rank scale",
      "enum": [
       "one_thousand",
       "one_hundred"
      ],
      "type": "string",
      "description": "Authority score scale from the Backlinks API: 0\u20131000 (default, closer to classic PageRank-style metrics) or 0\u2013100.",
      "default": "one_thousand"
     },
     "topBacklinks": {
      "title": "Top backlinks (report mode)",
      "minimum": 0,
      "maximum": 100,
      "type": "integer",
      "description": "How many top backlinks to include in a deep report. 0 to skip.",
      "default": 20
     },
     "topReferringDomains": {
      "title": "Top referring domains (report mode)",
      "minimum": 0,
      "maximum": 100,
      "type": "integer",
      "description": "How many top referring domains to include in a deep report. 0 to skip.",
      "default": 20
     },
     "topKeywords": {
      "title": "Top organic keywords (report mode)",
      "minimum": 0,
      "maximum": 100,
      "type": "integer",
      "description": "How many top organic keywords to include in a deep report. 0 to skip.",
      "default": 20
     },
     "topCompetitors": {
      "title": "Top competitors (report mode)",
      "minimum": 0,
      "maximum": 50,
      "type": "integer",
      "description": "How many SEO competitor domains to include in a deep report. 0 to skip.",
      "default": 10
     }
    }
   },
   "DomainAuthorityTrafficCheckerRow": {
    "type": "object",
    "properties": {
     "domain": {
      "type": "string",
      "description": "Normalized domain (or page host for reports)"
     },
     "input": {
      "type": "string",
      "description": "Original input domain or URL"
     },
     "mode": {
      "type": "string",
      "description": "bulk or report"
     },
     "found": {
      "type": "boolean",
      "description": "true if at least one requested metric was returned (only these rows are charged)"
     },
     "domain_rank": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Domain rank / authority score (DataForSEO Rank, not Ahrefs DR)"
     },
     "rank_scale": {
      "type": [
       "string",
       "null"
      ],
      "description": "0-1000 or 0-100"
     },
     "backlinks": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Live backlinks count"
     },
     "referring_domains": {
      "type": [
       "integer",
       "null"
      ]
     },
     "referring_domains_nofollow": {
      "type": [
       "integer",
       "null"
      ]
     },
     "referring_main_domains": {
      "type": [
       "integer",
       "null"
      ]
     },
     "referring_ips": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Referring IPs (deep report / summary)"
     },
     "referring_subnets": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Referring subnets (deep report / summary)"
     },
     "dofollow_backlinks": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Approx. dofollow referring pages (report mode)"
     },
     "nofollow_backlinks": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Nofollow referring pages (report mode)"
     },
     "spam_score": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Spam score 0-100"
     },
     "new_backlinks": {
      "type": [
       "integer",
       "null"
      ]
     },
     "lost_backlinks": {
      "type": [
       "integer",
       "null"
      ]
     },
     "new_referring_domains": {
      "type": [
       "integer",
       "null"
      ]
     },
     "lost_referring_domains": {
      "type": [
       "integer",
       "null"
      ]
     },
     "organic_traffic": {
      "type": [
       "number",
       "null"
      ],
      "description": "Estimated monthly organic traffic (ETV)"
     },
     "organic_keywords": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Organic keyword / SERP count"
     },
     "paid_traffic": {
      "type": [
       "number",
       "null"
      ]
     },
     "paid_keywords": {
      "type": [
       "integer",
       "null"
      ]
     },
     "traffic_value_usd": {
      "type": [
       "number",
       "null"
      ],
      "description": "Estimated monthly traffic value in USD"
     },
     "top_countries": {
      "type": [
       "array",
       "null"
      ],
      "description": "Top referring countries [{country, backlinks}] (report)"
     },
     "first_seen": {
      "type": [
       "string",
       "null"
      ],
      "description": "When the first backlink was seen (report)"
     },
     "location": {
      "type": [
       "string",
       "null"
      ]
     },
     "location_code": {
      "type": [
       "integer",
       "null"
      ]
     },
     "language": {
      "type": [
       "string",
       "null"
      ]
     },
     "language_code": {
      "type": [
       "string",
       "null"
      ]
     },
     "metrics_available": {
      "type": "array",
      "description": "Which metric groups were filled"
     },
     "note": {
      "type": [
       "string",
       "null"
      ]
     },
     "error": {
      "type": [
       "string",
       "null"
      ]
     },
     "scraped_at": {
      "type": "string"
     },
     "top_backlinks": {
      "type": [
       "array",
       "null"
      ]
     },
     "top_referring_domains": {
      "type": [
       "array",
       "null"
      ]
     },
     "top_organic_keywords": {
      "type": [
       "array",
       "null"
      ]
     },
     "competitors": {
      "type": [
       "array",
       "null"
      ]
     }
    },
    "required": [
     "domain",
     "mode",
     "found"
    ]
   },
   "GoogleAdsTransparencyScraperInput": {
    "type": "object",
    "required": [
     "targets"
    ],
    "properties": {
     "targets": {
      "title": "Advertisers, domains or Transparency URLs",
      "type": "array",
      "description": "One per line. Accepts: an <b>advertiser name</b> (<code>Nike</code>), an <b>advertiser ID</b> (<code>AR16735076323512287233</code>), a <b>website domain</b> (<code>grammarly.com</code> - returns every advertiser running ads for that site), or any <b>Ads Transparency Center URL</b> (advertiser page, single creative page, or a domain search; filters in the URL such as <code>region</code>, <code>platform</code>, <code>format</code> and dates are respected).",
      "default": [
       "Nike"
      ],
      "items": {
       "type": "string"
      }
     },
     "maxAdsPerTarget": {
      "title": "Max ads per advertiser / domain",
      "minimum": 1,
      "maximum": 20000,
      "type": "integer",
      "description": "How many ad creatives to return for each target, newest (most recently shown) first. Big brands have thousands of ads.",
      "default": 50
     },
     "region": {
      "title": "Region (where the ad was shown)",
      "enum": [
       "anywhere",
       "AF",
       "AL",
       "DZ",
       "AS",
       "AD",
       "AO",
       "AI",
       "AQ",
       "AG",
       "AR",
       "AM",
       "AW",
       "AU",
       "AT",
       "AZ",
       "BH",
       "BD",
       "BB",
       "BY",
       "BE",
       "BZ",
       "BJ",
       "BM",
       "BT",
       "BO",
       "BA",
       "BW",
       "BV",
       "BR",
       "IO",
       "VG",
       "BN",
       "BG",
       "BF",
       "BI",
       "CV",
       "KH",
       "CM",
       "CA",
       "IC",
       "BQ",
       "KY",
       "CF",
       "TD",
       "CL",
       "CN",
       "CX",
       "CC",
       "CO",
       "KM",
       "CK",
       "CR",
       "CI",
       "HR",
       "CW",
       "CY",
       "CZ",
       "CD",
       "DK",
       "DJ",
       "DM",
       "DO",
       "EC",
       "EG",
       "SV",
       "GQ",
       "ER",
       "EE",
       "SZ",
       "ET",
       "FK",
       "FO",
       "FJ",
       "FI",
       "FR",
       "GF",
       "PF",
       "TF",
       "GA",
       "GE",
       "DE",
       "GH",
       "GI",
       "GR",
       "GL",
       "GD",
       "GP",
       "GU",
       "GT",
       "GG",
       "GN",
       "GW",
       "GY",
       "HT",
       "HM",
       "HN",
       "HK",
       "HU",
       "IS",
       "IN",
       "ID",
       "IQ",
       "IE",
       "IM",
       "IL",
       "IT",
       "JM",
       "JP",
       "JE",
       "JO",
       "KZ",
       "KE",
       "KI",
       "XK",
       "KW",
       "KG",
       "LA",
       "LV",
       "LB",
       "LS",
       "LR",
       "LY",
       "LI",
       "LT",
       "LU",
       "MO",
       "MG",
       "MW",
       "MY",
       "MV",
       "ML",
       "MT",
       "MH",
       "MQ",
       "MR",
       "MU",
       "YT",
       "MX",
       "FM",
       "MD",
       "MC",
       "MN",
       "ME",
       "MS",
       "MA",
       "MZ",
       "MM",
       "NA",
       "NR",
       "NP",
       "NL",
       "NC",
       "NZ",
       "NI",
       "NE",
       "NG",
       "NU",
       "NF",
       "MK",
       "MP",
       "NO",
       "OM",
       "PK",
       "PW",
       "PS",
       "PA",
       "PG",
       "PY",
       "PE",
       "PH",
       "PN",
       "PL",
       "PT",
       "PR",
       "QA",
       "CG",
       "RE",
       "RO",
       "RW",
       "SH",
       "KN",
       "LC",
       "MF",
       "PM",
       "VC",
       "WS",
       "SM",
       "ST",
       "SA",
       "SN",
       "RS",
       "SC",
       "SL",
       "SG",
       "SX",
       "SK",
       "SI",
       "SB",
       "SO",
       "ZA",
       "GS",
       "KR",
       "SS",
       "ES",
       "LK",
       "SD",
       "SR",
       "SJ",
       "SE",
       "CH",
       "TW",
       "TJ",
       "TZ",
       "TH",
       "BS",
       "GM",
       "TL",
       "TG",
       "TK",
       "TO",
       "TT",
       "TN",
       "TR",
       "TM",
       "TC",
       "TV",
       "VI",
       "UG",
       "UA",
       "AE",
       "GB",
       "US",
       "UM",
       "UY",
       "UZ",
       "VU",
       "VA",
       "VE",
       "VN",
       "WF",
       "EH",
       "YE",
       "ZM",
       "ZW"
      ],
      "type": "string",
      "description": "Only ads shown in this country. <i>Anywhere</i> = all regions.",
      "default": "anywhere"
     },
     "lastDays": {
      "title": "Shown in the last N days",
      "minimum": 1,
      "maximum": 2000,
      "type": "integer",
      "description": "Only ads shown at least once in the last N days (e.g. <code>30</code>). Overrides the date range below."
     },
     "dateFrom": {
      "title": "Shown from (date)",
      "type": "string",
      "description": "Only ads shown on or after this date (YYYY-MM-DD). Data starts in 2018."
     },
     "dateTo": {
      "title": "Shown until (date)",
      "type": "string",
      "description": "Only ads shown on or before this date (YYYY-MM-DD). Default: today."
     },
     "formats": {
      "title": "Ad formats",
      "type": "array",
      "description": "Leave empty for all formats.",
      "items": {
       "type": "string",
       "enum": [
        "TEXT",
        "IMAGE",
        "VIDEO"
       ],
       "enumTitles": [
        "Text",
        "Image",
        "Video"
       ]
      }
     },
     "platforms": {
      "title": "Platforms",
      "type": "array",
      "description": "Leave empty for all platforms (this also includes Display-network ads, which have no separate filter in the Transparency Center).",
      "items": {
       "type": "string",
       "enum": [
        "GOOGLE_SEARCH",
        "YOUTUBE",
        "GOOGLE_SHOPPING",
        "GOOGLE_MAPS",
        "GOOGLE_PLAY"
       ],
       "enumTitles": [
        "Google Search",
        "YouTube",
        "Google Shopping",
        "Google Maps",
        "Google Play"
       ]
      }
     },
     "includeDetails": {
      "title": "Include regions, impressions & platforms",
      "type": "boolean",
      "description": "Open each ad's detail record: every region it ran in with first/last shown dates, impression ranges and per-platform breakdown (impressions and platforms are published for EU/EEA regions), topic and targeting categories. Turn off for a faster list-only scrape.",
      "default": true
     },
     "extractAdText": {
      "title": "Extract ad text (headline, description, URLs)",
      "type": "boolean",
      "description": "Read headline, description, call to action, display/landing URL, YouTube video ID and image URLs from the ad previews.",
      "default": true
     },
     "ocrTextAds": {
      "title": "OCR text ads stored as images",
      "type": "boolean",
      "description": "Google archives most Search text ads only as a rendered image. With this on, the Actor reads the headline, description, display URL and sitelinks from that image with OCR (marked <code>textSource: \"ocr\"</code>).",
      "default": true
     },
     "ocrLanguage": {
      "title": "OCR language",
      "enum": [
       "auto",
       "eng",
       "deu",
       "fra",
       "spa",
       "ita",
       "por",
       "nld",
       "pol",
       "swe",
       "dan",
       "nor",
       "fin",
       "tur",
       "ces",
       "slk",
       "ron",
       "hun",
       "hrv",
       "ind",
       "vie",
       "rus",
       "ukr",
       "ell",
       "jpn",
       "kor",
       "chi_sim",
       "chi_tra",
       "ara",
       "heb",
       "hin",
       "tha"
      ],
      "type": "string",
      "description": "Language model used to read text ads archived as images. Automatic picks the language of the selected region, of the countries the ad ran in, or of the domain (e.g. zalando.de -> German), and English otherwise. Latin-script models read English text too.",
      "default": "auto"
     },
     "advertiserSummary": {
      "title": "Add a summary row per advertiser",
      "type": "boolean",
      "description": "One extra row per advertiser (<code>type: \"summary\"</code>) with active ad count, total ads estimate, format and platform mix and top regions. Summary rows are free.",
      "default": true
     },
     "maxAdvertisersPerName": {
      "title": "Advertisers per name",
      "minimum": 1,
      "maximum": 10,
      "type": "integer",
      "description": "A name can match several advertiser accounts (e.g. regional subsidiaries). How many of the best matches to scrape.",
      "default": 1
     },
     "monitorMode": {
      "title": "Monitoring mode: output only new and stopped ads",
      "type": "boolean",
      "description": "Compares each target with the previous run (state kept in a named key-value store) and outputs only ads that are <b>NEW</b> since the last run or have <b>STOPPED</b> running (<code>changeType</code> field). Schedule the Actor daily or weekly for competitor-ad alerts.",
      "default": false
     },
     "monitorStoreName": {
      "title": "Monitoring state store name",
      "type": "string",
      "description": "Named key-value store that keeps the last-seen ads per target. Use different names to keep independent watch lists.",
      "default": "google-ads-transparency-monitor"
     },
     "activeWithinDays": {
      "title": "Ad counts as active if shown within (days)",
      "minimum": 1,
      "maximum": 365,
      "type": "integer",
      "description": "An ad whose last-shown date is older than this is treated as inactive (<code>isActive: false</code>) and, in monitoring mode, reported as STOPPED.",
      "default": 7
     },
     "emitBaselineOnFirstRun": {
      "title": "Output all ads on the first monitoring run",
      "type": "boolean",
      "description": "On the first run for a target there is nothing to compare with, so every current ad is reported as NEW. Turn off to silently store the baseline and only report changes from the second run on.",
      "default": true
     },
     "proxyConfiguration": {
      "title": "Proxy configuration",
      "type": "object",
      "description": "Apify Proxy is used by default (datacenter first, automatic residential fallback if Google throttles).",
      "default": {
       "useApifyProxy": true
      }
     },
     "residentialFallback": {
      "title": "Fall back to residential proxy",
      "type": "boolean",
      "description": "If datacenter IPs are throttled, retry through Apify residential proxy automatically.",
      "default": true
     },
     "maxConcurrency": {
      "title": "Max concurrent requests",
      "minimum": 1,
      "maximum": 30,
      "type": "integer",
      "description": "Parallel requests to the Transparency Center.",
      "default": 8
     },
     "dataForSeoFallback": {
      "title": "Backup data source (DataForSEO)",
      "type": "boolean",
      "description": "Only for self-hosted copies with DATAFORSEO_LOGIN / DATAFORSEO_PASSWORD environment variables: if the Transparency Center request fails, fetch the ad list from DataForSEO instead (list data only).",
      "default": false
     }
    }
   },
   "GoogleAdsTransparencyScraperRow": {
    "type": "object",
    "properties": {
     "type": {
      "type": [
       "string",
       "null"
      ],
      "description": "Row type: ad, summary or error (summary and error rows are free)"
     },
     "changeType": {
      "type": [
       "string",
       "null"
      ],
      "description": "Monitoring mode: NEW (first seen), STOPPED (no longer running or removed) or RESUMED (stopped before, running again)"
     },
     "previewImageUrl": {
      "type": [
       "string",
       "null"
      ],
      "description": "Rendered preview image of the ad (text ads are archived as images)"
     },
     "advertiserName": {
      "type": [
       "string",
       "null"
      ],
      "description": "Advertiser name as shown in the Transparency Center"
     },
     "advertiserId": {
      "type": [
       "string",
       "null"
      ],
      "description": "Advertiser ID (AR...)"
     },
     "advertiserVerified": {
      "type": [
       "boolean",
       "null"
      ],
      "description": "Advertiser identity verified by Google"
     },
     "advertiserCountry": {
      "type": [
       "string",
       "null"
      ],
      "description": "Advertiser country (ISO code)"
     },
     "advertiserLegalName": {
      "type": [
       "string",
       "null"
      ],
      "description": "Advertiser legal name"
     },
     "creativeId": {
      "type": [
       "string",
       "null"
      ],
      "description": "Ad creative ID (CR...)"
     },
     "format": {
      "type": [
       "string",
       "null"
      ],
      "description": "TEXT, IMAGE or VIDEO"
     },
     "headline": {
      "type": [
       "string",
       "null"
      ],
      "description": "Ad headline"
     },
     "description": {
      "type": [
       "string",
       "null"
      ],
      "description": "Ad description / body text"
     },
     "longHeadline": {
      "type": [
       "string",
       "null"
      ],
      "description": "Long headline (responsive display / video ads)"
     },
     "callToAction": {
      "type": [
       "string",
       "null"
      ],
      "description": "Call-to-action text"
     },
     "displayUrl": {
      "type": [
       "string",
       "null"
      ],
      "description": "Display URL shown in the ad"
     },
     "businessName": {
      "type": [
       "string",
       "null"
      ],
      "description": "Business / brand name shown in the ad"
     },
     "sitelinks": {
      "type": [
       "array",
       "null"
      ],
      "description": "Sitelink texts (text ads, OCR)"
     },
     "productTitle": {
      "type": [
       "string",
       "null"
      ],
      "description": "Product title (Shopping ads)"
     },
     "merchant": {
      "type": [
       "string",
       "null"
      ],
      "description": "Merchant (Shopping ads)"
     },
     "textSource": {
      "type": [
       "string",
       "null"
      ],
      "description": "Where the ad text came from: preview (structured) or ocr (read from the ad image)"
     },
     "ocrConfidence": {
      "type": [
       "number",
       "null"
      ],
      "description": "Average OCR confidence 0-100"
     },
     "ocrLanguage": {
      "type": [
       "string",
       "null"
      ],
      "description": "OCR language model used (tesseract code, e.g. eng, deu, jpn)"
     },
     "landingUrl": {
      "type": [
       "string",
       "null"
      ],
      "description": "Final/destination URL when the preview exposes it"
     },
     "landingDomain": {
      "type": [
       "string",
       "null"
      ],
      "description": "Domain the ad points to"
     },
     "imageUrls": {
      "type": [
       "array",
       "null"
      ],
      "description": "Image asset URLs"
     },
     "videoId": {
      "type": [
       "string",
       "null"
      ],
      "description": "YouTube video ID (video ads)"
     },
     "videoUrl": {
      "type": [
       "string",
       "null"
      ],
      "description": "YouTube video URL"
     },
     "videoTitle": {
      "type": [
       "string",
       "null"
      ],
      "description": "YouTube video title (video ads)"
     },
     "videoThumbnailUrl": {
      "type": [
       "string",
       "null"
      ],
      "description": "YouTube thumbnail"
     },
     "youtubeChannel": {
      "type": [
       "string",
       "null"
      ],
      "description": "YouTube channel name"
     },
     "videoDuration": {
      "type": [
       "string",
       "null"
      ],
      "description": "Video duration"
     },
     "firstShown": {
      "type": [
       "string",
       "null"
      ],
      "description": "First time the ad was shown (UTC)"
     },
     "lastShown": {
      "type": [
       "string",
       "null"
      ],
      "description": "Last time the ad was shown (UTC)"
     },
     "daysShown": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Number of days the ad was shown"
     },
     "isActive": {
      "type": [
       "boolean",
       "null"
      ],
      "description": "Shown within the last activeWithinDays days"
     },
     "regionCodes": {
      "type": [
       "array",
       "null"
      ],
      "description": "Countries where the ad was shown"
     },
     "regions": {
      "type": [
       "array",
       "null"
      ],
      "description": "Per region: first/last shown, impression range and per-platform impressions (impressions published for EU/EEA)"
     },
     "impressionsMin": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Total impressions, lower bound (EU/EEA)"
     },
     "impressionsMax": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Total impressions, upper bound (EU/EEA)"
     },
     "platforms": {
      "type": [
       "array",
       "null"
      ],
      "description": "Platforms the ad ran on (GOOGLE_SEARCH, YOUTUBE, GOOGLE_SHOPPING, GOOGLE_MAPS, GOOGLE_PLAY)"
     },
     "topic": {
      "type": [
       "string",
       "null"
      ],
      "description": "Ad topic / vertical"
     },
     "targeting": {
      "type": [
       "object",
       "null"
      ],
      "description": "Targeting criteria used (EU/EEA disclosure): demographics, locations, contextual signals, customer lists, topics of interest"
     },
     "variationsCount": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Number of ad variations"
     },
     "adUrl": {
      "type": [
       "string",
       "null"
      ],
      "description": "Ad page in the Google Ads Transparency Center"
     },
     "detailsError": {
      "type": [
       "string",
       "null"
      ],
      "description": "Why details could not be loaded (row still returned)"
     },
     "adsInThisRun": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Summary: ads returned for this advertiser"
     },
     "activeAdCount": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Summary: ads shown within activeWithinDays"
     },
     "newThisRun": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Summary (monitoring): new ads this run"
     },
     "stoppedThisRun": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Summary (monitoring): stopped ads this run"
     },
     "totalAdsMin": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Summary: total ads Google reports for the target and filters (lower bound; the same for every advertiser of a domain target)"
     },
     "totalAdsMax": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Summary: total ads Google reports for the target and filters (upper bound)"
     },
     "formatsMix": {
      "type": [
       "object",
       "null"
      ],
      "description": "Summary: ads per format"
     },
     "platformsMix": {
      "type": [
       "object",
       "null"
      ],
      "description": "Summary: ads per platform"
     },
     "topRegions": {
      "type": [
       "object",
       "null"
      ],
      "description": "Summary: ads per region"
     },
     "adsWithText": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Summary: ads with extracted text"
     },
     "matchedBy": {
      "type": [
       "string",
       "null"
      ],
      "description": "Summary: how a name input was matched (exact-name, domain-suggestion, ...)"
     },
     "advertiserUrl": {
      "type": [
       "string",
       "null"
      ],
      "description": "Summary: advertiser page in the Transparency Center"
     },
     "input": {
      "type": [
       "string",
       "null"
      ],
      "description": "Error rows: the input that failed"
     },
     "error": {
      "type": [
       "string",
       "null"
      ],
      "description": "Error rows: reason"
     },
     "target": {
      "type": [
       "object",
       "null"
      ],
      "description": "Input target and filters this row came from"
     },
     "scrapedAt": {
      "type": [
       "string",
       "null"
      ],
      "description": "Scrape time (UTC)"
     },
     "newestAdFirstShown": {
      "type": [
       "string",
       "null"
      ],
      "description": "Summary: most recent first-shown date among the ads"
     },
     "latestShown": {
      "type": [
       "string",
       "null"
      ],
      "description": "Summary: most recent last-shown date"
     },
     "allAdsFetched": {
      "type": [
       "boolean",
       "null"
      ],
      "description": "Summary: true when all ads of the target were fetched (not capped by maxAdsPerTarget)"
     },
     "firstMonitoringRun": {
      "type": [
       "boolean",
       "null"
      ],
      "description": "Summary (monitoring): true on the first (baseline) run"
     },
     "monitoringRun": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Summary (monitoring): run number for this target"
     },
     "note": {
      "type": [
       "string",
       "null"
      ],
      "description": "Summary: note, e.g. why no ads were found"
     },
     "source": {
      "type": [
       "string",
       "null"
      ],
      "description": "Data source: Transparency Center (default) or dataforseo (optional fallback)"
     }
    }
   },
   "GoogleAiOverviewScraperInput": {
    "type": "object",
    "required": [
     "queries"
    ],
    "properties": {
     "queries": {
      "title": "Search queries",
      "minItems": 1,
      "type": "array",
      "description": "Google searches to check, one per line. Each query is one Google results page. Questions and comparisons (\"best crm for small business\", \"hubspot vs salesforce\") trigger AI Overviews most often.",
      "items": {
       "type": "string"
      }
     },
     "targetDomains": {
      "title": "Your domains (citation check)",
      "type": "array",
      "description": "Optional. Domains to look for among the AI Overview's cited sources, e.g. <code>hubspot.com</code>. Subdomains count. Each row then shows whether each domain is cited, at which source positions, and its organic position.",
      "items": {
       "type": "string"
      }
     },
     "brands": {
      "title": "Brands (mention check)",
      "type": "array",
      "description": "Optional. Brand names to look for in the AI Overview text (case-insensitive, whole words). Each row lists which brands are mentioned and which are not.",
      "items": {
       "type": "string"
      }
     },
     "location": {
      "title": "Location",
      "type": "string",
      "description": "Country name (<code>United States</code>), 2-letter code (<code>GB</code>), location code (<code>2840</code>), or a full Google location name for cities and regions (e.g. <code>London,England,United Kingdom</code>).",
      "default": "United States"
     },
     "language": {
      "title": "Language",
      "type": "string",
      "description": "Language name or code (<code>English</code>, <code>de</code>). Leave empty for the main language of the country."
     },
     "device": {
      "title": "Device",
      "enum": [
       "desktop",
       "mobile"
      ],
      "type": "string",
      "description": "Desktop or mobile Google results.",
      "default": "desktop"
     },
     "mode": {
      "title": "Speed",
      "enum": [
       "standard",
       "fast"
      ],
      "type": "string",
      "description": "<b>Standard</b> ($2.50 / 1,000 queries): results usually arrive in 10-30 seconds for the whole batch, sometimes a few minutes at peak times. <b>Fast</b> ($6 / 1,000 queries): every query is fetched live and in parallel, usually 5-25 seconds each, with no queue. Same data in both.",
      "default": "standard"
     },
     "includeOrganicResults": {
      "title": "Include organic top 10",
      "type": "boolean",
      "description": "Add the top 10 organic results (position, title, URL, domain, description) to each row. Free.",
      "default": true
     },
     "includePeopleAlsoAsk": {
      "title": "Include People Also Ask",
      "type": "boolean",
      "description": "Add the People Also Ask questions shown on the page. Free.",
      "default": true
     },
     "includeRelatedSearches": {
      "title": "Include related searches",
      "type": "boolean",
      "description": "Add the related searches from the bottom of the page. Free.",
      "default": true
     },
     "onlyWithAiOverview": {
      "title": "Only save queries with an AI Overview",
      "type": "boolean",
      "description": "Skip rows for queries where Google showed no AI Overview. They are still checked and charged; the run summary counts them.",
      "default": false
     }
    }
   },
   "GoogleAiOverviewScraperRow": {
    "$schema": "http://json-schema.org/draft-07/schema#",
    "type": "object",
    "properties": {
     "query": {
      "type": "string",
      "description": "Google search checked"
     },
     "has_ai_overview": {
      "type": [
       "boolean",
       "null"
      ],
      "description": "Whether Google showed an AI Overview (null if the query failed)"
     },
     "status": {
      "type": "string",
      "description": "ai_overview, no_ai_overview or failed (failed queries are not charged)"
     },
     "ai_overview_text": {
      "type": [
       "string",
       "null"
      ],
      "description": "AI Overview as plain text"
     },
     "ai_overview_markdown": {
      "type": [
       "string",
       "null"
      ],
      "description": "AI Overview as Markdown (headings, lists, bold)"
     },
     "ai_overview_word_count": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Words in the AI Overview"
     },
     "ai_overview_sections": {
      "type": [
       "array",
       "null"
      ],
      "description": "Sections of the AI Overview with title, text and the positions of the sources each section cites"
     },
     "ai_overview_is_async": {
      "type": [
       "boolean",
       "null"
      ],
      "description": "True when Google loaded the AI Overview after the page (captured anyway)"
     },
     "references": {
      "type": [
       "array",
       "null"
      ],
      "description": "Every cited source: position, title, source name, domain, URL, snippet"
     },
     "reference_count": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Number of unique cited sources"
     },
     "referenced_domains": {
      "type": [
       "array",
       "null"
      ],
      "description": "Unique cited domains, in citation order"
     },
     "target_domains": {
      "type": [
       "array",
       "null"
      ],
      "description": "Per domain from your input: cited (true/false), source positions, organic position"
     },
     "target_cited": {
      "type": [
       "boolean",
       "null"
      ],
      "description": "True if any of your domains is cited"
     },
     "target_first_reference_position": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Best (lowest) source position of your domains"
     },
     "brands_mentioned": {
      "type": [
       "array",
       "null"
      ],
      "description": "Brands from your input that appear in the AI Overview text"
     },
     "brands_not_mentioned": {
      "type": [
       "array",
       "null"
      ],
      "description": "Brands from your input that do not appear"
     },
     "organic_results": {
      "type": [
       "array",
       "null"
      ],
      "description": "Organic top 10: position, title, URL, domain, description"
     },
     "people_also_ask": {
      "type": [
       "array",
       "null"
      ],
      "description": "People Also Ask questions on the page"
     },
     "related_searches": {
      "type": [
       "array",
       "null"
      ],
      "description": "Related searches on the page"
     },
     "serp_features": {
      "type": [
       "array",
       "null"
      ],
      "description": "Result types on the page (ai_overview, organic, video, local_pack...)"
     },
     "google_url": {
      "type": [
       "string",
       "null"
      ],
      "description": "The Google search URL that was checked"
     },
     "error": {
      "type": [
       "string",
       "null"
      ],
      "description": "Why the query failed (failed rows only)"
     },
     "location": {
      "type": "string",
      "description": "Location searched from"
     },
     "language": {
      "type": "string",
      "description": "Search language"
     },
     "device": {
      "type": "string",
      "description": "desktop or mobile"
     },
     "checked_at": {
      "type": "string",
      "description": "When the page was checked (UTC, ISO 8601)"
     }
    }
   },
   "GoogleAutocompleteKeywordExpanderInput": {
    "type": "object",
    "required": [
     "seedKeywords"
    ],
    "properties": {
     "seedKeywords": {
      "title": "Seed keywords",
      "minItems": 1,
      "type": "array",
      "description": "Topics to expand, one per line (e.g. <code>running shoes</code>). Each seed is combined with the modifiers below and sent to autocomplete.",
      "items": {
       "type": "string"
      }
     },
     "country": {
      "title": "Country",
      "type": "string",
      "description": "Country of the suggestions: name (<code>United States</code>) or 2-letter code (<code>GB</code>, <code>DE</code>).",
      "default": "US"
     },
     "language": {
      "title": "Language",
      "type": "string",
      "description": "Language name or code (<code>English</code>, <code>de</code>).",
      "default": "English"
     },
     "expansions": {
      "title": "Expansions",
      "type": "array",
      "description": "How to expand each seed. <b>alphabet</b>: seed + a\u2026z. <b>numbers</b>: seed + 0\u20269. <b>questions</b>: how / what / why / \u2026 + seed. <b>prepositions</b>: seed + for / with / vs / near / \u2026 <b>commercial</b>: best / cheap / review / price / alternative / near me \u2026",
      "items": {
       "type": "string",
       "enum": [
        "alphabet",
        "numbers",
        "questions",
        "prepositions",
        "commercial"
       ],
       "enumTitles": [
        "A-Z (seed + letter)",
        "0-9 (seed + digit)",
        "Questions (how, what, why\u2026)",
        "Prepositions (for, with, vs, near\u2026)",
        "Buyer modifiers (best, cheap, review\u2026)"
       ]
      },
      "default": [
       "alphabet",
       "questions",
       "prepositions"
      ]
     },
     "maxKeywords": {
      "title": "Max keywords",
      "minimum": 1,
      "maximum": 50000,
      "type": "integer",
      "description": "Maximum number of unique keyword suggestions per run (shared across seeds). You pay per keyword returned.",
      "default": 500
     },
     "deepExpand": {
      "title": "Deep expand (2nd level)",
      "type": "boolean",
      "description": "Also run autocomplete on the first suggestions to find even longer long-tail phrases.",
      "default": false
     },
     "mustContainSeed": {
      "title": "Only keep suggestions that contain the seed",
      "type": "boolean",
      "description": "Drop suggestions that don't contain the seed keyword as written.",
      "default": false
     },
     "source": {
      "title": "Autocomplete source",
      "enum": [
       "google",
       "youtube"
      ],
      "type": "string",
      "description": "Google web search or YouTube search suggestions.",
      "default": "google"
     },
     "addSearchVolume": {
      "title": "Add search volume, CPC & difficulty",
      "type": "boolean",
      "description": "Enrich every suggestion with monthly search volume, CPC, competition, keyword difficulty and search intent (Google Search only, country level). Extra charge per enriched keyword, see Pricing.",
      "default": false
     }
    }
   },
   "GoogleAutocompleteKeywordExpanderRow": {
    "$schema": "http://json-schema.org/draft-07/schema#",
    "type": "object",
    "properties": {
     "keyword": {
      "type": "string",
      "description": "Autocomplete suggestion (normalized, lower-case)"
     },
     "seed_keyword": {
      "type": "string",
      "description": "Seed keyword the suggestion came from"
     },
     "expanded_from": {
      "type": [
       "string",
       "null"
      ],
      "description": "With deep expansion: the first-level suggestion that was expanded again"
     },
     "query": {
      "type": [
       "string",
       "null"
      ],
      "description": "Exact query sent to autocomplete (seed + modifier)"
     },
     "modifier": {
      "type": [
       "string",
       "null"
      ],
      "description": "Letter, digit, question word or preposition added to the seed"
     },
     "position": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Position of the suggestion in the autocomplete list (1 = top)"
     },
     "relevance": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Google suggest relevance score, when provided"
     },
     "depth": {
      "type": [
       "integer",
       "null"
      ],
      "description": "0 = from the seed, 1 = from deep expansion"
     },
     "word_count": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Number of words in the suggestion"
     },
     "is_question": {
      "type": [
       "boolean",
       "null"
      ],
      "description": "True when the suggestion is a question (how, what, why ...)"
     },
     "source": {
      "type": [
       "string",
       "null"
      ],
      "description": "google_autocomplete or youtube_autocomplete"
     },
     "country": {
      "type": [
       "string",
       "null"
      ],
      "description": "Country ISO code used, e.g. US"
     },
     "language": {
      "type": [
       "string",
       "null"
      ],
      "description": "Language code used, e.g. en"
     },
     "scraped_at": {
      "type": [
       "string",
       "null"
      ],
      "description": "When this row was produced (ISO 8601, UTC)"
     },
     "search_volume": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Average monthly Google searches (only with addSearchVolume)"
     },
     "cpc": {
      "type": [
       "number",
       "null"
      ],
      "description": "Average Google Ads cost per click in USD (only with addSearchVolume)"
     },
     "competition": {
      "type": [
       "string",
       "null"
      ],
      "description": "Google Ads competition level (only with addSearchVolume)"
     },
     "keyword_difficulty": {
      "type": [
       "integer",
       "null"
      ],
      "description": "SEO keyword difficulty 0-100 (only with addSearchVolume)"
     },
     "search_intent": {
      "type": [
       "string",
       "null"
      ],
      "description": "Main search intent (only with addSearchVolume)"
     }
    },
    "required": [
     "keyword",
     "seed_keyword"
    ]
   },
   "GoogleJobsScraperInput": {
    "type": "object",
    "required": [
     "queries"
    ],
    "properties": {
     "queries": {
      "title": "Search queries (job titles or keywords)",
      "minItems": 1,
      "type": "array",
      "description": "What you would type into Google Jobs, one per line, e.g. <code>data analyst</code>, <code>registered nurse</code>, <code>python developer</code>. Each query is searched in every location.",
      "items": {
       "type": "string"
      }
     },
     "locations": {
      "title": "Locations",
      "type": "array",
      "description": "Cities, states or regions, one per line, e.g. <code>Austin, TX</code>, <code>London</code>, <code>Bengaluru</code>, <code>Bavaria</code>. Matched to Google's own locations inside the selected country (add the state for ambiguous US cities: <code>Portland, ME</code>). Leave empty to search the whole country. Enter <code>Remote</code> for remote jobs.",
      "items": {
       "type": "string"
      }
     },
     "country": {
      "title": "Country",
      "enum": [
       "US",
       "GB",
       "IN",
       "DE",
       "CA",
       "DZ",
       "AO",
       "AG",
       "AT",
       "BH",
       "BD",
       "BE",
       "BZ",
       "BO",
       "BW",
       "BR",
       "CR",
       "DK",
       "DM",
       "EG",
       "SV",
       "ET",
       "FR",
       "GH",
       "GR",
       "GY",
       "ID",
       "IQ",
       "IT",
       "JP",
       "JO",
       "KZ",
       "KE",
       "KW",
       "KG",
       "LB",
       "LS",
       "LY",
       "MW",
       "MY",
       "MU",
       "MA",
       "MZ",
       "NA",
       "NL",
       "NG",
       "OM",
       "PK",
       "PH",
       "PT",
       "QA",
       "RW",
       "SH",
       "VC",
       "SA",
       "SC",
       "SL",
       "SG",
       "SO",
       "ZA",
       "ES",
       "LK",
       "SR",
       "CH",
       "TZ",
       "TH",
       "BS",
       "GM",
       "TT",
       "TN",
       "UG",
       "AE",
       "UZ",
       "VN",
       "ZM",
       "ZW"
      ],
      "type": "string",
      "description": "Country to search in (Google Jobs is available in these countries).",
      "default": "US"
     },
     "language": {
      "title": "Language",
      "type": "string",
      "description": "2-letter language code of the Google interface and results, e.g. <code>en</code>, <code>de</code>, <code>fr</code>. Leave empty for the country's main language (English for US, UK and India)."
     },
     "maxResultsPerQuery": {
      "title": "Max jobs per query and location",
      "minimum": 1,
      "maximum": 200,
      "type": "integer",
      "description": "Maximum number of jobs to return for each query \u00d7 location combination. Google Jobs shows up to about 200 jobs per search.",
      "default": 50
     },
     "maxResults": {
      "title": "Max jobs in total",
      "minimum": 1,
      "type": "integer",
      "description": "Optional cap on the total number of jobs in this run (all queries and locations together). Leave empty for no cap."
     },
     "datePosted": {
      "title": "Date posted",
      "enum": [
       "anytime",
       "today",
       "3days",
       "week",
       "month"
      ],
      "type": "string",
      "description": "Only return jobs posted within this period.",
      "default": "anytime"
     },
     "employmentTypes": {
      "title": "Employment type",
      "type": "array",
      "description": "Only return these employment types. Leave empty for all.",
      "items": {
       "type": "string",
       "enum": [
        "FULLTIME",
        "PARTTIME",
        "CONTRACTOR",
        "INTERN"
       ],
       "enumTitles": [
        "Full-time",
        "Part-time",
        "Contractor",
        "Internship"
       ]
      }
     },
     "remoteOnly": {
      "title": "Remote jobs only",
      "type": "boolean",
      "description": "Only return remote / work-from-home jobs.",
      "default": false
     },
     "radiusKm": {
      "title": "Search radius (km)",
      "minimum": 1,
      "maximum": 300,
      "type": "integer",
      "description": "Optional radius around each city in kilometers (1-300). Leave empty for Google's default."
     },
     "includeDetails": {
      "title": "Include full job details",
      "type": "boolean",
      "description": "Include the job description and Google's job highlights (qualifications, responsibilities, benefits). Turn off for smaller, list-only results.",
      "default": true
     },
     "includeAllApplyLinks": {
      "title": "Include all apply links",
      "type": "boolean",
      "description": "Return every 'Apply on ...' option (LinkedIn, Indeed, the company site, ...) with board names and URLs. When off, only the main apply link is returned.",
      "default": true
     },
     "dedupe": {
      "title": "Remove duplicates",
      "type": "boolean",
      "description": "Return each job only once, even if it appears in several queries or locations.",
      "default": true
     }
    }
   },
   "GoogleJobsScraperRow": {
    "type": "object",
    "properties": {
     "title": {
      "type": "string",
      "description": "Job title"
     },
     "company": {
      "type": [
       "string",
       "null"
      ],
      "description": "Company / employer name"
     },
     "location": {
      "type": [
       "string",
       "null"
      ],
      "description": "Location as shown by Google ('Anywhere' = remote)"
     },
     "jobLocation": {
      "type": [
       "string",
       "null"
      ],
      "description": "Location from the job details if different"
     },
     "otherLocationsCount": {
      "type": "integer",
      "description": "Number of additional locations"
     },
     "remote": {
      "type": "boolean",
      "description": "Remote / work from home"
     },
     "via": {
      "type": [
       "string",
       "null"
      ],
      "description": "Job board Google got the posting from (LinkedIn, Indeed, company site...)"
     },
     "postedAt": {
      "type": [
       "string",
       "null"
      ],
      "description": "Posted date (ISO 8601, UTC, approximate)"
     },
     "postedAgo": {
      "type": [
       "string",
       "null"
      ],
      "description": "Posted, as shown by Google ('3 days ago')"
     },
     "employmentType": {
      "type": [
       "string",
       "null"
      ],
      "description": "Full-time, Part-time, Contractor or Internship"
     },
     "employmentTypes": {
      "type": "array",
      "description": "All employment types"
     },
     "employmentTypeText": {
      "type": [
       "string",
       "null"
      ],
      "description": "Employment type as shown"
     },
     "salaryMin": {
      "type": [
       "number",
       "null"
      ],
      "description": "Minimum salary"
     },
     "salaryMax": {
      "type": [
       "number",
       "null"
      ],
      "description": "Maximum salary"
     },
     "salaryCurrency": {
      "type": [
       "string",
       "null"
      ],
      "description": "ISO currency"
     },
     "salaryInterval": {
      "type": [
       "string",
       "null"
      ],
      "description": "YEAR, MONTH, WEEK, DAY or HOUR"
     },
     "salaryText": {
      "type": [
       "string",
       "null"
      ],
      "description": "Salary as shown"
     },
     "salarySource": {
      "type": [
       "string",
       "null"
      ],
      "description": "google (salary chip) or description (parsed from text)"
     },
     "benefits": {
      "type": "array",
      "description": "Benefit chips (health insurance, paid time off...)"
     },
     "noDegreeMentioned": {
      "type": "boolean",
      "description": "Google's 'No degree mentioned' flag"
     },
     "applyUrl": {
      "type": [
       "string",
       "null"
      ],
      "description": "Main apply link"
     },
     "applyOptions": {
      "type": "array",
      "description": "All apply links: title (board), url, domain"
     },
     "shareLink": {
      "type": [
       "string",
       "null"
      ],
      "description": "Google Jobs share link"
     },
     "companyLogo": {
      "type": [
       "string",
       "null"
      ],
      "description": "Company logo URL"
     },
     "companyUrl": {
      "type": [
       "string",
       "null"
      ],
      "description": "Company website"
     },
     "jobId": {
      "type": "string",
      "description": "Google Jobs job ID"
     },
     "description": {
      "type": [
       "string",
       "null"
      ],
      "description": "Full job description (plain text)"
     },
     "descriptionIsPreview": {
      "type": [
       "boolean",
       "null"
      ],
      "description": "True if Google only shows a preview (e.g. EU countries)"
     },
     "highlights": {
      "type": "object",
      "description": "Qualifications, responsibilities and benefits identified by Google"
     },
     "highlightSections": {
      "type": "array",
      "description": "Highlight sections as shown"
     },
     "query": {
      "type": "string",
      "description": "Your search query"
     },
     "searchLocation": {
      "type": "string",
      "description": "Google location used for the search"
     },
     "locationInput": {
      "type": [
       "string",
       "null"
      ],
      "description": "Your location input"
     },
     "country": {
      "type": "string",
      "description": "Country code"
     },
     "language": {
      "type": "string",
      "description": "Language code"
     },
     "position": {
      "type": "integer",
      "description": "Rank in the search results"
     },
     "source": {
      "type": "string",
      "description": "Data source"
     },
     "scrapedAt": {
      "type": "string",
      "description": "Scraped at (ISO 8601, UTC)"
     }
    },
    "required": [
     "title",
     "jobId"
    ]
   },
   "GoogleMapsGridRankTrackerInput": {
    "type": "object",
    "required": [
     "keywords"
    ],
    "properties": {
     "keywords": {
      "title": "Keywords",
      "minItems": 1,
      "type": "array",
      "description": "What customers search on Google Maps, e.g. <code>plumber</code>, <code>emergency plumber</code>. Up to 20.",
      "items": {
       "type": "string"
      }
     },
     "businessName": {
      "title": "Business name",
      "type": "string",
      "description": "The business to track, exactly as on Google Maps."
     },
     "businessLocation": {
      "title": "Business city / area",
      "type": "string",
      "description": "Helps find the right business, e.g. <code>Boise, ID</code>."
     },
     "placeId": {
      "title": "Google place ID (optional)",
      "type": "string",
      "description": "Most precise way to identify the business (e.g. <code>ChIJ...</code>)."
     },
     "cid": {
      "title": "Google CID (optional)",
      "type": "string",
      "description": "Alternative business ID (the number in maps?cid=...)."
     },
     "businessDomain": {
      "title": "Business website domain (optional)",
      "type": "string",
      "description": "Used to match the business when no ID is given."
     },
     "centerCoordinates": {
      "title": "Grid centre (optional)",
      "type": "string",
      "description": "Latitude, longitude for the grid centre, e.g. <code>43.6150, -116.2023</code>. Default: the business location."
     },
     "gridSize": {
      "title": "Grid size",
      "minimum": 3,
      "maximum": 15,
      "type": "integer",
      "description": "Points per side (odd number): 3 = 9 points, 5 = 25, 7 = 49, 9 = 81, up to 15 = 225.",
      "default": 5
     },
     "radiusKm": {
      "title": "Radius (km)",
      "minimum": 0.1,
      "maximum": 100,
      "type": "number",
      "description": "Distance from the centre to the outer points. 1-3 km for dense cities, 5-15 km for suburbs and service areas.",
      "default": 3
     },
     "depth": {
      "title": "Results checked per point",
      "minimum": 10,
      "maximum": 100,
      "type": "integer",
      "description": "How deep to look in each Google Maps result list (10-100). Ranks beyond this show as \"20+\".",
      "default": 20
     },
     "zoom": {
      "title": "Map zoom",
      "minimum": 3,
      "maximum": 21,
      "type": "integer",
      "description": "Google Maps zoom level used at each point (13 = city level, 15 = neighbourhood).",
      "default": 13
     },
     "trackChanges": {
      "title": "Compare with the last run",
      "type": "boolean",
      "description": "Remember results in a named key-value store (\"maps-grid-rank-history\") so each run shows rank changes.",
      "default": true
     },
     "country": {
      "title": "Country",
      "type": "string",
      "description": "Country used to find the business by name.",
      "default": "United States"
     },
     "language": {
      "title": "Language",
      "type": "string",
      "description": "Language of the results. Default: English."
     }
    }
   },
   "GoogleMapsGridRankTrackerRow": {
    "$schema": "http://json-schema.org/draft-07/schema#",
    "type": "object",
    "properties": {
     "row_type": {
      "type": "string",
      "description": "pin = rank at one grid point; summary = one row per keyword with averages, competitors and the heatmap",
      "enum": [
       "pin",
       "summary"
      ]
     },
     "keyword": {
      "type": "string",
      "description": "Keyword checked"
     },
     "business_name": {
      "type": [
       "string",
       "null"
      ],
      "description": "Tracked business"
     },
     "pin": {
      "type": [
       "integer",
       "null"
      ],
      "description": "pin rows: point number (row by row from the north-west corner)"
     },
     "row": {
      "type": [
       "integer",
       "null"
      ],
      "description": "pin rows: grid row (1 = north)"
     },
     "col": {
      "type": [
       "integer",
       "null"
      ],
      "description": "pin rows: grid column (1 = west)"
     },
     "latitude": {
      "type": [
       "number",
       "null"
      ],
      "description": "pin rows: latitude of the point"
     },
     "longitude": {
      "type": [
       "number",
       "null"
      ],
      "description": "pin rows: longitude of the point"
     },
     "distance_km": {
      "type": [
       "number",
       "null"
      ],
      "description": "pin rows: distance from the grid centre"
     },
     "rank": {
      "type": [
       "integer",
       "null"
      ],
      "description": "pin rows: Google Maps rank of the business at this point (null = not in the results checked)"
     },
     "found": {
      "type": [
       "boolean",
       "null"
      ],
      "description": "pin rows: the business appears in the results"
     },
     "in_top3": {
      "type": [
       "boolean",
       "null"
      ],
      "description": "pin rows: rank 1-3 (the local pack)"
     },
     "rank_label": {
      "type": [
       "string",
       "null"
      ],
      "description": "pin rows: rank as text, e.g. \"4\" or \"20+\""
     },
     "previous_rank": {
      "type": [
       "integer",
       "null"
      ],
      "description": "pin rows: rank in the previous run"
     },
     "rank_change": {
      "type": [
       "integer",
       "null"
      ],
      "description": "pin rows: positions gained since the previous run (positive = better)"
     },
     "top_results": {
      "type": [
       "array",
       "null"
      ],
      "description": "pin rows: top 3 businesses at this point",
      "items": {
       "type": "object",
       "properties": {
        "rank": {
         "type": "integer"
        },
        "name": {
         "type": [
          "string",
          "null"
         ]
        },
        "rating": {
         "type": [
          "number",
          "null"
         ]
        },
        "reviews": {
         "type": [
          "integer",
          "null"
         ]
        },
        "category": {
         "type": [
          "string",
          "null"
         ]
        },
        "domain": {
         "type": [
          "string",
          "null"
         ]
        },
        "cid": {
         "type": [
          "string",
          "null"
         ]
        }
       }
      }
     },
     "results_checked": {
      "type": [
       "integer",
       "null"
      ],
      "description": "pin rows: results returned at this point"
     },
     "business_place_id": {
      "type": [
       "string",
       "null"
      ],
      "description": "summary: place ID of the tracked business"
     },
     "business_cid": {
      "type": [
       "string",
       "null"
      ],
      "description": "summary: CID of the tracked business"
     },
     "grid_size": {
      "type": [
       "integer",
       "null"
      ],
      "description": "summary: points per side"
     },
     "radius_km": {
      "type": [
       "number",
       "null"
      ],
      "description": "summary: grid radius"
     },
     "zoom": {
      "type": [
       "integer",
       "null"
      ],
      "description": "summary: map zoom"
     },
     "center_latitude": {
      "type": [
       "number",
       "null"
      ],
      "description": "summary: grid centre latitude"
     },
     "center_longitude": {
      "type": [
       "number",
       "null"
      ],
      "description": "summary: grid centre longitude"
     },
     "pins_checked": {
      "type": [
       "integer",
       "null"
      ],
      "description": "summary: points checked"
     },
     "pins_found": {
      "type": [
       "integer",
       "null"
      ],
      "description": "summary: points where the business appears"
     },
     "pins_top3": {
      "type": [
       "integer",
       "null"
      ],
      "description": "summary: points where it ranks 1-3"
     },
     "pins_top10": {
      "type": [
       "integer",
       "null"
      ],
      "description": "summary: points where it ranks 1-10"
     },
     "average_rank": {
      "type": [
       "number",
       "null"
      ],
      "description": "summary: average rank where found (ARP)"
     },
     "average_total_rank": {
      "type": [
       "number",
       "null"
      ],
      "description": "summary: average rank over all points, not found = depth + 1 (ATRP)"
     },
     "share_of_local_voice": {
      "type": [
       "number",
       "null"
      ],
      "description": "summary: % of points where the business is in the top 3 (SoLV)"
     },
     "best_rank": {
      "type": [
       "integer",
       "null"
      ],
      "description": "summary: best rank on the grid"
     },
     "previous_average_total_rank": {
      "type": [
       "number",
       "null"
      ],
      "description": "summary: ATRP in the previous run"
     },
     "previous_share_of_local_voice": {
      "type": [
       "number",
       "null"
      ],
      "description": "summary: SoLV in the previous run"
     },
     "average_total_rank_change": {
      "type": [
       "number",
       "null"
      ],
      "description": "summary: ATRP improvement since the previous run (positive = better)"
     },
     "share_of_local_voice_change": {
      "type": [
       "number",
       "null"
      ],
      "description": "summary: SoLV change in percentage points"
     },
     "previous_checked_at": {
      "type": [
       "string",
       "null"
      ],
      "description": "summary: when the previous run checked this keyword"
     },
     "top_competitors": {
      "type": [
       "array",
       "null"
      ],
      "description": "summary: competitors that rank best across the grid (pins in top 3, average rank)"
     },
     "heatmap_url": {
      "type": [
       "string",
       "null"
      ],
      "description": "summary: link to the heatmap PNG in the run key-value store"
     },
     "scraped_at": {
      "type": "string",
      "description": "When the row was produced (ISO 8601, UTC)"
     }
    },
    "required": [
     "row_type",
     "keyword",
     "scraped_at"
    ]
   },
   "GoogleShoppingPriceComparisonInput": {
    "type": "object",
    "properties": {
     "queries": {
      "title": "Search queries",
      "type": "array",
      "description": "Product searches, exactly as you would type them into Google Shopping (e.g. <code>air fryer</code>, <code>iphone 15 128gb</code>). One product row per result, up to <b>Max products per query</b>. You can also paste a Google Shopping search URL.",
      "items": {
       "type": "string"
      }
     },
     "gtins": {
      "title": "Barcodes (UPC / EAN / GTIN)",
      "type": "array",
      "description": "Barcodes to look up, one per line: 12-digit UPC, 13-digit EAN, 14-digit GTIN or 8-digit EAN-8 (e.g. <code>025500304076</code>). Each barcode is matched to its Google Shopping product and verified against independent web listings for that barcode. Barcodes that cannot be matched are listed as <code>not_found</code> and are free.",
      "items": {
       "type": "string"
      }
     },
     "productIds": {
      "title": "Google product IDs or Shopping URLs",
      "type": "array",
      "description": "Google Shopping product IDs (the <code>productId</code> from a previous run, e.g. <code>14870010698400265781</code>) or Google Shopping product URLs (<code>google.com/shopping/product/...</code> or <code>google.com/search?ibp=oshop&...prds=...</code> links). Best for monitoring a fixed list of products.",
      "items": {
       "type": "string"
      }
     },
     "country": {
      "title": "Country",
      "enum": [
       "AU",
       "CA",
       "FR",
       "DE",
       "GB",
       "US",
       "AR",
       "AT",
       "BE",
       "BR",
       "CL",
       "CO",
       "CZ",
       "DK",
       "FI",
       "GR",
       "HU",
       "IN",
       "ID",
       "IE",
       "IL",
       "IT",
       "JP",
       "MY",
       "MX",
       "NL",
       "NZ",
       "NO",
       "PH",
       "PL",
       "PT",
       "RO",
       "SA",
       "SG",
       "SK",
       "ZA",
       "KR",
       "ES",
       "SE",
       "CH",
       "TH",
       "TR",
       "UA",
       "AE",
       "VN"
      ],
      "type": "string",
      "description": "Google Shopping country. Prices, sellers and currency are for this country.",
      "default": "US"
     },
     "language": {
      "title": "Language",
      "type": "string",
      "description": "Language code such as <code>en</code>, <code>de</code>, <code>fr</code>, <code>es</code>, <code>pt-BR</code>. Leave empty for the country's main language."
     },
     "location": {
      "title": "City, region or postal code (optional)",
      "type": "string",
      "description": "Get local results for a place inside the country, e.g. <code>10001</code>, <code>Chicago</code>, <code>Bavaria</code> or <code>London,England,United Kingdom</code>. Leave empty for the whole country."
     },
     "sort": {
      "title": "Sort search results",
      "enum": [
       "relevance",
       "price_low_to_high",
       "price_high_to_low",
       "review_score"
      ],
      "type": "string",
      "description": "Sort order for search queries (barcodes and product IDs are not affected).",
      "default": "relevance"
     },
     "minPrice": {
      "title": "Min price",
      "minimum": 0,
      "type": "integer",
      "description": "Only search results at or above this price (whole currency units)."
     },
     "maxPrice": {
      "title": "Max price",
      "minimum": 0,
      "type": "integer",
      "description": "Only search results at or below this price (whole currency units)."
     },
     "condition": {
      "title": "Condition",
      "enum": [
       "any",
       "new",
       "used"
      ],
      "type": "string",
      "description": "Filters seller offers by condition. For search results it removes or keeps products whose title says refurbished / renewed / used / pre-owned (best effort).",
      "default": "any"
     },
     "maxProducts": {
      "title": "Max products (total)",
      "minimum": 1,
      "maximum": 100000,
      "type": "integer",
      "description": "Maximum product rows for the whole run (barcodes and product IDs first, then search results). Duplicate products are skipped.",
      "default": 100
     },
     "maxProductsPerQuery": {
      "title": "Max products per search query",
      "minimum": 1,
      "maximum": 120,
      "type": "integer",
      "description": "How many results to take from each search query (Google Shopping returns up to about 120).",
      "default": 40
     },
     "fetchOffers": {
      "title": "Get all seller offers",
      "type": "boolean",
      "description": "For every product, get the seller offers (Compare prices list): seller, price, shipping, total, condition, availability, seller rating and offer URL. Also fills min/max/typical price and number of sellers. Turn off for a cheaper product-only scrape.",
      "default": true
     },
     "maxOffersPerProduct": {
      "title": "Max offers per product",
      "minimum": 1,
      "maximum": 100,
      "type": "integer",
      "description": "Maximum seller offers per product (Google lists up to about 100).",
      "default": 20
     },
     "includeDetails": {
      "title": "Product details for search results",
      "type": "boolean",
      "description": "Also get brand, description, all images, specifications and variants for each search result (adds the product-details event per product). Barcode and product ID lookups always include details.",
      "default": false
     },
     "resolveOfferUrls": {
      "title": "Resolve offer URLs to merchant pages",
      "type": "boolean",
      "description": "Turn Google redirect links into the direct merchant product URL (e.g. the walmart.com or target.com page). Off = keep Google's redirect link.",
      "default": true
     },
     "monitoringStoreName": {
      "title": "Price monitoring store name",
      "type": "string",
      "description": "Turn on price monitoring: give a name (e.g. <code>my-price-watch</code>). Each run is compared with the previous run that used the same name, country and language. Products get a <code>priceMonitor</code> object (price drop / increase, new and removed sellers) and offers get <code>changeStatus</code>. Removed sellers are added as free offer rows. Schedule the Actor to monitor prices daily."
     },
     "onlyChanges": {
      "title": "Output only changes",
      "type": "boolean",
      "description": "With price monitoring on, skip products whose price and sellers did not change (they are not charged) and unchanged offers.",
      "default": false
     },
     "minPriceChangePct": {
      "title": "Ignore price changes smaller than (%)",
      "minimum": 0,
      "maximum": 100,
      "type": "integer",
      "description": "Price changes below this percentage count as unchanged.",
      "default": 0
     }
    }
   },
   "GoogleShoppingPriceComparisonRow": {
    "type": "object",
    "properties": {
     "type": {
      "type": [
       "string",
       "null"
      ],
      "description": "product, offer or not_found (not_found rows are free)"
     },
     "title": {
      "type": [
       "string",
       "null"
      ],
      "description": "Product title"
     },
     "productId": {
      "type": [
       "string",
       "null"
      ],
      "description": "Google Shopping product ID (catalog ID)"
     },
     "gid": {
      "type": [
       "string",
       "null"
      ],
      "description": "Google global product ID"
     },
     "gtin": {
      "type": [
       "string",
       "null"
      ],
      "description": "Barcode you searched (barcode lookups)"
     },
     "gtin14": {
      "type": [
       "string",
       "null"
      ],
      "description": "Barcode as 14-digit GTIN"
     },
     "brand": {
      "type": [
       "string",
       "null"
      ],
      "description": "Brand (with details)"
     },
     "image": {
      "type": [
       "string",
       "null"
      ],
      "description": "Main image URL"
     },
     "rating": {
      "type": [
       "number",
       "null"
      ],
      "description": "Product rating 1-5"
     },
     "reviewsCount": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Number of product reviews"
     },
     "price": {
      "type": [
       "number",
       "null"
      ],
      "description": "Headline price shown on Google Shopping"
     },
     "oldPrice": {
      "type": [
       "number",
       "null"
      ],
      "description": "Previous / strike-through price"
     },
     "minPrice": {
      "type": [
       "number",
       "null"
      ],
      "description": "Lowest seller price"
     },
     "maxPrice": {
      "type": [
       "number",
       "null"
      ],
      "description": "Highest seller price"
     },
     "typicalPrice": {
      "type": [
       "number",
       "null"
      ],
      "description": "Median seller price"
     },
     "minTotalPrice": {
      "type": [
       "number",
       "null"
      ],
      "description": "Lowest price incl. shipping"
     },
     "cheapestSeller": {
      "type": [
       "string",
       "null"
      ],
      "description": "Seller with the lowest total price"
     },
     "sellersCount": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Number of sellers (offers returned, or Google's count)"
     },
     "currency": {
      "type": [
       "string",
       "null"
      ],
      "description": "Currency (ISO code)"
     },
     "headlineSeller": {
      "type": [
       "string",
       "null"
      ],
      "description": "Seller shown in search results"
     },
     "delivery": {
      "type": [
       "string",
       "null"
      ],
      "description": "Delivery info"
     },
     "tags": {
      "type": [
       "array",
       "null"
      ],
      "description": "Badges, e.g. LOW PRICE, 10% OFF"
     },
     "productUrl": {
      "type": [
       "string",
       "null"
      ],
      "description": "Brand / product URL"
     },
     "googleShoppingUrl": {
      "type": [
       "string",
       "null"
      ],
      "description": "Google Shopping product link"
     },
     "description": {
      "type": [
       "string",
       "null"
      ],
      "description": "Description"
     },
     "images": {
      "type": [
       "array",
       "null"
      ],
      "description": "All images"
     },
     "specifications": {
      "type": [
       "object",
       "null"
      ],
      "description": "Specifications"
     },
     "features": {
      "type": [
       "array",
       "null"
      ],
      "description": "Feature bullets"
     },
     "variants": {
      "type": [
       "array",
       "null"
      ],
      "description": "Variants (size, color, ...)"
     },
     "match": {
      "type": [
       "object",
       "null"
      ],
      "description": "Barcode match: method, confidence, rank, name from web listings"
     },
     "priceMonitor": {
      "type": [
       "object",
       "null"
      ],
      "description": "Price monitoring: status, previous price, change, new / removed sellers"
     },
     "source": {
      "type": [
       "object",
       "null"
      ],
      "description": "Input that produced this row"
     },
     "productTitle": {
      "type": [
       "string",
       "null"
      ],
      "description": "Product title (offer rows)"
     },
     "sellerName": {
      "type": [
       "string",
       "null"
      ],
      "description": "Seller"
     },
     "offerTitle": {
      "type": [
       "string",
       "null"
      ],
      "description": "Seller's own product title"
     },
     "shippingPrice": {
      "type": [
       "number",
       "null"
      ],
      "description": "Shipping cost"
     },
     "tax": {
      "type": [
       "number",
       "null"
      ],
      "description": "Tax"
     },
     "totalPrice": {
      "type": [
       "number",
       "null"
      ],
      "description": "Price + shipping"
     },
     "condition": {
      "type": [
       "string",
       "null"
      ],
      "description": "new, used or refurbished"
     },
     "availability": {
      "type": [
       "string",
       "null"
      ],
      "description": "in_stock, out_of_stock, ..."
     },
     "sellerRating": {
      "type": [
       "number",
       "null"
      ],
      "description": "Seller rating 1-5"
     },
     "sellerReviewsCount": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Seller reviews"
     },
     "annotation": {
      "type": [
       "string",
       "null"
      ],
      "description": "Deal note, e.g. 39% off"
     },
     "offerUrl": {
      "type": [
       "string",
       "null"
      ],
      "description": "Merchant offer URL"
     },
     "googleOfferUrl": {
      "type": [
       "string",
       "null"
      ],
      "description": "Google redirect link to the offer"
     },
     "merchantDomain": {
      "type": [
       "string",
       "null"
      ],
      "description": "Merchant domain"
     },
     "walmartItemId": {
      "type": [
       "string",
       "null"
      ],
      "description": "Walmart item ID (Walmart offers)"
     },
     "isAd": {
      "type": [
       "boolean",
       "null"
      ],
      "description": "Sponsored offer"
     },
     "position": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Offer position"
     },
     "changeStatus": {
      "type": [
       "string",
       "null"
      ],
      "description": "new, price_drop, price_increase, unchanged or removed"
     },
     "previousPrice": {
      "type": [
       "number",
       "null"
      ],
      "description": "Price in the previous monitoring run"
     },
     "priceChange": {
      "type": [
       "number",
       "null"
      ],
      "description": "Price change"
     },
     "priceChangePct": {
      "type": [
       "number",
       "null"
      ],
      "description": "Price change (%)"
     },
     "country": {
      "type": [
       "string",
       "null"
      ],
      "description": "Country"
     },
     "language": {
      "type": [
       "string",
       "null"
      ],
      "description": "Language"
     },
     "location": {
      "type": [
       "string",
       "null"
      ],
      "description": "Location"
     },
     "input": {
      "type": [
       "string",
       "null"
      ],
      "description": "Input (not_found rows)"
     },
     "error": {
      "type": [
       "string",
       "null"
      ],
      "description": "Why nothing was found (not_found rows)"
     },
     "scrapedAt": {
      "type": [
       "string",
       "null"
      ],
      "description": "Scrape time (UTC)"
     }
    }
   },
   "GoogleTrendsScraperInput": {
    "type": "object",
    "properties": {
     "searchTerms": {
      "title": "Search terms",
      "type": "array",
      "description": "One search term (or Google Trends topic ID like <code>/m/02vqfm</code>) per line. To <b>compare</b> up to 5 terms on the same 0-100 scale, put them on one line separated by commas, e.g. <code>coffee, tea, matcha</code>. Add as many lines as you like - each line is scraped separately for every geo.",
      "items": {
       "type": "string"
      }
     },
     "geos": {
      "title": "Geo (country / region)",
      "type": "array",
      "description": "Country code (<code>US</code>, <code>GB</code>, <code>DE</code>), region (<code>US-CA</code>, <code>GB-SCT</code>) or US metro (<code>US-NY-501</code>). Leave a line empty or write <code>WORLDWIDE</code> for worldwide. Every search term is scraped for every geo.",
      "default": [
       "US"
      ],
      "items": {
       "type": "string"
      }
     },
     "timeRange": {
      "title": "Time range",
      "enum": [
       "",
       "now 1-H",
       "now 4-H",
       "now 1-d",
       "now 7-d",
       "today 1-m",
       "today 3-m",
       "today 12-m",
       "today 5-y",
       "all"
      ],
      "type": "string",
      "description": "Preset period. Use <i>Custom time range</i> below for exact dates.",
      "default": ""
     },
     "customTimeRange": {
      "title": "Custom time range",
      "type": "string",
      "description": "Optional, overrides the preset. <code>YYYY-MM-DD YYYY-MM-DD</code> (e.g. <code>2024-01-01 2024-12-31</code>) or hourly <code>YYYY-MM-DDTHH YYYY-MM-DDTHH</code> within the last 7 days (UTC)."
     },
     "category": {
      "title": "Category",
      "description": "Google Trends category ID to narrow ambiguous terms (0 = all categories). A number or a string id (e.g. <code>\"71\"</code>, as in apify/google-trends-scraper) both work. Common: 3 Arts & Entertainment, 5 Computers & Electronics, 7 Finance, 18 Shopping, 20 Sports, 44 Beauty & Fitness, 45 Health, 47 Autos & Vehicles, 66 Pets & Animals, 67 Travel, 71 Food & Drink, 958 Jobs & Education (full list in the README).",
      "default": 0
     },
     "property": {
      "title": "Search property",
      "enum": [
       "web",
       "images",
       "news",
       "youtube",
       "shopping"
      ],
      "type": "string",
      "description": "Which Google search product the interest comes from.",
      "default": "web"
     },
     "includeInterestOverTime": {
      "title": "Interest over time",
      "type": "boolean",
      "description": "Timeline of search interest (0-100).",
      "default": true
     },
     "includeInterestByRegion": {
      "title": "Interest by region",
      "type": "boolean",
      "description": "Interest per country / subregion / metro / city. When comparing several terms, values are each term's share (%) of the compared searches in that region, as on the Google Trends website.",
      "default": true
     },
     "regionResolution": {
      "title": "Region resolution",
      "enum": [
       "auto",
       "COUNTRY",
       "REGION",
       "DMA",
       "CITY"
      ],
      "type": "string",
      "description": "Granularity of interest by region. Falls back to Google's default if the resolution isn't available for the geo.",
      "default": "auto"
     },
     "includeLowSearchVolumeRegions": {
      "title": "Include low search volume regions",
      "type": "boolean",
      "description": "Also return regions with too little data (value 0).",
      "default": false
     },
     "maxRegions": {
      "title": "Max regions per term",
      "minimum": 1,
      "maximum": 2000,
      "type": "integer",
      "description": "Keep only the top N regions by interest.",
      "default": 250
     },
     "includeRelatedQueries": {
      "title": "Related queries",
      "type": "boolean",
      "description": "Top and rising related searches (rising includes Breakout terms).",
      "default": true
     },
     "includeRelatedTopics": {
      "title": "Related topics (opt-in)",
      "type": "boolean",
      "description": "Off by default. Top and rising related topics. Google returns empty related topics to regular automated sessions, so when enabled this option requests them through Google Trends' embeddable-widget endpoint, sending a Referer header from a pool of public websites. Enable it only if this method is acceptable for your use case. Adds 2 requests per term; if topics can't be retrieved, the term is still returned with its other data.",
      "default": false
     },
     "maxRelatedItems": {
      "title": "Max related items per list",
      "minimum": 1,
      "maximum": 100,
      "type": "integer",
      "description": "Maximum rows per top / rising list.",
      "default": 25
     },
     "trendingGeos": {
      "title": "Trending now: countries",
      "type": "array",
      "description": "Get the current Trending Now / daily trending searches for these countries (e.g. <code>US</code>, <code>GB</code>, <code>IN</code>, or a region like <code>US-CA</code>). Works with or without search terms.",
      "items": {
       "type": "string"
      }
     },
     "trendingHours": {
      "title": "Trending time window",
      "enum": [
       "4",
       "24",
       "48",
       "168"
      ],
      "type": "string",
      "description": "Trends that started within this window.",
      "default": "24"
     },
     "trendingCategories": {
      "title": "Trending categories",
      "type": "array",
      "description": "Optional filter. Empty = all categories.",
      "items": {
       "type": "string",
       "enum": [
        "Autos and Vehicles",
        "Beauty and Fashion",
        "Business and Finance",
        "Climate",
        "Entertainment",
        "Food and Drink",
        "Games",
        "Health",
        "Hobbies and Leisure",
        "Jobs and Education",
        "Law and Government",
        "Other",
        "Pets and Animals",
        "Politics",
        "Science",
        "Shopping",
        "Sports",
        "Technology",
        "Travel and Transportation"
       ]
      }
     },
     "trendingActiveOnly": {
      "title": "Active trends only",
      "type": "boolean",
      "description": "Skip trends that have already ended.",
      "default": false
     },
     "maxTrendingPerGeo": {
      "title": "Max trending searches per country",
      "minimum": 1,
      "maximum": 1000,
      "type": "integer",
      "description": "Google lists up to ~500 trends per day for big countries; ranked by relevance.",
      "default": 25
     },
     "includeTrendingNews": {
      "title": "Add news articles",
      "type": "boolean",
      "description": "Attach up to 3 news articles (title, URL, source, time, image) that Google links to each trending search. One extra request per 50 trends.",
      "default": true
     },
     "outputFormat": {
      "title": "Output format",
      "enum": [
       "flat",
       "perTerm",
       "apify-compatible"
      ],
      "type": "string",
      "description": "Flat: every timeline point, region, related query and topic is its own row with a <code>type</code> column. Per term: one row per search term + geo with arrays inside. Price is the same - you pay per term, not per row.",
      "default": "flat"
     },
     "advancedQueries": {
      "title": "Advanced queries (JSON)",
      "type": "array",
      "description": "Optional. Fine-grained list of queries, each with its own geo / time range / category / property, e.g. <code>[{\"terms\": \"nike, adidas\", \"geo\": \"DE\", \"timeRange\": \"today 5-y\", \"category\": 0, \"property\": \"youtube\"}]</code>. Missing fields use the values above."
     },
     "language": {
      "title": "Language (hl)",
      "type": "string",
      "description": "Language of region and topic names, e.g. <code>en-US</code>, <code>de</code>, <code>fr</code>.",
      "default": "en-US"
     },
     "timezoneOffsetMinutes": {
      "title": "Timezone offset (minutes)",
      "minimum": -840,
      "maximum": 840,
      "type": "integer",
      "description": "Google's tz parameter (minutes behind UTC, e.g. 300 = US Eastern standard time). Default 0 = UTC dates.",
      "default": 0
     },
     "proxyConfiguration": {
      "title": "Proxy",
      "type": "object",
      "description": "Defaults to Apify datacenter proxy (cheapest) with automatic residential fallback when Google blocks it. Choose the RESIDENTIAL group to always use residential IPs.",
      "default": {
       "useApifyProxy": true
      }
     },
     "residentialFallback": {
      "title": "Residential fallback",
      "type": "boolean",
      "description": "When a request is rate-limited (HTTP 429) on datacenter IPs, retry it on a residential IP. Recommended - this is what keeps the success rate above 99%.",
      "default": true
     },
     "maxConcurrency": {
      "title": "Max concurrency",
      "minimum": 1,
      "maximum": 20,
      "type": "integer",
      "description": "Queries processed in parallel.",
      "default": 5
     },
     "maxRetries": {
      "title": "Max attempts per request",
      "minimum": 2,
      "maximum": 15,
      "type": "integer",
      "description": "Each attempt uses a fresh session (new IP + new cookie) with exponential backoff.",
      "default": 8
     },
     "geo": {
      "title": "Geo (Apify-compatible)",
      "type": "string",
      "description": "Country code as a single string (e.g. <code>US</code>). Empty = worldwide. Used when Geo list is empty. Same as <code>geo</code> in apify/google-trends-scraper."
     },
     "isMultiple": {
      "title": "Treat commas as multiple terms (Apify-compatible)",
      "type": "boolean",
      "description": "Same as <code>isMultiple</code> in apify/google-trends-scraper. On (default): commas in a searchTerms line compare up to 5 terms (Google's limit). Off: each line is one search term, commas included.",
      "default": true
     },
     "maxItems": {
      "title": "Max items (Apify-compatible)",
      "minimum": 0,
      "type": "integer",
      "description": "Maximum number of term\u00d7geo queries to run. 0 = no limit.",
      "default": 0
     },
     "startUrls": {
      "title": "Google Trends URLs (Apify-compatible)",
      "type": "array",
      "description": "Paste Google Trends explore URLs; each is turned into a query (q, geo, date, cat). Also accepts apify/google-trends-scraper's format: <code>[{\"url\": \"\u2026\"}]</code> or <code>[{\"requestsFromUrl\": \"\u2026\"}]</code>.",
      "items": {
       "type": "string"
      }
     },
     "viewedFrom": {
      "title": "Country to view Trends from (Apify-compatible)",
      "type": "string",
      "description": "Same as <code>viewedFrom</code> in apify/google-trends-scraper: 2-letter country for the proxy (e.g. <code>us</code>). Optional."
     },
     "spreadsheetId": {
      "title": "Google Sheet ID (Apify-compatible)",
      "type": "string",
      "description": "Same as <code>spreadsheetId</code> in apify/google-trends-scraper: a public Google Sheet (Anyone with the link). Terms are read from the first column; row 1 is the header. Added to Search terms."
     },
     "maxRequestRetries": {
      "title": "Max request retries (Apify-compatible)",
      "minimum": 0,
      "maximum": 15,
      "type": "integer",
      "description": "Same as <code>maxRequestRetries</code> in apify/google-trends-scraper. Used as Max retries when that is not set."
     },
     "pageLoadTimeoutSecs": {
      "title": "Page load timeout (Apify-compatible)",
      "minimum": 0,
      "type": "integer",
      "description": "Accepted so apify/google-trends-scraper inputs work unchanged. Not needed here: we don't load full browser pages per term."
     },
     "skipDebugScreen": {
      "title": "Do not save snapshot (Apify-compatible)",
      "type": "boolean",
      "description": "Accepted so apify/google-trends-scraper inputs work unchanged. We never save page snapshots."
     },
     "dataforseoFallback": {
      "title": "Use licensed Google Trends fallback if scraping fails",
      "type": "boolean",
      "description": "If the browser scrape fails after retries, fetch interest-over-time from DataForSEO's Google Trends API (~$0.011 per call on the Actor owner's account; you are not charged extra beyond the normal term-result event). Related queries/regions are not included in the fallback.",
      "default": true
     }
    }
   },
   "GoogleTrendsScraperRow": {
    "type": "object",
    "properties": {
     "type": {
      "type": "string",
      "description": "Row type: interest_over_time, interest_by_region, related_query, related_topic, trending_now, term (per-term format) or status (no data / error, free)"
     },
     "searchTerm": {
      "type": [
       "string",
       "null"
      ],
      "description": "Search term (or trending search)"
     },
     "comparedWith": {
      "type": [
       "array",
       "null"
      ],
      "description": "Other terms in the same comparison (values share one 0-100 scale)"
     },
     "geo": {
      "type": [
       "string",
       "null"
      ],
      "description": "Geo code (WORLDWIDE for worldwide)"
     },
     "timeRange": {
      "type": [
       "string",
       "null"
      ],
      "description": "Requested time range"
     },
     "period": {
      "type": [
       "string",
       "null"
      ],
      "description": "Resolved date range from Google"
     },
     "category": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Category ID"
     },
     "property": {
      "type": [
       "string",
       "null"
      ],
      "description": "web, images, news, youtube or shopping"
     },
     "date": {
      "type": [
       "string",
       "null"
      ],
      "description": "Timeline point (YYYY-MM-DD, or ISO datetime for hourly data, UTC)"
     },
     "timestamp": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Unix timestamp of the timeline point"
     },
     "formattedTime": {
      "type": [
       "string",
       "null"
      ],
      "description": "Google's label for the point"
     },
     "value": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Interest 0-100 (region rows of comparisons: share %); related rows: relative value or % growth"
     },
     "formattedValue": {
      "type": [
       "string",
       "null"
      ],
      "description": "Google's formatted value (e.g. +250%, Breakout)"
     },
     "hasData": {
      "type": [
       "boolean",
       "null"
      ],
      "description": "False when Google has too little data"
     },
     "isPartial": {
      "type": [
       "boolean",
       "null"
      ],
      "description": "Last timeline point is still being collected"
     },
     "resolution": {
      "type": [
       "string",
       "null"
      ],
      "description": "Timeline (WEEK, DAY, HOUR...) or region resolution"
     },
     "rank": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Position in its list"
     },
     "geoCode": {
      "type": [
       "string",
       "null"
      ],
      "description": "Region code (e.g. US-CA, DMA 807)"
     },
     "geoName": {
      "type": [
       "string",
       "null"
      ],
      "description": "Region name"
     },
     "valueType": {
      "type": [
       "string",
       "null"
      ],
      "description": "interest (single term) or share (comparison)"
     },
     "lat": {
      "type": [
       "number",
       "null"
      ],
      "description": "City latitude"
     },
     "lng": {
      "type": [
       "number",
       "null"
      ],
      "description": "City longitude"
     },
     "rankType": {
      "type": [
       "string",
       "null"
      ],
      "description": "top or rising"
     },
     "query": {
      "type": [
       "string",
       "null"
      ],
      "description": "Related query"
     },
     "topicId": {
      "type": [
       "string",
       "null"
      ],
      "description": "Knowledge Graph topic ID"
     },
     "topicTitle": {
      "type": [
       "string",
       "null"
      ],
      "description": "Topic name"
     },
     "topicType": {
      "type": [
       "string",
       "null"
      ],
      "description": "Topic type"
     },
     "isBreakout": {
      "type": [
       "boolean",
       "null"
      ],
      "description": "Rising more than 5000%"
     },
     "link": {
      "type": [
       "string",
       "null"
      ],
      "description": "Google Trends link for the related item"
     },
     "searchVolume": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Trending now: approximate searches"
     },
     "searchVolumeFormatted": {
      "type": [
       "string",
       "null"
      ],
      "description": "e.g. 200K+"
     },
     "increasePercentage": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Trending now: growth %"
     },
     "startedAt": {
      "type": [
       "string",
       "null"
      ],
      "description": "Trend start (UTC)"
     },
     "endedAt": {
      "type": [
       "string",
       "null"
      ],
      "description": "Trend end (UTC), null while active"
     },
     "isActive": {
      "type": [
       "boolean",
       "null"
      ],
      "description": "Trend still active"
     },
     "categories": {
      "type": [
       "array",
       "null"
      ],
      "description": "Trending categories"
     },
     "trendBreakdown": {
      "type": [
       "array",
       "null"
      ],
      "description": "Queries grouped into this trend"
     },
     "newsArticles": {
      "type": [
       "array",
       "null"
      ],
      "description": "News headlines {title, url, source, picture}"
     },
     "status": {
      "type": [
       "string",
       "null"
      ],
      "description": "ok, partial, no_data or error"
     },
     "averageInterest": {
      "type": [
       "number",
       "null"
      ],
      "description": "Per-term format: mean interest"
     },
     "peakInterest": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Per-term: max interest"
     },
     "peakDate": {
      "type": [
       "string",
       "null"
      ],
      "description": "Per-term: date of the peak"
     },
     "latestInterest": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Per-term: last value"
     },
     "interestOverTime": {
      "type": [
       "array",
       "null"
      ],
      "description": "Per-term: timeline"
     },
     "interestByRegion": {
      "type": [
       "array",
       "null"
      ],
      "description": "Per-term: regions"
     },
     "relatedQueriesTop": {
      "type": [
       "array",
       "null"
      ],
      "description": "Per-term"
     },
     "relatedQueriesRising": {
      "type": [
       "array",
       "null"
      ],
      "description": "Per-term"
     },
     "relatedTopicsTop": {
      "type": [
       "array",
       "null"
      ],
      "description": "Per-term"
     },
     "relatedTopicsRising": {
      "type": [
       "array",
       "null"
      ],
      "description": "Per-term"
     },
     "error": {
      "type": [
       "string",
       "null"
      ],
      "description": "Error message (rows with errors are free)"
     },
     "exploreUrl": {
      "type": [
       "string",
       "null"
      ],
      "description": "Open the same query on trends.google.com"
     },
     "scrapedAt": {
      "type": [
       "string",
       "null"
      ],
      "description": "UTC timestamp"
     }
    },
    "required": [
     "type"
    ]
   },
   "HomeDepotLowesScraperInput": {
    "type": "object",
    "properties": {
     "searchKeywords": {
      "title": "Search keywords",
      "type": "array",
      "description": "Keywords to search, one per line (e.g. <code>cordless drill</code>, <code>claw hammer</code>). Each keyword is searched on the retailer(s) chosen below and returns up to <i>Max products per search/category</i> products from each.",
      "items": {
       "type": "string"
      }
     },
     "retailer": {
      "title": "Retailer for keyword searches",
      "enum": [
       "both",
       "homedepot",
       "lowes"
      ],
      "type": "string",
      "description": "Where to search the keywords. URLs and prefixed item IDs always go to the retailer they belong to.",
      "default": "both"
     },
     "startUrls": {
      "title": "Category, search or product URLs",
      "type": "array",
      "description": "homedepot.com category pages (<code>/b/...N-5yc1v...</code>), search pages (<code>/s/drill</code>) or product pages (<code>/p/...</code>); lowes.com category pages (<code>/pl/...</code>), search pages (<code>/search?searchTerm=...</code>) or product pages (<code>/pd/...</code>).",
      "items": {
       "type": "object",
       "required": [
        "url"
       ],
       "properties": {
        "url": {
         "type": "string",
         "title": "URL of a web page",
         "format": "uri"
        }
       }
      }
     },
     "productIds": {
      "title": "Product IDs or URLs",
      "type": "array",
      "description": "One per line: product URLs, or IDs with a prefix - <code>hd:205594063</code> (Home Depot internet # / OMSID), <code>lowes:1000379005</code> (Lowe's product ID from the URL) or <code>lowes:921987</code> (Lowe's item #). Bare 9-digit numbers are treated as Home Depot IDs, other numbers as Lowe's.",
      "items": {
       "type": "string"
      }
     },
     "maxItems": {
      "title": "Max products (total)",
      "minimum": 1,
      "maximum": 100000,
      "type": "integer",
      "description": "Maximum number of product rows for the whole run (reviews are not counted). Duplicates across inputs are skipped.",
      "default": 50
     },
     "maxItemsPerQuery": {
      "title": "Max products per search/category",
      "minimum": 1,
      "maximum": 2000,
      "type": "integer",
      "description": "How many products to take from each keyword (per retailer) or category URL. Both sites show 24 products per page; Home Depot allows paging to about 700 products per search.",
      "default": 24
     },
     "includeDetails": {
      "title": "Scrape full product details",
      "type": "boolean",
      "description": "Fetch each product's detail data: UPC, model, specifications, description, all images, categories, fulfillment and aisle/bay. Turn off for a faster listing-only scrape (title, price, rating, stock from the search grid).",
      "default": true
     },
     "zipCode": {
      "title": "ZIP code (local store, price and stock)",
      "type": "string",
      "description": "Optional 5-digit US ZIP. The nearest Home Depot and Lowe's stores are used for local price, in-store stock quantity and aisle/bay. Leave empty for online (national) prices."
     },
     "homeDepotStoreId": {
      "title": "Home Depot store ID",
      "type": "string",
      "description": "Optional Home Depot store number (e.g. <code>121</code>), overrides the ZIP lookup. Shown on homedepot.com store pages."
     },
     "lowesStoreId": {
      "title": "Lowe's store ID",
      "type": "string",
      "description": "Optional Lowe's store number (e.g. <code>1807</code>), overrides the ZIP lookup. Recommended for Lowe's - faster and more reliable than a ZIP search."
     },
     "includeReviews": {
      "title": "Scrape reviews",
      "type": "boolean",
      "description": "Also output customer reviews for every product (one row per review, type = review).",
      "default": false
     },
     "maxReviewsPerProduct": {
      "title": "Max reviews per product",
      "minimum": 1,
      "maximum": 5000,
      "type": "integer",
      "description": "Reviews are fetched 10 per request.",
      "default": 20
     },
     "reviewsSort": {
      "title": "Reviews sort",
      "enum": [
       "relevance",
       "newest",
       "oldest",
       "helpful",
       "highest",
       "lowest"
      ],
      "type": "string",
      "description": "Lowe's supports only most relevant and newest; other options fall back to most relevant there.",
      "default": "relevance"
     },
     "proxyConfiguration": {
      "title": "Proxy",
      "type": "object",
      "description": "Defaults to Apify Proxy: datacenter IPs where they work (Lowe's product data) and US residential IPs with real-browser sessions where they are required (Home Depot, Lowe's search pages).",
      "default": {
       "useApifyProxy": true
      }
     },
     "residentialFallback": {
      "title": "Residential fallback",
      "type": "boolean",
      "description": "Use US residential IPs when datacenter IPs are blocked. Required for Home Depot.",
      "default": true
     },
     "useBrowserSessions": {
      "title": "Browser sessions",
      "type": "boolean",
      "description": "Open a real browser once per proxy session to pass the sites' bot protection, then reuse its cookies for fast API requests. Turning this off makes Home Depot and Lowe's search pages fail.",
      "default": true
     },
     "maxConcurrency": {
      "title": "Max concurrency",
      "minimum": 1,
      "maximum": 32,
      "type": "integer",
      "description": "Parallel requests.",
      "default": 8
     },
     "maxRetries": {
      "title": "Max attempts per request",
      "minimum": 2,
      "maximum": 20,
      "type": "integer",
      "description": "Blocked requests are retried with a new IP and session.",
      "default": 8
     }
    }
   },
   "HomeDepotLowesScraperRow": {
    "type": "object",
    "properties": {
     "type": {
      "type": [
       "string",
       "null"
      ],
      "description": "Row type: product, review or error (error rows are free)"
     },
     "retailer": {
      "type": [
       "string",
       "null"
      ],
      "description": "homedepot or lowes"
     },
     "itemId": {
      "type": [
       "string",
       "null"
      ],
      "description": "Home Depot internet # / OMSID, or Lowe's product ID"
     },
     "modelNumber": {
      "type": [
       "string",
       "null"
      ],
      "description": "Manufacturer model number"
     },
     "sku": {
      "type": [
       "string",
       "null"
      ],
      "description": "Home Depot store SKU / Lowe's item #"
     },
     "upc": {
      "type": [
       "string",
       "null"
      ],
      "description": "UPC / barcode"
     },
     "title": {
      "type": [
       "string",
       "null"
      ],
      "description": "Product title"
     },
     "brand": {
      "type": [
       "string",
       "null"
      ],
      "description": "Brand"
     },
     "image": {
      "type": [
       "string",
       "null"
      ],
      "description": "Main image URL"
     },
     "price": {
      "type": [
       "number",
       "null"
      ],
      "description": "Current price (local store price when a store/ZIP is set)"
     },
     "wasPrice": {
      "type": [
       "number",
       "null"
      ],
      "description": "Previous / strike-through price"
     },
     "currency": {
      "type": [
       "string",
       "null"
      ],
      "description": "Currency"
     },
     "unitPrice": {
      "type": [
       "number",
       "string",
       "null"
      ],
      "description": "Price per unit when shown"
     },
     "unitOfMeasure": {
      "type": [
       "string",
       "null"
      ],
      "description": "Unit of measure (Home Depot)"
     },
     "savingsAmount": {
      "type": [
       "number",
       "null"
      ],
      "description": "Savings vs was-price"
     },
     "savingsPercent": {
      "type": [
       "number",
       "null"
      ],
      "description": "Savings percent"
     },
     "promotion": {
      "type": [
       "object",
       "null"
      ],
      "description": "Active promotion (Home Depot)"
     },
     "specialBuy": {
      "type": [
       "boolean",
       "null"
      ],
      "description": "Special Buy / deal of the day (Home Depot)"
     },
     "clearancePrice": {
      "type": [
       "number",
       "null"
      ],
      "description": "In-store clearance price (Home Depot)"
     },
     "priceType": {
      "type": [
       "string",
       "null"
      ],
      "description": "STORE or NETWORK price (Lowe's)"
     },
     "rating": {
      "type": [
       "number",
       "null"
      ],
      "description": "Average rating 1-5"
     },
     "reviewCount": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Number of reviews"
     },
     "availability": {
      "type": [
       "object",
       "null"
      ],
      "description": "online / shipToHome / delivery / pickup / inStore flags, online quantity, delivery dates"
     },
     "storeStockQuantity": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Units on hand at the selected store"
     },
     "storeLimitedStock": {
      "type": [
       "boolean",
       "null"
      ],
      "description": "Limited stock at the store (Home Depot)"
     },
     "aisle": {
      "type": [
       "string",
       "null"
      ],
      "description": "Aisle at the selected store"
     },
     "bay": {
      "type": [
       "string",
       "null"
      ],
      "description": "Bay at the selected store"
     },
     "store": {
      "type": [
       "object",
       "null"
      ],
      "description": "Selected store (id, name, address, city, state, zip)"
     },
     "categories": {
      "type": [
       "array",
       "null"
      ],
      "description": "Category breadcrumb"
     },
     "images": {
      "type": [
       "array",
       "null"
      ],
      "description": "All image URLs"
     },
     "specifications": {
      "type": [
       "array",
       "null"
      ],
      "description": "Specifications {group, name, value}"
     },
     "description": {
      "type": [
       "string",
       "null"
      ],
      "description": "Description"
     },
     "bullets": {
      "type": [
       "array",
       "null"
      ],
      "description": "Feature bullets"
     },
     "highlights": {
      "type": [
       "array",
       "null"
      ],
      "description": "Highlights (Home Depot)"
     },
     "socialProof": {
      "type": [
       "string",
       "null"
      ],
      "description": "Social proof message, e.g. \"100+ bought last week\" (Lowe's)"
     },
     "isSponsored": {
      "type": [
       "boolean",
       "null"
      ],
      "description": "Sponsored listing"
     },
     "url": {
      "type": [
       "string",
       "null"
      ],
      "description": "Product URL"
     },
     "detailsScraped": {
      "type": [
       "boolean",
       "null"
      ],
      "description": "false = listing-only row"
     },
     "source": {
      "type": [
       "object",
       "null"
      ],
      "description": "Which input produced the row (search, page, position)"
     },
     "productTitle": {
      "type": [
       "string",
       "null"
      ],
      "description": "Reviewed product title (review rows)"
     },
     "reviewId": {
      "type": [
       "string",
       "null"
      ],
      "description": "Review ID"
     },
     "reviewTitle": {
      "type": [
       "string",
       "null"
      ],
      "description": "Review title"
     },
     "text": {
      "type": [
       "string",
       "null"
      ],
      "description": "Review text"
     },
     "date": {
      "type": [
       "string",
       "null"
      ],
      "description": "Review date"
     },
     "author": {
      "type": [
       "string",
       "null"
      ],
      "description": "Reviewer nickname"
     },
     "recommended": {
      "type": [
       "boolean",
       "null"
      ],
      "description": "Would recommend"
     },
     "helpfulVotes": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Helpful votes"
     },
     "verifiedPurchase": {
      "type": [
       "boolean",
       "null"
      ],
      "description": "Verified purchaser"
     },
     "incentivized": {
      "type": [
       "boolean",
       "null"
      ],
      "description": "Incentivized review"
     },
     "photos": {
      "type": [
       "array",
       "null"
      ],
      "description": "Review photo URLs"
     },
     "error": {
      "type": [
       "string",
       "null"
      ],
      "description": "Error message (error rows)"
     },
     "scrapedAt": {
      "type": [
       "string",
       "null"
      ],
      "description": "Scrape time (UTC)"
     },
     "isBundle": {
      "type": [
       "boolean",
       "null"
      ],
      "description": "Home Depot bundle (\"sets\") product"
     },
     "detailsError": {
      "type": [
       "string",
       "null"
      ],
      "description": "Why product-page details could not be loaded (listing-only row)"
     }
    }
   },
   "KeywordDifficultyCheckerInput": {
    "type": "object",
    "required": [
     "keywords"
    ],
    "properties": {
     "keywords": {
      "title": "Keywords",
      "minItems": 1,
      "type": "array",
      "description": "Keywords to check, one per line (thousands are fine; they're sent in batches of 1,000). Keywords are trimmed, lower-cased and de-duplicated.",
      "items": {
       "type": "string"
      }
     },
     "location": {
      "title": "Country",
      "type": "string",
      "description": "Country to measure difficulty in: name (<code>United States</code>), 2-letter code (<code>DE</code>) or location code (<code>2840</code>).",
      "default": "United States"
     },
     "language": {
      "title": "Language",
      "type": "string",
      "description": "Language name or code (<code>English</code>, <code>es</code>). Leave empty for the main language of the country."
     },
     "includeSearchIntent": {
      "title": "Add search intent",
      "type": "boolean",
      "description": "Also classify each keyword as informational, navigational, commercial or transactional (small extra charge per keyword, see Pricing).",
      "default": true
     }
    }
   },
   "KeywordDifficultyCheckerRow": {
    "$schema": "http://json-schema.org/draft-07/schema#",
    "type": "object",
    "properties": {
     "keyword": {
      "type": "string",
      "description": "Keyword (normalized, lower-case)"
     },
     "keyword_difficulty": {
      "type": [
       "integer",
       "null"
      ],
      "description": "SEO keyword difficulty, 0-100 (higher = harder to rank). null when the keyword is not in the database"
     },
     "difficulty_level": {
      "type": [
       "string",
       "null"
      ],
      "description": "Difficulty band: very easy, easy, possible, difficult, hard or very hard"
     },
     "search_intent": {
      "type": [
       "string",
       "null"
      ],
      "description": "Main search intent: informational, navigational, commercial or transactional"
     },
     "search_intent_probability": {
      "type": [
       "number",
       "null"
      ],
      "description": "Confidence of the main intent, 0-1"
     },
     "secondary_intents": {
      "type": [
       "array",
       "null"
      ],
      "description": "Other likely intents",
      "items": {
       "type": [
        "string",
        "null"
       ]
      }
     },
     "location": {
      "type": [
       "string",
       "null"
      ],
      "description": "Country the data is for, e.g. \"United States\""
     },
     "language": {
      "type": [
       "string",
       "null"
      ],
      "description": "Language name, e.g. \"English\""
     },
     "found": {
      "type": "boolean",
      "description": "True when a difficulty score was found (only these rows are charged)"
     },
     "note": {
      "type": [
       "string",
       "null"
      ],
      "description": "Explanation when no score was found"
     },
     "scraped_at": {
      "type": [
       "string",
       "null"
      ],
      "description": "When this row was produced (ISO 8601, UTC)"
     }
    },
    "required": [
     "keyword",
     "found"
    ]
   },
   "KeywordGapReportInput": {
    "type": "object",
    "required": [
     "clientDomain",
     "competitors"
    ],
    "properties": {
     "clientDomain": {
      "title": "Your (or your client's) domain",
      "type": "string",
      "description": "The site you want new keywords for, e.g. <code>helpscout.com</code>. <code>https://</code>, <code>www.</code> and paths are removed."
     },
     "competitors": {
      "title": "Competitor domains (up to 3)",
      "minItems": 1,
      "maxItems": 3,
      "type": "array",
      "description": "1 to 3 competitors that rank where you want to rank, e.g. <code>zendesk.com</code>. Pick real search competitors (the sites that outrank you), not only business rivals.",
      "items": {
       "type": "string"
      }
     },
     "location": {
      "title": "Country",
      "type": "string",
      "description": "Country of the Google results: name (<code>United States</code>), 2-letter code (<code>GB</code>) or location code (<code>2840</code>).",
      "default": "United States"
     },
     "language": {
      "title": "Language",
      "type": "string",
      "description": "Language name or code (<code>English</code>, <code>de</code>). Empty = main language of the country."
     },
     "excludeTerms": {
      "title": "Exclude keywords containing",
      "type": "array",
      "description": "Drop keywords that contain any of these words or phrases, e.g. <code>jobs</code>, <code>free download</code>, your own brand. Case-insensitive.",
      "items": {
       "type": "string"
      }
     },
     "excludeCompetitorBrands": {
      "title": "Exclude competitor brand searches",
      "type": "boolean",
      "description": "Drop keywords containing a competitor's name taken from its domain (for example <i>zendesk</i> from zendesk.com). Usually what you want: you can't win \"zendesk pricing\".",
      "default": true
     },
     "topicTerms": {
      "title": "Only keywords about (optional)",
      "type": "array",
      "description": "Keep only keywords containing at least one of these words, e.g. <code>help desk</code>, <code>support</code>, <code>ticket</code>. Useful when competitors are broad sites.",
      "items": {
       "type": "string"
      }
     },
     "minSearchVolume": {
      "title": "Minimum monthly searches",
      "minimum": 0,
      "type": "integer",
      "description": "Skip keywords with fewer Google searches a month. 0 also keeps keywords whose volume is unavailable.",
      "default": 30
     },
     "maxKeywordDifficulty": {
      "title": "Maximum keyword difficulty",
      "minimum": 0,
      "maximum": 100,
      "type": "integer",
      "description": "Skip keywords harder than this (0-100). 100 = no limit.",
      "default": 100
     },
     "maxCompetitorPosition": {
      "title": "Competitor must rank in the top",
      "minimum": 1,
      "maximum": 100,
      "type": "integer",
      "description": "Only count a competitor ranking at this position or better. 20 = first two pages (recommended); 10 = page one only.",
      "default": 20
     },
     "includeNavigational": {
      "title": "Include navigational searches",
      "type": "boolean",
      "description": "Keep brand and login searches (\"x login\", \"x support phone\"). Off by default: they are rarely winnable.",
      "default": false
     },
     "includeCompetitorSubdomains": {
      "title": "Count competitor subdomains",
      "type": "boolean",
      "description": "Also count rankings on competitor subdomains. Off by default, because hosted subdomains (for example customer help centers on <code>*.zendesk.com</code>) are not the competitor's own content.",
      "default": false
     },
     "candidatesPerCompetitor": {
      "title": "Candidates per competitor",
      "minimum": 10,
      "maximum": 100,
      "type": "integer",
      "description": "How many gap keywords to pull per competitor (highest competitor traffic first), before merging duplicates. Max 100, so a report has up to 300.",
      "default": 100
     },
     "liveSerpChecks": {
      "title": "Live Google checks",
      "minimum": 0,
      "maximum": 20,
      "type": "integer",
      "description": "How many of the best candidates to re-check on the live Google top 10 (confirms the gap is still open today). Max 20. 0 = database only.",
      "default": 20
     },
     "preparedBy": {
      "title": "Prepared by (optional)",
      "type": "string",
      "description": "Your name or agency, shown on the HTML report. No Wrenfield branding appears in the report."
     },
     "maxSpendUsd": {
      "title": "Maximum spend (USD)",
      "minimum": 0,
      "type": "integer",
      "description": "Optional. The run stops before collecting anything, and charges nothing, if the report price is above this. Same effect as \"Maximum cost per run\" in Run options."
     }
    }
   },
   "KeywordGapReportRow": {
    "$schema": "http://json-schema.org/draft-07/schema#",
    "type": "object",
    "properties": {
     "rank": {
      "type": "integer",
      "description": "Position in this report (live-confirmed gaps first, then by opportunity score)"
     },
     "keyword": {
      "type": "string",
      "description": "Keyword at least one competitor ranks for on Google and the client domain does not"
     },
     "opportunity_score": {
      "type": "number",
      "description": "0-100: 25% demand, 20% ease (100 - KD), 20% topic fit, 15% competitor overlap, 10% intent, 10% best competitor position"
     },
     "search_volume": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Average monthly Google searches (Google Ads data). null = unavailable"
     },
     "search_volume_status": {
      "type": "string",
      "description": "measured, zero (Google reports no searches) or unavailable (no value; not the same as zero)"
     },
     "search_volume_month": {
      "type": [
       "string",
       "null"
      ],
      "description": "Latest month covered by the volume data (YYYY-MM)"
     },
     "cpc_usd": {
      "type": [
       "number",
       "null"
      ],
      "description": "Average Google Ads cost per click, USD"
     },
     "competition_level": {
      "type": [
       "string",
       "null"
      ],
      "description": "Google Ads competition: LOW, MEDIUM, HIGH"
     },
     "topic_fit": {
      "type": [
       "number",
       "null"
      ],
      "description": "0-1: share of the keyword's words found on the client's homepage (title, headings, links). null = site could not be read"
     },
     "topic_fit_status": {
      "type": "string",
      "description": "measured or unavailable"
     },
     "keyword_difficulty": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Keyword difficulty 0-100. null = unavailable"
     },
     "keyword_difficulty_status": {
      "type": "string",
      "description": "measured or unavailable"
     },
     "search_intent": {
      "type": [
       "string",
       "null"
      ],
      "description": "Main intent: informational, commercial, transactional, navigational"
     },
     "search_intent_status": {
      "type": "string",
      "description": "measured or unavailable"
     },
     "competitors_ranking": {
      "type": "integer",
      "description": "How many of the competitors rank for the keyword (database)"
     },
     "competitor_positions": {
      "type": "string",
      "description": "Each ranking competitor with its Google position, e.g. 'zendesk.com #4; intercom.com #7'"
     },
     "best_competitor": {
      "type": "string",
      "description": "Competitor with the best position"
     },
     "best_competitor_position": {
      "type": [
       "integer",
       "null"
      ],
      "description": "That competitor's Google position (database)"
     },
     "best_competitor_url": {
      "type": [
       "string",
       "null"
      ],
      "description": "The competitor page that ranks"
     },
     "competing_urls": {
      "type": "string",
      "description": "All ranking competitor URLs, separated with ' | '"
     },
     "competitor_traffic_estimate": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Modeled monthly visits competitors get from the keyword (provider estimate)"
     },
     "serp_features_labs": {
      "type": "string",
      "description": "SERP features seen in the database snapshot (AI Overview, People Also Ask, ...)"
     },
     "selection_reasons": {
      "type": "string",
      "description": "Why the keyword was picked, in plain language, separated with '; '"
     },
     "live_checked": {
      "type": "boolean",
      "description": "Whether the keyword was re-checked on the live Google top 10"
     },
     "live_verdict": {
      "type": "string",
      "description": "open gap, client already ranks, competitors not in top 10 now, check failed, or not checked"
     },
     "client_position_live": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Client's live Google position if in the top 10, else null"
     },
     "competitor_positions_live": {
      "type": [
       "string",
       "null"
      ],
      "description": "Competitors in the live top 10 with positions"
     },
     "top10_domains_live": {
      "type": [
       "string",
       "null"
      ],
      "description": "Domains in the live top 10, in order"
     },
     "serp_features_live": {
      "type": [
       "string",
       "null"
      ],
      "description": "SERP features on the live page"
     },
     "ai_overview_live": {
      "type": [
       "boolean",
       "null"
      ],
      "description": "An AI Overview was shown on the live page"
     },
     "ai_overview_cites_client": {
      "type": [
       "boolean",
       "null"
      ],
      "description": "The live AI Overview cites the client domain (null if no AI Overview)"
     },
     "labs_serp_observed_at": {
      "type": [
       "string",
       "null"
      ],
      "description": "When the provider last observed the Google results behind the database rankings (observation time)"
     },
     "labs_retrieved_at": {
      "type": "string",
      "description": "When this run queried the database (retrieval time)"
     },
     "serp_checked_at": {
      "type": [
       "string",
       "null"
      ],
      "description": "When the live Google results were observed"
     },
     "serp_retrieved_at": {
      "type": [
       "string",
       "null"
      ],
      "description": "When this run requested the live check"
     },
     "client_domain": {
      "type": "string",
      "description": "Client domain"
     },
     "competitors": {
      "type": "string",
      "description": "Competitors used"
     },
     "location": {
      "type": "string",
      "description": "Country"
     },
     "language": {
      "type": "string",
      "description": "Language"
     }
    }
   },
   "KeywordResearchToolInput": {
    "type": "object",
    "required": [
     "seedKeywords"
    ],
    "properties": {
     "seedKeywords": {
      "title": "Seed keywords",
      "minItems": 1,
      "type": "array",
      "description": "One or more topics to research, e.g. <code>running shoes</code>. \"Ideas\" mode accepts up to 200 seeds at once; \"suggestions\" and \"related\" use up to 20.",
      "items": {
       "type": "string"
      }
     },
     "mode": {
      "title": "Research mode",
      "enum": [
       "ideas",
       "suggestions",
       "related"
      ],
      "type": "string",
      "description": "How keywords are found. <b>ideas</b> = topically related keywords, <b>suggestions</b> = phrase-match long tail containing your seed, <b>related</b> = Google related-searches graph.",
      "default": "ideas"
     },
     "location": {
      "title": "Country",
      "type": "string",
      "description": "Country: name (<code>United States</code>), 2-letter code (<code>DE</code>) or location code (<code>2840</code>).",
      "default": "United States"
     },
     "language": {
      "title": "Language",
      "type": "string",
      "description": "Language name or code (<code>English</code>, <code>es</code>). Leave empty for the main language of the country."
     },
     "maxKeywords": {
      "title": "Max keywords",
      "minimum": 1,
      "maximum": 10000,
      "type": "integer",
      "description": "Maximum keyword rows per run, including the seed keywords. The default of 100 finishes in a few seconds.",
      "default": 100
     },
     "sortBy": {
      "title": "Sort by",
      "enum": [
       "relevance",
       "search_volume",
       "cpc",
       "easiest"
      ],
      "type": "string",
      "description": "Which keywords come first (and are kept when you hit Max keywords).",
      "default": "relevance"
     },
     "minSearchVolume": {
      "title": "Min search volume",
      "minimum": 0,
      "type": "integer",
      "description": "Only keywords with at least this many monthly searches."
     },
     "maxKeywordDifficulty": {
      "title": "Max keyword difficulty",
      "minimum": 0,
      "maximum": 100,
      "type": "integer",
      "description": "Only keywords with KD at or below this value (0-100). Use 30 to find easy wins."
     },
     "searchIntents": {
      "title": "Search intents",
      "type": "array",
      "description": "Only keywords with these main intents. Leave empty for all.",
      "items": {
       "type": "string",
       "enum": [
        "informational",
        "navigational",
        "commercial",
        "transactional"
       ],
       "enumTitles": [
        "Informational",
        "Navigational",
        "Commercial",
        "Transactional"
       ]
      }
     },
     "includeSeedKeywords": {
      "title": "Include the seed keywords",
      "type": "boolean",
      "description": "Add a row with full metrics for each seed keyword (one extra data request).",
      "default": true
     },
     "includeMonthlySearches": {
      "title": "Include monthly search history",
      "type": "boolean",
      "description": "Add the last 12 months of search volume to each row.",
      "default": false
     },
     "relatedDepth": {
      "title": "Related depth",
      "minimum": 1,
      "maximum": 4,
      "type": "integer",
      "description": "Only for \"related\" mode: how many levels of related searches to follow (more = more keywords).",
      "default": 2
     }
    }
   },
   "KeywordResearchToolRow": {
    "$schema": "http://json-schema.org/draft-07/schema#",
    "type": "object",
    "properties": {
     "keyword": {
      "type": "string",
      "description": "Keyword (lower-case)"
     },
     "type": {
      "type": "string",
      "description": "seed = one of your seed keywords; idea / suggestion / related = a keyword found from the seeds",
      "enum": [
       "seed",
       "idea",
       "suggestion",
       "related"
      ]
     },
     "seed_keyword": {
      "type": [
       "string",
       "null"
      ],
      "description": "Seed keyword the row came from (null in ideas mode with several seeds)"
     },
     "search_volume": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Average monthly Google searches (last 12 months)"
     },
     "cpc": {
      "type": [
       "number",
       "null"
      ],
      "description": "Average Google Ads cost per click (USD)"
     },
     "competition": {
      "type": [
       "string",
       "null"
      ],
      "description": "Google Ads competition level: LOW, MEDIUM or HIGH"
     },
     "competition_index": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Google Ads competition, 0-100"
     },
     "low_top_of_page_bid": {
      "type": [
       "number",
       "null"
      ],
      "description": "Top-of-page bid, low range (USD)"
     },
     "high_top_of_page_bid": {
      "type": [
       "number",
       "null"
      ],
      "description": "Top-of-page bid, high range (USD)"
     },
     "keyword_difficulty": {
      "type": [
       "integer",
       "null"
      ],
      "description": "SEO keyword difficulty 0-100 (higher = harder to reach the top 10)"
     },
     "difficulty_level": {
      "type": [
       "string",
       "null"
      ],
      "description": "very easy (0-14), easy (15-29), possible (30-49), difficult (50-69), hard (70-84), very hard (85-100)"
     },
     "search_intent": {
      "type": [
       "string",
       "null"
      ],
      "description": "Main search intent: informational, navigational, commercial or transactional"
     },
     "secondary_intents": {
      "type": [
       "array",
       "null"
      ],
      "description": "Other likely intents",
      "items": {
       "type": "string"
      }
     },
     "serp_features": {
      "type": [
       "array",
       "null"
      ],
      "description": "Google result types on the first page, e.g. ai_overview, people_also_ask, local_pack, popular_products, video",
      "items": {
       "type": "string"
      }
     },
     "has_ai_overview": {
      "type": [
       "boolean",
       "null"
      ],
      "description": "Google shows an AI Overview for this keyword"
     },
     "has_featured_snippet": {
      "type": [
       "boolean",
       "null"
      ],
      "description": "Google shows a featured snippet"
     },
     "has_people_also_ask": {
      "type": [
       "boolean",
       "null"
      ],
      "description": "Google shows People Also Ask questions"
     },
     "has_local_pack": {
      "type": [
       "boolean",
       "null"
      ],
      "description": "Google shows a local map pack"
     },
     "has_shopping_results": {
      "type": [
       "boolean",
       "null"
      ],
      "description": "Google shows shopping / product results"
     },
     "has_video": {
      "type": [
       "boolean",
       "null"
      ],
      "description": "Google shows video results"
     },
     "has_images": {
      "type": [
       "boolean",
       "null"
      ],
      "description": "Google shows image results"
     },
     "has_ads": {
      "type": [
       "boolean",
       "null"
      ],
      "description": "Google showed ads when the results page was last checked"
     },
     "serp_results_count": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Number of results Google reports for the keyword"
     },
     "word_count": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Number of words in the keyword"
     },
     "avg_backlinks_top10": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Average backlinks of the pages ranking in the top 10"
     },
     "avg_referring_domains_top10": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Average referring domains of the pages ranking in the top 10"
     },
     "search_volume_trend": {
      "type": [
       "object",
       "null"
      ],
      "description": "Search volume change in %: monthly, quarterly and yearly"
     },
     "monthly_searches": {
      "type": [
       "array",
       "null"
      ],
      "description": "Last 12 months of search volume (only with includeMonthlySearches)"
     },
     "related_depth": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Related mode only: how many related-search hops from the seed"
     },
     "location": {
      "type": [
       "string",
       "null"
      ],
      "description": "Country the data is for, e.g. \"United States\""
     },
     "language": {
      "type": [
       "string",
       "null"
      ],
      "description": "Language name, e.g. \"English\""
     },
     "data_updated_at": {
      "type": [
       "string",
       "null"
      ],
      "description": "When the keyword metrics were last updated (ISO 8601, UTC)"
     },
     "scraped_at": {
      "type": [
       "string",
       "null"
      ],
      "description": "When this row was produced (ISO 8601, UTC)"
     }
    },
    "required": [
     "keyword",
     "type"
    ]
   },
   "KeywordSearchVolumeInput": {
    "type": "object",
    "required": [
     "keywords"
    ],
    "properties": {
     "keywords": {
      "title": "Keywords",
      "minItems": 1,
      "type": "array",
      "description": "Keywords to look up, one per line (thousands are fine). Used as <b>seed keywords</b> when you ask for keyword ideas. Keywords are trimmed, lower-cased and de-duplicated; match-type symbols like <code>[exact]</code> or <code>\"phrase\"</code> and characters Google Ads does not accept are removed. Max 80 characters and 10 words per keyword. Large lists are split into batches of 1,000 automatically. Keywords without data are free.",
      "items": {
       "type": "string"
      }
     },
     "mode": {
      "title": "What to get",
      "enum": [
       "search_volume",
       "keyword_ideas",
       "both"
      ],
      "type": "string",
      "description": "<b>Search volume</b>: metrics for exactly the keywords you enter. <b>Keyword ideas</b>: new related keywords (with the same metrics) generated from your seed keywords, like Google Keyword Planner's 'Discover new keywords'. <b>Both</b>: metrics for your keywords plus ideas.",
      "default": "search_volume"
     },
     "location": {
      "title": "Location",
      "type": "string",
      "description": "Country (<code>United States</code>, <code>US</code>, <code>2840</code>), state or region (<code>California</code>, <code>Bavaria,Germany</code>), city (<code>London</code>, <code>Austin, TX</code>, <code>New York,New York,United States</code>) or <code>Worldwide</code>. Plain names are matched to the Google Ads location list; if a name is ambiguous the run note says which place was used. State, city and worldwide lookups use live Google Ads data.",
      "default": "United States"
     },
     "language": {
      "title": "Language",
      "type": "string",
      "description": "Language name (<code>English</code>, <code>Spanish</code>) or code (<code>en</code>, <code>es</code>). Leave empty to use the main language of the location (e.g. German for Germany)."
     },
     "includeMonthlySearches": {
      "title": "Include monthly search history",
      "type": "boolean",
      "description": "Add the month-by-month search volume (last 12 months by default, or the date range below) to every result.",
      "default": true
     },
     "dateFrom": {
      "title": "History from (month)",
      "pattern": "^$|^\\d{4}-\\d{2}(-\\d{2})?$",
      "type": "string",
      "description": "Optional start month of the monthly history, format <code>YYYY-MM</code> (e.g. <code>2024-01</code>). Up to 4 years back. Leave empty for the last 12 months."
     },
     "dateTo": {
      "title": "History to (month)",
      "pattern": "^$|^\\d{4}-\\d{2}(-\\d{2})?$",
      "type": "string",
      "description": "Optional end month of the monthly history, format <code>YYYY-MM</code>. Google publishes data for the previous month only, so later months are capped automatically."
     },
     "ideasMethod": {
      "title": "Keyword ideas method",
      "enum": [
       "keyword_ideas",
       "keyword_suggestions",
       "related_keywords"
      ],
      "type": "string",
      "description": "Only used for keyword ideas. With the <b>Google Ads API</b> data source, ideas come from Keyword Planner's 'Discover new keywords' (up to 20 seed keywords per request) and this setting is ignored. With the <b>keyword database</b>: <b>Keyword Planner-style ideas</b> = keywords about the same topic; <b>Long-tail suggestions</b> = phrases that contain your seed keyword; <b>Related searches</b> = Google's 'related searches' for your seed keyword.",
      "default": "keyword_ideas"
     },
     "maxIdeas": {
      "title": "Max keyword ideas",
      "minimum": 1,
      "maximum": 20000,
      "type": "integer",
      "description": "Maximum number of keyword ideas to return in total per run. You only pay for ideas that are returned.",
      "default": 100
     },
     "minSearchVolume": {
      "title": "Minimum search volume for ideas",
      "minimum": 0,
      "type": "integer",
      "description": "Skip keyword ideas with a lower average monthly search volume (e.g. <code>100</code> to drop tiny long-tail phrases). 0 = keep all ideas that have data.",
      "default": 0
     },
     "dataSource": {
      "title": "Data source",
      "enum": [
       "google_ads",
       "keyword_database",
       "auto"
      ],
      "type": "string",
      "description": "<b>Google Ads API</b> (default): queries Google Ads (Keyword Planner) live, up to 1,000 keywords per request, and returns a row for every keyword Google knows. Adds a small per-request fee (see Pricing). <b>Keyword database</b>: a database built from Google Ads data, refreshed monthly; no request fee, also returns keyword difficulty and search intent, country-level locations only. <b>Auto</b>: keyword database for country-level searches, Google Ads API for regions/cities or languages the database does not cover.",
      "default": "google_ads"
     },
     "googleAdsMode": {
      "title": "Google Ads request mode",
      "enum": [
       "live",
       "queued"
      ],
      "type": "string",
      "description": "Only used when the Google Ads API is queried. <b>Live</b> (default): results in seconds. <b>Queued</b>: cheaper per-request fee, but results usually take a few minutes and can take longer at peak times; the run waits for them. If a queued run times out, run it again with the same input to collect the results without paying the request fee again.",
      "default": "live"
     },
     "queuedMaxWaitMinutes": {
      "title": "Max wait for queued results (minutes)",
      "minimum": 1,
      "maximum": 1440,
      "type": "integer",
      "description": "Queued mode only: how long the run waits for Google Ads results before stopping (it never waits past the run timeout).",
      "default": 120
     }
    }
   },
   "KeywordSearchVolumeRow": {
    "type": "object",
    "properties": {
     "keyword": {
      "type": "string",
      "description": "Keyword (normalized, lower-case)"
     },
     "type": {
      "type": "string",
      "description": "keyword = one of your input keywords; idea = a keyword idea generated from your seed keywords"
     },
     "seed_keyword": {
      "type": [
       "string",
       "null"
      ],
      "description": "Seed keyword(s) an idea was generated from"
     },
     "location": {
      "type": [
       "string",
       "null"
      ],
      "description": "Location name"
     },
     "location_code": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Google Ads location code (e.g. 2840 = United States)"
     },
     "language": {
      "type": [
       "string",
       "null"
      ]
     },
     "language_code": {
      "type": [
       "string",
       "null"
      ]
     },
     "search_volume": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Average monthly searches (last 12 months)"
     },
     "cpc": {
      "type": [
       "number",
       "null"
      ],
      "description": "Average cost per click in USD"
     },
     "competition": {
      "type": [
       "string",
       "null"
      ],
      "description": "Paid search competition level: LOW, MEDIUM or HIGH"
     },
     "competition_index": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Paid search competition index, 0-100"
     },
     "low_top_of_page_bid": {
      "type": [
       "number",
       "null"
      ],
      "description": "Top-of-page bid, low range (USD)"
     },
     "high_top_of_page_bid": {
      "type": [
       "number",
       "null"
      ],
      "description": "Top-of-page bid, high range (USD)"
     },
     "keyword_difficulty": {
      "type": [
       "integer",
       "null"
      ],
      "description": "SEO ranking difficulty 0-100 (keyword database only)"
     },
     "search_intent": {
      "type": [
       "string",
       "null"
      ],
      "description": "informational, navigational, commercial or transactional (keyword database only)"
     },
     "trend": {
      "type": [
       "object",
       "null"
      ],
      "description": "Search volume change in % of the latest month vs. previous month / 3 months / 12 months earlier"
     },
     "search_volume_avg_in_range": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Average monthly searches within the requested date range (only when a date range is set)"
     },
     "monthly_searches": {
      "type": "array",
      "description": "Monthly search volume history, oldest to newest: {date, year, month, search_volume}"
     },
     "found": {
      "type": "boolean",
      "description": "true if search volume data was found (only these rows are charged)"
     },
     "spell": {
      "type": [
       "string",
       "null"
      ],
      "description": "Google's spelling correction, if the keyword looked misspelled"
     },
     "note": {
      "type": [
       "string",
       "null"
      ],
      "description": "Explanation when no data was found"
     },
     "source": {
      "type": "string",
      "description": "keyword_database, google_ads_live or google_ads_queued"
     },
     "data_updated_at": {
      "type": [
       "string",
       "null"
      ],
      "description": "When the keyword's metrics were last refreshed (keyword database)"
     },
     "scraped_at": {
      "type": "string",
      "description": "When this row was produced (UTC)"
     }
    },
    "required": [
     "keyword",
     "type",
     "found",
     "source"
    ]
   },
   "PeopleAlsoAskScraperInput": {
    "type": "object",
    "required": [
     "keywords"
    ],
    "properties": {
     "keywords": {
      "title": "Keywords",
      "minItems": 1,
      "type": "array",
      "description": "Google searches to check, one per line. Each keyword is one Google search.",
      "items": {
       "type": "string"
      }
     },
     "location": {
      "title": "Location",
      "type": "string",
      "description": "Country name (<code>United States</code>), 2-letter code (<code>GB</code>), location code (<code>2840</code>) or a full Google location name for cities and regions (e.g. <code>London,England,United Kingdom</code>).",
      "default": "United States"
     },
     "language": {
      "title": "Language",
      "type": "string",
      "description": "Language name or code (<code>English</code>, <code>fr</code>). Leave empty for the main language of the country."
     },
     "clickDepth": {
      "title": "Question depth",
      "minimum": 1,
      "maximum": 4,
      "type": "integer",
      "description": "How many levels of People Also Ask to open. 1 = the questions shown on the page (usually 4). 2-4 = also the follow-up questions Google reveals when a question is clicked (usually 8-20 questions in total).",
      "default": 2
     },
     "includeRelatedSearches": {
      "title": "Include related searches",
      "type": "boolean",
      "description": "Also save the \"related searches\" at the bottom of the results page (free).",
      "default": true
     },
     "includeAiOverview": {
      "title": "Include AI Overview",
      "type": "boolean",
      "description": "Also save Google's AI Overview text and its cited sources when Google shows one (extra charge per keyword, see Pricing).",
      "default": false
     },
     "device": {
      "title": "Device",
      "enum": [
       "desktop",
       "mobile"
      ],
      "type": "string",
      "description": "Desktop or mobile Google results.",
      "default": "desktop"
     }
    }
   },
   "PeopleAlsoAskScraperRow": {
    "$schema": "http://json-schema.org/draft-07/schema#",
    "type": "object",
    "properties": {
     "keyword": {
      "type": "string",
      "description": "Keyword searched on Google"
     },
     "type": {
      "type": "string",
      "description": "Row type: question (People Also Ask), related_search or ai_overview",
      "enum": [
       "question",
       "related_search",
       "ai_overview"
      ]
     },
     "text": {
      "type": "string",
      "description": "The question, related search, or AI Overview text"
     },
     "position": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Order on the results page (1 = first)"
     },
     "level": {
      "type": [
       "integer",
       "null"
      ],
      "description": "1 = shown directly, 2 = revealed by clicking another question"
     },
     "parent_question": {
      "type": [
       "string",
       "null"
      ],
      "description": "Question that was clicked to reveal this one (level 2)"
     },
     "answer": {
      "type": [
       "string",
       "null"
      ],
      "description": "Answer snippet shown under the question, when available"
     },
     "answer_title": {
      "type": [
       "string",
       "null"
      ],
      "description": "Title of the page the answer comes from"
     },
     "answer_url": {
      "type": [
       "string",
       "null"
      ],
      "description": "URL of the page the answer comes from"
     },
     "answer_domain": {
      "type": [
       "string",
       "null"
      ],
      "description": "Domain of the page the answer comes from"
     },
     "ai_overview_references": {
      "type": [
       "array",
       "null"
      ],
      "description": "Sources cited by the AI Overview (ai_overview rows only)",
      "items": {
       "type": "object",
       "properties": {
        "title": {
         "type": [
          "string",
          "null"
         ]
        },
        "url": {
         "type": [
          "string",
          "null"
         ]
        },
        "domain": {
         "type": [
          "string",
          "null"
         ]
        }
       }
      }
     },
     "location": {
      "type": [
       "string",
       "null"
      ],
      "description": "Country the data is for, e.g. \"United States\""
     },
     "language": {
      "type": [
       "string",
       "null"
      ],
      "description": "Language name, e.g. \"English\""
     },
     "device": {
      "type": [
       "string",
       "null"
      ],
      "description": "desktop or mobile"
     },
     "scraped_at": {
      "type": [
       "string",
       "null"
      ],
      "description": "When this row was produced (ISO 8601, UTC)"
     }
    },
    "required": [
     "keyword",
     "type",
     "text"
    ]
   },
   "SecFormDScraperInput": {
    "type": "object",
    "properties": {
     "dateFrom": {
      "title": "Filed from",
      "type": "string",
      "description": "Earliest SEC filing date (inclusive). An absolute date like <code>2026-09-01</code> or a relative one like <code>7 days</code>. Defaults to 7 days before <i>Filed to</i>. Form D data is available from 2009-03-16."
     },
     "dateTo": {
      "title": "Filed to",
      "type": "string",
      "description": "Latest SEC filing date (inclusive). Leave empty for today. Results are returned newest first."
     },
     "states": {
      "title": "Issuer states",
      "type": "array",
      "description": "Only filings whose issuer's principal place of business is in these US states (business address on the Form D). Leave empty for all states and countries.",
      "items": {
       "type": "string",
       "enum": [
        "AL",
        "AK",
        "AZ",
        "AR",
        "CA",
        "CO",
        "CT",
        "DE",
        "DC",
        "FL",
        "GA",
        "HI",
        "ID",
        "IL",
        "IN",
        "IA",
        "KS",
        "KY",
        "LA",
        "ME",
        "MD",
        "MA",
        "MI",
        "MN",
        "MS",
        "MO",
        "MT",
        "NE",
        "NV",
        "NH",
        "NJ",
        "NM",
        "NY",
        "NC",
        "ND",
        "OH",
        "OK",
        "OR",
        "PA",
        "RI",
        "SC",
        "SD",
        "TN",
        "TX",
        "UT",
        "VT",
        "VA",
        "WA",
        "WV",
        "WI",
        "WY",
        "PR",
        "GU",
        "VI"
       ],
       "enumTitles": [
        "Alabama (AL)",
        "Alaska (AK)",
        "Arizona (AZ)",
        "Arkansas (AR)",
        "California (CA)",
        "Colorado (CO)",
        "Connecticut (CT)",
        "Delaware (DE)",
        "District of Columbia (DC)",
        "Florida (FL)",
        "Georgia (GA)",
        "Hawaii (HI)",
        "Idaho (ID)",
        "Illinois (IL)",
        "Indiana (IN)",
        "Iowa (IA)",
        "Kansas (KS)",
        "Kentucky (KY)",
        "Louisiana (LA)",
        "Maine (ME)",
        "Maryland (MD)",
        "Massachusetts (MA)",
        "Michigan (MI)",
        "Minnesota (MN)",
        "Mississippi (MS)",
        "Missouri (MO)",
        "Montana (MT)",
        "Nebraska (NE)",
        "Nevada (NV)",
        "New Hampshire (NH)",
        "New Jersey (NJ)",
        "New Mexico (NM)",
        "New York (NY)",
        "North Carolina (NC)",
        "North Dakota (ND)",
        "Ohio (OH)",
        "Oklahoma (OK)",
        "Oregon (OR)",
        "Pennsylvania (PA)",
        "Rhode Island (RI)",
        "South Carolina (SC)",
        "South Dakota (SD)",
        "Tennessee (TN)",
        "Texas (TX)",
        "Utah (UT)",
        "Vermont (VT)",
        "Virginia (VA)",
        "Washington (WA)",
        "West Virginia (WV)",
        "Wisconsin (WI)",
        "Wyoming (WY)",
        "Puerto Rico (PR)",
        "Guam (GU)",
        "U.S. Virgin Islands (VI)"
       ]
      }
     },
     "industryGroups": {
      "title": "Industry groups",
      "type": "array",
      "description": "Form D industry groups (as selected by the issuer). Pick a whole sector (e.g. <b>Technology (all)</b>) or a specific group. Leave empty for all industries.",
      "items": {
       "type": "string",
       "enum": [
        "Agriculture",
        "Banking & Financial Services",
        "Commercial Banking",
        "Insurance",
        "Investing",
        "Investment Banking",
        "Pooled Investment Fund",
        "Other Banking and Financial Services",
        "Business Services",
        "Energy",
        "Coal Mining",
        "Electric Utilities",
        "Energy Conservation",
        "Environmental Services",
        "Oil and Gas",
        "Other Energy",
        "Health Care",
        "Biotechnology",
        "Health Insurance",
        "Hospitals and Physicians",
        "Pharmaceuticals",
        "Other Health Care",
        "Manufacturing",
        "Real Estate",
        "Commercial",
        "Construction",
        "REITS and Finance",
        "Residential",
        "Other Real Estate",
        "Retailing",
        "Restaurants",
        "Technology",
        "Computers",
        "Telecommunications",
        "Other Technology",
        "Travel",
        "Airlines and Airports",
        "Lodging and Conventions",
        "Tourism and Travel Services",
        "Other Travel",
        "Other"
       ],
       "enumTitles": [
        "Agriculture",
        "Banking & Financial Services (all)",
        "Banking & Financial Services: Commercial Banking",
        "Banking & Financial Services: Insurance",
        "Banking & Financial Services: Investing",
        "Banking & Financial Services: Investment Banking",
        "Banking & Financial Services: Pooled Investment Fund",
        "Banking & Financial Services: Other Banking and Financial Services",
        "Business Services",
        "Energy (all)",
        "Energy: Coal Mining",
        "Energy: Electric Utilities",
        "Energy: Energy Conservation",
        "Energy: Environmental Services",
        "Energy: Oil and Gas",
        "Energy: Other Energy",
        "Health Care (all)",
        "Health Care: Biotechnology",
        "Health Care: Health Insurance",
        "Health Care: Hospitals and Physicians",
        "Health Care: Pharmaceuticals",
        "Health Care: Other Health Care",
        "Manufacturing",
        "Real Estate (all)",
        "Real Estate: Commercial",
        "Real Estate: Construction",
        "Real Estate: REITS and Finance",
        "Real Estate: Residential",
        "Real Estate: Other Real Estate",
        "Retailing",
        "Restaurants",
        "Technology (all)",
        "Technology: Computers",
        "Technology: Telecommunications",
        "Technology: Other Technology",
        "Travel (all)",
        "Travel: Airlines and Airports",
        "Travel: Lodging and Conventions",
        "Travel: Tourism and Travel Services",
        "Travel: Other Travel",
        "Other"
       ]
      }
     },
     "excludePooledFunds": {
      "title": "Startups and operating companies only (exclude pooled investment funds)",
      "type": "boolean",
      "description": "About 60% of Form D filings are pooled investment funds (VC, PE, hedge and real-estate funds raising from LPs). Keep this on to get operating companies and startups only. Turn it off to include funds, e.g. to track new VC funds.",
      "default": true
     },
     "minOfferingAmount": {
      "title": "Minimum offering amount (USD)",
      "minimum": 0,
      "type": "integer",
      "description": "Only offerings whose total offering amount is at least this. Offerings marked \"Indefinite\" pass this filter."
     },
     "maxOfferingAmount": {
      "title": "Maximum offering amount (USD)",
      "minimum": 0,
      "type": "integer",
      "description": "Only offerings whose total offering amount is at most this. Offerings marked \"Indefinite\" are excluded when this is set."
     },
     "minAmountSold": {
      "title": "Minimum amount already sold (USD)",
      "minimum": 0,
      "type": "integer",
      "description": "Only offerings that have already raised at least this much (total amount sold)."
     },
     "keyword": {
      "title": "Company name or keyword",
      "type": "string",
      "description": "Full-text search across the Form D (issuer name, people, addresses...). Examples: <code>Acme</code>, <code>software</code>, <code>\"artificial intelligence\"</code> (quotes = exact phrase)."
     },
     "filingType": {
      "title": "New filings or amendments",
      "enum": [
       "new",
       "amendments",
       "all"
      ],
      "type": "string",
      "description": "A new Form D is filed within 15 days after the first sale of a new offering. Amendments (D/A) update an existing offering, e.g. more money raised or the annual renewal.",
      "default": "new"
     },
     "exemptions": {
      "title": "Exemptions claimed",
      "type": "array",
      "description": "Only filings claiming at least one of these exemptions. 506(b) is the classic private round; 506(c) allows general solicitation (accredited investors verified).",
      "items": {
       "type": "string",
       "enum": [
        "506b",
        "506c",
        "504",
        "4a5",
        "3c"
       ],
       "enumTitles": [
        "Rule 506(b)",
        "Rule 506(c)",
        "Rule 504",
        "Section 4(a)(5)",
        "Investment Company Act 3(c) (funds)"
       ]
      }
     },
     "includeIssuerHistory": {
      "title": "Add issuer history (first-time raise, EIN)",
      "type": "boolean",
      "description": "Looks up the issuer on SEC EDGAR to add EIN, SIC code, how many Form Ds it filed before, the date of its first Form D, and <code>isFirstFormD</code> (a first-time raise). One extra SEC request per company.",
      "default": true
     },
     "maxItems": {
      "title": "Max filings",
      "minimum": 1,
      "type": "integer",
      "description": "Stop after saving this many filings. You are only charged for filings saved to the dataset.",
      "default": 100
     }
    }
   },
   "SecFormDScraperRow": {
    "type": "object",
    "properties": {
     "issuerName": {
      "type": "string",
      "description": "Issuer (company) name"
     },
     "cik": {
      "type": "string",
      "description": "SEC Central Index Key"
     },
     "formType": {
      "type": "string",
      "description": "D (new) or D/A (amendment)"
     },
     "isAmendment": {
      "type": "boolean"
     },
     "filingDate": {
      "type": [
       "string",
       "null"
      ],
      "description": "Date filed with the SEC (YYYY-MM-DD)"
     },
     "accessionNumber": {
      "type": "string",
      "description": "SEC accession number"
     },
     "previousAccessionNumber": {
      "type": [
       "string",
       "null"
      ],
      "description": "For amendments: the filing being amended"
     },
     "filingUrl": {
      "type": "string",
      "description": "EDGAR filing index page"
     },
     "formUrl": {
      "type": [
       "string",
       "null"
      ],
      "description": "Human-readable Form D on sec.gov"
     },
     "xmlUrl": {
      "type": [
       "string",
       "null"
      ],
      "description": "Raw primary_doc.xml"
     },
     "industrySector": {
      "type": [
       "string",
       "null"
      ],
      "description": "Form D sector (Technology, Health Care, Real Estate...)"
     },
     "industryGroup": {
      "type": [
       "string",
       "null"
      ],
      "description": "Form D industry group"
     },
     "investmentFundType": {
      "type": [
       "string",
       "null"
      ],
      "description": "For pooled funds: VC, PE, hedge, other"
     },
     "isPooledInvestmentFund": {
      "type": [
       "boolean",
       "null"
      ],
      "description": ""
     },
     "isLikelySpv": {
      "type": [
       "boolean",
       "null"
      ],
      "description": "Name suggests an SPV / series LLC"
     },
     "entityType": {
      "type": [
       "string",
       "null"
      ],
      "description": "Corporation, LLC, LP..."
     },
     "stateOfIncorporation": {
      "type": [
       "string",
       "null"
      ],
      "description": "Jurisdiction of incorporation"
     },
     "yearOfIncorporation": {
      "type": [
       "number",
       "null"
      ],
      "description": "Year of incorporation (only reported if within 5 years)"
     },
     "incorporatedWithinFiveYears": {
      "type": [
       "boolean",
       "null"
      ],
      "description": ""
     },
     "yearOfIncorporationText": {
      "type": [
       "string",
       "null"
      ],
      "description": ""
     },
     "street1": {
      "type": [
       "string",
       "null"
      ],
      "description": ""
     },
     "street2": {
      "type": [
       "string",
       "null"
      ],
      "description": ""
     },
     "city": {
      "type": [
       "string",
       "null"
      ],
      "description": ""
     },
     "state": {
      "type": [
       "string",
       "null"
      ],
      "description": "Business address state/country code"
     },
     "stateName": {
      "type": [
       "string",
       "null"
      ],
      "description": ""
     },
     "zipCode": {
      "type": [
       "string",
       "null"
      ],
      "description": ""
     },
     "fullAddress": {
      "type": [
       "string",
       "null"
      ],
      "description": ""
     },
     "phone": {
      "type": [
       "string",
       "null"
      ],
      "description": "Issuer phone"
     },
     "previousNames": {
      "type": "array",
      "description": ""
     },
     "totalOfferingAmount": {
      "type": [
       "number",
       "null"
      ],
      "description": "Total offering amount in USD (null if indefinite)"
     },
     "isOfferingAmountIndefinite": {
      "type": [
       "boolean",
       "null"
      ],
      "description": ""
     },
     "totalAmountSold": {
      "type": [
       "number",
       "null"
      ],
      "description": "Amount already sold, USD"
     },
     "totalRemaining": {
      "type": [
       "number",
       "null"
      ],
      "description": "Amount remaining, USD"
     },
     "percentSold": {
      "type": [
       "number",
       "null"
      ],
      "description": ""
     },
     "minimumInvestment": {
      "type": [
       "number",
       "null"
      ],
      "description": "Minimum investment accepted, USD"
     },
     "numberOfInvestors": {
      "type": [
       "number",
       "null"
      ],
      "description": "Investors who already invested"
     },
     "hasNonAccreditedInvestors": {
      "type": [
       "boolean",
       "null"
      ],
      "description": ""
     },
     "numberOfNonAccreditedInvestors": {
      "type": [
       "number",
       "null"
      ],
      "description": ""
     },
     "exemptions": {
      "type": "array",
      "description": "Exemptions claimed"
     },
     "exemptionsText": {
      "type": [
       "string",
       "null"
      ],
      "description": ""
     },
     "exemptionCodes": {
      "type": "array",
      "description": "Raw Form D exemption codes"
     },
     "is506b": {
      "type": [
       "boolean",
       "null"
      ],
      "description": ""
     },
     "is506c": {
      "type": [
       "boolean",
       "null"
      ],
      "description": ""
     },
     "dateOfFirstSale": {
      "type": [
       "string",
       "null"
      ],
      "description": ""
     },
     "firstSaleYetToOccur": {
      "type": [
       "boolean",
       "null"
      ],
      "description": ""
     },
     "offeringMoreThanOneYear": {
      "type": [
       "boolean",
       "null"
      ],
      "description": ""
     },
     "securitiesTypes": {
      "type": "array",
      "description": ""
     },
     "securitiesTypesText": {
      "type": [
       "string",
       "null"
      ],
      "description": ""
     },
     "isBusinessCombination": {
      "type": [
       "boolean",
       "null"
      ],
      "description": ""
     },
     "revenueRange": {
      "type": [
       "string",
       "null"
      ],
      "description": ""
     },
     "aggregateNetAssetValueRange": {
      "type": [
       "string",
       "null"
      ],
      "description": ""
     },
     "salesCommissions": {
      "type": [
       "number",
       "null"
      ],
      "description": ""
     },
     "findersFees": {
      "type": [
       "number",
       "null"
      ],
      "description": ""
     },
     "grossProceedsUsedForInsiders": {
      "type": [
       "number",
       "null"
      ],
      "description": "Proceeds paid to executives, directors, promoters"
     },
     "salesCompensationRecipients": {
      "type": [
       "string",
       "null"
      ],
      "description": "Broker-dealers / placement agents"
     },
     "relatedPersons": {
      "type": "array",
      "description": "Executives, directors and promoters with roles"
     },
     "relatedPersonsText": {
      "type": [
       "string",
       "null"
      ],
      "description": ""
     },
     "executives": {
      "type": [
       "string",
       "null"
      ],
      "description": ""
     },
     "directors": {
      "type": [
       "string",
       "null"
      ],
      "description": ""
     },
     "promoters": {
      "type": [
       "string",
       "null"
      ],
      "description": ""
     },
     "contact1Name": {
      "type": [
       "string",
       "null"
      ],
      "description": ""
     },
     "contact1Roles": {
      "type": [
       "string",
       "null"
      ],
      "description": ""
     },
     "contact2Name": {
      "type": [
       "string",
       "null"
      ],
      "description": ""
     },
     "contact2Roles": {
      "type": [
       "string",
       "null"
      ],
      "description": ""
     },
     "contact3Name": {
      "type": [
       "string",
       "null"
      ],
      "description": ""
     },
     "contact3Roles": {
      "type": [
       "string",
       "null"
      ],
      "description": ""
     },
     "signerName": {
      "type": [
       "string",
       "null"
      ],
      "description": ""
     },
     "signerTitle": {
      "type": [
       "string",
       "null"
      ],
      "description": ""
     },
     "signatureDate": {
      "type": [
       "string",
       "null"
      ],
      "description": ""
     },
     "coIssuers": {
      "type": "array",
      "description": ""
     },
     "ein": {
      "type": [
       "string",
       "null"
      ],
      "description": "IRS Employer ID (issuer history)"
     },
     "website": {
      "type": [
       "string",
       "null"
      ],
      "description": ""
     },
     "sic": {
      "type": [
       "string",
       "null"
      ],
      "description": ""
     },
     "sicDescription": {
      "type": [
       "string",
       "null"
      ],
      "description": ""
     },
     "formDFilingsBefore": {
      "type": [
       "number",
       "null"
      ],
      "description": "Earlier new Form Ds by this issuer"
     },
     "firstFormDDate": {
      "type": [
       "string",
       "null"
      ],
      "description": ""
     },
     "isFirstFormD": {
      "type": [
       "boolean",
       "null"
      ],
      "description": "First-ever Form D (first-time raise)"
     },
     "totalFormDFilings": {
      "type": [
       "number",
       "null"
      ],
      "description": ""
     },
     "scrapedAt": {
      "type": "string"
     }
    },
    "required": [
     "issuerName",
     "cik",
     "formType",
     "accessionNumber",
     "filingUrl"
    ]
   },
   "SeoAgencyReportInput": {
    "type": "object",
    "required": [
     "domain"
    ],
    "properties": {
     "domain": {
      "title": "Website (domain)",
      "type": "string",
      "description": "The site to report on, e.g. <code>example.com</code>. A full URL also works; the report covers the whole domain including subdomains."
     },
     "competitors": {
      "title": "Competitors (optional)",
      "type": "array",
      "description": "Up to 5 competitor domains to benchmark. Leave empty to find the top 5 organic competitors automatically.",
      "items": {
       "type": "string"
      }
     },
     "keywords": {
      "title": "Target keywords (optional)",
      "type": "array",
      "description": "Up to 20 keywords your client wants to rank for. Each gets search volume, keyword difficulty, intent and (for the first ones) a live Google check of your position, competitors and AI Overview citation. Leave empty to use the site's own top keywords.",
      "items": {
       "type": "string"
      }
     },
     "location": {
      "title": "Country",
      "type": "string",
      "description": "Search market: a country name (\"United Kingdom\"), 2-letter code (\"GB\") or location code (2826).",
      "default": "United States"
     },
     "language": {
      "title": "Language (optional)",
      "type": "string",
      "description": "Language name or code, e.g. \"English\" or \"de\". Defaults to the country's main language."
     },
     "brandName": {
      "title": "Brand name (optional)",
      "type": "string",
      "description": "How the brand is written in AI answers, e.g. \"Acme Plumbing\". Separate variants with commas. Defaults to the domain name."
     },
     "aiPrompts": {
      "title": "AI prompts (optional)",
      "type": "array",
      "description": "Up to 5 questions to ask ChatGPT and Google AI Mode, e.g. \"best emergency plumber in Austin\". Leave empty to generate buyer questions from the site's keywords.",
      "items": {
       "type": "string"
      }
     },
     "aiPromptCount": {
      "title": "Number of AI prompts",
      "minimum": 0,
      "maximum": 5,
      "type": "integer",
      "description": "How many prompts to check on each engine (0 to skip). Included in the report price.",
      "default": 5
     },
     "includeAiVisibility": {
      "title": "Include AI search visibility",
      "type": "boolean",
      "description": "Check whether ChatGPT and Google AI Mode mention or cite the brand.",
      "default": true
     },
     "agencyName": {
      "title": "Agency name",
      "type": "string",
      "description": "Shown in the report header and footer (white-label)."
     },
     "agencyLogoUrl": {
      "title": "Agency logo URL",
      "type": "string",
      "description": "Public PNG or JPG URL of your logo, shown top-left."
     },
     "accentColor": {
      "title": "Accent colour",
      "type": "string",
      "description": "Hex colour for headings and charts, e.g. <code>#0F766E</code>."
     },
     "clientName": {
      "title": "Client name",
      "type": "string",
      "description": "Shown as \"prepared for \u2026\" under the title."
     },
     "reportTitle": {
      "title": "Report title",
      "type": "string",
      "description": "Defaults to \"SEO & AI Search Visibility Report\"."
     },
     "includePdf": {
      "title": "Create a PDF",
      "type": "boolean",
      "description": "Also save the report as a PDF (the HTML report is always saved).",
      "default": true
     },
     "includePageSpeed": {
      "title": "Include PageSpeed",
      "type": "boolean",
      "description": "Test the homepage with Google PageSpeed Insights (mobile and desktop).",
      "default": true
     },
     "pageSpeedUrl": {
      "title": "Page to speed-test",
      "type": "string",
      "description": "Defaults to the homepage."
     },
     "topKeywords": {
      "title": "Top keywords to include",
      "minimum": 20,
      "maximum": 100,
      "type": "integer",
      "description": "How many of the site's top ranking keywords (by traffic) to include in the data.",
      "default": 100
     },
     "serpKeywords": {
      "title": "Live SERP checks",
      "minimum": 0,
      "maximum": 10,
      "type": "integer",
      "description": "How many keywords to check live on Google (target keywords first).",
      "default": 5
     }
    }
   },
   "SeoAgencyReportRow": {
    "type": "object"
   },
   "SeoToolkitInput": {
    "type": "object",
    "required": [
     "tool"
    ],
    "properties": {
     "tool": {
      "title": "Tool",
      "enum": [
       "domain_overview",
       "ranked_keywords",
       "competitors",
       "top_pages",
       "backlinks",
       "referring_domains",
       "keyword_overview",
       "serp"
      ],
      "type": "string",
      "description": "What to look up. Domain tools read <b>targets</b>; <code>keyword_overview</code> and <code>serp</code> read <b>keywords</b>.",
      "default": "domain_overview"
     },
     "targets": {
      "title": "Targets (domains or URLs)",
      "type": "array",
      "description": "Domains (<code>example.com</code>) or page URLs, for domain_overview, ranked_keywords, competitors, top_pages, backlinks and referring_domains. Up to 100.",
      "items": {
       "type": "string"
      }
     },
     "keywords": {
      "title": "Keywords",
      "type": "array",
      "description": "Keywords for keyword_overview (up to 2,000) and serp (up to 100).",
      "items": {
       "type": "string"
      }
     },
     "location": {
      "title": "Country",
      "type": "string",
      "description": "Country: name (<code>United States</code>), 2-letter code (<code>DE</code>) or location code (<code>2840</code>).",
      "default": "United States"
     },
     "language": {
      "title": "Language",
      "type": "string",
      "description": "Language name or code (<code>English</code>, <code>es</code>). Leave empty for the main language of the country."
     },
     "maxResults": {
      "title": "Max results per target / keyword",
      "minimum": 1,
      "maximum": 10000,
      "type": "integer",
      "description": "Row limit for list tools (ranked keywords, competitors, top pages, backlinks, referring domains, SERP rows). The default of 50 keeps runs fast and cheap.",
      "default": 50
     },
     "includeBacklinks": {
      "title": "Domain overview: include backlink metrics",
      "type": "boolean",
      "description": "Adds domain rank, backlinks, referring domains and spam score to domain_overview (one extra backlinks request per domain). Turn off for traffic and keyword metrics only.",
      "default": true
     },
     "includeSubdomains": {
      "title": "Include subdomains",
      "type": "boolean",
      "description": "Count subdomains of the target (e.g. blog.example.com) too.",
      "default": true
     },
     "allBacklinksPerDomain": {
      "title": "Backlinks: all links per referring domain",
      "type": "boolean",
      "description": "Off = one (strongest) backlink per referring domain, the most useful view. On = every backlink.",
      "default": false
     },
     "serpDepth": {
      "title": "SERP depth",
      "minimum": 10,
      "maximum": 100,
      "type": "integer",
      "description": "serp tool only: how many Google results to check, in steps of 10 (each 10 results is one SERP request).",
      "default": 10
     },
     "device": {
      "title": "SERP device",
      "enum": [
       "desktop",
       "mobile"
      ],
      "type": "string",
      "description": "serp tool only.",
      "default": "desktop"
     }
    }
   },
   "SeoToolkitRow": {
    "$schema": "http://json-schema.org/draft-07/schema#",
    "type": "object",
    "properties": {
     "tool": {
      "type": "string",
      "description": "Tool that produced the row",
      "enum": [
       "domain_overview",
       "ranked_keywords",
       "competitors",
       "top_pages",
       "backlinks",
       "referring_domains",
       "keyword_overview",
       "serp"
      ]
     },
     "target": {
      "type": [
       "string",
       "null"
      ],
      "description": "Domain, URL or keyword the row is about"
     },
     "keyword": {
      "type": [
       "string",
       "null"
      ],
      "description": "Keyword (ranked_keywords, keyword_overview, serp)"
     },
     "position": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Google position (ranked_keywords, serp)"
     },
     "position_absolute": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Absolute position counting all result types (serp)"
     },
     "url": {
      "type": [
       "string",
       "null"
      ],
      "description": "Ranking URL (ranked_keywords, serp) or page URL (top_pages)"
     },
     "title": {
      "type": [
       "string",
       "null"
      ],
      "description": "Result title (serp)"
     },
     "description": {
      "type": [
       "string",
       "null"
      ],
      "description": "Result snippet (serp)"
     },
     "domain": {
      "type": [
       "string",
       "null"
      ],
      "description": "Result domain (serp)"
     },
     "result_type": {
      "type": [
       "string",
       "null"
      ],
      "description": "organic, paid or featured_snippet"
     },
     "is_featured_snippet": {
      "type": [
       "boolean",
       "null"
      ],
      "description": "Result is a featured snippet (serp)"
     },
     "has_ai_overview": {
      "type": [
       "boolean",
       "null"
      ],
      "description": "Google shows an AI Overview for the keyword"
     },
     "serp_features": {
      "type": [
       "array",
       "null"
      ],
      "description": "Result types on the Google results page",
      "items": {
       "type": "string"
      }
     },
     "serp_results_count": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Total results Google reports (serp)"
     },
     "search_volume": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Average monthly Google searches"
     },
     "cpc": {
      "type": [
       "number",
       "null"
      ],
      "description": "Average Google Ads cost per click (USD)"
     },
     "competition": {
      "type": [
       "string",
       "null"
      ],
      "description": "Google Ads competition level"
     },
     "keyword_difficulty": {
      "type": [
       "integer",
       "null"
      ],
      "description": "SEO keyword difficulty 0-100"
     },
     "difficulty_level": {
      "type": [
       "string",
       "null"
      ],
      "description": "very easy / easy / possible / difficult / hard / very hard"
     },
     "search_intent": {
      "type": [
       "string",
       "null"
      ],
      "description": "Main search intent"
     },
     "search_volume_trend": {
      "type": [
       "object",
       "null"
      ],
      "description": "Search volume change in % (monthly, quarterly, yearly)"
     },
     "estimated_traffic": {
      "type": [
       "number",
       "null"
      ],
      "description": "Estimated monthly visits from this ranking (ranked_keywords)"
     },
     "previous_position": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Previous position (ranked_keywords)"
     },
     "position_change": {
      "type": [
       "string",
       "null"
      ],
      "description": "new, up, down or same (ranked_keywords)"
     },
     "organic_keywords": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Keywords ranking in Google top 100 (domain_overview, top_pages)"
     },
     "organic_traffic": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Estimated monthly organic visits (domain_overview, top_pages)"
     },
     "organic_traffic_value_usd": {
      "type": [
       "number",
       "null"
      ],
      "description": "What the organic traffic would cost in Google Ads per month (USD)"
     },
     "top3_keywords": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Keywords in positions 1-3"
     },
     "top10_keywords": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Keywords in positions 1-10"
     },
     "new_keywords": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Newly ranking keywords since the last update (domain_overview)"
     },
     "lost_keywords": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Keywords that stopped ranking (domain_overview)"
     },
     "keywords_up": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Keywords that moved up (domain_overview)"
     },
     "keywords_down": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Keywords that moved down (domain_overview)"
     },
     "paid_keywords": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Keywords with Google Ads (domain_overview)"
     },
     "paid_traffic": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Estimated monthly paid visits (domain_overview)"
     },
     "paid_traffic_cost_usd": {
      "type": [
       "number",
       "null"
      ],
      "description": "Estimated monthly Google Ads spend (USD, domain_overview)"
     },
     "domain_rank": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Domain authority score 0-1000 from the backlink index (domain_overview, referring_domains)"
     },
     "backlinks": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Live backlinks (domain_overview: total; referring_domains: from that domain)"
     },
     "referring_domains": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Referring domains (domain_overview)"
     },
     "referring_main_domains": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Referring root domains (domain_overview)"
     },
     "referring_ips": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Referring IP addresses (domain_overview)"
     },
     "broken_backlinks": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Backlinks pointing to broken pages (domain_overview)"
     },
     "spam_score": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Backlink spam score 0-100 (higher = spammier)"
     },
     "first_seen": {
      "type": [
       "string",
       "null"
      ],
      "description": "When the domain or link was first seen (ISO 8601)"
     },
     "last_seen": {
      "type": [
       "string",
       "null"
      ],
      "description": "When the link was last seen (backlinks)"
     },
     "found": {
      "type": [
       "boolean",
       "null"
      ],
      "description": "domain_overview: false when no data exists for the domain"
     },
     "competitor_domain": {
      "type": [
       "string",
       "null"
      ],
      "description": "Competing domain (competitors)"
     },
     "common_keywords": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Keywords both domains rank for (competitors)"
     },
     "avg_position": {
      "type": [
       "number",
       "null"
      ],
      "description": "Competitor average position on shared keywords (competitors)"
     },
     "shared_keywords_traffic": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Competitor traffic from shared keywords (competitors)"
     },
     "competitor_organic_keywords": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Competitor total organic keywords (competitors)"
     },
     "competitor_organic_traffic": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Competitor total organic traffic (competitors)"
     },
     "competitor_traffic_value_usd": {
      "type": [
       "number",
       "null"
      ],
      "description": "Competitor organic traffic value in USD (competitors)"
     },
     "source_url": {
      "type": [
       "string",
       "null"
      ],
      "description": "Page the backlink is on (backlinks)"
     },
     "source_domain": {
      "type": [
       "string",
       "null"
      ],
      "description": "Domain the backlink is on (backlinks)"
     },
     "source_title": {
      "type": [
       "string",
       "null"
      ],
      "description": "Title of the linking page (backlinks)"
     },
     "target_url": {
      "type": [
       "string",
       "null"
      ],
      "description": "Linked page on the target (backlinks)"
     },
     "anchor": {
      "type": [
       "string",
       "null"
      ],
      "description": "Anchor text (backlinks)"
     },
     "dofollow": {
      "type": [
       "boolean",
       "null"
      ],
      "description": "Link passes authority (backlinks)"
     },
     "link_type": {
      "type": [
       "string",
       "null"
      ],
      "description": "anchor, image, redirect, canonical, ... (backlinks)"
     },
     "source_domain_rank": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Rank 0-1000 of the linking domain (backlinks)"
     },
     "source_page_rank": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Rank 0-1000 of the linking page (backlinks)"
     },
     "referring_domain": {
      "type": [
       "string",
       "null"
      ],
      "description": "Linking domain (referring_domains)"
     },
     "referring_pages": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Pages on the referring domain that link (referring_domains)"
     },
     "location": {
      "type": [
       "string",
       "null"
      ],
      "description": "Country the data is for, e.g. \"United States\""
     },
     "language": {
      "type": [
       "string",
       "null"
      ],
      "description": "Language name, e.g. \"English\""
     },
     "scraped_at": {
      "type": [
       "string",
       "null"
      ],
      "description": "When this row was produced (ISO 8601, UTC)"
     }
    },
    "required": [
     "tool"
    ]
   },
   "ShopifyStoreScraperInput": {
    "type": "object",
    "required": [
     "stores"
    ],
    "properties": {
     "stores": {
      "title": "Shopify stores (domains or URLs)",
      "type": "array",
      "description": "Store domains or URLs, one per line, e.g. <code>allbirds.com</code>, <code>https://www.gymshark.com</code>. You can also paste a collection URL (<code>/collections/mens</code>) or a product URL (<code>/products/handle</code>) to scrape just that collection or product. Domains that are not Shopify stores get a free error row.",
      "items": {
       "type": "string"
      }
     },
     "collections": {
      "title": "Collection handles (optional)",
      "type": "array",
      "description": "Only scrape these collections in every store, e.g. <code>mens-shoes</code> (the part after <code>/collections/</code> in the URL). Leave empty for the whole catalog.",
      "items": {
       "type": "string"
      }
     },
     "keywords": {
      "title": "Keyword filter (optional)",
      "type": "array",
      "description": "Keep only products whose title, handle, vendor, product type or tags contain at least one of these words (case-insensitive).",
      "items": {
       "type": "string"
      }
     },
     "maxProductsPerStore": {
      "title": "Max products per store",
      "minimum": 1,
      "maximum": 1000000,
      "type": "integer",
      "description": "Maximum products per store (after the keyword filter). Shopify returns up to 250 products per request. In monitor mode, use a limit above the store's catalog size so removed products can be detected.",
      "default": 1000
     },
     "monitorMode": {
      "title": "Monitor mode (only output changes)",
      "type": "boolean",
      "description": "Compare each store with the previous run and output only <b>new</b>, <b>removed</b>, <b>price-changed</b> and <b>stock-changed</b> products, with previous and current values. Snapshots are kept in a named key-value store, one record per store. Schedule the Actor (e.g. daily) to get a change feed.",
      "default": false
     },
     "outputProductsOnFirstRun": {
      "title": "Output full products on the first monitor run",
      "type": "boolean",
      "description": "On the first monitor run for a store there is nothing to compare with. When on, the full product list is output (billed as products); when off, the first run only saves the baseline.",
      "default": true
     },
     "monitorStoreName": {
      "title": "Snapshot key-value store name",
      "type": "string",
      "description": "Named key-value store in your account that keeps the snapshots. Use a different name to keep separate monitors.",
      "default": "shopify-store-monitor"
     },
     "monitorId": {
      "title": "Monitor ID (optional)",
      "type": "string",
      "description": "Optional label that separates snapshots when you monitor the same store with different tasks. Collections and keyword filters already get their own snapshot."
     },
     "includeInventory": {
      "title": "Inventory quantities & barcodes (slower)",
      "type": "boolean",
      "description": "Fetch each product's <code>/products/&lt;handle&gt;.js</code> to add variant barcodes and <code>inventoryQuantity</code> when the store exposes it. Checked once per store; skipped automatically if the store hides quantities. Adds one request per product.",
      "default": false
     },
     "trackQuantityChanges": {
      "title": "Report inventory quantity changes",
      "type": "boolean",
      "description": "Monitor mode with inventory on: also output a <code>stock_changed</code> row when a variant's inventory quantity changes (not only when it goes in or out of stock). Useful for sales-velocity tracking, but produces many more change rows.",
      "default": false
     },
     "includeDescription": {
      "title": "Include description (plain text)",
      "type": "boolean",
      "description": "Add the product description as plain text (HTML removed, max 5,000 characters).",
      "default": true
     },
     "proxyConfiguration": {
      "title": "Proxy (fallback only)",
      "type": "object",
      "description": "Requests go directly to the store first. The proxy is used only for a store that rate-limits the Actor (HTTP 429/430). Default: Apify datacenter proxy.",
      "default": {
       "useApifyProxy": true
      }
     },
     "requestDelaySecs": {
      "title": "Delay between requests to one store (seconds)",
      "minimum": 0.2,
      "maximum": 10,
      "type": "number",
      "description": "Minimum pause between requests to the same store (with jitter). The default of 1 second matches the Crawl-delay most Shopify stores publish in robots.txt. The delay grows automatically if a store rate-limits.",
      "default": 1
     },
     "maxConcurrency": {
      "title": "Stores in parallel",
      "minimum": 1,
      "maximum": 20,
      "type": "integer",
      "description": "How many different stores are scraped at the same time. Each store is always fetched one page at a time.",
      "default": 5
     },
     "maxRetries": {
      "title": "Max attempts per request",
      "minimum": 1,
      "maximum": 15,
      "type": "integer",
      "description": "Retries with backoff for rate limits, timeouts and server errors.",
      "default": 6
     }
    }
   },
   "ShopifyStoreScraperRow": {
    "$schema": "http://json-schema.org/draft-07/schema#",
    "type": "object",
    "properties": {
     "type": {
      "type": "string",
      "description": "Row type: product, change (monitor mode) or error",
      "enum": [
       "product",
       "change",
       "error"
      ]
     },
     "store": {
      "type": [
       "string",
       "null"
      ],
      "description": "Store domain as given in the input"
     },
     "storeName": {
      "type": [
       "string",
       "null"
      ],
      "description": "Store name"
     },
     "storeUrl": {
      "type": [
       "string",
       "null"
      ],
      "description": "Store base URL"
     },
     "currency": {
      "type": [
       "string",
       "null"
      ],
      "description": "Store currency code, e.g. USD"
     },
     "productId": {
      "type": [
       "integer",
       "string",
       "null"
      ],
      "description": "Shopify product ID"
     },
     "title": {
      "type": [
       "string",
       "null"
      ],
      "description": "Product title"
     },
     "handle": {
      "type": [
       "string",
       "null"
      ],
      "description": "Product handle (URL slug)"
     },
     "url": {
      "type": [
       "string",
       "null"
      ],
      "description": "Product page URL"
     },
     "vendor": {
      "type": [
       "string",
       "null"
      ],
      "description": "Brand / vendor"
     },
     "productType": {
      "type": [
       "string",
       "null"
      ],
      "description": "Product type / category set by the store"
     },
     "tags": {
      "type": [
       "array",
       "null"
      ],
      "description": "Product tags"
     },
     "createdAt": {
      "type": [
       "string",
       "null"
      ],
      "description": "When the product was created (ISO 8601)"
     },
     "updatedAt": {
      "type": [
       "string",
       "null"
      ],
      "description": "When the product was last updated (ISO 8601)"
     },
     "publishedAt": {
      "type": [
       "string",
       "null"
      ],
      "description": "When the product was published (ISO 8601)"
     },
     "price": {
      "type": [
       "number",
       "null"
      ],
      "description": "Lowest variant price in the store currency"
     },
     "priceMin": {
      "type": [
       "number",
       "null"
      ],
      "description": "Lowest variant price"
     },
     "priceMax": {
      "type": [
       "number",
       "null"
      ],
      "description": "Highest variant price"
     },
     "compareAtPrice": {
      "type": [
       "number",
       "null"
      ],
      "description": "Original (\"compare at\") price of the most-discounted variant"
     },
     "discountPercent": {
      "type": [
       "number",
       "null"
      ],
      "description": "Largest variant discount vs compare-at price, in %"
     },
     "onSale": {
      "type": [
       "boolean",
       "null"
      ],
      "description": "True when any variant is discounted"
     },
     "available": {
      "type": [
       "boolean",
       "null"
      ],
      "description": "True when at least one variant is in stock"
     },
     "variantsCount": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Number of variants"
     },
     "availableVariantsCount": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Number of in-stock variants"
     },
     "inventoryQuantity": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Total units in stock (only when includeInventory is on and the store exposes it)"
     },
     "image": {
      "type": [
       "string",
       "null"
      ],
      "description": "Main product image URL"
     },
     "images": {
      "type": [
       "array",
       "null"
      ],
      "description": "All product image URLs"
     },
     "options": {
      "type": [
       "array",
       "null"
      ],
      "description": "Product options (e.g. Size, Color) with their values"
     },
     "variants": {
      "type": [
       "array",
       "null"
      ],
      "description": "Variants with id, title, sku, price, compareAtPrice, available, options, grams"
     },
     "description": {
      "type": [
       "string",
       "null"
      ],
      "description": "Product description as plain text"
     },
     "collection": {
      "type": [
       "string",
       "null"
      ],
      "description": "Collection handle the product or error relates to"
     },
     "availableCollections": {
      "type": [
       "array",
       "null"
      ],
      "description": "Collections that exist on the store (error rows)"
     },
     "scrapedAt": {
      "type": [
       "string",
       "null"
      ],
      "description": "When this row was produced (ISO 8601, UTC)"
     },
     "changeType": {
      "type": [
       "string",
       "null"
      ],
      "description": "Monitor mode: new, price_changed, stock_changed or removed"
     },
     "priceDirection": {
      "type": [
       "string",
       "null"
      ],
      "description": "Monitor mode: up, down or mixed"
     },
     "priceChangePercent": {
      "type": [
       "number",
       "null"
      ],
      "description": "Monitor mode: price change in %"
     },
     "stockEvent": {
      "type": [
       "string",
       "null"
      ],
      "description": "Monitor mode: back_in_stock, out_of_stock or variant_stock_changed"
     },
     "previous": {
      "type": [
       "object",
       "null"
      ],
      "description": "Monitor mode: previous values"
     },
     "current": {
      "type": [
       "object",
       "null"
      ],
      "description": "Monitor mode: current values"
     },
     "variantChanges": {
      "type": [
       "array",
       "null"
      ],
      "description": "Monitor mode: per-variant price or stock changes"
     },
     "product": {
      "type": [
       "object",
       "null"
      ],
      "description": "Monitor mode: full product row for new products"
     },
     "detectedAt": {
      "type": [
       "string",
       "null"
      ],
      "description": "Monitor mode: when the change was detected"
     },
     "previousRunAt": {
      "type": [
       "string",
       "null"
      ],
      "description": "Monitor mode: when the previous snapshot was taken"
     },
     "input": {
      "type": [
       "string",
       "null"
      ],
      "description": "Error rows: the input value that failed"
     },
     "errorType": {
      "type": [
       "string",
       "null"
      ],
      "description": "Error rows: unreachable, not_shopify, password_protected, feed_disabled, fetch_failed, product_not_found, collection_not_found, invalid_input or internal_error"
     },
     "error": {
      "type": [
       "string",
       "null"
      ],
      "description": "Error rows: human-readable error message"
     }
    },
    "required": [
     "type"
    ]
   },
   "TelegramChannelScraperInput": {
    "type": "object",
    "required": [
     "channels"
    ],
    "properties": {
     "channels": {
      "title": "Telegram channels",
      "type": "array",
      "description": "Public Telegram channels, one per line: a username (<code>durov</code>, <code>@durov</code>) or a link (<code>https://t.me/durov</code>, <code>https://t.me/s/durov</code>). A post link (<code>https://t.me/durov/400</code>) starts from that post and goes back in time. Private invite links, groups, users and bots are reported as free error rows.",
      "items": {
       "type": "string"
      }
     },
     "maxPostsPerChannel": {
      "title": "Max posts per channel",
      "minimum": 0,
      "type": "integer",
      "description": "Newest posts to return per channel (after date and keyword filters). Set 0 for no limit when you use <b>From date</b>. Pagination goes as deep as the channel's history (thousands of posts are fine).",
      "default": 100
     },
     "dateFrom": {
      "title": "From date (oldest)",
      "type": "string",
      "description": "Only posts published on or after this date. <code>YYYY-MM-DD</code>, an ISO date-time (UTC), or relative: <code>7 days</code>, <code>24 hours</code>, <code>3 months</code>."
     },
     "dateTo": {
      "title": "To date (newest)",
      "type": "string",
      "description": "Only posts published on or before this date (a plain date includes the whole day, UTC). The scraper jumps straight to that point in the channel history, so old ranges are fast."
     },
     "keywords": {
      "title": "Keywords",
      "type": "array",
      "description": "Only return posts containing any of these words or phrases (case-insensitive; checked in the post text, file names, link preview and poll question). Posts that don't match are not charged. Leave empty for all posts.",
      "items": {
       "type": "string"
      }
     },
     "keywordMode": {
      "title": "Keyword matching",
      "enum": [
       "contains",
       "search"
      ],
      "type": "string",
      "description": "<b>Contains</b> scans the channel history (respecting the date range) and keeps matching posts - exact and as deep as you need. <b>Telegram search</b> uses Telegram's own search (matches word forms) but Telegram returns only about 20 of the newest matches per keyword.",
      "default": "contains"
     },
     "matchAllKeywords": {
      "title": "Require all keywords",
      "type": "boolean",
      "description": "Only keep posts that contain every keyword (default: any keyword).",
      "default": false
     },
     "wholeWordsOnly": {
      "title": "Whole words only",
      "type": "boolean",
      "description": "Match keywords as whole words (<code>SEC</code> won't match \"second\"). Turn off to also match inside words, e.g. word forms (<code>\u0422\u0440\u0430\u043c\u043f</code> \u2192 \"\u0422\u0440\u0430\u043c\u043f\u0430\") or prefixes (<code>crypto</code> \u2192 \"cryptocurrency\"). Chinese, Japanese, Korean and Thai keywords always match anywhere.",
      "default": true
     },
     "maxScannedPostsPerChannel": {
      "title": "Max posts to scan per channel (keyword filter)",
      "minimum": 20,
      "type": "integer",
      "description": "With a keyword filter, stop scanning a channel after this many posts even if fewer matches were found. Scanned posts that don't match are free.",
      "default": 5000
     },
     "includeChannelInfo": {
      "title": "Include channel info",
      "type": "boolean",
      "description": "Add one row per channel with title, description, exact subscriber count, photo, verified / scam / fake flags and media counters.",
      "default": true
     },
     "includeHtml": {
      "title": "Include post HTML",
      "type": "boolean",
      "description": "Add <code>textHtml</code> (formatting, links, custom emoji) next to the plain <code>text</code>.",
      "default": true
     },
     "includeServiceMessages": {
      "title": "Include service messages",
      "type": "boolean",
      "description": "Include 'Channel created', 'Channel photo updated' and similar service messages.",
      "default": false
     },
     "proxyConfiguration": {
      "title": "Proxy (fallback only)",
      "type": "object",
      "description": "Telegram's web preview usually works without a proxy. This proxy is used only if Telegram starts rate-limiting the run (then the rest of the run goes through it). The default Apify datacenter proxy is enough.",
      "default": {
       "useApifyProxy": true
      }
     },
     "alwaysUseProxy": {
      "title": "Always use the proxy",
      "type": "boolean",
      "description": "Send every request through the proxy above instead of connecting directly first.",
      "default": false
     },
     "maxConcurrency": {
      "title": "Max parallel requests",
      "minimum": 1,
      "maximum": 30,
      "type": "integer",
      "description": "Parallel page requests. Large single channels are split into parallel page streams.",
      "default": 10
     }
    }
   },
   "TelegramChannelScraperRow": {
    "type": "object",
    "properties": {
     "type": {
      "type": "string",
      "description": "Row type: post, channel (channel info) or error (free)"
     },
     "status": {
      "type": [
       "string",
       "null"
      ],
      "description": "channel/error rows: ok, not_found, no_web_preview, private, is_group, is_user, is_bot, invalid_input, no_posts, no_matches, fetch_failed"
     },
     "channel": {
      "type": [
       "string",
       "null"
      ],
      "description": "Channel username"
     },
     "channelTitle": {
      "type": [
       "string",
       "null"
      ],
      "description": "Channel title"
     },
     "postId": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Post ID (message ID within the channel)"
     },
     "url": {
      "type": [
       "string",
       "null"
      ],
      "description": "Post or channel URL"
     },
     "date": {
      "type": [
       "string",
       "null"
      ],
      "description": "Published (ISO 8601, UTC)"
     },
     "text": {
      "type": [
       "string",
       "null"
      ],
      "description": "Post text (plain, emoji kept, line breaks preserved)"
     },
     "textHtml": {
      "type": [
       "string",
       "null"
      ],
      "description": "Post text as HTML (formatting, links, custom emoji)"
     },
     "views": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Views (Telegram rounds large numbers: 18.9M)"
     },
     "viewsText": {
      "type": [
       "string",
       "null"
      ],
      "description": "Views as shown"
     },
     "author": {
      "type": [
       "string",
       "null"
      ],
      "description": "Author signature, if the channel signs posts"
     },
     "isEdited": {
      "type": [
       "boolean",
       "null"
      ],
      "description": "Post was edited"
     },
     "forwardedFrom": {
      "type": [
       "object",
       "null"
      ],
      "description": "Original channel/user of a forwarded post: name, url, username, postId"
     },
     "replyTo": {
      "type": [
       "object",
       "null"
      ],
      "description": "Replied-to post: postId, channel, url, author, text"
     },
     "mediaType": {
      "type": [
       "string",
       "null"
      ],
      "description": "text, photo, video, album, document, audio, voice, round_video, sticker, gif, location, poll, service, unsupported"
     },
     "media": {
      "type": [
       "array",
       "null"
      ],
      "description": "Media items: type, url, thumbnailUrl, duration, fileName, fileSize"
     },
     "mediaCount": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Number of media items"
     },
     "photoUrls": {
      "type": [
       "array",
       "null"
      ],
      "description": "Photo URLs"
     },
     "videoThumbnailUrls": {
      "type": [
       "array",
       "null"
      ],
      "description": "Video thumbnail URLs"
     },
     "documentNames": {
      "type": [
       "array",
       "null"
      ],
      "description": "Attached file names"
     },
     "linkPreview": {
      "type": [
       "object",
       "null"
      ],
      "description": "Link preview: url, siteName, title, description, imageUrl"
     },
     "poll": {
      "type": [
       "object",
       "null"
      ],
      "description": "Poll: question, type, options (text, percent), voters"
     },
     "links": {
      "type": [
       "array",
       "null"
      ],
      "description": "Links in the post text"
     },
     "hashtags": {
      "type": [
       "array",
       "null"
      ],
      "description": "Hashtags"
     },
     "mentions": {
      "type": [
       "array",
       "null"
      ],
      "description": "@mentions"
     },
     "reactions": {
      "type": [
       "array",
       "null"
      ],
      "description": "Reactions: emoji, customEmojiId, isPaid (Stars), count"
     },
     "reactionsTotal": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Sum of all reaction counts"
     },
     "isService": {
      "type": [
       "boolean",
       "null"
      ],
      "description": "Service message (channel created, photo updated...)"
     },
     "matchedKeywords": {
      "type": [
       "array",
       "null"
      ],
      "description": "Keywords found in the post"
     },
     "title": {
      "type": [
       "string",
       "null"
      ],
      "description": "Channel title (channel rows)"
     },
     "description": {
      "type": [
       "string",
       "null"
      ],
      "description": "Channel description"
     },
     "descriptionHtml": {
      "type": [
       "string",
       "null"
      ],
      "description": "Channel description HTML"
     },
     "subscribers": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Exact subscriber count"
     },
     "subscribersText": {
      "type": [
       "string",
       "null"
      ],
      "description": "Subscribers as shown in the preview (10.5M)"
     },
     "photoUrl": {
      "type": [
       "string",
       "null"
      ],
      "description": "Channel photo URL"
     },
     "isVerified": {
      "type": [
       "boolean",
       "null"
      ],
      "description": "Verified channel"
     },
     "isScam": {
      "type": [
       "boolean",
       "null"
      ],
      "description": "Marked as scam by Telegram"
     },
     "isFake": {
      "type": [
       "boolean",
       "null"
      ],
      "description": "Marked as fake by Telegram"
     },
     "photosCount": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Photos in the channel"
     },
     "videosCount": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Videos in the channel"
     },
     "filesCount": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Files in the channel"
     },
     "linksCount": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Links in the channel"
     },
     "lastPostId": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Newest post ID"
     },
     "lastPostDate": {
      "type": [
       "string",
       "null"
      ],
      "description": "Newest post date"
     },
     "webPreviewUrl": {
      "type": [
       "string",
       "null"
      ],
      "description": "t.me/s/ URL"
     },
     "error": {
      "type": [
       "string",
       "null"
      ],
      "description": "Why the channel could not be scraped (error rows)"
     },
     "input": {
      "type": [
       "string",
       "null"
      ],
      "description": "Your input this row came from"
     },
     "scrapedAt": {
      "type": [
       "string",
       "null"
      ],
      "description": "Scraped at (UTC)"
     }
    },
    "required": [
     "type"
    ]
   },
   "TripadvisorReviewsScraperInput": {
    "type": "object",
    "properties": {
     "startUrls": {
      "title": "Tripadvisor URLs",
      "type": "array",
      "description": "Tripadvisor pages of hotels, restaurants, attractions, tours or vacation rentals, e.g. <code>https://www.tripadvisor.com/Hotel_Review-g60763-d93437-Reviews-Hotel_Edison_Times_Square-New_York_City_New_York.html</code>. Any Tripadvisor country site works (.co.uk, .de, .fr...). A single-review link also works: the Actor takes the place it belongs to.",
      "items": {
       "type": "string"
      }
     },
     "searchQueries": {
      "title": "Search queries",
      "type": "array",
      "description": "Find places by keyword instead of URL, e.g. <code>hotels in Lisbon, Portugal</code>, <code>sushi restaurants in Austin, TX</code> or <code>museums in Rome</code>. The Actor takes the top places from Tripadvisor search and gets their reviews. Write \"... in City, Country\" or fill in <i>Search location</i> below.",
      "items": {
       "type": "string"
      }
     },
     "searchLocation": {
      "title": "Search location",
      "type": "string",
      "description": "Optional location used for every search query: <code>City, Country</code> (e.g. <code>Lisbon, Portugal</code>), <code>City, State</code> (e.g. <code>Portland, Maine</code>) or a region. Leave empty to read it from each query (\"hotels in Lisbon\")."
     },
     "maxPlacesPerSearch": {
      "title": "Max places per search",
      "minimum": 1,
      "maximum": 210,
      "type": "integer",
      "description": "How many top Tripadvisor search results (places) to take for each search query.",
      "default": 5
     },
     "maxReviewsPerPlace": {
      "title": "Max reviews per place",
      "minimum": 0,
      "maximum": 100000,
      "type": "integer",
      "description": "Maximum number of reviews to get for each place. Set <code>0</code> to get only place details (name, address, rating, review count and star distribution) without reviews.",
      "default": 100
     },
     "sortBy": {
      "title": "Sort reviews by",
      "enum": [
       "most_recent",
       "detailed_reviews",
       "relevance"
      ],
      "type": "string",
      "description": "Order in which reviews are collected. With a limit, this decides which reviews you get.",
      "default": "most_recent"
     },
     "reviewsNewerThan": {
      "title": "Only reviews newer than",
      "type": "string",
      "description": "Only reviews published on or after this date, e.g. <code>2026-09-01</code> or <code>30 days</code>. Great for scheduled monitoring: run daily or weekly and get only new reviews."
     },
     "ratings": {
      "title": "Star ratings",
      "type": "array",
      "description": "Only reviews with these star ratings, e.g. 1 and 2 to collect complaints. Empty = all ratings.",
      "items": {
       "type": "string",
       "enum": [
        "5",
        "4",
        "3",
        "2",
        "1"
       ],
       "enumTitles": [
        "5 - Excellent",
        "4 - Very good",
        "3 - Average",
        "2 - Poor",
        "1 - Terrible"
       ]
      }
     },
     "travelerTypes": {
      "title": "Traveler types",
      "type": "array",
      "description": "Only reviews from these types of travelers (mainly hotels and attractions). Empty = all.",
      "items": {
       "type": "string",
       "enum": [
        "families",
        "couples",
        "solo",
        "business",
        "friends"
       ],
       "enumTitles": [
        "Families",
        "Couples",
        "Solo",
        "Business",
        "Friends"
       ]
      }
     },
     "visitMonths": {
      "title": "Months of visit",
      "type": "array",
      "description": "Only reviews from trips in these months (seasonality analysis). Empty = all.",
      "items": {
       "type": "string",
       "enum": [
        "january",
        "february",
        "march",
        "april",
        "may",
        "june",
        "july",
        "august",
        "september",
        "october",
        "november",
        "december"
       ],
       "enumTitles": [
        "January",
        "February",
        "March",
        "April",
        "May",
        "June",
        "July",
        "August",
        "September",
        "October",
        "November",
        "December"
       ]
      }
     },
     "language": {
      "title": "Output language",
      "type": "string",
      "description": "Language to get reviews in, as a code: <code>en</code>, <code>fr</code>, <code>de</code>, <code>es</code>, <code>it</code>, <code>ja</code>, <code>zh-CN</code>... With translations on, Tripadvisor machine-translates reviews into this language where it can. Leave empty to use the language of the URL's site (English for tripadvisor.com). Every row keeps <code>originalLanguage</code>, so you can filter by the language reviews were written in."
     },
     "translateReviews": {
      "title": "Use Tripadvisor translations",
      "type": "boolean",
      "description": "When on, reviews written in other languages come in Tripadvisor's machine translation into the site's language (English for tripadvisor.com). <code>originalLanguage</code> and <code>isTranslated</code> tell you which ones were translated.",
      "default": true
     },
     "includePlaceDetails": {
      "title": "Add a place summary row",
      "type": "boolean",
      "description": "Also save one row per place (rowType = place) with name, address, rating, total review count, the 1-5 star distribution and, for searches, the search rank, category and price. Charged as a separate, small event.",
      "default": false
     },
     "includeReviewerInfo": {
      "title": "Include reviewer info",
      "type": "boolean",
      "description": "Include the reviewer's public display name, profile link, home location, review count and avatar. Turn off if you don't need personal data (recommended for GDPR-sensitive use).",
      "default": true
     },
     "maxItems": {
      "title": "Max reviews in total",
      "minimum": 1,
      "type": "integer",
      "description": "Stop after this many reviews across all places. You can also cap spending with Apify's \"Maximum cost per run\"; the Actor stops exactly there and never buys data it cannot return."
     }
    }
   },
   "TripadvisorReviewsScraperRow": {
    "type": "object",
    "properties": {
     "rowType": {
      "type": "string",
      "description": "review, place or error (error rows are free)"
     },
     "placeId": {
      "type": [
       "string",
       "null"
      ],
      "description": "Tripadvisor location id (the d-number in the URL)"
     },
     "placeName": {
      "type": [
       "string",
       "null"
      ],
      "description": "Place name"
     },
     "placeType": {
      "type": [
       "string",
       "null"
      ],
      "description": "hotel, restaurant, attraction, tour, vacation_rental..."
     },
     "placeUrl": {
      "type": [
       "string",
       "null"
      ],
      "description": "Tripadvisor URL of the place"
     },
     "placeAddress": {
      "type": [
       "string",
       "null"
      ],
      "description": "Address"
     },
     "placeRating": {
      "type": [
       "number",
       "null"
      ],
      "description": "Overall Tripadvisor rating (1-5)"
     },
     "placeReviewsCount": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Total reviews on Tripadvisor"
     },
     "reviewId": {
      "type": [
       "string",
       "null"
      ],
      "description": "Tripadvisor review id"
     },
     "reviewUrl": {
      "type": [
       "string",
       "null"
      ],
      "description": "Link to the review"
     },
     "rating": {
      "type": [
       "number",
       "null"
      ],
      "description": "Review star rating (1-5)"
     },
     "title": {
      "type": [
       "string",
       "null"
      ],
      "description": "Review title"
     },
     "text": {
      "type": [
       "string",
       "null"
      ],
      "description": "Review text"
     },
     "publishedAt": {
      "type": [
       "string",
       "null"
      ],
      "description": "Publication timestamp (UTC)"
     },
     "publishedDate": {
      "type": [
       "string",
       "null"
      ],
      "description": "Publication date YYYY-MM-DD"
     },
     "visitDate": {
      "type": [
       "string",
       "null"
      ],
      "description": "Month of the trip YYYY-MM"
     },
     "language": {
      "type": [
       "string",
       "null"
      ],
      "description": "Language of the returned text"
     },
     "originalLanguage": {
      "type": [
       "string",
       "null"
      ],
      "description": "Language the review was written in"
     },
     "isTranslated": {
      "type": [
       "boolean",
       "null"
      ],
      "description": "Text is a Tripadvisor translation"
     },
     "subRatings": {
      "type": [
       "object",
       "null"
      ],
      "description": "Sub-ratings such as Value, Rooms, Location, Cleanliness, Service, Sleep Quality"
     },
     "photos": {
      "type": [
       "array",
       "null"
      ],
      "description": "Photo URLs attached to the review"
     },
     "photoCount": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Number of photos"
     },
     "ownerResponse": {
      "type": [
       "string",
       "null"
      ],
      "description": "Management response text"
     },
     "ownerResponseDate": {
      "type": [
       "string",
       "null"
      ],
      "description": "Management response date"
     },
     "hasOwnerResponse": {
      "type": [
       "boolean",
       "null"
      ],
      "description": "Whether management replied"
     },
     "reviewerName": {
      "type": [
       "string",
       "null"
      ],
      "description": "Reviewer display name"
     },
     "reviewerProfileUrl": {
      "type": [
       "string",
       "null"
      ],
      "description": "Reviewer profile"
     },
     "reviewerLocation": {
      "type": [
       "string",
       "null"
      ],
      "description": "Reviewer home location"
     },
     "reviewerReviewsCount": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Reviewer's total reviews"
     },
     "ratingDistribution": {
      "type": [
       "object",
       "null"
      ],
      "description": "Place rows: number of reviews per star (1-5)"
     },
     "searchQuery": {
      "type": [
       "string",
       "null"
      ],
      "description": "Search that found the place"
     },
     "searchRank": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Position in Tripadvisor search"
     },
     "error": {
      "type": [
       "string",
       "null"
      ],
      "description": "Error rows: what went wrong"
     },
     "errorCode": {
      "type": [
       "string",
       "null"
      ],
      "description": "Error rows: machine-readable code"
     },
     "input": {
      "type": [
       "string",
       "null"
      ],
      "description": "The URL or search query this row came from"
     },
     "scrapedAt": {
      "type": [
       "string",
       "null"
      ],
      "description": "When the row was collected (UTC)"
     }
    }
   },
   "WalmartProductScraperInput": {
    "type": "object",
    "properties": {
     "searchKeywords": {
      "title": "Search keywords",
      "type": "array",
      "description": "Keywords to search on Walmart.com, one per line (e.g. <code>coffee</code>, <code>air fryer</code>). Each keyword returns up to <i>Max products per search/category</i> products.",
      "items": {
       "type": "string"
      }
     },
     "startUrls": {
      "title": "Category, search or product URLs",
      "type": "array",
      "description": "Walmart URLs: category pages (<code>/browse/...</code>, <code>/cp/...</code>), search result pages with filters (<code>/search?q=...</code>), brand/shop pages, or product pages (<code>/ip/...</code>).",
      "items": {
       "type": "object",
       "required": [
        "url"
       ],
       "properties": {
        "url": {
         "type": "string",
         "title": "URL of a web page",
         "format": "uri"
        }
       }
      }
     },
     "productIds": {
      "title": "Product item IDs or URLs",
      "type": "array",
      "description": "Walmart item IDs (the number at the end of a product URL, e.g. <code>578550306</code>) or full <code>/ip/</code> product URLs, one per line.",
      "items": {
       "type": "string"
      }
     },
     "maxItems": {
      "title": "Max products (total)",
      "minimum": 1,
      "maximum": 100000,
      "type": "integer",
      "description": "Maximum number of product rows for the whole run (reviews are not counted). Duplicate products across keywords/categories are skipped automatically.",
      "default": 50
     },
     "maxItemsPerQuery": {
      "title": "Max products per search/category",
      "minimum": 1,
      "maximum": 1000,
      "type": "integer",
      "description": "How many products to take from each keyword or category URL. Walmart shows about 40 products per page and up to 25 pages (about 1,000 products) per search.",
      "default": 40
     },
     "includeDetails": {
      "title": "Scrape full product details",
      "type": "boolean",
      "description": "Open each product page for brand, UPC/GTIN, specifications, variants, description, all images, seller details and pickup/delivery options. Turn off for a faster, cheaper listing-only scrape (title, price, rating, seller, availability from the search grid).",
      "default": true
     },
     "sort": {
      "title": "Sort search results",
      "enum": [
       "best_match",
       "price_low",
       "price_high",
       "best_seller",
       "rating_high",
       "new"
      ],
      "type": "string",
      "description": "Sort order for keyword searches and category pages.",
      "default": "best_match"
     },
     "minPrice": {
      "title": "Min price (USD)",
      "minimum": 0,
      "type": "integer",
      "description": "Only products at or above this price (search and category pages)."
     },
     "maxPrice": {
      "title": "Max price (USD)",
      "minimum": 0,
      "type": "integer",
      "description": "Only products at or below this price (search and category pages)."
     },
     "zipCode": {
      "title": "ZIP code (local price and availability)",
      "type": "string",
      "description": "Optional 5-digit US ZIP code. Prices, stock, delivery dates and the pickup store (Walmart picks the nearest store) are returned for this ZIP. Every product row includes the <code>location</code> Walmart actually used, so you can verify it. Leave empty for Walmart's default location for the proxy IP."
     },
     "includeReviews": {
      "title": "Scrape reviews",
      "type": "boolean",
      "description": "Also scrape customer reviews for every product (output rows with <code>type = review</code>).",
      "default": false
     },
     "maxReviewsPerProduct": {
      "title": "Max reviews per product",
      "minimum": 1,
      "maximum": 5000,
      "type": "integer",
      "description": "Reviews are loaded 10 per page.",
      "default": 20
     },
     "reviewsSort": {
      "title": "Review sort",
      "enum": [
       "relevancy",
       "helpful",
       "submission-desc",
       "submission-asc",
       "rating-desc",
       "rating-asc"
      ],
      "type": "string",
      "description": "Order of the reviews.",
      "default": "relevancy"
     },
     "proxyConfiguration": {
      "title": "Proxy",
      "type": "object",
      "description": "Defaults to Apify datacenter proxy (cheapest) with automatic residential fallback when Walmart blocks it. Choose the RESIDENTIAL group to always use US residential IPs.",
      "default": {
       "useApifyProxy": true
      }
     },
     "residentialFallback": {
      "title": "Residential fallback",
      "type": "boolean",
      "description": "Retry blocked requests on US residential IPs with a fresh browser session. Recommended - this is what keeps the success rate above 95%.",
      "default": true
     },
     "maxConcurrency": {
      "title": "Max concurrency",
      "minimum": 1,
      "maximum": 50,
      "type": "integer",
      "description": "Parallel requests.",
      "default": 10
     },
     "maxRetries": {
      "title": "Max attempts per page",
      "minimum": 1,
      "maximum": 20,
      "type": "integer",
      "description": "Each blocked page is retried with a new IP and browser fingerprint, with backoff.",
      "default": 8
     }
    }
   },
   "WalmartProductScraperRow": {
    "type": "object",
    "properties": {
     "type": {
      "type": [
       "string",
       "null"
      ],
      "description": "Row type: product, review or error (errors are free)"
     },
     "itemId": {
      "type": [
       "string",
       "null"
      ],
      "description": "Walmart item ID (usItemId)"
     },
     "productId": {
      "type": [
       "string",
       "null"
      ],
      "description": "Walmart catalog product ID"
     },
     "title": {
      "type": [
       "string",
       "null"
      ],
      "description": "Product title"
     },
     "brand": {
      "type": [
       "string",
       "null"
      ],
      "description": "Brand"
     },
     "url": {
      "type": [
       "string",
       "null"
      ],
      "description": "Product URL"
     },
     "price": {
      "type": [
       "number",
       "null"
      ],
      "description": "Current price"
     },
     "wasPrice": {
      "type": [
       "number",
       "null"
      ],
      "description": "Previous price (strike-through)"
     },
     "listPrice": {
      "type": [
       "number",
       "null"
      ],
      "description": "List price"
     },
     "unitPrice": {
      "type": [
       "number",
       "null"
      ],
      "description": "Price per unit"
     },
     "unitPriceString": {
      "type": [
       "string",
       "null"
      ],
      "description": "Unit price as shown, e.g. 50.0 \u00a2/oz"
     },
     "unitOfMeasure": {
      "type": [
       "string",
       "null"
      ],
      "description": "Unit of measure"
     },
     "currency": {
      "type": [
       "string",
       "null"
      ],
      "description": "Currency"
     },
     "savingsAmount": {
      "type": [
       "number",
       "null"
      ],
      "description": "Savings vs was-price"
     },
     "rating": {
      "type": [
       "number",
       "null"
      ],
      "description": "Average rating 1-5"
     },
     "reviewCount": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Number of ratings/reviews"
     },
     "sellerId": {
      "type": [
       "string",
       "null"
      ],
      "description": "Seller ID"
     },
     "sellerName": {
      "type": [
       "string",
       "null"
      ],
      "description": "Seller name"
     },
     "sellerType": {
      "type": [
       "string",
       "null"
      ],
      "description": "WALMART (1P) or MARKETPLACE (3P)"
     },
     "fulfilledByWalmart": {
      "type": [
       "boolean",
       "null"
      ],
      "description": "Sold or fulfilled by Walmart (WFS)"
     },
     "offerCount": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Number of offers for the item"
     },
     "availability": {
      "type": [
       "string",
       "null"
      ],
      "description": "IN_STOCK, OUT_OF_STOCK, ..."
     },
     "inStock": {
      "type": [
       "boolean",
       "null"
      ],
      "description": "In stock"
     },
     "shipping": {
      "type": [
       "object",
       "null"
      ],
      "description": "Shipping option: available, date, price, label"
     },
     "pickup": {
      "type": [
       "object",
       "null"
      ],
      "description": "Store pickup option: store, date, aisle"
     },
     "delivery": {
      "type": [
       "object",
       "null"
      ],
      "description": "Delivery-from-store option"
     },
     "location": {
      "type": [
       "object",
       "null"
      ],
      "description": "ZIP / store Walmart used for price and availability"
     },
     "image": {
      "type": [
       "string",
       "null"
      ],
      "description": "Main image URL"
     },
     "images": {
      "type": [
       "array",
       "null"
      ],
      "description": "All image URLs"
     },
     "categories": {
      "type": [
       "array",
       "null"
      ],
      "description": "Category breadcrumb"
     },
     "upc": {
      "type": [
       "string",
       "null"
      ],
      "description": "UPC"
     },
     "gtin14": {
      "type": [
       "string",
       "null"
      ],
      "description": "GTIN-14 (UPC zero-padded)"
     },
     "model": {
      "type": [
       "string",
       "null"
      ],
      "description": "Model number"
     },
     "variants": {
      "type": [
       "array",
       "null"
      ],
      "description": "Variants with item ID, attributes, price, availability"
     },
     "specifications": {
      "type": [
       "object",
       "null"
      ],
      "description": "Specifications name -> value"
     },
     "description": {
      "type": [
       "string",
       "null"
      ],
      "description": "Long description (plain text)"
     },
     "shortDescription": {
      "type": [
       "string",
       "null"
      ],
      "description": "Short description"
     },
     "badges": {
      "type": [
       "array",
       "null"
      ],
      "description": "Badges, e.g. Rollback, Best seller"
     },
     "isSponsored": {
      "type": [
       "boolean",
       "null"
      ],
      "description": "Sponsored placement in search"
     },
     "detailsScraped": {
      "type": [
       "boolean",
       "null"
      ],
      "description": "True when the product page was scraped (full details)"
     },
     "source": {
      "type": [
       "object",
       "null"
      ],
      "description": "Where the product came from: search/category/product input, page, position"
     },
     "reviewId": {
      "type": [
       "string",
       "null"
      ],
      "description": "Review ID"
     },
     "text": {
      "type": [
       "string",
       "null"
      ],
      "description": "Review text"
     },
     "date": {
      "type": [
       "string",
       "null"
      ],
      "description": "Review date (YYYY-MM-DD)"
     },
     "userNickname": {
      "type": [
       "string",
       "null"
      ],
      "description": "Reviewer nickname"
     },
     "verifiedPurchase": {
      "type": [
       "boolean",
       "null"
      ],
      "description": "Verified purchase"
     },
     "error": {
      "type": [
       "string",
       "null"
      ],
      "description": "Error message for type = error"
     },
     "scrapedAt": {
      "type": [
       "string",
       "null"
      ],
      "description": "Scrape time (UTC)"
     }
    }
   },
   "WebsiteContactScraperInput": {
    "type": "object",
    "properties": {
     "urls": {
      "title": "Websites / domains",
      "type": "array",
      "description": "Company websites or bare domains, one per line: <code>acme.com</code>, <code>https://www.acme.com</code> or a specific page like <code>acme.com/contact</code>. The Actor always starts at the homepage and then visits the pages most likely to list contacts (Contact, About, Team, Impressum, Locations...). Duplicates are skipped.",
      "items": {
       "type": "string"
      }
     },
     "datasetId": {
      "title": "Enrich an existing dataset (optional)",
      "type": "string",
      "description": "ID of an Apify dataset to enrich, e.g. from Google Maps Scraper or Company Name to Domain Finder. The Actor reads each item's website from the field below and adds <code>sourceName</code> / <code>sourceIndex</code> so you can join the results back."
     },
     "datasetUrlField": {
      "title": "Dataset website field",
      "type": "string",
      "description": "Field holding the website in that dataset. Leave empty to auto-detect (<code>website</code>, <code>url</code>, <code>domain</code>, <code>companyWebsite</code>...)."
     },
     "maxPagesPerDomain": {
      "title": "Max pages per website",
      "minimum": 1,
      "maximum": 50,
      "type": "integer",
      "description": "Homepage plus the highest-ranked contact/about/team/legal pages. 4-8 finds most contacts; more pages = slower, never more expensive per website.",
      "default": 6
     },
     "extractPhones": {
      "title": "Extract phone numbers",
      "type": "boolean",
      "description": "Phone numbers from <code>tel:</code> links, structured data and text next to a phone label, validated and normalised to E.164 (+14155550132).",
      "default": true
     },
     "extractSocials": {
      "title": "Extract social profiles",
      "type": "boolean",
      "description": "LinkedIn, Facebook, Instagram, X/Twitter, YouTube, TikTok, Pinterest, GitHub, Threads, WhatsApp, Telegram, Discord, Yelp and Trustpilot profile links. Share buttons and post links are ignored.",
      "default": true
     },
     "defaultCountry": {
      "title": "Default phone country",
      "type": "string",
      "description": "2-letter country used to read local phone numbers (without +country code) on sites with a generic TLD like .com. Country TLDs (.de, .co.uk...) and the page language (en-GB) override it.",
      "default": "US"
     },
     "onlyRoleEmails": {
      "title": "Only role-based emails (info@, sales@, support@...)",
      "type": "boolean",
      "description": "Drop personal addresses (jane.doe@...) and free-mail addresses. Useful for GDPR-sensitive outreach.",
      "default": false
     },
     "onlyOwnDomainEmails": {
      "title": "Only emails on the website's own domain",
      "type": "boolean",
      "description": "Drop addresses on other domains (agencies, parent companies, gmail.com...).",
      "default": false
     },
     "checkMx": {
      "title": "Check email domains & detect email provider",
      "type": "boolean",
      "description": "DNS check: drops emails whose domain cannot receive mail, and adds the website's email provider (Google Workspace, Microsoft 365, Zoho...) and security gateway (Proofpoint, Mimecast...). No emails are sent.",
      "default": true
     },
     "respectRobotsTxt": {
      "title": "Respect robots.txt",
      "type": "boolean",
      "description": "Skip pages the website's robots.txt disallows for all crawlers. Websites that disallow everything return a free <code>robots_disallowed</code> row.",
      "default": true
     },
     "maxConcurrency": {
      "title": "Websites in parallel",
      "minimum": 1,
      "maximum": 100,
      "type": "integer",
      "description": "How many websites are crawled at the same time.",
      "default": 30
     },
     "maxResults": {
      "title": "Max websites with contacts",
      "minimum": 1,
      "type": "integer",
      "description": "Stop after this many paid results (websites with at least one contact). Leave empty for no limit. You can also cap spending with the run's maximum cost."
     },
     "proxyMode": {
      "title": "When to use the proxy",
      "enum": [
       "fallback",
       "always"
      ],
      "type": "string",
      "description": "Most company websites don't block, so pages are fetched directly and only blocked requests are retried through the proxy.",
      "default": "fallback"
     },
     "proxyConfiguration": {
      "title": "Proxy configuration",
      "type": "object",
      "description": "Proxy used for websites that block direct requests. Apify datacenter proxy is included in the price.",
      "default": {
       "useApifyProxy": true
      }
     },
     "residentialFallback": {
      "title": "Residential proxy as last resort",
      "type": "boolean",
      "description": "Retry still-blocked websites through residential IPs. Slightly higher success on heavily protected sites.",
      "default": false
     }
    }
   },
   "WebsiteContactScraperRow": {
    "type": "object",
    "properties": {
     "input": {
      "type": "string",
      "description": "Website or domain as given"
     },
     "domain": {
      "type": [
       "string",
       "null"
      ],
      "description": "Registrable domain (after redirects)"
     },
     "url": {
      "type": [
       "string",
       "null"
      ],
      "description": "Homepage URL after redirects"
     },
     "status": {
      "type": "string",
      "description": "ok (charged) | no_contacts | error | invalid_input | robots_disallowed (all free)"
     },
     "companyName": {
      "type": [
       "string",
       "null"
      ],
      "description": "Name from structured data, og:site_name or page title"
     },
     "primaryEmail": {
      "type": [
       "string",
       "null"
      ],
      "description": "Best email: own domain, explicit mailto, contact page first"
     },
     "emails": {
      "type": "array",
      "description": "All emails found, best first"
     },
     "primaryPhone": {
      "type": [
       "string",
       "null"
      ],
      "description": "Best phone in E.164"
     },
     "phones": {
      "type": "array",
      "description": "All phone numbers in E.164"
     },
     "linkedin": {
      "type": [
       "string",
       "null"
      ],
      "description": "LinkedIn company/profile URL"
     },
     "facebook": {
      "type": [
       "string",
       "null"
      ],
      "description": "Facebook page"
     },
     "instagram": {
      "type": [
       "string",
       "null"
      ],
      "description": "Instagram profile"
     },
     "twitter": {
      "type": [
       "string",
       "null"
      ],
      "description": "X / Twitter profile"
     },
     "youtube": {
      "type": [
       "string",
       "null"
      ],
      "description": "YouTube channel"
     },
     "tiktok": {
      "type": [
       "string",
       "null"
      ],
      "description": "TikTok profile"
     },
     "pinterest": {
      "type": [
       "string",
       "null"
      ],
      "description": "Pinterest profile"
     },
     "github": {
      "type": [
       "string",
       "null"
      ],
      "description": "GitHub org/user"
     },
     "threads": {
      "type": [
       "string",
       "null"
      ],
      "description": "Threads profile"
     },
     "whatsapp": {
      "type": [
       "string",
       "null"
      ],
      "description": "WhatsApp click-to-chat link"
     },
     "telegram": {
      "type": [
       "string",
       "null"
      ],
      "description": "Telegram link"
     },
     "discord": {
      "type": [
       "string",
       "null"
      ],
      "description": "Discord invite"
     },
     "yelp": {
      "type": [
       "string",
       "null"
      ],
      "description": "Yelp business page"
     },
     "trustpilot": {
      "type": [
       "string",
       "null"
      ],
      "description": "Trustpilot review page"
     },
     "socialProfiles": {
      "type": "array",
      "description": "All social profile URLs"
     },
     "address": {
      "type": [
       "string",
       "null"
      ],
      "description": "Postal address from structured data"
     },
     "contactPageUrl": {
      "type": [
       "string",
       "null"
      ],
      "description": "Contact / Impressum page found"
     },
     "hasContactForm": {
      "type": [
       "boolean",
       "null"
      ],
      "description": "A contact form (email + message) was found"
     },
     "emailProvider": {
      "type": [
       "string",
       "null"
      ],
      "description": "Mail provider of the domain from MX records"
     },
     "emailSecurityGateway": {
      "type": [
       "string",
       "null"
      ],
      "description": "Email security gateway (Proofpoint, Mimecast...)"
     },
     "mxRecords": {
      "type": [
       "array",
       "null"
      ],
      "description": "MX hosts"
     },
     "emailDetails": {
      "type": [
       "array",
       "null"
      ],
      "description": "Per email: type (role/personal/free), onDomain, source, page, domainAcceptsMail"
     },
     "phoneDetails": {
      "type": [
       "array",
       "null"
      ],
      "description": "Per phone: international format, country, source, page"
     },
     "title": {
      "type": [
       "string",
       "null"
      ],
      "description": "Homepage title"
     },
     "description": {
      "type": [
       "string",
       "null"
      ],
      "description": "Meta description"
     },
     "language": {
      "type": [
       "string",
       "null"
      ],
      "description": "<html lang>"
     },
     "logo": {
      "type": [
       "string",
       "null"
      ],
      "description": "Logo URL from structured data"
     },
     "legalName": {
      "type": [
       "string",
       "null"
      ],
      "description": "Legal name from structured data"
     },
     "pagesCrawled": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Pages fetched"
     },
     "crawledUrls": {
      "type": [
       "array",
       "null"
      ],
      "description": "Pages fetched"
     },
     "pagesFailed": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Pages that failed"
     },
     "proxyUsed": {
      "type": [
       "array",
       "null"
      ],
      "description": "Proxy tiers used, if any"
     },
     "redirectedFrom": {
      "type": [
       "string",
       "null"
      ],
      "description": "Original domain if the website redirected to another domain"
     },
     "sourceName": {
      "type": [
       "string",
       "null"
      ],
      "description": "Name from the enriched dataset item"
     },
     "sourceIndex": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Index in the enriched dataset"
     },
     "errorType": {
      "type": [
       "string",
       "null"
      ],
      "description": "dns_not_found | timeout | connection_failed | blocked | http_error | ssl_error | not_html | invalid_input | robots_disallowed"
     },
     "error": {
      "type": [
       "string",
       "null"
      ],
      "description": "Why there are no contacts"
     },
     "scrapedAt": {
      "type": "string",
      "description": "UTC timestamp"
     }
    }
   },
   "WebsiteTechStackDetectorInput": {
    "type": "object",
    "properties": {
     "urls": {
      "title": "Websites / domains",
      "type": "array",
      "description": "Websites or bare domains, one per line: <code>acme.com</code>, <code>https://www.acme.com</code> or a specific page like <code>acme.com/pricing</code>. Duplicates are skipped. Up to 100,000 per run.",
      "items": {
       "type": "string"
      }
     },
     "datasetId": {
      "title": "Enrich an existing dataset (optional)",
      "type": "string",
      "description": "ID of an Apify dataset to enrich, e.g. from Google Maps Scraper, Website Contact Scraper or Company Name to Domain Finder. Each item's website is read from the field below; <code>sourceName</code> / <code>sourceIndex</code> are added so you can join the results back."
     },
     "datasetUrlField": {
      "title": "Dataset website field",
      "type": "string",
      "description": "Field holding the website in that dataset. Leave empty to auto-detect (<code>website</code>, <code>url</code>, <code>domain</code>, <code>companyWebsite</code>...)."
     },
     "onlyWithTechnologies": {
      "title": "Only websites using (optional)",
      "type": "array",
      "description": "Keep only websites where at least one of these technologies is detected, e.g. <code>Shopify</code>, <code>WooCommerce</code>, <code>HubSpot</code>, <code>Klaviyo</code>. Names as in Wappalyzer, case-insensitive. Websites without a match are <b>not charged</b> and not output (unless enabled below). Great for building lead lists by technology.",
      "items": {
       "type": "string"
      }
     },
     "outputFilteredOut": {
      "title": "Also output non-matching websites (free rows)",
      "type": "boolean",
      "description": "When the filter above is set, add a free <code>filtered_out</code> row for each website without a match (status only, no technologies).",
      "default": false
     },
     "minConfidence": {
      "title": "Minimum confidence",
      "minimum": 0,
      "maximum": 100,
      "type": "integer",
      "description": "Hide weak detections below this confidence. 50 keeps everything the fingerprints are reasonably sure about; 100 = only certain detections; 0 = everything.",
      "default": 50
     },
     "includeTechnologyDetails": {
      "title": "Include technology details",
      "type": "boolean",
      "description": "Add <code>technologyDetails</code>: version, confidence, categories, vendor website, SaaS / open-source flags, pricing tier and how each technology was detected.",
      "default": true
     },
     "checkDnsAndTls": {
      "title": "DNS & TLS checks",
      "type": "boolean",
      "description": "Read the domain's MX, TXT (SPF + site verifications), NS, SOA and CNAME records and the TLS certificate issuer: adds email provider (Google Workspace, Microsoft 365...), email security gateway, email-sending services from SPF (HubSpot, Salesforce, SendGrid, Zendesk...), DNS provider and SSL issuer. No emails are sent.",
      "default": true
     },
     "maxPagesPerWebsite": {
      "title": "Pages per website",
      "minimum": 1,
      "maximum": 5,
      "type": "integer",
      "description": "1 = homepage only (fastest, finds most technologies). 2-5 also scans pages from different sections (shop, pricing, blog...) to catch tools only loaded there. Never more expensive per website.",
      "default": 1
     },
     "maxConcurrency": {
      "title": "Websites in parallel",
      "minimum": 1,
      "maximum": 100,
      "type": "integer",
      "description": "How many websites are analysed at the same time.",
      "default": 25
     },
     "maxResults": {
      "title": "Max websites analysed",
      "minimum": 1,
      "type": "integer",
      "description": "Stop after this many paid results (websites with at least one technology detected). Leave empty for no limit. You can also cap spending with the run's maximum cost."
     },
     "proxyMode": {
      "title": "When to use the proxy",
      "enum": [
       "fallback",
       "always",
       "off"
      ],
      "type": "string",
      "description": "Most websites don't block, so pages are fetched directly and only blocked requests are retried through the proxy.",
      "default": "fallback"
     },
     "proxyConfiguration": {
      "title": "Proxy configuration",
      "type": "object",
      "description": "Proxy used for websites that block direct requests. Apify datacenter proxy is included in the price.",
      "default": {
       "useApifyProxy": true
      }
     },
     "residentialFallback": {
      "title": "Residential proxy as last resort",
      "type": "boolean",
      "description": "Retry still-blocked websites through residential IPs. Slightly higher success on heavily protected sites.",
      "default": false
     }
    }
   },
   "WebsiteTechStackDetectorRow": {
    "type": "object",
    "properties": {
     "input": {
      "type": "string",
      "description": "Website or domain as given"
     },
     "domain": {
      "type": [
       "string",
       "null"
      ],
      "description": "Registrable domain (after redirects)"
     },
     "url": {
      "type": [
       "string",
       "null"
      ],
      "description": "Homepage URL after redirects"
     },
     "status": {
      "type": "string",
      "description": "ok (charged) | no_technologies | filtered_out | error | invalid_input (all free)"
     },
     "technologyCount": {
      "type": "integer",
      "description": "Number of technologies detected"
     },
     "technologies": {
      "type": "array",
      "description": "All technology names, most important categories first"
     },
     "cms": {
      "type": "array",
      "description": "Technologies in categories: CMS, Blogs, Page builders, Static site generator, Wikis, DMS, LMS"
     },
     "ecommerce": {
      "type": "array",
      "description": "Technologies in categories: Ecommerce, Ecommerce frontends"
     },
     "ecommerceAddOns": {
      "type": "array",
      "description": "Technologies in categories: Shopify apps, Cart abandonment, Loyalty & rewards, Returns, Fulfilment, Cross border ecommerce, Shipping carriers, Referral marketing, Affiliate programs"
     },
     "paymentProcessors": {
      "type": "array",
      "description": "Technologies in categories: Payment processors, Buy now pay later"
     },
     "analytics": {
      "type": "array",
      "description": "Technologies in categories: Analytics, RUM, Surveys, Browser fingerprinting, Customer data platform, Segmentation"
     },
     "tagManagers": {
      "type": "array",
      "description": "Technologies in categories: Tag managers"
     },
     "advertising": {
      "type": "array",
      "description": "Technologies in categories: Advertising, Retargeting"
     },
     "marketingAutomation": {
      "type": "array",
      "description": "Technologies in categories: Marketing automation, Personalisation, Content curation"
     },
     "emailServices": {
      "type": "array",
      "description": "Technologies in categories: Email, Webmail"
     },
     "crm": {
      "type": "array",
      "description": "Technologies in categories: CRM"
     },
     "liveChat": {
      "type": "array",
      "description": "Technologies in categories: Live chat, User onboarding"
     },
     "abTesting": {
      "type": "array",
      "description": "Technologies in categories: A/B Testing, Feature management"
     },
     "reviews": {
      "type": "array",
      "description": "Technologies in categories: Reviews"
     },
     "cookieConsent": {
      "type": "array",
      "description": "Technologies in categories: Cookie compliance"
     },
     "javascriptFrameworks": {
      "type": "array",
      "description": "Technologies in categories: JavaScript frameworks, Mobile frameworks"
     },
     "javascriptLibraries": {
      "type": "array",
      "description": "Technologies in categories: JavaScript libraries, JavaScript graphics, Font scripts"
     },
     "uiFrameworks": {
      "type": "array",
      "description": "Technologies in categories: UI frameworks"
     },
     "webFrameworks": {
      "type": "array",
      "description": "Technologies in categories: Web frameworks"
     },
     "programmingLanguages": {
      "type": "array",
      "description": "Technologies in categories: Programming languages"
     },
     "webServers": {
      "type": "array",
      "description": "Technologies in categories: Web servers, Reverse proxies, Load balancers, Caching, Web server extensions"
     },
     "cdn": {
      "type": "array",
      "description": "Technologies in categories: CDN"
     },
     "hosting": {
      "type": "array",
      "description": "Technologies in categories: PaaS, IaaS, Hosting, Hosting panels"
     },
     "security": {
      "type": "array",
      "description": "Technologies in categories: Security, Authentication"
     },
     "searchAndAI": {
      "type": "array",
      "description": "Technologies in categories: Search engines, Artificial Intelligence"
     },
     "bookingAndScheduling": {
      "type": "array",
      "description": "Technologies in categories: Appointment scheduling, Reservations & delivery, Ticket booking"
     },
     "forms": {
      "type": "array",
      "description": "Technologies in categories: Form builders"
     },
     "recruiting": {
      "type": "array",
      "description": "Technologies in categories: Recruitment & staffing"
     },
     "seo": {
      "type": "array",
      "description": "Technologies in categories: SEO"
     },
     "emailProvider": {
      "type": [
       "string",
       "null"
      ],
      "description": "Email host from MX records (Google Workspace, Microsoft 365, Zoho...)"
     },
     "emailSecurityGateway": {
      "type": [
       "string",
       "null"
      ],
      "description": "Email security gateway from MX (Proofpoint, Mimecast...)"
     },
     "emailSendingServices": {
      "type": "array",
      "description": "Services allowed to send email for the domain (SPF includes): HubSpot, Salesforce, SendGrid..."
     },
     "dnsProvider": {
      "type": [
       "string",
       "null"
      ],
      "description": "DNS host from NS records"
     },
     "sslIssuer": {
      "type": [
       "string",
       "null"
      ],
      "description": "TLS certificate issuer organisation"
     },
     "sslValidUntil": {
      "type": [
       "string",
       "null"
      ],
      "description": "TLS certificate expiry"
     },
     "paidSaasCount": {
      "type": "integer",
      "description": "Detected SaaS tools with a paid plan (pricing data from the fingerprints)"
     },
     "techSpendScore": {
      "type": "integer",
      "description": "Rough spend signal: sum of price tiers of paid tools (low=1, mid/poa=2, high=3)"
     },
     "technologiesByCategory": {
      "type": "object",
      "description": "Category name -> technologies"
     },
     "technologyDetails": {
      "type": "array",
      "description": "Per technology: name, version, confidence, categories, groups, website, description, saas, openSource, pricing, cpe, detectedBy"
     },
     "dnsRecords": {
      "type": "object",
      "description": "mx, ns, spf, txtVerifications (services that verified the domain), cname"
     },
     "title": {
      "type": [
       "string",
       "null"
      ],
      "description": "Homepage title"
     },
     "description": {
      "type": [
       "string",
       "null"
      ],
      "description": "Meta description"
     },
     "language": {
      "type": [
       "string",
       "null"
      ],
      "description": "<html lang>"
     },
     "httpStatus": {
      "type": [
       "integer",
       "null"
      ],
      "description": "HTTP status of the homepage"
     },
     "pagesScanned": {
      "type": "integer",
      "description": "Pages analysed"
     },
     "scannedUrls": {
      "type": "array",
      "description": "URLs analysed"
     },
     "pagesFailed": {
      "type": "integer",
      "description": "Extra pages that could not be fetched"
     },
     "proxyUsed": {
      "type": [
       "array",
       "null"
      ],
      "description": "Proxy tiers needed (null = direct)"
     },
     "redirectedFrom": {
      "type": [
       "string",
       "null"
      ],
      "description": "Original domain if the site redirected to another domain"
     },
     "sourceName": {
      "type": [
       "string",
       "null"
      ],
      "description": "Name from the enriched dataset item"
     },
     "sourceIndex": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Index of the enriched dataset item"
     },
     "errorType": {
      "type": [
       "string",
       "null"
      ],
      "description": "dns_not_found | timeout | connection_failed | blocked | http_error | not_html | ssl_error | invalid_input"
     },
     "error": {
      "type": [
       "string",
       "null"
      ],
      "description": "Why the row is free"
     },
     "scrapedAt": {
      "type": "string",
      "description": "UTC timestamp"
     }
    }
   },
   "YoutubeTranscriptScraperInput": {
    "type": "object",
    "properties": {
     "urls": {
      "title": "YouTube URLs, video IDs or @handles",
      "type": "array",
      "description": "One per line, mixed freely: video URLs (<code>watch?v=</code>, <code>youtu.be/</code>, <code>/shorts/</code>, <code>/live/</code>, <code>/embed/</code>), 11-character video IDs, channel URLs or <code>@handles</code> (<code>/@name</code>, <code>/channel/UC\u2026</code>, <code>/c/</code>, <code>/user/</code>; add <code>/shorts</code> or <code>/streams</code> to pick that tab) and playlist URLs (<code>playlist?list=</code>). The type is detected automatically.",
      "items": {
       "type": "string"
      }
     },
     "searchQueries": {
      "title": "Search queries",
      "type": "array",
      "description": "Search YouTube and get transcripts of the top <i>Max videos</i> results (videos only) for each query, e.g. <code>how transformers work</code>.",
      "items": {
       "type": "string"
      }
     },
     "maxVideos": {
      "title": "Max videos per channel / playlist / search",
      "minimum": 1,
      "maximum": 5000,
      "type": "integer",
      "description": "How many videos to take from each channel, playlist or search query (newest first for channels). Single video URLs are always included.",
      "default": 10
     },
     "channelContentType": {
      "title": "Channel tab",
      "enum": [
       "videos",
       "shorts",
       "streams",
       "all"
      ],
      "type": "string",
      "description": "Which uploads to take from a channel. A tab in the channel URL (e.g. <code>/@name/shorts</code>) overrides this.",
      "default": "videos"
     },
     "maxTotalVideos": {
      "title": "Max videos in total",
      "minimum": 1,
      "maximum": 100000,
      "type": "integer",
      "description": "Upper limit for the whole run, after removing duplicates.",
      "default": 1000
     },
     "languages": {
      "title": "Preferred languages",
      "type": "array",
      "description": "Language codes in order of preference, e.g. <code>en</code>, <code>es</code>, <code>pt-BR</code>. <code>en</code> also matches <code>en-US</code>/<code>en-GB</code>. Leave empty to always get the video's original (spoken) language.",
      "default": [
       "en"
      ],
      "items": {
       "type": "string"
      }
     },
     "fallbackToAnyLanguage": {
      "title": "Fall back to the original language",
      "type": "boolean",
      "description": "If none of the preferred languages exists, return the transcript in the video's original language (manual captions first, then auto-generated). Turn off to get a free <code>no_transcript</code> row instead.",
      "default": true
     },
     "autoTranslate": {
      "title": "Auto-translate to the first preferred language",
      "type": "boolean",
      "description": "If no transcript exists in your preferred languages, ask YouTube to machine-translate the original transcript into the first preferred language. If YouTube refuses the translation, the original language is returned and <code>translationError</code> is set.",
      "default": false
     },
     "preferManualCaptions": {
      "title": "Prefer human-made captions",
      "type": "boolean",
      "description": "Pick creator-uploaded captions over auto-generated (ASR) ones in the same language.",
      "default": true
     },
     "skipAutoGenerated": {
      "title": "Only human-made captions",
      "type": "boolean",
      "description": "Ignore auto-generated captions. Videos with only auto-generated captions get a free <code>no_transcript</code> row.",
      "default": false
     },
     "outputFormats": {
      "title": "Output formats",
      "type": "array",
      "description": "Which transcript formats to include in each row. Every format is included in the same price.",
      "items": {
       "type": "string",
       "enum": [
        "text",
        "segments",
        "timestamped",
        "srt",
        "vtt",
        "chunks"
       ],
       "enumTitles": [
        "Plain text",
        "Timestamped segments (JSON)",
        "Timestamped text ([m:ss] lines)",
        "SRT subtitles",
        "WebVTT subtitles",
        "RAG chunks (with start/end and deep links)"
       ]
      },
      "default": [
       "text",
       "segments"
      ]
     },
     "chunkSize": {
      "title": "Chunk size (characters)",
      "minimum": 200,
      "maximum": 50000,
      "type": "integer",
      "description": "Only for the <i>RAG chunks</i> format. Chunks follow caption boundaries (no cut words). 2,000 characters \u2248 400-500 tokens.",
      "default": 2000
     },
     "chunkOverlap": {
      "title": "Chunk overlap (characters)",
      "minimum": 0,
      "maximum": 25000,
      "type": "integer",
      "description": "Text repeated from the end of one chunk at the start of the next.",
      "default": 200
     },
     "includeDescription": {
      "title": "Include video description",
      "type": "boolean",
      "description": "Add the video description and chapters (parsed from description timestamps).",
      "default": true
     },
     "proxyConfiguration": {
      "title": "Proxy configuration",
      "type": "object",
      "description": "Defaults to Apify datacenter proxy with automatic residential fallback when YouTube asks to 'confirm you're not a bot'. Choose the RESIDENTIAL group to always use residential IPs.",
      "default": {
       "useApifyProxy": true
      }
     },
     "residentialFallback": {
      "title": "Residential fallback",
      "type": "boolean",
      "description": "Retry blocked requests on residential IPs. Recommended - this is what keeps the success rate high.",
      "default": true
     },
     "reliabilityFallback": {
      "title": "Reliability fallback",
      "type": "boolean",
      "description": "If YouTube blocks or rate-limits a video (bot check, HTTP 429, empty caption file), fetch its subtitles from a licensed backup source instead of returning an error. Charged at the normal transcript price; no extra cost to you.",
      "default": true
     },
     "maxConcurrency": {
      "title": "Max concurrency",
      "minimum": 1,
      "maximum": 50,
      "type": "integer",
      "description": "Videos processed in parallel.",
      "default": 20
     },
     "maxRetries": {
      "title": "Max attempts per request",
      "minimum": 1,
      "maximum": 20,
      "type": "integer",
      "description": "Each blocked request is retried on a new IP, with backoff.",
      "default": 6
     },
     "videoUrl": {
      "title": "Video URL (compatible input)",
      "type": "string",
      "description": "Single video URL, same as <code>videoUrl</code> in pintostudio/youtube-transcript-scraper. Added to the URL list."
     },
     "targetLanguage": {
      "title": "Target language (compatible input)",
      "type": "string",
      "description": "Same as <code>targetLanguage</code> in pintostudio/youtube-transcript-scraper (e.g. <code>en</code>, <code>es</code>). Overrides Languages and turns on auto-translate."
     },
     "youtube_url": {
      "title": "youtube_url (compatible input)",
      "type": "string",
      "description": "Same as <code>youtube_url</code> in starvibe/youtube-video-transcript. Added to the URL list."
     },
     "channel_url": {
      "title": "channel_url (compatible input)",
      "type": "string",
      "description": "Same as <code>channel_url</code> in starvibe/youtube-video-transcript. Added to the URL list."
     },
     "language": {
      "title": "language (compatible input)",
      "type": "string",
      "description": "Same as <code>language</code> in starvibe/youtube-video-transcript. Overrides Languages."
     },
     "max_videos": {
      "title": "max_videos (compatible input)",
      "minimum": 1,
      "type": "integer",
      "description": "Same as <code>max_videos</code> in starvibe/youtube-video-transcript. Overrides Max videos per channel / playlist / search."
     },
     "start_date": {
      "title": "start_date (compatible input)",
      "type": "string",
      "description": "YYYY-MM-DD. Only videos published on or after this date are returned (others are skipped and not charged)."
     },
     "end_date": {
      "title": "end_date (compatible input)",
      "type": "string",
      "description": "YYYY-MM-DD. Only videos published on or before this date are returned (others are skipped and not charged)."
     },
     "include_transcript_text": {
      "title": "include_transcript_text (compatible input)",
      "type": "boolean",
      "description": "Accepted so starvibe/youtube-video-transcript inputs work unchanged. Use Output formats to choose what is returned."
     }
    }
   },
   "YoutubeTranscriptScraperRow": {
    "type": "object",
    "properties": {
     "videoId": {
      "type": [
       "string",
       "null"
      ],
      "description": "YouTube video ID"
     },
     "url": {
      "type": [
       "string",
       "null"
      ],
      "description": "Video URL"
     },
     "status": {
      "type": [
       "string",
       "null"
      ],
      "description": "ok, no_transcript, no_videos or error (only ok rows are charged)"
     },
     "noTranscriptReason": {
      "type": [
       "string",
       "null"
      ],
      "description": "no_captions, language_not_available, only_auto_generated, video_unavailable, private_video, age_restricted, members_only, geo_restricted, live_not_started, login_required"
     },
     "error": {
      "type": [
       "string",
       "null"
      ],
      "description": "Error or YouTube message"
     },
     "title": {
      "type": [
       "string",
       "null"
      ],
      "description": "Video title"
     },
     "channelName": {
      "type": [
       "string",
       "null"
      ],
      "description": "Channel name"
     },
     "channelId": {
      "type": [
       "string",
       "null"
      ],
      "description": "Channel ID (UC...)"
     },
     "channelUrl": {
      "type": [
       "string",
       "null"
      ],
      "description": "Channel URL"
     },
     "publishDate": {
      "type": [
       "string",
       "null"
      ],
      "description": "Publish date (ISO 8601 with offset)"
     },
     "durationSeconds": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Duration in seconds"
     },
     "duration": {
      "type": [
       "string",
       "null"
      ],
      "description": "Duration (m:ss or h:mm:ss)"
     },
     "viewCount": {
      "type": [
       "integer",
       "null"
      ],
      "description": "View count"
     },
     "category": {
      "type": [
       "string",
       "null"
      ],
      "description": "YouTube category"
     },
     "isLive": {
      "type": [
       "boolean",
       "null"
      ],
      "description": "Live stream / was live"
     },
     "isUnlisted": {
      "type": [
       "boolean",
       "null"
      ],
      "description": "Unlisted video"
     },
     "description": {
      "type": [
       "string",
       "null"
      ],
      "description": "Video description"
     },
     "chapters": {
      "type": [
       "array",
       "null"
      ],
      "description": "Chapters from description timestamps [{start, title}]"
     },
     "language": {
      "type": [
       "string",
       "null"
      ],
      "description": "Transcript language code"
     },
     "languageName": {
      "type": [
       "string",
       "null"
      ],
      "description": "Transcript language name"
     },
     "originalLanguage": {
      "type": [
       "string",
       "null"
      ],
      "description": "Spoken (original) language"
     },
     "languageMatch": {
      "type": [
       "string",
       "null"
      ],
      "description": "preferred = one of your languages, original = fallback to the original language"
     },
     "isAutoGenerated": {
      "type": [
       "boolean",
       "null"
      ],
      "description": "Auto-generated (ASR) captions"
     },
     "isTranslated": {
      "type": [
       "boolean",
       "null"
      ],
      "description": "Machine-translated by YouTube (autoTranslate)"
     },
     "translatedFrom": {
      "type": [
       "string",
       "null"
      ],
      "description": "Source language of a translation"
     },
     "translationError": {
      "type": [
       "string",
       "null"
      ],
      "description": "Why auto-translation failed (original returned)"
     },
     "transcriptAvailable": {
      "type": [
       "boolean",
       "null"
      ],
      "description": "A transcript was returned"
     },
     "text": {
      "type": [
       "string",
       "null"
      ],
      "description": "Full transcript as plain text"
     },
     "wordCount": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Words in the transcript"
     },
     "segmentCount": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Number of caption segments"
     },
     "segments": {
      "type": [
       "array",
       "null"
      ],
      "description": "[{start, end, text}] in seconds"
     },
     "timestampedText": {
      "type": [
       "string",
       "null"
      ],
      "description": "Transcript as [m:ss] lines"
     },
     "srt": {
      "type": [
       "string",
       "null"
      ],
      "description": "SRT subtitles"
     },
     "vtt": {
      "type": [
       "string",
       "null"
      ],
      "description": "WebVTT subtitles"
     },
     "chunks": {
      "type": [
       "array",
       "null"
      ],
      "description": "RAG chunks [{index, text, start, end, url, chars}]"
     },
     "availableLanguages": {
      "type": [
       "array",
       "null"
      ],
      "description": "All caption tracks [{code, name, isAutoGenerated}]"
     },
     "source": {
      "type": [
       "string",
       "null"
      ],
      "description": "Input this video came from"
     },
     "sourceType": {
      "type": [
       "string",
       "null"
      ],
      "description": "video, channel, playlist or search"
     },
     "scrapedAt": {
      "type": [
       "string",
       "null"
      ],
      "description": "Scrape time (UTC)"
     }
    }
   }
  }
 },
 "paths": {
  "/acts/wrenfield-data~agency-ai-visibility-reports/run-sync-get-dataset-items": {
   "post": {
    "operationId": "agency_ai_visibility_reports",
    "summary": "Agency AI Visibility Reports - White-Label Client Packets",
    "description": "Upload your client list once and get a finished, white-label weekly report per client: brand mentions, share of voice and citations across ChatGPT, Perplexity, Gemini and Google AI Mode, Google rank changes, quoted evidence and a prioritized action queue. Charged per completed client packet. Docs: https://wrenfielddata.com/tools/agency-ai-visibility-reports/",
    "x-pricing": [
     {
      "event": "client-packet",
      "title": "Client packet (books of 1-19 clients)",
      "usd": 12,
      "primary": true
     },
     {
      "event": "client-packet-20",
      "title": "Client packet (books of 20-49 clients)",
      "usd": 8,
      "primary": false
     },
     {
      "event": "client-packet-50",
      "title": "Client packet (books of 50+ clients)",
      "usd": 7,
      "primary": false
     }
    ],
    "x-openai-isConsequential": false,
    "parameters": [
     {
      "name": "maxTotalChargeUsd",
      "in": "query",
      "required": false,
      "schema": {
       "type": "number"
      },
      "description": "Spend cap for this call (USD)."
     },
     {
      "name": "timeout",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer"
      },
      "description": "Seconds to wait (max 300 for sync calls)."
     }
    ],
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "$ref": "#/components/schemas/AgencyAiVisibilityReportsInput"
       }
      }
     }
    },
    "responses": {
     "201": {
      "description": "Result rows",
      "content": {
       "application/json": {
        "schema": {
         "type": "array",
         "items": {
          "$ref": "#/components/schemas/AgencyAiVisibilityReportsRow"
         }
        }
       }
      }
     },
     "400": {
      "description": "Invalid input"
     },
     "401": {
      "description": "Missing or invalid token"
     },
     "408": {
      "description": "Run took longer than the sync limit; use the async /runs endpoint"
     }
    }
   }
  },
  "/acts/wrenfield-data~ai-answer-scraper/run-sync-get-dataset-items": {
   "post": {
    "operationId": "ai_answer_scraper",
    "summary": "AI Answer Scraper - ChatGPT, Perplexity, Gemini & AI Mode",
    "description": "Answers and cited sources from ChatGPT, Perplexity, Gemini, Google AI Mode, Google AI Overviews and Claude for your prompts. Same input as Apify's AI scrapers (queries, countryCode). Licensed data, no logins, no browser. $0.015 per answer. Built for GEO / AI search tracking and AI agents. Docs: https://wrenfielddata.com/tools/ai-answer-scraper/",
    "x-pricing": [
     {
      "event": "ai-answer",
      "title": "AI answer",
      "usd": 0.015,
      "primary": true
     },
     {
      "event": "empty-answer",
      "title": "Empty answer",
      "usd": 0.006,
      "primary": false
     }
    ],
    "x-openai-isConsequential": false,
    "parameters": [
     {
      "name": "maxTotalChargeUsd",
      "in": "query",
      "required": false,
      "schema": {
       "type": "number"
      },
      "description": "Spend cap for this call (USD)."
     },
     {
      "name": "timeout",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer"
      },
      "description": "Seconds to wait (max 300 for sync calls)."
     }
    ],
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "$ref": "#/components/schemas/AiAnswerScraperInput"
       }
      }
     }
    },
    "responses": {
     "201": {
      "description": "Result rows",
      "content": {
       "application/json": {
        "schema": {
         "type": "array",
         "items": {
          "$ref": "#/components/schemas/AiAnswerScraperRow"
         }
        }
       }
      }
     },
     "400": {
      "description": "Invalid input"
     },
     "401": {
      "description": "Missing or invalid token"
     },
     "408": {
      "description": "Run took longer than the sync limit; use the async /runs endpoint"
     }
    }
   }
  },
  "/acts/wrenfield-data~ai-search-visibility-tracker/run-sync-get-dataset-items": {
   "post": {
    "operationId": "ai_search_visibility_tracker",
    "summary": "AI Search Visibility Tracker: ChatGPT, Perplexity",
    "description": "Track brand mentions, share of voice and cited URLs in ChatGPT, Perplexity, Gemini, Google AI Overviews, AI Mode and Claude. Per prompt x engine: full answer, mention rank, sentiment, citations, your domain cited or not. Monitoring mode flags gained/lost mentions. GEO/AEO rank tracker. Docs: https://wrenfielddata.com/tools/ai-search-visibility-tracker/",
    "x-pricing": [
     {
      "event": "prompt-check",
      "title": "Prompt check",
      "usd": 0.04,
      "primary": true
     }
    ],
    "x-openai-isConsequential": false,
    "parameters": [
     {
      "name": "maxTotalChargeUsd",
      "in": "query",
      "required": false,
      "schema": {
       "type": "number"
      },
      "description": "Spend cap for this call (USD)."
     },
     {
      "name": "timeout",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer"
      },
      "description": "Seconds to wait (max 300 for sync calls)."
     }
    ],
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "$ref": "#/components/schemas/AiSearchVisibilityTrackerInput"
       }
      }
     }
    },
    "responses": {
     "201": {
      "description": "Result rows",
      "content": {
       "application/json": {
        "schema": {
         "type": "array",
         "items": {
          "$ref": "#/components/schemas/AiSearchVisibilityTrackerRow"
         }
        }
       }
      }
     },
     "400": {
      "description": "Invalid input"
     },
     "401": {
      "description": "Missing or invalid token"
     },
     "408": {
      "description": "Run took longer than the sync limit; use the async /runs endpoint"
     }
    }
   }
  },
  "/acts/wrenfield-data~amazon-keyword-research/run-sync-get-dataset-items": {
   "post": {
    "operationId": "amazon_keyword_research",
    "summary": "Amazon Keyword Research & Reverse ASIN - Helium 10 Alternative",
    "description": "Reverse ASIN lookup (every keyword a product ranks for, with Amazon search volume and rank), Amazon keyword ideas from a seed, and bulk Amazon search volume. Licensed data, no Amazon login or scraping. $1.50 per 1,000 keywords + $0.03 per lookup. Docs: https://wrenfielddata.com/tools/amazon-keyword-research/",
    "x-pricing": [
     {
      "event": "keyword-result",
      "title": "Keyword result",
      "usd": 0.0015,
      "primary": true
     },
     {
      "event": "data-request",
      "title": "Data request",
      "usd": 0.03,
      "primary": false
     }
    ],
    "x-openai-isConsequential": false,
    "parameters": [
     {
      "name": "maxTotalChargeUsd",
      "in": "query",
      "required": false,
      "schema": {
       "type": "number"
      },
      "description": "Spend cap for this call (USD)."
     },
     {
      "name": "timeout",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer"
      },
      "description": "Seconds to wait (max 300 for sync calls)."
     }
    ],
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "$ref": "#/components/schemas/AmazonKeywordResearchInput"
       }
      }
     }
    },
    "responses": {
     "201": {
      "description": "Result rows",
      "content": {
       "application/json": {
        "schema": {
         "type": "array",
         "items": {
          "$ref": "#/components/schemas/AmazonKeywordResearchRow"
         }
        }
       }
      }
     },
     "400": {
      "description": "Invalid input"
     },
     "401": {
      "description": "Missing or invalid token"
     },
     "408": {
      "description": "Run took longer than the sync limit; use the async /runs endpoint"
     }
    }
   }
  },
  "/acts/wrenfield-data~ats-jobs-api/run-sync-get-dataset-items": {
   "post": {
    "operationId": "ats_jobs_api",
    "summary": "Greenhouse Jobs Scraper: Lever, Ashby, Workday API",
    "description": "ATS Jobs API: Greenhouse, Lever, Ashby, Workday, Workable & SmartRecruiters jobs scraper. Enter company domains or careers URLs; ATS is auto-detected. One normalized schema with salary, remote flag & dates, filters and new-job monitoring. Docs: https://wrenfielddata.com/tools/ats-jobs-api/",
    "x-pricing": [
     {
      "event": "job-result",
      "title": "Job posting result",
      "usd": 0.0015,
      "primary": true
     },
     {
      "event": "actor-start",
      "title": "Actor start",
      "usd": 0.005,
      "primary": false
     }
    ],
    "x-openai-isConsequential": false,
    "parameters": [
     {
      "name": "maxTotalChargeUsd",
      "in": "query",
      "required": false,
      "schema": {
       "type": "number"
      },
      "description": "Spend cap for this call (USD)."
     },
     {
      "name": "timeout",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer"
      },
      "description": "Seconds to wait (max 300 for sync calls)."
     }
    ],
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "$ref": "#/components/schemas/AtsJobsApiInput"
       }
      }
     }
    },
    "responses": {
     "201": {
      "description": "Result rows",
      "content": {
       "application/json": {
        "schema": {
         "type": "array",
         "items": {
          "$ref": "#/components/schemas/AtsJobsApiRow"
         }
        }
       }
      }
     },
     "400": {
      "description": "Invalid input"
     },
     "401": {
      "description": "Missing or invalid token"
     },
     "408": {
      "description": "Run took longer than the sync limit; use the async /runs endpoint"
     }
    }
   }
  },
  "/acts/wrenfield-data~bulk-pagespeed-checker/run-sync-get-dataset-items": {
   "post": {
    "operationId": "bulk_pagespeed_checker",
    "summary": "Bulk PageSpeed & Core Web Vitals Checker",
    "description": "Run Google PageSpeed Insights on hundreds of URLs: performance, SEO, accessibility scores, lab metrics, real-user Core Web Vitals (LCP, INP, CLS from CrUX) with pass/fail, and the top fixes per page. Mobile and desktop. $5 per 1,000 tests, no Google key needed. Docs: https://wrenfielddata.com/tools/bulk-pagespeed-checker/",
    "x-pricing": [
     {
      "event": "pagespeed-test",
      "title": "PageSpeed test",
      "usd": 0.005,
      "primary": true
     },
     {
      "event": "lighthouse-test",
      "title": "Backup Lighthouse test",
      "usd": 0.015,
      "primary": false
     }
    ],
    "x-openai-isConsequential": false,
    "parameters": [
     {
      "name": "maxTotalChargeUsd",
      "in": "query",
      "required": false,
      "schema": {
       "type": "number"
      },
      "description": "Spend cap for this call (USD)."
     },
     {
      "name": "timeout",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer"
      },
      "description": "Seconds to wait (max 300 for sync calls)."
     }
    ],
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "$ref": "#/components/schemas/BulkPagespeedCheckerInput"
       }
      }
     }
    },
    "responses": {
     "201": {
      "description": "Result rows",
      "content": {
       "application/json": {
        "schema": {
         "type": "array",
         "items": {
          "$ref": "#/components/schemas/BulkPagespeedCheckerRow"
         }
        }
       }
      }
     },
     "400": {
      "description": "Invalid input"
     },
     "401": {
      "description": "Missing or invalid token"
     },
     "408": {
      "description": "Run took longer than the sync limit; use the async /runs endpoint"
     }
    }
   }
  },
  "/acts/wrenfield-data~businesses-without-websites/run-sync-get-dataset-items": {
   "post": {
    "operationId": "businesses_without_websites",
    "summary": "Businesses Without Websites - Google Maps Leads",
    "description": "Find local businesses on Google Maps that have no website, only a Facebook/Instagram page, or a broken, outdated or non-mobile site. Phone, address, rating, reviews and a 0-100 lead score per business. For web designers and agencies. $7 per 1,000 leads, no login, no proxies. Docs: https://wrenfielddata.com/tools/businesses-without-websites/",
    "x-pricing": [
     {
      "event": "lead",
      "title": "Lead",
      "usd": 0.007,
      "primary": true
     },
     {
      "event": "maps-search",
      "title": "Google Maps search",
      "usd": 0.005,
      "primary": false
     },
     {
      "event": "website-audit",
      "title": "Website audit",
      "usd": 0.003,
      "primary": false
     }
    ],
    "x-openai-isConsequential": false,
    "parameters": [
     {
      "name": "maxTotalChargeUsd",
      "in": "query",
      "required": false,
      "schema": {
       "type": "number"
      },
      "description": "Spend cap for this call (USD)."
     },
     {
      "name": "timeout",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer"
      },
      "description": "Seconds to wait (max 300 for sync calls)."
     }
    ],
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "$ref": "#/components/schemas/BusinessesWithoutWebsitesInput"
       }
      }
     }
    },
    "responses": {
     "201": {
      "description": "Result rows",
      "content": {
       "application/json": {
        "schema": {
         "type": "array",
         "items": {
          "$ref": "#/components/schemas/BusinessesWithoutWebsitesRow"
         }
        }
       }
      }
     },
     "400": {
      "description": "Invalid input"
     },
     "401": {
      "description": "Missing or invalid token"
     },
     "408": {
      "description": "Run took longer than the sync limit; use the async /runs endpoint"
     }
    }
   }
  },
  "/acts/wrenfield-data~company-name-to-domain/run-sync-get-dataset-items": {
   "post": {
    "operationId": "company_name_to_domain",
    "summary": "Company Name to Domain - Bulk Website Finder",
    "description": "Find the official website domain for any list of company names. Bulk name-to-domain lookup with a confidence score, verified live homepage, LinkedIn URL, logo, favicon and alternatives. Clearbit Name-to-Domain alternative. Pay only for resolved companies. Docs: https://wrenfielddata.com/tools/company-name-to-domain/",
    "x-pricing": [
     {
      "event": "company-result",
      "title": "Company resolved",
      "usd": 0.0015,
      "primary": true
     },
     {
      "event": "google-search",
      "title": "Google search",
      "usd": 0.003,
      "primary": false
     },
     {
      "event": "actor-start",
      "title": "Actor start",
      "usd": 0.0001,
      "primary": false
     }
    ],
    "x-openai-isConsequential": false,
    "parameters": [
     {
      "name": "maxTotalChargeUsd",
      "in": "query",
      "required": false,
      "schema": {
       "type": "number"
      },
      "description": "Spend cap for this call (USD)."
     },
     {
      "name": "timeout",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer"
      },
      "description": "Seconds to wait (max 300 for sync calls)."
     }
    ],
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "$ref": "#/components/schemas/CompanyNameToDomainInput"
       }
      }
     }
    },
    "responses": {
     "201": {
      "description": "Result rows",
      "content": {
       "application/json": {
        "schema": {
         "type": "array",
         "items": {
          "$ref": "#/components/schemas/CompanyNameToDomainRow"
         }
        }
       }
      }
     },
     "400": {
      "description": "Invalid input"
     },
     "401": {
      "description": "Missing or invalid token"
     },
     "408": {
      "description": "Run took longer than the sync limit; use the async /runs endpoint"
     }
    }
   }
  },
  "/acts/wrenfield-data~competitor-keywords/run-sync-get-dataset-items": {
   "post": {
    "operationId": "competitor_keywords",
    "summary": "Competitor Keywords - Ranked Keywords of Any Domain",
    "description": "See every Google keyword a competitor ranks for: position, URL, search volume, CPC, keyword difficulty, intent and estimated traffic for any domain or page, in 90+ countries. Bulk domains, sortable, filterable. No SEO suite subscription needed. Docs: https://wrenfielddata.com/tools/competitor-keywords/",
    "x-pricing": [
     {
      "event": "ranked-keyword",
      "title": "Ranked keyword",
      "usd": 0.002,
      "primary": true
     },
     {
      "event": "domain-lookup",
      "title": "Domain lookup",
      "usd": 0.03,
      "primary": false
     }
    ],
    "x-openai-isConsequential": false,
    "parameters": [
     {
      "name": "maxTotalChargeUsd",
      "in": "query",
      "required": false,
      "schema": {
       "type": "number"
      },
      "description": "Spend cap for this call (USD)."
     },
     {
      "name": "timeout",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer"
      },
      "description": "Seconds to wait (max 300 for sync calls)."
     }
    ],
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "$ref": "#/components/schemas/CompetitorKeywordsInput"
       }
      }
     }
    },
    "responses": {
     "201": {
      "description": "Result rows",
      "content": {
       "application/json": {
        "schema": {
         "type": "array",
         "items": {
          "$ref": "#/components/schemas/CompetitorKeywordsRow"
         }
        }
       }
      }
     },
     "400": {
      "description": "Invalid input"
     },
     "401": {
      "description": "Missing or invalid token"
     },
     "408": {
      "description": "Run took longer than the sync limit; use the async /runs endpoint"
     }
    }
   }
  },
  "/acts/wrenfield-data~domain-authority-traffic-checker/run-sync-get-dataset-items": {
   "post": {
    "operationId": "domain_authority_traffic_checker",
    "summary": "Domain Authority Checker: Backlinks, Website Traffic",
    "description": "Bulk domain authority, backlinks and organic traffic for thousands of domains. Licensed DataForSEO data (not Ahrefs/Semrush/Similarweb scraping). Flat rows + optional deep report. Docs: https://wrenfielddata.com/tools/domain-authority-traffic-checker/",
    "x-pricing": [
     {
      "event": "domain-result",
      "title": "Domain result",
      "usd": 0.005,
      "primary": true
     },
     {
      "event": "domain-report",
      "title": "Domain report",
      "usd": 0.2,
      "primary": false
     },
     {
      "event": "actor-start",
      "title": "Actor start",
      "usd": 0.001,
      "primary": false
     }
    ],
    "x-openai-isConsequential": false,
    "parameters": [
     {
      "name": "maxTotalChargeUsd",
      "in": "query",
      "required": false,
      "schema": {
       "type": "number"
      },
      "description": "Spend cap for this call (USD)."
     },
     {
      "name": "timeout",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer"
      },
      "description": "Seconds to wait (max 300 for sync calls)."
     }
    ],
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "$ref": "#/components/schemas/DomainAuthorityTrafficCheckerInput"
       }
      }
     }
    },
    "responses": {
     "201": {
      "description": "Result rows",
      "content": {
       "application/json": {
        "schema": {
         "type": "array",
         "items": {
          "$ref": "#/components/schemas/DomainAuthorityTrafficCheckerRow"
         }
        }
       }
      }
     },
     "400": {
      "description": "Invalid input"
     },
     "401": {
      "description": "Missing or invalid token"
     },
     "408": {
      "description": "Run took longer than the sync limit; use the async /runs endpoint"
     }
    }
   }
  },
  "/acts/wrenfield-data~google-ads-transparency-scraper/run-sync-get-dataset-items": {
   "post": {
    "operationId": "google_ads_transparency_scraper",
    "summary": "Google Ads Transparency Scraper - Competitor Ads",
    "description": "Scrape Google Ads Transparency Center creatives by advertiser name, AR ID, domain or URL: ad text (headline/description), images, YouTube videos, regions, impression ranges, platforms and first/last shown dates. Monitoring mode detects new and stopped ads. Fast HTTP, no browser. Docs: https://wrenfielddata.com/tools/google-ads-transparency-scraper/",
    "x-pricing": [
     {
      "event": "ad-result",
      "title": "Ad result",
      "usd": 0.0015,
      "primary": true
     },
     {
      "event": "actor-start",
      "title": "Actor start",
      "usd": 0.001,
      "primary": false
     }
    ],
    "x-openai-isConsequential": false,
    "parameters": [
     {
      "name": "maxTotalChargeUsd",
      "in": "query",
      "required": false,
      "schema": {
       "type": "number"
      },
      "description": "Spend cap for this call (USD)."
     },
     {
      "name": "timeout",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer"
      },
      "description": "Seconds to wait (max 300 for sync calls)."
     }
    ],
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "$ref": "#/components/schemas/GoogleAdsTransparencyScraperInput"
       }
      }
     }
    },
    "responses": {
     "201": {
      "description": "Result rows",
      "content": {
       "application/json": {
        "schema": {
         "type": "array",
         "items": {
          "$ref": "#/components/schemas/GoogleAdsTransparencyScraperRow"
         }
        }
       }
      }
     },
     "400": {
      "description": "Invalid input"
     },
     "401": {
      "description": "Missing or invalid token"
     },
     "408": {
      "description": "Run took longer than the sync limit; use the async /runs endpoint"
     }
    }
   }
  },
  "/acts/wrenfield-data~google-ai-overview-scraper/run-sync-get-dataset-items": {
   "post": {
    "operationId": "google_ai_overview_scraper",
    "summary": "Google AI Overview Scraper - Answers, Sources & Brand Tracking",
    "description": "Scrape Google AI Overviews for any query: full answer text and Markdown, every cited source, and whether your domain or brand is cited. Plus organic top 10, People Also Ask and related searches in the same row. Any country, language, city or device. $2.50 per 1,000 queries. Docs: https://wrenfielddata.com/tools/google-ai-overview-scraper/",
    "x-pricing": [
     {
      "event": "query-checked",
      "title": "Query checked",
      "usd": 0.0025,
      "primary": true
     },
     {
      "event": "query-checked-fast",
      "title": "Query checked (fast mode)",
      "usd": 0.006,
      "primary": false
     }
    ],
    "x-openai-isConsequential": false,
    "parameters": [
     {
      "name": "maxTotalChargeUsd",
      "in": "query",
      "required": false,
      "schema": {
       "type": "number"
      },
      "description": "Spend cap for this call (USD)."
     },
     {
      "name": "timeout",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer"
      },
      "description": "Seconds to wait (max 300 for sync calls)."
     }
    ],
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "$ref": "#/components/schemas/GoogleAiOverviewScraperInput"
       }
      }
     }
    },
    "responses": {
     "201": {
      "description": "Result rows",
      "content": {
       "application/json": {
        "schema": {
         "type": "array",
         "items": {
          "$ref": "#/components/schemas/GoogleAiOverviewScraperRow"
         }
        }
       }
      }
     },
     "400": {
      "description": "Invalid input"
     },
     "401": {
      "description": "Missing or invalid token"
     },
     "408": {
      "description": "Run took longer than the sync limit; use the async /runs endpoint"
     }
    }
   }
  },
  "/acts/wrenfield-data~google-autocomplete-keyword-expander/run-sync-get-dataset-items": {
   "post": {
    "operationId": "google_autocomplete_keyword_expander",
    "summary": "Google Autocomplete Keyword Expander - Long-Tail Ideas",
    "description": "Turn seed keywords into hundreds of long-tail keyword ideas from Google and YouTube autocomplete: A-Z, questions, prepositions and buyer modifiers, any country and language. Optional search volume, CPC and keyword difficulty. $1 per 1,000 keywords. Docs: https://wrenfielddata.com/tools/google-autocomplete-keyword-expander/",
    "x-pricing": [
     {
      "event": "keyword-suggestion",
      "title": "Keyword suggestion",
      "usd": 0.001,
      "primary": true
     },
     {
      "event": "keyword-metrics",
      "title": "Keyword metrics",
      "usd": 0.005,
      "primary": false
     },
     {
      "event": "metrics-batch",
      "title": "Metrics batch",
      "usd": 0.025,
      "primary": false
     }
    ],
    "x-openai-isConsequential": false,
    "parameters": [
     {
      "name": "maxTotalChargeUsd",
      "in": "query",
      "required": false,
      "schema": {
       "type": "number"
      },
      "description": "Spend cap for this call (USD)."
     },
     {
      "name": "timeout",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer"
      },
      "description": "Seconds to wait (max 300 for sync calls)."
     }
    ],
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "$ref": "#/components/schemas/GoogleAutocompleteKeywordExpanderInput"
       }
      }
     }
    },
    "responses": {
     "201": {
      "description": "Result rows",
      "content": {
       "application/json": {
        "schema": {
         "type": "array",
         "items": {
          "$ref": "#/components/schemas/GoogleAutocompleteKeywordExpanderRow"
         }
        }
       }
      }
     },
     "400": {
      "description": "Invalid input"
     },
     "401": {
      "description": "Missing or invalid token"
     },
     "408": {
      "description": "Run took longer than the sync limit; use the async /runs endpoint"
     }
    }
   }
  },
  "/acts/wrenfield-data~google-jobs-scraper/run-sync-get-dataset-items": {
   "post": {
    "operationId": "google_jobs_scraper",
    "summary": "Google Jobs Scraper - Job Listings & Salaries",
    "description": "Scrape Google Jobs (the jobs panel in Google Search) by keyword and location: title, company, location, salary (parsed), posted date, employment type, full description, highlights, and every apply link with board names. Deduplicated, 70+ countries. Docs: https://wrenfielddata.com/tools/google-jobs-scraper/",
    "x-pricing": [
     {
      "event": "job-result",
      "title": "Job result",
      "usd": 0.002,
      "primary": true
     },
     {
      "event": "actor-start",
      "title": "Actor start",
      "usd": 0.002,
      "primary": false
     }
    ],
    "x-openai-isConsequential": false,
    "parameters": [
     {
      "name": "maxTotalChargeUsd",
      "in": "query",
      "required": false,
      "schema": {
       "type": "number"
      },
      "description": "Spend cap for this call (USD)."
     },
     {
      "name": "timeout",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer"
      },
      "description": "Seconds to wait (max 300 for sync calls)."
     }
    ],
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "$ref": "#/components/schemas/GoogleJobsScraperInput"
       }
      }
     }
    },
    "responses": {
     "201": {
      "description": "Result rows",
      "content": {
       "application/json": {
        "schema": {
         "type": "array",
         "items": {
          "$ref": "#/components/schemas/GoogleJobsScraperRow"
         }
        }
       }
      }
     },
     "400": {
      "description": "Invalid input"
     },
     "401": {
      "description": "Missing or invalid token"
     },
     "408": {
      "description": "Run took longer than the sync limit; use the async /runs endpoint"
     }
    }
   }
  },
  "/acts/wrenfield-data~google-maps-grid-rank-tracker/run-sync-get-dataset-items": {
   "post": {
    "operationId": "google_maps_grid_rank_tracker",
    "summary": "Google Maps Geo-Grid Rank Tracker - Local Falcon Alternative",
    "description": "See where a business ranks on Google Maps across an N x N grid around it: rank per pin, average rank, share of local voice, top competitors per pin, a heatmap image and changes since the last run. $0.008 per grid point, a 7x7 scan costs $0.40. Docs: https://wrenfielddata.com/tools/google-maps-grid-rank-tracker/",
    "x-pricing": [
     {
      "event": "grid-point",
      "title": "Grid point",
      "usd": 0.008,
      "primary": true
     },
     {
      "event": "business-lookup",
      "title": "Business lookup",
      "usd": 0.005,
      "primary": false
     }
    ],
    "x-openai-isConsequential": false,
    "parameters": [
     {
      "name": "maxTotalChargeUsd",
      "in": "query",
      "required": false,
      "schema": {
       "type": "number"
      },
      "description": "Spend cap for this call (USD)."
     },
     {
      "name": "timeout",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer"
      },
      "description": "Seconds to wait (max 300 for sync calls)."
     }
    ],
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "$ref": "#/components/schemas/GoogleMapsGridRankTrackerInput"
       }
      }
     }
    },
    "responses": {
     "201": {
      "description": "Result rows",
      "content": {
       "application/json": {
        "schema": {
         "type": "array",
         "items": {
          "$ref": "#/components/schemas/GoogleMapsGridRankTrackerRow"
         }
        }
       }
      }
     },
     "400": {
      "description": "Invalid input"
     },
     "401": {
      "description": "Missing or invalid token"
     },
     "408": {
      "description": "Run took longer than the sync limit; use the async /runs endpoint"
     }
    }
   }
  },
  "/acts/wrenfield-data~google-shopping-price-comparison/run-sync-get-dataset-items": {
   "post": {
    "operationId": "google_shopping_price_comparison",
    "summary": "Google Shopping Scraper - Price Comparison & UPC",
    "description": "Compare Google Shopping prices by keyword, barcode (UPC/EAN/GTIN), product ID or URL. Every seller offer with price, shipping, total, condition and stock, plus min/max/typical price. Price monitoring flags price drops and new or removed sellers. 45 countries. Docs: https://wrenfielddata.com/tools/google-shopping-price-comparison/",
    "x-pricing": [
     {
      "event": "product-result",
      "title": "Product result",
      "usd": 0.002,
      "primary": true
     },
     {
      "event": "barcode-lookup",
      "title": "Barcode lookup",
      "usd": 0.012,
      "primary": false
     },
     {
      "event": "offer-result",
      "title": "Offer result",
      "usd": 0.0005,
      "primary": false
     },
     {
      "event": "product-details",
      "title": "Product details",
      "usd": 0.003,
      "primary": false
     },
     {
      "event": "actor-start",
      "title": "Actor start",
      "usd": 0.001,
      "primary": false
     }
    ],
    "x-openai-isConsequential": false,
    "parameters": [
     {
      "name": "maxTotalChargeUsd",
      "in": "query",
      "required": false,
      "schema": {
       "type": "number"
      },
      "description": "Spend cap for this call (USD)."
     },
     {
      "name": "timeout",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer"
      },
      "description": "Seconds to wait (max 300 for sync calls)."
     }
    ],
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "$ref": "#/components/schemas/GoogleShoppingPriceComparisonInput"
       }
      }
     }
    },
    "responses": {
     "201": {
      "description": "Result rows",
      "content": {
       "application/json": {
        "schema": {
         "type": "array",
         "items": {
          "$ref": "#/components/schemas/GoogleShoppingPriceComparisonRow"
         }
        }
       }
      }
     },
     "400": {
      "description": "Invalid input"
     },
     "401": {
      "description": "Missing or invalid token"
     },
     "408": {
      "description": "Run took longer than the sync limit; use the async /runs endpoint"
     }
    }
   }
  },
  "/acts/wrenfield-data~google-trends-scraper/run-sync-get-dataset-items": {
   "post": {
    "operationId": "google_trends_scraper",
    "summary": "Google Trends Scraper & API - Bulk, Trending Now",
    "description": "Reliable Google Trends API: interest over time, interest by region/city, related queries and topics (top + rising), and Trending Now by country. Compare up to 5 terms, batch hundreds, any geo, time range, category or YouTube/News/Shopping. Auto-retries with fresh sessions. Docs: https://wrenfielddata.com/tools/google-trends-scraper/",
    "x-pricing": [
     {
      "event": "term-result",
      "title": "Search term analysed",
      "usd": 0.003,
      "primary": true
     },
     {
      "event": "trending-search",
      "title": "Trending search",
      "usd": 0.0005,
      "primary": false
     }
    ],
    "x-openai-isConsequential": false,
    "parameters": [
     {
      "name": "maxTotalChargeUsd",
      "in": "query",
      "required": false,
      "schema": {
       "type": "number"
      },
      "description": "Spend cap for this call (USD)."
     },
     {
      "name": "timeout",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer"
      },
      "description": "Seconds to wait (max 300 for sync calls)."
     }
    ],
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "$ref": "#/components/schemas/GoogleTrendsScraperInput"
       }
      }
     }
    },
    "responses": {
     "201": {
      "description": "Result rows",
      "content": {
       "application/json": {
        "schema": {
         "type": "array",
         "items": {
          "$ref": "#/components/schemas/GoogleTrendsScraperRow"
         }
        }
       }
      }
     },
     "400": {
      "description": "Invalid input"
     },
     "401": {
      "description": "Missing or invalid token"
     },
     "408": {
      "description": "Run took longer than the sync limit; use the async /runs endpoint"
     }
    }
   }
  },
  "/acts/wrenfield-data~home-depot-lowes-scraper/run-sync-get-dataset-items": {
   "post": {
    "operationId": "home_depot_lowes_scraper",
    "summary": "Home Depot & Lowe's Scraper - Price & Store Stock",
    "description": "Scrape Home Depot and Lowe's products by keyword, category URL, product URL or item ID: price, was-price, UPC, model, SKU, local store price, in-store stock quantity, aisle/bay, pickup/delivery, specs, images, ratings and optional reviews. Docs: https://wrenfielddata.com/tools/home-depot-lowes-scraper/",
    "x-pricing": [
     {
      "event": "product-result",
      "title": "Product with details",
      "usd": 0.004,
      "primary": true
     },
     {
      "event": "listing-result",
      "title": "Listing-only product",
      "usd": 0.002,
      "primary": false
     },
     {
      "event": "review-result",
      "title": "Customer review",
      "usd": 0.0005,
      "primary": false
     },
     {
      "event": "actor-start",
      "title": "Actor start",
      "usd": 0.005,
      "primary": false
     }
    ],
    "x-openai-isConsequential": false,
    "parameters": [
     {
      "name": "maxTotalChargeUsd",
      "in": "query",
      "required": false,
      "schema": {
       "type": "number"
      },
      "description": "Spend cap for this call (USD)."
     },
     {
      "name": "timeout",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer"
      },
      "description": "Seconds to wait (max 300 for sync calls)."
     }
    ],
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "$ref": "#/components/schemas/HomeDepotLowesScraperInput"
       }
      }
     }
    },
    "responses": {
     "201": {
      "description": "Result rows",
      "content": {
       "application/json": {
        "schema": {
         "type": "array",
         "items": {
          "$ref": "#/components/schemas/HomeDepotLowesScraperRow"
         }
        }
       }
      }
     },
     "400": {
      "description": "Invalid input"
     },
     "401": {
      "description": "Missing or invalid token"
     },
     "408": {
      "description": "Run took longer than the sync limit; use the async /runs endpoint"
     }
    }
   }
  },
  "/acts/wrenfield-data~keyword-difficulty-checker/run-sync-get-dataset-items": {
   "post": {
    "operationId": "keyword_difficulty_checker",
    "summary": "Bulk Keyword Difficulty Checker - KD & Search Intent",
    "description": "Check SEO keyword difficulty (KD 0-100) and search intent for thousands of keywords at once, in 90+ countries and languages. Find easy keywords to rank for. Up to 1,000 keywords per request, $5 per 1,000 keywords. Docs: https://wrenfielddata.com/tools/keyword-difficulty-checker/",
    "x-pricing": [
     {
      "event": "keyword-difficulty",
      "title": "Keyword difficulty",
      "usd": 0.005,
      "primary": true
     },
     {
      "event": "search-intent",
      "title": "Search intent",
      "usd": 0.0015,
      "primary": false
     },
     {
      "event": "keyword-batch",
      "title": "Keyword batch",
      "usd": 0.025,
      "primary": false
     }
    ],
    "x-openai-isConsequential": false,
    "parameters": [
     {
      "name": "maxTotalChargeUsd",
      "in": "query",
      "required": false,
      "schema": {
       "type": "number"
      },
      "description": "Spend cap for this call (USD)."
     },
     {
      "name": "timeout",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer"
      },
      "description": "Seconds to wait (max 300 for sync calls)."
     }
    ],
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "$ref": "#/components/schemas/KeywordDifficultyCheckerInput"
       }
      }
     }
    },
    "responses": {
     "201": {
      "description": "Result rows",
      "content": {
       "application/json": {
        "schema": {
         "type": "array",
         "items": {
          "$ref": "#/components/schemas/KeywordDifficultyCheckerRow"
         }
        }
       }
      }
     },
     "400": {
      "description": "Invalid input"
     },
     "401": {
      "description": "Missing or invalid token"
     },
     "408": {
      "description": "Run took longer than the sync limit; use the async /runs endpoint"
     }
    }
   }
  },
  "/acts/wrenfield-data~keyword-gap-report/run-sync-get-dataset-items": {
   "post": {
    "operationId": "keyword_gap_report",
    "summary": "Keyword Gap & Opportunity Report - Competitor Keyword Gap",
    "description": "Keywords up to 3 competitors rank for on Google and your client's domain doesn't: volume, difficulty, intent, competing URLs and why each was picked. Top 20 re-checked on the live Google top 10. CSV-ready dataset + HTML report. One flat price per report. Docs: https://wrenfielddata.com/tools/keyword-gap-report/",
    "x-pricing": [
     {
      "event": "gap-report",
      "title": "Keyword gap report",
      "usd": 9,
      "primary": true
     }
    ],
    "x-openai-isConsequential": false,
    "parameters": [
     {
      "name": "maxTotalChargeUsd",
      "in": "query",
      "required": false,
      "schema": {
       "type": "number"
      },
      "description": "Spend cap for this call (USD)."
     },
     {
      "name": "timeout",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer"
      },
      "description": "Seconds to wait (max 300 for sync calls)."
     }
    ],
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "$ref": "#/components/schemas/KeywordGapReportInput"
       }
      }
     }
    },
    "responses": {
     "201": {
      "description": "Result rows",
      "content": {
       "application/json": {
        "schema": {
         "type": "array",
         "items": {
          "$ref": "#/components/schemas/KeywordGapReportRow"
         }
        }
       }
      }
     },
     "400": {
      "description": "Invalid input"
     },
     "401": {
      "description": "Missing or invalid token"
     },
     "408": {
      "description": "Run took longer than the sync limit; use the async /runs endpoint"
     }
    }
   }
  },
  "/acts/wrenfield-data~keyword-research-tool/run-sync-get-dataset-items": {
   "post": {
    "operationId": "keyword_research_tool",
    "summary": "Keyword Research Tool - Ideas, Volume, KD, Intent & SERP",
    "description": "Keyword ideas from any seed with search volume, CPC, keyword difficulty (KD), search intent and SERP features in one row. Ahrefs Keywords Explorer & Semrush Keyword Magic alternative. 90+ countries, up to 10,000 keywords per run, $3 per 1,000 keywords. Docs: https://wrenfielddata.com/tools/keyword-research-tool/",
    "x-pricing": [
     {
      "event": "keyword-result",
      "title": "Keyword result",
      "usd": 0.003,
      "primary": true
     },
     {
      "event": "research-request",
      "title": "Research request",
      "usd": 0.025,
      "primary": false
     }
    ],
    "x-openai-isConsequential": false,
    "parameters": [
     {
      "name": "maxTotalChargeUsd",
      "in": "query",
      "required": false,
      "schema": {
       "type": "number"
      },
      "description": "Spend cap for this call (USD)."
     },
     {
      "name": "timeout",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer"
      },
      "description": "Seconds to wait (max 300 for sync calls)."
     }
    ],
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "$ref": "#/components/schemas/KeywordResearchToolInput"
       }
      }
     }
    },
    "responses": {
     "201": {
      "description": "Result rows",
      "content": {
       "application/json": {
        "schema": {
         "type": "array",
         "items": {
          "$ref": "#/components/schemas/KeywordResearchToolRow"
         }
        }
       }
      }
     },
     "400": {
      "description": "Invalid input"
     },
     "401": {
      "description": "Missing or invalid token"
     },
     "408": {
      "description": "Run took longer than the sync limit; use the async /runs endpoint"
     }
    }
   }
  },
  "/acts/wrenfield-data~keyword-search-volume/run-sync-get-dataset-items": {
   "post": {
    "operationId": "keyword_search_volume",
    "summary": "Keyword Search Volume - Google Keyword Planner, No Ads Account",
    "description": "Bulk keyword search volume checker and search volume API with real Google Keyword Planner data: monthly searches, CPC, competition, 12-month trends and keyword ideas for any country, city or language. No Google Ads account. $4 per 1,000 keywords; keywords with no data are free. Docs: https://wrenfielddata.com/tools/keyword-search-volume/",
    "x-pricing": [
     {
      "event": "keyword-result",
      "title": "Keyword result",
      "usd": 0.004,
      "primary": true
     },
     {
      "event": "google-ads-live-request",
      "title": "Google Ads live request",
      "usd": 0.25,
      "primary": false
     },
     {
      "event": "google-ads-queued-request",
      "title": "Google Ads queued request",
      "usd": 0.15,
      "primary": false
     }
    ],
    "x-openai-isConsequential": false,
    "parameters": [
     {
      "name": "maxTotalChargeUsd",
      "in": "query",
      "required": false,
      "schema": {
       "type": "number"
      },
      "description": "Spend cap for this call (USD)."
     },
     {
      "name": "timeout",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer"
      },
      "description": "Seconds to wait (max 300 for sync calls)."
     }
    ],
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "$ref": "#/components/schemas/KeywordSearchVolumeInput"
       }
      }
     }
    },
    "responses": {
     "201": {
      "description": "Result rows",
      "content": {
       "application/json": {
        "schema": {
         "type": "array",
         "items": {
          "$ref": "#/components/schemas/KeywordSearchVolumeRow"
         }
        }
       }
      }
     },
     "400": {
      "description": "Invalid input"
     },
     "401": {
      "description": "Missing or invalid token"
     },
     "408": {
      "description": "Run took longer than the sync limit; use the async /runs endpoint"
     }
    }
   }
  },
  "/acts/wrenfield-data~people-also-ask-scraper/run-sync-get-dataset-items": {
   "post": {
    "operationId": "people_also_ask_scraper",
    "summary": "People Also Ask Scraper - Google PAA & AI Overviews",
    "description": "Get Google People Also Ask questions (up to 4 levels deep), related searches and optional AI Overview text for any keyword, country, city and language. Content ideas, FAQ schema and AEO research in bulk. No proxies or browser needed. Docs: https://wrenfielddata.com/tools/people-also-ask-scraper/",
    "x-pricing": [
     {
      "event": "keyword-search",
      "title": "Keyword search",
      "usd": 0.0055,
      "primary": true
     },
     {
      "event": "paa-question",
      "title": "People Also Ask question",
      "usd": 0.0006,
      "primary": false
     },
     {
      "event": "ai-overview-check",
      "title": "AI Overview check",
      "usd": 0.005,
      "primary": false
     }
    ],
    "x-openai-isConsequential": false,
    "parameters": [
     {
      "name": "maxTotalChargeUsd",
      "in": "query",
      "required": false,
      "schema": {
       "type": "number"
      },
      "description": "Spend cap for this call (USD)."
     },
     {
      "name": "timeout",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer"
      },
      "description": "Seconds to wait (max 300 for sync calls)."
     }
    ],
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "$ref": "#/components/schemas/PeopleAlsoAskScraperInput"
       }
      }
     }
    },
    "responses": {
     "201": {
      "description": "Result rows",
      "content": {
       "application/json": {
        "schema": {
         "type": "array",
         "items": {
          "$ref": "#/components/schemas/PeopleAlsoAskScraperRow"
         }
        }
       }
      }
     },
     "400": {
      "description": "Invalid input"
     },
     "401": {
      "description": "Missing or invalid token"
     },
     "408": {
      "description": "Run took longer than the sync limit; use the async /runs endpoint"
     }
    }
   }
  },
  "/acts/wrenfield-data~sec-form-d-scraper/run-sync-get-dataset-items": {
   "post": {
    "operationId": "sec_form_d_scraper",
    "summary": "Form D Scraper - SEC EDGAR Startup Funding Leads",
    "description": "Find startups and private companies that just raised money, from official SEC EDGAR Form D filings. Filter by date, state, industry, amount, exemption and keyword. Get issuer, address, phone, executives & directors, amount raised, investors, 506(b)/(c) and first-time-raise flag. Docs: https://wrenfielddata.com/tools/sec-form-d-scraper/",
    "x-pricing": [
     {
      "event": "filing-result",
      "title": "Filing result",
      "usd": 0.003,
      "primary": true
     },
     {
      "event": "actor-start",
      "title": "Actor start",
      "usd": 5e-05,
      "primary": false
     }
    ],
    "x-openai-isConsequential": false,
    "parameters": [
     {
      "name": "maxTotalChargeUsd",
      "in": "query",
      "required": false,
      "schema": {
       "type": "number"
      },
      "description": "Spend cap for this call (USD)."
     },
     {
      "name": "timeout",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer"
      },
      "description": "Seconds to wait (max 300 for sync calls)."
     }
    ],
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "$ref": "#/components/schemas/SecFormDScraperInput"
       }
      }
     }
    },
    "responses": {
     "201": {
      "description": "Result rows",
      "content": {
       "application/json": {
        "schema": {
         "type": "array",
         "items": {
          "$ref": "#/components/schemas/SecFormDScraperRow"
         }
        }
       }
      }
     },
     "400": {
      "description": "Invalid input"
     },
     "401": {
      "description": "Missing or invalid token"
     },
     "408": {
      "description": "Run took longer than the sync limit; use the async /runs endpoint"
     }
    }
   }
  },
  "/acts/wrenfield-data~seo-agency-report/run-sync-get-dataset-items": {
   "post": {
    "operationId": "seo_agency_report",
    "summary": "SEO Agency Report - White-Label SEO & AI Visibility Audit",
    "description": "One domain in, one client-ready SEO report out: rankings, top 100 keywords, quick wins, competitors, domain authority, backlinks, live SERPs, PageSpeed and ChatGPT / Google AI Mode visibility. White-label HTML + PDF and JSON. $2.49 per report. Docs: https://wrenfielddata.com/tools/seo-agency-report/",
    "x-pricing": [
     {
      "event": "report",
      "title": "SEO report",
      "usd": 2.49,
      "primary": true
     }
    ],
    "x-openai-isConsequential": false,
    "parameters": [
     {
      "name": "maxTotalChargeUsd",
      "in": "query",
      "required": false,
      "schema": {
       "type": "number"
      },
      "description": "Spend cap for this call (USD)."
     },
     {
      "name": "timeout",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer"
      },
      "description": "Seconds to wait (max 300 for sync calls)."
     }
    ],
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "$ref": "#/components/schemas/SeoAgencyReportInput"
       }
      }
     }
    },
    "responses": {
     "201": {
      "description": "Result rows",
      "content": {
       "application/json": {
        "schema": {
         "type": "array",
         "items": {
          "$ref": "#/components/schemas/SeoAgencyReportRow"
         }
        }
       }
      }
     },
     "400": {
      "description": "Invalid input"
     },
     "401": {
      "description": "Missing or invalid token"
     },
     "408": {
      "description": "Run took longer than the sync limit; use the async /runs endpoint"
     }
    }
   }
  },
  "/acts/wrenfield-data~seo-toolkit/run-sync-get-dataset-items": {
   "post": {
    "operationId": "seo_toolkit",
    "summary": "SEO Toolkit All-in-One - Ahrefs & Semrush Alternative",
    "description": "Domain overview, ranked keywords, competitors, top pages, backlinks, referring domains, keyword metrics and live Google SERPs in one Actor. Licensed DataForSEO data, no scraping of Ahrefs or Semrush, no subscription. One \"tool\" parameter makes it a perfect MCP tool for AI agents. Docs: https://wrenfielddata.com/tools/seo-toolkit/",
    "x-pricing": [
     {
      "event": "result-row",
      "title": "Result row",
      "usd": 0.003,
      "primary": true
     },
     {
      "event": "data-request",
      "title": "SEO data request",
      "usd": 0.03,
      "primary": false
     },
     {
      "event": "backlinks-request",
      "title": "Backlinks request",
      "usd": 0.06,
      "primary": false
     },
     {
      "event": "serp-request",
      "title": "SERP request",
      "usd": 0.005,
      "primary": false
     }
    ],
    "x-openai-isConsequential": false,
    "parameters": [
     {
      "name": "maxTotalChargeUsd",
      "in": "query",
      "required": false,
      "schema": {
       "type": "number"
      },
      "description": "Spend cap for this call (USD)."
     },
     {
      "name": "timeout",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer"
      },
      "description": "Seconds to wait (max 300 for sync calls)."
     }
    ],
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "$ref": "#/components/schemas/SeoToolkitInput"
       }
      }
     }
    },
    "responses": {
     "201": {
      "description": "Result rows",
      "content": {
       "application/json": {
        "schema": {
         "type": "array",
         "items": {
          "$ref": "#/components/schemas/SeoToolkitRow"
         }
        }
       }
      }
     },
     "400": {
      "description": "Invalid input"
     },
     "401": {
      "description": "Missing or invalid token"
     },
     "408": {
      "description": "Run took longer than the sync limit; use the async /runs endpoint"
     }
    }
   }
  },
  "/acts/wrenfield-data~shopify-store-scraper/run-sync-get-dataset-items": {
   "post": {
    "operationId": "shopify_store_scraper",
    "summary": "Shopify Scraper - Products & Price Monitor",
    "description": "Scrape any Shopify store's products (prices, compare-at and discount %, variants, SKUs, stock, images, tags, dates) from its public JSON feed. Monitor mode compares with the previous run and returns only new, removed, price-changed and stock-changed products. Docs: https://wrenfielddata.com/tools/shopify-store-scraper/",
    "x-pricing": [
     {
      "event": "product-result",
      "title": "Product result",
      "usd": 0.001,
      "primary": true
     },
     {
      "event": "change-result",
      "title": "Change result",
      "usd": 0.003,
      "primary": false
     },
     {
      "event": "actor-start",
      "title": "Actor start",
      "usd": 0.002,
      "primary": false
     }
    ],
    "x-openai-isConsequential": false,
    "parameters": [
     {
      "name": "maxTotalChargeUsd",
      "in": "query",
      "required": false,
      "schema": {
       "type": "number"
      },
      "description": "Spend cap for this call (USD)."
     },
     {
      "name": "timeout",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer"
      },
      "description": "Seconds to wait (max 300 for sync calls)."
     }
    ],
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "$ref": "#/components/schemas/ShopifyStoreScraperInput"
       }
      }
     }
    },
    "responses": {
     "201": {
      "description": "Result rows",
      "content": {
       "application/json": {
        "schema": {
         "type": "array",
         "items": {
          "$ref": "#/components/schemas/ShopifyStoreScraperRow"
         }
        }
       }
      }
     },
     "400": {
      "description": "Invalid input"
     },
     "401": {
      "description": "Missing or invalid token"
     },
     "408": {
      "description": "Run took longer than the sync limit; use the async /runs endpoint"
     }
    }
   }
  },
  "/acts/wrenfield-data~telegram-channel-scraper/run-sync-get-dataset-items": {
   "post": {
    "operationId": "telegram_channel_scraper",
    "summary": "Telegram Channel Scraper - Posts, Views, No Login",
    "description": "Scrape public Telegram channels without login, phone number or API keys. Get posts with text and HTML, date, views, reactions, forwards, replies, photos, video thumbnails, files and link previews, plus channel info with exact subscriber counts. Date range, keyword filter and deep history. Docs: https://wrenfielddata.com/tools/telegram-channel-scraper/",
    "x-pricing": [
     {
      "event": "post-result",
      "title": "Post result",
      "usd": 0.001,
      "primary": true
     },
     {
      "event": "channel-result",
      "title": "Channel info",
      "usd": 0.002,
      "primary": false
     }
    ],
    "x-openai-isConsequential": false,
    "parameters": [
     {
      "name": "maxTotalChargeUsd",
      "in": "query",
      "required": false,
      "schema": {
       "type": "number"
      },
      "description": "Spend cap for this call (USD)."
     },
     {
      "name": "timeout",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer"
      },
      "description": "Seconds to wait (max 300 for sync calls)."
     }
    ],
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "$ref": "#/components/schemas/TelegramChannelScraperInput"
       }
      }
     }
    },
    "responses": {
     "201": {
      "description": "Result rows",
      "content": {
       "application/json": {
        "schema": {
         "type": "array",
         "items": {
          "$ref": "#/components/schemas/TelegramChannelScraperRow"
         }
        }
       }
      }
     },
     "400": {
      "description": "Invalid input"
     },
     "401": {
      "description": "Missing or invalid token"
     },
     "408": {
      "description": "Run took longer than the sync limit; use the async /runs endpoint"
     }
    }
   }
  },
  "/acts/wrenfield-data~tripadvisor-reviews-scraper/run-sync-get-dataset-items": {
   "post": {
    "operationId": "tripadvisor_reviews_scraper",
    "summary": "Tripadvisor Reviews Scraper - Hotels & Restaurants",
    "description": "Get Tripadvisor reviews for any hotel, restaurant or attraction: text, star rating, date, trip date, sub-ratings, photos, owner responses and reviewer info. Paste URLs or search \"hotels in Lisbon\". Filter by stars, traveler type, month, language or date. No blocking, no proxies. Docs: https://wrenfielddata.com/tools/tripadvisor-reviews-scraper/",
    "x-pricing": [
     {
      "event": "review",
      "title": "Review",
      "usd": 0.001,
      "primary": true
     },
     {
      "event": "place",
      "title": "Place summary",
      "usd": 0.003,
      "primary": false
     },
     {
      "event": "actor-start",
      "title": "Actor start",
      "usd": 5e-05,
      "primary": false
     }
    ],
    "x-openai-isConsequential": false,
    "parameters": [
     {
      "name": "maxTotalChargeUsd",
      "in": "query",
      "required": false,
      "schema": {
       "type": "number"
      },
      "description": "Spend cap for this call (USD)."
     },
     {
      "name": "timeout",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer"
      },
      "description": "Seconds to wait (max 300 for sync calls)."
     }
    ],
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "$ref": "#/components/schemas/TripadvisorReviewsScraperInput"
       }
      }
     }
    },
    "responses": {
     "201": {
      "description": "Result rows",
      "content": {
       "application/json": {
        "schema": {
         "type": "array",
         "items": {
          "$ref": "#/components/schemas/TripadvisorReviewsScraperRow"
         }
        }
       }
      }
     },
     "400": {
      "description": "Invalid input"
     },
     "401": {
      "description": "Missing or invalid token"
     },
     "408": {
      "description": "Run took longer than the sync limit; use the async /runs endpoint"
     }
    }
   }
  },
  "/acts/wrenfield-data~walmart-product-scraper/run-sync-get-dataset-items": {
   "post": {
    "operationId": "walmart_product_scraper",
    "summary": "Walmart Scraper - Product Prices, Stock & Reviews",
    "description": "Scrape Walmart.com products by keyword, category URL, product URL or item ID: price, was-price, unit price, stock, pickup/delivery, seller (Walmart vs marketplace), UPC/GTIN, variants, specs, images, ratings and optional reviews. Fast HTTP, no browser, auto-retries blocked requests. Docs: https://wrenfielddata.com/tools/walmart-product-scraper/",
    "x-pricing": [
     {
      "event": "product-result",
      "title": "Product with full details",
      "usd": 0.0035,
      "primary": true
     },
     {
      "event": "listing-result",
      "title": "Listing-only product",
      "usd": 0.0012,
      "primary": false
     },
     {
      "event": "review-result",
      "title": "Review",
      "usd": 0.0004,
      "primary": false
     },
     {
      "event": "actor-start",
      "title": "Actor start",
      "usd": 0.002,
      "primary": false
     }
    ],
    "x-openai-isConsequential": false,
    "parameters": [
     {
      "name": "maxTotalChargeUsd",
      "in": "query",
      "required": false,
      "schema": {
       "type": "number"
      },
      "description": "Spend cap for this call (USD)."
     },
     {
      "name": "timeout",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer"
      },
      "description": "Seconds to wait (max 300 for sync calls)."
     }
    ],
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "$ref": "#/components/schemas/WalmartProductScraperInput"
       }
      }
     }
    },
    "responses": {
     "201": {
      "description": "Result rows",
      "content": {
       "application/json": {
        "schema": {
         "type": "array",
         "items": {
          "$ref": "#/components/schemas/WalmartProductScraperRow"
         }
        }
       }
      }
     },
     "400": {
      "description": "Invalid input"
     },
     "401": {
      "description": "Missing or invalid token"
     },
     "408": {
      "description": "Run took longer than the sync limit; use the async /runs endpoint"
     }
    }
   }
  },
  "/acts/wrenfield-data~website-contact-scraper/run-sync-get-dataset-items": {
   "post": {
    "operationId": "website_contact_scraper",
    "summary": "Contact Scraper - Website Emails, Phones & Socials",
    "description": "Extract emails, phone numbers and social media profiles (LinkedIn, Facebook, Instagram, X, YouTube, TikTok...) from any list of company websites or domains. One clean row per website, contact-page aware, email provider (MX) detection. Pay only for websites with contacts. Docs: https://wrenfielddata.com/tools/website-contact-scraper/",
    "x-pricing": [
     {
      "event": "website-contacts",
      "title": "Website with contacts",
      "usd": 0.004,
      "primary": true
     }
    ],
    "x-openai-isConsequential": false,
    "parameters": [
     {
      "name": "maxTotalChargeUsd",
      "in": "query",
      "required": false,
      "schema": {
       "type": "number"
      },
      "description": "Spend cap for this call (USD)."
     },
     {
      "name": "timeout",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer"
      },
      "description": "Seconds to wait (max 300 for sync calls)."
     }
    ],
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "$ref": "#/components/schemas/WebsiteContactScraperInput"
       }
      }
     }
    },
    "responses": {
     "201": {
      "description": "Result rows",
      "content": {
       "application/json": {
        "schema": {
         "type": "array",
         "items": {
          "$ref": "#/components/schemas/WebsiteContactScraperRow"
         }
        }
       }
      }
     },
     "400": {
      "description": "Invalid input"
     },
     "401": {
      "description": "Missing or invalid token"
     },
     "408": {
      "description": "Run took longer than the sync limit; use the async /runs endpoint"
     }
    }
   }
  },
  "/acts/wrenfield-data~website-tech-stack-detector/run-sync-get-dataset-items": {
   "post": {
    "operationId": "website_tech_stack_detector",
    "summary": "Tech Stack Detector like Wappalyzer & BuiltWith",
    "description": "Detect the technologies behind any list of websites: CMS, ecommerce platform, analytics, ad pixels, marketing tools, payment, CDN, hosting, frameworks and 7,600+ more, plus email provider and SPF senders from DNS. One clean row per website. Pay only for websites analysed. Docs: https://wrenfielddata.com/tools/website-tech-stack-detector/",
    "x-pricing": [
     {
      "event": "website-analyzed",
      "title": "Website analyzed",
      "usd": 0.0025,
      "primary": true
     },
     {
      "event": "actor-start",
      "title": "Actor start",
      "usd": 5e-05,
      "primary": false
     }
    ],
    "x-openai-isConsequential": false,
    "parameters": [
     {
      "name": "maxTotalChargeUsd",
      "in": "query",
      "required": false,
      "schema": {
       "type": "number"
      },
      "description": "Spend cap for this call (USD)."
     },
     {
      "name": "timeout",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer"
      },
      "description": "Seconds to wait (max 300 for sync calls)."
     }
    ],
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "$ref": "#/components/schemas/WebsiteTechStackDetectorInput"
       }
      }
     }
    },
    "responses": {
     "201": {
      "description": "Result rows",
      "content": {
       "application/json": {
        "schema": {
         "type": "array",
         "items": {
          "$ref": "#/components/schemas/WebsiteTechStackDetectorRow"
         }
        }
       }
      }
     },
     "400": {
      "description": "Invalid input"
     },
     "401": {
      "description": "Missing or invalid token"
     },
     "408": {
      "description": "Run took longer than the sync limit; use the async /runs endpoint"
     }
    }
   }
  },
  "/acts/wrenfield-data~youtube-transcript-scraper/run-sync-get-dataset-items": {
   "post": {
    "operationId": "youtube_transcript_scraper",
    "summary": "YouTube Transcript Scraper - Subtitles & Captions",
    "description": "Get YouTube transcripts (captions/subtitles) in bulk for videos, Shorts, channels, playlists or search results. Plain text, timestamped segments, SRT, VTT or RAG-ready chunks, with language fallback and video metadata. No browser, no API key. Pay only for transcripts found. Docs: https://wrenfielddata.com/tools/youtube-transcript-scraper/",
    "x-pricing": [
     {
      "event": "transcript-result",
      "title": "Transcript result",
      "usd": 0.003,
      "primary": true
     }
    ],
    "x-openai-isConsequential": false,
    "parameters": [
     {
      "name": "maxTotalChargeUsd",
      "in": "query",
      "required": false,
      "schema": {
       "type": "number"
      },
      "description": "Spend cap for this call (USD)."
     },
     {
      "name": "timeout",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer"
      },
      "description": "Seconds to wait (max 300 for sync calls)."
     }
    ],
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "$ref": "#/components/schemas/YoutubeTranscriptScraperInput"
       }
      }
     }
    },
    "responses": {
     "201": {
      "description": "Result rows",
      "content": {
       "application/json": {
        "schema": {
         "type": "array",
         "items": {
          "$ref": "#/components/schemas/YoutubeTranscriptScraperRow"
         }
        }
       }
      }
     },
     "400": {
      "description": "Invalid input"
     },
     "401": {
      "description": "Missing or invalid token"
     },
     "408": {
      "description": "Run took longer than the sync limit; use the async /runs endpoint"
     }
    }
   }
  }
 }
}