[
  {
    "id": "books",
    "url": "https://books.toscrape.com/",
    "mode": "plain",
    "validation": {
      "text": "Tipping the Velvet"
    },
    "direct_failure_expected": false,
    "permission": "Purpose-built scraper testing site"
  },
  {
    "id": "books-page-2",
    "url": "https://books.toscrape.com/catalogue/page-2.html",
    "mode": "plain",
    "validation": {
      "text": "In Her Wake"
    },
    "direct_failure_expected": false,
    "permission": "Purpose-built scraper testing site"
  },
  {
    "id": "quotes",
    "url": "https://quotes.toscrape.com/",
    "mode": "plain",
    "validation": {
      "text": "Albert Einstein"
    },
    "direct_failure_expected": false,
    "permission": "Purpose-built scraper testing site"
  },
  {
    "id": "quotes-page-2",
    "url": "https://quotes.toscrape.com/page/2/",
    "mode": "plain",
    "validation": {
      "text": "Marilyn Monroe"
    },
    "direct_failure_expected": false,
    "permission": "Purpose-built scraper testing site"
  },
  {
    "id": "quotes-js",
    "url": "https://quotes.toscrape.com/js/",
    "mode": "js",
    "validation": {
      "text": "Albert Einstein"
    },
    "direct_failure_expected": false,
    "permission": "Purpose-built scraper testing site",
    "direct_validation": {
      "text": "Quotes to Scrape"
    },
    "note": "Direct fetch checks the HTML shell only; vendor JS runs must contain a rendered author."
  },
  {
    "id": "course-ecommerce",
    "url": "https://www.scrapingcourse.com/ecommerce/",
    "mode": "plain",
    "validation": {
      "text": "Abominable Hoodie"
    },
    "direct_failure_expected": false,
    "permission": "Purpose-built scraper testing site"
  },
  {
    "id": "course-infinite",
    "url": "https://www.scrapingcourse.com/infinite-scrolling",
    "mode": "js",
    "validation": {
      "text": "Chaz Kangeroo Hoodie"
    },
    "direct_failure_expected": false,
    "permission": "Purpose-built scraper testing site"
  },
  {
    "id": "course-load-more",
    "url": "https://www.scrapingcourse.com/button-click",
    "mode": "js",
    "validation": {
      "text": "Chaz Kangeroo Hoodie"
    },
    "direct_failure_expected": false,
    "permission": "Purpose-built scraper testing site"
  },
  {
    "id": "course-cloudflare",
    "url": "https://www.scrapingcourse.com/cloudflare-challenge",
    "mode": "js",
    "validation": {
      "text": "Chaz Kangeroo Hoodie"
    },
    "direct_failure_expected": true,
    "permission": "Purpose-built scraper testing site",
    "challenge": true
  },
  {
    "id": "course-antibot",
    "url": "https://www.scrapingcourse.com/antibot-challenge",
    "mode": "js",
    "validation": {
      "text": "Chaz Kangeroo Hoodie"
    },
    "direct_failure_expected": true,
    "permission": "Purpose-built scraper testing site",
    "challenge": true
  },
  {
    "id": "wikipedia",
    "url": "https://en.wikipedia.org/wiki/Web_scraping",
    "mode": "plain",
    "validation": {
      "text": "Web scraping"
    },
    "direct_failure_expected": false,
    "permission": "Public static page; robots.txt permits this path for generic agents"
  },
  {
    "id": "httpbin",
    "url": "https://httpbin.org/html",
    "mode": "plain",
    "validation": {
      "text": "Herman Melville - Moby-Dick"
    },
    "direct_failure_expected": false,
    "permission": "Public static page; robots.txt permits this path for generic agents"
  }
]
