One scrape gives you the page as Markdown and every link on it. Pass the links you want to render and you get a styled screenshot of each, framed and on a background, ready for a changelog, a docs page or a review. Both calls take the same key; nothing runs between them but your loop.

Check

Verified 2026-11-01: this recipe's last run passed against https://beta-api.b3os.org, label live-recorded (recorded from production), from commit 771a9508. The recipe harness runs it again, and a failed run takes this page out of the cookbook.

Run it

bash
START=https://beta.b3os.org/demo/curl -s https://beta-api.b3os.org/v1/vision/scrape \ -H "Authorization: Bearer $B3OS_API_KEY" \ -H "Content-Type: application/json" \ -d '{"url": "https://beta.b3os.org/demo/", "formats": ["markdown", "links"]}' \ | jq -r --arg s "$START" '.links[] | select(startswith($s) and . != $s)' | head -3 > pages.txtwhile read -r url; do jq -n --arg url "$url" '{url: $url, viewport: {width: 1440, height: 900}, style: {background: "midnight", frame: "browser-dark"}, format: "webp"}' \ | curl -s https://beta-api.b3os.org/v1/render/screenshots \ -H "Authorization: Bearer $B3OS_API_KEY" \ -H "Content-Type: application/json" -d @- \ | jq -r '.artifacts[0].url'done < pages.txt

The recipe's run.mjs is the same flow with checks. Each screenshot URL is signed and stops working at its url_expires_at; see render limits for what else a screenshot is held to.

Owner: Docs. Products: Docs, Vision, Render.

Output of the last green run

bash
$ node run.mjs# exit 0
Image 1 of 3 from the last green run of the recipe Scrape a page, then screenshot its links Image 2 of 3 from the last green run of the recipe Scrape a page, then screenshot its links Image 3 of 3 from the last green run of the recipe Scrape a page, then screenshot its links

The outputs this recipe publishes (its recipe.json publish.outputs), with workspace identifiers redacted. The run's stdout, stderr and other outputs are not published.

Captured 2026-11-01 from commit 771a9508 , label live-recorded (recorded from production). Case recipes/scrape-to-screenshots .

Ask a question... ⌘I