What Snagajob scraping has to handle
Keyword search runs at snagajob.com/search/q- followed by the term with plus signs for spaces. Browse pages sit under snagajob.com/find-jobs/ with short facet prefixes: w- for a city and state, i- for an industry, x- for an employment type, plus t- and c- segments that combine with commas. Paging is driven by an opaque continuation token rather than a page number, and the search response reports both the current page size and a separate full match count. Deep paging is a sequence you walk, not a page number you can jump to, and crawl planning has to respect that.
The robots.txt file disallows /api/, the apply and registration paths, member and profile paths, and every paginated or query-string search form, including /search?q= and the combined find-jobs facet patterns. We read it and follow it, so coverage is assembled from posting pages and permitted entry points rather than from disallowed search URLs.
Postings expire but stay addressable. The record keeps an expiry flag alongside a validThrough date, so a closed listing can still be fetched and dated. That is exactly what makes a historical series possible, and we keep the flag in the output instead of quietly dropping the row.
The site sits behind Cloudflare. A plain HTTP request to snagajob.com returns a managed challenge page instead of content. We render pages properly and run at a measured rate. We do not defeat challenges, solve CAPTCHAs or disguise our traffic, and we will say where that limits coverage rather than promise around it.