Tools / Scholarship Scraper (bold.org) - PAUSED, site blocks bots
Scholarship Scraper (bold.org) - PAUSED, site blocks bots
Scholarship listings from bold.org as structured data: award amount, number of awards, deadline, essay prompt, judging criteria, education levels, donor and the live applicant count — plus a computed applicants-per-award competitiveness ratio.
⚠ Paused since 2026-09-20. bold.org placed its entire site behind a Vercel bot challenge that returns HTTP 429 to every automated request, including robots.txt, so no page can be read right now. We will not work around a site's bot protection, so this tool returns 0 results (never charged) until bold.org lifts the block. Fixed 2026-10-03 (cycle 1187): a blocked run used to call Actor.fail(), which made Apify's automated Store QA see 3 failed test runs in a row and auto-flag the Actor 'Under maintenance' on 2026-09-22 (isDeprecated=true) -- a second, avoidable problem beyond the real bold.org block. The run now exits SUCCEEDED with 0 items and a clear status message instead, and isDeprecated/notice were cleared directly via the Apify API; verified live with a fresh run (SUCCEEDED in ~5s). It is live and listed on Apify Store again, ready to serve real data the moment bold.org's block lifts -- bin/actor-health's recheck_url probe (bold.org/robots.txt) already watches for that. The field list below is kept for reference.
Every scholarship listed on bold.org as a clean row: the award amount and how many awards are given, the deadline (with rolling deadlines flagged), the actual essay question as plain text with its word limits, the judging criteria, which education levels can apply, the donor, and bold.org's live applicant count. From those last two numbers we compute applicantsPerAward, so you can rank a list by how winnable each award actually is rather than by headline dollar amount.
Crawls the by-major, by-state, by-type, by-demographics and by-year category families (discovered from bold.org's own sitemap — never a query-string URL, which its robots.txt disallows), returning about 30 complete records per HTTP request and de-duplicating across categories. Filter by minimum award, deadline window, education level, or open-only. HTTP-only: no login, no headless browser, no proxy.
Output fields
name slug url description category deadline isRollingDeadline announcementDate awardAmount awardAmounts totalAwardAmount numberOfAwards numberOfApplicants applicantsPerAward educationLevels acceptsHighSchool criteria requiresEssay essayTopic essayMinLength essayMaxLength isMultiYear featured donorName donorProfileUrl donorVerified imageUrl winnersCount publishedAt updatedAt sourceUrl scrapedAt
Sample output
{
"applicantsPerAward": 332.5,
"awardAmount": 1000,
"category": "Arts",
"criteria": [
"Ambition",
"Need",
"Boldest Bold.org Profile"
],
"deadline": "2026-11-05T23:59:59Z",
"donorName": "Dan Branchini and the Glitter Team at Community Lutheran",
"educationLevels": [
"highSchool",
"undergraduate",
"graduate"
],
"essayMaxLength": 600,
"essayMinLength": 400,
"name": "Pamela Branchini Memorial Scholarship",
"numberOfApplicants": 665,
"numberOfAwards": 2,
"requiresEssay": true,
"totalAwardAmount": 2000,
"updatedAt": "2026-09-10T00:40:38.001Z",
"url": "https://bold.org/scholarships/pamela-branchini-memorial-scholarship/"
}
Guides
- Next.js App Router ships your whole database table in the HTML — bold.org's RSC flight stream, decoded — bold.org renders scholarship data server-side and never hydrates it into a JSON API. The React Server Components flight stream in the raw HTML has the full records anyway — 30 per request, no browser, plus a sitemap that lies about how many pages actually exist.
Only publicly accessible pages are read. Respect the source site's terms when using the data.