{
  "name": "The Register",
  "description": "A catalogue of production web-data extractors running on Apify. Every output field is documented with a type, a written description and an example value.",
  "source": "https://alaudinburki-scrapers.pages.dev/",
  "apifyProfile": "https://apify.com/alaudinburki",
  "generatedAt": "2026-10-18T17:53:53.089Z",
  "totals": {
    "actors": 113,
    "fields": 1383,
    "documented": 113,
    "runs": 3818,
    "users": 203,
    "categories": 12
  },
  "categories": [
    {
      "id": "DEVELOPER_TOOLS",
      "slug": "developer-tools",
      "label": "Developer tools",
      "count": 75
    },
    {
      "id": "BUSINESS",
      "slug": "business",
      "label": "Business",
      "count": 57
    },
    {
      "id": "AUTOMATION",
      "slug": "automation",
      "label": "Automation",
      "count": 26
    },
    {
      "id": "AI",
      "slug": "ai",
      "label": "AI",
      "count": 17
    },
    {
      "id": "SEO_TOOLS",
      "slug": "seo-tools",
      "label": "SEO tools",
      "count": 14
    },
    {
      "id": "LEAD_GENERATION",
      "slug": "lead-generation",
      "label": "Lead generation",
      "count": 8
    },
    {
      "id": "ECOMMERCE",
      "slug": "ecommerce",
      "label": "E-commerce",
      "count": 8
    },
    {
      "id": "INTEGRATIONS",
      "slug": "integrations",
      "label": "Integrations",
      "count": 8
    },
    {
      "id": "MARKETING",
      "slug": "marketing",
      "label": "Marketing",
      "count": 6
    },
    {
      "id": "NEWS",
      "slug": "news",
      "label": "News",
      "count": 6
    },
    {
      "id": "JOBS",
      "slug": "jobs",
      "label": "Jobs",
      "count": 4
    },
    {
      "id": "MCP_SERVERS",
      "slug": "mcp-servers",
      "label": "MCP servers",
      "count": 2
    }
  ],
  "extractors": [
    {
      "slug": "rest-api-paginator",
      "entry": "001",
      "title": "REST API Fetcher & Paginator — Any JSON API to Dataset",
      "description": "Fetch any JSON REST API into an Apify dataset — extract the items array by dot-path and auto-follow pagination (page, offset, cursor, or next-link). Custom headers for auth. Turns any API into a dataset.",
      "categories": [
        "DEVELOPER_TOOLS",
        "AUTOMATION"
      ],
      "url": "https://alaudinburki-scrapers.pages.dev/scrapers/rest-api-paginator/",
      "apifyUrl": "https://apify.com/alaudinburki/rest-api-paginator",
      "usage": {
        "runs": 843,
        "users": 4,
        "lastRun": "2026-10-16"
      },
      "outputSchema": [
        {
          "key": "value",
          "type": "number",
          "nullable": false,
          "description": "The measured value for this row. Units are in the README and sometimes in a sibling field.",
          "example": "42.5"
        },
        {
          "key": "status",
          "type": "string",
          "nullable": false,
          "description": "Outcome recorded for this row.",
          "example": "active"
        },
        {
          "key": "message",
          "type": "string",
          "nullable": false,
          "description": "Human-readable note about this row or the run.",
          "example": "Add your API key to classify answers. No text was sent anywhere."
        },
        {
          "key": "rowsReturned",
          "type": "number",
          "nullable": false,
          "description": "How many rows the run returned. Zero on a blocked run, which is a real value and the entire point of such a record.",
          "example": "0"
        }
      ],
      "inputs": [
        {
          "key": "url",
          "type": "string",
          "required": true,
          "secret": false,
          "description": "The JSON API endpoint (include query params)."
        },
        {
          "key": "itemsPath",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "Dot-path to the array in the response, e.g. data.results or hits. Empty = response is the array."
        },
        {
          "key": "paginationStrategy",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "none, page, offset, cursor, or link."
        },
        {
          "key": "paginationParam",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "Query param for page/offset/cursor (e.g. page, offset, cursor)."
        },
        {
          "key": "cursorPath",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "For cursor/link: dot-path to the cursor value or next URL in the response (e.g. meta.next)."
        },
        {
          "key": "pageSize",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "For offset strategy: how much to advance each page."
        },
        {
          "key": "headers",
          "type": "object",
          "required": false,
          "secret": false,
          "description": "Extra request headers, e.g. {\"Authorization\":\"Bearer ...\"}."
        },
        {
          "key": "maxPages",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Stop after N pages."
        },
        {
          "key": "maxItems",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Hard cap."
        }
      ]
    },
    {
      "slug": "job-change-monitor",
      "entry": "002",
      "title": "Job Monitor — Only What's New Since Last Run",
      "description": "Watch job pages and get only the NEW and CHANGED postings since your last run. Reads schema.org JobPosting data, so no per-site setup - see the README for which pages work.",
      "categories": [
        "JOBS",
        "AUTOMATION"
      ],
      "url": "https://alaudinburki-scrapers.pages.dev/scrapers/job-change-monitor/",
      "apifyUrl": "https://apify.com/alaudinburki/job-change-monitor",
      "usage": {
        "runs": 60,
        "users": 2,
        "lastRun": "2026-10-16"
      },
      "outputSchema": [
        {
          "key": "changeType",
          "type": "string",
          "nullable": true,
          "description": "What changed: initial, content, status, or a combination.",
          "example": "content"
        },
        {
          "key": "title",
          "type": "string",
          "nullable": true,
          "description": "Title as the source writes it.",
          "example": "Wireless Bluetooth Headphones"
        },
        {
          "key": "company",
          "type": "string",
          "nullable": true,
          "description": "Company name as the source writes it.",
          "example": "Northwind Traders"
        },
        {
          "key": "location",
          "type": "string",
          "nullable": true,
          "description": "Location as the source writes it.",
          "example": "Austin, TX"
        },
        {
          "key": "salaryMin",
          "type": "number",
          "nullable": true,
          "description": "Lower bound of the advertised salary.",
          "example": "95000"
        },
        {
          "key": "salaryMax",
          "type": "number",
          "nullable": true,
          "description": "Upper bound of the advertised salary.",
          "example": "130000"
        },
        {
          "key": "remote",
          "type": "boolean",
          "nullable": true,
          "description": "Whether the posting is remote.",
          "example": "true"
        },
        {
          "key": "url",
          "type": "string",
          "nullable": true,
          "description": "The URL this row describes.",
          "example": "https://example.com/pricing"
        }
      ],
      "inputs": [
        {
          "key": "boardUrls",
          "type": "array",
          "required": true,
          "secret": false,
          "description": "Pages whose HTML contains schema.org JobPosting data - individual job pages, and server-rendered boards. Board index and search pages usually do NOT work: they build their list in the browser, so the HTML has no jobs in it. To check a page, View Source and search for 'JobPosting'. The defaults below are real pages you can run as-is."
        },
        {
          "key": "returnMode",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "'New and changed only' is the point of a monitor. Use 'all' for a one-off full scrape."
        },
        {
          "key": "titleIncludes",
          "type": "array",
          "required": false,
          "secret": false,
          "description": "Case-insensitive. Leave empty for all titles."
        },
        {
          "key": "titleExcludes",
          "type": "array",
          "required": false,
          "secret": false,
          "description": "Filter out seniority levels or roles you don't want."
        },
        {
          "key": "remoteOnly",
          "type": "boolean",
          "required": false,
          "secret": false,
          "description": "Keep only postings whose location or job type says remote. Off by default."
        },
        {
          "key": "minSalary",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Jobs with no published salary are always kept - most listings omit it."
        },
        {
          "key": "postedWithinDays",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Ignore postings older than this many days. Leave empty for no age limit."
        },
        {
          "key": "includeRemoved",
          "type": "boolean",
          "required": false,
          "secret": false,
          "description": "Report postings that disappeared since the last run."
        },
        {
          "key": "maxItems",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Hard limit, strictly enforced."
        },
        {
          "key": "maxConcurrency",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "How many board pages to fetch at once. Lower it if a site rate-limits you."
        }
      ]
    },
    {
      "slug": "sitemap-url-extractor",
      "entry": "003",
      "title": "Sitemap URL Extractor — Every URL From Any Sitemap",
      "description": "Extract every URL from a site's sitemaps — follows sitemap-index files, reads robots.txt to discover them, decompresses .gz sitemaps, and returns lastmod/changefreq/priority. Feeds any other scraper. Pure logic.",
      "categories": [
        "SEO_TOOLS",
        "DEVELOPER_TOOLS"
      ],
      "url": "https://alaudinburki-scrapers.pages.dev/scrapers/sitemap-url-extractor/",
      "apifyUrl": "https://apify.com/alaudinburki/sitemap-url-extractor",
      "usage": {
        "runs": 60,
        "users": 2,
        "lastRun": "2026-10-15"
      },
      "outputSchema": [
        {
          "key": "url",
          "type": "string",
          "nullable": true,
          "description": "The URL this row describes.",
          "example": "https://example.com/pricing"
        },
        {
          "key": "lastmod",
          "type": "string",
          "nullable": true,
          "description": "Last-modified date the sitemap declares.",
          "example": "<lastmod>"
        },
        {
          "key": "changefreq",
          "type": "string",
          "nullable": true,
          "description": "Change frequency the sitemap declares.",
          "example": "<changefreq>"
        },
        {
          "key": "priority",
          "type": "string",
          "nullable": true,
          "description": "Priority the sitemap declares, between 0.0 and 1.0. Higher means the page is considered more important relative to others on the site.",
          "example": "high"
        },
        {
          "key": "sitemap",
          "type": "string",
          "nullable": true,
          "description": "Sitemap URL this row came from.",
          "example": "<sitemap>"
        }
      ],
      "inputs": [
        {
          "key": "siteUrl",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "A site to extract sitemaps from — standard locations (sitemap.xml, sitemap_index.xml) and robots.txt are tried automatically."
        },
        {
          "key": "sitemapUrls",
          "type": "array",
          "required": false,
          "secret": false,
          "description": "Exact sitemap URLs to parse, if you already know them (index or urlset, .xml or .xml.gz)."
        },
        {
          "key": "urlIncludes",
          "type": "array",
          "required": false,
          "secret": false,
          "description": "Keep only URLs containing one of these substrings (e.g. /blog/)."
        },
        {
          "key": "urlExcludes",
          "type": "array",
          "required": false,
          "secret": false,
          "description": "Drop URLs containing any of these substrings."
        },
        {
          "key": "maxUrls",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Hard cap on URLs returned. Strictly enforced."
        },
        {
          "key": "maxSitemaps",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Cap on how many sitemap files to fetch (for huge sitemap-index sites)."
        },
        {
          "key": "useProxy",
          "type": "boolean",
          "required": false,
          "secret": false,
          "description": "Route through a proxy for sites that block datacenter IPs."
        }
      ]
    },
    {
      "slug": "email-verifier-honest",
      "entry": "004",
      "title": "Email Verifier — Honest Grades, No False Certainty",
      "description": "Verify email lists without sending mail. Returns a 0-100 deliverability score, syntax, MX records, mail provider, catch-all detection, disposable and role-account flags, and typo correction. Every result explains its verdict, and says plainly when a check could not be performed rather than guessing.",
      "categories": [
        "LEAD_GENERATION",
        "BUSINESS"
      ],
      "url": "https://alaudinburki-scrapers.pages.dev/scrapers/email-verifier-honest/",
      "apifyUrl": "https://apify.com/alaudinburki/email-verifier-honest",
      "usage": {
        "runs": 57,
        "users": 1,
        "lastRun": "2026-10-16"
      },
      "outputSchema": [
        {
          "key": "email",
          "type": "string",
          "nullable": true,
          "description": "Email address, as published by the source.",
          "example": "hello@example.com"
        },
        {
          "key": "status",
          "type": "string",
          "nullable": true,
          "description": "Outcome recorded for this row.",
          "example": "ok"
        },
        {
          "key": "confidence",
          "type": "string",
          "nullable": true,
          "description": "How confident the Actor is in this result, from 0 to 1. Not a probability of correctness.",
          "example": "<confidence>"
        },
        {
          "key": "reason",
          "type": "string",
          "nullable": true,
          "description": "Why this row carries its status.",
          "example": "row retrieved successfully"
        },
        {
          "key": "domain",
          "type": "string",
          "nullable": true,
          "description": "Domain name, without the scheme.",
          "example": "example.com"
        },
        {
          "key": "isDisposable",
          "type": "boolean",
          "nullable": true,
          "description": "Whether the domain is a known disposable-address provider.",
          "example": "true"
        },
        {
          "key": "isRoleAccount",
          "type": "boolean",
          "nullable": true,
          "description": "Whether the address is a shared role mailbox such as info@ or sales@.",
          "example": "true"
        },
        {
          "key": "mailServer",
          "type": "string",
          "nullable": true,
          "description": "Mail server the domain uses.",
          "example": "<mailServer>"
        },
        {
          "key": "suggestedCorrection",
          "type": "string",
          "nullable": true,
          "description": "Likely intended address, when the one given looks mistyped.",
          "example": "<suggestedCorrection>"
        },
        {
          "key": "score",
          "type": "integer",
          "nullable": true,
          "description": "Score on the Actor's own scale. The scale is stated in the field's own band.",
          "example": "82"
        },
        {
          "key": "scoreBand",
          "type": "string",
          "nullable": true,
          "description": "Band the score falls into, in words.",
          "example": "<scoreBand>"
        },
        {
          "key": "mailProvider",
          "type": "string",
          "nullable": true,
          "description": "Mail provider hosting the domain.",
          "example": "<mailProvider>"
        },
        {
          "key": "isCatchAll",
          "type": "boolean",
          "nullable": true,
          "description": "Whether the domain accepts mail for any address, which makes single-address verification unreliable.",
          "example": "true"
        },
        {
          "key": "catchAllStatus",
          "type": "string",
          "nullable": true,
          "description": "Whether the domain accepts mail for any address.",
          "example": "<catchAllStatus>"
        },
        {
          "key": "smtpStatus",
          "type": "string",
          "nullable": true,
          "description": "Outcome of the SMTP conversation.",
          "example": "<smtpStatus>"
        },
        {
          "key": "smtpCode",
          "type": "integer",
          "nullable": true,
          "description": "SMTP response code returned by the server.",
          "example": "0"
        }
      ],
      "inputs": [
        {
          "key": "emails",
          "type": "array",
          "required": true,
          "secret": false,
          "description": "One address per line, or paste a comma-separated list."
        },
        {
          "key": "onlyStatus",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "Filter the output. Choose 'valid' to get a clean sending list."
        },
        {
          "key": "maxItems",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Hard limit, strictly enforced. You will never be charged for more."
        },
        {
          "key": "concurrency",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Higher is faster. Lower if your DNS resolver rate-limits."
        },
        {
          "key": "catchAllCheck",
          "type": "boolean",
          "required": false,
          "secret": false,
          "description": "Probe each domain once to see whether it accepts mail for ANY address. On a catch-all domain a 'valid' verdict proves nothing — this is the single biggest cause of bounced 'verified' lists. Needs outbound port 25, which most cloud hosts block; the result says so plainly when blocked."
        },
        {
          "key": "smtpCheck",
          "type": "boolean",
          "required": false,
          "secret": false,
          "description": "Ask the mail server directly whether the recipient exists (RCPT TO, no mail sent). The only direct evidence available — but port 25 is blocked on most cloud hosts, and some providers answer misleadingly. Off by default."
        }
      ]
    },
    {
      "slug": "google-trends-full-scraper",
      "entry": "005",
      "title": "Google Trends Full Scraper — Interest & Related",
      "description": "Interest over time, related queries and topics, and interest by region for up to 5 compared keywords. Handles rate limits with backoff + proxy, and flags every incomplete-period data point instead of returning it silently.",
      "categories": [
        "SEO_TOOLS",
        "BUSINESS"
      ],
      "url": "https://alaudinburki-scrapers.pages.dev/scrapers/google-trends-full-scraper/",
      "apifyUrl": "https://apify.com/alaudinburki/google-trends-full-scraper",
      "usage": {
        "runs": 56,
        "users": 2,
        "lastRun": "2026-10-16"
      },
      "outputSchema": [
        {
          "key": "type",
          "type": "string",
          "nullable": true,
          "description": "Type of this record, as classified by the Actor.",
          "example": "article"
        },
        {
          "key": "keyword",
          "type": "string",
          "nullable": true,
          "description": "The keyword this record relates to.",
          "example": "<keyword>"
        },
        {
          "key": "date",
          "type": "string",
          "nullable": true,
          "description": "ISO 8601 date associated with this record.",
          "example": "2026-10-15"
        },
        {
          "key": "value",
          "type": "number",
          "nullable": true,
          "description": "Value as recorded for this row.",
          "example": "42.5"
        },
        {
          "key": "isPartial",
          "type": "boolean",
          "nullable": true,
          "description": "Whether the source marks this record as incomplete.",
          "example": "true"
        },
        {
          "key": "query",
          "type": "string",
          "nullable": true,
          "description": "The query that produced this row.",
          "example": "shopify scraper"
        },
        {
          "key": "rank",
          "type": "integer",
          "nullable": true,
          "description": "Position in the source's own ordering. 1 is highest.",
          "example": "1"
        },
        {
          "key": "geoName",
          "type": "string",
          "nullable": true,
          "description": "Geo Name as recorded for this row.",
          "example": "<geoName>"
        }
      ],
      "inputs": [
        {
          "key": "keywords",
          "type": "array",
          "required": true,
          "secret": false,
          "description": "Search terms to analyze, up to 5 — they are compared on the same scale, exactly like the Google Trends website. For more, run separate jobs."
        },
        {
          "key": "geo",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "Two-letter country code (US, GB, DE...) or a sub-region (US-CA). Leave empty for worldwide."
        },
        {
          "key": "timeRange",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "One of: 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."
        },
        {
          "key": "datasets",
          "type": "array",
          "required": false,
          "secret": false,
          "description": "Which data to return: interestOverTime, relatedQueries, relatedTopics, interestByRegion."
        },
        {
          "key": "category",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Google Trends category number to narrow results (0 = all categories). See Google Trends for category IDs."
        },
        {
          "key": "property",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "Search surface: web (empty), news, images, youtube, or froogle (shopping)."
        },
        {
          "key": "language",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "Result language, e.g. en-US, de-DE."
        },
        {
          "key": "proxyConfiguration",
          "type": "object",
          "required": true,
          "secret": false,
          "description": "A proxy is required because Google rate-limits by IP. The example uses Apify Proxy; select residential access or provide an external proxy if the shared proxy is blocked for your run."
        },
        {
          "key": "maxItems",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Hard limit on output rows. Strictly enforced — you will never be charged for more than this."
        }
      ]
    },
    {
      "slug": "amazon-product-scraper-reliable",
      "entry": "006",
      "title": "Amazon Product Scraper — Reliable, No Silent Blanks",
      "description": "Scrape Amazon products with per-field reporting. Every row tells you exactly what was found and what was missing - no silent blanks, no surprise failures.",
      "categories": [
        "ECOMMERCE",
        "BUSINESS"
      ],
      "url": "https://alaudinburki-scrapers.pages.dev/scrapers/amazon-product-scraper-reliable/",
      "apifyUrl": "https://apify.com/alaudinburki/amazon-product-scraper-reliable",
      "usage": {
        "runs": 55,
        "users": 2,
        "lastRun": "2026-10-16"
      },
      "outputSchema": [
        {
          "key": "asin",
          "type": "string",
          "nullable": false,
          "description": "Amazon Standard Identification Number.",
          "example": "B09XS7JWHH"
        },
        {
          "key": "title",
          "type": "string",
          "nullable": false,
          "description": "Title as the source writes it.",
          "example": "Wireless Bluetooth Headphones"
        },
        {
          "key": "brand",
          "type": "string",
          "nullable": false,
          "description": "Brand the item is sold under.",
          "example": "<brand>"
        },
        {
          "key": "price",
          "type": "number",
          "nullable": true,
          "description": "Price as reported by the source. Currency is given by the currency field.",
          "example": "9.99"
        },
        {
          "key": "currency",
          "type": "string",
          "nullable": true,
          "description": "Three-letter ISO 4217 currency code.",
          "example": "USD"
        },
        {
          "key": "priceStatus",
          "type": "string",
          "nullable": false,
          "description": "Whether a price was found and parsed.",
          "example": "<priceStatus>"
        },
        {
          "key": "rating",
          "type": "number",
          "nullable": true,
          "description": "Average rating as reported by the source.",
          "example": "4.6"
        },
        {
          "key": "reviewCount",
          "type": "integer",
          "nullable": true,
          "description": "Number of reviews the source counts.",
          "example": "1284"
        },
        {
          "key": "completeness",
          "type": "integer",
          "nullable": true,
          "description": "Share of expected values actually present, between 0 and 1.",
          "example": "0"
        },
        {
          "key": "url",
          "type": "string",
          "nullable": false,
          "description": "The URL this row describes.",
          "example": "https://example.com/pricing"
        },
        {
          "key": "dealScore",
          "type": "integer",
          "nullable": true,
          "description": "Deal Score as recorded for this row.",
          "example": "0"
        },
        {
          "key": "isPriceAnomaly",
          "type": "boolean",
          "nullable": true,
          "description": "Whether this price deviates enough from the norm to be flagged.",
          "example": "true"
        },
        {
          "key": "priceVsAvgPercent",
          "type": "number",
          "nullable": true,
          "description": "This price against the average, as a percentage.",
          "example": "0"
        },
        {
          "key": "bestSellersRank",
          "type": "integer",
          "nullable": true,
          "description": "Sales rank as the marketplace publishes it. Lower is better.",
          "example": "0"
        },
        {
          "key": "amazonsChoice",
          "type": "boolean",
          "nullable": true,
          "description": "Whether the item carries the marketplace's choice badge.",
          "example": "true"
        },
        {
          "key": "bestSeller",
          "type": "boolean",
          "nullable": true,
          "description": "Whether the item carries a best-seller badge.",
          "example": "true"
        },
        {
          "key": "variantCount",
          "type": "integer",
          "nullable": true,
          "description": "How many variants the product has.",
          "example": "6"
        },
        {
          "key": "fulfillment",
          "type": "string",
          "nullable": true,
          "description": "How the item is fulfilled.",
          "example": "<fulfillment>"
        },
        {
          "key": "soldBy",
          "type": "string",
          "nullable": true,
          "description": "Seller the item is sold by.",
          "example": "<soldBy>"
        },
        {
          "key": "imageCount",
          "type": "integer",
          "nullable": true,
          "description": "Number of images found.",
          "example": "7"
        },
        {
          "key": "discountPercent",
          "type": "number",
          "nullable": true,
          "description": "Discount off the comparison price, as a percentage.",
          "example": "15"
        }
      ],
      "inputs": [
        {
          "key": "productUrls",
          "type": "array",
          "required": true,
          "secret": false,
          "description": "Product page URLs from any Amazon marketplace (.com, .co.uk, .de, .in, .ae and 14 more)."
        },
        {
          "key": "maxItems",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Hard limit, strictly enforced. You will never be charged for more than this."
        },
        {
          "key": "minCompleteness",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Skip products where fewer than this percentage of fields were found. Leave at 0 to return everything with its completeness score."
        },
        {
          "key": "proxyCountry",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "Two-letter country code. Prices and availability differ by delivery location — set this to match the marketplace you're scraping."
        },
        {
          "key": "useResidentialProxy",
          "type": "boolean",
          "required": false,
          "secret": false,
          "description": "Slower and more expensive, but far less likely to be blocked. Turn on if you see captcha blocks in the log."
        },
        {
          "key": "maxConcurrency",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Lower this if you hit blocks. 5 is a safe default."
        },
        {
          "key": "trackPriceHistory",
          "type": "boolean",
          "required": false,
          "secret": false,
          "description": "Remembers each product's price across runs. Adds priceVsAvgPercent, priceLow/High and isPriceAnomaly (flags a price >2σ from its own history). Schedule this actor daily to build the history."
        },
        {
          "key": "detectChanges",
          "type": "boolean",
          "required": false,
          "secret": false,
          "description": "Compares each product to the previous run and adds a whatChanged list (price, stock, rating, review count, BSR) plus isNew. Turns this into a price/stock monitor you can schedule."
        }
      ]
    },
    {
      "slug": "ebay-sold-listings",
      "entry": "007",
      "title": "eBay Sold Listings — Real Comps & Price Stats",
      "description": "Get eBay SOLD/completed listings (what items actually sold for) with per-query price stats — min, max, average, median. eBay's official API hides sold data; this reports it, paginated, with honest block handling.",
      "categories": [
        "ECOMMERCE",
        "BUSINESS"
      ],
      "url": "https://alaudinburki-scrapers.pages.dev/scrapers/ebay-sold-listings/",
      "apifyUrl": "https://apify.com/alaudinburki/ebay-sold-listings",
      "usage": {
        "runs": 54,
        "users": 2,
        "lastRun": "2026-10-16"
      },
      "outputSchema": [
        {
          "key": "query",
          "type": "string",
          "nullable": true,
          "description": "The query that produced this row.",
          "example": "shopify scraper"
        },
        {
          "key": "title",
          "type": "string",
          "nullable": true,
          "description": "Title as the source writes it.",
          "example": "Wireless Bluetooth Headphones"
        },
        {
          "key": "soldPrice",
          "type": "number",
          "nullable": true,
          "description": "Price the item actually sold for.",
          "example": "0"
        },
        {
          "key": "currency",
          "type": "string",
          "nullable": true,
          "description": "Three-letter ISO 4217 currency code.",
          "example": "USD"
        },
        {
          "key": "soldDate",
          "type": "string",
          "nullable": true,
          "description": "Date the sale completed.",
          "example": "<soldDate>"
        },
        {
          "key": "condition",
          "type": "string",
          "nullable": true,
          "description": "Condition of the item.",
          "example": "<condition>"
        },
        {
          "key": "shipping",
          "type": "string",
          "nullable": true,
          "description": "Shipping cost or terms as published.",
          "example": "<shipping>"
        },
        {
          "key": "soldPriceRaw",
          "type": "string",
          "nullable": true,
          "description": "Sale price exactly as the source renders it, before parsing.",
          "example": "<soldPriceRaw>"
        },
        {
          "key": "bids",
          "type": "integer",
          "nullable": true,
          "description": "Bids as recorded for this row.",
          "example": "0"
        },
        {
          "key": "bestOfferAccepted",
          "type": "boolean",
          "nullable": true,
          "description": "Best Offer Accepted as recorded for this row.",
          "example": "true"
        },
        {
          "key": "itemUrl",
          "type": "string",
          "nullable": true,
          "description": "Direct link to this item at the source.",
          "example": "<itemUrl>"
        },
        {
          "key": "imageUrl",
          "type": "string",
          "nullable": true,
          "description": "Direct URL of this image.",
          "example": "https://cdn.example.com/products/1.jpg"
        },
        {
          "key": "itemId",
          "type": "string",
          "nullable": true,
          "description": "Identifier of this item at the source.",
          "example": "<itemId>"
        },
        {
          "key": "sponsored",
          "type": "boolean",
          "nullable": true,
          "description": "Whether the listing is a sponsored placement.",
          "example": "true"
        },
        {
          "key": "country",
          "type": "string",
          "nullable": true,
          "description": "Country code associated with this record.",
          "example": "US"
        },
        {
          "key": "status",
          "type": "string",
          "nullable": true,
          "description": "Outcome recorded for this row.",
          "example": "ok"
        },
        {
          "key": "page",
          "type": "integer",
          "nullable": true,
          "description": "Page number this record came from. 1-based.",
          "example": "1"
        },
        {
          "key": "note",
          "type": "boolean",
          "nullable": false,
          "description": "Short free-text note recorded with this row.",
          "example": "true"
        }
      ],
      "inputs": [
        {
          "key": "queries",
          "type": "array",
          "required": true,
          "secret": false,
          "description": "What to look up sold comps for, one per line, e.g. 'nintendo switch oled', 'airpods pro 2'."
        },
        {
          "key": "sessionCookie",
          "type": "string",
          "required": false,
          "secret": true,
          "description": "Secret — supply your own value."
        },
        {
          "key": "country",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "Two-letter country for the eBay site: US, GB, DE, FR, IT, ES, CA, AU."
        },
        {
          "key": "maxPagesPerQuery",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "How many result pages to fetch per search term (240 listings per page)."
        },
        {
          "key": "excludeSponsored",
          "type": "boolean",
          "required": false,
          "secret": false,
          "description": "Drop sponsored/ad items, which distort 'what it actually sold for' statistics."
        },
        {
          "key": "useResidentialProxy",
          "type": "boolean",
          "required": false,
          "secret": false,
          "description": "On by default: eBay login-gates datacenter IPs almost immediately. Turn off only to cut proxy cost if you're fine with more blocked pages."
        },
        {
          "key": "maxConcurrency",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Higher is faster but more likely to be throttled."
        },
        {
          "key": "maxItems",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Hard limit on rows. Strictly enforced — never charged beyond it."
        }
      ]
    },
    {
      "slug": "lead-finder-verified-emails",
      "entry": "008",
      "title": "Lead Finder — Named Contacts & Verified Emails",
      "description": "Crawl company websites for leads: named people with job titles, verified emails, phones and socials. Works out each company's email convention and labels every address by how it was obtained - found on the site, inferred, or constructed. Guesses are never presented as findings.",
      "categories": [
        "LEAD_GENERATION",
        "BUSINESS"
      ],
      "url": "https://alaudinburki-scrapers.pages.dev/scrapers/lead-finder-verified-emails/",
      "apifyUrl": "https://apify.com/alaudinburki/lead-finder-verified-emails",
      "usage": {
        "runs": 54,
        "users": 2,
        "lastRun": "2026-10-16"
      },
      "outputSchema": [
        {
          "key": "site",
          "type": "string",
          "nullable": true,
          "description": "Site as recorded for this row.",
          "example": "example.com"
        },
        {
          "key": "companyName",
          "type": "string",
          "nullable": true,
          "description": "Registered company name.",
          "example": "<companyName>"
        },
        {
          "key": "email",
          "type": "string",
          "nullable": true,
          "description": "Email address, as published by the source.",
          "example": "hello@example.com"
        },
        {
          "key": "emailStatus",
          "type": "string",
          "nullable": true,
          "description": "Verification verdict for this address.",
          "example": "<emailStatus>"
        },
        {
          "key": "emailReason",
          "type": "string",
          "nullable": true,
          "description": "Why the address carries its verdict.",
          "example": "<emailReason>"
        },
        {
          "key": "isRoleAccount",
          "type": "boolean",
          "nullable": true,
          "description": "Whether the address is a shared role mailbox such as info@ or sales@.",
          "example": "true"
        },
        {
          "key": "phones",
          "type": "string",
          "nullable": true,
          "description": "Phone numbers found for this record.",
          "example": "<phones>"
        },
        {
          "key": "linkedin",
          "type": "string",
          "nullable": true,
          "description": "LinkedIn profile or company URL.",
          "example": "<linkedin>"
        },
        {
          "key": "foundOnPage",
          "type": "string",
          "nullable": true,
          "description": "Page number where this record was found.",
          "example": "<foundOnPage>"
        },
        {
          "key": "personName",
          "type": "string",
          "nullable": true,
          "description": "Person Name as recorded for this row.",
          "example": "<personName>"
        },
        {
          "key": "jobTitle",
          "type": "string",
          "nullable": true,
          "description": "Job title as posted.",
          "example": "<jobTitle>"
        },
        {
          "key": "personProfileUrl",
          "type": "string",
          "nullable": true,
          "description": "Person Profile Url as recorded for this row.",
          "example": "<personProfileUrl>"
        },
        {
          "key": "emailSource",
          "type": "string",
          "nullable": true,
          "description": "Where the address was found.",
          "example": "<emailSource>"
        },
        {
          "key": "emailPattern",
          "type": "string",
          "nullable": true,
          "description": "The address pattern the company appears to use.",
          "example": "<emailPattern>"
        }
      ],
      "inputs": [
        {
          "key": "domains",
          "type": "array",
          "required": false,
          "secret": false,
          "description": "Company domains to scan, one per line (with or without https://). Invalid entries are reported and skipped, never silently dropped."
        },
        {
          "key": "startUrls",
          "type": "array",
          "required": false,
          "secret": false,
          "description": "Full page URLs to start from instead of (or in addition to) the domains list."
        },
        {
          "key": "maxPagesPerSite",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Homepage plus up to this many contact-like pages (contact, about, team, impressum...). 5 finds nearly everything; raise it for very large sites."
        },
        {
          "key": "maxLeads",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Hard limit on output rows. Strictly enforced — you will never be charged for more than this."
        },
        {
          "key": "includeSitesWithoutEmails",
          "type": "boolean",
          "required": false,
          "secret": false,
          "description": "On: sites with no published email still get one row saying so (with phones/socials if found) — you always know every site was actually scanned. Off: only rows with an email."
        },
        {
          "key": "findPeople",
          "type": "boolean",
          "required": false,
          "secret": false,
          "description": "Extract people (name + role) from team/about pages, and work out the company's email convention from any address that belongs to one of them. A named contact with a title is worth far more than a generic info@ address."
        },
        {
          "key": "guessMissingEmails",
          "type": "boolean",
          "required": false,
          "secret": false,
          "description": "For a person found without a published address, build one from the company's convention. These are clearly labelled (emailSource: pattern_inferred / guessed) and are NEVER presented as found. Off by default — a constructed address is a hypothesis, not a lead."
        }
      ]
    },
    {
      "slug": "amazon-reviews-honest",
      "entry": "009",
      "title": "Amazon Reviews Scraper — Honest Scope, No Fake Blanks",
      "description": "Scrape the reviews Amazon serves on the product page (top reviews, rating and star histogram) with per-page accounting. Blocked pages are reported as blocked, never returned as zero reviews.",
      "categories": [
        "ECOMMERCE",
        "BUSINESS"
      ],
      "url": "https://alaudinburki-scrapers.pages.dev/scrapers/amazon-reviews-honest/",
      "apifyUrl": "https://apify.com/alaudinburki/amazon-reviews-honest",
      "usage": {
        "runs": 52,
        "users": 2,
        "lastRun": "2026-10-15"
      },
      "outputSchema": [
        {
          "key": "rowType",
          "type": "string",
          "nullable": true,
          "description": "What kind of row this is, when one dataset mixes several shapes.",
          "example": "<rowType>"
        },
        {
          "key": "reviewId",
          "type": "string",
          "nullable": true,
          "description": "Identifier of this review at the source.",
          "example": "<reviewId>"
        },
        {
          "key": "title",
          "type": "string",
          "nullable": true,
          "description": "Title as the source writes it.",
          "example": "Wireless Bluetooth Headphones"
        },
        {
          "key": "body",
          "type": "string",
          "nullable": true,
          "description": "Body text of this record.",
          "example": "<body>"
        },
        {
          "key": "stars",
          "type": "number",
          "nullable": true,
          "description": "Number of stars recorded upstream.",
          "example": "131"
        },
        {
          "key": "author",
          "type": "string",
          "nullable": true,
          "description": "Author of this record, as the source publishes it.",
          "example": "jane.cooper"
        },
        {
          "key": "date",
          "type": "string",
          "nullable": true,
          "description": "ISO 8601 date associated with this record.",
          "example": "2026-10-15"
        },
        {
          "key": "country",
          "type": "string",
          "nullable": true,
          "description": "Country code associated with this record.",
          "example": "US"
        },
        {
          "key": "verifiedPurchase",
          "type": "boolean",
          "nullable": true,
          "description": "Whether the source marks this review as a verified purchase.",
          "example": "true"
        },
        {
          "key": "helpfulVotes",
          "type": "integer",
          "nullable": true,
          "description": "How many users marked this review helpful.",
          "example": "0"
        },
        {
          "key": "variant",
          "type": "string",
          "nullable": true,
          "description": "Variant identifier.",
          "example": "<variant>"
        },
        {
          "key": "images",
          "type": "string",
          "nullable": true,
          "description": "Image URLs found in this record.",
          "example": "<images>"
        },
        {
          "key": "imageCount",
          "type": "integer",
          "nullable": true,
          "description": "Number of images found.",
          "example": "7"
        },
        {
          "key": "asin",
          "type": "string",
          "nullable": true,
          "description": "Amazon Standard Identification Number.",
          "example": "B09XS7JWHH"
        },
        {
          "key": "marketplace",
          "type": "string",
          "nullable": true,
          "description": "Marketplace this record came from.",
          "example": "<marketplace>"
        },
        {
          "key": "countryCode",
          "type": "string",
          "nullable": true,
          "description": "Two-letter ISO 3166-1 country code.",
          "example": "US"
        },
        {
          "key": "page",
          "type": "integer",
          "nullable": true,
          "description": "Page number this record came from. 1-based.",
          "example": "1"
        },
        {
          "key": "overallRating",
          "type": "number",
          "nullable": true,
          "description": "Overall rating the source publishes.",
          "example": "0"
        },
        {
          "key": "totalRatingsOnPage",
          "type": "integer",
          "nullable": true,
          "description": "Total ratings shown on the fetched page.",
          "example": "0"
        },
        {
          "key": "url",
          "type": "string",
          "nullable": true,
          "description": "The URL this row describes.",
          "example": "https://example.com/pricing"
        },
        {
          "key": "reviewsOnPage",
          "type": "integer",
          "nullable": true,
          "description": "Number of reviews present on the fetched page.",
          "example": "0"
        },
        {
          "key": "stars5Percent",
          "type": "integer",
          "nullable": true,
          "description": "Stars5 Percent as recorded for this row.",
          "example": "0"
        },
        {
          "key": "stars4Percent",
          "type": "integer",
          "nullable": true,
          "description": "Stars4 Percent as recorded for this row.",
          "example": "0"
        },
        {
          "key": "stars3Percent",
          "type": "integer",
          "nullable": true,
          "description": "Stars3 Percent as recorded for this row.",
          "example": "0"
        },
        {
          "key": "stars2Percent",
          "type": "integer",
          "nullable": true,
          "description": "Stars2 Percent as recorded for this row.",
          "example": "0"
        },
        {
          "key": "stars1Percent",
          "type": "integer",
          "nullable": true,
          "description": "Stars1 Percent as recorded for this row.",
          "example": "0"
        },
        {
          "key": "status",
          "type": "string",
          "nullable": true,
          "description": "Outcome recorded for this row.",
          "example": "ok"
        },
        {
          "key": "note",
          "type": "boolean",
          "nullable": false,
          "description": "Short free-text note recorded with this row.",
          "example": "true"
        }
      ],
      "inputs": [
        {
          "key": "productUrls",
          "type": "array",
          "required": true,
          "secret": false,
          "description": "Product pages to read reviews from (with /dp/ASIN). One per line."
        },
        {
          "key": "minStars",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Keep only reviews at or above this rating (1-5). Leave empty for all."
        },
        {
          "key": "maxStars",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Keep only reviews at or below this rating (1-5). Set both min and max to 1 to get only 1-star reviews."
        },
        {
          "key": "sessionCookie",
          "type": "string",
          "required": false,
          "secret": true,
          "description": "Secret — supply your own value."
        },
        {
          "key": "sortBy",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "recent (newest first) or helpful (most helpful first)."
        },
        {
          "key": "maxReviewPages",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "How many review pages to fetch per product. Page 1 is served without login (~10 reviews); pages 2+ usually hit Amazon's login wall (reported as login_required, not faked). Default 1."
        },
        {
          "key": "verifiedOnly",
          "type": "boolean",
          "required": false,
          "secret": false,
          "description": "Keep only reviews marked Verified Purchase."
        },
        {
          "key": "includeSummary",
          "type": "boolean",
          "required": false,
          "secret": false,
          "description": "Add one row per product with the overall rating, total ratings, and star histogram — so a product is never a silent blank even if reviews are login-gated."
        },
        {
          "key": "useResidentialProxy",
          "type": "boolean",
          "required": false,
          "secret": false,
          "description": "Turn on if pages get blocked. Costs more but gets through Amazon's throttling."
        },
        {
          "key": "maxConcurrency",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Higher is faster but more likely to be throttled."
        },
        {
          "key": "maxItems",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Hard limit on rows (reviews + summaries). Strictly enforced — never charged beyond it."
        }
      ]
    },
    {
      "slug": "screenshot-reliable",
      "entry": "010",
      "title": "Screenshot & PDF — Reliable Full-Page Capture",
      "description": "Capture full-page or viewport screenshots (PNG/JPEG) and PDFs of any URL — retina, wait-for-selector, cookie-banner hiding, and a per-URL success/failure report. No silent broken images.",
      "categories": [
        "DEVELOPER_TOOLS",
        "AUTOMATION"
      ],
      "url": "https://alaudinburki-scrapers.pages.dev/scrapers/screenshot-reliable/",
      "apifyUrl": "https://apify.com/alaudinburki/screenshot-reliable",
      "usage": {
        "runs": 50,
        "users": 2,
        "lastRun": "2026-10-16"
      },
      "outputSchema": [
        {
          "key": "url",
          "type": "string",
          "nullable": true,
          "description": "The URL this row describes.",
          "example": "https://example.com/pricing"
        },
        {
          "key": "status",
          "type": "string",
          "nullable": true,
          "description": "Outcome recorded for this row.",
          "example": "ok"
        },
        {
          "key": "httpStatus",
          "type": "integer",
          "nullable": true,
          "description": "HTTP status code returned by the request.",
          "example": "200"
        },
        {
          "key": "key",
          "type": "string",
          "nullable": true,
          "description": "Key this record is stored or deduplicated under.",
          "example": "<key>"
        },
        {
          "key": "screenshotUrl",
          "type": "string",
          "nullable": true,
          "description": "Link to a screenshot captured for this record.",
          "example": "<screenshotUrl>"
        },
        {
          "key": "format",
          "type": "string",
          "nullable": true,
          "description": "Format of this record.",
          "example": "<format>"
        },
        {
          "key": "fullPage",
          "type": "boolean",
          "nullable": true,
          "description": "Full Page as recorded for this row.",
          "example": "true"
        },
        {
          "key": "width",
          "type": "number",
          "nullable": true,
          "description": "Width in pixels.",
          "example": "0"
        },
        {
          "key": "height",
          "type": "number",
          "nullable": true,
          "description": "Height in pixels.",
          "example": "0"
        },
        {
          "key": "deviceScaleFactor",
          "type": "number",
          "nullable": true,
          "description": "Device Scale Factor as recorded for this row.",
          "example": "0"
        },
        {
          "key": "bytes",
          "type": "integer",
          "nullable": true,
          "description": "Size in bytes.",
          "example": "0"
        },
        {
          "key": "tookMs",
          "type": "integer",
          "nullable": true,
          "description": "Time the operation took, in milliseconds.",
          "example": "0"
        },
        {
          "key": "error",
          "type": "string",
          "nullable": true,
          "description": "Why this row failed, when it did. Null on success.",
          "example": "<error>"
        }
      ],
      "inputs": [
        {
          "key": "urls",
          "type": "array",
          "required": true,
          "secret": false,
          "description": "Pages to capture, one per line (with or without https://)."
        },
        {
          "key": "format",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "png (lossless), jpeg (smaller), or pdf (whole page)."
        },
        {
          "key": "fullPage",
          "type": "boolean",
          "required": false,
          "secret": false,
          "description": "Capture the entire scrollable page (on) or just the viewport (off). PDF is always full page."
        },
        {
          "key": "device",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "Preset viewport: desktop, laptop, tablet, mobile. Overridden by explicit width/height."
        },
        {
          "key": "width",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Custom viewport width in px (1–5000). Overrides the device preset."
        },
        {
          "key": "height",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Custom viewport height in px (1–5000)."
        },
        {
          "key": "deviceScaleFactor",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "2 or 3 gives crisp HiDPI/retina images at the cost of larger files."
        },
        {
          "key": "quality",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "1–100, only for jpeg."
        },
        {
          "key": "waitForSelector",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "Wait until this CSS selector appears before capturing (e.g. '#main'). Failing to find it is reported as a failed capture, not a blank image."
        },
        {
          "key": "waitMs",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Additional wait before capture, for animations or late content (max 30000)."
        },
        {
          "key": "hideCookieBanners",
          "type": "boolean",
          "required": false,
          "secret": false,
          "description": "Hide common cookie/consent overlays before capturing."
        },
        {
          "key": "useProxy",
          "type": "boolean",
          "required": false,
          "secret": false,
          "description": "Route through a proxy for sites that block datacenter IPs."
        },
        {
          "key": "maxItems",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Hard limit on captures. Strictly enforced — never charged beyond it."
        }
      ]
    },
    {
      "slug": "broken-link-checker",
      "entry": "011",
      "title": "Broken Link Checker — Honest Link Health",
      "description": "Crawl your pages and check every link's HTTP status. Reports broken links (404/410/5xx/DNS) separately from blocked (403/429) and redirects, with the source page — so a login-walled link is never falsely flagged as broken.",
      "categories": [
        "SEO_TOOLS",
        "DEVELOPER_TOOLS"
      ],
      "url": "https://alaudinburki-scrapers.pages.dev/scrapers/broken-link-checker/",
      "apifyUrl": "https://apify.com/alaudinburki/broken-link-checker",
      "usage": {
        "runs": 49,
        "users": 2,
        "lastRun": "2026-10-16"
      },
      "outputSchema": [
        {
          "key": "sourcePage",
          "type": "string",
          "nullable": true,
          "description": "Page this row's link was found on.",
          "example": "<sourcePage>"
        },
        {
          "key": "url",
          "type": "string",
          "nullable": true,
          "description": "The URL this row describes.",
          "example": "https://example.com/pricing"
        },
        {
          "key": "anchorText",
          "type": "string",
          "nullable": true,
          "description": "Anchor Text as recorded for this row.",
          "example": "View the full comparison"
        },
        {
          "key": "internal",
          "type": "boolean",
          "nullable": true,
          "description": "Internal identifier, not for display.",
          "example": "true"
        },
        {
          "key": "state",
          "type": "string",
          "nullable": true,
          "description": "State, province or region name.",
          "example": "active"
        },
        {
          "key": "httpStatus",
          "type": "integer",
          "nullable": true,
          "description": "HTTP status code returned by the request.",
          "example": "200"
        },
        {
          "key": "reason",
          "type": "string",
          "nullable": true,
          "description": "Why this row carries its status.",
          "example": "row retrieved successfully"
        },
        {
          "key": "finalUrl",
          "type": "string",
          "nullable": true,
          "description": "URL of the final response after any redirects.",
          "example": "https://example.com/products/widget"
        }
      ],
      "inputs": [
        {
          "key": "startUrls",
          "type": "array",
          "required": true,
          "secret": false,
          "description": "Pages to check (with or without https://)."
        },
        {
          "key": "maxPages",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "1 = check only the start pages. Higher follows internal links (same host) up to this many pages."
        },
        {
          "key": "checkExternal",
          "type": "boolean",
          "required": false,
          "secret": false,
          "description": "Also check links pointing to other domains (on) or only internal links (off)."
        },
        {
          "key": "onlyBroken",
          "type": "boolean",
          "required": false,
          "secret": false,
          "description": "Return only broken/error/blocked/redirect links, not healthy ones."
        },
        {
          "key": "useProxy",
          "type": "boolean",
          "required": false,
          "secret": false,
          "description": "Route page crawling through a proxy for sites that block datacenter IPs."
        },
        {
          "key": "maxConcurrency",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Crawl/check speed."
        },
        {
          "key": "maxItems",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Hard cap on rows. Strictly enforced."
        }
      ]
    },
    {
      "slug": "ai-brand-visibility-tracker",
      "entry": "012",
      "title": "AI Brand Visibility Tracker — ChatGPT, Perplexity, Gemini",
      "description": "Ask AI assistants the questions your customers ask. Track brand mentions and competitor rank per answer; Perplexity runs include provider citations, while other modes label URLs found in the answer. Bring your own API keys.",
      "categories": [
        "MARKETING",
        "AI"
      ],
      "url": "https://alaudinburki-scrapers.pages.dev/scrapers/ai-brand-visibility-tracker/",
      "apifyUrl": "https://apify.com/alaudinburki/ai-brand-visibility-tracker",
      "usage": {
        "runs": 48,
        "users": 2,
        "lastRun": "2026-10-16"
      },
      "outputSchema": [
        {
          "key": "provider",
          "type": "string",
          "nullable": true,
          "description": "The AI provider this row measured.",
          "example": "openai"
        },
        {
          "key": "model",
          "type": "string",
          "nullable": true,
          "description": "The model that produced this answer.",
          "example": "gpt-4.1"
        },
        {
          "key": "sampleIndex",
          "type": "integer",
          "nullable": true,
          "description": "Which sample run this row came from, when the same prompt is asked more than once.",
          "example": "0"
        },
        {
          "key": "answerMode",
          "type": "string",
          "nullable": true,
          "description": "Whether the answer came from the model's own knowledge or from live search.",
          "example": "<answerMode>"
        },
        {
          "key": "citationMode",
          "type": "string",
          "nullable": true,
          "description": "How citations were presented in the answer.",
          "example": "<citationMode>"
        },
        {
          "key": "brandCited",
          "type": "boolean",
          "nullable": true,
          "description": "Whether the brand was cited in the answer.",
          "example": "true"
        },
        {
          "key": "competitorsCited",
          "type": "string",
          "nullable": true,
          "description": "Competitor domains the answer cited.",
          "example": "<competitorsCited>"
        },
        {
          "key": "prompt",
          "type": "string",
          "nullable": true,
          "description": "The prompt this record resulted from.",
          "example": "<prompt>"
        },
        {
          "key": "mentioned",
          "type": "boolean",
          "nullable": true,
          "description": "Whether the brand was mentioned at all.",
          "example": "true"
        },
        {
          "key": "rankAmongTracked",
          "type": "integer",
          "nullable": true,
          "description": "Rank within the set this run tracked.",
          "example": "0"
        },
        {
          "key": "competitorsMentioned",
          "type": "string",
          "nullable": true,
          "description": "Competitors mentioned in the answer.",
          "example": "<competitorsMentioned>"
        },
        {
          "key": "citedDomains",
          "type": "string",
          "nullable": true,
          "description": "Domains the answer cited.",
          "example": "<citedDomains>"
        }
      ],
      "inputs": [
        {
          "key": "brandName",
          "type": "string",
          "required": true,
          "secret": false,
          "description": "The brand or product name to look for in AI answers, e.g. Notion."
        },
        {
          "key": "brandAliases",
          "type": "array",
          "required": false,
          "secret": false,
          "description": "Other names the AI might use for the same brand (old names, abbreviations, product lines). Counted as brand mentions."
        },
        {
          "key": "brandDomain",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "For citation analysis only, e.g. notion.so. Perplexity rows can then show whether an official brand domain was cited. Leave blank if you only want name mentions."
        },
        {
          "key": "competitors",
          "type": "array",
          "required": false,
          "secret": false,
          "description": "Competitor names to track in the same answers. Rank is the order of first mention among your brand and these names."
        },
        {
          "key": "competitorDomains",
          "type": "object",
          "required": false,
          "secret": false,
          "description": "Map each tracked competitor name to its official domain, e.g. {\"Evernote\": \"evernote.com\"}. Used only for provider-citation analysis."
        },
        {
          "key": "topic",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "What your customers would ask about, e.g. 'note-taking apps'. Generates a 5-question panel (best/recommend/compare/choose/list). Ignored if you supply custom prompts below."
        },
        {
          "key": "prompts",
          "type": "array",
          "required": false,
          "secret": false,
          "description": "Your own questions, one per line. If set, these replace the auto-generated panel."
        },
        {
          "key": "openaiApiKey",
          "type": "string",
          "required": false,
          "secret": true,
          "description": "Secret — supply your own value."
        },
        {
          "key": "openaiWebSearch",
          "type": "boolean",
          "required": false,
          "secret": false,
          "description": "Optional and off by default. Uses OpenAI's Responses API web_search tool, forces a live search for each question, and records provider-returned sources. This can cost more than a normal model answer."
        },
        {
          "key": "anthropicApiKey",
          "type": "string",
          "required": false,
          "secret": true,
          "description": "Secret — supply your own value."
        },
        {
          "key": "perplexityApiKey",
          "type": "string",
          "required": false,
          "secret": true,
          "description": "Secret — supply your own value."
        },
        {
          "key": "geminiApiKey",
          "type": "string",
          "required": false,
          "secret": true,
          "description": "Secret — supply your own value."
        },
        {
          "key": "models",
          "type": "object",
          "required": false,
          "secret": false,
          "description": "Optional model per provider, e.g. {\"openai\": \"gpt-4o\", \"anthropic\": \"claude-opus-5\"}. Leave empty for the cost-efficient defaults."
        },
        {
          "key": "runsPerPrompt",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Repeat each provider-question pair to measure answer variation. Start with 1; use 5 or more before treating the displayed confidence range as a useful directional signal. Each sample uses your provider API and counts toward max answers."
        },
        {
          "key": "promptSetVersion",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "Label this exact question panel, for example 2026-Q3. Change it when you intentionally change prompts, competitors, or measurement design; history comparisons will then safely start a new baseline."
        },
        {
          "key": "historyStoreId",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "For recurring measurement, enter a reusable named Apify key-value store. The next compatible run then reports visibility and rank deltas. Leave blank for a one-off scan."
        },
        {
          "key": "historyKey",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "Use a different key for each brand or market panel that shares the same history store."
        },
        {
          "key": "maxItems",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Hard limit on analyzed answers (providers × questions). Strictly enforced — you will never be charged for more than this."
        }
      ]
    },
    {
      "slug": "prediction-markets-unified",
      "entry": "013",
      "title": "Prediction Markets — Polymarket & Kalshi, One Schema",
      "description": "Live prices, volume and liquidity from Polymarket and Kalshi in one unified, CSV-ready dataset — so you can compare or arbitrage across both venues without writing two parsers. Free public APIs, no keys.",
      "categories": [
        "BUSINESS",
        "NEWS"
      ],
      "url": "https://alaudinburki-scrapers.pages.dev/scrapers/prediction-markets-unified/",
      "apifyUrl": "https://apify.com/alaudinburki/prediction-markets-unified",
      "usage": {
        "runs": 48,
        "users": 2,
        "lastRun": "2026-10-16"
      },
      "outputSchema": [
        {
          "key": "source",
          "type": "string",
          "nullable": true,
          "description": "Which upstream source produced this row.",
          "example": "official public API"
        },
        {
          "key": "question",
          "type": "string",
          "nullable": true,
          "description": "The question this record answers.",
          "example": "<question>"
        },
        {
          "key": "category",
          "type": "string",
          "nullable": true,
          "description": "Category this record belongs to, as classified upstream.",
          "example": "electronics"
        },
        {
          "key": "yesPrice",
          "type": "number",
          "nullable": true,
          "description": "Implied probability of the outcome, between 0 and 1.",
          "example": "0"
        },
        {
          "key": "noPrice",
          "type": "number",
          "nullable": true,
          "description": "Whether the listing has no published price.",
          "example": "0"
        },
        {
          "key": "volume",
          "type": "number",
          "nullable": true,
          "description": "Trading volume over the measured period.",
          "example": "31157278261"
        },
        {
          "key": "liquidity",
          "type": "number",
          "nullable": true,
          "description": "Liquidity measure as the source defines it.",
          "example": "0"
        },
        {
          "key": "status",
          "type": "string",
          "nullable": true,
          "description": "Outcome recorded for this row.",
          "example": "ok"
        },
        {
          "key": "url",
          "type": "string",
          "nullable": true,
          "description": "The URL this row describes.",
          "example": "https://example.com/pricing"
        }
      ],
      "inputs": [
        {
          "key": "sources",
          "type": "array",
          "required": false,
          "secret": false,
          "description": "Which venues to include: polymarket, kalshi, or both."
        },
        {
          "key": "query",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "Keep only markets whose question, category or ticker contains this text (case-insensitive). Leave empty for all."
        },
        {
          "key": "onlyOpen",
          "type": "boolean",
          "required": false,
          "secret": false,
          "description": "On: only markets currently trading. Off: also include closed/resolved markets."
        },
        {
          "key": "minVolume",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Drop markets with total volume below this. Leave empty to keep all."
        },
        {
          "key": "maxItems",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Hard limit on returned markets. Strictly enforced — you will never be charged for more than this."
        }
      ]
    },
    {
      "slug": "docs-to-answers",
      "entry": "014",
      "title": "Docs to Answers Pack — Citable AI-Ready Chunks",
      "description": "Turn a documentation site into a corpus an AI can answer FROM and CITE. Splits on headings rather than character counts, attaches a heading path and deep link to every chunk, drops boilerplate that repeats across pages, and hashes each chunk so you re-embed only what changed.",
      "categories": [
        "AI",
        "DEVELOPER_TOOLS"
      ],
      "url": "https://alaudinburki-scrapers.pages.dev/scrapers/docs-to-answers/",
      "apifyUrl": "https://apify.com/alaudinburki/docs-to-answers",
      "usage": {
        "runs": 47,
        "users": 2,
        "lastRun": "2026-10-16"
      },
      "outputSchema": [
        {
          "key": "chunkId",
          "type": "string",
          "nullable": true,
          "description": "Stable identifier for this chunk, derived from its content so it survives re-runs.",
          "example": "<chunkId>"
        },
        {
          "key": "text",
          "type": "string",
          "nullable": true,
          "description": "Plain text content of this record.",
          "example": "<text>"
        },
        {
          "key": "headingPath",
          "type": "string",
          "nullable": true,
          "description": "Full heading path from the page root, joined with ' > '.",
          "example": "<headingPath>"
        },
        {
          "key": "heading",
          "type": "string",
          "nullable": true,
          "description": "Heading this record sits under.",
          "example": "<heading>"
        },
        {
          "key": "sourceUrl",
          "type": "string",
          "nullable": true,
          "description": "The page or endpoint this row was read from.",
          "example": "https://api.example.com/v1/items"
        },
        {
          "key": "citationUrl",
          "type": "string",
          "nullable": true,
          "description": "URL the answer cited.",
          "example": "<citationUrl>"
        },
        {
          "key": "pageTitle",
          "type": "string",
          "nullable": true,
          "description": "Title of the page this record was read from.",
          "example": "<pageTitle>"
        },
        {
          "key": "position",
          "type": "integer",
          "nullable": true,
          "description": "Position in the source's ordering.",
          "example": "3"
        },
        {
          "key": "tokensEstimate",
          "type": "integer",
          "nullable": true,
          "description": "Estimated token count of the text, for sizing against a model context window.",
          "example": "1180"
        },
        {
          "key": "charCount",
          "type": "integer",
          "nullable": true,
          "description": "Number of characters in this record's text.",
          "example": "4821"
        },
        {
          "key": "contentHash",
          "type": "string",
          "nullable": true,
          "description": "Hash of this record's content.",
          "example": "a8f3c9e1b2d40456"
        },
        {
          "key": "duplicateCount",
          "type": "integer",
          "nullable": true,
          "description": "Rows that repeat a value already seen in this run.",
          "example": "0"
        },
        {
          "key": "changeType",
          "type": "string",
          "nullable": true,
          "description": "What changed: initial, content, status, or a combination.",
          "example": "content"
        },
        {
          "key": "mergedHeadings",
          "type": "string",
          "nullable": true,
          "description": "Headings merged into one line, for compact display.",
          "example": "<mergedHeadings>"
        }
      ],
      "inputs": [
        {
          "key": "startUrls",
          "type": "array",
          "required": false,
          "secret": false,
          "description": "Where to start crawling. Point it at a docs homepage or section index."
        },
        {
          "key": "pathPrefix",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "Only crawl URLs whose path starts with this, e.g. /docs. The single most effective way to keep a blog or marketing site out of your corpus."
        },
        {
          "key": "maxPages",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Upper bound on pages fetched."
        },
        {
          "key": "followLinks",
          "type": "boolean",
          "required": false,
          "secret": false,
          "description": "Crawl onward from the pages given. Turn off to process only the exact URLs supplied."
        },
        {
          "key": "sameOriginOnly",
          "type": "boolean",
          "required": false,
          "secret": false,
          "description": "Only follow links on the same domain as the start URL. Turn off only if your docs span subdomains."
        },
        {
          "key": "maxChunkChars",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Chunks split on headings first and size second, so this is a ceiling rather than a target. ~1500 chars suits most embedding models."
        },
        {
          "key": "minChunkChars",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Anything smaller is folded into the previous chunk instead of being emitted as an unanswerable fragment."
        },
        {
          "key": "overlapChars",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Repeat this many characters from the previous chunk so a sentence spanning a boundary stays retrievable from both sides."
        },
        {
          "key": "dropRepeatedBoilerplate",
          "type": "boolean",
          "required": false,
          "secret": false,
          "description": "Remove chunks that repeat across pages — \"Was this page helpful?\", licence footers, the same admonition on 90 pages. These match every query and answer none."
        },
        {
          "key": "nearDuplicateDetection",
          "type": "boolean",
          "required": false,
          "secret": false,
          "description": "Catch boilerplate that differs by a word or two, not just exact repeats."
        },
        {
          "key": "incrementalMode",
          "type": "boolean",
          "required": false,
          "secret": false,
          "description": "Store a hash per chunk and label each one added / changed / unchanged / removed on the next run. For scheduled refreshes, also provide a Snapshot store ID or name so the baseline survives separate runs."
        },
        {
          "key": "changedOnly",
          "type": "boolean",
          "required": false,
          "secret": false,
          "description": "With incremental mode on, return just the added and changed chunks. Turns this into a scheduled corpus-refresh job."
        },
        {
          "key": "snapshotKey",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "Key-value store key holding the previous run's hashes. Use different keys to track several corpora independently."
        },
        {
          "key": "snapshotStoreId",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "Which named key-value store holds the previous run's hashes. Leave blank to use the shared default store \"docs-to-answers-state\", which is what makes change tracking work between scheduled runs. Set it explicitly to track several corpora independently."
        },
        {
          "key": "concurrency",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "How many pages to fetch at once. Lower it if the docs site is rate-limiting you."
        },
        {
          "key": "maxItems",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Hard cap on results. You are never charged beyond this."
        },
        {
          "key": "proxyConfiguration",
          "type": "object",
          "required": false,
          "secret": false,
          "description": "Optional. Most documentation sites need no proxy."
        },
        {
          "key": "targetChunkChars",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Consecutive short sections on the same page are merged until they reach roughly this size. A 30-token chunk cannot answer a question — it only adds noise to retrieval. Set to 0 to keep every heading as its own chunk."
        }
      ]
    },
    {
      "slug": "pdf-text-extractor",
      "entry": "015",
      "title": "PDF Text Extractor — Text & Metadata from URLs",
      "description": "Download PDF files by URL and extract their text and metadata (page count, title, author) — whole-document or per-page. Honest per-URL status. No auth.",
      "categories": [
        "DEVELOPER_TOOLS",
        "AUTOMATION"
      ],
      "url": "https://alaudinburki-scrapers.pages.dev/scrapers/pdf-text-extractor/",
      "apifyUrl": "https://apify.com/alaudinburki/pdf-text-extractor",
      "usage": {
        "runs": 47,
        "users": 1,
        "lastRun": "2026-10-15"
      },
      "outputSchema": [
        {
          "key": "url",
          "type": "string",
          "nullable": true,
          "description": "The URL this row describes.",
          "example": "https://example.com/pricing"
        },
        {
          "key": "status",
          "type": "string",
          "nullable": true,
          "description": "Outcome recorded for this row.",
          "example": "ok"
        },
        {
          "key": "pages",
          "type": "integer",
          "nullable": true,
          "description": "Total pages seen or fetched.",
          "example": "0"
        },
        {
          "key": "totalPages",
          "type": "integer",
          "nullable": true,
          "description": "Total pages available or fetched.",
          "example": "0"
        },
        {
          "key": "page",
          "type": "integer",
          "nullable": true,
          "description": "Page number this record came from. 1-based.",
          "example": "1"
        },
        {
          "key": "title",
          "type": "string",
          "nullable": true,
          "description": "Title as the source writes it.",
          "example": "Wireless Bluetooth Headphones"
        },
        {
          "key": "author",
          "type": "string",
          "nullable": true,
          "description": "Author of this record, as the source publishes it.",
          "example": "jane.cooper"
        },
        {
          "key": "charCount",
          "type": "integer",
          "nullable": true,
          "description": "Number of characters in this record's text.",
          "example": "4821"
        },
        {
          "key": "text",
          "type": "string",
          "nullable": true,
          "description": "Plain text content of this record.",
          "example": "<text>"
        },
        {
          "key": "error",
          "type": "string",
          "nullable": true,
          "description": "Why this row failed, when it did. Null on success.",
          "example": "<error>"
        }
      ],
      "inputs": [
        {
          "key": "pdfUrls",
          "type": "array",
          "required": true,
          "secret": false,
          "description": "Direct links to PDF files."
        },
        {
          "key": "perPage",
          "type": "boolean",
          "required": false,
          "secret": false,
          "description": "Off: one row per PDF (full text). On: one row per page."
        },
        {
          "key": "useProxy",
          "type": "boolean",
          "required": false,
          "secret": false,
          "description": "For hosts that block datacenter IPs."
        },
        {
          "key": "maxItems",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Hard cap."
        }
      ]
    },
    {
      "slug": "sec-edgar-filings",
      "entry": "016",
      "title": "SEC EDGAR Filings — 8-K, 10-K & Insider Forms",
      "description": "Pull SEC filings for any US-listed company and get the meaning, not just the form code: 8-K items decoded into plain language, material events flagged (bankruptcy, exec change, acquisition, restatement), newest first. Free official SEC data, no key.",
      "categories": [
        "BUSINESS",
        "DEVELOPER_TOOLS"
      ],
      "url": "https://alaudinburki-scrapers.pages.dev/scrapers/sec-edgar-filings/",
      "apifyUrl": "https://apify.com/alaudinburki/sec-edgar-filings",
      "usage": {
        "runs": 46,
        "users": 2,
        "lastRun": "2026-10-16"
      },
      "outputSchema": [
        {
          "key": "company",
          "type": "string",
          "nullable": true,
          "description": "Company name as the source writes it.",
          "example": "Northwind Traders"
        },
        {
          "key": "ticker",
          "type": "string",
          "nullable": true,
          "description": "Stock ticker symbol as the source writes it.",
          "example": "<ticker>"
        },
        {
          "key": "cik",
          "type": "string",
          "nullable": true,
          "description": "Central Index Key, the SEC's identifier for a filer.",
          "example": "<cik>"
        },
        {
          "key": "formType",
          "type": "string",
          "nullable": true,
          "description": "Form type as the source labels it.",
          "example": "<formType>"
        },
        {
          "key": "signal",
          "type": "string",
          "nullable": true,
          "description": "The signal this row represents.",
          "example": "new posting"
        },
        {
          "key": "materialEvent",
          "type": "boolean",
          "nullable": true,
          "description": "Whether the change is material to the entity.",
          "example": "true"
        },
        {
          "key": "filingDate",
          "type": "string",
          "nullable": true,
          "description": "Date the filing was received or processed, when published.",
          "example": "2026-09-03T00:00:00"
        },
        {
          "key": "reportDate",
          "type": "string",
          "nullable": true,
          "description": "Date the report was issued.",
          "example": "2026-10-15"
        },
        {
          "key": "items",
          "type": "string",
          "nullable": true,
          "description": "The items this record carries.",
          "example": "[{\"id\":\"1\",\"name\":\"Widget\"}]"
        },
        {
          "key": "ageDays",
          "type": "integer",
          "nullable": true,
          "description": "Age of this item in days.",
          "example": "0"
        },
        {
          "key": "accessionNumber",
          "type": "string",
          "nullable": true,
          "description": "SEC accession number identifying one filing.",
          "example": "<accessionNumber>"
        },
        {
          "key": "filingUrl",
          "type": "string",
          "nullable": true,
          "description": "Link to the filing at its source.",
          "example": "<filingUrl>"
        },
        {
          "key": "documentDescription",
          "type": "string",
          "nullable": true,
          "description": "Description of the document, as published by the source.",
          "example": "<documentDescription>"
        },
        {
          "key": "isXBRL",
          "type": "boolean",
          "nullable": true,
          "description": "Whether the filing carries machine-readable XBRL data.",
          "example": "true"
        }
      ],
      "inputs": [
        {
          "key": "tickers",
          "type": "array",
          "required": false,
          "secret": false,
          "description": "Stock tickers, e.g. AAPL, TSLA. Resolved to SEC CIKs automatically."
        },
        {
          "key": "ciks",
          "type": "array",
          "required": false,
          "secret": false,
          "description": "SEC CIK numbers, if you already have them. Zero-padding is handled for you."
        },
        {
          "key": "contactEmail",
          "type": "string",
          "required": true,
          "secret": false,
          "description": "The SEC's fair-access policy requires a contact address in the request header. It is sent only to the SEC, never stored or shared."
        },
        {
          "key": "formTypes",
          "type": "array",
          "required": false,
          "secret": false,
          "description": "Filter by form, e.g. 8-K, 10-K, 10-Q, 4, S-1, SC 13D. Leave empty for all forms. Prefix match, so \"10-\" catches 10-K and 10-Q."
        },
        {
          "key": "sinceDate",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "YYYY-MM-DD. Leave empty for the company's full recent history."
        },
        {
          "key": "materialEventsOnly",
          "type": "boolean",
          "required": false,
          "secret": false,
          "description": "Return only filings flagged as material — bankruptcy, restatement, executive change, acquisition, earnings, activist stake, delisting risk and similar."
        },
        {
          "key": "maxPerCompany",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Caps how far back to read per company."
        },
        {
          "key": "maxItems",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Hard limit, strictly enforced. You are never charged beyond this."
        }
      ]
    },
    {
      "slug": "wayback-machine-snapshots",
      "entry": "017",
      "title": "Wayback Machine Scraper — Website History & Snapshots",
      "description": "Extract every Wayback Machine (archive.org) snapshot of any URL, domain or subdomain — capture date, HTTP status, MIME type, content digest, byte size and direct snapshot links. Up to 50,000 rows, many URLs per run, $0.50 per 1,000 rows. No API key.",
      "categories": [
        "DEVELOPER_TOOLS",
        "SEO_TOOLS",
        "AI"
      ],
      "url": "https://alaudinburki-scrapers.pages.dev/scrapers/wayback-machine-snapshots/",
      "apifyUrl": "https://apify.com/alaudinburki/wayback-machine-snapshots",
      "usage": {
        "runs": 46,
        "users": 2,
        "lastRun": "2026-10-16"
      },
      "outputSchema": [
        {
          "key": "inputUrl",
          "type": "string",
          "nullable": true,
          "description": "The input URL this row was produced for. Present on multi-URL runs so rows stay attributable.",
          "example": "example.com/pricing"
        },
        {
          "key": "timestamp",
          "type": "string",
          "nullable": true,
          "description": "The source's own timestamp for this record, unmodified.",
          "example": "20231015143022"
        },
        {
          "key": "capturedAt",
          "type": "string",
          "nullable": true,
          "description": "ISO 8601 timestamp of when this record was captured or archived.",
          "example": "2026-10-16T08:17:07.000Z"
        },
        {
          "key": "original",
          "type": "string",
          "nullable": true,
          "description": "The URL exactly as it was captured or found.",
          "example": "https://example.com/pricing"
        },
        {
          "key": "snapshotUrl",
          "type": "string",
          "nullable": true,
          "description": "Direct link to view this record at its source.",
          "example": "https://web.archive.org/web/20231015143022/https://apify.com/"
        },
        {
          "key": "mimeType",
          "type": "string",
          "nullable": true,
          "description": "MIME type of the content.",
          "example": "text/html"
        },
        {
          "key": "statusCode",
          "type": "integer",
          "nullable": true,
          "description": "HTTP status code recorded for this record.",
          "example": "200"
        },
        {
          "key": "digest",
          "type": "string",
          "nullable": true,
          "description": "Content hash. Two rows with the same digest hold identical content.",
          "example": "UXM5L6MWWKE4YESNBTX2OENTT62FEW4Y"
        },
        {
          "key": "length",
          "type": "integer",
          "nullable": true,
          "description": "Size of the content in bytes.",
          "example": "48523"
        }
      ],
      "inputs": [
        {
          "key": "urls",
          "type": "array",
          "required": true,
          "secret": false,
          "description": "URLs (or domains) to list snapshots for."
        },
        {
          "key": "matchType",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "exact, prefix, host, or domain (domain = all subpages/subdomains)."
        },
        {
          "key": "from",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "YYYY-MM-DD (optional)."
        },
        {
          "key": "to",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "YYYY-MM-DD (optional)."
        },
        {
          "key": "collapseDuplicates",
          "type": "boolean",
          "required": false,
          "secret": false,
          "description": "Skip snapshots identical to the previous (by content digest)."
        },
        {
          "key": "maxSnapshotsPerUrl",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Cap per URL."
        },
        {
          "key": "maxItems",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Hard cap overall."
        }
      ]
    },
    {
      "slug": "ai-crawler-audit",
      "entry": "018",
      "title": "AI Crawler Audit — Are You Blocking ChatGPT?",
      "description": "Check whether your site is visible to AI search or accidentally blocking it. Audits robots.txt for GPTBot, OAI-SearchBot, ClaudeBot, PerplexityBot, Google-Extended and 7 more, detects llms.txt, and returns an AI-readiness score with the exact fixes. No key, no login.",
      "categories": [
        "SEO_TOOLS",
        "DEVELOPER_TOOLS"
      ],
      "url": "https://alaudinburki-scrapers.pages.dev/scrapers/ai-crawler-audit/",
      "apifyUrl": "https://apify.com/alaudinburki/ai-crawler-audit",
      "usage": {
        "runs": 45,
        "users": 2,
        "lastRun": "2026-10-15"
      },
      "outputSchema": [
        {
          "key": "domain",
          "type": "string",
          "nullable": true,
          "description": "Domain name, without the scheme.",
          "example": "example.com"
        },
        {
          "key": "aiReadinessScore",
          "type": "integer",
          "nullable": true,
          "description": "How ready this site is for AI crawlers, from 0 to 100.",
          "example": "0"
        },
        {
          "key": "aiSearchReadiness",
          "type": "string",
          "nullable": true,
          "description": "Readiness for AI search in words.",
          "example": "<aiSearchReadiness>"
        },
        {
          "key": "blocksAiSearch",
          "type": "boolean",
          "nullable": true,
          "description": "Whether the site blocks AI search crawlers.",
          "example": "true"
        },
        {
          "key": "blockedSearchBots",
          "type": "string",
          "nullable": true,
          "description": "Search crawlers the site blocks.",
          "example": "<blockedSearchBots>"
        },
        {
          "key": "blockedBots",
          "type": "string",
          "nullable": true,
          "description": "User agents the site blocks.",
          "example": "<blockedBots>"
        },
        {
          "key": "hasLlmsTxt",
          "type": "boolean",
          "nullable": true,
          "description": "Whether the site publishes an llms.txt file.",
          "example": "true"
        },
        {
          "key": "llmsTitle",
          "type": "string",
          "nullable": true,
          "description": "Title the site publishes in its llms.txt.",
          "example": "<llmsTitle>"
        },
        {
          "key": "allowedBotCount",
          "type": "integer",
          "nullable": true,
          "description": "How many of the checked bots are allowed.",
          "example": "0"
        },
        {
          "key": "totalBotsChecked",
          "type": "integer",
          "nullable": true,
          "description": "How many bots were checked.",
          "example": "0"
        },
        {
          "key": "sitemapCount",
          "type": "integer",
          "nullable": true,
          "description": "How many sitemaps were found.",
          "example": "0"
        },
        {
          "key": "robotsStatus",
          "type": "integer",
          "nullable": true,
          "description": "Outcome of reading robots.txt.",
          "example": "0"
        },
        {
          "key": "recommendations",
          "type": "string",
          "nullable": true,
          "description": "The recommended actions for this row.",
          "example": "[\"Declare a canonical URL\",\"Publish a sitemap\"]"
        },
        {
          "key": "status",
          "type": "string",
          "nullable": true,
          "description": "Outcome recorded for this row.",
          "example": "ok"
        }
      ],
      "inputs": [
        {
          "key": "domains",
          "type": "array",
          "required": true,
          "secret": false,
          "description": "Domains or URLs to audit. Scheme, www and path are stripped automatically."
        },
        {
          "key": "onlyBlockedSites",
          "type": "boolean",
          "required": false,
          "secret": false,
          "description": "Filter the output down to the sites with a real problem — useful when auditing a long client list."
        },
        {
          "key": "includeBotDetail",
          "type": "boolean",
          "required": false,
          "secret": false,
          "description": "Adds a botDetail array with the verdict and matched robots.txt rule for every AI crawler checked."
        },
        {
          "key": "useProxy",
          "type": "boolean",
          "required": false,
          "secret": false,
          "description": "Route requests through Apify Proxy. Rarely needed — robots.txt is public."
        },
        {
          "key": "maxItems",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Hard limit, strictly enforced. You are never charged beyond this."
        }
      ]
    },
    {
      "slug": "google-news-scraper",
      "entry": "019",
      "title": "Google News Scraper — Search, Topics & RSS Feeds",
      "description": "Fetch Google News articles by keyword search or topic (title, source, link, date, snippet) via the public RSS feed — deduplicated, newest-first, with keyword and age filters. No API key.",
      "categories": [
        "NEWS",
        "SEO_TOOLS"
      ],
      "url": "https://alaudinburki-scrapers.pages.dev/scrapers/google-news-scraper/",
      "apifyUrl": "https://apify.com/alaudinburki/google-news-scraper",
      "usage": {
        "runs": 45,
        "users": 2,
        "lastRun": "2026-10-16"
      },
      "outputSchema": [
        {
          "key": "query",
          "type": "string",
          "nullable": true,
          "description": "The query that produced this row.",
          "example": "shopify scraper"
        },
        {
          "key": "title",
          "type": "string",
          "nullable": true,
          "description": "Title as the source writes it.",
          "example": "Wireless Bluetooth Headphones"
        },
        {
          "key": "source",
          "type": "string",
          "nullable": true,
          "description": "Which upstream source produced this row.",
          "example": "official public API"
        },
        {
          "key": "link",
          "type": "string",
          "nullable": true,
          "description": "Direct link to this record at its source.",
          "example": "https://example.com/listing/1"
        },
        {
          "key": "publishedAt",
          "type": "string",
          "nullable": true,
          "description": "ISO 8601 timestamp of publication.",
          "example": "2026-10-15T09:00:00.000Z"
        },
        {
          "key": "snippet",
          "type": "string",
          "nullable": true,
          "description": "Text excerpt around the match. Whitespace is collapsed.",
          "example": "<snippet>"
        },
        {
          "key": "rank",
          "type": "integer",
          "nullable": true,
          "description": "Position in the source's own ordering. 1 is highest.",
          "example": "1"
        },
        {
          "key": "guid",
          "type": "string",
          "nullable": true,
          "description": "Guid as recorded for this row.",
          "example": "<guid>"
        }
      ],
      "inputs": [
        {
          "key": "queries",
          "type": "array",
          "required": false,
          "secret": false,
          "description": "Keywords to search Google News for."
        },
        {
          "key": "topics",
          "type": "array",
          "required": false,
          "secret": false,
          "description": "Google News topics: WORLD, NATION, BUSINESS, TECHNOLOGY, ENTERTAINMENT, SPORTS, SCIENCE, HEALTH."
        },
        {
          "key": "language",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "Two-letter language code (en, es, de...)."
        },
        {
          "key": "country",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "Two-letter country code (US, GB, IN...)."
        },
        {
          "key": "mustInclude",
          "type": "array",
          "required": false,
          "secret": false,
          "description": "Keep only articles whose title/snippet contains one of these."
        },
        {
          "key": "maxAgeHours",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "e.g. 24 for the last day."
        },
        {
          "key": "maxItems",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Hard cap. Strictly enforced."
        }
      ]
    },
    {
      "slug": "ats-jobs-scraper",
      "entry": "020",
      "title": "ATS Jobs Scraper — Greenhouse, Lever, Ashby",
      "description": "Get open jobs from any company on Greenhouse, Lever, or Ashby in one unified schema — title, location, department, type, url, posted date. Public JSON APIs, no auth. Pairs with the job-change monitor.",
      "categories": [
        "JOBS",
        "LEAD_GENERATION"
      ],
      "url": "https://alaudinburki-scrapers.pages.dev/scrapers/ats-jobs-scraper/",
      "apifyUrl": "https://apify.com/alaudinburki/ats-jobs-scraper",
      "usage": {
        "runs": 43,
        "users": 2,
        "lastRun": "2026-10-16"
      },
      "outputSchema": [
        {
          "key": "provider",
          "type": "string",
          "nullable": true,
          "description": "The AI provider this row measured.",
          "example": "openai"
        },
        {
          "key": "company",
          "type": "string",
          "nullable": true,
          "description": "Company name as the source writes it.",
          "example": "Northwind Traders"
        },
        {
          "key": "title",
          "type": "string",
          "nullable": true,
          "description": "Title as the source writes it.",
          "example": "Wireless Bluetooth Headphones"
        },
        {
          "key": "location",
          "type": "string",
          "nullable": true,
          "description": "Location as the source writes it.",
          "example": "Austin, TX"
        },
        {
          "key": "department",
          "type": "string",
          "nullable": true,
          "description": "Government department the contract or grant belongs to.",
          "example": "Transportation"
        },
        {
          "key": "employmentType",
          "type": "string",
          "nullable": true,
          "description": "Employment type as posted.",
          "example": "<employmentType>"
        },
        {
          "key": "url",
          "type": "string",
          "nullable": true,
          "description": "The URL this row describes.",
          "example": "https://example.com/pricing"
        },
        {
          "key": "postedAt",
          "type": "string",
          "nullable": true,
          "description": "ISO 8601 timestamp of when this was posted.",
          "example": "2026-10-14T00:00:00.000Z"
        }
      ],
      "inputs": [
        {
          "key": "boards",
          "type": "array",
          "required": false,
          "secret": false,
          "description": "provider:company entries, e.g. greenhouse:stripe, lever:netflix, ashby:ramp."
        },
        {
          "key": "companies",
          "type": "array",
          "required": false,
          "secret": false,
          "description": "Company slugs to try across all three providers."
        },
        {
          "key": "titleIncludes",
          "type": "array",
          "required": false,
          "secret": false,
          "description": "Keep only roles whose title contains one of these."
        },
        {
          "key": "titleExcludes",
          "type": "array",
          "required": false,
          "secret": false,
          "description": "Drop roles whose title contains any of these."
        },
        {
          "key": "locationIncludes",
          "type": "array",
          "required": false,
          "secret": false,
          "description": "Keep only roles whose location contains one of these (e.g. remote)."
        },
        {
          "key": "maxItems",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Hard cap. Strictly enforced."
        }
      ]
    },
    {
      "slug": "itunes-app-store-search",
      "entry": "021",
      "title": "iTunes & App Store Search — Apps, Podcasts, Media",
      "description": "Search Apple's App Store and iTunes for apps, podcasts, music, books, and movies, or look items up by ID — normalized into one schema with ratings, price, genre, artwork and URLs. Public API, no auth.",
      "categories": [
        "ECOMMERCE",
        "DEVELOPER_TOOLS"
      ],
      "url": "https://alaudinburki-scrapers.pages.dev/scrapers/itunes-app-store-search/",
      "apifyUrl": "https://apify.com/alaudinburki/itunes-app-store-search",
      "usage": {
        "runs": 43,
        "users": 2,
        "lastRun": "2026-10-16"
      },
      "outputSchema": [
        {
          "key": "query",
          "type": "string",
          "nullable": true,
          "description": "The query that produced this row.",
          "example": "shopify scraper"
        },
        {
          "key": "name",
          "type": "string",
          "nullable": true,
          "description": "Display name as the source writes it.",
          "example": "Bitcoin"
        },
        {
          "key": "artist",
          "type": "string",
          "nullable": true,
          "description": "Artist the track or release is credited to.",
          "example": "<artist>"
        },
        {
          "key": "type",
          "type": "string",
          "nullable": true,
          "description": "Type of this record, as classified by the Actor.",
          "example": "article"
        },
        {
          "key": "genre",
          "type": "string",
          "nullable": true,
          "description": "Genre classification.",
          "example": "Documentary"
        },
        {
          "key": "price",
          "type": "string",
          "nullable": true,
          "description": "Price as reported by the source. Currency is given by the currency field.",
          "example": "9.99"
        },
        {
          "key": "averageRating",
          "type": "number",
          "nullable": true,
          "description": "Mean rating across the reviews counted.",
          "example": "0"
        },
        {
          "key": "ratingCount",
          "type": "integer",
          "nullable": true,
          "description": "How many ratings the source counts.",
          "example": "0"
        },
        {
          "key": "url",
          "type": "string",
          "nullable": true,
          "description": "The URL this row describes.",
          "example": "https://example.com/pricing"
        },
        {
          "key": "ratingTier",
          "type": "string",
          "nullable": true,
          "description": "Band the rating falls into.",
          "example": "<ratingTier>"
        },
        {
          "key": "popularity",
          "type": "string",
          "nullable": true,
          "description": "Popularity measure as the source publishes it.",
          "example": "74"
        }
      ],
      "inputs": [
        {
          "key": "terms",
          "type": "array",
          "required": false,
          "secret": false,
          "description": "Keywords to search for."
        },
        {
          "key": "entity",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "What to search for."
        },
        {
          "key": "lookupIds",
          "type": "array",
          "required": false,
          "secret": false,
          "description": "Specific iTunes/App IDs to fetch metadata for."
        },
        {
          "key": "country",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "Two-letter code (us, gb, de...)."
        },
        {
          "key": "limitPerTerm",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Up to 200 per search term."
        },
        {
          "key": "maxItems",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Hard cap. Strictly enforced."
        }
      ]
    },
    {
      "slug": "small-business-website-audit",
      "entry": "022",
      "title": "Website Audit — In Plain English, Not Scores",
      "description": "Audit any list of websites and get findings a business owner actually understands: what is wrong, what it costs them, and the exact fix. Every row ships a paste-ready summary for a client email. No browser, no API key, no anti-bot.",
      "categories": [
        "SEO_TOOLS",
        "BUSINESS"
      ],
      "url": "https://alaudinburki-scrapers.pages.dev/scrapers/small-business-website-audit/",
      "apifyUrl": "https://apify.com/alaudinburki/small-business-website-audit",
      "usage": {
        "runs": 43,
        "users": 2,
        "lastRun": "2026-10-16"
      },
      "outputSchema": [
        {
          "key": "domain",
          "type": "string",
          "nullable": true,
          "description": "Domain name, without the scheme.",
          "example": "example.com"
        },
        {
          "key": "url",
          "type": "string",
          "nullable": true,
          "description": "The URL this row describes.",
          "example": "https://example.com/pricing"
        },
        {
          "key": "auditStatus",
          "type": "string",
          "nullable": true,
          "description": "Outcome of the dependency audit.",
          "example": "<auditStatus>"
        },
        {
          "key": "auditNote",
          "type": "string",
          "nullable": true,
          "description": "Note recorded during the audit.",
          "example": "<auditNote>"
        },
        {
          "key": "score",
          "type": "integer",
          "nullable": true,
          "description": "Score on the Actor's own scale. The scale is stated in the field's own band.",
          "example": "82"
        },
        {
          "key": "grade",
          "type": "object",
          "nullable": false,
          "description": "Letter or numeric grade awarded.",
          "example": "{\"letter\":\"B\",\"score\":78}"
        },
        {
          "key": "verdict",
          "type": "string",
          "nullable": true,
          "description": "The Actor's conclusion for this row, stated in words.",
          "example": "pass"
        },
        {
          "key": "reachable",
          "type": "boolean",
          "nullable": true,
          "description": "Whether the host responded at all.",
          "example": "true"
        },
        {
          "key": "criticalCount",
          "type": "integer",
          "nullable": true,
          "description": "How many critical findings were recorded.",
          "example": "0"
        },
        {
          "key": "importantCount",
          "type": "integer",
          "nullable": true,
          "description": "How many important findings were recorded.",
          "example": "0"
        },
        {
          "key": "minorCount",
          "type": "integer",
          "nullable": true,
          "description": "How many minor findings were recorded.",
          "example": "0"
        },
        {
          "key": "topIssue",
          "type": "string",
          "nullable": true,
          "description": "The highest-priority issue found.",
          "example": "<topIssue>"
        },
        {
          "key": "topIssueFound",
          "type": "string",
          "nullable": true,
          "description": "The highest-priority issue found.",
          "example": "<topIssueFound>"
        },
        {
          "key": "emailSummary",
          "type": "string",
          "nullable": true,
          "description": "One-line summary of the verification result.",
          "example": "<emailSummary>"
        },
        {
          "key": "findings",
          "type": "array",
          "nullable": true,
          "description": "The findings recorded for this row.",
          "example": "[{\"check\":\"title-length\",\"level\":\"warning\",\"detail\":\"Title is 71 characters; 60 or fewer reads better in results.\"}]"
        },
        {
          "key": "passed",
          "type": "array",
          "nullable": true,
          "description": "The checks that passed.",
          "example": "[\"https\",\"robots-txt\",\"canonical\"]"
        },
        {
          "key": "platform",
          "type": "string",
          "nullable": true,
          "description": "Platform this record came from.",
          "example": "<platform>"
        },
        {
          "key": "responseMs",
          "type": "integer",
          "nullable": true,
          "description": "Response time in milliseconds.",
          "example": "412"
        },
        {
          "key": "pageBytes",
          "type": "integer",
          "nullable": true,
          "description": "Size of the fetched page in bytes.",
          "example": "0"
        },
        {
          "key": "auditedAt",
          "type": "string",
          "nullable": true,
          "description": "ISO 8601 timestamp of the most recent audit.",
          "example": "<auditedAt>"
        }
      ],
      "inputs": [
        {
          "key": "domains",
          "type": "array",
          "required": true,
          "secret": false,
          "description": "Domains or full URLs to audit. Paste a client list, or the website column from a Google Maps export."
        },
        {
          "key": "startUrls",
          "type": "array",
          "required": false,
          "secret": false,
          "description": "Same thing in Apify's URL-list format, so this actor chains directly onto another actor's output."
        },
        {
          "key": "maxItems",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Hard limit, strictly enforced — you will never be charged for more than this."
        },
        {
          "key": "minSeverity",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "Trim the findings list. The score and counts always reflect every check."
        },
        {
          "key": "concurrency",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Kept low on purpose. Hitting sites hard makes bot protection return 403, which looks like a broken website but is not one."
        }
      ]
    },
    {
      "slug": "bank-health-lookup",
      "entry": "023",
      "title": "Bank Financial Health Lookup — FDIC BankFind",
      "description": "Bank financial snapshot per charter — total assets, domestic deposits, active status, charter class — from FDIC's free official BankFind data. Asset/deposit figures converted from FDIC's thousands-of-dollars convention to real dollar amounts.",
      "categories": [
        "DEVELOPER_TOOLS",
        "BUSINESS"
      ],
      "url": "https://alaudinburki-scrapers.pages.dev/scrapers/bank-health-lookup/",
      "apifyUrl": "https://apify.com/alaudinburki/bank-health-lookup",
      "usage": {
        "runs": 42,
        "users": 1,
        "lastRun": "2026-10-16"
      },
      "outputSchema": [
        {
          "key": "matchedQuery",
          "type": "string",
          "nullable": true,
          "description": "The query this row matched.",
          "example": "amazon product scraper"
        },
        {
          "key": "name",
          "type": "string",
          "nullable": true,
          "description": "Display name as the source writes it.",
          "example": "Bitcoin"
        },
        {
          "key": "cert",
          "type": "integer",
          "nullable": true,
          "description": "Certificate details for this host.",
          "example": "0"
        },
        {
          "key": "isActive",
          "type": "boolean",
          "nullable": true,
          "description": "Whether the record is still active at the source.",
          "example": "true"
        },
        {
          "key": "totalAssets",
          "type": "number",
          "nullable": true,
          "description": "Total assets in the stated currency.",
          "example": "0"
        },
        {
          "key": "totalDomesticDeposits",
          "type": "number",
          "nullable": true,
          "description": "Total Domestic Deposits as recorded for this row.",
          "example": "0"
        },
        {
          "key": "city",
          "type": "string",
          "nullable": true,
          "description": "City name.",
          "example": "Austin"
        },
        {
          "key": "state",
          "type": "string",
          "nullable": true,
          "description": "State, province or region name.",
          "example": "active"
        },
        {
          "key": "established",
          "type": "string",
          "nullable": true,
          "description": "Date the entity was established.",
          "example": "<established>"
        },
        {
          "key": "charterClass",
          "type": "string",
          "nullable": true,
          "description": "Charter class, for a financial institution.",
          "example": "<charterClass>"
        },
        {
          "key": "charterClassLabel",
          "type": "string",
          "nullable": true,
          "description": "Human-readable label for the charter class.",
          "example": "<charterClassLabel>"
        },
        {
          "key": "status",
          "type": "string",
          "nullable": true,
          "description": "Outcome recorded for this row.",
          "example": "ok"
        },
        {
          "key": "verdict",
          "type": "string",
          "nullable": true,
          "description": "The Actor's conclusion for this row, stated in words.",
          "example": "pass"
        }
      ],
      "inputs": [
        {
          "key": "banks",
          "type": "array",
          "required": true,
          "secret": false,
          "description": "Bank names to look up, e.g. Wells Fargo, JPMorgan Chase. One bank per line."
        },
        {
          "key": "maxResultsPerBank",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "How many matching charters to return per bank name."
        }
      ]
    },
    {
      "slug": "google-trends-rss-reliable",
      "entry": "024",
      "title": "Google Trends Daily Searches — The Endpoint That Doesn't 429",
      "description": "Today's trending searches for 60+ countries, with the news stories driving each one. Uses Google's RSS feed, which does not rate-limit — so runs don't fail the way explore-API scrapers do.",
      "categories": [
        "SEO_TOOLS",
        "NEWS"
      ],
      "url": "https://alaudinburki-scrapers.pages.dev/scrapers/google-trends-rss-reliable/",
      "apifyUrl": "https://apify.com/alaudinburki/google-trends-rss-reliable",
      "usage": {
        "runs": 42,
        "users": 2,
        "lastRun": "2026-10-16"
      },
      "outputSchema": [
        {
          "key": "geo",
          "type": "string",
          "nullable": true,
          "description": "Geographic coordinates in 'lat,lon' form.",
          "example": "<geo>"
        },
        {
          "key": "term",
          "type": "string",
          "nullable": true,
          "description": "Term this row relates to.",
          "example": "<term>"
        },
        {
          "key": "approxTraffic",
          "type": "integer",
          "nullable": true,
          "description": "Approx Traffic as recorded for this row.",
          "example": "0"
        },
        {
          "key": "pubDate",
          "type": "string",
          "nullable": true,
          "description": "Pub Date as recorded for this row.",
          "example": "<pubDate>"
        },
        {
          "key": "newsTitle",
          "type": "string",
          "nullable": true,
          "description": "News Title as recorded for this row.",
          "example": "<newsTitle>"
        },
        {
          "key": "newsSource",
          "type": "string",
          "nullable": true,
          "description": "News Source as recorded for this row.",
          "example": "<newsSource>"
        },
        {
          "key": "trendUrl",
          "type": "string",
          "nullable": true,
          "description": "Trend Url as recorded for this row.",
          "example": "<trendUrl>"
        }
      ],
      "inputs": [
        {
          "key": "geos",
          "type": "array",
          "required": false,
          "secret": false,
          "description": "Two-letter country codes to fetch trending searches for (e.g. US, GB, IN, DE, BR, JP). Google publishes feeds for 50+ countries; an unknown code fails immediately with the full supported list."
        },
        {
          "key": "expandNews",
          "type": "boolean",
          "required": false,
          "secret": false,
          "description": "Off: one row per trend, with the top news story attached and a newsCount. On: one row per news story, trend fields repeated — better for CSV pivoting on articles."
        },
        {
          "key": "termIncludes",
          "type": "array",
          "required": false,
          "secret": false,
          "description": "Keep only trends whose search term contains at least one of these words (case-insensitive). Leave empty for all trends."
        },
        {
          "key": "termExcludes",
          "type": "array",
          "required": false,
          "secret": false,
          "description": "Drop trends whose search term contains any of these words (case-insensitive). Leave empty to drop nothing."
        },
        {
          "key": "minTraffic",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Drop trends with published traffic below this number (e.g. 50000 keeps only 50K+ trends). Trends where Google publishes no figure are always kept, so real trends are never silently hidden."
        },
        {
          "key": "maxItems",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Hard limit on results returned. This is strictly enforced — you will never be charged for more than this."
        },
        {
          "key": "maxAgeHours",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Leave empty for the full feed. Set to 24 to keep only trends that surfaced in the last day. Trends without a published date are kept."
        }
      ]
    },
    {
      "slug": "site-health-suite",
      "entry": "025",
      "title": "Site Health Suite — One Graded Audit, Six Checks",
      "description": "One letter-graded audit combining SSL, security headers, uptime, broken links, structured data and subdomain takeover risk — with a prioritized, plain-English fix list instead of six separate scanner reports. Built for agencies who need a deliverable, not a data dump.",
      "categories": [
        "DEVELOPER_TOOLS",
        "BUSINESS"
      ],
      "url": "https://alaudinburki-scrapers.pages.dev/scrapers/site-health-suite/",
      "apifyUrl": "https://apify.com/alaudinburki/site-health-suite",
      "usage": {
        "runs": 42,
        "users": 2,
        "lastRun": "2026-10-16"
      },
      "outputSchema": [
        {
          "key": "site",
          "type": "string",
          "nullable": true,
          "description": "Site as recorded for this row.",
          "example": "example.com"
        },
        {
          "key": "grade",
          "type": "string",
          "nullable": true,
          "description": "Letter or numeric grade awarded.",
          "example": "B"
        },
        {
          "key": "score",
          "type": "integer",
          "nullable": true,
          "description": "Score on the Actor's own scale. The scale is stated in the field's own band.",
          "example": "82"
        },
        {
          "key": "sslScore",
          "type": "integer",
          "nullable": true,
          "description": "TLS configuration score, from 0 to 100.",
          "example": "0"
        },
        {
          "key": "headersScore",
          "type": "integer",
          "nullable": true,
          "description": "Security headers score, from 0 to 100.",
          "example": "0"
        },
        {
          "key": "uptimeScore",
          "type": "integer",
          "nullable": true,
          "description": "Uptime on a 0-100 scale. Higher is more available.",
          "example": "0"
        },
        {
          "key": "brokenLinksScore",
          "type": "integer",
          "nullable": true,
          "description": "Link health score, from 0 to 100. Higher is healthier.",
          "example": "0"
        },
        {
          "key": "structuredDataScore",
          "type": "integer",
          "nullable": true,
          "description": "Structured-data quality score, from 0 to 100.",
          "example": "0"
        },
        {
          "key": "subdomainScore",
          "type": "integer",
          "nullable": true,
          "description": "Subdomain hygiene score, from 0 to 100.",
          "example": "0"
        },
        {
          "key": "sslDaysToExpiry",
          "type": "integer",
          "nullable": true,
          "description": "Days until the TLS certificate expires.",
          "example": "0"
        },
        {
          "key": "sslIssuer",
          "type": "string",
          "nullable": true,
          "description": "Issuer of the TLS certificate.",
          "example": "<sslIssuer>"
        },
        {
          "key": "hasHsts",
          "type": "boolean",
          "nullable": true,
          "description": "Whether the response sets a Strict-Transport-Security header.",
          "example": "true"
        },
        {
          "key": "hasCsp",
          "type": "boolean",
          "nullable": true,
          "description": "Whether the response sets a Content-Security-Policy header.",
          "example": "true"
        },
        {
          "key": "up",
          "type": "boolean",
          "nullable": true,
          "description": "Whether the service responded successfully.",
          "example": "true"
        },
        {
          "key": "statusCode",
          "type": "integer",
          "nullable": true,
          "description": "HTTP status code recorded for this record.",
          "example": "200"
        },
        {
          "key": "responseMs",
          "type": "integer",
          "nullable": true,
          "description": "Response time in milliseconds.",
          "example": "412"
        },
        {
          "key": "linksChecked",
          "type": "integer",
          "nullable": true,
          "description": "How many links were checked.",
          "example": "214"
        },
        {
          "key": "brokenLinksCount",
          "type": "integer",
          "nullable": true,
          "description": "How many links failed.",
          "example": "0"
        },
        {
          "key": "structuredDataTypes",
          "type": "string",
          "nullable": true,
          "description": "Schema.org types the page declares.",
          "example": "<structuredDataTypes>"
        },
        {
          "key": "subdomainsChecked",
          "type": "integer",
          "nullable": true,
          "description": "How many subdomains were checked.",
          "example": "18"
        },
        {
          "key": "subdomainsSuspicious",
          "type": "integer",
          "nullable": true,
          "description": "Subdomains that look takeover-prone.",
          "example": "0"
        },
        {
          "key": "topFixes",
          "type": "string",
          "nullable": true,
          "description": "The highest-priority fixes to apply.",
          "example": "<topFixes>"
        },
        {
          "key": "fixCount",
          "type": "integer",
          "nullable": true,
          "description": "How many fixes were applied or are available.",
          "example": "0"
        },
        {
          "key": "checkedAt",
          "type": "string",
          "nullable": true,
          "description": "ISO 8601 timestamp of the most recent check.",
          "example": "2026-10-16T09:12:44.000Z"
        },
        {
          "key": "status",
          "type": "string",
          "nullable": true,
          "description": "Outcome recorded for this row.",
          "example": "ok"
        }
      ],
      "inputs": [
        {
          "key": "sites",
          "type": "array",
          "required": false,
          "secret": false,
          "description": "Domains or URLs to audit. Each gets all six checks: SSL, security headers, uptime, broken links, structured data, and subdomain takeover risk."
        },
        {
          "key": "maxLinksToCheck",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "How many links from the homepage to check for broken-link scoring."
        },
        {
          "key": "checkSubdomains",
          "type": "boolean",
          "required": false,
          "secret": false,
          "description": "Enumerate subdomains from certificate transparency and check for dangling DNS. Adds time but is weighted heaviest in the grade — it is the one active exploitable risk on this list."
        },
        {
          "key": "maxSubdomainsToCheck",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Cap on subdomains checked for takeover risk per site."
        },
        {
          "key": "maxItems",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Hard cap on sites returned. You are never charged beyond this."
        }
      ]
    },
    {
      "slug": "country-economic-snapshot",
      "entry": "026",
      "title": "Country Economic Snapshot — World Bank, One Flat Row",
      "description": "GDP, population, inflation, unemployment and more for any country as one flat row — the latest available observation per indicator, each with its own year. Free, keyless World Bank data. Any World Bank indicator code also works.",
      "categories": [
        "DEVELOPER_TOOLS",
        "BUSINESS"
      ],
      "url": "https://alaudinburki-scrapers.pages.dev/scrapers/country-economic-snapshot/",
      "apifyUrl": "https://apify.com/alaudinburki/country-economic-snapshot",
      "usage": {
        "runs": 41,
        "users": 2,
        "lastRun": "2026-10-16"
      },
      "outputSchema": [
        {
          "key": "countryCode",
          "type": "string",
          "nullable": true,
          "description": "Two-letter ISO 3166-1 country code.",
          "example": "US"
        },
        {
          "key": "countryName",
          "type": "string",
          "nullable": true,
          "description": "Country name in English.",
          "example": "<countryName>"
        },
        {
          "key": "gdpUsdValue",
          "type": "number",
          "nullable": true,
          "description": "Gross domestic product in current US dollars.",
          "example": "0"
        },
        {
          "key": "gdpUsdYear",
          "type": "string",
          "nullable": true,
          "description": "Year the GDP figure refers to.",
          "example": "<gdpUsdYear>"
        },
        {
          "key": "gdpPerCapitaUsdValue",
          "type": "number",
          "nullable": true,
          "description": "Gross domestic product per person in current US dollars.",
          "example": "0"
        },
        {
          "key": "gdpPerCapitaUsdYear",
          "type": "string",
          "nullable": true,
          "description": "Year the GDP per capita figure refers to.",
          "example": "<gdpPerCapitaUsdYear>"
        },
        {
          "key": "populationValue",
          "type": "number",
          "nullable": true,
          "description": "Population of this area.",
          "example": "0"
        },
        {
          "key": "populationYear",
          "type": "string",
          "nullable": true,
          "description": "Year the population figure refers to.",
          "example": "<populationYear>"
        },
        {
          "key": "inflationPercentValue",
          "type": "number",
          "nullable": true,
          "description": "Annual inflation rate as a percentage.",
          "example": "0"
        },
        {
          "key": "inflationPercentYear",
          "type": "string",
          "nullable": true,
          "description": "Year the inflation figure refers to.",
          "example": "<inflationPercentYear>"
        },
        {
          "key": "unemploymentPercentValue",
          "type": "number",
          "nullable": true,
          "description": "Unemployment rate as a percentage.",
          "example": "0"
        },
        {
          "key": "unemploymentPercentYear",
          "type": "string",
          "nullable": true,
          "description": "Year the unemployment figure refers to.",
          "example": "<unemploymentPercentYear>"
        },
        {
          "key": "internetUsersPercentValue",
          "type": "number",
          "nullable": true,
          "description": "Share of the population with internet access, as a percentage.",
          "example": "0"
        },
        {
          "key": "internetUsersPercentYear",
          "type": "string",
          "nullable": true,
          "description": "Year the internet users figure refers to.",
          "example": "<internetUsersPercentYear>"
        },
        {
          "key": "indicatorsRequested",
          "type": "integer",
          "nullable": true,
          "description": "Indicators Requested as recorded for this row.",
          "example": "0"
        },
        {
          "key": "indicatorsWithData",
          "type": "integer",
          "nullable": true,
          "description": "Indicators With Data as recorded for this row.",
          "example": "0"
        }
      ],
      "inputs": [
        {
          "key": "countries",
          "type": "array",
          "required": true,
          "secret": false,
          "description": "ISO country codes, e.g. US, PK, DE. Two-letter or three-letter codes both work."
        },
        {
          "key": "indicators",
          "type": "array",
          "required": false,
          "secret": false,
          "description": "Which indicators to fetch. Use the built-in keys (gdpUsd, gdpPerCapitaUsd, population, inflationPercent, unemploymentPercent, internetUsersPercent) or any raw World Bank indicator code (e.g. EN.ATM.CO2E.PC). Leave empty for all built-ins."
        }
      ]
    },
    {
      "slug": "earthquake-monitor",
      "entry": "027",
      "title": "Earthquake Business Impact Monitor — USGS, By Location",
      "description": "Recent earthquakes near your specific business locations (lat/lon), not a global feed. USGS's own magnitude, PAGER alert level, and tsunami flag passed through directly. Free, keyless, real-time.",
      "categories": [
        "DEVELOPER_TOOLS",
        "BUSINESS"
      ],
      "url": "https://alaudinburki-scrapers.pages.dev/scrapers/earthquake-monitor/",
      "apifyUrl": "https://apify.com/alaudinburki/earthquake-monitor",
      "usage": {
        "runs": 41,
        "users": 2,
        "lastRun": "2026-10-16"
      },
      "outputSchema": [
        {
          "key": "locationLabel",
          "type": "string",
          "nullable": true,
          "description": "Short human-readable label for this location.",
          "example": "Austin, Texas"
        },
        {
          "key": "lat",
          "type": "number",
          "nullable": true,
          "description": "Latitude in decimal degrees. Negative is south.",
          "example": "30.2672"
        },
        {
          "key": "lon",
          "type": "number",
          "nullable": true,
          "description": "Longitude in decimal degrees. Negative is west.",
          "example": "-97.7431"
        },
        {
          "key": "id",
          "type": "string",
          "nullable": true,
          "description": "Stable identifier from the source. Use it to link records across runs.",
          "example": "7524427347697896726"
        },
        {
          "key": "magnitude",
          "type": "number",
          "nullable": true,
          "description": "How large the change is, classified as minor, moderate or major.",
          "example": "major"
        },
        {
          "key": "place",
          "type": "string",
          "nullable": true,
          "description": "Place name as the source writes it.",
          "example": "<place>"
        },
        {
          "key": "time",
          "type": "string",
          "nullable": true,
          "description": "Time this row refers to.",
          "example": "<time>"
        },
        {
          "key": "depthKm",
          "type": "number",
          "nullable": true,
          "description": "Depth Km as recorded for this row.",
          "example": "0"
        },
        {
          "key": "alertLevel",
          "type": "string",
          "nullable": true,
          "description": "Level of the alert, in words.",
          "example": "<alertLevel>"
        },
        {
          "key": "tsunami",
          "type": "boolean",
          "nullable": true,
          "description": "Whether a tsunami was associated with this event.",
          "example": "true"
        },
        {
          "key": "felt",
          "type": "integer",
          "nullable": true,
          "description": "Felt as recorded for this row.",
          "example": "0"
        },
        {
          "key": "significance",
          "type": "integer",
          "nullable": true,
          "description": "How significant the change is, on the Actor's own scale.",
          "example": "0"
        },
        {
          "key": "url",
          "type": "string",
          "nullable": true,
          "description": "The URL this row describes.",
          "example": "https://example.com/pricing"
        },
        {
          "key": "status",
          "type": "string",
          "nullable": true,
          "description": "Outcome recorded for this row.",
          "example": "ok"
        },
        {
          "key": "verdict",
          "type": "string",
          "nullable": true,
          "description": "The Actor's conclusion for this row, stated in words.",
          "example": "pass"
        }
      ],
      "inputs": [
        {
          "key": "locations",
          "type": "array",
          "required": true,
          "secret": false,
          "description": "Business locations to check, each with a lat/lon and an optional label. Example: [{\"label\": \"Tokyo Office\", \"lat\": 35.68, \"lon\": 139.69}]"
        },
        {
          "key": "minMagnitude",
          "type": "number",
          "required": false,
          "secret": false,
          "description": "Only return earthquakes at or above this magnitude."
        },
        {
          "key": "maxRadiusKm",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "How far from each location to search, in kilometers."
        },
        {
          "key": "daysBack",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "How many days of earthquake history to check, up to 365."
        },
        {
          "key": "maxItems",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Hard cap on items returned. You are never charged beyond this."
        }
      ]
    },
    {
      "slug": "global-news-monitor",
      "entry": "028",
      "title": "Global News Monitor — GDELT, 65+ Languages",
      "description": "Worldwide news coverage for any brand or topic via GDELT's free index — headline, outlet, country and language, plus a coverage summary showing where the coverage actually concentrates. Paces itself to GDELT's rate limit. No API key.",
      "categories": [
        "NEWS",
        "MARKETING"
      ],
      "url": "https://alaudinburki-scrapers.pages.dev/scrapers/global-news-monitor/",
      "apifyUrl": "https://apify.com/alaudinburki/global-news-monitor",
      "usage": {
        "runs": 41,
        "users": 2,
        "lastRun": "2026-10-16"
      },
      "outputSchema": [
        {
          "key": "matchedQuery",
          "type": "string",
          "nullable": true,
          "description": "The query this row matched.",
          "example": "amazon product scraper"
        },
        {
          "key": "title",
          "type": "string",
          "nullable": true,
          "description": "Title as the source writes it.",
          "example": "Wireless Bluetooth Headphones"
        },
        {
          "key": "url",
          "type": "string",
          "nullable": true,
          "description": "The URL this row describes.",
          "example": "https://example.com/pricing"
        },
        {
          "key": "domain",
          "type": "string",
          "nullable": true,
          "description": "Domain name, without the scheme.",
          "example": "example.com"
        },
        {
          "key": "language",
          "type": "string",
          "nullable": true,
          "description": "Language code for this record's text.",
          "example": "en"
        },
        {
          "key": "sourceCountry",
          "type": "string",
          "nullable": true,
          "description": "Country the source is based in, when published.",
          "example": "<sourceCountry>"
        },
        {
          "key": "seenAt",
          "type": "string",
          "nullable": true,
          "description": "ISO 8601 timestamp of when this row was first observed.",
          "example": "<seenAt>"
        },
        {
          "key": "imageUrl",
          "type": "string",
          "nullable": true,
          "description": "Direct URL of this image.",
          "example": "https://cdn.example.com/products/1.jpg"
        },
        {
          "key": "query",
          "type": "string",
          "nullable": true,
          "description": "The query that produced this row.",
          "example": "shopify scraper"
        },
        {
          "key": "articleCount",
          "type": "integer",
          "nullable": true,
          "description": "Number of articles found.",
          "example": "0"
        },
        {
          "key": "topDomains",
          "type": "string",
          "nullable": true,
          "description": "Domains cited most often across the samples.",
          "example": "<topDomains>"
        },
        {
          "key": "topCountries",
          "type": "string",
          "nullable": true,
          "description": "Countries appearing most often across the samples.",
          "example": "<topCountries>"
        },
        {
          "key": "languages",
          "type": "string",
          "nullable": false,
          "description": "Languages as recorded for this row.",
          "example": "en, ur"
        },
        {
          "key": "timespan",
          "type": "string",
          "nullable": true,
          "description": "Period the figure covers.",
          "example": "<timespan>"
        },
        {
          "key": "status",
          "type": "string",
          "nullable": true,
          "description": "Outcome recorded for this row.",
          "example": "ok"
        },
        {
          "key": "verdict",
          "type": "string",
          "nullable": true,
          "description": "The Actor's conclusion for this row, stated in words.",
          "example": "pass"
        }
      ],
      "inputs": [
        {
          "key": "queries",
          "type": "array",
          "required": true,
          "secret": false,
          "description": "Brands, companies or topics to track. One per line — a phrase may contain a comma."
        },
        {
          "key": "timespan",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "How far back to search, using GDELT's format: e.g. 24h, 7d, 1w, 1m. Maximum is roughly 3 months of the rolling index."
        },
        {
          "key": "outputMode",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "'articles' returns one row per news article. 'summary' returns one row per query with coverage totals and top outlets/countries instead."
        },
        {
          "key": "sourceCountry",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "Restrict to outlets in one country, using GDELT's country code (e.g. US, UK, IN)."
        },
        {
          "key": "language",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "Restrict to one source language, e.g. english, spanish, french."
        },
        {
          "key": "maxRecordsPerQuery",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "How many articles to pull per query (GDELT's own maximum is 250)."
        },
        {
          "key": "maxItems",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Hard cap on items returned. You are never charged beyond this."
        }
      ]
    },
    {
      "slug": "provider-verification",
      "entry": "029",
      "title": "Healthcare Provider Verification — NPPES/NPI",
      "description": "Verify a healthcare provider's NPI registration status, specialty (taxonomy), and practice location from CMS's free official NPPES registry. Covers both individual and organization NPIs. No key required.",
      "categories": [
        "DEVELOPER_TOOLS",
        "BUSINESS"
      ],
      "url": "https://alaudinburki-scrapers.pages.dev/scrapers/provider-verification/",
      "apifyUrl": "https://apify.com/alaudinburki/provider-verification",
      "usage": {
        "runs": 41,
        "users": 2,
        "lastRun": "2026-10-16"
      },
      "outputSchema": [
        {
          "key": "matchedQuery",
          "type": "string",
          "nullable": true,
          "description": "The query this row matched.",
          "example": "amazon product scraper"
        },
        {
          "key": "npi",
          "type": "string",
          "nullable": true,
          "description": "National Provider Identifier.",
          "example": "<npi>"
        },
        {
          "key": "enumerationType",
          "type": "string",
          "nullable": true,
          "description": "How the identifier was assigned.",
          "example": "<enumerationType>"
        },
        {
          "key": "name",
          "type": "string",
          "nullable": true,
          "description": "Display name as the source writes it.",
          "example": "Bitcoin"
        },
        {
          "key": "isOrganization",
          "type": "boolean",
          "nullable": true,
          "description": "Whether the address belongs to an organisation rather than a person.",
          "example": "true"
        },
        {
          "key": "status",
          "type": "string",
          "nullable": true,
          "description": "Outcome recorded for this row.",
          "example": "ok"
        },
        {
          "key": "isActive",
          "type": "boolean",
          "nullable": true,
          "description": "Whether the record is still active at the source.",
          "example": "true"
        },
        {
          "key": "credential",
          "type": "string",
          "nullable": true,
          "description": "Credential this row describes.",
          "example": "<credential>"
        },
        {
          "key": "primarySpecialty",
          "type": "string",
          "nullable": true,
          "description": "Primary Specialty as recorded for this row.",
          "example": "<primarySpecialty>"
        },
        {
          "key": "licenseNumber",
          "type": "string",
          "nullable": true,
          "description": "Licence number.",
          "example": "<licenseNumber>"
        },
        {
          "key": "licenseState",
          "type": "string",
          "nullable": true,
          "description": "State that issued the licence.",
          "example": "<licenseState>"
        },
        {
          "key": "practiceCity",
          "type": "string",
          "nullable": true,
          "description": "City where the practice is located.",
          "example": "<practiceCity>"
        },
        {
          "key": "practiceState",
          "type": "string",
          "nullable": true,
          "description": "State where the practice is located.",
          "example": "<practiceState>"
        },
        {
          "key": "practicePhone",
          "type": "string",
          "nullable": true,
          "description": "Phone number for the practice.",
          "example": "<practicePhone>"
        },
        {
          "key": "enumerationDate",
          "type": "string",
          "nullable": true,
          "description": "Date the identifier was assigned.",
          "example": "<enumerationDate>"
        },
        {
          "key": "lastUpdated",
          "type": "string",
          "nullable": true,
          "description": "ISO 8601 timestamp of the last change seen.",
          "example": "<lastUpdated>"
        },
        {
          "key": "verdict",
          "type": "string",
          "nullable": true,
          "description": "The Actor's conclusion for this row, stated in words.",
          "example": "pass"
        }
      ],
      "inputs": [
        {
          "key": "providers",
          "type": "array",
          "required": true,
          "secret": false,
          "description": "Providers to look up, each with npi, organizationName, or firstName/lastName (state optional to narrow). Example: [{\"npi\": \"1063837144\"}] or [{\"organizationName\": \"Mayo Clinic\"}]"
        },
        {
          "key": "maxResultsPerQuery",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "How many matching providers to return per query."
        }
      ]
    },
    {
      "slug": "stock-market-data",
      "entry": "030",
      "title": "Stock Market Data — Quotes & History (Yahoo Finance)",
      "description": "Get current quotes (price, change, day range, 52-week, volume) and OHLC price history for any stock, ETF, index, forex or crypto ticker via Yahoo Finance's public endpoint. No API key.",
      "categories": [
        "BUSINESS",
        "DEVELOPER_TOOLS"
      ],
      "url": "https://alaudinburki-scrapers.pages.dev/scrapers/stock-market-data/",
      "apifyUrl": "https://apify.com/alaudinburki/stock-market-data",
      "usage": {
        "runs": 41,
        "users": 2,
        "lastRun": "2026-10-16"
      },
      "outputSchema": [
        {
          "key": "symbol",
          "type": "string",
          "nullable": true,
          "description": "Ticker or symbol as the source writes it.",
          "example": "BTC"
        },
        {
          "key": "price",
          "type": "number",
          "nullable": true,
          "description": "Price as reported by the source. Currency is given by the currency field.",
          "example": "9.99"
        },
        {
          "key": "currency",
          "type": "string",
          "nullable": true,
          "description": "Three-letter ISO 4217 currency code.",
          "example": "USD"
        },
        {
          "key": "change",
          "type": "number",
          "nullable": true,
          "description": "How the value changed since the previous observation.",
          "example": "0"
        },
        {
          "key": "changePercent",
          "type": "number",
          "nullable": true,
          "description": "Percentage change since the previous observation.",
          "example": "0"
        },
        {
          "key": "signal",
          "type": "string",
          "nullable": true,
          "description": "The signal this row represents.",
          "example": "new posting"
        },
        {
          "key": "week52Position",
          "type": "number",
          "nullable": true,
          "description": "Where the current price sits within the 52-week range, 0 at the low and 1 at the high.",
          "example": "0"
        },
        {
          "key": "dayHigh",
          "type": "number",
          "nullable": true,
          "description": "Highest price during the session.",
          "example": "0"
        },
        {
          "key": "dayLow",
          "type": "number",
          "nullable": true,
          "description": "Lowest price during the session.",
          "example": "0"
        },
        {
          "key": "fiftyTwoWeekHigh",
          "type": "number",
          "nullable": true,
          "description": "Highest price over the last 52 weeks.",
          "example": "0"
        },
        {
          "key": "fiftyTwoWeekLow",
          "type": "number",
          "nullable": true,
          "description": "Lowest price over the last 52 weeks.",
          "example": "0"
        },
        {
          "key": "volume",
          "type": "integer",
          "nullable": true,
          "description": "Trading volume over the measured period.",
          "example": "31157278261"
        }
      ],
      "inputs": [
        {
          "key": "symbols",
          "type": "array",
          "required": true,
          "secret": false,
          "description": "Tickers, e.g. AAPL, MSFT, ^GSPC, EURUSD=X, BTC-USD."
        },
        {
          "key": "mode",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "quote = one current-quote row per symbol; history = OHLC bars."
        },
        {
          "key": "range",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "1d,5d,1mo,3mo,6mo,1y,2y,5y,10y,ytd,max (history mode)."
        },
        {
          "key": "interval",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "1m,5m,15m,1h,1d,1wk,1mo (history mode)."
        },
        {
          "key": "useProxy",
          "type": "boolean",
          "required": false,
          "secret": false,
          "description": "If Yahoo throttles your IP."
        },
        {
          "key": "maxItems",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Hard cap."
        }
      ]
    },
    {
      "slug": "remote-jobs-aggregator",
      "entry": "031",
      "title": "Remote Jobs Aggregator — 5 Boards, Normalized Salary",
      "description": "Aggregate remote jobs from five public boards (RemoteOK, Remotive, Jobicy, Himalayas, Arbeitnow) into one schema. Salary normalized to annual figures so you can actually sort and filter on pay, and duplicates collapsed across boards with alsoOn showing which companies are posting everywhere.",
      "categories": [
        "JOBS",
        "LEAD_GENERATION"
      ],
      "url": "https://alaudinburki-scrapers.pages.dev/scrapers/remote-jobs-aggregator/",
      "apifyUrl": "https://apify.com/alaudinburki/remote-jobs-aggregator",
      "usage": {
        "runs": 37,
        "users": 2,
        "lastRun": "2026-10-16"
      },
      "outputSchema": [
        {
          "key": "source",
          "type": "string",
          "nullable": true,
          "description": "Which upstream source produced this row.",
          "example": "official public API"
        },
        {
          "key": "title",
          "type": "string",
          "nullable": true,
          "description": "Title as the source writes it.",
          "example": "Wireless Bluetooth Headphones"
        },
        {
          "key": "company",
          "type": "string",
          "nullable": true,
          "description": "Company name as the source writes it.",
          "example": "Northwind Traders"
        },
        {
          "key": "location",
          "type": "string",
          "nullable": true,
          "description": "Location as the source writes it.",
          "example": "Austin, TX"
        },
        {
          "key": "tags",
          "type": "string",
          "nullable": true,
          "description": "Tags applied to this record.",
          "example": "[\"wireless\",\"bluetooth\",\"over-ear\"]"
        },
        {
          "key": "url",
          "type": "string",
          "nullable": true,
          "description": "The URL this row describes.",
          "example": "https://example.com/pricing"
        },
        {
          "key": "postedAt",
          "type": "string",
          "nullable": true,
          "description": "ISO 8601 timestamp of when this was posted.",
          "example": "2026-10-14T00:00:00.000Z"
        },
        {
          "key": "salaryAnnualMin",
          "type": "integer",
          "nullable": true,
          "description": "Annualised lower bound of the salary.",
          "example": "0"
        },
        {
          "key": "salaryAnnualMax",
          "type": "integer",
          "nullable": true,
          "description": "Annualised upper bound of the salary.",
          "example": "0"
        },
        {
          "key": "salaryCurrency",
          "type": "string",
          "nullable": true,
          "description": "Currency the salary is quoted in.",
          "example": "<salaryCurrency>"
        },
        {
          "key": "salaryPeriod",
          "type": "string",
          "nullable": true,
          "description": "Period the salary is quoted for — year, month, day or hour.",
          "example": "<salaryPeriod>"
        },
        {
          "key": "salarySource",
          "type": "string",
          "nullable": true,
          "description": "Where the salary figure came from.",
          "example": "<salarySource>"
        },
        {
          "key": "seniority",
          "type": "string",
          "nullable": true,
          "description": "Seniority level as posted or inferred from the title.",
          "example": "<seniority>"
        },
        {
          "key": "alsoOn",
          "type": "string",
          "nullable": true,
          "description": "Also On as recorded for this row.",
          "example": "<alsoOn>"
        },
        {
          "key": "sourceCount",
          "type": "integer",
          "nullable": true,
          "description": "How many sources the answer cited.",
          "example": "0"
        },
        {
          "key": "companyLogo",
          "type": "string",
          "nullable": true,
          "description": "URL of the company's logo.",
          "example": "<companyLogo>"
        },
        {
          "key": "jobType",
          "type": "string",
          "nullable": true,
          "description": "Employment type as posted.",
          "example": "<jobType>"
        },
        {
          "key": "remote",
          "type": "boolean",
          "nullable": true,
          "description": "Whether the posting is remote.",
          "example": "true"
        },
        {
          "key": "id",
          "type": "string",
          "nullable": true,
          "description": "Stable identifier from the source. Use it to link records across runs.",
          "example": "7524427347697896726"
        },
        {
          "key": "salaryMin",
          "type": "number",
          "nullable": true,
          "description": "Lower bound of the advertised salary.",
          "example": "95000"
        },
        {
          "key": "salaryMax",
          "type": "number",
          "nullable": true,
          "description": "Upper bound of the advertised salary.",
          "example": "130000"
        },
        {
          "key": "hasSalary",
          "type": "boolean",
          "nullable": true,
          "description": "Whether a salary was published.",
          "example": "true"
        },
        {
          "key": "description",
          "type": "string",
          "nullable": true,
          "description": "Description of this record, as published by the source.",
          "example": "<description>"
        }
      ],
      "inputs": [
        {
          "key": "sources",
          "type": "array",
          "required": false,
          "secret": false,
          "description": "Which boards to pull from. All five by default: RemoteOK, Remotive, Jobicy, Himalayas, Arbeitnow."
        },
        {
          "key": "keywords",
          "type": "array",
          "required": false,
          "secret": false,
          "description": "Keep only jobs whose title/tags contain one of these."
        },
        {
          "key": "locationIncludes",
          "type": "array",
          "required": false,
          "secret": false,
          "description": "Keep only jobs whose location matches (e.g. US, Europe)."
        },
        {
          "key": "maxItems",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Hard cap."
        },
        {
          "key": "minAnnualSalary",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Only return jobs whose normalized annual salary reaches this. Note most boards don't publish salary — this filter also removes every job without a figure."
        },
        {
          "key": "dedupeAcrossSources",
          "type": "boolean",
          "required": false,
          "secret": false,
          "description": "The same role is often posted to several boards. Collapse them into one row and record the others in alsoOn."
        }
      ]
    },
    {
      "slug": "shopify-product-scraper",
      "entry": "032",
      "title": "Shopify Product Scraper — Any Store's Catalog",
      "description": "Scrape the full product catalog of any Shopify store via its public /products.json — title, price range, variants, availability, images, tags. One row per product or per variant. No API key.",
      "categories": [
        "ECOMMERCE",
        "LEAD_GENERATION"
      ],
      "url": "https://alaudinburki-scrapers.pages.dev/scrapers/shopify-product-scraper/",
      "apifyUrl": "https://apify.com/alaudinburki/shopify-product-scraper",
      "usage": {
        "runs": 37,
        "users": 2,
        "lastRun": "2026-10-15"
      },
      "outputSchema": [
        {
          "key": "store",
          "type": "string",
          "nullable": true,
          "description": "Store this record came from.",
          "example": "<store>"
        },
        {
          "key": "id",
          "type": "integer",
          "nullable": true,
          "description": "Stable identifier from the source. Use it to link records across runs.",
          "example": "7524427347697896726"
        },
        {
          "key": "title",
          "type": "string",
          "nullable": true,
          "description": "Title as the source writes it.",
          "example": "Wireless Bluetooth Headphones"
        },
        {
          "key": "handle",
          "type": "string",
          "nullable": true,
          "description": "Public handle for this account.",
          "example": "<handle>"
        },
        {
          "key": "url",
          "type": "string",
          "nullable": true,
          "description": "The URL this row describes.",
          "example": "https://example.com/pricing"
        },
        {
          "key": "vendor",
          "type": "string",
          "nullable": true,
          "description": "Vendor this record relates to.",
          "example": "<vendor>"
        },
        {
          "key": "productType",
          "type": "string",
          "nullable": true,
          "description": "Product type as the merchant categorises it.",
          "example": "<productType>"
        },
        {
          "key": "tags",
          "type": "string",
          "nullable": true,
          "description": "Tags applied to this record.",
          "example": "[\"wireless\",\"bluetooth\",\"over-ear\"]"
        },
        {
          "key": "priceMin",
          "type": "number",
          "nullable": true,
          "description": "Lowest price observed in the range.",
          "example": "0"
        },
        {
          "key": "priceMax",
          "type": "number",
          "nullable": true,
          "description": "Highest price observed in the range.",
          "example": "0"
        },
        {
          "key": "currency",
          "type": "string",
          "nullable": true,
          "description": "Three-letter ISO 4217 currency code.",
          "example": "USD"
        },
        {
          "key": "variantCount",
          "type": "integer",
          "nullable": true,
          "description": "How many variants the product has.",
          "example": "6"
        },
        {
          "key": "available",
          "type": "boolean",
          "nullable": true,
          "description": "Whether the item is currently available.",
          "example": "true"
        },
        {
          "key": "inStockVariants",
          "type": "integer",
          "nullable": true,
          "description": "How many variants are currently in stock.",
          "example": "0"
        },
        {
          "key": "image",
          "type": "string",
          "nullable": true,
          "description": "Primary image URL for this record.",
          "example": "<image>"
        },
        {
          "key": "imageCount",
          "type": "integer",
          "nullable": true,
          "description": "Number of images found.",
          "example": "7"
        },
        {
          "key": "createdAt",
          "type": "string",
          "nullable": true,
          "description": "ISO 8601 timestamp of when this record was created upstream.",
          "example": "2026-10-15T09:00:00.000Z"
        },
        {
          "key": "updatedAt",
          "type": "string",
          "nullable": true,
          "description": "ISO 8601 timestamp of the most recent upstream update.",
          "example": "2026-10-15T09:00:00.000Z"
        },
        {
          "key": "publishedAt",
          "type": "string",
          "nullable": true,
          "description": "ISO 8601 timestamp of publication.",
          "example": "2026-10-15T09:00:00.000Z"
        },
        {
          "key": "productId",
          "type": "integer",
          "nullable": true,
          "description": "Identifier of the product.",
          "example": "0"
        },
        {
          "key": "productTitle",
          "type": "string",
          "nullable": true,
          "description": "Title of the product as the merchant writes it.",
          "example": "<productTitle>"
        },
        {
          "key": "variantId",
          "type": "integer",
          "nullable": true,
          "description": "Identifier of this variant.",
          "example": "0"
        },
        {
          "key": "variantTitle",
          "type": "string",
          "nullable": true,
          "description": "Title of this variant, for example a size or colour.",
          "example": "<variantTitle>"
        },
        {
          "key": "sku",
          "type": "string",
          "nullable": true,
          "description": "Stock keeping unit, as the merchant defines it.",
          "example": "<sku>"
        },
        {
          "key": "price",
          "type": "number",
          "nullable": true,
          "description": "Price as reported by the source. Currency is given by the currency field.",
          "example": "9.99"
        },
        {
          "key": "compareAtPrice",
          "type": "number",
          "nullable": true,
          "description": "Original list price, where the merchant shows a comparison.",
          "example": "0"
        },
        {
          "key": "onSale",
          "type": "boolean",
          "nullable": true,
          "description": "Whether the item is currently discounted.",
          "example": "true"
        },
        {
          "key": "discountPercent",
          "type": "integer",
          "nullable": true,
          "description": "Discount off the comparison price, as a percentage.",
          "example": "15"
        },
        {
          "key": "grams",
          "type": "number",
          "nullable": true,
          "description": "Grams as recorded for this row.",
          "example": "0"
        }
      ],
      "inputs": [
        {
          "key": "storeUrls",
          "type": "array",
          "required": true,
          "secret": false,
          "description": "Shopify store URLs or domains (e.g. hemper.co). Some stores block automated access; use only stores you are authorized to collect from."
        },
        {
          "key": "perVariant",
          "type": "boolean",
          "required": false,
          "secret": false,
          "description": "Off: one row per product (price range). On: one row per variant/SKU."
        },
        {
          "key": "maxPagesPerStore",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "250 products per page."
        },
        {
          "key": "useProxy",
          "type": "boolean",
          "required": false,
          "secret": false,
          "description": "For stores that block datacenter IPs."
        },
        {
          "key": "maxItems",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Hard cap. Strictly enforced."
        }
      ]
    },
    {
      "slug": "pdf-tables-extractor",
      "entry": "033",
      "title": "PDF Tables Extractor — Tables Out of Any PDF",
      "description": "Pull real tables out of PDFs as rows you can use, with a confidence score on every table. Outputs one item per row for spreadsheets, or Markdown and CSV for docs and LLM prompts. Says plainly when a PDF is a scan with no text layer instead of returning silent nonsense.",
      "categories": [
        "DEVELOPER_TOOLS",
        "AI"
      ],
      "url": "https://alaudinburki-scrapers.pages.dev/scrapers/pdf-tables-extractor/",
      "apifyUrl": "https://apify.com/alaudinburki/pdf-tables-extractor",
      "usage": {
        "runs": 36,
        "users": 2,
        "lastRun": "2026-10-15"
      },
      "outputSchema": [
        {
          "key": "sourceUrl",
          "type": "string",
          "nullable": true,
          "description": "The page or endpoint this row was read from.",
          "example": "https://api.example.com/v1/items"
        },
        {
          "key": "page",
          "type": "integer",
          "nullable": true,
          "description": "Page number this record came from. 1-based.",
          "example": "1"
        },
        {
          "key": "tableIndex",
          "type": "integer",
          "nullable": true,
          "description": "Zero-based index of the table within the document.",
          "example": "0"
        },
        {
          "key": "confidence",
          "type": "number",
          "nullable": true,
          "description": "How confident the Actor is in this result, from 0 to 1. Not a probability of correctness.",
          "example": "0"
        },
        {
          "key": "rowIndex",
          "type": "integer",
          "nullable": true,
          "description": "Zero-based position of this row within the dataset.",
          "example": "0"
        },
        {
          "key": "row",
          "type": "object",
          "nullable": true,
          "description": "Row as recorded for this row.",
          "example": "{\"key\":\"value\"}"
        },
        {
          "key": "rows",
          "type": "array",
          "nullable": true,
          "description": "The rows this record carries.",
          "example": "[{\"column\":\"value\",\"column2\":123}]"
        },
        {
          "key": "header",
          "type": "string",
          "nullable": true,
          "description": "Header name that was checked.",
          "example": "<header>"
        },
        {
          "key": "hasHeader",
          "type": "boolean",
          "nullable": true,
          "description": "Whether the checked header is present.",
          "example": "true"
        },
        {
          "key": "rowCount",
          "type": "integer",
          "nullable": true,
          "description": "How many rows this record represents, when rows are grouped.",
          "example": "0"
        },
        {
          "key": "columnCount",
          "type": "integer",
          "nullable": true,
          "description": "Number of columns.",
          "example": "0"
        },
        {
          "key": "fillRatio",
          "type": "number",
          "nullable": true,
          "description": "Share of optional values that were populated, between 0 and 1.",
          "example": "0"
        },
        {
          "key": "columnConsistency",
          "type": "number",
          "nullable": true,
          "description": "Share of rows sharing the declared column count, between 0 and 1.",
          "example": "0"
        },
        {
          "key": "numericRatio",
          "type": "number",
          "nullable": true,
          "description": "Share of values that are numeric, between 0 and 1.",
          "example": "0"
        },
        {
          "key": "markdown",
          "type": "string",
          "nullable": true,
          "description": "Content converted to Markdown, with headings and links preserved.",
          "example": "<markdown>"
        },
        {
          "key": "csv",
          "type": "string",
          "nullable": true,
          "description": "Content rendered as CSV text.",
          "example": "<csv>"
        },
        {
          "key": "status",
          "type": "string",
          "nullable": true,
          "description": "Outcome recorded for this row.",
          "example": "ok"
        },
        {
          "key": "recommendation",
          "type": "string",
          "nullable": true,
          "description": "The recommended action for this row.",
          "example": "Review the price change before it propagates."
        },
        {
          "key": "symbolRatio",
          "type": "number",
          "nullable": true,
          "description": "Share of values made only of punctuation or symbols, between 0 and 1.",
          "example": "0"
        },
        {
          "key": "singleCharRatio",
          "type": "number",
          "nullable": true,
          "description": "Share of values that are a single character, between 0 and 1. A high rate suggests truncation or a placeholder.",
          "example": "0"
        }
      ],
      "inputs": [
        {
          "key": "pdfUrls",
          "type": "array",
          "required": false,
          "secret": false,
          "description": "Public URLs of the PDFs to extract tables from."
        },
        {
          "key": "pages",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "Which pages to read, e.g. 1-5,8. Leave empty for every page."
        },
        {
          "key": "minConfidence",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "Tables below this 0-1 score are discarded. Detection is genuinely ambiguous — a boxed diagram looks like a table to any algorithm — so this is the dial between missing tables and inventing them. 0.45 is a balanced default; raise it for financial data."
        },
        {
          "key": "outputMode",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "'rows' gives one dataset item per table row, ready for a spreadsheet. 'tables' gives one item per table with the rows nested."
        },
        {
          "key": "includeMarkdown",
          "type": "boolean",
          "required": false,
          "secret": false,
          "description": "Attach each table as Markdown — the format to paste into docs, issues or an LLM prompt."
        },
        {
          "key": "includeCsv",
          "type": "boolean",
          "required": false,
          "secret": false,
          "description": "Attach each table as a CSV string."
        },
        {
          "key": "maxPagesPerPdf",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Upper bound on pages read from each document."
        },
        {
          "key": "maxItems",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Hard cap on items returned. You are never charged beyond this."
        }
      ]
    },
    {
      "slug": "amazon-bestsellers-tracker",
      "entry": "034",
      "title": "Amazon Best Sellers Tracker — Rank Movement & New Entrants",
      "description": "Track Amazon Best Sellers, New Releases and Movers & Shakers across 16 marketplaces, and get what CHANGED: new entrants, climbers, fallers and drop-outs with a signal explaining each move. Currency is read from the page rather than assumed, because Amazon geolocates prices.",
      "categories": [
        "ECOMMERCE",
        "BUSINESS"
      ],
      "url": "https://alaudinburki-scrapers.pages.dev/scrapers/amazon-bestsellers-tracker/",
      "apifyUrl": "https://apify.com/alaudinburki/amazon-bestsellers-tracker",
      "usage": {
        "runs": 35,
        "users": 2,
        "lastRun": "2026-10-16"
      },
      "outputSchema": [
        {
          "key": "rank",
          "type": "integer",
          "nullable": true,
          "description": "Position in the source's own ordering. 1 is highest.",
          "example": "1"
        },
        {
          "key": "asin",
          "type": "string",
          "nullable": true,
          "description": "Amazon Standard Identification Number.",
          "example": "B09XS7JWHH"
        },
        {
          "key": "title",
          "type": "string",
          "nullable": true,
          "description": "Title as the source writes it.",
          "example": "Wireless Bluetooth Headphones"
        },
        {
          "key": "price",
          "type": "number",
          "nullable": true,
          "description": "Price as reported by the source. Currency is given by the currency field.",
          "example": "9.99"
        },
        {
          "key": "currency",
          "type": "string",
          "nullable": true,
          "description": "Three-letter ISO 4217 currency code.",
          "example": "USD"
        },
        {
          "key": "priceRaw",
          "type": "string",
          "nullable": true,
          "description": "Price exactly as the source renders it, before parsing.",
          "example": "<priceRaw>"
        },
        {
          "key": "stars",
          "type": "number",
          "nullable": true,
          "description": "Number of stars recorded upstream.",
          "example": "131"
        },
        {
          "key": "reviewCount",
          "type": "integer",
          "nullable": true,
          "description": "Number of reviews the source counts.",
          "example": "1284"
        },
        {
          "key": "url",
          "type": "string",
          "nullable": true,
          "description": "The URL this row describes.",
          "example": "https://example.com/pricing"
        },
        {
          "key": "imageUrl",
          "type": "string",
          "nullable": true,
          "description": "Direct URL of this image.",
          "example": "https://cdn.example.com/products/1.jpg"
        },
        {
          "key": "category",
          "type": "string",
          "nullable": true,
          "description": "Category this record belongs to, as classified upstream.",
          "example": "electronics"
        },
        {
          "key": "listType",
          "type": "string",
          "nullable": true,
          "description": "Which list this record belongs to.",
          "example": "<listType>"
        },
        {
          "key": "country",
          "type": "string",
          "nullable": true,
          "description": "Country code associated with this record.",
          "example": "US"
        },
        {
          "key": "page",
          "type": "integer",
          "nullable": true,
          "description": "Page number this record came from. 1-based.",
          "example": "1"
        },
        {
          "key": "previousRank",
          "type": "integer",
          "nullable": true,
          "description": "Rank recorded on the previous run.",
          "example": "4"
        },
        {
          "key": "climbedBy",
          "type": "integer",
          "nullable": true,
          "description": "How many places this item moved up since the previous run.",
          "example": "0"
        },
        {
          "key": "movement",
          "type": "string",
          "nullable": true,
          "description": "How this value moved since the previous observation.",
          "example": "<movement>"
        },
        {
          "key": "signal",
          "type": "string",
          "nullable": true,
          "description": "The signal this row represents.",
          "example": "new posting"
        },
        {
          "key": "note",
          "type": "string",
          "nullable": true,
          "description": "Short free-text note recorded with this row.",
          "example": "Verified against the live page on 2026-10-16."
        },
        {
          "key": "checkedAt",
          "type": "string",
          "nullable": true,
          "description": "ISO 8601 timestamp of the most recent check.",
          "example": "2026-10-16T09:12:44.000Z"
        },
        {
          "key": "status",
          "type": "string",
          "nullable": true,
          "description": "Outcome recorded for this row.",
          "example": "ok"
        }
      ],
      "inputs": [
        {
          "key": "categories",
          "type": "array",
          "required": false,
          "secret": false,
          "description": "Category slugs (electronics, books, toys-and-games) or full Best Sellers URLs. Find a slug in any Best Sellers page URL."
        },
        {
          "key": "country",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "Which Amazon marketplace to read. Prices are geolocated, so the proxy country is matched to this automatically."
        },
        {
          "key": "listType",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "Best Sellers (top 100 by sales), New Releases (recent launches climbing), or Movers & Shakers (biggest 24h rank gains)."
        },
        {
          "key": "pages",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Amazon publishes two pages of 50. 1 gives the top 50, 2 gives the full top 100."
        },
        {
          "key": "trackRankChanges",
          "type": "boolean",
          "required": false,
          "secret": false,
          "description": "Compare against the previous run to report new entrants, climbers, fallers and drop-outs. This is the reason to schedule the actor — the first run has nothing to compare to."
        },
        {
          "key": "moversOnly",
          "type": "boolean",
          "required": false,
          "secret": false,
          "description": "Return only new entrants, climbers and fallers — skip products holding the same rank. Turns a 100-row chart into a short list of what actually changed."
        },
        {
          "key": "concurrency",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Keep this low. Amazon rate-limits aggressively and a bot check wastes the whole run."
        },
        {
          "key": "snapshotKey",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "Key-value store key holding the previous run's ranks. Use different keys to track several category sets independently."
        },
        {
          "key": "maxItems",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Hard cap on products returned. You are never charged beyond this."
        },
        {
          "key": "proxyConfiguration",
          "type": "object",
          "required": false,
          "secret": false,
          "description": "Defaults to Apify residential proxy in the marketplace country. Amazon geolocates prices and blocks datacenter IPs, so changing this usually makes results worse."
        }
      ]
    },
    {
      "slug": "link-resurrector",
      "entry": "035",
      "title": "Broken Link Resurrector — Dead Links & Fixes",
      "description": "Finds broken links on your pages and, for each one, suggests the fix: the last working capture from the Internet Archive, whether the site itself still exists, and the exact next action. A report you can act on, not a list of 404s.",
      "categories": [
        "SEO_TOOLS",
        "DEVELOPER_TOOLS"
      ],
      "url": "https://alaudinburki-scrapers.pages.dev/scrapers/link-resurrector/",
      "apifyUrl": "https://apify.com/alaudinburki/link-resurrector",
      "usage": {
        "runs": 34,
        "users": 1,
        "lastRun": "2026-10-15"
      },
      "outputSchema": [
        {
          "key": "url",
          "type": "string",
          "nullable": true,
          "description": "The URL this row describes.",
          "example": "https://example.com/pricing"
        },
        {
          "key": "anchorText",
          "type": "string",
          "nullable": true,
          "description": "Anchor Text as recorded for this row.",
          "example": "View the full comparison"
        },
        {
          "key": "foundOn",
          "type": "string",
          "nullable": true,
          "description": "Where this value was found — the page, field or section.",
          "example": "<foundOn>"
        },
        {
          "key": "httpStatus",
          "type": "integer",
          "nullable": true,
          "description": "HTTP status code returned by the request.",
          "example": "200"
        },
        {
          "key": "state",
          "type": "string",
          "nullable": true,
          "description": "State, province or region name.",
          "example": "active"
        },
        {
          "key": "dead",
          "type": "boolean",
          "nullable": true,
          "description": "Whether the target is no longer reachable or maintained.",
          "example": "true"
        },
        {
          "key": "reason",
          "type": "string",
          "nullable": true,
          "description": "Why this row carries its status.",
          "example": "row retrieved successfully"
        },
        {
          "key": "redirectedTo",
          "type": "string",
          "nullable": true,
          "description": "URL the request was redirected to before settling.",
          "example": "<redirectedTo>"
        },
        {
          "key": "siteStillAlive",
          "type": "boolean",
          "nullable": true,
          "description": "Whether the site still responds after the change was detected.",
          "example": "true"
        },
        {
          "key": "fixType",
          "type": "string",
          "nullable": true,
          "description": "How the fix was applied — upgrade, patch or workaround.",
          "example": "<fixType>"
        },
        {
          "key": "suggestedUrl",
          "type": "string",
          "nullable": true,
          "description": "Suggested Url as recorded for this row.",
          "example": "<suggestedUrl>"
        },
        {
          "key": "confidence",
          "type": "string",
          "nullable": true,
          "description": "How confident the Actor is in this result, from 0 to 1. Not a probability of correctness.",
          "example": "<confidence>"
        },
        {
          "key": "action",
          "type": "string",
          "nullable": true,
          "description": "Action recommended or taken for this row.",
          "example": "upgrade"
        },
        {
          "key": "archivedAt",
          "type": "string",
          "nullable": true,
          "description": "ISO 8601 timestamp of when the page was archived.",
          "example": "<archivedAt>"
        },
        {
          "key": "checkedAt",
          "type": "string",
          "nullable": true,
          "description": "ISO 8601 timestamp of the most recent check.",
          "example": "2026-10-16T09:12:44.000Z"
        },
        {
          "key": "status",
          "type": "string",
          "nullable": true,
          "description": "Outcome recorded for this row.",
          "example": "ok"
        },
        {
          "key": "linksChecked",
          "type": "integer",
          "nullable": true,
          "description": "How many links were checked.",
          "example": "214"
        }
      ],
      "inputs": [
        {
          "key": "pages",
          "type": "array",
          "required": false,
          "secret": false,
          "description": "Pages whose outbound links should be checked. Every <a href> on each page is extracted and tested."
        },
        {
          "key": "urls",
          "type": "array",
          "required": false,
          "secret": false,
          "description": "A list of specific links to check. Use this to feed in output from another crawler, or when the page renders links with JavaScript."
        },
        {
          "key": "findReplacements",
          "type": "boolean",
          "required": false,
          "secret": false,
          "description": "For every dead link, look up the last working capture in the Internet Archive and suggest it as the fix. This is the whole point of the actor — leave it on."
        },
        {
          "key": "brokenOnly",
          "type": "boolean",
          "required": false,
          "secret": false,
          "description": "Return only dead links. Turn this OFF to get a full audit of every link with its status (and a link-rot percentage)."
        },
        {
          "key": "skipInternal",
          "type": "boolean",
          "required": false,
          "secret": false,
          "description": "Ignore links pointing at the same domain as the page they were found on, and check only outbound links."
        },
        {
          "key": "maxLinksPerPage",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Cap on how many links to take from each scanned page."
        },
        {
          "key": "concurrency",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "How many links to check at once. Lower this if you are checking many links on one host."
        },
        {
          "key": "maxItems",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Hard cap on results. You are never charged beyond this."
        },
        {
          "key": "proxyConfiguration",
          "type": "object",
          "required": false,
          "secret": false,
          "description": "Optional proxy. Not needed for most sites."
        }
      ]
    },
    {
      "slug": "http-header-analyzer",
      "entry": "036",
      "title": "HTTP Header & Security Analyzer — Check Headers",
      "description": "Analyze HTTP response headers for many URLs — grade security headers (HSTS, CSP, X-Frame-Options, etc.), and report server/tech info, cookies, and Cloudflare. Great for security and SEO audits. No auth.",
      "categories": [
        "DEVELOPER_TOOLS",
        "AUTOMATION"
      ],
      "url": "https://alaudinburki-scrapers.pages.dev/scrapers/http-header-analyzer/",
      "apifyUrl": "https://apify.com/alaudinburki/http-header-analyzer",
      "usage": {
        "runs": 33,
        "users": 2,
        "lastRun": "2026-10-15"
      },
      "outputSchema": [
        {
          "key": "url",
          "type": "string",
          "nullable": true,
          "description": "The URL this row describes.",
          "example": "https://example.com/pricing"
        },
        {
          "key": "httpStatus",
          "type": "integer",
          "nullable": true,
          "description": "HTTP status code returned by the request.",
          "example": "200"
        },
        {
          "key": "securityGrade",
          "type": "string",
          "nullable": true,
          "description": "Security expressed as a letter grade.",
          "example": "<securityGrade>"
        },
        {
          "key": "securityScore",
          "type": "string",
          "nullable": true,
          "description": "Security score, from 0 to 100.",
          "example": "<securityScore>"
        },
        {
          "key": "missingHeaders",
          "type": "string",
          "nullable": true,
          "description": "Security headers that are absent.",
          "example": "<missingHeaders>"
        },
        {
          "key": "server",
          "type": "string",
          "nullable": true,
          "description": "Server that answered.",
          "example": "<server>"
        },
        {
          "key": "csp",
          "type": "boolean",
          "nullable": true,
          "description": "The Content-Security-Policy header value, when present.",
          "example": "true"
        },
        {
          "key": "hsts",
          "type": "string",
          "nullable": true,
          "description": "The Strict-Transport-Security header value, when present.",
          "example": "<hsts>"
        }
      ],
      "inputs": [
        {
          "key": "urls",
          "type": "array",
          "required": true,
          "secret": false,
          "description": "URLs to analyze."
        },
        {
          "key": "includeAllHeaders",
          "type": "boolean",
          "required": false,
          "secret": false,
          "description": "Attach the full header map per URL."
        },
        {
          "key": "useProxy",
          "type": "boolean",
          "required": false,
          "secret": false,
          "description": "For sites that block datacenter IPs."
        },
        {
          "key": "maxItems",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Hard cap."
        }
      ]
    },
    {
      "slug": "npm-package-info",
      "entry": "037",
      "title": "npm Package Info — Metadata, Downloads & Health",
      "description": "Fetch npm package metadata (version, license, repository, dependencies, maintainers, publish dates) plus download counts, from the public npm registry. No auth.",
      "categories": [
        "DEVELOPER_TOOLS",
        "BUSINESS"
      ],
      "url": "https://alaudinburki-scrapers.pages.dev/scrapers/npm-package-info/",
      "apifyUrl": "https://apify.com/alaudinburki/npm-package-info",
      "usage": {
        "runs": 33,
        "users": 2,
        "lastRun": "2026-10-15"
      },
      "outputSchema": [
        {
          "key": "name",
          "type": "string",
          "nullable": true,
          "description": "Display name as the source writes it.",
          "example": "Bitcoin"
        },
        {
          "key": "latestVersion",
          "type": "string",
          "nullable": true,
          "description": "Most recent version published upstream.",
          "example": "4.2.1"
        },
        {
          "key": "license",
          "type": "string",
          "nullable": true,
          "description": "Licence or registration the record holds.",
          "example": "MIT"
        },
        {
          "key": "repository",
          "type": "string",
          "nullable": true,
          "description": "Source repository URL.",
          "example": "<repository>"
        },
        {
          "key": "dependencies",
          "type": "integer",
          "nullable": true,
          "description": "Number of dependencies.",
          "example": "0"
        },
        {
          "key": "lastPublished",
          "type": "string",
          "nullable": true,
          "description": "ISO 8601 timestamp of the most recent publication.",
          "example": "<lastPublished>"
        },
        {
          "key": "npmUrl",
          "type": "string",
          "nullable": true,
          "description": "Link to this package on npm.",
          "example": "<npmUrl>"
        },
        {
          "key": "maintenanceHealth",
          "type": "integer",
          "nullable": true,
          "description": "Maintenance health on a 0-100 scale.",
          "example": "74"
        },
        {
          "key": "abandonmentRisk",
          "type": "string",
          "nullable": true,
          "description": "How likely this project is to be abandoned, in words.",
          "example": "low"
        },
        {
          "key": "daysSincePublish",
          "type": "integer",
          "nullable": true,
          "description": "Days elapsed since publication.",
          "example": "0"
        },
        {
          "key": "hasTypeScriptTypes",
          "type": "boolean",
          "nullable": true,
          "description": "Whether the package ships its own type definitions.",
          "example": "true"
        },
        {
          "key": "unpackedSizeBytes",
          "type": "integer",
          "nullable": true,
          "description": "Unpacked size in bytes.",
          "example": "0"
        },
        {
          "key": "fileCount",
          "type": "integer",
          "nullable": true,
          "description": "File Count as recorded for this row.",
          "example": "0"
        },
        {
          "key": "deprecated",
          "type": "boolean",
          "nullable": true,
          "description": "Whether this is marked deprecated upstream.",
          "example": "true"
        }
      ],
      "inputs": [
        {
          "key": "packages",
          "type": "array",
          "required": true,
          "secret": false,
          "description": "npm package names (scoped ok, e.g. @types/node)."
        },
        {
          "key": "includeDownloads",
          "type": "boolean",
          "required": false,
          "secret": false,
          "description": "Fetch download stats per package."
        },
        {
          "key": "downloadsPeriod",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "last-day, last-week, or last-month."
        },
        {
          "key": "maxItems",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Hard cap."
        }
      ]
    },
    {
      "slug": "github-repo-scraper",
      "entry": "038",
      "title": "GitHub Repository Scraper — Search, Users, Repos",
      "description": "Scrape GitHub repositories via the public API — by search query, a user's repos, or specific owner/name repos. Stars, forks, language, topics, license, dates. Optional token for higher rate limits.",
      "categories": [
        "DEVELOPER_TOOLS",
        "BUSINESS"
      ],
      "url": "https://alaudinburki-scrapers.pages.dev/scrapers/github-repo-scraper/",
      "apifyUrl": "https://apify.com/alaudinburki/github-repo-scraper",
      "usage": {
        "runs": 32,
        "users": 2,
        "lastRun": "2026-10-15"
      },
      "outputSchema": [
        {
          "key": "fullName",
          "type": "string",
          "nullable": true,
          "description": "Full personal or entity name as published.",
          "example": "Jane Cooper"
        },
        {
          "key": "owner",
          "type": "string",
          "nullable": true,
          "description": "Owner of this record, as the source publishes it.",
          "example": "<owner>"
        },
        {
          "key": "stars",
          "type": "integer",
          "nullable": true,
          "description": "Number of stars recorded upstream.",
          "example": "131"
        },
        {
          "key": "forks",
          "type": "integer",
          "nullable": true,
          "description": "Number of forks recorded upstream.",
          "example": "27"
        },
        {
          "key": "language",
          "type": "string",
          "nullable": true,
          "description": "Language code for this record's text.",
          "example": "en"
        },
        {
          "key": "license",
          "type": "string",
          "nullable": true,
          "description": "Licence or registration the record holds.",
          "example": "MIT"
        },
        {
          "key": "topics",
          "type": "string",
          "nullable": true,
          "description": "Topics this record is about.",
          "example": "[\"pricing\",\"shipping\",\"returns\"]"
        },
        {
          "key": "url",
          "type": "string",
          "nullable": true,
          "description": "The URL this row describes.",
          "example": "https://example.com/pricing"
        },
        {
          "key": "maintenanceHealth",
          "type": "integer",
          "nullable": true,
          "description": "Maintenance health on a 0-100 scale.",
          "example": "74"
        },
        {
          "key": "abandonmentRisk",
          "type": "string",
          "nullable": true,
          "description": "How likely this project is to be abandoned, in words.",
          "example": "low"
        },
        {
          "key": "daysSincePush",
          "type": "integer",
          "nullable": true,
          "description": "Days since the last commit was pushed.",
          "example": "12"
        },
        {
          "key": "openIssues",
          "type": "integer",
          "nullable": true,
          "description": "Open issue count.",
          "example": "0"
        },
        {
          "key": "pushedAt",
          "type": "string",
          "nullable": true,
          "description": "ISO 8601 timestamp of the most recent push.",
          "example": "<pushedAt>"
        }
      ],
      "inputs": [
        {
          "key": "query",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "GitHub repo search query, e.g. 'web scraper language:python stars:>100'."
        },
        {
          "key": "users",
          "type": "array",
          "required": false,
          "secret": false,
          "description": "Fetch all repos for these users/orgs."
        },
        {
          "key": "repos",
          "type": "array",
          "required": false,
          "secret": false,
          "description": "owner/name entries to fetch directly."
        },
        {
          "key": "sort",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "stars, forks, help-wanted-issues, updated."
        },
        {
          "key": "githubToken",
          "type": "string",
          "required": false,
          "secret": true,
          "description": "Secret — supply your own value."
        },
        {
          "key": "maxPages",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "100 repos/page."
        },
        {
          "key": "maxItems",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Hard cap."
        }
      ]
    },
    {
      "slug": "html-table-extractor",
      "entry": "039",
      "title": "HTML Table Extractor — Clean Rows from Any Table",
      "description": "Turn every <table> on a page into clean rows of objects keyed by real headers — handling thead/th, header-row fallback, and colspan. One row per table-row or one row per table. Per-URL reporting.",
      "categories": [
        "DEVELOPER_TOOLS",
        "AUTOMATION"
      ],
      "url": "https://alaudinburki-scrapers.pages.dev/scrapers/html-table-extractor/",
      "apifyUrl": "https://apify.com/alaudinburki/html-table-extractor",
      "usage": {
        "runs": 32,
        "users": 2,
        "lastRun": "2026-10-16"
      },
      "outputSchema": [
        {
          "key": "tableIndex",
          "type": "integer",
          "nullable": true,
          "description": "Zero-based index of the table within the document.",
          "example": ""
        },
        {
          "key": "status",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Outcome recorded for this row.",
          "example": "ok"
        },
        {
          "key": "url",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "The URL this row describes.",
          "example": "[]"
        },
        {
          "key": "headers",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Headers as recorded for this row.",
          "example": "[]"
        },
        {
          "key": "rowCount",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "How many rows this record represents, when rows are grouped.",
          "example": "[]"
        },
        {
          "key": "colCount",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Col Count as recorded for this row.",
          "example": "[]"
        },
        {
          "key": "rows",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "How many rows this item contributed.",
          "example": "120"
        }
      ],
      "inputs": [
        {
          "key": "urls",
          "type": "array",
          "required": true,
          "secret": false,
          "description": "Pages containing tables (with or without https://)."
        },
        {
          "key": "output",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "rows = one dataset row per table row (flat, CSV-friendly). tables = one row per table with its rows nested."
        },
        {
          "key": "minRows",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Ignore tiny layout tables below this many data rows."
        },
        {
          "key": "tableIndex",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Extract only the Nth qualifying table on each page (0-based). Leave empty for all."
        },
        {
          "key": "useProxy",
          "type": "boolean",
          "required": false,
          "secret": false,
          "description": "Route through a proxy for sites that block datacenter IPs."
        },
        {
          "key": "maxConcurrency",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "How many pages to fetch in parallel."
        },
        {
          "key": "maxItems",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Hard cap. Strictly enforced."
        }
      ]
    },
    {
      "slug": "typosquat-brand-abuse-monitor",
      "entry": "040",
      "title": "Typosquat Monitor — Find Fake Lookalike Domains",
      "description": "Generate every plausible lookalike of your domain using 11 attack techniques (homoglyphs, keyboard slips, TLD swaps, combosquatting) and find which are registered - and critically, which have MX records and can receive phishing or invoice-fraud email. Free DNS, no key, no login.",
      "categories": [
        "BUSINESS",
        "DEVELOPER_TOOLS"
      ],
      "url": "https://alaudinburki-scrapers.pages.dev/scrapers/typosquat-brand-abuse-monitor/",
      "apifyUrl": "https://apify.com/alaudinburki/typosquat-brand-abuse-monitor",
      "usage": {
        "runs": 32,
        "users": 2,
        "lastRun": "2026-10-15"
      },
      "outputSchema": [
        {
          "key": "domain",
          "type": "string",
          "nullable": true,
          "description": "Domain name, without the scheme.",
          "example": "example.com"
        },
        {
          "key": "threatScore",
          "type": "integer",
          "nullable": true,
          "description": "Threat score, from 0 to 100. Higher is more threatening.",
          "example": "0"
        },
        {
          "key": "threatLevel",
          "type": "string",
          "nullable": true,
          "description": "Threat level in words.",
          "example": "<threatLevel>"
        },
        {
          "key": "capability",
          "type": "string",
          "nullable": true,
          "description": "Capability as recorded for this row.",
          "example": "<capability>"
        },
        {
          "key": "hasMailServer",
          "type": "boolean",
          "nullable": true,
          "description": "Whether the domain publishes mail servers.",
          "example": "true"
        },
        {
          "key": "hasWebsite",
          "type": "boolean",
          "nullable": true,
          "description": "Whether a website was found.",
          "example": "true"
        },
        {
          "key": "technique",
          "type": "string",
          "nullable": true,
          "description": "Technique the source documents for this entry.",
          "example": "<technique>"
        },
        {
          "key": "registered",
          "type": "boolean",
          "nullable": true,
          "description": "Whether the entity is registered.",
          "example": "true"
        },
        {
          "key": "watchedDomain",
          "type": "string",
          "nullable": true,
          "description": "Domain this run was configured to watch.",
          "example": "<watchedDomain>"
        },
        {
          "key": "ipAddresses",
          "type": "string",
          "nullable": true,
          "description": "IP addresses the name resolves to.",
          "example": "<ipAddresses>"
        },
        {
          "key": "mailServers",
          "type": "string",
          "nullable": true,
          "description": "Mail servers the domain uses.",
          "example": "<mailServers>"
        },
        {
          "key": "recommendation",
          "type": "string",
          "nullable": true,
          "description": "The recommended action for this row.",
          "example": "Review the price change before it propagates."
        },
        {
          "key": "checkedAt",
          "type": "string",
          "nullable": true,
          "description": "ISO 8601 timestamp of the most recent check.",
          "example": "2026-10-16T09:12:44.000Z"
        },
        {
          "key": "status",
          "type": "string",
          "nullable": true,
          "description": "Outcome recorded for this row.",
          "example": "ok"
        }
      ],
      "inputs": [
        {
          "key": "domains",
          "type": "array",
          "required": true,
          "secret": false,
          "description": "The domains to protect. Lookalikes are generated from these."
        },
        {
          "key": "techniques",
          "type": "array",
          "required": false,
          "secret": false,
          "description": "Leave empty to use all 11. Fewer techniques = faster, cheaper runs."
        },
        {
          "key": "checkEmailCapability",
          "type": "boolean",
          "required": false,
          "secret": false,
          "description": "Strongly recommended. A lookalike with MX records can RECEIVE EMAIL — that is invoice-fraud and credential-phishing infrastructure, and it is the single most important finding this actor produces."
        },
        {
          "key": "registeredOnly",
          "type": "boolean",
          "required": false,
          "secret": false,
          "description": "On by default. Turn off to also list unregistered variants you may want to defensively register."
        },
        {
          "key": "minThreatScore",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Filter out low-signal hits. 40+ = medium, 60+ = high, 80+ = critical."
        },
        {
          "key": "maxVariantsPerDomain",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Caps how wide the net goes. 800 is thorough; lower it for a fast scan."
        },
        {
          "key": "tlds",
          "type": "array",
          "required": false,
          "secret": false,
          "description": "Leave empty for the commonly abused defaults (.com .co .cm .om .net .org .io .app …)."
        },
        {
          "key": "comboWords",
          "type": "array",
          "required": false,
          "secret": false,
          "description": "Leave empty for the defaults (login, secure, verify, billing, support …)."
        },
        {
          "key": "concurrency",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "10 is a good balance."
        },
        {
          "key": "maxItems",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Hard limit, strictly enforced."
        }
      ]
    },
    {
      "slug": "website-uptime-checker",
      "entry": "041",
      "title": "Website Uptime Checker — Status & Response Times",
      "description": "Check many URLs for uptime, HTTP status, and response time — with optional expected-status and keyword checks. Fails the run when a site is down so scheduled alerts fire. No auth.",
      "categories": [
        "DEVELOPER_TOOLS",
        "AUTOMATION"
      ],
      "url": "https://alaudinburki-scrapers.pages.dev/scrapers/website-uptime-checker/",
      "apifyUrl": "https://apify.com/alaudinburki/website-uptime-checker",
      "usage": {
        "runs": 32,
        "users": 2,
        "lastRun": "2026-10-15"
      },
      "outputSchema": [
        {
          "key": "url",
          "type": "string",
          "nullable": true,
          "description": "The URL this row describes.",
          "example": "https://example.com/pricing"
        },
        {
          "key": "up",
          "type": "boolean",
          "nullable": true,
          "description": "Whether the service responded successfully.",
          "example": "true"
        },
        {
          "key": "state",
          "type": "string",
          "nullable": true,
          "description": "State, province or region name.",
          "example": "active"
        },
        {
          "key": "httpStatus",
          "type": "integer",
          "nullable": true,
          "description": "HTTP status code returned by the request.",
          "example": "200"
        },
        {
          "key": "responseTimeMs",
          "type": "integer",
          "nullable": true,
          "description": "Time the request took, in milliseconds.",
          "example": "0"
        },
        {
          "key": "finalUrl",
          "type": "string",
          "nullable": true,
          "description": "URL of the final response after any redirects.",
          "example": "https://example.com/products/widget"
        },
        {
          "key": "contentType",
          "type": "string",
          "nullable": true,
          "description": "Content type of the response.",
          "example": "application/json"
        },
        {
          "key": "sizeBytes",
          "type": "integer",
          "nullable": true,
          "description": "Size in bytes.",
          "example": "0"
        },
        {
          "key": "checkedAt",
          "type": "string",
          "nullable": true,
          "description": "ISO 8601 timestamp of the most recent check.",
          "example": "2026-10-16T09:12:44.000Z"
        }
      ],
      "inputs": [
        {
          "key": "urls",
          "type": "array",
          "required": true,
          "secret": false,
          "description": "URLs to check."
        },
        {
          "key": "expectStatus",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Flag down if the status differs (e.g. 200)."
        },
        {
          "key": "expectText",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "Flag down if the page body doesn't contain this string."
        },
        {
          "key": "failOnDown",
          "type": "boolean",
          "required": false,
          "secret": false,
          "description": "On: the run FAILs when any URL is down, so a Schedule's failure alert fires."
        },
        {
          "key": "timeoutMs",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Per-URL timeout."
        },
        {
          "key": "useProxy",
          "type": "boolean",
          "required": false,
          "secret": false,
          "description": "For sites that block datacenter IPs."
        },
        {
          "key": "maxItems",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Hard cap."
        }
      ]
    },
    {
      "slug": "format-converter",
      "entry": "042",
      "title": "Format Converter — JSON, CSV, Excel, XML",
      "description": "Convert data between JSON, CSV, TSV, Excel (xlsx), and XML. Takes an Apify dataset, inline items, or raw text; flattens nested data, keeps a stable column union, and saves a downloadable file. Pure logic, no anti-bot.",
      "categories": [
        "AUTOMATION",
        "DEVELOPER_TOOLS"
      ],
      "url": "https://alaudinburki-scrapers.pages.dev/scrapers/format-converter/",
      "apifyUrl": "https://apify.com/alaudinburki/format-converter",
      "usage": {
        "runs": 31,
        "users": 2,
        "lastRun": "2026-10-16"
      },
      "outputSchema": [
        {
          "key": "status",
          "type": "string",
          "nullable": false,
          "description": "Outcome recorded for this row.",
          "example": "active"
        },
        {
          "key": "message",
          "type": "string",
          "nullable": false,
          "description": "Human-readable note about this row or the run.",
          "example": "Add your API key to classify answers. No text was sent anywhere."
        },
        {
          "key": "rowsReturned",
          "type": "number",
          "nullable": false,
          "description": "How many rows the run returned. Zero on a blocked run, which is a real value and the entire point of such a record.",
          "example": "0"
        }
      ],
      "inputs": [
        {
          "key": "outputFormat",
          "type": "string",
          "required": true,
          "secret": false,
          "description": "What to convert the data into."
        },
        {
          "key": "datasetId",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "An Apify dataset to convert (e.g. a scraper run's defaultDatasetId)."
        },
        {
          "key": "items",
          "type": "array",
          "required": false,
          "secret": false,
          "description": "Rows to convert directly."
        },
        {
          "key": "sourceText",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "Paste raw CSV, JSON, TSV, or Excel data to convert. Format is auto-detected unless you set inputFormat."
        },
        {
          "key": "inputFormat",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "Override auto-detection of sourceText."
        },
        {
          "key": "fileName",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "Base name for the output file. The extension is added automatically."
        },
        {
          "key": "delimiter",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "Delimiter for CSV in/out (default comma). TSV always uses tab."
        },
        {
          "key": "maxItems",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Cap on rows converted. Leave empty for all."
        }
      ]
    },
    {
      "slug": "sanctions-watchlist-screening",
      "entry": "043",
      "title": "Sanctions Screening — OFAC & UN Watchlists",
      "description": "Screen people and companies against official OFAC SDN, OFAC Consolidated and UN Security Council sanctions lists. Alias-aware fuzzy matching with a 0-100 score and risk level, so spelling variants are caught. Free official sources - no API key, no login.",
      "categories": [
        "BUSINESS",
        "AUTOMATION"
      ],
      "url": "https://alaudinburki-scrapers.pages.dev/scrapers/sanctions-watchlist-screening/",
      "apifyUrl": "https://apify.com/alaudinburki/sanctions-watchlist-screening",
      "usage": {
        "runs": 31,
        "users": 2,
        "lastRun": "2026-10-16"
      },
      "outputSchema": [
        {
          "key": "query",
          "type": "string",
          "nullable": true,
          "description": "The query that produced this row.",
          "example": "shopify scraper"
        },
        {
          "key": "matchScore",
          "type": "integer",
          "nullable": true,
          "description": "How well this row matched the query, on the Actor's own scale.",
          "example": "0"
        },
        {
          "key": "riskLevel",
          "type": "string",
          "nullable": true,
          "description": "Risk level in words.",
          "example": "<riskLevel>"
        },
        {
          "key": "matchType",
          "type": "string",
          "nullable": true,
          "description": "How the match was made — exact, phrase, broad or inferred.",
          "example": "<matchType>"
        },
        {
          "key": "matchedName",
          "type": "string",
          "nullable": true,
          "description": "Name that matched.",
          "example": "<matchedName>"
        },
        {
          "key": "matchedOn",
          "type": "string",
          "nullable": true,
          "description": "Which field matched.",
          "example": "title"
        },
        {
          "key": "entityType",
          "type": "string",
          "nullable": true,
          "description": "Legal form of the entity.",
          "example": "<entityType>"
        },
        {
          "key": "programs",
          "type": "string",
          "nullable": true,
          "description": "Programmes this record belongs to.",
          "example": "<programs>"
        },
        {
          "key": "title",
          "type": "string",
          "nullable": true,
          "description": "Title as the source writes it.",
          "example": "Wireless Bluetooth Headphones"
        },
        {
          "key": "aliases",
          "type": "string",
          "nullable": true,
          "description": "Alternative names this entity is known by.",
          "example": "<aliases>"
        },
        {
          "key": "remarks",
          "type": "string",
          "nullable": true,
          "description": "Free-text remarks published alongside the source record.",
          "example": "<remarks>"
        },
        {
          "key": "sourceLabel",
          "type": "string",
          "nullable": true,
          "description": "Human-readable label for the source this row came from.",
          "example": "<sourceLabel>"
        },
        {
          "key": "uid",
          "type": "string",
          "nullable": true,
          "description": "Unique identifier for this record within the run.",
          "example": "<uid>"
        },
        {
          "key": "status",
          "type": "string",
          "nullable": true,
          "description": "Outcome recorded for this row.",
          "example": "ok"
        },
        {
          "key": "name",
          "type": "string",
          "nullable": true,
          "description": "Display name as the source writes it.",
          "example": "Bitcoin"
        }
      ],
      "inputs": [
        {
          "key": "names",
          "type": "array",
          "required": false,
          "secret": false,
          "description": "People or companies to check. Leave EMPTY to download the full consolidated list instead of screening."
        },
        {
          "key": "sources",
          "type": "array",
          "required": false,
          "secret": false,
          "description": "Official sources to screen against."
        },
        {
          "key": "minMatchScore",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "How close a name must be to count as a hit. 75 is a balanced default; lower it to catch more spelling variants (and more false positives)."
        },
        {
          "key": "maxMatchesPerName",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Caps how many candidates are returned for each screened name."
        },
        {
          "key": "useProxy",
          "type": "boolean",
          "required": false,
          "secret": false,
          "description": "Route the list downloads through Apify Proxy. Rarely needed — the sources are public."
        },
        {
          "key": "maxItems",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Hard limit, strictly enforced. You are never charged beyond this."
        }
      ]
    },
    {
      "slug": "dns-lookup-bulk",
      "entry": "044",
      "title": "Bulk DNS Lookup — A, MX, TXT, NS & CNAME Records",
      "description": "Resolve DNS records (A, AAAA, MX, TXT, NS, CNAME, SOA, CAA, SRV) for many domains at once over DNS-over-HTTPS — with TTLs and NXDOMAIN detection. No auth.",
      "categories": [
        "DEVELOPER_TOOLS",
        "AUTOMATION"
      ],
      "url": "https://alaudinburki-scrapers.pages.dev/scrapers/dns-lookup-bulk/",
      "apifyUrl": "https://apify.com/alaudinburki/dns-lookup-bulk",
      "usage": {
        "runs": 30,
        "users": 2,
        "lastRun": "2026-10-15"
      },
      "outputSchema": [
        {
          "key": "domain",
          "type": "string",
          "nullable": true,
          "description": "Domain name, without the scheme.",
          "example": "example.com"
        },
        {
          "key": "queryType",
          "type": "string",
          "nullable": true,
          "description": "Query Type as recorded for this row.",
          "example": "<queryType>"
        },
        {
          "key": "status",
          "type": "string",
          "nullable": true,
          "description": "Outcome recorded for this row.",
          "example": "ok"
        },
        {
          "key": "type",
          "type": "string",
          "nullable": true,
          "description": "Type of this record, as classified by the Actor.",
          "example": "article"
        },
        {
          "key": "value",
          "type": "string",
          "nullable": true,
          "description": "Value as recorded for this row.",
          "example": "42.5"
        },
        {
          "key": "ttl",
          "type": "integer",
          "nullable": true,
          "description": "Time to live, in seconds, before the record is considered stale.",
          "example": "0"
        }
      ],
      "inputs": [
        {
          "key": "domains",
          "type": "array",
          "required": true,
          "secret": false,
          "description": "Domains to resolve (URLs are accepted; host is used)."
        },
        {
          "key": "recordTypes",
          "type": "array",
          "required": false,
          "secret": false,
          "description": "A, AAAA, MX, TXT, NS, CNAME, SOA, CAA, SRV, PTR."
        },
        {
          "key": "maxItems",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Hard cap."
        }
      ]
    },
    {
      "slug": "dependency-vulnerability-advisor",
      "entry": "045",
      "title": "Dependency Vulnerability Advisor — Exploited-First Triage",
      "description": "Scan dependencies against the OSV database and get the exact version to upgrade to. Cross-references CISA KEV and EPSS so you see which findings are actually being exploited in the wild, not just which have a scary CVSS score. Turns a list of CVEs into a ranked fix list.",
      "categories": [
        "DEVELOPER_TOOLS",
        "AUTOMATION"
      ],
      "url": "https://alaudinburki-scrapers.pages.dev/scrapers/dependency-vulnerability-advisor/",
      "apifyUrl": "https://apify.com/alaudinburki/dependency-vulnerability-advisor",
      "usage": {
        "runs": 30,
        "users": 2,
        "lastRun": "2026-10-15"
      },
      "outputSchema": [
        {
          "key": "package",
          "type": "string",
          "nullable": true,
          "description": "Package name.",
          "example": "lodash"
        },
        {
          "key": "ecosystem",
          "type": "string",
          "nullable": true,
          "description": "Package ecosystem, for example npm, PyPI or Maven.",
          "example": "<ecosystem>"
        },
        {
          "key": "currentVersion",
          "type": "string",
          "nullable": true,
          "description": "Version currently in use.",
          "example": "4.17.21"
        },
        {
          "key": "vulnerabilityId",
          "type": "string",
          "nullable": true,
          "description": "Identifier of this vulnerability.",
          "example": "<vulnerabilityId>"
        },
        {
          "key": "cve",
          "type": "string",
          "nullable": true,
          "description": "CVE identifier for this vulnerability.",
          "example": "<cve>"
        },
        {
          "key": "severity",
          "type": "string",
          "nullable": true,
          "description": "Severity as classified by the source.",
          "example": "moderate"
        },
        {
          "key": "severityRank",
          "type": "integer",
          "nullable": true,
          "description": "Numeric severity, for sorting. Higher is more severe.",
          "example": "0"
        },
        {
          "key": "summary",
          "type": "string",
          "nullable": true,
          "description": "Short human-readable summary of this row.",
          "example": "Price changed: $9 → $12"
        },
        {
          "key": "fixedVersion",
          "type": "string",
          "nullable": true,
          "description": "Nearest version that contains the fix.",
          "example": "<fixedVersion>"
        },
        {
          "key": "fixAvailable",
          "type": "boolean",
          "nullable": true,
          "description": "Whether a fixed version exists.",
          "example": "true"
        },
        {
          "key": "upgradeTarget",
          "type": "string",
          "nullable": true,
          "description": "Version the upgrade would move to.",
          "example": "<upgradeTarget>"
        },
        {
          "key": "packageVulnerabilityCount",
          "type": "integer",
          "nullable": true,
          "description": "Package Vulnerability Count as recorded for this row.",
          "example": "0"
        },
        {
          "key": "recommendation",
          "type": "string",
          "nullable": true,
          "description": "The recommended action for this row.",
          "example": "Review the price change before it propagates."
        },
        {
          "key": "cwe",
          "type": "string",
          "nullable": true,
          "description": "CWE identifier describing the weakness class.",
          "example": "<cwe>"
        },
        {
          "key": "published",
          "type": "string",
          "nullable": true,
          "description": "Date the advisory or version was published.",
          "example": "<published>"
        },
        {
          "key": "advisoryUrl",
          "type": "string",
          "nullable": true,
          "description": "Link to the advisory at its source.",
          "example": "<advisoryUrl>"
        },
        {
          "key": "dependencyType",
          "type": "string",
          "nullable": true,
          "description": "Whether the dependency is direct or transitive.",
          "example": "<dependencyType>"
        },
        {
          "key": "status",
          "type": "string",
          "nullable": true,
          "description": "Outcome recorded for this row.",
          "example": "ok"
        },
        {
          "key": "packagesChecked",
          "type": "integer",
          "nullable": true,
          "description": "How many packages were checked.",
          "example": "0"
        },
        {
          "key": "checkedAt",
          "type": "string",
          "nullable": true,
          "description": "ISO 8601 timestamp of the most recent check.",
          "example": "2026-10-16T09:12:44.000Z"
        },
        {
          "key": "allFixedVersions",
          "type": "string",
          "nullable": true,
          "description": "Every version known to contain the fix.",
          "example": "<allFixedVersions>"
        },
        {
          "key": "safeTarget",
          "type": "string",
          "nullable": true,
          "description": "A recognised safe CNAME target.",
          "example": "<safeTarget>"
        },
        {
          "key": "clearedBySafeTarget",
          "type": "integer",
          "nullable": true,
          "description": "Whether a recognised safe target cleared this subdomain.",
          "example": "0"
        },
        {
          "key": "needsMajorUpgrade",
          "type": "boolean",
          "nullable": true,
          "description": "Whether moving to the latest requires a breaking-change upgrade.",
          "example": "true"
        },
        {
          "key": "knownExploited",
          "type": "boolean",
          "nullable": true,
          "description": "Whether the vulnerability appears in a known-exploited list.",
          "example": "true"
        },
        {
          "key": "kevRansomware",
          "type": "boolean",
          "nullable": true,
          "description": "Whether the vulnerability is used in known ransomware campaigns.",
          "example": "true"
        },
        {
          "key": "kevDueDate",
          "type": "string",
          "nullable": true,
          "description": "Remediation deadline set for this known-exploited vulnerability.",
          "example": "<kevDueDate>"
        },
        {
          "key": "epssScore",
          "type": "number",
          "nullable": true,
          "description": "Exploit Prediction Scoring System probability, from 0 to 1.",
          "example": "0"
        },
        {
          "key": "epssPercentile",
          "type": "number",
          "nullable": true,
          "description": "EPSS percentile, from 0 to 1.",
          "example": "0"
        },
        {
          "key": "priority",
          "type": "string",
          "nullable": true,
          "description": "Priority assigned to this row.",
          "example": "high"
        },
        {
          "key": "priorityRank",
          "type": "integer",
          "nullable": true,
          "description": "Priority expressed as an orderable rank. Lower is more urgent.",
          "example": "0"
        },
        {
          "key": "why",
          "type": "string",
          "nullable": true,
          "description": "Why the Actor reached this conclusion.",
          "example": "<why>"
        }
      ],
      "inputs": [
        {
          "key": "packages",
          "type": "array",
          "required": false,
          "secret": false,
          "description": "Explicit packages as ecosystem:name@version, e.g. npm:lodash@4.17.15 or pypi:django@3.2.1. Scoped npm names work: npm:@babel/core@7.0.0."
        },
        {
          "key": "manifestUrls",
          "type": "array",
          "required": false,
          "secret": false,
          "description": "Public URLs to a package.json, package-lock.json or requirements.txt — raw.githubusercontent.com links work well. A lockfile is best: it lists what you actually run, not a range."
        },
        {
          "key": "defaultEcosystem",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "Used when a package is given without an ecosystem prefix."
        },
        {
          "key": "minSeverity",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "Only return findings at or above this level."
        },
        {
          "key": "concurrency",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "How many packages to query at once."
        },
        {
          "key": "maxItems",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Hard cap on findings returned. You are never charged beyond this."
        },
        {
          "key": "checkExploitation",
          "type": "boolean",
          "required": false,
          "secret": false,
          "description": "Cross-reference every finding against CISA KEV (confirmed exploited in the wild) and EPSS (probability of exploitation in the next 30 days). This is what turns a list of findings into triage — a MODERATE CVE being actively exploited matters more than a CRITICAL one nobody is using."
        }
      ]
    },
    {
      "slug": "app-store-charts-tracker",
      "entry": "046",
      "title": "App Store Charts — Daily App Rank Movement",
      "description": "Track App Store Top Free and Top Paid charts by country, and see exactly which apps moved since your last run: rank change, direction, new entries and drop-outs. Apple's official free feed - no key, no login, no anti-bot.",
      "categories": [
        "ECOMMERCE",
        "BUSINESS"
      ],
      "url": "https://alaudinburki-scrapers.pages.dev/scrapers/app-store-charts-tracker/",
      "apifyUrl": "https://apify.com/alaudinburki/app-store-charts-tracker",
      "usage": {
        "runs": 29,
        "users": 2,
        "lastRun": "2026-10-15"
      },
      "outputSchema": [
        {
          "key": "rank",
          "type": "integer",
          "nullable": true,
          "description": "Position in the source's own ordering. 1 is highest.",
          "example": "1"
        },
        {
          "key": "appName",
          "type": "string",
          "nullable": true,
          "description": "Name of the application.",
          "example": "<appName>"
        },
        {
          "key": "developer",
          "type": "string",
          "nullable": true,
          "description": "Developer or publisher of this artefact.",
          "example": "<developer>"
        },
        {
          "key": "signal",
          "type": "string",
          "nullable": true,
          "description": "The signal this row represents.",
          "example": "new posting"
        },
        {
          "key": "rankChange",
          "type": "integer",
          "nullable": true,
          "description": "Movement in rank since the previous run. Positive means it climbed.",
          "example": "0"
        },
        {
          "key": "previousRank",
          "type": "integer",
          "nullable": true,
          "description": "Rank recorded on the previous run.",
          "example": "4"
        },
        {
          "key": "direction",
          "type": "string",
          "nullable": true,
          "description": "Direction of the movement or relationship.",
          "example": "<direction>"
        },
        {
          "key": "isNewEntry",
          "type": "boolean",
          "nullable": true,
          "description": "Whether this row is new since the previous run of the same monitor.",
          "example": "true"
        },
        {
          "key": "genre",
          "type": "string",
          "nullable": true,
          "description": "Genre classification.",
          "example": "Documentary"
        },
        {
          "key": "country",
          "type": "string",
          "nullable": true,
          "description": "Country code associated with this record.",
          "example": "US"
        },
        {
          "key": "chartLabel",
          "type": "string",
          "nullable": true,
          "description": "Label used when this figure is charted.",
          "example": "<chartLabel>"
        },
        {
          "key": "appId",
          "type": "string",
          "nullable": true,
          "description": "Identifier of the application.",
          "example": "<appId>"
        },
        {
          "key": "appUrl",
          "type": "string",
          "nullable": true,
          "description": "Link to the application.",
          "example": "<appUrl>"
        },
        {
          "key": "releaseDate",
          "type": "string",
          "nullable": true,
          "description": "Date the release was published.",
          "example": "<releaseDate>"
        },
        {
          "key": "status",
          "type": "string",
          "nullable": true,
          "description": "Outcome recorded for this row.",
          "example": "ok"
        }
      ],
      "inputs": [
        {
          "key": "countries",
          "type": "array",
          "required": false,
          "secret": false,
          "description": "Two-letter store country codes, e.g. us, gb, de, pk."
        },
        {
          "key": "charts",
          "type": "array",
          "required": false,
          "secret": false,
          "description": "Which charts to pull."
        },
        {
          "key": "limit",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "How many ranks to pull per chart (max 200)."
        },
        {
          "key": "trackRankChanges",
          "type": "boolean",
          "required": false,
          "secret": false,
          "description": "Compare against your previous run and add previousRank, rankChange, direction and a signal (surging/rising/falling/plunging/new_entry). Schedule the actor daily to build the trend."
        },
        {
          "key": "moversOnly",
          "type": "boolean",
          "required": false,
          "secret": false,
          "description": "Return just the apps whose rank changed since the last run — the alert view."
        },
        {
          "key": "includeDropouts",
          "type": "boolean",
          "required": false,
          "secret": false,
          "description": "Add a row for apps that were in the chart last run but are gone now."
        },
        {
          "key": "useProxy",
          "type": "boolean",
          "required": false,
          "secret": false,
          "description": "Rarely needed — the Apple feed is public."
        },
        {
          "key": "maxItems",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Hard limit, strictly enforced."
        }
      ]
    },
    {
      "slug": "dataset-profiler",
      "entry": "047",
      "title": "Dataset Profiler — Data Quality Report for CSVs",
      "description": "Profile any Apify dataset into a per-column report: inferred type, type consistency, null rate, distinct count, uniqueness, value ranges, and top values — plus duplicate-row and empty-column detection. QA any scrape before you trust it.",
      "categories": [
        "DEVELOPER_TOOLS",
        "AUTOMATION"
      ],
      "url": "https://alaudinburki-scrapers.pages.dev/scrapers/dataset-profiler/",
      "apifyUrl": "https://apify.com/alaudinburki/dataset-profiler",
      "usage": {
        "runs": 29,
        "users": 2,
        "lastRun": "2026-10-15"
      },
      "outputSchema": [
        {
          "key": "column",
          "type": "string",
          "nullable": true,
          "description": "Column name.",
          "example": "<column>"
        },
        {
          "key": "inferredType",
          "type": "string",
          "nullable": true,
          "description": "Inferred Type as recorded for this row.",
          "example": "<inferredType>"
        },
        {
          "key": "typeConsistency",
          "type": "number",
          "nullable": true,
          "description": "Share of values matching the declared type, between 0 and 1.",
          "example": "0"
        },
        {
          "key": "filled",
          "type": "integer",
          "nullable": true,
          "description": "How many slots were populated out of those requested.",
          "example": "0"
        },
        {
          "key": "nulls",
          "type": "integer",
          "nullable": true,
          "description": "How many values in this row are null.",
          "example": "0"
        },
        {
          "key": "nullRate",
          "type": "number",
          "nullable": true,
          "description": "Share of this row's values that are null, between 0 and 1. A high rate often means a selector stopped matching.",
          "example": "0"
        },
        {
          "key": "distinct",
          "type": "integer",
          "nullable": true,
          "description": "Whether this value occurs only once across the dataset.",
          "example": "0"
        },
        {
          "key": "unique",
          "type": "boolean",
          "nullable": true,
          "description": "Whether this record is the only one carrying its key.",
          "example": "true"
        }
      ],
      "inputs": [
        {
          "key": "datasetId",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "The Apify dataset to profile (e.g. a scraper run's defaultDatasetId)."
        },
        {
          "key": "items",
          "type": "array",
          "required": false,
          "secret": false,
          "description": "Rows to profile directly."
        },
        {
          "key": "sampleSize",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Profile only the first N rows (faster for huge datasets). Leave empty to profile all."
        }
      ]
    },
    {
      "slug": "lead-list-deduplicator",
      "entry": "048",
      "title": "Lead List Deduplicator & Merger — Dedupe CSV Lists",
      "description": "Clean and merge lead lists: collapse duplicates by email, domain, or phone with smart normalization (gmail dots/+tags, www, phone formats) and merge each group into one complete row — with a report of what was merged. No silent drops.",
      "categories": [
        "LEAD_GENERATION",
        "AUTOMATION"
      ],
      "url": "https://alaudinburki-scrapers.pages.dev/scrapers/lead-list-deduplicator/",
      "apifyUrl": "https://apify.com/alaudinburki/lead-list-deduplicator",
      "usage": {
        "runs": 29,
        "users": 2,
        "lastRun": "2026-10-16"
      },
      "outputSchema": [
        {
          "key": "_mergedFrom",
          "type": "number",
          "nullable": false,
          "description": "How many input rows were merged into this one. Added by this Actor, not present in the input.",
          "example": "3"
        },
        {
          "key": "_mergedFields",
          "type": "string",
          "nullable": false,
          "description": "Which fields were filled in from a duplicate row. Added by this Actor, and null when nothing was filled.",
          "example": "email"
        },
        {
          "key": "_noKey",
          "type": "boolean",
          "nullable": false,
          "description": "Whether the row carried no deduplication key at all. Such a row cannot be merged, so it is passed through unchanged and marked here.",
          "example": "false"
        },
        {
          "key": "status",
          "type": "string",
          "nullable": false,
          "description": "Outcome recorded for this row.",
          "example": "active"
        },
        {
          "key": "message",
          "type": "string",
          "nullable": false,
          "description": "Human-readable note about this row or the run.",
          "example": "Add your API key to classify answers. No text was sent anywhere."
        },
        {
          "key": "rowsReturned",
          "type": "number",
          "nullable": false,
          "description": "How many rows the run returned. Zero on a blocked run, which is a real value and the entire point of such a record.",
          "example": "0"
        }
      ],
      "inputs": [
        {
          "key": "datasetId",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "An Apify dataset to clean (e.g. a lead-finder run's defaultDatasetId)."
        },
        {
          "key": "datasetIds",
          "type": "array",
          "required": false,
          "secret": false,
          "description": "Merge and dedupe across multiple datasets at once."
        },
        {
          "key": "items",
          "type": "array",
          "required": false,
          "secret": false,
          "description": "Rows to deduplicate directly, if you have no dataset."
        },
        {
          "key": "keyFields",
          "type": "array",
          "required": false,
          "secret": false,
          "description": "Fields that identify a duplicate. Common: email, website/domain, phone. Multiple fields = a row must match on ALL of them to be a duplicate. Email/domain/phone are normalized smartly."
        },
        {
          "key": "mergeStrategy",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "How to combine duplicates: first (keep earliest non-empty value, fill gaps from others), last, or mostComplete (start from the fullest row)."
        },
        {
          "key": "dropRowsWithoutKey",
          "type": "boolean",
          "required": false,
          "secret": false,
          "description": "Off (default): rows lacking the match field are kept and flagged _noKey. On: they're dropped."
        },
        {
          "key": "maxItems",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Cap on unique rows returned. Leave empty to return all."
        }
      ]
    },
    {
      "slug": "url-metadata-extractor",
      "entry": "049",
      "title": "URL Metadata & Open Graph Extractor — Link Previews",
      "description": "Fetch URLs and extract clean, unified metadata — title, description, Open Graph and Twitter card tags, canonical, favicon — with relative URLs resolved to absolute and per-URL status. Ideal for link previews and content pipelines.",
      "categories": [
        "SEO_TOOLS",
        "DEVELOPER_TOOLS"
      ],
      "url": "https://alaudinburki-scrapers.pages.dev/scrapers/url-metadata-extractor/",
      "apifyUrl": "https://apify.com/alaudinburki/url-metadata-extractor",
      "usage": {
        "runs": 29,
        "users": 2,
        "lastRun": "2026-10-16"
      },
      "outputSchema": [
        {
          "key": "url",
          "type": "string",
          "nullable": true,
          "description": "The URL this row describes.",
          "example": "https://example.com/pricing"
        },
        {
          "key": "title",
          "type": "string",
          "nullable": true,
          "description": "Title as the source writes it.",
          "example": "Wireless Bluetooth Headphones"
        },
        {
          "key": "description",
          "type": "string",
          "nullable": true,
          "description": "Description of this record, as published by the source.",
          "example": "<description>"
        },
        {
          "key": "ogTitle",
          "type": "string",
          "nullable": true,
          "description": "Title the page declares for social sharing.",
          "example": "<ogTitle>"
        },
        {
          "key": "ogImage",
          "type": "string",
          "nullable": true,
          "description": "URL of the page's OpenGraph image, used when the page is shared.",
          "example": "<ogImage>"
        },
        {
          "key": "ogSiteName",
          "type": "string",
          "nullable": true,
          "description": "Site name the page declares for social sharing.",
          "example": "<ogSiteName>"
        },
        {
          "key": "canonicalUrl",
          "type": "string",
          "nullable": true,
          "description": "Canonical URL the page declares.",
          "example": "<canonicalUrl>"
        },
        {
          "key": "faviconUrl",
          "type": "string",
          "nullable": true,
          "description": "URL of the site's favicon.",
          "example": "<faviconUrl>"
        },
        {
          "key": "hasOpenGraph",
          "type": "boolean",
          "nullable": true,
          "description": "Whether the page declares OpenGraph metadata.",
          "example": "true"
        }
      ],
      "inputs": [
        {
          "key": "urls",
          "type": "array",
          "required": true,
          "secret": false,
          "description": "Pages to read metadata from (with or without https://)."
        },
        {
          "key": "useProxy",
          "type": "boolean",
          "required": false,
          "secret": false,
          "description": "Route through a proxy for sites that block datacenter IPs."
        },
        {
          "key": "maxConcurrency",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Fetch speed."
        },
        {
          "key": "maxItems",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Hard cap on results. Strictly enforced."
        }
      ]
    },
    {
      "slug": "rss-feed-aggregator",
      "entry": "050",
      "title": "RSS & Atom Feed Aggregator — Merge Feeds Into One",
      "description": "Fetch many RSS and Atom feeds into one unified, deduplicated, newest-first dataset — with plain-text snippets, keyword and max-age filters. One broken feed never fails the run. Pure logic, no keys.",
      "categories": [
        "NEWS",
        "AUTOMATION"
      ],
      "url": "https://alaudinburki-scrapers.pages.dev/scrapers/rss-feed-aggregator/",
      "apifyUrl": "https://apify.com/alaudinburki/rss-feed-aggregator",
      "usage": {
        "runs": 28,
        "users": 2,
        "lastRun": "2026-10-16"
      },
      "outputSchema": [
        {
          "key": "feedTitle",
          "type": "string",
          "nullable": true,
          "description": "Feed Title as recorded for this row.",
          "example": "<feedTitle>"
        },
        {
          "key": "title",
          "type": "string",
          "nullable": true,
          "description": "Title as the source writes it.",
          "example": "Wireless Bluetooth Headphones"
        },
        {
          "key": "link",
          "type": "string",
          "nullable": true,
          "description": "Direct link to this record at its source.",
          "example": "https://example.com/listing/1"
        },
        {
          "key": "author",
          "type": "string",
          "nullable": true,
          "description": "Author of this record, as the source publishes it.",
          "example": "jane.cooper"
        },
        {
          "key": "publishedAt",
          "type": "string",
          "nullable": true,
          "description": "ISO 8601 timestamp of publication.",
          "example": "2026-10-15T09:00:00.000Z"
        },
        {
          "key": "snippet",
          "type": "string",
          "nullable": true,
          "description": "Text excerpt around the match. Whitespace is collapsed.",
          "example": "<snippet>"
        },
        {
          "key": "categories",
          "type": "string",
          "nullable": true,
          "description": "Categories this record belongs to.",
          "example": "<categories>"
        }
      ],
      "inputs": [
        {
          "key": "feedUrls",
          "type": "array",
          "required": true,
          "secret": false,
          "description": "RSS or Atom feed URLs, one per line."
        },
        {
          "key": "keywords",
          "type": "array",
          "required": false,
          "secret": false,
          "description": "Keep only items whose title or snippet contains one of these words. Leave empty for all."
        },
        {
          "key": "maxAgeHours",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "e.g. 24 for the last day. Items with no date are kept."
        },
        {
          "key": "maxItems",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Hard cap on items returned. Strictly enforced."
        }
      ]
    },
    {
      "slug": "structured-data-extractor",
      "entry": "051",
      "title": "Structured Data Extractor — JSON-LD / Schema.org",
      "description": "Extract JSON-LD / schema.org structured data from web pages — product price & rating, article author & date, org info, and the raw objects. Great for SEO audits and rich-result checks. No auth.",
      "categories": [
        "SEO_TOOLS",
        "DEVELOPER_TOOLS"
      ],
      "url": "https://alaudinburki-scrapers.pages.dev/scrapers/structured-data-extractor/",
      "apifyUrl": "https://apify.com/alaudinburki/structured-data-extractor",
      "usage": {
        "runs": 28,
        "users": 2,
        "lastRun": "2026-10-15"
      },
      "outputSchema": [
        {
          "key": "raw",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Raw as recorded for this row.",
          "example": "[]"
        },
        {
          "key": "type",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Type of this record, as classified by the Actor.",
          "example": "[]"
        },
        {
          "key": "note",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Short free-text note recorded with this row.",
          "example": "[]"
        },
        {
          "key": "blockCount",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Block Count as recorded for this row.",
          "example": "[]"
        },
        {
          "key": "types",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Types as recorded for this row.",
          "example": "[]"
        },
        {
          "key": "firstType",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "First Type as recorded for this row.",
          "example": "[]"
        },
        {
          "key": "url",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "The URL this row describes.",
          "example": "[]"
        }
      ],
      "inputs": [
        {
          "key": "urls",
          "type": "array",
          "required": true,
          "secret": false,
          "description": "Pages to extract structured data from."
        },
        {
          "key": "output",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "flat = one summary row per page; objects = one row per schema.org object (with raw)."
        },
        {
          "key": "useProxy",
          "type": "boolean",
          "required": false,
          "secret": false,
          "description": "For sites that block datacenter IPs."
        },
        {
          "key": "maxConcurrency",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Fetch speed."
        },
        {
          "key": "maxItems",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Hard cap."
        }
      ]
    },
    {
      "slug": "changelog-release-tracker",
      "entry": "052",
      "title": "Changelog & Release Tracker — Do I Need To Upgrade?",
      "description": "Track GitHub and npm releases and get told whether to act. Reads the release notes to flag breaking changes, security fixes and deprecations, counts how many versions you are behind, and returns one urgency verdict per project instead of a wall of markdown.",
      "categories": [
        "DEVELOPER_TOOLS",
        "AUTOMATION"
      ],
      "url": "https://alaudinburki-scrapers.pages.dev/scrapers/changelog-release-tracker/",
      "apifyUrl": "https://apify.com/alaudinburki/changelog-release-tracker",
      "usage": {
        "runs": 27,
        "users": 2,
        "lastRun": "2026-10-16"
      },
      "outputSchema": [
        {
          "key": "project",
          "type": "string",
          "nullable": true,
          "description": "Project name as published.",
          "example": "<project>"
        },
        {
          "key": "source",
          "type": "string",
          "nullable": true,
          "description": "Which upstream source produced this row.",
          "example": "official public API"
        },
        {
          "key": "version",
          "type": "string",
          "nullable": true,
          "description": "Version of this record or artefact.",
          "example": "<version>"
        },
        {
          "key": "tag",
          "type": "string",
          "nullable": true,
          "description": "Tag applied to this record.",
          "example": "<tag>"
        },
        {
          "key": "name",
          "type": "string",
          "nullable": true,
          "description": "Display name as the source writes it.",
          "example": "Bitcoin"
        },
        {
          "key": "publishedAt",
          "type": "string",
          "nullable": true,
          "description": "ISO 8601 timestamp of publication.",
          "example": "2026-10-15T09:00:00.000Z"
        },
        {
          "key": "url",
          "type": "string",
          "nullable": true,
          "description": "The URL this row describes.",
          "example": "https://example.com/pricing"
        },
        {
          "key": "author",
          "type": "string",
          "nullable": true,
          "description": "Author of this record, as the source publishes it.",
          "example": "jane.cooper"
        },
        {
          "key": "hasBreakingChanges",
          "type": "boolean",
          "nullable": true,
          "description": "Whether the new version breaks the previous contract.",
          "example": "true"
        },
        {
          "key": "hasSecurityFix",
          "type": "boolean",
          "nullable": true,
          "description": "Has Security Fix as recorded for this row.",
          "example": "true"
        },
        {
          "key": "hasDeprecations",
          "type": "boolean",
          "nullable": true,
          "description": "Has Deprecations as recorded for this row.",
          "example": "true"
        },
        {
          "key": "hasFeatures",
          "type": "boolean",
          "nullable": true,
          "description": "Has Features as recorded for this row.",
          "example": "true"
        },
        {
          "key": "hasFixes",
          "type": "boolean",
          "nullable": true,
          "description": "Has Fixes as recorded for this row.",
          "example": "true"
        },
        {
          "key": "isPrerelease",
          "type": "boolean",
          "nullable": true,
          "description": "Whether this version is marked as a pre-release.",
          "example": "true"
        },
        {
          "key": "notesEmpty",
          "type": "boolean",
          "nullable": true,
          "description": "Whether the notes field is empty.",
          "example": "true"
        },
        {
          "key": "notesUnavailable",
          "type": "boolean",
          "nullable": true,
          "description": "Whether notes were unavailable at the source.",
          "example": "true"
        },
        {
          "key": "bulletCount",
          "type": "integer",
          "nullable": true,
          "description": "Bullet Count as recorded for this row.",
          "example": "0"
        },
        {
          "key": "currentVersion",
          "type": "string",
          "nullable": true,
          "description": "Version currently in use.",
          "example": "4.17.21"
        },
        {
          "key": "latestVersion",
          "type": "string",
          "nullable": true,
          "description": "Most recent version published upstream.",
          "example": "4.2.1"
        },
        {
          "key": "versionsBehind",
          "type": "integer",
          "nullable": true,
          "description": "How many releases this version is behind the latest.",
          "example": "0"
        },
        {
          "key": "urgency",
          "type": "string",
          "nullable": true,
          "description": "How urgent this row is, in words.",
          "example": "medium"
        },
        {
          "key": "action",
          "type": "string",
          "nullable": true,
          "description": "Action recommended or taken for this row.",
          "example": "upgrade"
        },
        {
          "key": "isNewSinceLastRun",
          "type": "boolean",
          "nullable": true,
          "description": "Whether this row appeared after the previous run.",
          "example": "true"
        },
        {
          "key": "notes",
          "type": "string",
          "nullable": true,
          "description": "Free-text notes recorded with this row.",
          "example": "<notes>"
        },
        {
          "key": "status",
          "type": "string",
          "nullable": true,
          "description": "Outcome recorded for this row.",
          "example": "ok"
        },
        {
          "key": "checkedAt",
          "type": "string",
          "nullable": true,
          "description": "ISO 8601 timestamp of the most recent check.",
          "example": "2026-10-16T09:12:44.000Z"
        },
        {
          "key": "versionsBehindIsLowerBound",
          "type": "boolean",
          "nullable": true,
          "description": "True when the real gap could be larger than versionsBehind, because older releases were not fetched.",
          "example": "true"
        },
        {
          "key": "oldestReleaseFetched",
          "type": "string",
          "nullable": true,
          "description": "Oldest release the run was able to fetch.",
          "example": "<oldestReleaseFetched>"
        }
      ],
      "inputs": [
        {
          "key": "repositories",
          "type": "array",
          "required": false,
          "secret": false,
          "description": "Repos to track as owner/repo or a github.com URL. Append @<your version> to get an upgrade verdict, e.g. facebook/react@19.0.0."
        },
        {
          "key": "npmPackages",
          "type": "array",
          "required": false,
          "secret": false,
          "description": "npm packages to track. Append @<your version> for a verdict, e.g. axios@1.6.0. Note the npm registry publishes no release notes, so those rows carry version and date only."
        },
        {
          "key": "githubToken",
          "type": "string",
          "required": false,
          "secret": true,
          "description": "Secret — supply your own value."
        },
        {
          "key": "maxReleasesPerProject",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "How many recent releases to fetch for each project."
        },
        {
          "key": "includePrereleases",
          "type": "boolean",
          "required": false,
          "secret": false,
          "description": "Include alpha/beta/rc/canary builds. Off by default — nobody is 'twelve releases behind' because of nightly canaries."
        },
        {
          "key": "onlyNewSinceLastRun",
          "type": "boolean",
          "required": false,
          "secret": false,
          "description": "Return only releases not seen in a previous run. Turns this into a scheduled watcher: pair it with a webhook and you get notified only when something actually ships."
        },
        {
          "key": "includeNotes",
          "type": "boolean",
          "required": false,
          "secret": false,
          "description": "Include the release-note text on each row."
        },
        {
          "key": "notesMaxChars",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Truncate release notes to this many characters."
        },
        {
          "key": "snapshotKey",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "Key-value store key holding what was already seen. Use different keys to watch several sets of projects independently."
        },
        {
          "key": "maxItems",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Hard cap on releases returned. You are never charged beyond this."
        }
      ]
    },
    {
      "slug": "currency-fx-rates",
      "entry": "053",
      "title": "Currency & FX Rates — Live, Historical, Timeseries",
      "description": "Foreign-exchange rates from the ECB via Frankfurter — latest, a historical date, or a date-range timeseries — for any base and target currencies. Free, no API key.",
      "categories": [
        "BUSINESS",
        "DEVELOPER_TOOLS"
      ],
      "url": "https://alaudinburki-scrapers.pages.dev/scrapers/currency-fx-rates/",
      "apifyUrl": "https://apify.com/alaudinburki/currency-fx-rates",
      "usage": {
        "runs": 27,
        "users": 2,
        "lastRun": "2026-10-16"
      },
      "outputSchema": [
        {
          "key": "base",
          "type": "string",
          "nullable": true,
          "description": "Base value the comparison is made against.",
          "example": "<base>"
        },
        {
          "key": "target",
          "type": "string",
          "nullable": true,
          "description": "The target this row refers to.",
          "example": "https://example.com/pricing"
        },
        {
          "key": "rate",
          "type": "number",
          "nullable": true,
          "description": "Rate applied, in the unit the source states.",
          "example": "0"
        },
        {
          "key": "date",
          "type": "string",
          "nullable": true,
          "description": "ISO 8601 date associated with this record.",
          "example": "2026-10-15"
        },
        {
          "key": "inverseRate",
          "type": "number",
          "nullable": true,
          "description": "The reciprocal of rate, for the opposite conversion.",
          "example": "0"
        }
      ],
      "inputs": [
        {
          "key": "base",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "ISO code, e.g. USD."
        },
        {
          "key": "symbols",
          "type": "array",
          "required": false,
          "secret": false,
          "description": "ISO codes to convert to (empty = all available)."
        },
        {
          "key": "mode",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "latest, history (one date), or timeseries (range)."
        },
        {
          "key": "date",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "YYYY-MM-DD."
        },
        {
          "key": "startDate",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "YYYY-MM-DD."
        },
        {
          "key": "endDate",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "YYYY-MM-DD."
        },
        {
          "key": "maxItems",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Hard cap."
        }
      ]
    },
    {
      "slug": "hacker-news-search",
      "entry": "054",
      "title": "Hacker News Search — Stories, Comments, Ask/Show HN",
      "description": "Search Hacker News (via the Algolia API) for stories, comments, Ask/Show HN — by keyword, sorted by relevance or date, filtered by points/comments. Public API, no auth.",
      "categories": [
        "NEWS",
        "DEVELOPER_TOOLS"
      ],
      "url": "https://alaudinburki-scrapers.pages.dev/scrapers/hacker-news-search/",
      "apifyUrl": "https://apify.com/alaudinburki/hacker-news-search",
      "usage": {
        "runs": 27,
        "users": 2,
        "lastRun": "2026-10-16"
      },
      "outputSchema": [
        {
          "key": "title",
          "type": "string",
          "nullable": true,
          "description": "Title as the source writes it.",
          "example": "Wireless Bluetooth Headphones"
        },
        {
          "key": "url",
          "type": "string",
          "nullable": true,
          "description": "The URL this row describes.",
          "example": "https://example.com/pricing"
        },
        {
          "key": "author",
          "type": "string",
          "nullable": true,
          "description": "Author of this record, as the source publishes it.",
          "example": "jane.cooper"
        },
        {
          "key": "points",
          "type": "integer",
          "nullable": true,
          "description": "Points the source awards this item.",
          "example": "0"
        },
        {
          "key": "comments",
          "type": "integer",
          "nullable": true,
          "description": "Number of comments recorded upstream.",
          "example": "24"
        },
        {
          "key": "createdAt",
          "type": "string",
          "nullable": true,
          "description": "ISO 8601 timestamp of when this record was created upstream.",
          "example": "2026-10-15T09:00:00.000Z"
        },
        {
          "key": "tags",
          "type": "string",
          "nullable": true,
          "description": "Tags applied to this record.",
          "example": "[\"wireless\",\"bluetooth\",\"over-ear\"]"
        },
        {
          "key": "signal",
          "type": "string",
          "nullable": true,
          "description": "The signal this row represents.",
          "example": "new posting"
        },
        {
          "key": "engagement",
          "type": "integer",
          "nullable": true,
          "description": "Engagement measure as the source computes it.",
          "example": "0"
        },
        {
          "key": "discussionRatio",
          "type": "number",
          "nullable": true,
          "description": "Share of activity that is discussion rather than code, between 0 and 1.",
          "example": "0"
        },
        {
          "key": "hnUrl",
          "type": "string",
          "nullable": true,
          "description": "Hn Url as recorded for this row.",
          "example": "<hnUrl>"
        }
      ],
      "inputs": [
        {
          "key": "query",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "Keywords (empty = latest/front page by tag)."
        },
        {
          "key": "tags",
          "type": "array",
          "required": false,
          "secret": false,
          "description": "story, comment, show_hn, ask_hn, poll, front_page."
        },
        {
          "key": "sortBy",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "relevance or date."
        },
        {
          "key": "minPoints",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Only items with >= this many points."
        },
        {
          "key": "minComments",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Only items with >= this many comments."
        },
        {
          "key": "maxPages",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "100 hits/page."
        },
        {
          "key": "maxItems",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Hard cap."
        }
      ]
    },
    {
      "slug": "keyword-suggest-scraper",
      "entry": "055",
      "title": "Keyword Suggest — Google, YouTube, Bing, Amazon",
      "description": "Harvest autocomplete keyword suggestions from Google, YouTube, Bing and Amazon — with optional A-Z and prefix expansion for deep keyword research. Public endpoints, no API key.",
      "categories": [
        "SEO_TOOLS",
        "MARKETING"
      ],
      "url": "https://alaudinburki-scrapers.pages.dev/scrapers/keyword-suggest-scraper/",
      "apifyUrl": "https://apify.com/alaudinburki/keyword-suggest-scraper",
      "usage": {
        "runs": 27,
        "users": 2,
        "lastRun": "2026-10-15"
      },
      "outputSchema": [
        {
          "key": "engine",
          "type": "string",
          "nullable": true,
          "description": "Engine that produced this result.",
          "example": "<engine>"
        },
        {
          "key": "seed",
          "type": "string",
          "nullable": true,
          "description": "Whether this row was part of the initial seed set.",
          "example": "<seed>"
        },
        {
          "key": "suggestion",
          "type": "string",
          "nullable": true,
          "description": "Suggestion as recorded for this row.",
          "example": "<suggestion>"
        }
      ],
      "inputs": [
        {
          "key": "keywords",
          "type": "array",
          "required": true,
          "secret": false,
          "description": "Seeds to expand into suggestions."
        },
        {
          "key": "engines",
          "type": "array",
          "required": false,
          "secret": false,
          "description": "google, youtube, bing, amazon."
        },
        {
          "key": "alphabetExpansion",
          "type": "boolean",
          "required": false,
          "secret": false,
          "description": "Also query 'seed a', 'seed b'... for many more suggestions."
        },
        {
          "key": "prefixes",
          "type": "array",
          "required": false,
          "secret": false,
          "description": "e.g. best, cheap, how to — queried before and after each seed."
        },
        {
          "key": "language",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "hl code (en, es...)."
        },
        {
          "key": "maxItems",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Hard cap."
        }
      ]
    },
    {
      "slug": "redirect-tracer",
      "entry": "056",
      "title": "Redirect Tracer — Follow the Full Redirect Chain",
      "description": "Trace the full redirect chain of any URL hop by hop — every status code and Location, the final destination, redirect count, and chain type (http-to-https, loop, direct). No auth.",
      "categories": [
        "SEO_TOOLS",
        "DEVELOPER_TOOLS"
      ],
      "url": "https://alaudinburki-scrapers.pages.dev/scrapers/redirect-tracer/",
      "apifyUrl": "https://apify.com/alaudinburki/redirect-tracer",
      "usage": {
        "runs": 27,
        "users": 2,
        "lastRun": "2026-10-15"
      },
      "outputSchema": [
        {
          "key": "startUrl",
          "type": "string",
          "nullable": true,
          "description": "Start Url as recorded for this row.",
          "example": "<startUrl>"
        },
        {
          "key": "finalUrl",
          "type": "string",
          "nullable": true,
          "description": "URL of the final response after any redirects.",
          "example": "https://example.com/products/widget"
        },
        {
          "key": "finalStatus",
          "type": "integer",
          "nullable": true,
          "description": "HTTP status of the final response after any redirects.",
          "example": "200"
        },
        {
          "key": "redirects",
          "type": "integer",
          "nullable": true,
          "description": "Number of redirects followed to reach the final response.",
          "example": "0"
        },
        {
          "key": "totalHops",
          "type": "integer",
          "nullable": true,
          "description": "Number of requests made, including redirects and retries.",
          "example": "0"
        },
        {
          "key": "chainType",
          "type": "string",
          "nullable": true,
          "description": "Chain Type as recorded for this row.",
          "example": "<chainType>"
        }
      ],
      "inputs": [
        {
          "key": "urls",
          "type": "array",
          "required": true,
          "secret": false,
          "description": "URLs to trace (short links, http://, etc.)."
        },
        {
          "key": "maxHops",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Stop after this many redirects."
        },
        {
          "key": "includeHops",
          "type": "boolean",
          "required": false,
          "secret": false,
          "description": "Attach the array of every hop (status + location)."
        },
        {
          "key": "maxItems",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Hard cap."
        }
      ]
    },
    {
      "slug": "ssl-certificate-checker",
      "entry": "057",
      "title": "SSL Certificate Checker — Expiry & Validity",
      "description": "Check SSL/TLS certificates for many hosts — issuer, validity window, days to expiry, hostname match, and expiring-soon flags. Ideal for scheduled expiry monitoring. No auth.",
      "categories": [
        "DEVELOPER_TOOLS",
        "AUTOMATION"
      ],
      "url": "https://alaudinburki-scrapers.pages.dev/scrapers/ssl-certificate-checker/",
      "apifyUrl": "https://apify.com/alaudinburki/ssl-certificate-checker",
      "usage": {
        "runs": 27,
        "users": 2,
        "lastRun": "2026-10-15"
      },
      "outputSchema": [
        {
          "key": "host",
          "type": "string",
          "nullable": true,
          "description": "Hostname this row describes.",
          "example": "<host>"
        },
        {
          "key": "valid",
          "type": "boolean",
          "nullable": true,
          "description": "Whether the record passed validation.",
          "example": "true"
        },
        {
          "key": "commonName",
          "type": "string",
          "nullable": true,
          "description": "Common or trade name, where it differs from the registered name.",
          "example": "<commonName>"
        },
        {
          "key": "issuer",
          "type": "string",
          "nullable": true,
          "description": "Issuer of the certificate.",
          "example": "<issuer>"
        },
        {
          "key": "validTo",
          "type": "string",
          "nullable": true,
          "description": "ISO 8601 timestamp up to which this record is valid.",
          "example": "<validTo>"
        },
        {
          "key": "daysToExpiry",
          "type": "integer",
          "nullable": true,
          "description": "Days until this record or certificate expires.",
          "example": "0"
        },
        {
          "key": "expiringSoon",
          "type": "boolean",
          "nullable": true,
          "description": "Whether the record expires within the configured warning window.",
          "example": "true"
        },
        {
          "key": "riskGrade",
          "type": "string",
          "nullable": true,
          "description": "Risk expressed as a letter grade.",
          "example": "<riskGrade>"
        },
        {
          "key": "actionNeeded",
          "type": "string",
          "nullable": true,
          "description": "Whether a human needs to act on this row.",
          "example": "<actionNeeded>"
        },
        {
          "key": "hostMatches",
          "type": "boolean",
          "nullable": true,
          "description": "Whether the host matches the expected pattern.",
          "example": "true"
        }
      ],
      "inputs": [
        {
          "key": "domains",
          "type": "array",
          "required": true,
          "secret": false,
          "description": "Hosts to check (optionally host:port; default 443)."
        },
        {
          "key": "timeoutMs",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Per-host TLS timeout."
        },
        {
          "key": "maxItems",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Hard cap."
        }
      ]
    },
    {
      "slug": "subdomain-takeover-auditor",
      "entry": "058",
      "title": "Subdomain Takeover Auditor — Find Claimable DNS Records",
      "description": "Find dangling DNS records pointing at decommissioned third-party services — the kind anyone can claim to hijack a subdomain of your brand for phishing. Discovers subdomains passively from certificate transparency, resolves CNAMEs, and confirms matches against a public takeover-fingerprint database.",
      "categories": [
        "DEVELOPER_TOOLS",
        "BUSINESS"
      ],
      "url": "https://alaudinburki-scrapers.pages.dev/scrapers/subdomain-takeover-auditor/",
      "apifyUrl": "https://apify.com/alaudinburki/subdomain-takeover-auditor",
      "usage": {
        "runs": 27,
        "users": 2,
        "lastRun": "2026-10-15"
      },
      "outputSchema": [
        {
          "key": "subdomain",
          "type": "string",
          "nullable": true,
          "description": "The subdomain portion, excluding the registered domain.",
          "example": "<subdomain>"
        },
        {
          "key": "apexDomain",
          "type": "string",
          "nullable": true,
          "description": "Registered domain, with any subdomain removed.",
          "example": "<apexDomain>"
        },
        {
          "key": "resolves",
          "type": "boolean",
          "nullable": true,
          "description": "Whether the hostname resolved in DNS.",
          "example": "true"
        },
        {
          "key": "dnsStatus",
          "type": "string",
          "nullable": true,
          "description": "Outcome of the DNS lookup.",
          "example": "<dnsStatus>"
        },
        {
          "key": "cname",
          "type": "string",
          "nullable": true,
          "description": "CNAME target for this name.",
          "example": "<cname>"
        },
        {
          "key": "matchedService",
          "type": "string",
          "nullable": true,
          "description": "Service that matched.",
          "example": "<matchedService>"
        },
        {
          "key": "risk",
          "type": "string",
          "nullable": true,
          "description": "Risk assessment for this row.",
          "example": "low"
        },
        {
          "key": "verdict",
          "type": "string",
          "nullable": true,
          "description": "The Actor's conclusion for this row, stated in words.",
          "example": "pass"
        },
        {
          "key": "confidence",
          "type": "string",
          "nullable": true,
          "description": "How confident the Actor is in this result, from 0 to 1. Not a probability of correctness.",
          "example": "<confidence>"
        },
        {
          "key": "checkedAt",
          "type": "string",
          "nullable": true,
          "description": "ISO 8601 timestamp of the most recent check.",
          "example": "2026-10-16T09:12:44.000Z"
        },
        {
          "key": "status",
          "type": "string",
          "nullable": true,
          "description": "Outcome recorded for this row.",
          "example": "ok"
        },
        {
          "key": "subdomainsChecked",
          "type": "integer",
          "nullable": true,
          "description": "How many subdomains were checked.",
          "example": "18"
        }
      ],
      "inputs": [
        {
          "key": "domains",
          "type": "array",
          "required": false,
          "secret": false,
          "description": "Apex domains to audit, e.g. yourcompany.com. Subdomains are discovered automatically from public certificate transparency logs — you do not need to list them."
        },
        {
          "key": "maxSubdomainsPerDomain",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Cap on how many discovered subdomains to check per domain."
        },
        {
          "key": "confirmWithPageCheck",
          "type": "boolean",
          "required": false,
          "secret": false,
          "description": "For a CNAME that matches a known-vulnerable service, fetch the page once to confirm the takeover fingerprint. Without this, matches are reported as 'suspicious' rather than 'claimable' — turning it off is faster but less certain."
        },
        {
          "key": "onlyRisky",
          "type": "boolean",
          "required": false,
          "secret": false,
          "description": "Return only claimable and suspicious subdomains. Turn off to get every subdomain checked, including the ones that are fine — useful for a full inventory."
        },
        {
          "key": "concurrency",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "How many subdomains to check at once."
        },
        {
          "key": "maxItems",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Hard cap on rows returned. You are never charged beyond this."
        }
      ]
    },
    {
      "slug": "crypto-market-data",
      "entry": "059",
      "title": "Crypto Market Data — Prices, Caps & Trends",
      "description": "Get live crypto prices, market caps, volume and 24h/7d change for top coins or a watchlist, with automatic CoinGecko-to-CoinPaprika fallback. No API key.",
      "categories": [
        "BUSINESS",
        "DEVELOPER_TOOLS"
      ],
      "url": "https://alaudinburki-scrapers.pages.dev/scrapers/crypto-market-data/",
      "apifyUrl": "https://apify.com/alaudinburki/crypto-market-data",
      "usage": {
        "runs": 26,
        "users": 2,
        "lastRun": "2026-10-16"
      },
      "outputSchema": [
        {
          "key": "name",
          "type": "string",
          "nullable": true,
          "description": "Display name as the source writes it.",
          "example": "Bitcoin"
        },
        {
          "key": "symbol",
          "type": "string",
          "nullable": true,
          "description": "Ticker or symbol as the source writes it.",
          "example": "BTC"
        },
        {
          "key": "price",
          "type": "number",
          "nullable": true,
          "description": "Price as reported by the source. Currency is given by the currency field.",
          "example": "9.99"
        },
        {
          "key": "marketCap",
          "type": "number",
          "nullable": true,
          "description": "Market capitalisation in the currency given by the currency field.",
          "example": "1652383477033"
        },
        {
          "key": "marketCapRank",
          "type": "integer",
          "nullable": true,
          "description": "Rank by market capitalisation. 1 is the largest.",
          "example": "1"
        },
        {
          "key": "volume24h",
          "type": "number",
          "nullable": true,
          "description": "Trading volume over the last 24 hours.",
          "example": "31157278261"
        },
        {
          "key": "change24hPercent",
          "type": "number",
          "nullable": true,
          "description": "Percentage price change over the last 24 hours.",
          "example": "0"
        },
        {
          "key": "change7dPercent",
          "type": "number",
          "nullable": true,
          "description": "Percentage price change over the last 7 days.",
          "example": "0"
        },
        {
          "key": "signal",
          "type": "string",
          "nullable": true,
          "description": "The signal this row represents.",
          "example": "new posting"
        },
        {
          "key": "dayRangePercent",
          "type": "number",
          "nullable": true,
          "description": "Session range as a percentage of the low, between the day high and low.",
          "example": "0"
        },
        {
          "key": "trend7d",
          "type": "string",
          "nullable": true,
          "description": "Trend7d as recorded for this row.",
          "example": "<trend7d>"
        }
      ],
      "inputs": [
        {
          "key": "coinIds",
          "type": "array",
          "required": false,
          "secret": false,
          "description": "Coin name slugs or symbols (bitcoin, ethereum, solana, BTC). Empty = top coins by market cap."
        },
        {
          "key": "vsCurrency",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "usd, eur, gbp, btc..."
        },
        {
          "key": "useProxy",
          "type": "boolean",
          "required": false,
          "secret": false,
          "description": "Route provider requests through an Apify proxy when a source rate-limits your IP."
        },
        {
          "key": "maxItems",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Hard cap."
        }
      ]
    },
    {
      "slug": "epa-compliance-monitor",
      "entry": "060",
      "title": "Environmental Compliance Monitor — EPA ECHO",
      "description": "EPA environmental compliance history per facility name: Significant Noncompliance flags, Clean Air Act high-priority violations, and penalty history — from free official EPA ECHO data. Word-boundary matched, not a raw substring search.",
      "categories": [
        "DEVELOPER_TOOLS",
        "BUSINESS"
      ],
      "url": "https://alaudinburki-scrapers.pages.dev/scrapers/epa-compliance-monitor/",
      "apifyUrl": "https://apify.com/alaudinburki/epa-compliance-monitor",
      "usage": {
        "runs": 26,
        "users": 2,
        "lastRun": "2026-10-16"
      },
      "outputSchema": [
        {
          "key": "matchedQuery",
          "type": "string",
          "nullable": true,
          "description": "The query this row matched.",
          "example": "amazon product scraper"
        },
        {
          "key": "facilityName",
          "type": "string",
          "nullable": true,
          "description": "Facility Name as recorded for this row.",
          "example": "<facilityName>"
        },
        {
          "key": "registryId",
          "type": "string",
          "nullable": true,
          "description": "Identifier issued by the registry.",
          "example": "<registryId>"
        },
        {
          "key": "city",
          "type": "string",
          "nullable": true,
          "description": "City name.",
          "example": "Austin"
        },
        {
          "key": "state",
          "type": "string",
          "nullable": true,
          "description": "State, province or region name.",
          "example": "active"
        },
        {
          "key": "county",
          "type": "string",
          "nullable": true,
          "description": "County name.",
          "example": "Travis"
        },
        {
          "key": "complianceRisk",
          "type": "string",
          "nullable": true,
          "description": "Compliance Risk as recorded for this row.",
          "example": "<complianceRisk>"
        },
        {
          "key": "complianceNote",
          "type": "string",
          "nullable": true,
          "description": "Note about a compliance finding.",
          "example": "<complianceNote>"
        },
        {
          "key": "significantNoncompliance",
          "type": "boolean",
          "nullable": true,
          "description": "Whether the source records significant non-compliance.",
          "example": "true"
        },
        {
          "key": "inspectionCount",
          "type": "number",
          "nullable": true,
          "description": "How many inspections were recorded.",
          "example": "0"
        },
        {
          "key": "lastInspectionDate",
          "type": "string",
          "nullable": true,
          "description": "Date of the most recent inspection.",
          "example": "<lastInspectionDate>"
        },
        {
          "key": "penaltyCount",
          "type": "number",
          "nullable": true,
          "description": "How many penalties were recorded.",
          "example": "0"
        },
        {
          "key": "lastPenaltyDate",
          "type": "string",
          "nullable": true,
          "description": "Date of the most recent penalty.",
          "example": "<lastPenaltyDate>"
        },
        {
          "key": "caaHighPriorityViolation",
          "type": "boolean",
          "nullable": true,
          "description": "Whether a high-priority violation is recorded.",
          "example": "true"
        },
        {
          "key": "caaLastPenaltyAmount",
          "type": "number",
          "nullable": true,
          "description": "Monetary amount of the most recent civil penalty.",
          "example": "0"
        },
        {
          "key": "status",
          "type": "string",
          "nullable": true,
          "description": "Outcome recorded for this row.",
          "example": "ok"
        },
        {
          "key": "verdict",
          "type": "string",
          "nullable": true,
          "description": "The Actor's conclusion for this row, stated in words.",
          "example": "pass"
        }
      ],
      "inputs": [
        {
          "key": "facilities",
          "type": "array",
          "required": true,
          "secret": false,
          "description": "Facility/company names to check, each with an optional state to narrow results. Example: [{\"facilityName\": \"Apple\", \"state\": \"CA\"}]"
        },
        {
          "key": "maxResultsPerFacility",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "How many matched facility records to return per query."
        }
      ]
    },
    {
      "slug": "nonprofit-financial-lookup",
      "entry": "061",
      "title": "Nonprofit Financial Lookup — IRS 990, Summarized",
      "description": "A nonprofit's financial profile from public IRS Form 990 data: revenue/expense trend year-over-year, assets, liabilities, and the expense-to-revenue ratio — free, keyless, via ProPublica's Nonprofit Explorer. Built for grant-seekers researching a funder's giving history and donor due diligence.",
      "categories": [
        "DEVELOPER_TOOLS",
        "BUSINESS"
      ],
      "url": "https://alaudinburki-scrapers.pages.dev/scrapers/nonprofit-financial-lookup/",
      "apifyUrl": "https://apify.com/alaudinburki/nonprofit-financial-lookup",
      "usage": {
        "runs": 26,
        "users": 2,
        "lastRun": "2026-10-16"
      },
      "outputSchema": [
        {
          "key": "matchedQuery",
          "type": "string",
          "nullable": true,
          "description": "The query this row matched.",
          "example": "amazon product scraper"
        },
        {
          "key": "ein",
          "type": "integer",
          "nullable": true,
          "description": "Employer Identification Number.",
          "example": "0"
        },
        {
          "key": "name",
          "type": "string",
          "nullable": true,
          "description": "Display name as the source writes it.",
          "example": "Bitcoin"
        },
        {
          "key": "city",
          "type": "string",
          "nullable": true,
          "description": "City name.",
          "example": "Austin"
        },
        {
          "key": "state",
          "type": "string",
          "nullable": true,
          "description": "State, province or region name.",
          "example": "active"
        },
        {
          "key": "nteeCode",
          "type": "string",
          "nullable": true,
          "description": "NTEE code classifying the organisation's purpose.",
          "example": "<nteeCode>"
        },
        {
          "key": "rulingDate",
          "type": "string",
          "nullable": true,
          "description": "Date the ruling was issued.",
          "example": "<rulingDate>"
        },
        {
          "key": "latestFilingYear",
          "type": "integer",
          "nullable": true,
          "description": "Year of the most recent filing.",
          "example": "0"
        },
        {
          "key": "latestRevenue",
          "type": "number",
          "nullable": true,
          "description": "Total revenue reported in the most recent period.",
          "example": "0"
        },
        {
          "key": "latestExpenses",
          "type": "number",
          "nullable": true,
          "description": "Total expenses reported in the most recent period.",
          "example": "0"
        },
        {
          "key": "latestAssets",
          "type": "number",
          "nullable": true,
          "description": "Total assets reported in the most recent period.",
          "example": "0"
        },
        {
          "key": "latestLiabilities",
          "type": "number",
          "nullable": true,
          "description": "Total liabilities reported in the most recent period.",
          "example": "0"
        },
        {
          "key": "expenseToRevenueRatio",
          "type": "number",
          "nullable": true,
          "description": "Expenses as a share of revenue, between 0 and 1.",
          "example": "0"
        },
        {
          "key": "revenueTrend",
          "type": "string",
          "nullable": true,
          "description": "Direction of the revenue trend — rising, flat or falling.",
          "example": "<revenueTrend>"
        },
        {
          "key": "filingsOnFile",
          "type": "integer",
          "nullable": true,
          "description": "How many filings the source holds.",
          "example": "0"
        },
        {
          "key": "latestFilingUrl",
          "type": "string",
          "nullable": true,
          "description": "Link to the most recent filing at its source.",
          "example": "<latestFilingUrl>"
        },
        {
          "key": "status",
          "type": "string",
          "nullable": true,
          "description": "Outcome recorded for this row.",
          "example": "ok"
        },
        {
          "key": "verdict",
          "type": "string",
          "nullable": true,
          "description": "The Actor's conclusion for this row, stated in words.",
          "example": "pass"
        }
      ],
      "inputs": [
        {
          "key": "organizations",
          "type": "array",
          "required": true,
          "secret": false,
          "description": "Nonprofit names to look up, e.g. American Red Cross, United Way. An approximate name is fine — the best-scoring match from ProPublica's search is used."
        }
      ]
    },
    {
      "slug": "ics-advisory-matcher",
      "entry": "062",
      "title": "OT/ICS Advisory Matcher — CISA Alerts For Your Equipment",
      "description": "Match CISA ICS advisories against the equipment vendors and products you actually run. Only the advisories that touch your assets, ranked by CVSS severity with the CVE and a plain-language next step. Entirely passive — no scanning of your network required or performed.",
      "categories": [
        "DEVELOPER_TOOLS",
        "BUSINESS"
      ],
      "url": "https://alaudinburki-scrapers.pages.dev/scrapers/ics-advisory-matcher/",
      "apifyUrl": "https://apify.com/alaudinburki/ics-advisory-matcher",
      "usage": {
        "runs": 26,
        "users": 2,
        "lastRun": "2026-10-16"
      },
      "outputSchema": [
        {
          "key": "advisoryId",
          "type": "string",
          "nullable": true,
          "description": "Identifier of the advisory, as published by the registry.",
          "example": "<advisoryId>"
        },
        {
          "key": "title",
          "type": "string",
          "nullable": true,
          "description": "Title as the source writes it.",
          "example": "Wireless Bluetooth Headphones"
        },
        {
          "key": "matchedAsset",
          "type": "string",
          "nullable": true,
          "description": "Asset that matched.",
          "example": "<matchedAsset>"
        },
        {
          "key": "publishedAt",
          "type": "string",
          "nullable": true,
          "description": "ISO 8601 timestamp of publication.",
          "example": "2026-10-15T09:00:00.000Z"
        },
        {
          "key": "url",
          "type": "string",
          "nullable": true,
          "description": "The URL this row describes.",
          "example": "https://example.com/pricing"
        },
        {
          "key": "cves",
          "type": "string",
          "nullable": true,
          "description": "CVE identifiers for this vulnerability.",
          "example": "<cves>"
        },
        {
          "key": "cvssScore",
          "type": "number",
          "nullable": true,
          "description": "CVSS base score, from 0 to 10. Higher is more severe.",
          "example": "0"
        },
        {
          "key": "severity",
          "type": "string",
          "nullable": true,
          "description": "Severity as classified by the source.",
          "example": "moderate"
        },
        {
          "key": "vulnerabilityCount",
          "type": "integer",
          "nullable": true,
          "description": "How many vulnerabilities affect this package.",
          "example": "0"
        },
        {
          "key": "urgency",
          "type": "string",
          "nullable": true,
          "description": "How urgent this row is, in words.",
          "example": "medium"
        },
        {
          "key": "note",
          "type": "string",
          "nullable": true,
          "description": "Short free-text note recorded with this row.",
          "example": "Verified against the live page on 2026-10-16."
        },
        {
          "key": "checkedAt",
          "type": "string",
          "nullable": true,
          "description": "ISO 8601 timestamp of the most recent check.",
          "example": "2026-10-16T09:12:44.000Z"
        },
        {
          "key": "status",
          "type": "string",
          "nullable": true,
          "description": "Outcome recorded for this row.",
          "example": "ok"
        }
      ],
      "inputs": [
        {
          "key": "assets",
          "type": "array",
          "required": false,
          "secret": false,
          "description": "The equipment vendors and product lines actually installed at your site, e.g. Rockwell Automation, Siemens SIMATIC, Schneider Electric. Only advisories mentioning these are returned."
        },
        {
          "key": "maxAdvisoriesToScan",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "How many of the most recent CISA ICS advisories to check."
        },
        {
          "key": "fetchFullDetail",
          "type": "boolean",
          "required": false,
          "secret": false,
          "description": "For each title match, fetch the official structured CSAF advisory for the CVE ID and severity score. Turning this off is faster but only returns the title match, no severity."
        },
        {
          "key": "concurrency",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "How many advisories to check in parallel."
        },
        {
          "key": "maxItems",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Hard cap on matched advisories returned. You are never charged beyond this."
        }
      ]
    },
    {
      "slug": "vehicle-safety-report",
      "entry": "063",
      "title": "Vehicle Safety Report — NHTSA Recalls + Complaints",
      "description": "A combined recall and complaint safety report per vehicle make/model/year — NHTSA's own 'do not drive' recall flag plus crash/fire/injury/death complaint pattern counts, not just raw lists. Free, official, keyless NHTSA data.",
      "categories": [
        "DEVELOPER_TOOLS",
        "BUSINESS"
      ],
      "url": "https://alaudinburki-scrapers.pages.dev/scrapers/vehicle-safety-report/",
      "apifyUrl": "https://apify.com/alaudinburki/vehicle-safety-report",
      "usage": {
        "runs": 26,
        "users": 2,
        "lastRun": "2026-10-16"
      },
      "outputSchema": [
        {
          "key": "make",
          "type": "string",
          "nullable": true,
          "description": "Make as recorded for this row.",
          "example": "<make>"
        },
        {
          "key": "model",
          "type": "string",
          "nullable": true,
          "description": "The model that produced this answer.",
          "example": "gpt-4.1"
        },
        {
          "key": "modelYear",
          "type": "string",
          "nullable": true,
          "description": "Model Year as recorded for this row.",
          "example": "<modelYear>"
        },
        {
          "key": "recallCount",
          "type": "integer",
          "nullable": true,
          "description": "How many recalls were recorded.",
          "example": "0"
        },
        {
          "key": "recallSeverity",
          "type": "string",
          "nullable": true,
          "description": "Severity assigned to the recall.",
          "example": "<recallSeverity>"
        },
        {
          "key": "recallSeverityNote",
          "type": "string",
          "nullable": true,
          "description": "Note explaining the recall severity.",
          "example": "<recallSeverityNote>"
        },
        {
          "key": "recallComponents",
          "type": "string",
          "nullable": true,
          "description": "Components affected by the recall.",
          "example": "<recallComponents>"
        },
        {
          "key": "totalComplaints",
          "type": "integer",
          "nullable": true,
          "description": "Total complaints recorded.",
          "example": "0"
        },
        {
          "key": "complaintsInvolvingCrash",
          "type": "integer",
          "nullable": true,
          "description": "Complaints that involve a crash.",
          "example": "0"
        },
        {
          "key": "complaintsInvolvingFire",
          "type": "integer",
          "nullable": true,
          "description": "Complaints that involve fire.",
          "example": "0"
        },
        {
          "key": "totalInjuriesReported",
          "type": "integer",
          "nullable": true,
          "description": "Injuries reported in connection with this item.",
          "example": "0"
        },
        {
          "key": "totalDeathsReported",
          "type": "integer",
          "nullable": true,
          "description": "Deaths reported in connection with this item.",
          "example": "0"
        },
        {
          "key": "topComplaintComponents",
          "type": "string",
          "nullable": true,
          "description": "Components attracting the most complaints.",
          "example": "<topComplaintComponents>"
        },
        {
          "key": "status",
          "type": "string",
          "nullable": true,
          "description": "Outcome recorded for this row.",
          "example": "ok"
        },
        {
          "key": "verdict",
          "type": "string",
          "nullable": true,
          "description": "The Actor's conclusion for this row, stated in words.",
          "example": "pass"
        }
      ],
      "inputs": [
        {
          "key": "vehicles",
          "type": "array",
          "required": true,
          "secret": false,
          "description": "Vehicles to check, each with make, model, and modelYear (all three required). Example: [{\"make\": \"Honda\", \"model\": \"Accord\", \"modelYear\": \"2023\"}]"
        }
      ]
    },
    {
      "slug": "abandoned-dependency-monitor",
      "entry": "064",
      "title": "Abandoned Dependency Risk Monitor — Bus Factor, Not CVEs",
      "description": "Flags npm packages at risk of going unmaintained before anything is reported against them: single maintainer, gone quiet. The xz-utils and event-stream incidents both had this exact shape before anyone found a CVE. Sibling to the Dependency Vulnerability Advisor, which checks known CVEs instead.",
      "categories": [
        "DEVELOPER_TOOLS",
        "AUTOMATION"
      ],
      "url": "https://alaudinburki-scrapers.pages.dev/scrapers/abandoned-dependency-monitor/",
      "apifyUrl": "https://apify.com/alaudinburki/abandoned-dependency-monitor",
      "usage": {
        "runs": 24,
        "users": 2,
        "lastRun": "2026-10-16"
      },
      "outputSchema": [
        {
          "key": "package",
          "type": "string",
          "nullable": true,
          "description": "Package name.",
          "example": "lodash"
        },
        {
          "key": "status",
          "type": "string",
          "nullable": true,
          "description": "Outcome recorded for this row.",
          "example": "ok"
        },
        {
          "key": "risk",
          "type": "string",
          "nullable": true,
          "description": "Risk assessment for this row.",
          "example": "low"
        },
        {
          "key": "verdict",
          "type": "string",
          "nullable": true,
          "description": "The Actor's conclusion for this row, stated in words.",
          "example": "pass"
        },
        {
          "key": "maintainerCount",
          "type": "integer",
          "nullable": true,
          "description": "How many maintainers the project lists.",
          "example": "0"
        },
        {
          "key": "maintainerNames",
          "type": "string",
          "nullable": true,
          "description": "Names of the people maintaining this project.",
          "example": "<maintainerNames>"
        },
        {
          "key": "monthsSinceLastPublish",
          "type": "number",
          "nullable": true,
          "description": "Months since the last release or publication.",
          "example": "0"
        },
        {
          "key": "lastPublish",
          "type": "string",
          "nullable": true,
          "description": "Date of the most recent publication.",
          "example": "<lastPublish>"
        },
        {
          "key": "latestVersion",
          "type": "string",
          "nullable": true,
          "description": "Most recent version published upstream.",
          "example": "4.2.1"
        },
        {
          "key": "versionCount",
          "type": "integer",
          "nullable": true,
          "description": "How many versions are published.",
          "example": "0"
        },
        {
          "key": "isDeprecated",
          "type": "boolean",
          "nullable": true,
          "description": "Whether the source marks this as deprecated.",
          "example": "true"
        },
        {
          "key": "deprecatedMessage",
          "type": "string",
          "nullable": true,
          "description": "The deprecation notice, as the source publishes it.",
          "example": "<deprecatedMessage>"
        },
        {
          "key": "hasRepository",
          "type": "boolean",
          "nullable": true,
          "description": "Whether a source repository was found.",
          "example": "true"
        },
        {
          "key": "license",
          "type": "string",
          "nullable": true,
          "description": "Licence or registration the record holds.",
          "example": "MIT"
        },
        {
          "key": "monthlyDownloads",
          "type": "integer",
          "nullable": true,
          "description": "Downloads in the last month.",
          "example": "0"
        },
        {
          "key": "popularity",
          "type": "string",
          "nullable": true,
          "description": "Popularity measure as the source publishes it.",
          "example": "74"
        }
      ],
      "inputs": [
        {
          "key": "packages",
          "type": "array",
          "required": false,
          "secret": false,
          "description": "npm package names from your dependency list, e.g. left-pad, event-stream. Usually production dependencies, not devDependencies."
        },
        {
          "key": "concurrency",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "How many packages to check in parallel."
        }
      ]
    },
    {
      "slug": "recall-exposure-monitor",
      "entry": "065",
      "title": "Recall Exposure Monitor — CPSC Recalls, Watchlisted",
      "description": "Matches new CPSC consumer product recalls against your brand/manufacturer watchlist, ranked by hazard urgency (keyword-scanned from the official text, since CPSC publishes no severity score). Built for retailers, e-commerce sellers, and insurers who need exposure, not a firehose of every recall.",
      "categories": [
        "DEVELOPER_TOOLS",
        "BUSINESS"
      ],
      "url": "https://alaudinburki-scrapers.pages.dev/scrapers/recall-exposure-monitor/",
      "apifyUrl": "https://apify.com/alaudinburki/recall-exposure-monitor",
      "usage": {
        "runs": 24,
        "users": 2,
        "lastRun": "2026-10-16"
      },
      "outputSchema": [
        {
          "key": "recallId",
          "type": "integer",
          "nullable": true,
          "description": "Recall Id as recorded for this row.",
          "example": "0"
        },
        {
          "key": "recallNumber",
          "type": "string",
          "nullable": true,
          "description": "Identifier of the recall.",
          "example": "2026-10432"
        },
        {
          "key": "title",
          "type": "string",
          "nullable": true,
          "description": "Title as the source writes it.",
          "example": "Wireless Bluetooth Headphones"
        },
        {
          "key": "description",
          "type": "string",
          "nullable": true,
          "description": "Description of this record, as published by the source.",
          "example": "<description>"
        },
        {
          "key": "recallDate",
          "type": "string",
          "nullable": true,
          "description": "Date the recall was announced.",
          "example": "<recallDate>"
        },
        {
          "key": "productNames",
          "type": "string",
          "nullable": true,
          "description": "Names of the products in this record.",
          "example": "<productNames>"
        },
        {
          "key": "unitsAffected",
          "type": "string",
          "nullable": true,
          "description": "How many units are affected by this recall.",
          "example": "<unitsAffected>"
        },
        {
          "key": "hazard",
          "type": "string",
          "nullable": true,
          "description": "Hazard or incident type, as classified by the source.",
          "example": "<hazard>"
        },
        {
          "key": "injuries",
          "type": "string",
          "nullable": true,
          "description": "Injuries as recorded for this row.",
          "example": "<injuries>"
        },
        {
          "key": "remedy",
          "type": "string",
          "nullable": true,
          "description": "Remedy the recall offers.",
          "example": "<remedy>"
        },
        {
          "key": "urgency",
          "type": "string",
          "nullable": true,
          "description": "How urgent this row is, in words.",
          "example": "medium"
        },
        {
          "key": "urgencyNote",
          "type": "string",
          "nullable": true,
          "description": "Why the row carries the urgency it does.",
          "example": "Payment terms change in 14 days."
        },
        {
          "key": "matchedWatchlistEntry",
          "type": "string",
          "nullable": true,
          "description": "Sanctions or watchlist entry that matched this record.",
          "example": "Northwind Trading FZE"
        },
        {
          "key": "url",
          "type": "string",
          "nullable": true,
          "description": "The URL this row describes.",
          "example": "https://example.com/pricing"
        },
        {
          "key": "status",
          "type": "string",
          "nullable": true,
          "description": "Outcome recorded for this row.",
          "example": "ok"
        },
        {
          "key": "verdict",
          "type": "string",
          "nullable": true,
          "description": "The Actor's conclusion for this row, stated in words.",
          "example": "pass"
        }
      ],
      "inputs": [
        {
          "key": "watchlist",
          "type": "array",
          "required": false,
          "secret": false,
          "description": "Brand or manufacturer names to watch for in new CPSC recalls, e.g. Cambridge Audio, Branch Furniture. Leave empty to return every recall in the window instead of matching a watchlist."
        },
        {
          "key": "daysBack",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "How many days of CPSC recalls to scan."
        },
        {
          "key": "maxItems",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Hard cap on items returned. You are never charged beyond this."
        }
      ]
    },
    {
      "slug": "federal-award-intel",
      "entry": "066",
      "title": "Federal Award Intelligence — Who's Winning, USASpending.gov",
      "description": "Who's already winning federal contracts in your NAICS code, and how much — from USASpending.gov's free, keyless official data. The complement to the Grant/RFP Opportunity Radar: that shows what's open to bid, this shows who's already won.",
      "categories": [
        "DEVELOPER_TOOLS",
        "BUSINESS"
      ],
      "url": "https://alaudinburki-scrapers.pages.dev/scrapers/federal-award-intel/",
      "apifyUrl": "https://apify.com/alaudinburki/federal-award-intel",
      "usage": {
        "runs": 23,
        "users": 2,
        "lastRun": "2026-10-16"
      },
      "outputSchema": [
        {
          "key": "recipient",
          "type": "string",
          "nullable": true,
          "description": "Message recipient.",
          "example": "<recipient>"
        },
        {
          "key": "totalAmount",
          "type": "number",
          "nullable": true,
          "description": "Total monetary amount, including any additional charges.",
          "example": "0"
        },
        {
          "key": "awardCount",
          "type": "integer",
          "nullable": true,
          "description": "How many awards were recorded.",
          "example": "0"
        },
        {
          "key": "agencies",
          "type": "string",
          "nullable": true,
          "description": "Agencies involved in this record.",
          "example": "<agencies>"
        },
        {
          "key": "matchedOn",
          "type": "string",
          "nullable": true,
          "description": "Which field matched.",
          "example": "title"
        },
        {
          "key": "awardId",
          "type": "string",
          "nullable": true,
          "description": "Identifier of the award.",
          "example": "<awardId>"
        },
        {
          "key": "amount",
          "type": "number",
          "nullable": true,
          "description": "Monetary amount, in the currency given by the currency field.",
          "example": "0"
        },
        {
          "key": "agency",
          "type": "string",
          "nullable": true,
          "description": "Agency the record belongs to.",
          "example": "<agency>"
        },
        {
          "key": "startDate",
          "type": "string",
          "nullable": true,
          "description": "ISO 8601 start of the period this record covers.",
          "example": "<startDate>"
        },
        {
          "key": "endDate",
          "type": "string",
          "nullable": true,
          "description": "ISO 8601 end of the period this record covers.",
          "example": "<endDate>"
        },
        {
          "key": "description",
          "type": "string",
          "nullable": true,
          "description": "Description of this record, as published by the source.",
          "example": "<description>"
        },
        {
          "key": "usaspendingUrl",
          "type": "string",
          "nullable": true,
          "description": "Usaspending Url as recorded for this row.",
          "example": "<usaspendingUrl>"
        },
        {
          "key": "status",
          "type": "string",
          "nullable": true,
          "description": "Outcome recorded for this row.",
          "example": "ok"
        },
        {
          "key": "verdict",
          "type": "string",
          "nullable": true,
          "description": "The Actor's conclusion for this row, stated in words.",
          "example": "pass"
        }
      ],
      "inputs": [
        {
          "key": "searches",
          "type": "array",
          "required": true,
          "secret": false,
          "description": "One or more searches, each with a NAICS code and/or keyword, plus optional agency. Example: [{\"naicsCode\": \"541512\"}]"
        },
        {
          "key": "outputMode",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "'competitors' aggregates awards by recipient into a ranked who's-winning table (the main product). 'awards' returns individual award rows instead."
        },
        {
          "key": "daysBack",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "How many days of award activity to search, up to 5 years. Filters by recent activity (including contract modifications), not just original award date."
        },
        {
          "key": "maxAwardsPerSearch",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "How many USASpending results to pull per search."
        }
      ]
    },
    {
      "slug": "cfpb-complaint-monitor",
      "entry": "067",
      "title": "Financial Complaint Monitor — CFPB, Summarized",
      "description": "A company's CFPB complaint profile: volume, top issues, and how complaints actually get resolved (the company_response breakdown) — from the same free public database CFPB itself publishes. Type an approximate name; it's resolved to the exact filing name automatically.",
      "categories": [
        "DEVELOPER_TOOLS",
        "BUSINESS"
      ],
      "url": "https://alaudinburki-scrapers.pages.dev/scrapers/cfpb-complaint-monitor/",
      "apifyUrl": "https://apify.com/alaudinburki/cfpb-complaint-monitor",
      "usage": {
        "runs": 23,
        "users": 2,
        "lastRun": "2026-10-16"
      },
      "outputSchema": [
        {
          "key": "queriedAs",
          "type": "string",
          "nullable": true,
          "description": "The query exactly as it was sent to the source.",
          "example": "\"amazon product scraper\""
        },
        {
          "key": "resolvedCompanyName",
          "type": "string",
          "nullable": true,
          "description": "Company name normalised for matching.",
          "example": "<resolvedCompanyName>"
        },
        {
          "key": "windowDays",
          "type": "integer",
          "nullable": true,
          "description": "Length of the observation window, in days.",
          "example": "0"
        },
        {
          "key": "totalComplaintsOnFile",
          "type": "integer",
          "nullable": true,
          "description": "Total complaints the source holds.",
          "example": "0"
        },
        {
          "key": "totalComplaintsInWindow",
          "type": "integer",
          "nullable": true,
          "description": "Complaints recorded within the observation window.",
          "example": "0"
        },
        {
          "key": "timelyResponseRate",
          "type": "number",
          "nullable": true,
          "description": "Share of inquiries answered within the published window, between 0 and 1.",
          "example": "0"
        },
        {
          "key": "topProducts",
          "type": "string",
          "nullable": true,
          "description": "Products appearing most often across the samples.",
          "example": "<topProducts>"
        },
        {
          "key": "topIssues",
          "type": "string",
          "nullable": true,
          "description": "The highest-priority issues found.",
          "example": "[\"Missing canonical tag\",\"No sitemap declared\"]"
        },
        {
          "key": "responseBreakdown",
          "type": "string",
          "nullable": true,
          "description": "Human-readable breakdown of how the response time was spent.",
          "example": "<responseBreakdown>"
        },
        {
          "key": "status",
          "type": "string",
          "nullable": true,
          "description": "Outcome recorded for this row.",
          "example": "ok"
        },
        {
          "key": "verdict",
          "type": "string",
          "nullable": true,
          "description": "The Actor's conclusion for this row, stated in words.",
          "example": "pass"
        }
      ],
      "inputs": [
        {
          "key": "companies",
          "type": "array",
          "required": true,
          "secret": false,
          "description": "Financial company names to look up, e.g. Equifax, Wells Fargo. An approximate name is fine — resolved automatically to CFPB's exact filing name."
        },
        {
          "key": "daysBack",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "How many days of complaints to include, up to 5 years."
        },
        {
          "key": "maxComplaintsPerCompany",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "How many individual complaints to pull per company for the summary (affects accuracy of the top-issues breakdown, not the totalComplaintsOnFile count)."
        }
      ]
    },
    {
      "slug": "weather-impact-monitor",
      "entry": "068",
      "title": "Severe Weather Business Impact Monitor — NWS, By Location",
      "description": "Matches active NOAA/NWS severe weather alerts against your specific business locations (lat/lon), not a raw statewide feed. Severity, urgency, and certainty are NWS's own official classification, never a re-derived heuristic. Free, keyless, real-time.",
      "categories": [
        "DEVELOPER_TOOLS",
        "BUSINESS"
      ],
      "url": "https://alaudinburki-scrapers.pages.dev/scrapers/weather-impact-monitor/",
      "apifyUrl": "https://apify.com/alaudinburki/weather-impact-monitor",
      "usage": {
        "runs": 23,
        "users": 2,
        "lastRun": "2026-10-16"
      },
      "outputSchema": [
        {
          "key": "locationLabel",
          "type": "string",
          "nullable": true,
          "description": "Short human-readable label for this location.",
          "example": "Austin, Texas"
        },
        {
          "key": "lat",
          "type": "number",
          "nullable": true,
          "description": "Latitude in decimal degrees. Negative is south.",
          "example": "30.2672"
        },
        {
          "key": "lon",
          "type": "number",
          "nullable": true,
          "description": "Longitude in decimal degrees. Negative is west.",
          "example": "-97.7431"
        },
        {
          "key": "resolvedCity",
          "type": "string",
          "nullable": true,
          "description": "City resolved from the raw published address.",
          "example": "<resolvedCity>"
        },
        {
          "key": "resolvedState",
          "type": "string",
          "nullable": true,
          "description": "State resolved from the raw published address.",
          "example": "<resolvedState>"
        },
        {
          "key": "alertId",
          "type": "string",
          "nullable": true,
          "description": "Identifier of this alert.",
          "example": "<alertId>"
        },
        {
          "key": "event",
          "type": "string",
          "nullable": true,
          "description": "Event as recorded for this row.",
          "example": "<event>"
        },
        {
          "key": "headline",
          "type": "string",
          "nullable": true,
          "description": "Headline as published.",
          "example": "<headline>"
        },
        {
          "key": "severity",
          "type": "string",
          "nullable": true,
          "description": "Severity as classified by the source.",
          "example": "moderate"
        },
        {
          "key": "urgency",
          "type": "string",
          "nullable": true,
          "description": "How urgent this row is, in words.",
          "example": "medium"
        },
        {
          "key": "certainty",
          "type": "string",
          "nullable": true,
          "description": "Certainty as recorded for this row.",
          "example": "<certainty>"
        },
        {
          "key": "areaDesc",
          "type": "string",
          "nullable": true,
          "description": "Geographic area the declaration covers, as the source words it.",
          "example": "<areaDesc>"
        },
        {
          "key": "effective",
          "type": "string",
          "nullable": true,
          "description": "Date the record takes effect.",
          "example": "<effective>"
        },
        {
          "key": "expires",
          "type": "string",
          "nullable": true,
          "description": "ISO 8601 timestamp after which this record is no longer valid.",
          "example": "<expires>"
        },
        {
          "key": "description",
          "type": "string",
          "nullable": true,
          "description": "Description of this record, as published by the source.",
          "example": "<description>"
        },
        {
          "key": "instruction",
          "type": "string",
          "nullable": true,
          "description": "Instruction for resolving this finding.",
          "example": "<instruction>"
        },
        {
          "key": "status",
          "type": "string",
          "nullable": true,
          "description": "Outcome recorded for this row.",
          "example": "ok"
        },
        {
          "key": "verdict",
          "type": "string",
          "nullable": true,
          "description": "The Actor's conclusion for this row, stated in words.",
          "example": "pass"
        }
      ],
      "inputs": [
        {
          "key": "locations",
          "type": "array",
          "required": true,
          "secret": false,
          "description": "Business locations to check, each with a lat/lon and an optional label. Example: [{\"label\": \"Warehouse A\", \"lat\": 34.05, \"lon\": -118.24}]. US locations only (NWS coverage)."
        },
        {
          "key": "minSeverity",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "Only return alerts at or above this severity. Leave empty for all severities."
        },
        {
          "key": "maxItems",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Hard cap on items returned. You are never charged beyond this."
        }
      ]
    },
    {
      "slug": "jev-job-taxonomy",
      "entry": "069",
      "title": "Jev Job Posting Taxonomy — Classify Job Listings",
      "description": "Normalize supplied job postings into function, seniority, and remote-policy fields with TypeSafe Jev.",
      "categories": [
        "AI",
        "JOBS"
      ],
      "url": "https://alaudinburki-scrapers.pages.dev/scrapers/jev-job-taxonomy/",
      "apifyUrl": "https://apify.com/alaudinburki/jev-job-taxonomy",
      "usage": {
        "runs": 22,
        "users": 2,
        "lastRun": "2026-10-16"
      },
      "outputSchema": [
        {
          "key": "index",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Position of this row within the run.",
          "example": "1"
        },
        {
          "key": "sourceId",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Identifier of the input record this row came from.",
          "example": "rec_01"
        },
        {
          "key": "description",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Description of this record, as published by the source.",
          "example": "[]"
        },
        {
          "key": "function",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Function as recorded for this row.",
          "example": "[]"
        },
        {
          "key": "seniority",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Seniority level as posted or inferred from the title.",
          "example": "[]"
        },
        {
          "key": "remotePolicy",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Remote Policy as recorded for this row.",
          "example": "[]"
        },
        {
          "key": "judgments",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "The full structured judgement returned by the model.",
          "example": "{\"stance\":{\"choice\":\"recommended\"}}"
        },
        {
          "key": "model",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Identifier of the model that produced the judgement.",
          "example": "jev-latest"
        }
      ],
      "inputs": [
        {
          "key": "records",
          "type": "array",
          "required": true,
          "secret": false,
          "description": "Rows containing a job description."
        },
        {
          "key": "typesafeApiKey",
          "type": "string",
          "required": false,
          "secret": true,
          "description": "Secret — supply your own value."
        },
        {
          "key": "maxItems",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Hard cap on enriched rows."
        }
      ]
    },
    {
      "slug": "jev-review-intelligence",
      "entry": "070",
      "title": "Jev Review Intelligence — Classify Customer Reviews",
      "description": "Classify supplied product reviews into typed topic, severity, and actionability fields using your TypeSafe Jev key.",
      "categories": [
        "AI",
        "BUSINESS"
      ],
      "url": "https://alaudinburki-scrapers.pages.dev/scrapers/jev-review-intelligence/",
      "apifyUrl": "https://apify.com/alaudinburki/jev-review-intelligence",
      "usage": {
        "runs": 22,
        "users": 2,
        "lastRun": "2026-10-16"
      },
      "outputSchema": [
        {
          "key": "index",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Position of this row within the run.",
          "example": "1"
        },
        {
          "key": "sourceId",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Identifier of the input record this row came from.",
          "example": "rec_01"
        },
        {
          "key": "review",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "The review text that was judged.",
          "example": "The battery lasted two days."
        },
        {
          "key": "topic",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "The topic assigned to this row.",
          "example": "usability"
        },
        {
          "key": "severity",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "How severe this row is judged to be.",
          "example": "2"
        },
        {
          "key": "actionableProbability",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Probability the row contains something actionable, on a 0-1 scale.",
          "example": "0.4"
        },
        {
          "key": "judgments",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "The full structured judgement returned by the model.",
          "example": "{\"stance\":{\"choice\":\"recommended\"}}"
        },
        {
          "key": "model",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Identifier of the model that produced the judgement.",
          "example": "jev-latest"
        }
      ],
      "inputs": [
        {
          "key": "records",
          "type": "array",
          "required": true,
          "secret": false,
          "description": "Rows containing review text."
        },
        {
          "key": "typesafeApiKey",
          "type": "string",
          "required": false,
          "secret": true,
          "description": "Secret — supply your own value."
        },
        {
          "key": "maxItems",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Hard cap on enriched rows."
        }
      ]
    },
    {
      "slug": "warn-act-layoff-radar",
      "entry": "071",
      "title": "Layoff Early Warning — WARN Act Filings, Watchlisted",
      "description": "Aggregates official state WARN Act mass-layoff filings (60-days'-notice legal filings) — currently CA and TX, both live structured sources — and matches them against your company watchlist, ranked by headcount severity. Recruiters, journalists, and diligence teams check this by hand today.",
      "categories": [
        "DEVELOPER_TOOLS",
        "BUSINESS"
      ],
      "url": "https://alaudinburki-scrapers.pages.dev/scrapers/warn-act-layoff-radar/",
      "apifyUrl": "https://apify.com/alaudinburki/warn-act-layoff-radar",
      "usage": {
        "runs": 22,
        "users": 2,
        "lastRun": "2026-10-16"
      },
      "outputSchema": [
        {
          "key": "company",
          "type": "string",
          "nullable": true,
          "description": "Company name as the source writes it.",
          "example": "Northwind Traders"
        },
        {
          "key": "state",
          "type": "string",
          "nullable": true,
          "description": "State, province or region name.",
          "example": "active"
        },
        {
          "key": "county",
          "type": "string",
          "nullable": true,
          "description": "County name.",
          "example": "Travis"
        },
        {
          "key": "noticeDate",
          "type": "string",
          "nullable": true,
          "description": "Date the notice was issued.",
          "example": "<noticeDate>"
        },
        {
          "key": "effectiveDate",
          "type": "string",
          "nullable": true,
          "description": "ISO 8601 date the record takes effect.",
          "example": "<effectiveDate>"
        },
        {
          "key": "layoffType",
          "type": "string",
          "nullable": true,
          "description": "Layoff Type as recorded for this row.",
          "example": "<layoffType>"
        },
        {
          "key": "employeeCount",
          "type": "integer",
          "nullable": true,
          "description": "Employee Count as recorded for this row.",
          "example": "0"
        },
        {
          "key": "severity",
          "type": "string",
          "nullable": true,
          "description": "Severity as classified by the source.",
          "example": "moderate"
        },
        {
          "key": "address",
          "type": "string",
          "nullable": true,
          "description": "Street address as published.",
          "example": "<address>"
        },
        {
          "key": "industry",
          "type": "string",
          "nullable": true,
          "description": "Industry classification as the source publishes it.",
          "example": "<industry>"
        },
        {
          "key": "matchedWatchlistEntry",
          "type": "string",
          "nullable": true,
          "description": "Sanctions or watchlist entry that matched this record.",
          "example": "Northwind Trading FZE"
        },
        {
          "key": "status",
          "type": "string",
          "nullable": true,
          "description": "Outcome recorded for this row.",
          "example": "ok"
        },
        {
          "key": "verdict",
          "type": "string",
          "nullable": true,
          "description": "The Actor's conclusion for this row, stated in words.",
          "example": "pass"
        }
      ],
      "inputs": [
        {
          "key": "watchlist",
          "type": "array",
          "required": false,
          "secret": false,
          "description": "Company names to watch for in new WARN Act filings, e.g. Genentech, JPMorgan Chase. Leave empty to return every current filing instead of matching a watchlist."
        },
        {
          "key": "states",
          "type": "array",
          "required": false,
          "secret": false,
          "description": "Which states to check. Currently CA and TX have live structured data sources; other states publish only as records requests or unstructured PDFs and are not yet covered."
        },
        {
          "key": "maxItems",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Hard cap on items returned. You are never charged beyond this."
        }
      ]
    },
    {
      "slug": "pdf-layout-text",
      "entry": "072",
      "title": "PDF Layout-Preserved Text — Tables & Forms",
      "description": "Extracts PDF text with column alignment kept intact — between plain text (scrambles forms) and structured tables (not every layout has one). Verified on IRS Form 1040: plain extraction garbled two columns together; this keeps them separate. Flags scanned pages instead of nonsense.",
      "categories": [
        "DEVELOPER_TOOLS",
        "AI"
      ],
      "url": "https://alaudinburki-scrapers.pages.dev/scrapers/pdf-layout-text/",
      "apifyUrl": "https://apify.com/alaudinburki/pdf-layout-text",
      "usage": {
        "runs": 22,
        "users": 1,
        "lastRun": "2026-10-15"
      },
      "outputSchema": [
        {
          "key": "sourceUrl",
          "type": "string",
          "nullable": true,
          "description": "The page or endpoint this row was read from.",
          "example": "https://api.example.com/v1/items"
        },
        {
          "key": "page",
          "type": "integer",
          "nullable": true,
          "description": "Page number this record came from. 1-based.",
          "example": "1"
        },
        {
          "key": "chunkIndex",
          "type": "integer",
          "nullable": true,
          "description": "Zero-based position of this chunk within its document.",
          "example": "0"
        },
        {
          "key": "chunksOnPage",
          "type": "integer",
          "nullable": true,
          "description": "How many chunks this page was split into.",
          "example": "0"
        },
        {
          "key": "text",
          "type": "string",
          "nullable": true,
          "description": "Plain text content of this record.",
          "example": "<text>"
        },
        {
          "key": "charCount",
          "type": "integer",
          "nullable": true,
          "description": "Number of characters in this record's text.",
          "example": "4821"
        },
        {
          "key": "tokensEstimate",
          "type": "integer",
          "nullable": true,
          "description": "Estimated token count of the text, for sizing against a model context window.",
          "example": "1180"
        },
        {
          "key": "status",
          "type": "string",
          "nullable": true,
          "description": "Outcome recorded for this row.",
          "example": "ok"
        },
        {
          "key": "recommendation",
          "type": "string",
          "nullable": true,
          "description": "The recommended action for this row.",
          "example": "Review the price change before it propagates."
        }
      ],
      "inputs": [
        {
          "key": "pdfUrls",
          "type": "array",
          "required": false,
          "secret": false,
          "description": "Public URLs of the PDFs to extract layout-preserved text from."
        },
        {
          "key": "pages",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "Which pages to read, e.g. 1-5,8. Leave empty for every page."
        },
        {
          "key": "maxPagesPerPdf",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Upper bound on pages read from each document."
        },
        {
          "key": "maxChunkChars",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "A page's text is split into chunks no larger than this, always at a line boundary so column alignment is never cut mid-row."
        },
        {
          "key": "oneItemPerPage",
          "type": "boolean",
          "required": false,
          "secret": false,
          "description": "Return one dataset item per page instead of chunking by character count. Off by default because a dense page can exceed typical LLM context limits."
        },
        {
          "key": "maxItems",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Hard cap on items returned. You are never charged beyond this."
        }
      ]
    },
    {
      "slug": "fema-disaster-monitor",
      "entry": "073",
      "title": "Federal Disaster Declaration Monitor — FEMA, By State/County",
      "description": "Matches FEMA federal disaster declarations against your state/county watchlist, with the specific relief programs each unlocks (Individual Assistance, Public Assistance, Hazard Mitigation) — the official after-the-fact determination, not just a weather event. Free, keyless, official OpenFEMA data.",
      "categories": [
        "DEVELOPER_TOOLS",
        "BUSINESS"
      ],
      "url": "https://alaudinburki-scrapers.pages.dev/scrapers/fema-disaster-monitor/",
      "apifyUrl": "https://apify.com/alaudinburki/fema-disaster-monitor",
      "usage": {
        "runs": 21,
        "users": 2,
        "lastRun": "2026-10-15"
      },
      "outputSchema": [
        {
          "key": "declarationId",
          "type": "string",
          "nullable": true,
          "description": "Identifier of this declaration.",
          "example": "<declarationId>"
        },
        {
          "key": "femaDeclarationString",
          "type": "string",
          "nullable": true,
          "description": "The declaration number as FEMA formats it.",
          "example": "<femaDeclarationString>"
        },
        {
          "key": "state",
          "type": "string",
          "nullable": true,
          "description": "State, province or region name.",
          "example": "active"
        },
        {
          "key": "county",
          "type": "string",
          "nullable": true,
          "description": "County name.",
          "example": "Travis"
        },
        {
          "key": "declarationType",
          "type": "string",
          "nullable": true,
          "description": "Type of declaration, for example major disaster or emergency.",
          "example": "<declarationType>"
        },
        {
          "key": "declarationTypeLabel",
          "type": "string",
          "nullable": true,
          "description": "Human-readable label for the declaration type.",
          "example": "<declarationTypeLabel>"
        },
        {
          "key": "declarationTitle",
          "type": "string",
          "nullable": true,
          "description": "Official title of the declaration.",
          "example": "<declarationTitle>"
        },
        {
          "key": "incidentType",
          "type": "string",
          "nullable": true,
          "description": "Type of incident, as classified by the source.",
          "example": "<incidentType>"
        },
        {
          "key": "declarationDate",
          "type": "string",
          "nullable": true,
          "description": "Date the declaration was issued.",
          "example": "<declarationDate>"
        },
        {
          "key": "incidentBeginDate",
          "type": "string",
          "nullable": true,
          "description": "Start date of the incident.",
          "example": "<incidentBeginDate>"
        },
        {
          "key": "incidentEndDate",
          "type": "string",
          "nullable": true,
          "description": "End date of the incident.",
          "example": "<incidentEndDate>"
        },
        {
          "key": "individualAssistance",
          "type": "boolean",
          "nullable": true,
          "description": "Whether individual assistance is available for this declaration.",
          "example": "true"
        },
        {
          "key": "publicAssistance",
          "type": "boolean",
          "nullable": true,
          "description": "Whether public assistance is available for this declaration.",
          "example": "true"
        },
        {
          "key": "hazardMitigation",
          "type": "boolean",
          "nullable": true,
          "description": "Whether hazard mitigation funding is available.",
          "example": "true"
        },
        {
          "key": "assistancePrograms",
          "type": "string",
          "nullable": true,
          "description": "Assistance programmes available for this declaration.",
          "example": "<assistancePrograms>"
        },
        {
          "key": "watchedState",
          "type": "string",
          "nullable": true,
          "description": "State this run was configured to watch.",
          "example": "<watchedState>"
        },
        {
          "key": "watchedCounty",
          "type": "string",
          "nullable": true,
          "description": "County this run was configured to watch.",
          "example": "<watchedCounty>"
        },
        {
          "key": "status",
          "type": "string",
          "nullable": true,
          "description": "Outcome recorded for this row.",
          "example": "ok"
        },
        {
          "key": "verdict",
          "type": "string",
          "nullable": true,
          "description": "The Actor's conclusion for this row, stated in words.",
          "example": "pass"
        }
      ],
      "inputs": [
        {
          "key": "watchlist",
          "type": "array",
          "required": true,
          "secret": false,
          "description": "State (required) and county (optional) pairs to watch. State alone watches every declaration statewide; adding a county narrows it. Example: [{\"state\": \"CA\", \"county\": \"Calaveras\"}]"
        },
        {
          "key": "daysBack",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "How many days of declarations to check, up to 5 years."
        },
        {
          "key": "maxItems",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Hard cap on items returned. You are never charged beyond this."
        }
      ]
    },
    {
      "slug": "litigation-monitor",
      "entry": "074",
      "title": "Federal Litigation Monitor — New Filings by Company",
      "description": "New federal court filings matched against your company watchlist, via CourtListener/RECAP's free public mirror of PACER — the kind of monitoring paid tools like Docket Alarm sell. Party role is reported honestly (first/second-named party), not a guessed plaintiff/defendant label.",
      "categories": [
        "DEVELOPER_TOOLS",
        "BUSINESS"
      ],
      "url": "https://alaudinburki-scrapers.pages.dev/scrapers/litigation-monitor/",
      "apifyUrl": "https://apify.com/alaudinburki/litigation-monitor",
      "usage": {
        "runs": 21,
        "users": 1,
        "lastRun": "2026-10-16"
      },
      "outputSchema": [
        {
          "key": "matchedCompany",
          "type": "string",
          "nullable": true,
          "description": "Company that matched.",
          "example": "<matchedCompany>"
        },
        {
          "key": "caseName",
          "type": "string",
          "nullable": true,
          "description": "Name of the case.",
          "example": "<caseName>"
        },
        {
          "key": "court",
          "type": "string",
          "nullable": true,
          "description": "Court the case was heard in.",
          "example": "<court>"
        },
        {
          "key": "docketNumber",
          "type": "string",
          "nullable": true,
          "description": "Docket number for the case.",
          "example": "<docketNumber>"
        },
        {
          "key": "dateFiled",
          "type": "string",
          "nullable": true,
          "description": "Date the document was filed.",
          "example": "<dateFiled>"
        },
        {
          "key": "dateTerminated",
          "type": "string",
          "nullable": true,
          "description": "Date the record was terminated or closed.",
          "example": "<dateTerminated>"
        },
        {
          "key": "party1",
          "type": "string",
          "nullable": true,
          "description": "First party to the case.",
          "example": "<party1>"
        },
        {
          "key": "party2",
          "type": "string",
          "nullable": true,
          "description": "Second party to the case.",
          "example": "<party2>"
        },
        {
          "key": "companyRole",
          "type": "string",
          "nullable": true,
          "description": "Role this person holds at the company.",
          "example": "<companyRole>"
        },
        {
          "key": "docketUrl",
          "type": "string",
          "nullable": true,
          "description": "Link to the docket at its source.",
          "example": "<docketUrl>"
        },
        {
          "key": "documentCount",
          "type": "integer",
          "nullable": true,
          "description": "Number of documents found or processed.",
          "example": "0"
        },
        {
          "key": "status",
          "type": "string",
          "nullable": true,
          "description": "Outcome recorded for this row.",
          "example": "ok"
        },
        {
          "key": "verdict",
          "type": "string",
          "nullable": true,
          "description": "The Actor's conclusion for this row, stated in words.",
          "example": "pass"
        }
      ],
      "inputs": [
        {
          "key": "companies",
          "type": "array",
          "required": true,
          "secret": false,
          "description": "Company names to watch for new federal court filings, e.g. Apple Inc., Tesla, Inc. Use the full legal name where possible for the best match."
        },
        {
          "key": "daysBack",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "How many days of new filings to check, up to 5 years."
        },
        {
          "key": "maxCasesPerCompany",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "How many matching cases to return per company."
        },
        {
          "key": "maxItems",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Hard cap on items returned across all companies. You are never charged beyond this."
        }
      ]
    },
    {
      "slug": "funded-lab-radar",
      "entry": "075",
      "title": "Funded-Lab Sales Radar — Who's Funded to Work on X",
      "description": "Turns NIH's free grant database into a ranked lead list: which labs, PIs, and institutions are funded to work on your topic, with award size and funding freshness. Built for lab-equipment sales, CRO business development, and academic recruiting — the list vendors currently build by hand.",
      "categories": [
        "DEVELOPER_TOOLS",
        "BUSINESS"
      ],
      "url": "https://alaudinburki-scrapers.pages.dev/scrapers/funded-lab-radar/",
      "apifyUrl": "https://apify.com/alaudinburki/funded-lab-radar",
      "usage": {
        "runs": 21,
        "users": 2,
        "lastRun": "2026-10-15"
      },
      "outputSchema": [
        {
          "key": "matchedTopic",
          "type": "string",
          "nullable": true,
          "description": "Topic that matched.",
          "example": "<matchedTopic>"
        },
        {
          "key": "projectNumber",
          "type": "string",
          "nullable": true,
          "description": "Identifier of the project.",
          "example": "<projectNumber>"
        },
        {
          "key": "title",
          "type": "string",
          "nullable": true,
          "description": "Title as the source writes it.",
          "example": "Wireless Bluetooth Headphones"
        },
        {
          "key": "piName",
          "type": "string",
          "nullable": true,
          "description": "Pi Name as recorded for this row.",
          "example": "<piName>"
        },
        {
          "key": "coInvestigators",
          "type": "string",
          "nullable": true,
          "description": "Co Investigators as recorded for this row.",
          "example": "<coInvestigators>"
        },
        {
          "key": "institution",
          "type": "string",
          "nullable": true,
          "description": "Name of the institution.",
          "example": "<institution>"
        },
        {
          "key": "institutionCity",
          "type": "string",
          "nullable": true,
          "description": "City of the institution.",
          "example": "<institutionCity>"
        },
        {
          "key": "institutionState",
          "type": "string",
          "nullable": true,
          "description": "State of the institution.",
          "example": "<institutionState>"
        },
        {
          "key": "fundingAgency",
          "type": "string",
          "nullable": true,
          "description": "Agency providing the funding.",
          "example": "<fundingAgency>"
        },
        {
          "key": "awardAmount",
          "type": "number",
          "nullable": true,
          "description": "Monetary value of the award.",
          "example": "0"
        },
        {
          "key": "fundingTier",
          "type": "string",
          "nullable": true,
          "description": "Funding tier, where a programme publishes bands.",
          "example": "<fundingTier>"
        },
        {
          "key": "fundingFreshness",
          "type": "string",
          "nullable": true,
          "description": "How recent the funding information is.",
          "example": "<fundingFreshness>"
        },
        {
          "key": "fiscalYear",
          "type": "integer",
          "nullable": true,
          "description": "Fiscal year the figure belongs to.",
          "example": "0"
        },
        {
          "key": "isActive",
          "type": "boolean",
          "nullable": true,
          "description": "Whether the record is still active at the source.",
          "example": "true"
        },
        {
          "key": "projectStart",
          "type": "string",
          "nullable": true,
          "description": "Start date of the funded project.",
          "example": "<projectStart>"
        },
        {
          "key": "projectEnd",
          "type": "string",
          "nullable": true,
          "description": "End date of the funded project.",
          "example": "<projectEnd>"
        },
        {
          "key": "abstractExcerpt",
          "type": "string",
          "nullable": true,
          "description": "Opening excerpt of the abstract, for previewing a document.",
          "example": "<abstractExcerpt>"
        },
        {
          "key": "reporterUrl",
          "type": "string",
          "nullable": true,
          "description": "Reporter Url as recorded for this row.",
          "example": "<reporterUrl>"
        },
        {
          "key": "status",
          "type": "string",
          "nullable": true,
          "description": "Outcome recorded for this row.",
          "example": "ok"
        },
        {
          "key": "verdict",
          "type": "string",
          "nullable": true,
          "description": "The Actor's conclusion for this row, stated in words.",
          "example": "pass"
        }
      ],
      "inputs": [
        {
          "key": "topics",
          "type": "array",
          "required": false,
          "secret": false,
          "description": "Topics to search for in NIH grant titles, terms, and abstracts, e.g. mass spectrometry, CRISPR screening. Each topic is a separate search."
        },
        {
          "key": "fiscalYears",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "Space or comma separated NIH fiscal years to search, e.g. 2024, 2025. Leave empty for all years."
        },
        {
          "key": "activeOnly",
          "type": "boolean",
          "required": false,
          "secret": false,
          "description": "Only return grants that are currently active (have runway left, an unspent budget). Turn off to also include closed-out historical grants."
        },
        {
          "key": "minAwardAmount",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Discard grants funded below this amount. Leave empty for no minimum."
        },
        {
          "key": "maxResultsPerTopic",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "How many NIH RePORTER results to pull per topic search."
        },
        {
          "key": "maxItems",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Hard cap on items returned across all topics. You are never charged beyond this."
        }
      ]
    },
    {
      "slug": "grant-rfp-radar",
      "entry": "076",
      "title": "Grant/RFP Opportunity Radar — SAM.gov, Filtered & Ranked",
      "description": "Federal contract opportunities and solicitations from SAM.gov's own official database, filtered by NAICS code or keyword and ranked by response deadline. Gov-contracting consultants pay $300+/mo for third-party tools to do this by hand. Requires your own free SAM.gov API key.",
      "categories": [
        "DEVELOPER_TOOLS",
        "BUSINESS"
      ],
      "url": "https://alaudinburki-scrapers.pages.dev/scrapers/grant-rfp-radar/",
      "apifyUrl": "https://apify.com/alaudinburki/grant-rfp-radar",
      "usage": {
        "runs": 21,
        "users": 2,
        "lastRun": "2026-10-15"
      },
      "outputSchema": [
        {
          "key": "noticeId",
          "type": "string",
          "nullable": true,
          "description": "Identifier of this notice.",
          "example": "<noticeId>"
        },
        {
          "key": "title",
          "type": "string",
          "nullable": true,
          "description": "Title as the source writes it.",
          "example": "Wireless Bluetooth Headphones"
        },
        {
          "key": "solicitationNumber",
          "type": "string",
          "nullable": true,
          "description": "Solicitation reference number.",
          "example": "<solicitationNumber>"
        },
        {
          "key": "noticeType",
          "type": "string",
          "nullable": true,
          "description": "Kind of notice, as classified by the source.",
          "example": "<noticeType>"
        },
        {
          "key": "postedDate",
          "type": "string",
          "nullable": true,
          "description": "Date this was posted.",
          "example": "<postedDate>"
        },
        {
          "key": "responseDeadline",
          "type": "string",
          "nullable": true,
          "description": "Date by which a response to this notice is due.",
          "example": "<responseDeadline>"
        },
        {
          "key": "urgency",
          "type": "string",
          "nullable": true,
          "description": "How urgent this row is, in words.",
          "example": "medium"
        },
        {
          "key": "urgencyNote",
          "type": "string",
          "nullable": true,
          "description": "Why the row carries the urgency it does.",
          "example": "Payment terms change in 14 days."
        },
        {
          "key": "naicsCode",
          "type": "string",
          "nullable": true,
          "description": "Six-digit NAICS industry code.",
          "example": "<naicsCode>"
        },
        {
          "key": "classificationCode",
          "type": "string",
          "nullable": true,
          "description": "Code for the classification.",
          "example": "<classificationCode>"
        },
        {
          "key": "setAside",
          "type": "string",
          "nullable": true,
          "description": "Set-aside designation, where the notice carries one.",
          "example": "<setAside>"
        },
        {
          "key": "department",
          "type": "string",
          "nullable": true,
          "description": "Government department the contract or grant belongs to.",
          "example": "Transportation"
        },
        {
          "key": "placeOfPerformanceState",
          "type": "string",
          "nullable": true,
          "description": "State where the work will be performed, as the notice states it.",
          "example": "<placeOfPerformanceState>"
        },
        {
          "key": "active",
          "type": "boolean",
          "nullable": true,
          "description": "Whether the record is still active at the source.",
          "example": "true"
        },
        {
          "key": "matchedSearch",
          "type": "string",
          "nullable": true,
          "description": "Search term this row matched.",
          "example": "<matchedSearch>"
        },
        {
          "key": "uiLink",
          "type": "string",
          "nullable": true,
          "description": "Link to view this record in the platform's interface.",
          "example": "<uiLink>"
        },
        {
          "key": "status",
          "type": "string",
          "nullable": true,
          "description": "Outcome recorded for this row.",
          "example": "ok"
        },
        {
          "key": "verdict",
          "type": "string",
          "nullable": true,
          "description": "The Actor's conclusion for this row, stated in words.",
          "example": "pass"
        }
      ],
      "inputs": [
        {
          "key": "samGovApiKey",
          "type": "string",
          "required": false,
          "secret": true,
          "description": "Secret — supply your own value."
        },
        {
          "key": "searches",
          "type": "array",
          "required": true,
          "secret": false,
          "description": "One or more searches, each with a NAICS code and/or keyword, plus optional state and set-aside type. Example: [{\"naicsCode\": \"541512\", \"state\": \"VA\"}]"
        },
        {
          "key": "daysBack",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "How many days of posted opportunities to search, up to 364 (SAM.gov's own window limit)."
        },
        {
          "key": "maxResultsPerSearch",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "How many SAM.gov results to pull per search."
        },
        {
          "key": "maxItems",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Hard cap on items returned across all searches. You are never charged beyond this."
        }
      ]
    },
    {
      "slug": "jev-ai-answer-enricher",
      "entry": "077",
      "title": "Jev AI Answer Visibility Enricher — Brand Tracking",
      "description": "Add typed brand stance, recommendation, and citation-presence judgments to AI-answer datasets using your TypeSafe Jev key.",
      "categories": [
        "AI",
        "MARKETING"
      ],
      "url": "https://alaudinburki-scrapers.pages.dev/scrapers/jev-ai-answer-enricher/",
      "apifyUrl": "https://apify.com/alaudinburki/jev-ai-answer-enricher",
      "usage": {
        "runs": 21,
        "users": 2,
        "lastRun": "2026-10-16"
      },
      "outputSchema": [
        {
          "key": "index",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Position of this row within the run.",
          "example": "1"
        },
        {
          "key": "sourceId",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Identifier of the input record this row came from.",
          "example": "rec_01"
        },
        {
          "key": "prompt",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "The prompt that produced the answer.",
          "example": "best note app"
        },
        {
          "key": "answer",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "The answer text that was judged.",
          "example": "Notion is a strong choice."
        },
        {
          "key": "brand",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "The brand the answer was about.",
          "example": "Notion"
        },
        {
          "key": "stance",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "How the answer positions the brand.",
          "example": "recommended"
        },
        {
          "key": "recommendationStrength",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "How strongly the answer recommends, on a 0-1 scale.",
          "example": "0.8"
        },
        {
          "key": "citationPresentProbability",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Probability a citation was present, on a 0-1 scale.",
          "example": "0.65"
        },
        {
          "key": "judgments",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "The full structured judgement returned by the model.",
          "example": "{\"stance\":{\"choice\":\"recommended\"}}"
        },
        {
          "key": "model",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Identifier of the model that produced the judgement.",
          "example": "jev-latest"
        }
      ],
      "inputs": [
        {
          "key": "records",
          "type": "array",
          "required": true,
          "secret": false,
          "description": "Rows with prompt and answer text. The default demonstrates the required shape."
        },
        {
          "key": "brandName",
          "type": "string",
          "required": true,
          "secret": false,
          "description": "Brand whose visibility should be judged."
        },
        {
          "key": "competitors",
          "type": "array",
          "required": false,
          "secret": false,
          "description": "Competitor names to consider when judging preference."
        },
        {
          "key": "typesafeApiKey",
          "type": "string",
          "required": false,
          "secret": true,
          "description": "Secret — supply your own value."
        },
        {
          "key": "maxItems",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Hard cap on enriched records."
        }
      ]
    },
    {
      "slug": "jev-listing-policy-risk",
      "entry": "078",
      "title": "Jev Listing Policy-Risk Monitor — Marketplace Rules",
      "description": "Flag unsupported or policy-risk claims in supplied listing text using a buyer-defined policy and TypeSafe Jev.",
      "categories": [
        "AI",
        "ECOMMERCE"
      ],
      "url": "https://alaudinburki-scrapers.pages.dev/scrapers/jev-listing-policy-risk/",
      "apifyUrl": "https://apify.com/alaudinburki/jev-listing-policy-risk",
      "usage": {
        "runs": 21,
        "users": 2,
        "lastRun": "2026-10-16"
      },
      "outputSchema": [
        {
          "key": "index",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Position of this row within the run.",
          "example": "1"
        },
        {
          "key": "sourceId",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Identifier of the input record this row came from.",
          "example": "rec_01"
        },
        {
          "key": "listing",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Listing as recorded for this row.",
          "example": "[]"
        },
        {
          "key": "violationProbability",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Violation Probability as recorded for this row.",
          "example": "[]"
        },
        {
          "key": "severity",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "How severe this row is judged to be.",
          "example": "2"
        },
        {
          "key": "reviewRequired",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Review Required as recorded for this row.",
          "example": "[]"
        },
        {
          "key": "judgments",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "The full structured judgement returned by the model.",
          "example": "{\"stance\":{\"choice\":\"recommended\"}}"
        },
        {
          "key": "model",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Identifier of the model that produced the judgement.",
          "example": "jev-latest"
        }
      ],
      "inputs": [
        {
          "key": "records",
          "type": "array",
          "required": true,
          "secret": false,
          "description": "Rows containing listing text."
        },
        {
          "key": "policy",
          "type": "string",
          "required": true,
          "secret": false,
          "description": "The explicit policy to assess against."
        },
        {
          "key": "typesafeApiKey",
          "type": "string",
          "required": false,
          "secret": true,
          "description": "Secret — supply your own value."
        },
        {
          "key": "maxItems",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Hard cap on enriched rows."
        }
      ]
    },
    {
      "slug": "jev-research-evidence-sorter",
      "entry": "079",
      "title": "Jev Research Evidence Sorter — Rank Source Evidence",
      "description": "Rank supplied research snippets by relevance and evidence type using TypeSafe Jev while preserving source URLs.",
      "categories": [
        "AI",
        "BUSINESS"
      ],
      "url": "https://alaudinburki-scrapers.pages.dev/scrapers/jev-research-evidence-sorter/",
      "apifyUrl": "https://apify.com/alaudinburki/jev-research-evidence-sorter",
      "usage": {
        "runs": 21,
        "users": 2,
        "lastRun": "2026-10-16"
      },
      "outputSchema": [
        {
          "key": "index",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Position of this row within the run.",
          "example": "1"
        },
        {
          "key": "sourceId",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Identifier of the input record this row came from.",
          "example": "rec_01"
        },
        {
          "key": "url",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "The URL this row describes.",
          "example": "[]"
        },
        {
          "key": "text",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Plain text content of this record.",
          "example": "[]"
        },
        {
          "key": "relevance",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "How relevant this row is to the query, from 0 to 1.",
          "example": "[]"
        },
        {
          "key": "evidenceType",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Evidence Type as recorded for this row.",
          "example": "[]"
        },
        {
          "key": "judgments",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "The full structured judgement returned by the model.",
          "example": "{\"stance\":{\"choice\":\"recommended\"}}"
        },
        {
          "key": "model",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Identifier of the model that produced the judgement.",
          "example": "jev-latest"
        }
      ],
      "inputs": [
        {
          "key": "query",
          "type": "string",
          "required": true,
          "secret": false,
          "description": "Question used to judge relevance."
        },
        {
          "key": "records",
          "type": "array",
          "required": true,
          "secret": false,
          "description": "Rows with source URL and text."
        },
        {
          "key": "typesafeApiKey",
          "type": "string",
          "required": false,
          "secret": true,
          "description": "Secret — supply your own value."
        },
        {
          "key": "maxItems",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Hard cap on enriched rows."
        }
      ]
    },
    {
      "slug": "portfolio-health-monitor",
      "entry": "080",
      "title": "Apify Maintenance Watchdog — Monitor Actor Fleet",
      "description": "Audits an Apify Actor portfolio for maintenance notices and deprecations, with optional active smoke tests. Produces per-Actor evidence and fails scheduled runs when the fleet needs attention.",
      "categories": [
        "DEVELOPER_TOOLS",
        "AUTOMATION"
      ],
      "url": "https://alaudinburki-scrapers.pages.dev/scrapers/portfolio-health-monitor/",
      "apifyUrl": "https://apify.com/alaudinburki/portfolio-health-monitor",
      "usage": {
        "runs": 19,
        "users": 2,
        "lastRun": "2026-10-16"
      },
      "outputSchema": [
        {
          "key": "checkType",
          "type": "string",
          "nullable": true,
          "description": "Check Type as recorded for this row.",
          "example": "<checkType>"
        },
        {
          "key": "actorId",
          "type": "string",
          "nullable": true,
          "description": "Identifier of the Actor.",
          "example": "<actorId>"
        },
        {
          "key": "actorName",
          "type": "string",
          "nullable": true,
          "description": "Name of the Actor.",
          "example": "<actorName>"
        },
        {
          "key": "status",
          "type": "string",
          "nullable": true,
          "description": "Outcome recorded for this row.",
          "example": "ok"
        },
        {
          "key": "reason",
          "type": "string",
          "nullable": true,
          "description": "Why this row carries its status.",
          "example": "row retrieved successfully"
        },
        {
          "key": "notice",
          "type": "string",
          "nullable": true,
          "description": "Notice as recorded for this row.",
          "example": "<notice>"
        },
        {
          "key": "isPublic",
          "type": "boolean",
          "nullable": true,
          "description": "Whether the source lists this record as public.",
          "example": "true"
        },
        {
          "key": "runStatus",
          "type": "string",
          "nullable": true,
          "description": "Status of the run that produced this row.",
          "example": "<runStatus>"
        },
        {
          "key": "items",
          "type": "integer",
          "nullable": true,
          "description": "The items this record carries.",
          "example": "[{\"id\":\"1\",\"name\":\"Widget\"}]"
        },
        {
          "key": "expectedMinItems",
          "type": "integer",
          "nullable": true,
          "description": "Lowest item count a healthy response should return. Below this, the source may have changed shape.",
          "example": "0"
        },
        {
          "key": "durationMs",
          "type": "number",
          "nullable": true,
          "description": "Duration of the measured operation, in milliseconds.",
          "example": "0"
        }
      ],
      "inputs": [
        {
          "key": "auditPortfolio",
          "type": "boolean",
          "required": false,
          "secret": false,
          "description": "Check Actor notices, public state, and deprecation state through the Apify API without launching the checked Actors."
        },
        {
          "key": "actorIds",
          "type": "array",
          "required": false,
          "secret": false,
          "description": "Specific Actor IDs or user/name references to audit. Empty audits every Actor accessible in the current account."
        },
        {
          "key": "includePrivate",
          "type": "boolean",
          "required": false,
          "secret": false,
          "description": "Include private Actors when automatically discovering the portfolio."
        },
        {
          "key": "runSmokeChecks",
          "type": "boolean",
          "required": false,
          "secret": false,
          "description": "Launch the configured Actors with tiny inputs. Off by default to keep scheduled metadata audits cheap."
        },
        {
          "key": "checks",
          "type": "array",
          "required": false,
          "secret": false,
          "description": "Smoke checks: [{\"actorId\":\"user/actor\",\"input\":{...},\"expectMinItems\":1,\"timeoutSecs\":300}]. Empty = the built-in default fleet."
        },
        {
          "key": "concurrency",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "How many smoke runs at once (1-4)."
        },
        {
          "key": "memoryMbytes",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Memory given to each checked actor's run."
        },
        {
          "key": "failOnUnhealthy",
          "type": "boolean",
          "required": false,
          "secret": false,
          "description": "On (default): any maintenance notice, deprecated Actor, or unhealthy smoke check makes this run fail so Schedule notifications fire."
        }
      ]
    },
    {
      "slug": "jev-ad-landing-alignment-monitor",
      "entry": "081",
      "title": "Jev Ad-to-Landing Alignment Monitor — Ad Copy Match",
      "description": "Review supplied ad and landing-page context for message alignment and claim risk using a TypeSafe Jev key. It never reads ad accounts or changes campaigns.",
      "categories": [
        "AI",
        "MARKETING"
      ],
      "url": "https://alaudinburki-scrapers.pages.dev/scrapers/jev-ad-landing-alignment-monitor/",
      "apifyUrl": "https://apify.com/alaudinburki/jev-ad-landing-alignment-monitor",
      "usage": {
        "runs": 19,
        "users": 2,
        "lastRun": "2026-10-15"
      },
      "outputSchema": [
        {
          "key": "state",
          "type": "string",
          "nullable": true,
          "description": "Current state of this record in its own lifecycle.",
          "example": ""
        },
        {
          "key": "questions",
          "type": "object",
          "nullable": true,
          "description": "Questions as recorded for this row.",
          "example": ""
        },
        {
          "key": "index",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Position of this row within the run.",
          "example": "1"
        },
        {
          "key": "sourceId",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Identifier of the input record this row came from.",
          "example": "rec_01"
        },
        {
          "key": "adLandingContext",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Ad Landing Context as recorded for this row.",
          "example": "[]"
        },
        {
          "key": "messageAlignment",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Message Alignment as recorded for this row.",
          "example": "[]"
        },
        {
          "key": "claimRisk",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Claim Risk as recorded for this row.",
          "example": "[]"
        },
        {
          "key": "humanReviewProbability",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Human Review Probability as recorded for this row.",
          "example": "[]"
        },
        {
          "key": "status",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Outcome recorded for this row.",
          "example": "ok"
        },
        {
          "key": "minConfidence",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Min Confidence as recorded for this row.",
          "example": "[]"
        },
        {
          "key": "judgments",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "The full structured judgement returned by the model.",
          "example": "{\"stance\":{\"choice\":\"recommended\"}}"
        },
        {
          "key": "model",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Identifier of the model that produced the judgement.",
          "example": "jev-latest"
        }
      ],
      "inputs": [
        {
          "key": "records",
          "type": "array",
          "required": true,
          "secret": false,
          "description": "Rows containing the ad promise, landing-page copy, and optional policy context."
        },
        {
          "key": "typesafeApiKey",
          "type": "string",
          "required": false,
          "secret": true,
          "description": "Secret — supply your own value."
        },
        {
          "key": "maxItems",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Hard cap on processed ad and landing-page rows."
        }
      ]
    },
    {
      "slug": "jev-seo-topic-gap-reviewer",
      "entry": "082",
      "title": "Jev SEO Topic-Gap Reviewer — Find Content Gaps",
      "description": "Review supplied SEO query, page, and content context for intent alignment and duplicate risk using a TypeSafe Jev key. It does not retrieve rankings or volume.",
      "categories": [
        "AI",
        "SEO_TOOLS"
      ],
      "url": "https://alaudinburki-scrapers.pages.dev/scrapers/jev-seo-topic-gap-reviewer/",
      "apifyUrl": "https://apify.com/alaudinburki/jev-seo-topic-gap-reviewer",
      "usage": {
        "runs": 19,
        "users": 2,
        "lastRun": "2026-10-15"
      },
      "outputSchema": [
        {
          "key": "state",
          "type": "string",
          "nullable": true,
          "description": "Current state of this record in its own lifecycle.",
          "example": ""
        },
        {
          "key": "questions",
          "type": "object",
          "nullable": true,
          "description": "Questions as recorded for this row.",
          "example": ""
        },
        {
          "key": "index",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Position of this row within the run.",
          "example": "1"
        },
        {
          "key": "sourceId",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Identifier of the input record this row came from.",
          "example": "rec_01"
        },
        {
          "key": "seoContext",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Seo Context as recorded for this row.",
          "example": "[]"
        },
        {
          "key": "intentAlignment",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Intent Alignment as recorded for this row.",
          "example": "[]"
        },
        {
          "key": "topicGap",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Topic Gap as recorded for this row.",
          "example": "[]"
        },
        {
          "key": "duplicateRiskProbability",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Duplicate Risk Probability as recorded for this row.",
          "example": "[]"
        },
        {
          "key": "status",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Outcome recorded for this row.",
          "example": "ok"
        },
        {
          "key": "minConfidence",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Min Confidence as recorded for this row.",
          "example": "[]"
        },
        {
          "key": "judgments",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "The full structured judgement returned by the model.",
          "example": "{\"stance\":{\"choice\":\"recommended\"}}"
        },
        {
          "key": "model",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Identifier of the model that produced the judgement.",
          "example": "jev-latest"
        }
      ],
      "inputs": [
        {
          "key": "records",
          "type": "array",
          "required": true,
          "secret": false,
          "description": "Rows with a query, current page/content, and optional observed metrics."
        },
        {
          "key": "typesafeApiKey",
          "type": "string",
          "required": false,
          "secret": true,
          "description": "Secret — supply your own value."
        },
        {
          "key": "maxItems",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Hard cap on processed SEO rows."
        }
      ]
    },
    {
      "slug": "fda-recall-monitor",
      "entry": "083",
      "title": "Drug & Device Recall Monitor — openFDA, By Firm",
      "description": "Drug and device recalls matched against your firm watchlist, from FDA's free official openFDA enforcement API. FDA's own Class I/II/III severity is passed through directly — Class I is FDA's most severe designation. No API key required for normal use.",
      "categories": [
        "DEVELOPER_TOOLS",
        "BUSINESS"
      ],
      "url": "https://alaudinburki-scrapers.pages.dev/scrapers/fda-recall-monitor/",
      "apifyUrl": "https://apify.com/alaudinburki/fda-recall-monitor",
      "usage": {
        "runs": 18,
        "users": 2,
        "lastRun": "2026-10-16"
      },
      "outputSchema": [
        {
          "key": "matchedFirm",
          "type": "string",
          "nullable": true,
          "description": "Firm that matched.",
          "example": "<matchedFirm>"
        },
        {
          "key": "category",
          "type": "string",
          "nullable": true,
          "description": "Category this record belongs to, as classified upstream.",
          "example": "electronics"
        },
        {
          "key": "recallNumber",
          "type": "string",
          "nullable": true,
          "description": "Identifier of the recall.",
          "example": "2026-10432"
        },
        {
          "key": "status",
          "type": "string",
          "nullable": true,
          "description": "Outcome recorded for this row.",
          "example": "ok"
        },
        {
          "key": "classification",
          "type": "string",
          "nullable": true,
          "description": "Classification assigned by the source.",
          "example": "<classification>"
        },
        {
          "key": "classificationSeverity",
          "type": "integer",
          "nullable": true,
          "description": "Severity implied by the classification.",
          "example": "0"
        },
        {
          "key": "recallingFirm",
          "type": "string",
          "nullable": true,
          "description": "Firm that issued the recall.",
          "example": "<recallingFirm>"
        },
        {
          "key": "brandName",
          "type": "string",
          "nullable": true,
          "description": "Brand the product is sold under.",
          "example": "<brandName>"
        },
        {
          "key": "genericName",
          "type": "string",
          "nullable": true,
          "description": "Generic or non-proprietary name, where the source publishes one.",
          "example": "<genericName>"
        },
        {
          "key": "productDescription",
          "type": "string",
          "nullable": true,
          "description": "Product description as the merchant publishes it.",
          "example": "<productDescription>"
        },
        {
          "key": "reasonForRecall",
          "type": "string",
          "nullable": true,
          "description": "Stated reason for the recall.",
          "example": "<reasonForRecall>"
        },
        {
          "key": "productQuantity",
          "type": "string",
          "nullable": true,
          "description": "Quantity of the product.",
          "example": "<productQuantity>"
        },
        {
          "key": "distributionPattern",
          "type": "string",
          "nullable": true,
          "description": "How the matches are distributed across the results.",
          "example": "<distributionPattern>"
        },
        {
          "key": "voluntaryMandated",
          "type": "string",
          "nullable": true,
          "description": "Whether the action was voluntary or mandated.",
          "example": "<voluntaryMandated>"
        },
        {
          "key": "recallInitiationDate",
          "type": "string",
          "nullable": true,
          "description": "Date the recall process began.",
          "example": "<recallInitiationDate>"
        },
        {
          "key": "reportDate",
          "type": "string",
          "nullable": true,
          "description": "Date the report was issued.",
          "example": "2026-10-15"
        },
        {
          "key": "state",
          "type": "string",
          "nullable": true,
          "description": "State, province or region name.",
          "example": "active"
        },
        {
          "key": "verdict",
          "type": "string",
          "nullable": true,
          "description": "The Actor's conclusion for this row, stated in words.",
          "example": "pass"
        }
      ],
      "inputs": [
        {
          "key": "firms",
          "type": "array",
          "required": true,
          "secret": false,
          "description": "Manufacturer/firm names to watch, e.g. Pfizer, Medtronic. One firm per line."
        },
        {
          "key": "categories",
          "type": "array",
          "required": false,
          "secret": false,
          "description": "Which recall categories to check. Both by default."
        },
        {
          "key": "daysBack",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "How many days of recalls to check, up to 5 years."
        },
        {
          "key": "openFdaApiKey",
          "type": "string",
          "required": false,
          "secret": true,
          "description": "Secret — supply your own value."
        }
      ]
    },
    {
      "slug": "fec-campaign-monitor",
      "entry": "084",
      "title": "FEC Campaign Finance Monitor — Track Filings",
      "description": "Monitor official FEC committee filings by committee ID. Returns recently processed public filing records; does not collect contributor lists.",
      "categories": [
        "BUSINESS",
        "DEVELOPER_TOOLS"
      ],
      "url": "https://alaudinburki-scrapers.pages.dev/scrapers/fec-campaign-monitor/",
      "apifyUrl": "https://apify.com/alaudinburki/fec-campaign-monitor",
      "usage": {
        "runs": 18,
        "users": 2,
        "lastRun": "2026-10-16"
      },
      "outputSchema": [
        {
          "key": "committeeId",
          "type": "string",
          "nullable": false,
          "description": "The Federal Election Commission's identifier for the committee, which starts with C.",
          "example": "C00000001"
        },
        {
          "key": "committeeName",
          "type": "string",
          "nullable": false,
          "description": "Registered name of the committee.",
          "example": "Example for Congress"
        },
        {
          "key": "reportType",
          "type": "string",
          "nullable": false,
          "description": "Type of filing, e.g. F3 or F3A. The 'A' variants are amendments to an earlier filing, so counting originals and amendments together double-counts.",
          "example": "F3"
        },
        {
          "key": "coverageEndDate",
          "type": "string",
          "nullable": false,
          "description": "Last day the reporting period covers.",
          "example": "2026-09-30"
        },
        {
          "key": "filingDate",
          "type": "string",
          "nullable": false,
          "description": "Date the filing was received or processed, when published.",
          "example": "2026-10-15"
        },
        {
          "key": "totalReceipts",
          "type": "number",
          "nullable": false,
          "description": "Total receipts the committee reported for the period, in US DOLLARS.",
          "example": "125000.5"
        },
        {
          "key": "totalDisbursements",
          "type": "number",
          "nullable": false,
          "description": "Total disbursements the committee reported for the period, in US DOLLARS.",
          "example": "98000"
        },
        {
          "key": "cashOnHand",
          "type": "number",
          "nullable": false,
          "description": "Cash the committee reported on hand at the end of the period, in US DOLLARS.",
          "example": "420000"
        },
        {
          "key": "amendmentIndicator",
          "type": "string",
          "nullable": false,
          "description": "Whether this filing amends an earlier one. Only the latest amendment is current, so summing without checking this double-counts.",
          "example": "A"
        },
        {
          "key": "source",
          "type": "string",
          "nullable": false,
          "description": "Which upstream source produced this row.",
          "example": "example-source"
        }
      ],
      "inputs": [
        {
          "key": "apiKey",
          "type": "string",
          "required": false,
          "secret": true,
          "description": "Secret — supply your own value."
        },
        {
          "key": "committeeIds",
          "type": "array",
          "required": true,
          "secret": false,
          "description": "One or more FEC committee IDs, for example C00401224."
        },
        {
          "key": "perCommittee",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Maximum recent filings returned for each committee."
        }
      ]
    },
    {
      "slug": "insider-trading-monitor",
      "entry": "085",
      "title": "Insider Trading Monitor — SEC Form 4, Signal Only",
      "description": "Open-market insider purchases and sales for a company, from free official SEC Form 4 filings. Filters out routine RSU vesting and tax-withholding noise by default, leaving only voluntary trades an insider made with their own money.",
      "categories": [
        "DEVELOPER_TOOLS",
        "BUSINESS"
      ],
      "url": "https://alaudinburki-scrapers.pages.dev/scrapers/insider-trading-monitor/",
      "apifyUrl": "https://apify.com/alaudinburki/insider-trading-monitor",
      "usage": {
        "runs": 18,
        "users": 2,
        "lastRun": "2026-10-16"
      },
      "outputSchema": [
        {
          "key": "queriedAs",
          "type": "string",
          "nullable": true,
          "description": "The query exactly as it was sent to the source.",
          "example": "\"amazon product scraper\""
        },
        {
          "key": "issuerTicker",
          "type": "string",
          "nullable": true,
          "description": "Ticker of the issuing company.",
          "example": "<issuerTicker>"
        },
        {
          "key": "issuerName",
          "type": "string",
          "nullable": true,
          "description": "Registered name of the issuer.",
          "example": "<issuerName>"
        },
        {
          "key": "ownerName",
          "type": "string",
          "nullable": true,
          "description": "Name of the owner or maintainer.",
          "example": "<ownerName>"
        },
        {
          "key": "officerTitle",
          "type": "string",
          "nullable": true,
          "description": "Title the officer holds.",
          "example": "<officerTitle>"
        },
        {
          "key": "isDirector",
          "type": "boolean",
          "nullable": true,
          "description": "Whether the person is a director of the company.",
          "example": "true"
        },
        {
          "key": "isOfficer",
          "type": "boolean",
          "nullable": true,
          "description": "Whether the person is an officer of the company.",
          "example": "true"
        },
        {
          "key": "isTenPercentOwner",
          "type": "boolean",
          "nullable": true,
          "description": "Whether the person holds ten percent or more of the company.",
          "example": "true"
        },
        {
          "key": "filingDate",
          "type": "string",
          "nullable": true,
          "description": "Date the filing was received or processed, when published.",
          "example": "2026-09-03T00:00:00"
        },
        {
          "key": "kind",
          "type": "string",
          "nullable": true,
          "description": "Kind of this record.",
          "example": "<kind>"
        },
        {
          "key": "securityTitle",
          "type": "string",
          "nullable": true,
          "description": "Short title for the security finding.",
          "example": "<securityTitle>"
        },
        {
          "key": "transactionDate",
          "type": "string",
          "nullable": true,
          "description": "Date the transaction took place.",
          "example": "<transactionDate>"
        },
        {
          "key": "transactionCode",
          "type": "string",
          "nullable": true,
          "description": "Code identifying the transaction type.",
          "example": "<transactionCode>"
        },
        {
          "key": "transactionCodeLabel",
          "type": "string",
          "nullable": true,
          "description": "Human-readable label for the transaction code.",
          "example": "<transactionCodeLabel>"
        },
        {
          "key": "shares",
          "type": "number",
          "nullable": true,
          "description": "Number of shares involved in the transaction.",
          "example": "0"
        },
        {
          "key": "pricePerShare",
          "type": "number",
          "nullable": true,
          "description": "Price per share, in the stated currency.",
          "example": "0"
        },
        {
          "key": "estimatedValue",
          "type": "number",
          "nullable": true,
          "description": "Estimated monetary value of this item.",
          "example": "0"
        },
        {
          "key": "acquiredOrDisposed",
          "type": "string",
          "nullable": true,
          "description": "Whether the person acquired or disposed of shares.",
          "example": "<acquiredOrDisposed>"
        },
        {
          "key": "sharesOwnedAfter",
          "type": "number",
          "nullable": true,
          "description": "Number of shares held after the reported transaction.",
          "example": "0"
        },
        {
          "key": "isSignal",
          "type": "boolean",
          "nullable": true,
          "description": "Whether this row counts as a genuine signal rather than baseline noise.",
          "example": "true"
        },
        {
          "key": "status",
          "type": "string",
          "nullable": true,
          "description": "Outcome recorded for this row.",
          "example": "ok"
        },
        {
          "key": "verdict",
          "type": "string",
          "nullable": true,
          "description": "The Actor's conclusion for this row, stated in words.",
          "example": "pass"
        }
      ],
      "inputs": [
        {
          "key": "companies",
          "type": "array",
          "required": true,
          "secret": false,
          "description": "Tickers or company names, e.g. AAPL, Tesla. Resolved against SEC's own ticker list."
        },
        {
          "key": "signalOnly",
          "type": "boolean",
          "required": false,
          "secret": false,
          "description": "When on (default), returns only open-market purchases/sales (codes P/S) — an insider voluntarily trading with their own money. Turn off to include routine RSU vesting, option exercises, and tax withholding too."
        },
        {
          "key": "filingsPerCompany",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "How many recent Form 4 filings to check per company."
        }
      ]
    },
    {
      "slug": "jev-agent-trace-evaluator",
      "entry": "086",
      "title": "Jev AI Agent Trace Evaluator — Score LLM Traces",
      "description": "Evaluate supplied AI-agent traces for evidence support, tool relevance, and review need using a TypeSafe Jev key. It never executes tools.",
      "categories": [
        "AI",
        "DEVELOPER_TOOLS"
      ],
      "url": "https://alaudinburki-scrapers.pages.dev/scrapers/jev-agent-trace-evaluator/",
      "apifyUrl": "https://apify.com/alaudinburki/jev-agent-trace-evaluator",
      "usage": {
        "runs": 18,
        "users": 2,
        "lastRun": "2026-10-15"
      },
      "outputSchema": [
        {
          "key": "state",
          "type": "string",
          "nullable": true,
          "description": "Current state of this record in its own lifecycle.",
          "example": ""
        },
        {
          "key": "questions",
          "type": "object",
          "nullable": true,
          "description": "Questions as recorded for this row.",
          "example": ""
        },
        {
          "key": "index",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Position of this row within the run.",
          "example": "1"
        },
        {
          "key": "sourceId",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Identifier of the input record this row came from.",
          "example": "rec_01"
        },
        {
          "key": "trace",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Trace as recorded for this row.",
          "example": "[]"
        },
        {
          "key": "evidenceSupport",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Evidence Support as recorded for this row.",
          "example": "[]"
        },
        {
          "key": "toolRelevance",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Tool Relevance as recorded for this row.",
          "example": "[]"
        },
        {
          "key": "humanReviewProbability",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Human Review Probability as recorded for this row.",
          "example": "[]"
        },
        {
          "key": "status",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Outcome recorded for this row.",
          "example": "ok"
        },
        {
          "key": "minConfidence",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Min Confidence as recorded for this row.",
          "example": "[]"
        },
        {
          "key": "judgments",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "The full structured judgement returned by the model.",
          "example": "{\"stance\":{\"choice\":\"recommended\"}}"
        },
        {
          "key": "model",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Identifier of the model that produced the judgement.",
          "example": "jev-latest"
        }
      ],
      "inputs": [
        {
          "key": "records",
          "type": "array",
          "required": true,
          "secret": false,
          "description": "Rows with request, tool result, and final answer context."
        },
        {
          "key": "typesafeApiKey",
          "type": "string",
          "required": false,
          "secret": true,
          "description": "Secret — supply your own value."
        },
        {
          "key": "maxItems",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Hard cap on processed trace rows."
        }
      ]
    },
    {
      "slug": "jev-lead-qualification-scorer",
      "entry": "087",
      "title": "Jev Lead Qualification Scorer — B2B Lead Scoring",
      "description": "Score supplied leads against a buyer-provided ideal-customer profile using a TypeSafe Jev key. It never writes to a CRM.",
      "categories": [
        "AI",
        "LEAD_GENERATION"
      ],
      "url": "https://alaudinburki-scrapers.pages.dev/scrapers/jev-lead-qualification-scorer/",
      "apifyUrl": "https://apify.com/alaudinburki/jev-lead-qualification-scorer",
      "usage": {
        "runs": 18,
        "users": 2,
        "lastRun": "2026-10-15"
      },
      "outputSchema": [
        {
          "key": "state",
          "type": "string",
          "nullable": true,
          "description": "Current state of this record in its own lifecycle.",
          "example": ""
        },
        {
          "key": "questions",
          "type": "object",
          "nullable": true,
          "description": "Questions as recorded for this row.",
          "example": ""
        },
        {
          "key": "index",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Position of this row within the run.",
          "example": "1"
        },
        {
          "key": "sourceId",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Identifier of the input record this row came from.",
          "example": "rec_01"
        },
        {
          "key": "lead",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Lead as recorded for this row.",
          "example": "[]"
        },
        {
          "key": "fit",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Fit as recorded for this row.",
          "example": "[]"
        },
        {
          "key": "priority",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Priority assigned to this row.",
          "example": "[]"
        },
        {
          "key": "missingContextProbability",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Missing Context Probability as recorded for this row.",
          "example": "[]"
        },
        {
          "key": "status",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Outcome recorded for this row.",
          "example": "ok"
        },
        {
          "key": "minConfidence",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Min Confidence as recorded for this row.",
          "example": "[]"
        },
        {
          "key": "judgments",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "The full structured judgement returned by the model.",
          "example": "{\"stance\":{\"choice\":\"recommended\"}}"
        },
        {
          "key": "model",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Identifier of the model that produced the judgement.",
          "example": "jev-latest"
        }
      ],
      "inputs": [
        {
          "key": "icp",
          "type": "string",
          "required": true,
          "secret": false,
          "description": "Buyer-defined criteria for a qualified lead."
        },
        {
          "key": "records",
          "type": "array",
          "required": true,
          "secret": false,
          "description": "Rows containing supplied lead context."
        },
        {
          "key": "typesafeApiKey",
          "type": "string",
          "required": false,
          "secret": true,
          "description": "Secret — supply your own value."
        },
        {
          "key": "maxItems",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Hard cap on processed lead rows."
        }
      ]
    },
    {
      "slug": "bls-economic-monitor",
      "entry": "088",
      "title": "BLS Economic Data Monitor — Jobs, Wages & CPI",
      "description": "Track official U.S. Bureau of Labor Statistics time series such as local unemployment, employment and CPI. Returns the latest observation and a change over the selected period.",
      "categories": [
        "BUSINESS",
        "DEVELOPER_TOOLS"
      ],
      "url": "https://alaudinburki-scrapers.pages.dev/scrapers/bls-economic-monitor/",
      "apifyUrl": "https://apify.com/alaudinburki/bls-economic-monitor",
      "usage": {
        "runs": 16,
        "users": 2,
        "lastRun": "2026-10-15"
      },
      "outputSchema": [
        {
          "key": "seriesId",
          "type": "string",
          "nullable": false,
          "description": "The source's identifier for the time series. The key that groups the observations.",
          "example": "LEU0254555900"
        },
        {
          "key": "year",
          "type": "number",
          "nullable": false,
          "description": "Calendar year the record refers to.",
          "example": "1"
        },
        {
          "key": "period",
          "type": "string",
          "nullable": false,
          "description": "Period the figure covers, as the source writes it.",
          "example": "M09"
        },
        {
          "key": "periodName",
          "type": "string",
          "nullable": false,
          "description": "Human-readable name of the period, e.g. 'September 2026'. The readable form of `period`, which is the code.",
          "example": "September 2026"
        },
        {
          "key": "value",
          "type": "number",
          "nullable": false,
          "description": "The measured value for this row. Units are in the README and sometimes in a sibling field.",
          "example": "42.5"
        },
        {
          "key": "latest",
          "type": "boolean",
          "nullable": false,
          "description": "Whether the source marks this observation as the most recent in the series.",
          "example": "true"
        },
        {
          "key": "footnotes",
          "type": "string",
          "nullable": false,
          "description": "Footnotes the source attaches to the observation, joined into one string. The source's words, not this Actor's commentary.",
          "example": "Data are preliminary."
        },
        {
          "key": "changeFromPrevious",
          "type": "number",
          "nullable": false,
          "description": "Change in `value` from the previous observation in the SAME series, derived by this Actor. Null for the first observation, which has no previous — not zero.",
          "example": "-0.2"
        }
      ],
      "inputs": [
        {
          "key": "seriesIds",
          "type": "array",
          "required": true,
          "secret": false,
          "description": "One or more uppercase BLS IDs, e.g. LAUCN040010000000005 for a local unemployment series."
        },
        {
          "key": "startYear",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "First calendar year to retrieve."
        },
        {
          "key": "endYear",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Last calendar year to retrieve."
        },
        {
          "key": "maxItems",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Hard cap on returned observations."
        }
      ]
    },
    {
      "slug": "jev-support-inbox-router",
      "entry": "089",
      "title": "Jev Support Inbox Router — Classify Support Tickets",
      "description": "Route supplied support tickets to a fixed queue with urgency and review signals using a buyer-provided TypeSafe Jev key.",
      "categories": [
        "AI",
        "BUSINESS"
      ],
      "url": "https://alaudinburki-scrapers.pages.dev/scrapers/jev-support-inbox-router/",
      "apifyUrl": "https://apify.com/alaudinburki/jev-support-inbox-router",
      "usage": {
        "runs": 16,
        "users": 2,
        "lastRun": "2026-10-15"
      },
      "outputSchema": [
        {
          "key": "state",
          "type": "string",
          "nullable": true,
          "description": "Current state of this record in its own lifecycle.",
          "example": ""
        },
        {
          "key": "questions",
          "type": "object",
          "nullable": true,
          "description": "Questions as recorded for this row.",
          "example": ""
        },
        {
          "key": "index",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Position of this row within the run.",
          "example": "1"
        },
        {
          "key": "sourceId",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Identifier of the input record this row came from.",
          "example": "rec_01"
        },
        {
          "key": "ticket",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Ticket as recorded for this row.",
          "example": "[]"
        },
        {
          "key": "queue",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Queue as recorded for this row.",
          "example": "[]"
        },
        {
          "key": "urgency",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "How urgent this row is, in words.",
          "example": "[]"
        },
        {
          "key": "humanReviewProbability",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Human Review Probability as recorded for this row.",
          "example": "[]"
        },
        {
          "key": "status",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Outcome recorded for this row.",
          "example": "ok"
        },
        {
          "key": "minConfidence",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Min Confidence as recorded for this row.",
          "example": "[]"
        },
        {
          "key": "judgments",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "The full structured judgement returned by the model.",
          "example": "{\"stance\":{\"choice\":\"recommended\"}}"
        },
        {
          "key": "model",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Identifier of the model that produced the judgement.",
          "example": "jev-latest"
        }
      ],
      "inputs": [
        {
          "key": "records",
          "type": "array",
          "required": true,
          "secret": false,
          "description": "Rows containing ticket text and an optional source ID."
        },
        {
          "key": "typesafeApiKey",
          "type": "string",
          "required": false,
          "secret": true,
          "description": "Secret — supply your own value."
        },
        {
          "key": "maxItems",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Hard cap on processed ticket rows."
        }
      ]
    },
    {
      "slug": "dataset-webhook-notifier",
      "entry": "090",
      "title": "Dataset Webhook Notifier — Slack, Discord, Generic",
      "description": "Send an Apify dataset to a webhook — auto-formatted for Slack, Discord, or a generic JSON endpoint, respecting each platform's size limits. The last mile of any pipeline, with per-batch delivery reporting.",
      "categories": [
        "INTEGRATIONS",
        "AUTOMATION"
      ],
      "url": "https://alaudinburki-scrapers.pages.dev/scrapers/dataset-webhook-notifier/",
      "apifyUrl": "https://apify.com/alaudinburki/dataset-webhook-notifier",
      "usage": {
        "runs": 13,
        "users": 1,
        "lastRun": "2026-10-16"
      },
      "outputSchema": [
        {
          "key": "batch",
          "type": "integer",
          "nullable": true,
          "description": "Which batch of the run produced this row. Batches are processed in order.",
          "example": "0"
        },
        {
          "key": "rows",
          "type": "integer",
          "nullable": true,
          "description": "The rows this record carries.",
          "example": "[{\"column\":\"value\",\"column2\":123}]"
        },
        {
          "key": "target",
          "type": "string",
          "nullable": true,
          "description": "The target this row refers to.",
          "example": "https://example.com/pricing"
        },
        {
          "key": "status",
          "type": "string",
          "nullable": true,
          "description": "Outcome of this delivery — sent, blocked, or null when it was not attempted.",
          "example": "ok"
        },
        {
          "key": "ok",
          "type": "boolean",
          "nullable": true,
          "description": "Whether this row was retrieved successfully.",
          "example": "true"
        },
        {
          "key": "error",
          "type": "string",
          "nullable": true,
          "description": "Why this row failed, when it did. Null on success.",
          "example": "<error>"
        }
      ],
      "inputs": [
        {
          "key": "webhookUrl",
          "type": "string",
          "required": false,
          "secret": true,
          "description": "Secret — supply your own value."
        },
        {
          "key": "target",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "auto detects from the URL. Or force slack / discord / generic."
        },
        {
          "key": "mode",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "summary = one line about the dataset; rows = a line per row (capped)."
        },
        {
          "key": "label",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "Name shown in the message, e.g. 'New leads'."
        },
        {
          "key": "maxRows",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "In rows mode, how many rows to list before summarizing the rest."
        },
        {
          "key": "datasetId",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "The Apify dataset to send (e.g. a scraper run's defaultDatasetId)."
        },
        {
          "key": "items",
          "type": "array",
          "required": false,
          "secret": false,
          "description": "Rows to send directly."
        },
        {
          "key": "batchSize",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "For generic JSON endpoints, POST this many rows per request. Chat targets always send one message."
        }
      ]
    },
    {
      "slug": "jev-review-intelligence-pro",
      "entry": "091",
      "title": "Jev Review Intelligence Pro — Advanced Classifier",
      "description": "Enrich supplied review records with typed themes, severity, refund intent, and actionable-detail judgments.",
      "categories": [
        "AI",
        "BUSINESS"
      ],
      "url": "https://alaudinburki-scrapers.pages.dev/scrapers/jev-review-intelligence-pro/",
      "apifyUrl": "https://apify.com/alaudinburki/jev-review-intelligence-pro",
      "usage": {
        "runs": 7,
        "users": 2,
        "lastRun": "2026-10-15"
      },
      "outputSchema": [
        {
          "key": "id",
          "type": "string",
          "nullable": false,
          "description": "Stable identifier from the source. Use it to link records across runs.",
          "example": "EXAMPLE-0001"
        },
        {
          "key": "sourceUrl",
          "type": "string",
          "nullable": false,
          "description": "The page or endpoint this row was read from.",
          "example": "https://example.com/thread"
        },
        {
          "key": "capturedAt",
          "type": "string",
          "nullable": false,
          "description": "ISO 8601 timestamp of when this record was captured or archived.",
          "example": "2026-10-18T07:30:00Z"
        },
        {
          "key": "rating",
          "type": "number",
          "nullable": false,
          "description": "Average rating as reported by the source.",
          "example": "4"
        },
        {
          "key": "text",
          "type": "string",
          "nullable": false,
          "description": "Plain text content of this record.",
          "example": "The item's text, as its author wrote it."
        },
        {
          "key": "judgments",
          "type": "object",
          "nullable": false,
          "description": "The model's structured answers. **Null when the judgement call failed**, so it must be null-checked before it is read.",
          "example": "{\"preferred_entity\":{\"choice\":\"brand\",\"confidence\":0.91}}"
        },
        {
          "key": "decision",
          "type": "object",
          "nullable": false,
          "description": "The classified decision, with a status and the reason for it. On a failed call the status is 'failed' and the answers are null.",
          "example": "{\"status\":\"clear\",\"preferredEntity\":\"Example Brand\",\"confidence\":0.91,\"reason\":\"Named first and unambiguously.\"}"
        },
        {
          "key": "telemetry",
          "type": "object",
          "nullable": false,
          "description": "What the call cost and how it went — model, latency, attempts and estimated cost. Null when no call succeeded.",
          "example": "{\"provider\":\"typesafe\",\"model\":\"example-model\",\"templateId\":\"tpl-1\",\"latencyMs\":1840,\"attempts\":1,\"inputTokens\":820,\"outputTokens\":96,\"estimatedCostUsd\":0.00004}"
        }
      ],
      "inputs": [
        {
          "key": "reviews",
          "type": "array",
          "required": true,
          "secret": false,
          "description": "Already-collected reviews. Collection permission remains the caller's responsibility."
        },
        {
          "key": "typesafeApiKey",
          "type": "string",
          "required": false,
          "secret": true,
          "description": "Secret — supply your own value."
        },
        {
          "key": "provider",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "Use fake only for contract testing."
        },
        {
          "key": "confidenceThreshold",
          "type": "number",
          "required": false,
          "secret": false,
          "description": "Minimum confidence required before a result is accepted rather than marked for review."
        }
      ]
    },
    {
      "slug": "mcp-server-registry",
      "entry": "092",
      "title": "MCP Server Registry — Health & Trust Scores",
      "description": "Catalog Model Context Protocol servers and get the answer you need before wiring one into an agent: is it maintained, what transport does it speak, how do you install it, and should you trust it. Maintenance health, abandonment risk and a 0-100 trust score. Free GitHub API.",
      "categories": [
        "MCP_SERVERS",
        "DEVELOPER_TOOLS"
      ],
      "url": "https://alaudinburki-scrapers.pages.dev/scrapers/mcp-server-registry/",
      "apifyUrl": "https://apify.com/alaudinburki/mcp-server-registry",
      "usage": {
        "runs": 7,
        "users": 1,
        "lastRun": "2026-10-16"
      },
      "outputSchema": [
        {
          "key": "fullName",
          "type": "string",
          "nullable": true,
          "description": "Full personal or entity name as published.",
          "example": "Jane Cooper"
        },
        {
          "key": "trustScore",
          "type": "integer",
          "nullable": true,
          "description": "Trust score, from 0 to 100. Higher is more trustworthy.",
          "example": "0"
        },
        {
          "key": "maintenanceHealth",
          "type": "integer",
          "nullable": true,
          "description": "Maintenance health on a 0-100 scale.",
          "example": "74"
        },
        {
          "key": "abandonmentRisk",
          "type": "string",
          "nullable": true,
          "description": "How likely this project is to be abandoned, in words.",
          "example": "low"
        },
        {
          "key": "daysSincePush",
          "type": "integer",
          "nullable": true,
          "description": "Days since the last commit was pushed.",
          "example": "12"
        },
        {
          "key": "transport",
          "type": "string",
          "nullable": true,
          "description": "How the connection was made, for example tls or tcp.",
          "example": "<transport>"
        },
        {
          "key": "installMethod",
          "type": "string",
          "nullable": true,
          "description": "How the package is installed.",
          "example": "<installMethod>"
        },
        {
          "key": "language",
          "type": "string",
          "nullable": true,
          "description": "Language code for this record's text.",
          "example": "en"
        },
        {
          "key": "stars",
          "type": "integer",
          "nullable": true,
          "description": "Number of stars recorded upstream.",
          "example": "131"
        },
        {
          "key": "forks",
          "type": "integer",
          "nullable": true,
          "description": "Number of forks recorded upstream.",
          "example": "27"
        },
        {
          "key": "license",
          "type": "string",
          "nullable": true,
          "description": "Licence or registration the record holds.",
          "example": "MIT"
        },
        {
          "key": "description",
          "type": "string",
          "nullable": true,
          "description": "Description of this record, as published by the source.",
          "example": "<description>"
        },
        {
          "key": "topics",
          "type": "string",
          "nullable": true,
          "description": "Topics this record is about.",
          "example": "[\"pricing\",\"shipping\",\"returns\"]"
        },
        {
          "key": "url",
          "type": "string",
          "nullable": true,
          "description": "The URL this row describes.",
          "example": "https://example.com/pricing"
        },
        {
          "key": "archived",
          "type": "boolean",
          "nullable": true,
          "description": "Whether the source has archived this item.",
          "example": "true"
        },
        {
          "key": "status",
          "type": "string",
          "nullable": true,
          "description": "Outcome recorded for this row.",
          "example": "ok"
        }
      ],
      "inputs": [
        {
          "key": "topics",
          "type": "array",
          "required": false,
          "secret": false,
          "description": "Leave empty to use the standard MCP topics (mcp-server, model-context-protocol, mcp, modelcontextprotocol)."
        },
        {
          "key": "githubToken",
          "type": "string",
          "required": false,
          "secret": true,
          "description": "Secret — supply your own value."
        },
        {
          "key": "activeOnly",
          "type": "boolean",
          "required": false,
          "secret": false,
          "description": "Keep only servers pushed recently enough to score as 'active' — the ones safe to depend on."
        },
        {
          "key": "minTrustScore",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Filter out low-confidence servers. Trust weights maintenance over popularity."
        },
        {
          "key": "minStars",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Skip servers below this star count."
        },
        {
          "key": "includeArchived",
          "type": "boolean",
          "required": false,
          "secret": false,
          "description": "Archived servers are dead by definition; off by default."
        },
        {
          "key": "maxPages",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "100 servers per page. 2 pages per topic is a good default."
        },
        {
          "key": "maxItems",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Hard limit, strictly enforced."
        }
      ]
    },
    {
      "slug": "jev-aeo-geo-visibility",
      "entry": "093",
      "title": "Jev AEO & GEO Visibility Enricher — AI Search",
      "description": "Enrich supplied answer-engine responses with brand stance and recommendation judgments.",
      "categories": [
        "AI",
        "MARKETING"
      ],
      "url": "https://alaudinburki-scrapers.pages.dev/scrapers/jev-aeo-geo-visibility/",
      "apifyUrl": "https://apify.com/alaudinburki/jev-aeo-geo-visibility",
      "usage": {
        "runs": 6,
        "users": 2,
        "lastRun": "2026-10-15"
      },
      "outputSchema": [
        {
          "key": "id",
          "type": "string",
          "nullable": false,
          "description": "Stable identifier from the source. Use it to link records across runs.",
          "example": "EXAMPLE-0001"
        },
        {
          "key": "prompt",
          "type": "string",
          "nullable": false,
          "description": "The prompt this record resulted from.",
          "example": "Which CRM do you recommend for a small team?"
        },
        {
          "key": "engine",
          "type": "string",
          "nullable": false,
          "description": "Engine that produced this result.",
          "example": "chatgpt"
        },
        {
          "key": "answer",
          "type": "string",
          "nullable": false,
          "description": "The answer produced for the paired question.",
          "example": "The answer text, exactly as captured. The evidence the judgement was made on."
        },
        {
          "key": "sourceUrl",
          "type": "string",
          "nullable": false,
          "description": "The page or endpoint this row was read from.",
          "example": "https://example.com/thread"
        },
        {
          "key": "capturedAt",
          "type": "string",
          "nullable": false,
          "description": "ISO 8601 timestamp of when this record was captured or archived.",
          "example": "2026-10-18T07:30:00Z"
        },
        {
          "key": "deterministic",
          "type": "object",
          "nullable": false,
          "description": "Evidence computed from the text itself without a model — which entities are named and how often. The check on the model's judgement, and it is still available when the judgement call fails.",
          "example": "{\"brandMentions\":3,\"competitorsNamed\":[\"Northwind\"],\"evidence\":\"The brand is named three times, first.\"}"
        },
        {
          "key": "judgments",
          "type": "object",
          "nullable": false,
          "description": "The model's structured answers. **Null when the judgement call failed**, so it must be null-checked before it is read.",
          "example": "{\"preferred_entity\":{\"choice\":\"brand\",\"confidence\":0.91}}"
        },
        {
          "key": "preferredEntity",
          "type": "string",
          "nullable": false,
          "description": "Which entity the answer treats as preferred, resolved back to a name. Null where the answer names none clearly.",
          "example": "Example Brand"
        },
        {
          "key": "decision",
          "type": "object",
          "nullable": false,
          "description": "The classified decision, with a status and the reason for it. On a failed call the status is 'failed' and the answers are null.",
          "example": "{\"status\":\"clear\",\"preferredEntity\":\"Example Brand\",\"confidence\":0.91,\"reason\":\"Named first and unambiguously.\"}"
        },
        {
          "key": "telemetry",
          "type": "object",
          "nullable": false,
          "description": "What the call cost and how it went — model, latency, attempts and estimated cost. Null when no call succeeded.",
          "example": "{\"provider\":\"typesafe\",\"model\":\"example-model\",\"templateId\":\"tpl-1\",\"latencyMs\":1840,\"attempts\":1,\"inputTokens\":820,\"outputTokens\":96,\"estimatedCostUsd\":0.00004}"
        }
      ],
      "inputs": [
        {
          "key": "brand",
          "type": "string",
          "required": true,
          "secret": false,
          "description": "Tracked brand name."
        },
        {
          "key": "aliases",
          "type": "array",
          "required": false,
          "secret": false,
          "description": "Alternative names for the tracked brand."
        },
        {
          "key": "competitors",
          "type": "array",
          "required": false,
          "secret": false,
          "description": "Named competitors to compare only in supplied answers."
        },
        {
          "key": "responses",
          "type": "array",
          "required": true,
          "secret": false,
          "description": "Answers already collected from an approved source; this Actor does not query answer engines."
        },
        {
          "key": "typesafeApiKey",
          "type": "string",
          "required": false,
          "secret": true,
          "description": "Secret — supply your own value."
        },
        {
          "key": "provider",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "Use fake only for contract tests; typesafe performs live Jev judgments."
        },
        {
          "key": "confidenceThreshold",
          "type": "number",
          "required": false,
          "secret": false,
          "description": "Minimum confidence required before a result is accepted rather than marked for review."
        }
      ]
    },
    {
      "slug": "product-hunt-scraper",
      "entry": "094",
      "title": "Product Hunt Scraper — Official API, No Broken Runs",
      "description": "Fetch Product Hunt launches (votes, comments, makers, topics, ratings) via the official GraphQL API instead of scraping the site — so runs don't fail the way HTML scrapers do. Bring your own free developer token.",
      "categories": [
        "BUSINESS",
        "DEVELOPER_TOOLS"
      ],
      "url": "https://alaudinburki-scrapers.pages.dev/scrapers/product-hunt-scraper/",
      "apifyUrl": "https://apify.com/alaudinburki/product-hunt-scraper",
      "usage": {
        "runs": 6,
        "users": 2,
        "lastRun": "2026-10-16"
      },
      "outputSchema": [
        {
          "key": "name",
          "type": "string",
          "nullable": true,
          "description": "Display name as the source writes it.",
          "example": "Bitcoin"
        },
        {
          "key": "tagline",
          "type": "string",
          "nullable": true,
          "description": "Short descriptive line published with the record.",
          "example": "<tagline>"
        },
        {
          "key": "votes",
          "type": "integer",
          "nullable": true,
          "description": "Number of votes recorded upstream.",
          "example": "128"
        },
        {
          "key": "comments",
          "type": "integer",
          "nullable": true,
          "description": "Number of comments recorded upstream.",
          "example": "24"
        },
        {
          "key": "reviews",
          "type": "integer",
          "nullable": true,
          "description": "Number of reviews recorded upstream.",
          "example": "0"
        },
        {
          "key": "topics",
          "type": "string",
          "nullable": true,
          "description": "Topics this record is about.",
          "example": "[\"pricing\",\"shipping\",\"returns\"]"
        },
        {
          "key": "makers",
          "type": "string",
          "nullable": true,
          "description": "Makers credited for this product.",
          "example": "<makers>"
        },
        {
          "key": "productHuntUrl",
          "type": "string",
          "nullable": true,
          "description": "Link to this product on Product Hunt.",
          "example": "<productHuntUrl>"
        }
      ],
      "inputs": [
        {
          "key": "developerToken",
          "type": "string",
          "required": false,
          "secret": true,
          "description": "Secret — supply your own value."
        },
        {
          "key": "order",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "How Product Hunt orders results before paging: RANKING (daily rank), NEWEST, VOTES, or FEATURED_AT."
        },
        {
          "key": "topic",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "Limit to one Product Hunt topic, e.g. artificial-intelligence, developer-tools, saas. Leave empty for all topics."
        },
        {
          "key": "postedAfter",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "Only launches on/after this date (YYYY-MM-DD). Leave empty for no lower bound."
        },
        {
          "key": "postedBefore",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "Only launches on/before this date (YYYY-MM-DD). Leave empty for no upper bound."
        },
        {
          "key": "maxItems",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Hard limit on returned launches. Strictly enforced — you will never be charged for more than this."
        }
      ]
    },
    {
      "slug": "dataset-to-airtable",
      "entry": "095",
      "title": "Dataset to Airtable — Reliable Field Mapping",
      "description": "Export any Apify dataset into an Airtable table, mapping each field to the correct field type — with a per-item report of what mapped and what was skipped. Batched, rate-limit aware, no silent data loss.",
      "categories": [
        "INTEGRATIONS",
        "AUTOMATION"
      ],
      "url": "https://alaudinburki-scrapers.pages.dev/scrapers/dataset-to-airtable/",
      "apifyUrl": "https://apify.com/alaudinburki/dataset-to-airtable",
      "usage": {
        "runs": 5,
        "users": 1,
        "lastRun": "2026-10-16"
      },
      "outputSchema": [
        {
          "key": "itemIndex",
          "type": "number",
          "nullable": true,
          "description": "Zero-based position of this item within its parent list.",
          "example": "0"
        },
        {
          "key": "status",
          "type": "string",
          "nullable": true,
          "description": "Outcome recorded for this row.",
          "example": "ok"
        },
        {
          "key": "airtableRecordId",
          "type": "string",
          "nullable": true,
          "description": "Airtable record identifier.",
          "example": "<airtableRecordId>"
        },
        {
          "key": "mappedFields",
          "type": "string",
          "nullable": true,
          "description": "Fields that were mapped to the destination.",
          "example": "[\"title\",\"price\",\"sku\"]"
        },
        {
          "key": "skippedFields",
          "type": "string",
          "nullable": true,
          "description": "Fields that were not mapped to the destination.",
          "example": "[\"internalId\"]"
        },
        {
          "key": "mappedCount",
          "type": "integer",
          "nullable": true,
          "description": "How many fields were mapped.",
          "example": "3"
        },
        {
          "key": "skippedCount",
          "type": "integer",
          "nullable": true,
          "description": "How many fields were skipped.",
          "example": "1"
        }
      ],
      "inputs": [
        {
          "key": "apiToken",
          "type": "string",
          "required": false,
          "secret": true,
          "description": "Secret — supply your own value."
        },
        {
          "key": "baseId",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "The Airtable base ID (appXXXXXXXXXXXXXX), from your base URL."
        },
        {
          "key": "tableName",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "The target table's name (e.g. 'Leads') or its table ID (tblXXXXXXXX)."
        },
        {
          "key": "datasetId",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "The Apify dataset to export (e.g. a scraper run's defaultDatasetId). Leave empty to use inline items."
        },
        {
          "key": "items",
          "type": "array",
          "required": false,
          "secret": false,
          "description": "Rows to export if you have no dataset ID. Each object becomes one Airtable record."
        },
        {
          "key": "fieldMapping",
          "type": "object",
          "required": false,
          "secret": false,
          "description": "Map dataset fields to Airtable field names, e.g. {\"soldPrice\": \"Price\"}. Unmapped fields auto-match by name (case-insensitive)."
        },
        {
          "key": "maxItems",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Cap on how many dataset items to write. Leave empty to export all."
        }
      ]
    },
    {
      "slug": "dataset-to-google-sheets",
      "entry": "096",
      "title": "Dataset to Google Sheets — Reliable Export",
      "description": "Append any Apify dataset to a Google Sheet via a service account, with a stable header, column union across ragged rows, and flattened nested values. Honest errors (e.g. share-the-sheet reminder). Pure logic.",
      "categories": [
        "INTEGRATIONS",
        "AUTOMATION"
      ],
      "url": "https://alaudinburki-scrapers.pages.dev/scrapers/dataset-to-google-sheets/",
      "apifyUrl": "https://apify.com/alaudinburki/dataset-to-google-sheets",
      "usage": {
        "runs": 5,
        "users": 2,
        "lastRun": "2026-10-15"
      },
      "outputSchema": [
        {
          "key": "status",
          "type": "string",
          "nullable": true,
          "description": "Outcome recorded for this row.",
          "example": "ok"
        },
        {
          "key": "spreadsheetId",
          "type": "string",
          "nullable": true,
          "description": "Identifier of the spreadsheet.",
          "example": "<spreadsheetId>"
        },
        {
          "key": "sheet",
          "type": "string",
          "nullable": true,
          "description": "Sheet this row came from.",
          "example": "<sheet>"
        },
        {
          "key": "rowsWritten",
          "type": "integer",
          "nullable": true,
          "description": "Total rows written to the destination.",
          "example": "0"
        },
        {
          "key": "columns",
          "type": "integer",
          "nullable": true,
          "description": "The columns this record carries.",
          "example": "0"
        },
        {
          "key": "headerIncluded",
          "type": "boolean",
          "nullable": true,
          "description": "Whether the header is present at all.",
          "example": "true"
        },
        {
          "key": "rowsUpdated",
          "type": "integer",
          "nullable": true,
          "description": "Rows updated in the destination because they already existed.",
          "example": "0"
        },
        {
          "key": "rowsAppended",
          "type": "integer",
          "nullable": true,
          "description": "Rows appended to the destination because they were new.",
          "example": "0"
        },
        {
          "key": "upsertKey",
          "type": "string",
          "nullable": true,
          "description": "Field used to decide whether a row is new or an update.",
          "example": "<upsertKey>"
        },
        {
          "key": "existingHeaderReused",
          "type": "boolean",
          "nullable": true,
          "description": "Whether an existing header already covers this requirement.",
          "example": "true"
        },
        {
          "key": "headerExtended",
          "type": "boolean",
          "nullable": true,
          "description": "Whether the header's value exceeds the recommended setting.",
          "example": "true"
        }
      ],
      "inputs": [
        {
          "key": "serviceAccountJson",
          "type": "object",
          "required": false,
          "secret": true,
          "description": "Secret — supply your own value."
        },
        {
          "key": "spreadsheetId",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "The Google Sheet to append to — paste its URL or ID."
        },
        {
          "key": "sheetName",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "The tab to append to (default Sheet1)."
        },
        {
          "key": "datasetId",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "The Apify dataset to export (e.g. a scraper run's defaultDatasetId)."
        },
        {
          "key": "items",
          "type": "array",
          "required": false,
          "secret": false,
          "description": "Rows to export directly."
        },
        {
          "key": "includeHeader",
          "type": "boolean",
          "required": false,
          "secret": false,
          "description": "Write a header row of column names. Turn off when appending to a sheet that already has headers."
        },
        {
          "key": "reconcileExistingHeader",
          "type": "boolean",
          "required": false,
          "secret": false,
          "description": "When the tab already has a header row, preserve its column order and add newly seen fields to the end. Prevents changed source schemas from shifting values into the wrong columns."
        },
        {
          "key": "upsertKey",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "A source field name such as id or email. Matching existing Sheet rows are updated; new keys are appended. The tab must have a header row and duplicate non-empty keys are rejected."
        },
        {
          "key": "maxItems",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Cap on rows written. Leave empty for all."
        }
      ]
    },
    {
      "slug": "dataset-to-notion",
      "entry": "097",
      "title": "Dataset to Notion — Reliable Field Mapping",
      "description": "Export any Apify dataset into a Notion database, mapping each field to the correct Notion property type — with a per-item report of exactly which fields mapped and which were skipped. No silent data loss.",
      "categories": [
        "INTEGRATIONS",
        "AUTOMATION"
      ],
      "url": "https://alaudinburki-scrapers.pages.dev/scrapers/dataset-to-notion/",
      "apifyUrl": "https://apify.com/alaudinburki/dataset-to-notion",
      "usage": {
        "runs": 5,
        "users": 1,
        "lastRun": "2026-10-16"
      },
      "outputSchema": [
        {
          "key": "itemIndex",
          "type": "number",
          "nullable": true,
          "description": "Zero-based position of this item within its parent list.",
          "example": "0"
        },
        {
          "key": "status",
          "type": "string",
          "nullable": true,
          "description": "Outcome recorded for this row.",
          "example": "ok"
        },
        {
          "key": "notionUrl",
          "type": "string",
          "nullable": true,
          "description": "Link to the Notion page for this record.",
          "example": "<notionUrl>"
        },
        {
          "key": "mappedFields",
          "type": "string",
          "nullable": true,
          "description": "Fields that were mapped to the destination.",
          "example": "[\"title\",\"price\",\"sku\"]"
        },
        {
          "key": "skippedFields",
          "type": "string",
          "nullable": true,
          "description": "Fields that were not mapped to the destination.",
          "example": "[\"internalId\"]"
        },
        {
          "key": "mappedCount",
          "type": "integer",
          "nullable": true,
          "description": "How many fields were mapped.",
          "example": "3"
        },
        {
          "key": "skippedCount",
          "type": "integer",
          "nullable": true,
          "description": "How many fields were skipped.",
          "example": "1"
        }
      ],
      "inputs": [
        {
          "key": "notionToken",
          "type": "string",
          "required": false,
          "secret": true,
          "description": "Secret — supply your own value."
        },
        {
          "key": "databaseId",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "The target database — paste its ID (32 hex chars) or its full URL."
        },
        {
          "key": "datasetId",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "The Apify dataset to export (e.g. a scraper run's defaultDatasetId). Leave empty to use the inline items below."
        },
        {
          "key": "items",
          "type": "array",
          "required": false,
          "secret": false,
          "description": "Rows to export, if you don't have a dataset ID. Each object becomes one Notion page."
        },
        {
          "key": "fieldMapping",
          "type": "object",
          "required": false,
          "secret": false,
          "description": "Map dataset fields to Notion property names, e.g. {\"soldPrice\": \"Price\", \"title\": \"Name\"}. Unmapped fields auto-match by name (case-insensitive)."
        },
        {
          "key": "titleField",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "Which dataset field to use for the Notion page title. If empty, the first printable value is used."
        },
        {
          "key": "skipEmptyItems",
          "type": "boolean",
          "required": false,
          "secret": false,
          "description": "On: items with no mappable fields (or no title) are recorded as skipped instead of failing."
        },
        {
          "key": "maxItems",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Cap on how many dataset items to write. Leave empty to export all."
        }
      ]
    },
    {
      "slug": "brazil-cnpj-monitor",
      "entry": "098",
      "title": "Brazil CNPJ Monitor — Alerts When a Company Changes",
      "description": "Watch a list of Brazilian CNPJs and get back only what changed since the last run: status, address, capital social, contacts, CNAE, names, tax elections and the partner list. No API key needed. The first run sets a baseline; a field it could not check is named, never passed off as unchanged.",
      "categories": [
        "BUSINESS",
        "DEVELOPER_TOOLS"
      ],
      "url": "https://alaudinburki-scrapers.pages.dev/scrapers/brazil-cnpj-monitor/",
      "apifyUrl": "https://apify.com/alaudinburki/brazil-cnpj-monitor",
      "usage": {
        "runs": 4,
        "users": 1,
        "lastRun": "2026-10-16"
      },
      "outputSchema": [
        {
          "key": "from",
          "type": "array",
          "nullable": true,
          "description": "The value before the change.",
          "example": "Alice Smith"
        },
        {
          "key": "to",
          "type": "array",
          "nullable": true,
          "description": "The value after the change.",
          "example": "Alice Jones"
        },
        {
          "key": "from_count",
          "type": "array",
          "nullable": true,
          "description": "How many entries the value had before.",
          "example": "2"
        },
        {
          "key": "to_count",
          "type": "array",
          "nullable": true,
          "description": "How many entries the value had after.",
          "example": "3"
        },
        {
          "key": "status",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Outcome recorded for this row.",
          "example": "ok"
        },
        {
          "key": "record_type",
          "type": "string",
          "nullable": true,
          "description": "Discriminator for this record kind.",
          "example": "change"
        }
      ],
      "inputs": [
        {
          "key": "cnpjs",
          "type": "array",
          "required": false,
          "secret": false,
          "description": "One CNPJ per line, with or without punctuation. Keep the same list between runs — that is what makes a change a change. Check digits are verified locally first, so a typo is never reported as a missing company."
        },
        {
          "key": "watch",
          "type": "array",
          "required": false,
          "secret": false,
          "description": "One entry per watched field: situacao, address, capital, contact, cnae, partners, names, tax. Unknown entries are ignored. Watching 'partners' costs nothing extra — the partner list arrives with the same request."
        },
        {
          "key": "includePartners",
          "type": "boolean",
          "required": false,
          "secret": false,
          "description": "ON by default, and needed for the 'partners' watch. The list comes back with the same request, so this costs nothing extra."
        },
        {
          "key": "maxItems",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Hard limit on how many watchlist entries are checked, in the order you gave them."
        },
        {
          "key": "maxChangeRows",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Caps the rows written in one run so a first mass change cannot flood your dataset. State is always saved in full, and the SUMMARY says if it truncated."
        },
        {
          "key": "requestsPerMinute",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "The registers are free and community-run, so this Actor is deliberately gentle: one request a second by default."
        },
        {
          "key": "retries",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "How many times a rate-limit or server error is retried, with backoff, before the next provider is tried."
        }
      ]
    },
    {
      "slug": "linkedin-markets-prospects",
      "entry": "099",
      "title": "LinkedIn Markets Prospects — Qualified Finance Leads",
      "description": "Turn a LinkedIn search into qualified prospects — each with a fit score and a written reason to contact them — instead of a pile of raw profiles.",
      "categories": [
        "LEAD_GENERATION",
        "BUSINESS"
      ],
      "url": "https://alaudinburki-scrapers.pages.dev/scrapers/linkedin-markets-prospects/",
      "apifyUrl": "https://apify.com/alaudinburki/linkedin-markets-prospects",
      "usage": {
        "runs": 4,
        "users": 2,
        "lastRun": "2026-10-15"
      },
      "outputSchema": [
        {
          "key": "score",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Score on the Actor's own scale. The scale is stated in the field's own band.",
          "example": "[]"
        },
        {
          "key": "matched",
          "type": "array",
          "nullable": true,
          "description": "Matched as recorded for this row.",
          "example": "[]"
        },
        {
          "key": "linkedin_url",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Linkedin url as recorded for this row.",
          "example": "[]"
        },
        {
          "key": "public_identifier",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Public identifier as recorded for this row.",
          "example": "[]"
        },
        {
          "key": "first_name",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "First name as recorded for this row.",
          "example": "[]"
        },
        {
          "key": "last_name",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Last name as recorded for this row.",
          "example": "[]"
        },
        {
          "key": "full_name",
          "type": "array",
          "nullable": true,
          "description": "Full personal or entity name as published.",
          "example": "[]"
        },
        {
          "key": "headline",
          "type": "string",
          "nullable": true,
          "description": "Headline as published.",
          "example": ""
        },
        {
          "key": "company_name",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Registered company name.",
          "example": "[]"
        },
        {
          "key": "company_linkedin",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Company linkedin as recorded for this row.",
          "example": "[]"
        },
        {
          "key": "company_type",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Company type as recorded for this row.",
          "example": "[]"
        },
        {
          "key": "city",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "The city this row relates to.",
          "example": "London"
        },
        {
          "key": "country",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Country code associated with this record.",
          "example": "[]"
        },
        {
          "key": "connections",
          "type": "number",
          "nullable": true,
          "description": "Connections as recorded for this row.",
          "example": "0"
        },
        {
          "key": "matched_terms",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Matched terms as recorded for this row.",
          "example": "[]"
        },
        {
          "key": "why_them",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Why them as recorded for this row.",
          "example": "[]"
        },
        {
          "key": "icp_path",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Icp path as recorded for this row.",
          "example": "[]"
        },
        {
          "key": "stage",
          "type": "string",
          "nullable": true,
          "description": "Stage as recorded for this row.",
          "example": ""
        },
        {
          "key": "summary",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Short human-readable summary of this row.",
          "example": "[]"
        },
        {
          "key": "queries_run",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Queries run as recorded for this row.",
          "example": "[]"
        },
        {
          "key": "kept",
          "type": "integer",
          "nullable": true,
          "description": "Kept as recorded for this row.",
          "example": ""
        },
        {
          "key": "discarded",
          "type": "integer",
          "nullable": true,
          "description": "Discarded as recorded for this row.",
          "example": ""
        },
        {
          "key": "keep_rate",
          "type": "number",
          "nullable": true,
          "description": "Percentage of scanned profiles kept, to one decimal. Null when nothing was scanned.",
          "example": ""
        },
        {
          "key": "scores_5",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Scores 5 as recorded for this row.",
          "example": "[]"
        },
        {
          "key": "scores_4",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Scores 4 as recorded for this row.",
          "example": "[]"
        },
        {
          "key": "scores_3",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Scores 3 as recorded for this row.",
          "example": "[]"
        },
        {
          "key": "scores_2",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Scores 2 as recorded for this row.",
          "example": "[]"
        },
        {
          "key": "scores_1",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Scores 1 as recorded for this row.",
          "example": "[]"
        },
        {
          "key": "countries_kept",
          "type": "integer",
          "nullable": true,
          "description": "Countries kept as recorded for this row.",
          "example": ""
        },
        {
          "key": "without_reason",
          "type": "integer",
          "nullable": true,
          "description": "How many kept prospects have no specific reason recorded.",
          "example": "[]"
        }
      ],
      "inputs": [
        {
          "key": "mode",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "Qualify a dataset you already have (free), or plan and run the searches yourself (paid)."
        },
        {
          "key": "dryRun",
          "type": "boolean",
          "required": false,
          "secret": false,
          "description": "ON by default. Shows exactly which searches would run and the estimated cost, then stops. Turn this OFF when you are happy with the plan — that is the only thing standing between you and a paid scrape."
        },
        {
          "key": "datasetId",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "Only used in 'Qualify an existing dataset' mode. Paste the dataset id from a LinkedIn search actor's run."
        },
        {
          "key": "jobTitles",
          "type": "array",
          "required": false,
          "secret": false,
          "description": "One search runs per title for every city below. Titles decide who, so be specific — 'Portfolio Manager' finds buyers, 'Investment' finds everybody."
        },
        {
          "key": "cities",
          "type": "array",
          "required": false,
          "secret": false,
          "description": "Splitting by city is how you get past LinkedIn's hard limit of 2,500 results per search — it silently stops there, so one broad query quietly returns a fraction of what exists."
        },
        {
          "key": "industryIds",
          "type": "array",
          "required": false,
          "secret": false,
          "description": "Filter to an industry. 43 is Financial Services, which is what most users want here. Leave as-is unless you know the code you need."
        },
        {
          "key": "pagesPerQuery",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "One page is up to 25 profiles. Cost scales directly with this number, so it is the main dial on what a run spends."
        },
        {
          "key": "minScore",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "0 keeps everybody including recruiters; 3 keeps only people with real market relevance; 5 keeps only near-perfect fits. Rows below this are dropped, not hidden."
        },
        {
          "key": "maxItems",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Hard limit on prospects written. Enforced exactly — the best-scoring rows are kept when it bites, never whoever happened to be scraped first."
        },
        {
          "key": "icpPath",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "Carried onto every row so a list can be split later. A = traders and analysts, B = small funds and emerging managers, C = institutional."
        },
        {
          "key": "readLimit",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Safety valve on how much raw data is pulled before qualifying. Rarely needs changing."
        },
        {
          "key": "timeoutSecs",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "How long a single search may run before it is abandoned. Abandoned searches do not fail the whole run."
        }
      ]
    },
    {
      "slug": "rate-deck-diff",
      "entry": "100",
      "title": "Telecom Rate Deck Change Detector — Track Tariff Diffs",
      "description": "Compare two carrier rate decks by destination prefix and report added, removed and changed rates.",
      "categories": [
        "BUSINESS",
        "DEVELOPER_TOOLS"
      ],
      "url": "https://alaudinburki-scrapers.pages.dev/scrapers/rate-deck-diff/",
      "apifyUrl": "https://apify.com/alaudinburki/rate-deck-diff",
      "usage": {
        "runs": 3,
        "users": 2,
        "lastRun": "2026-10-15"
      },
      "outputSchema": [
        {
          "key": "oldRate",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "The rate before the change.",
          "example": "0.0120"
        },
        {
          "key": "newRate",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "The rate after the change.",
          "example": "0.0140"
        },
        {
          "key": "oldCurrency",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "The currency before the change.",
          "example": "GBP"
        },
        {
          "key": "newCurrency",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "The currency after the change.",
          "example": "GBP"
        },
        {
          "key": "absoluteChange",
          "type": "string",
          "nullable": true,
          "description": "The absolute change in rate.",
          "example": "0.0020"
        },
        {
          "key": "percentChange",
          "type": "string",
          "nullable": true,
          "description": "The change as a percentage.",
          "example": "16.67"
        }
      ],
      "inputs": [
        {
          "key": "rows",
          "type": "array",
          "required": false,
          "secret": false,
          "description": "JSON rows to analyze. Use the example in the README for required fields."
        },
        {
          "key": "datasetId",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "Optional Apify dataset ID used instead of inline rows."
        }
      ]
    },
    {
      "slug": "json-schema-drift",
      "entry": "101",
      "title": "JSON Schema Drift Detector — Catch Breaking Changes",
      "description": "Compare two JSON datasets and identify added, removed and changed field types.",
      "categories": [
        "BUSINESS",
        "DEVELOPER_TOOLS"
      ],
      "url": "https://alaudinburki-scrapers.pages.dev/scrapers/json-schema-drift/",
      "apifyUrl": "https://apify.com/alaudinburki/json-schema-drift",
      "usage": {
        "runs": 2,
        "users": 2,
        "lastRun": "2026-10-15"
      },
      "outputSchema": [
        {
          "key": "rows",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "How many rows this item contributed.",
          "example": "120"
        },
        {
          "key": "summary",
          "type": "object",
          "nullable": true,
          "description": "Per-run counts: fields before and after, changes found, and a note on scope.",
          "example": "[]"
        },
        {
          "key": "field",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "The field or attribute this row is about.",
          "example": "director_name"
        },
        {
          "key": "status",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Outcome recorded for this row.",
          "example": "ok"
        },
        {
          "key": "beforeTypes",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "The types seen before the change.",
          "example": "string"
        },
        {
          "key": "afterTypes",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "The types seen after the change.",
          "example": "string,number"
        },
        {
          "key": "demo",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Demo as recorded for this row.",
          "example": "[]"
        }
      ],
      "inputs": [
        {
          "key": "rows",
          "type": "array",
          "required": false,
          "secret": false,
          "description": "JSON rows to analyze. Use the example in the README for required fields."
        },
        {
          "key": "datasetId",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "Optional Apify dataset ID used instead of inline rows."
        }
      ]
    },
    {
      "slug": "mcp-output-router",
      "entry": "102",
      "title": "MCP Output Router — Send Any Dataset to Your Own Apps",
      "description": "Write a dataset into Notion, Slack, Supabase, a CRM or anything else you have connected as an Apify MCP connector. Your credentials never touch the Actor: the platform injects them server-side. Dry run by default, and every row reports whether the destination accepted it.",
      "categories": [
        "INTEGRATIONS",
        "DEVELOPER_TOOLS",
        "AUTOMATION"
      ],
      "url": "https://alaudinburki-scrapers.pages.dev/scrapers/mcp-output-router/",
      "apifyUrl": "https://apify.com/alaudinburki/mcp-output-router",
      "usage": {
        "runs": 2,
        "users": 1,
        "lastRun": "2026-10-15"
      },
      "outputSchema": [
        {
          "key": "tool",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Tool as recorded for this row.",
          "example": "[]"
        },
        {
          "key": "reason",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Why this row carries its status.",
          "example": "matched"
        },
        {
          "key": "unmapped",
          "type": "array",
          "nullable": true,
          "description": "Unmapped as recorded for this row.",
          "example": "[]"
        },
        {
          "key": "args",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Args as recorded for this row.",
          "example": "[]"
        },
        {
          "key": "status",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Outcome recorded for this row.",
          "example": "ok"
        }
      ],
      "inputs": [
        {
          "key": "connector",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "The app to write to. Authorise it once in Settings → API & Integrations, then pick it here. The Actor never sees your credentials — the platform injects them server-side."
        },
        {
          "key": "datasetId",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "The dataset id from a previous run (its defaultDatasetId). Leave empty to use 'items' below instead."
        },
        {
          "key": "items",
          "type": "array",
          "required": false,
          "secret": false,
          "description": "Rows supplied directly, one object per row. Used only when 'datasetId' is empty."
        },
        {
          "key": "toolName",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "Leave empty and the Actor picks the only tool that looks like a write action, and tells you which it chose. Name one to be exact — a name that does not exist is refused rather than substituted."
        },
        {
          "key": "fieldMap",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "JSON mapping from the tool's argument names to your row's field names, e.g. {\"title\":\"name\"}. Leave empty and row fields whose names the tool already declares are passed through unchanged."
        },
        {
          "key": "maxItems",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Hard limit on tool calls. The best rows first when it bites."
        },
        {
          "key": "dryRun",
          "type": "boolean",
          "required": false,
          "secret": false,
          "description": "ON by default. Reports the tools the connector offers, which one would be called, and the exact arguments for the first row. Turn it off deliberately when the plan looks right."
        }
      ]
    },
    {
      "slug": "ohlcv-integrity-auditor",
      "entry": "103",
      "title": "OHLCV Data Integrity Auditor — Check Market Data",
      "description": "Find missing bars, duplicate timestamps and impossible OHLCV candles in trading data.",
      "categories": [
        "BUSINESS",
        "DEVELOPER_TOOLS"
      ],
      "url": "https://alaudinburki-scrapers.pages.dev/scrapers/ohlcv-integrity-auditor/",
      "apifyUrl": "https://apify.com/alaudinburki/ohlcv-integrity-auditor",
      "usage": {
        "runs": 2,
        "users": 2,
        "lastRun": "2026-10-15"
      },
      "outputSchema": [
        {
          "key": "symbol",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Ticker or symbol as the source writes it.",
          "example": "AAPL"
        },
        {
          "key": "timestamp",
          "type": "string",
          "nullable": true,
          "description": "The source's own timestamp for this record, unmodified.",
          "example": ""
        },
        {
          "key": "issues",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Problems found in this row.",
          "example": "duplicate timestamp"
        },
        {
          "key": "previousTimestamp",
          "type": "string",
          "nullable": true,
          "description": "The timestamp preceding this one.",
          "example": "2026-10-15T09:00:00.000Z"
        }
      ],
      "inputs": [
        {
          "key": "rows",
          "type": "array",
          "required": false,
          "secret": false,
          "description": "JSON rows to analyze. Use the example in the README for required fields."
        },
        {
          "key": "datasetId",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "Optional Apify dataset ID used instead of inline rows."
        },
        {
          "key": "intervalSeconds",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Expected number of seconds between candles."
        }
      ]
    },
    {
      "slug": "webhook-inbox",
      "entry": "104",
      "title": "Webhook Inbox — Catch Every Webhook, Lose Nothing",
      "description": "Point any service's webhook at this inbox and every delivery is stored as a dataset row you can read, schedule against, or relay onward. Retries are flagged as duplicates, never dropped, and a body that will not parse is kept rather than thrown away.",
      "categories": [
        "DEVELOPER_TOOLS",
        "AUTOMATION",
        "INTEGRATIONS"
      ],
      "url": "https://alaudinburki-scrapers.pages.dev/scrapers/webhook-inbox/",
      "apifyUrl": "https://apify.com/alaudinburki/webhook-inbox",
      "usage": {
        "runs": 2,
        "users": 1,
        "lastRun": "2026-10-15"
      },
      "outputSchema": [
        {
          "key": "method",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Method as recorded for this row.",
          "example": "[]"
        },
        {
          "key": "path",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Path as recorded for this row.",
          "example": "[]"
        },
        {
          "key": "rawBuffer",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Raw Buffer as recorded for this row.",
          "example": "[]"
        },
        {
          "key": "isDuplicate",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Is Duplicate as recorded for this row.",
          "example": "[]"
        },
        {
          "key": "dedupeKey",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Dedupe Key as recorded for this row.",
          "example": "[]"
        },
        {
          "key": "dedupeSource",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Dedupe Source as recorded for this row.",
          "example": "[]"
        },
        {
          "key": "forwardTarget",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Forward Target as recorded for this row.",
          "example": "[]"
        }
      ],
      "inputs": [
        {
          "key": "secretToken",
          "type": "string",
          "required": false,
          "secret": true,
          "description": "Secret — supply your own value."
        },
        {
          "key": "dedupeWindowSecs",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "How long a delivery id is remembered. A retry inside the window is still stored, but flagged duplicate so you can filter it. Set 0 to turn duplicate flagging off entirely."
        },
        {
          "key": "dedupeKeyHeader",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "Which header identifies a delivery. Falls back to Idempotency-Key, X-Webhook-Id, X-Delivery-Id and X-Request-Id, then to well-known body fields, then to a hash of the body."
        },
        {
          "key": "forwardUrl",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "A URL to relay each stored delivery to. Leave empty to store only. The relay outcome is reported in the HTTP response and the counters; the delivery is already stored either way."
        },
        {
          "key": "forwardRetries",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "How many times a failed relay is retried before the response reports it as failed. The delivery stays stored regardless."
        },
        {
          "key": "forwardTimeoutSecs",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "How long one relay attempt may take before it is abandoned and retried."
        },
        {
          "key": "maxBodyKb",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Bodies larger than this are rejected with HTTP 413 rather than buffered into memory. Raise it only if a sender you control needs it."
        },
        {
          "key": "maxSeenKeys",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Memory cap for duplicate detection on a server that may run for days. The oldest ids are forgotten first."
        },
        {
          "key": "redactHeaders",
          "type": "array",
          "required": false,
          "secret": false,
          "description": "Header names stored as [redacted]. Authorization, Cookie, Proxy-Authorization and X-Api-Key are always redacted; add any others your sender uses for credentials."
        }
      ]
    },
    {
      "slug": "brazil-cnpj",
      "entry": "105",
      "title": "Brazil CNPJ Lookup — Company, Address, CNAE & Partners",
      "description": "Look up any Brazilian company by CNPJ and get the Receita Federal register back as flat rows: razão social, situação cadastral, CNAE, full address, capital social, tax regime, phones and the partner list. No API key needed, and an invalid CNPJ is rejected locally rather than reported as missing.",
      "categories": [
        "BUSINESS",
        "DEVELOPER_TOOLS"
      ],
      "url": "https://alaudinburki-scrapers.pages.dev/scrapers/brazil-cnpj/",
      "apifyUrl": "https://apify.com/alaudinburki/brazil-cnpj",
      "usage": {
        "runs": 1,
        "users": 1,
        "lastRun": "2026-10-16"
      },
      "outputSchema": [
        {
          "key": "ok",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Whether this row was retrieved successfully.",
          "example": "[]"
        },
        {
          "key": "reason",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Why this row carries its status.",
          "example": "matched"
        },
        {
          "key": "year",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Year as recorded for this row.",
          "example": "[]"
        },
        {
          "key": "form",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Form as recorded for this row.",
          "example": "[]"
        },
        {
          "key": "record_type",
          "type": "string",
          "nullable": true,
          "description": "What this row is — company or partner.",
          "example": "change"
        },
        {
          "key": "status",
          "type": "string",
          "nullable": true,
          "description": "Outcome recorded for this row.",
          "example": "ok"
        },
        {
          "key": "cnpj",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Cnpj as recorded for this row.",
          "example": "[]"
        }
      ],
      "inputs": [
        {
          "key": "cnpjs",
          "type": "array",
          "required": false,
          "secret": false,
          "description": "One CNPJ per line, with or without punctuation (19.131.243/0001-97 or 19131243000197). The check digits are verified locally first, so a typo is reported as a typo instead of as a missing company."
        },
        {
          "key": "includePartners",
          "type": "boolean",
          "required": false,
          "secret": false,
          "description": "ON by default: one extra row per partner (sócio) with their role, entry date and the register's masked document. Turn it off for company rows only."
        },
        {
          "key": "maxItems",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Hard limit on how many CNPJs are looked up. Enforced exactly, in the order you gave them."
        },
        {
          "key": "requestsPerMinute",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "The registers are free and community-run, so this Actor is deliberately gentle. The default is one request a second. Raise it only if you know the service can take it."
        },
        {
          "key": "retries",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "How many times a rate-limit or server error is retried, with backoff, before the next provider is tried. The Actor already falls back across two providers, so this is a second line of defence."
        }
      ]
    },
    {
      "slug": "dataset-digest",
      "entry": "106",
      "title": "Dataset Digest — Merge Datasets Into One Readable Summary",
      "description": "Turn several Apify datasets into one markdown digest a person will actually read: a source table, the merged rows, and an honest count of anything collapsed or dropped. Put it on a schedule and it becomes the weekly summary of a whole pipeline.",
      "categories": [
        "DEVELOPER_TOOLS",
        "AUTOMATION",
        "INTEGRATIONS"
      ],
      "url": "https://alaudinburki-scrapers.pages.dev/scrapers/dataset-digest/",
      "apifyUrl": "https://apify.com/alaudinburki/dataset-digest",
      "usage": {
        "runs": 1,
        "users": 1,
        "lastRun": "2026-10-16"
      },
      "outputSchema": [
        {
          "key": "_source",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Which source this row came from.",
          "example": "dataset-alpha"
        },
        {
          "key": "_dedupe_field",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "The field used to deduplicate.",
          "example": "email"
        },
        {
          "key": "rows",
          "type": "array",
          "nullable": true,
          "description": "The merged rows this digest covers.",
          "example": "120"
        },
        {
          "key": "label",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Human-readable label for this row.",
          "example": "run-1"
        },
        {
          "key": "status",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Outcome recorded for this row.",
          "example": "ok"
        },
        {
          "key": "record_type",
          "type": "string",
          "nullable": true,
          "description": "What this row is — \"digest\" for the summary record.",
          "example": "change"
        }
      ],
      "inputs": [
        {
          "key": "sources",
          "type": "array",
          "required": false,
          "secret": false,
          "description": "One entry per dataset: the dataset id on its own, or \"label=datasetId\" to give it a name in the digest. Empty means there is nothing to summarise, and the Actor says so."
        },
        {
          "key": "title",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "The heading of the document, e.g. \"Weekly competitor watch\"."
        },
        {
          "key": "dedupeKey",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "A field present in several sources, e.g. url or email. Leave empty and every row is kept — a digest is not a deduplicator, and collapsing rows silently would misreport the volume. When set, the first occurrence wins and the collapse is counted and reported."
        },
        {
          "key": "columns",
          "type": "array",
          "required": false,
          "secret": false,
          "description": "Which fields appear in the digest table. Leave empty and the fields present in every row are used, which avoids columns that look like missing data."
        },
        {
          "key": "maxRowsPerSource",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Caps how many rows each source contributes, so one huge dataset cannot swamp the digest. Anything dropped is counted in the SUMMARY, never silently removed."
        },
        {
          "key": "maxRowsInDigest",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "A hard cap on the table itself. A digest with 10,000 rows is not a digest, so the default keeps it readable."
        }
      ]
    },
    {
      "slug": "mcp-enricher",
      "entry": "107",
      "title": "MCP Enricher — Look Up Every Row in Your Own Apps",
      "description": "Enrich every row of a dataset by calling a tool on an app you connected as an Apify MCP connector — a CRM, a project tracker, an internal database — and merge the reply back into the row. Your credentials never touch the Actor. Dry run by default.",
      "categories": [
        "INTEGRATIONS",
        "DEVELOPER_TOOLS",
        "AUTOMATION"
      ],
      "url": "https://alaudinburki-scrapers.pages.dev/scrapers/mcp-enricher/",
      "apifyUrl": "https://apify.com/alaudinburki/mcp-enricher",
      "usage": {
        "runs": 1,
        "users": 1,
        "lastRun": "2026-10-16"
      },
      "outputSchema": [
        {
          "key": "tool",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Tool as recorded for this row.",
          "example": "[]"
        },
        {
          "key": "reason",
          "type": "string",
          "nullable": true,
          "description": "Why this row carries its status.",
          "example": "matched"
        },
        {
          "key": "unmapped",
          "type": "array",
          "nullable": true,
          "description": "Unmapped as recorded for this row.",
          "example": "[]"
        },
        {
          "key": "args",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Args as recorded for this row.",
          "example": "[]"
        },
        {
          "key": "status",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Outcome recorded for this row.",
          "example": "ok"
        }
      ],
      "inputs": [
        {
          "key": "connector",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "The app to query. Authorise it once in Settings → API & Integrations, then pick it here. The Actor never sees your credentials — the platform injects them server-side."
        },
        {
          "key": "datasetId",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "The dataset id from a previous run (its defaultDatasetId). Leave empty to use 'items' below instead."
        },
        {
          "key": "items",
          "type": "array",
          "required": false,
          "secret": false,
          "description": "Rows supplied directly, one object per row. Used only when 'datasetId' is empty."
        },
        {
          "key": "toolName",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "Leave empty and the Actor picks the tool that looks like a lookup (get, search, find, list, read…), and tells you which it chose. Name one to be exact — a name that does not exist is refused rather than substituted."
        },
        {
          "key": "fieldMap",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "JSON mapping from the tool's argument names to your row's field names, e.g. {\"query\":\"company_name\"}. Leave empty and row fields whose names the tool already declares are passed through unchanged."
        },
        {
          "key": "outputField",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "The field the tool's reply is written into. The companion fields <name>_ok, <name>_error and <name>_tool are written beside it, so a failed lookup is visible rather than blank."
        },
        {
          "key": "maxItems",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Hard limit on tool calls. The first N rows are enriched, in the order the dataset gives them."
        },
        {
          "key": "skipOnError",
          "type": "boolean",
          "required": false,
          "secret": false,
          "description": "ON by default: a row the tool could not answer is kept with its error recorded, and the run continues. Turn it off to stop at the first failure."
        },
        {
          "key": "dryRun",
          "type": "boolean",
          "required": false,
          "secret": false,
          "description": "ON by default. Reports the tools the connector offers, which one would be called, and the exact arguments for the first row, without calling it."
        }
      ]
    },
    {
      "slug": "reliability-toolkit-mcp",
      "entry": "108",
      "title": "Reliability Toolkit — MCP Server for Site Checks",
      "description": "An MCP server exposing reliable scraping and data tools (Amazon, email verify, leads, Google Trends, Product Hunt, prediction markets, and more) to Claude, Cursor, and AI agents. Each tool runs a maintained, tested Actor.",
      "categories": [
        "MCP_SERVERS",
        "DEVELOPER_TOOLS"
      ],
      "url": "https://alaudinburki-scrapers.pages.dev/scrapers/reliability-toolkit-mcp/",
      "apifyUrl": "https://apify.com/alaudinburki/reliability-toolkit-mcp",
      "usage": {
        "runs": 1,
        "users": 1,
        "lastRun": "2026-10-16"
      },
      "outputSchema": [
        {
          "key": "status",
          "type": "string",
          "nullable": false,
          "description": "Outcome recorded for this row.",
          "example": "active"
        },
        {
          "key": "message",
          "type": "string",
          "nullable": false,
          "description": "Human-readable note about this row or the run.",
          "example": "Add your API key to classify answers. No text was sent anywhere."
        },
        {
          "key": "rowsReturned",
          "type": "number",
          "nullable": false,
          "description": "How many rows the run returned. Zero on a blocked run, which is a real value and the entire point of such a record.",
          "example": "0"
        }
      ],
      "inputs": []
    },
    {
      "slug": "uk-companies-house",
      "entry": "109",
      "title": "UK Companies House — Company, Officers & Filing History",
      "description": "Look up any UK company on the official Companies House register: status, registered office, SIC codes, accounts and confirmation-statement due dates, plus officers, filing history and people with significant control. Rows the register could not return are reported as not_found, never dropped.",
      "categories": [
        "BUSINESS",
        "DEVELOPER_TOOLS"
      ],
      "url": "https://alaudinburki-scrapers.pages.dev/scrapers/uk-companies-house/",
      "apifyUrl": "https://apify.com/alaudinburki/uk-companies-house",
      "usage": {
        "runs": 1,
        "users": 1,
        "lastRun": "2026-10-16"
      },
      "outputSchema": [
        {
          "key": "address",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Street address as published.",
          "example": "[]"
        },
        {
          "key": "postcode",
          "type": "string | number | boolean | array | object",
          "nullable": true,
          "description": "Postcode as recorded for this row.",
          "example": "[]"
        },
        {
          "key": "record_type",
          "type": "string",
          "nullable": true,
          "description": "Discriminator for this record kind.",
          "example": "change"
        },
        {
          "key": "limitation",
          "type": "integer",
          "nullable": true,
          "description": "Limitation as recorded for this row.",
          "example": ""
        },
        {
          "key": "status",
          "type": "string",
          "nullable": true,
          "description": "Outcome for this row — for example found, not_found, needs_credentials or blocked.",
          "example": "ok"
        }
      ],
      "inputs": [
        {
          "key": "companies",
          "type": "array",
          "required": false,
          "secret": false,
          "description": "Company numbers (e.g. 00000006, or SC123456) or registered names (e.g. Tesco PLC). A number is looked up directly; a name is searched and the top match is used."
        },
        {
          "key": "apiKey",
          "type": "string",
          "required": false,
          "secret": true,
          "description": "Secret — supply your own value."
        },
        {
          "key": "include",
          "type": "array",
          "required": false,
          "secret": false,
          "description": "The company profile is always fetched. Add any of: officers, filings, psc (people with significant control) — one comma-free entry each. Anything unrecognised is ignored. Each costs one more API call per company."
        },
        {
          "key": "maxCompanies",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Hard limit on how many entries are looked up. Enforced exactly — the first N are taken, in the order you gave them."
        },
        {
          "key": "requestsPerMinute",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "How fast to call the register. Companies House allows 600 requests per 5 minutes; the default stays well inside that. Raise it only if you know why."
        }
      ]
    },
    {
      "slug": "companies-house-monitor",
      "entry": "110",
      "title": "UK Companies House Monitor — Alerts When a Company Changes",
      "description": "Watch UK companies on the official Companies House register and get back only what changed since the last run: status, address, accounts dates, insolvency, names, officers, PSC and filings. A first run records a baseline; an unchecked field is named, never passed off as unchanged.",
      "categories": [
        "BUSINESS",
        "DEVELOPER_TOOLS"
      ],
      "url": "https://alaudinburki-scrapers.pages.dev/scrapers/companies-house-monitor/",
      "apifyUrl": "https://apify.com/alaudinburki/companies-house-monitor",
      "usage": {
        "runs": 1,
        "users": 1,
        "lastRun": "2026-10-16"
      },
      "outputSchema": [
        {
          "key": "from",
          "type": "array",
          "nullable": true,
          "description": "The value before the change.",
          "example": "Alice Smith"
        },
        {
          "key": "to",
          "type": "array",
          "nullable": true,
          "description": "The value after the change.",
          "example": "Alice Jones"
        },
        {
          "key": "from_count",
          "type": "array",
          "nullable": true,
          "description": "How many entries the value had before.",
          "example": "2"
        },
        {
          "key": "to_count",
          "type": "array",
          "nullable": true,
          "description": "How many entries the value had after.",
          "example": "3"
        },
        {
          "key": "status",
          "type": "string",
          "nullable": true,
          "description": "Outcome for this row — what this run found or why it could not proceed.",
          "example": "ok"
        },
        {
          "key": "record_type",
          "type": "string",
          "nullable": true,
          "description": "Discriminator for this record kind.",
          "example": "change"
        }
      ],
      "inputs": [
        {
          "key": "companies",
          "type": "array",
          "required": false,
          "secret": false,
          "description": "Company numbers (e.g. 00000006, SC123456) or registered names (e.g. Tesco PLC). Keep the same list between runs — that is what makes a change a change."
        },
        {
          "key": "watch",
          "type": "array",
          "required": false,
          "secret": false,
          "description": "One entry per watched field: status, address, accounts, insolvency, names, officers, psc, filings. Watching officers, psc or filings costs one more API call per company per run."
        },
        {
          "key": "apiKey",
          "type": "string",
          "required": false,
          "secret": true,
          "description": "Secret — supply your own value."
        },
        {
          "key": "maxCompanies",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Hard limit on how many watchlist entries are checked. Enforced exactly, in the order you gave them."
        },
        {
          "key": "maxChangeRows",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Caps the rows written in one run so a first mass change cannot flood your dataset. State is always saved in full, so nothing is lost — the SUMMARY says if it truncated."
        },
        {
          "key": "requestsPerMinute",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "How fast to call the register. Companies House allows 600 requests per 5 minutes; the default stays well inside that. Raise it only if you know why."
        }
      ]
    },
    {
      "slug": "company-registry-search",
      "entry": "111",
      "title": "Company Registry Search — Legal Entities Worldwide (GLEIF LEI)",
      "description": "Search 2.5 million registered legal entities across every country and get flat rows — legal name, LEI, address, status and registration details. Free public registry, no key.",
      "categories": [
        "BUSINESS",
        "DEVELOPER_TOOLS"
      ],
      "url": "https://alaudinburki-scrapers.pages.dev/scrapers/company-registry-search/",
      "apifyUrl": "https://apify.com/alaudinburki/company-registry-search",
      "usage": {
        "runs": 0,
        "users": 0,
        "lastRun": null
      },
      "outputSchema": [
        {
          "key": "legalName",
          "type": "string",
          "nullable": false,
          "description": "Registered legal name of the entity. This is the name on the register, which often differs from the trading name.",
          "example": "example-value"
        },
        {
          "key": "otherNames",
          "type": "string",
          "nullable": false,
          "description": "Other names the entity is registered or known under, as the register lists them.",
          "example": "example-value"
        },
        {
          "key": "status",
          "type": "string",
          "nullable": false,
          "description": "Outcome recorded for this row.",
          "example": "active"
        },
        {
          "key": "legalForm",
          "type": "string",
          "nullable": false,
          "description": "Legal form of the entity. Often a CODE and often in the source's own language.",
          "example": "private limited company"
        },
        {
          "key": "jurisdiction",
          "type": "string",
          "nullable": false,
          "description": "Legal jurisdiction the entity is registered in. This is where it is registered, which is not necessarily where it operates.",
          "example": "example-value"
        },
        {
          "key": "country",
          "type": "string",
          "nullable": false,
          "description": "Country name as the source writes it — sometimes 'Norge' rather than 'NO'. Not an ISO code unless the README says so.",
          "example": "Norway"
        },
        {
          "key": "city",
          "type": "string",
          "nullable": false,
          "description": "City name.",
          "example": "Austin"
        },
        {
          "key": "region",
          "type": "string",
          "nullable": false,
          "description": "Region the record belongs to.",
          "example": "South East"
        },
        {
          "key": "postalCode",
          "type": "string",
          "nullable": false,
          "description": "Postal code as the source writes it — formats differ per country.",
          "example": "SW1A 2AA"
        },
        {
          "key": "registrationStatus",
          "type": "string",
          "nullable": false,
          "description": "Registration status in the register's own vocabulary, e.g. ISSUED. A register's status codes are its own and are not translated here.",
          "example": "example-value"
        },
        {
          "key": "registrationAuthority",
          "type": "string",
          "nullable": false,
          "description": "Authority that maintains this registration.",
          "example": "example-value"
        },
        {
          "key": "initialRegistration",
          "type": "string",
          "nullable": false,
          "description": "Date the entity was first registered.",
          "example": "example-value"
        },
        {
          "key": "lastUpdate",
          "type": "string",
          "nullable": false,
          "description": "When the register last updated this record. Not when the entity last changed — registers revise records for back-office reasons too.",
          "example": "example-value"
        },
        {
          "key": "nextRenewal",
          "type": "string",
          "nullable": false,
          "description": "Date the registration is next due for renewal.",
          "example": "example-value"
        }
      ],
      "inputs": [
        {
          "key": "query",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "Legal name to search for, e.g. \"Siemens\". Partial names match."
        },
        {
          "key": "country",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "Optional two-letter country code, e.g. PK, US, AE, KE."
        },
        {
          "key": "maxItems",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Stop after this many entities."
        },
        {
          "key": "maxPages",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Stop after this many pages of 100."
        }
      ]
    },
    {
      "slug": "ares-companies",
      "entry": "112",
      "title": "Czech Company Registry (ARES) — By IČO or Search",
      "description": "Look up Czech companies in ARES and get flat rows — IČO, name, VAT number, legal form, address, NACE code and registration dates. Free and key-less.",
      "categories": [
        "BUSINESS",
        "DEVELOPER_TOOLS"
      ],
      "url": "https://alaudinburki-scrapers.pages.dev/scrapers/ares-companies/",
      "apifyUrl": "https://apify.com/alaudinburki/ares-companies",
      "usage": {
        "runs": 0,
        "users": 0,
        "lastRun": null
      },
      "outputSchema": [
        {
          "key": "name",
          "type": "string",
          "nullable": false,
          "description": "Display name as the source writes it.",
          "example": "Example name"
        },
        {
          "key": "vatNumber",
          "type": "number",
          "nullable": false,
          "description": "VAT registration number. A STRING, because it carries a country prefix and leading zeros.",
          "example": "1"
        },
        {
          "key": "legalFormCode",
          "type": "string",
          "nullable": false,
          "description": "Code for the entity's legal form, from the register's own code list.",
          "example": "EXAMPLE-0001"
        },
        {
          "key": "legalForm",
          "type": "string",
          "nullable": false,
          "description": "Legal form of the entity. Often a CODE and often in the source's own language.",
          "example": "private limited company"
        },
        {
          "key": "foundedAt",
          "type": "string",
          "nullable": false,
          "description": "Date the entity was founded or registered.",
          "example": "2026-10-18T07:30:00Z"
        },
        {
          "key": "updatedAt",
          "type": "string",
          "nullable": false,
          "description": "ISO 8601 timestamp of the most recent upstream update.",
          "example": "2026-10-18T07:30:00Z"
        },
        {
          "key": "taxOffice",
          "type": "string",
          "nullable": false,
          "description": "Tax office the entity is registered with.",
          "example": "example-value"
        },
        {
          "key": "street",
          "type": "string",
          "nullable": false,
          "description": "Street name, without the house number.",
          "example": "10 Downing Street"
        },
        {
          "key": "houseNumber",
          "type": "number",
          "nullable": false,
          "description": "House or building number on the street. Often absent outside Europe.",
          "example": "1"
        },
        {
          "key": "city",
          "type": "string",
          "nullable": false,
          "description": "City name.",
          "example": "Austin"
        },
        {
          "key": "postcode",
          "type": "string",
          "nullable": false,
          "description": "Postal code as the source writes it — not normalised, and formats differ per country.",
          "example": "SW1A 2AA"
        },
        {
          "key": "country",
          "type": "string",
          "nullable": false,
          "description": "Country name as the source writes it — sometimes 'Norge' rather than 'NO'. Not an ISO code unless the README says so.",
          "example": "Norway"
        },
        {
          "key": "fullAddress",
          "type": "string",
          "nullable": false,
          "description": "The whole address as one string, formatted by the source rather than by this Actor.",
          "example": "10 Downing Street, London SW1A 2AA"
        },
        {
          "key": "naceCode",
          "type": "string",
          "nullable": false,
          "description": "NACE activity code for the entity. A CODE; several are possible per entity.",
          "example": "EXAMPLE-0001"
        },
        {
          "key": "registerUrl",
          "type": "string",
          "nullable": false,
          "description": "Link to this record on the issuing register, where one exists.",
          "example": "https://example.com/resource"
        }
      ],
      "inputs": [
        {
          "key": "ico",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "Czech registration number (IČO), e.g. 27074358. Comma-separate several."
        },
        {
          "key": "maxItems",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Stop after this many rows."
        },
        {
          "key": "maxPages",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Stop after this many pages."
        }
      ]
    },
    {
      "slug": "brreg-companies",
      "entry": "113",
      "title": "Norway Company Registry — Every Registered Entity",
      "description": "Search Norway's Brønnøysund Register and get flat rows — organisation number, name, legal form, industry code, address, website and status. 1.18 million entities, free and key-less.",
      "categories": [
        "BUSINESS",
        "DEVELOPER_TOOLS"
      ],
      "url": "https://alaudinburki-scrapers.pages.dev/scrapers/brreg-companies/",
      "apifyUrl": "https://apify.com/alaudinburki/brreg-companies",
      "usage": {
        "runs": 0,
        "users": 0,
        "lastRun": null
      },
      "outputSchema": [
        {
          "key": "name",
          "type": "string",
          "nullable": false,
          "description": "Display name as the source writes it.",
          "example": "Example name"
        },
        {
          "key": "legalForm",
          "type": "string",
          "nullable": false,
          "description": "Legal form of the entity. Often a CODE and often in the source's own language.",
          "example": "private limited company"
        },
        {
          "key": "legalFormName",
          "type": "string",
          "nullable": false,
          "description": "Legal form of the entity, as a readable name, e.g. aksjeselskap. The register's own legal vocabulary is not translated.",
          "example": "example-value"
        },
        {
          "key": "registeredAt",
          "type": "string",
          "nullable": false,
          "description": "Date the entity was entered on the register.",
          "example": "2026-10-18T07:30:00Z"
        },
        {
          "key": "foundedAt",
          "type": "string",
          "nullable": false,
          "description": "Date the entity was founded or registered.",
          "example": "2026-10-18T07:30:00Z"
        },
        {
          "key": "industryCode",
          "type": "string",
          "nullable": false,
          "description": "Industry classification code assigned to the entity. A CODE from the national classification, not a description.",
          "example": "EXAMPLE-0001"
        },
        {
          "key": "industryName",
          "type": "string",
          "nullable": false,
          "description": "Readable name of the industry classification the code belongs to.",
          "example": "example-value"
        },
        {
          "key": "employees",
          "type": "number",
          "nullable": false,
          "description": "Number of employees the entity reports. A headcount as declared, and often banded or stale.",
          "example": "12"
        },
        {
          "key": "street",
          "type": "string",
          "nullable": false,
          "description": "Street name, without the house number.",
          "example": "10 Downing Street"
        },
        {
          "key": "postcode",
          "type": "string",
          "nullable": false,
          "description": "Postal code as the source writes it — not normalised, and formats differ per country.",
          "example": "SW1A 2AA"
        },
        {
          "key": "city",
          "type": "string",
          "nullable": false,
          "description": "City name.",
          "example": "Austin"
        },
        {
          "key": "country",
          "type": "string",
          "nullable": false,
          "description": "Country name as the source writes it — sometimes 'Norge' rather than 'NO'. Not an ISO code unless the README says so.",
          "example": "Norway"
        },
        {
          "key": "website",
          "type": "string",
          "nullable": false,
          "description": "Website URL for this record.",
          "example": "https://example.com"
        },
        {
          "key": "email",
          "type": "string",
          "nullable": false,
          "description": "Email address, as published by the source.",
          "example": "name@example.com"
        },
        {
          "key": "phone",
          "type": "string",
          "nullable": false,
          "description": "Telephone number as registered. A STRING, because leading zeros and formatting are significant.",
          "example": "example-value"
        },
        {
          "key": "isBankrupt",
          "type": "boolean",
          "nullable": false,
          "description": "Whether the entity is recorded as bankrupt.",
          "example": "true"
        },
        {
          "key": "isBeingWoundUp",
          "type": "boolean",
          "nullable": false,
          "description": "Whether the entity is recorded as being wound up or in liquidation.",
          "example": "true"
        },
        {
          "key": "isInGroup",
          "type": "boolean",
          "nullable": false,
          "description": "Whether the entity is recorded as part of a corporate group.",
          "example": "true"
        },
        {
          "key": "source",
          "type": "string",
          "nullable": false,
          "description": "Which upstream source produced this row.",
          "example": "example-source"
        },
        {
          "key": "registerUrl",
          "type": "string",
          "nullable": false,
          "description": "Link to this record on the issuing register, where one exists.",
          "example": "https://example.com/resource"
        }
      ],
      "inputs": [
        {
          "key": "name",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "All or part of a name, e.g. equinor, olje. Leave blank to walk the whole register."
        },
        {
          "key": "orgNumber",
          "type": "string",
          "required": false,
          "secret": false,
          "description": "Optional 9-digit Norwegian org number for an exact lookup."
        },
        {
          "key": "maxItems",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Stop after this many rows."
        },
        {
          "key": "maxPages",
          "type": "integer",
          "required": false,
          "secret": false,
          "description": "Stop after this many pages."
        }
      ]
    }
  ]
}