Step-by-step tutorial and OpenClaw-ready skill for extracting booking availability from CAPTCHA-heavy pages (like Calendly) using Firecrawl.
- A practical flow that worked in production testing
- A reusable OpenClaw skill folder with scripts and examples
- A Node.js CLI script with retries, timeout controls, debug logging, and query prompts
- Guidance for wiring OpenCloser endpoints (
/api/convertCalLinkToJSON,/api/LinkToText)
You can save 10% on Firecrawl with this link:
https://firecrawl.link/openclawdev
Use a two-step flow:
POST /v2/scrapeto load the booking page and get ascrapeIdPOST /v2/scrape/{scrapeId}/interactwith a deterministic prompt to extract times
Why: plain scrape often shows CAPTCHA/reCAPTCHA text but not reliable slots. Interact can click and read rendered UI.
- Interact timeout after successful scrape
- Output format drift from strict
YYYY-MM-DD | times - Runtime cap too low at 20s for real pages
- Increase max runtime to 45s+
- Split timeouts:
- scrape timeout: ~20s
- interact timeout: ~30s
- Add retry for interact timeout with simpler fallback prompt
- Add parser fallback for alternate response shapes
- Clone this repo in your workspace
- Configure environment:
export FIRECRAWL_API_KEY="fc-..."- Run script:
node skills/firecrawl-calendly-bypass/scripts/fc-calendly-query.js \
--url "https://calendly.com/mike-opencloser/30min" \
--max-runtime-ms 45000git clone https://github.com/OpenCloserOrg/BypassCaptchaForBots.git
cd BypassCaptchaForBots
export FIRECRAWL_API_KEY="fc-..."
node skills/firecrawl-calendly-bypass/scripts/fc-calendly-query.js --url "https://calendly.com/mike-opencloser/30min"Use a custom extraction instruction:
node skills/firecrawl-calendly-bypass/scripts/fc-calendly-query.js \
--url "https://calendly.com/mike-opencloser/30min" \
--query "From the visible booking calendar, list next 7 days with times." \
--max-runtime-ms 60000 --scrape-timeout-ms 20000 --interact-timeout-ms 30000 --retries 1Already included:
dist/firecrawl-calendly-bypass.skill
You can import that skill package directly into supported OpenClaw skill flows.
Recommended endpoint behavior:
-
/api/convertCalLinkToJSON?url=<booking-url>&internalKey=...- scrape
- interact
- parse output
- return structured JSON
-
/api/LinkToText?url=<booking-url>&internalKey=...- scrape markdown only
- return readable text + metadata
See example implementation:
skills/firecrawl-calendly-bypass/examples/example-opencloser-endpoint.js
- Do not commit API keys or internal keys
- Pass secrets via env vars
- Rotate keys that were ever pasted into public logs/chats
- Explain scrape vs interact
- Show timeout split and retries
- Run CLI script with logs
- Show JSON response with next slots
- Show fallback parser behavior
- Show endpoint integration in OpenCloser