Gotchas
The formats field lives under scrapeOptions.formats, not at the top level, and defaults to ["markdown"] when scrapeOptions is omitted. Set scrapeOptions.formats explicitly (e.g. ["markdown","html"]) to get HTML in results.
POST /extract is asynchronous and returns a job id immediately. Poll [GET /extract/{id}](/firecrawl/get-extract-status) until status leaves processing — it becomes completed (result in data), failed, or cancelled. Fetch data before expiresAt: completed results expire.