{
  "service": "hasdata",
  "displayName": "HasData",
  "categories": [
    "Data",
    "Developer Tools"
  ],
  "authTypes": [
    "api_key"
  ],
  "auth": [
    {
      "type": "api_key",
      "label": "API Key",
      "placeholder": "HASDATA_API_KEY",
      "description": "HasData API key sent with the x-api-key header. Sign in at https://app.hasdata.com/sign-in, open account settings, and copy your API key."
    }
  ],
  "homepageUrl": "https://hasdata.com",
  "actions": [
    {
      "id": "hasdata.scrape_web",
      "service": "hasdata",
      "name": "scrape_web",
      "description": "Scrape one public web page through HasData's synchronous Web Scraping API and return the official JSON payload.",
      "requiredScopes": [],
      "providerPermissions": [],
      "inputSchema": {
        "type": "object",
        "properties": {
          "url": {
            "type": "string",
            "minLength": 1,
            "maxLength": 2083,
            "description": "The absolute public URL HasData should scrape.",
            "format": "uri"
          },
          "outputFormat": {
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "html",
                "text",
                "markdown",
                "json"
              ],
              "description": "One HasData Web Scraping API output format."
            },
            "description": "Response formats HasData should include in the result.",
            "minItems": 1
          },
          "proxyType": {
            "type": "string",
            "enum": [
              "datacenter",
              "residential"
            ],
            "description": "The proxy type HasData should use for the target page."
          },
          "proxyCountry": {
            "type": "string",
            "description": "The ISO 3166-1 alpha-2 country code used for HasData proxy geolocation.",
            "pattern": "^[A-Za-z]{2}$"
          },
          "extractRules": {
            "type": "object",
            "additionalProperties": {
              "type": "string",
              "description": "One field extraction selector."
            },
            "description": "String values keyed by caller-defined field names."
          },
          "aiExtractRules": {
            "type": "object",
            "properties": {},
            "additionalProperties": true,
            "description": "Structured AI extraction rules accepted by HasData."
          },
          "screenshot": {
            "type": "boolean",
            "description": "Whether HasData should capture a page screenshot."
          },
          "extractEmails": {
            "type": "boolean",
            "description": "Whether HasData should extract email addresses from the page."
          },
          "extractLinks": {
            "type": "boolean",
            "description": "Whether HasData should extract hyperlinks from the page."
          },
          "wait": {
            "type": "integer",
            "minimum": 0,
            "maximum": 30000,
            "description": "Delay in milliseconds after page load before HasData scrapes the page."
          },
          "waitFor": {
            "type": "string",
            "minLength": 1,
            "description": "CSS selector HasData should wait for before scraping."
          },
          "blockResources": {
            "type": "boolean",
            "description": "Whether HasData should block images and stylesheets while loading the page."
          },
          "blockAds": {
            "type": "boolean",
            "description": "Whether HasData should block common ad scripts and tracking pixels."
          },
          "blockUrls": {
            "type": "array",
            "items": {
              "type": "string",
              "minLength": 1
            },
            "description": "Network request substrings or domains HasData should block.",
            "minItems": 1
          },
          "jsRendering": {
            "type": "boolean",
            "description": "Whether HasData should enable JavaScript rendering for the page."
          },
          "jsScenario": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {},
              "additionalProperties": true,
              "description": "One HasData JavaScript scenario step."
            },
            "description": "JavaScript browser actions HasData should run on the page.",
            "minItems": 1
          },
          "headers": {
            "type": "object",
            "additionalProperties": {
              "type": "string",
              "description": "One HTTP header value."
            },
            "description": "HTTP headers HasData should send to the target website."
          }
        },
        "additionalProperties": false,
        "required": [
          "url"
        ],
        "description": "Input parameters for scraping one public web page with HasData."
      },
      "outputSchema": {
        "type": "object",
        "properties": {
          "payload": {
            "type": "object",
            "properties": {},
            "additionalProperties": true,
            "description": "Raw JSON object returned by HasData."
          }
        },
        "additionalProperties": false,
        "required": [
          "payload"
        ],
        "description": "The output payload for a HasData web scrape."
      }
    },
    {
      "id": "hasdata.search_google_serp",
      "service": "hasdata",
      "name": "search_google_serp",
      "description": "Run one synchronous Google SERP search through HasData and return the official JSON payload.",
      "requiredScopes": [],
      "providerPermissions": [],
      "inputSchema": {
        "type": "object",
        "properties": {
          "q": {
            "type": "string",
            "minLength": 1,
            "description": "Search term to query Google for."
          },
          "location": {
            "type": "string",
            "minLength": 1,
            "description": "Google canonical location for the search."
          },
          "uule": {
            "type": "string",
            "minLength": 1,
            "description": "Encoded Google canonical location string."
          },
          "domain": {
            "type": "string",
            "minLength": 1,
            "description": "Google domain to use for the search, such as google.com."
          },
          "gl": {
            "type": "string",
            "minLength": 1,
            "description": "Two-letter country code used to localize results."
          },
          "hl": {
            "type": "string",
            "minLength": 1,
            "description": "Two-letter language code used for the search interface."
          },
          "lr": {
            "type": "string",
            "minLength": 1,
            "description": "Language restriction for the web content returned by Google."
          },
          "tbs": {
            "type": "string",
            "minLength": 1,
            "description": "Google advanced filter expression such as qdr:d or sbd:1."
          },
          "safe": {
            "type": "string",
            "enum": [
              "active",
              "off"
            ],
            "description": "Adult content filtering mode sent to Google."
          },
          "filter": {
            "type": "integer",
            "minimum": 0,
            "maximum": 1,
            "description": "Whether Google should enable similar and omitted result filtering."
          },
          "nfpr": {
            "type": "integer",
            "minimum": 0,
            "maximum": 1,
            "description": "Whether Google should show only the original query."
          },
          "start": {
            "type": "integer",
            "minimum": 0,
            "description": "Number of search results to skip for pagination."
          },
          "num": {
            "type": "integer",
            "minimum": 10,
            "maximum": 100,
            "description": "Number of results per page."
          },
          "tbm": {
            "type": "string",
            "enum": [
              "isch",
              "vid",
              "nws",
              "shop",
              "lcl"
            ],
            "description": "Google search type."
          },
          "deviceType": {
            "type": "string",
            "enum": [
              "desktop",
              "mobile",
              "tablet"
            ],
            "description": "Device type HasData should emulate for Google results."
          },
          "ludocid": {
            "type": "string",
            "minLength": 1,
            "description": "Google Place ID for a specific location result."
          },
          "lsig": {
            "type": "string",
            "minLength": 1,
            "description": "Additional Google Place ID parameter."
          },
          "kgmid": {
            "type": "string",
            "minLength": 1,
            "description": "Google Knowledge Graph ID."
          },
          "si": {
            "type": "string",
            "minLength": 1,
            "description": "Google cached search parameters ID."
          }
        },
        "additionalProperties": false,
        "required": [
          "q"
        ],
        "description": "Input parameters for a HasData Google SERP request."
      },
      "outputSchema": {
        "type": "object",
        "properties": {
          "payload": {
            "type": "object",
            "properties": {},
            "additionalProperties": true,
            "description": "Raw JSON object returned by HasData."
          }
        },
        "additionalProperties": false,
        "required": [
          "payload"
        ],
        "description": "The output payload for a HasData Google SERP request."
      }
    }
  ]
}
