Integrations

Scraping API

Browserless-style HTTP endpoints for one-shot page work: cleaned markdown, screenshots, and raw HTML.

POST /scrape

Get clean content from a page. Every request needs Authorization: Bearer $MORROW_API_KEY and a url or html target.

POST /api/v1/scrape
curl -X POST http://localhost:3000/api/v1/scrape \
  -H "Authorization: Bearer $MORROW_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"url": "https://example.com", "format": "markdown"}'

format is one of:

  • markdown (default) — the page rendered as Markdown.
  • text — plain innerText.
  • article — Readability-based extraction: title/byline/excerpt/content/text plus a markdown rendering.

POST /screenshot

POST /api/v1/screenshot
curl -X POST http://localhost:3000/api/v1/screenshot \
  -H "Authorization: Bearer $MORROW_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"url": "https://example.com", "fullPage": true}' \
  -o screenshot.png

Also takes type (png or jpeg), quality, and selector to screenshot a single element.

POST /content

POST /api/v1/content
curl -X POST http://localhost:3000/api/v1/content \
  -H "Authorization: Bearer $MORROW_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"url": "https://example.com"}'

Returns the fully rendered HTML after the page loads.

Page options

All three endpoints accept the same set of page-behavior options:

  • gotoOptions{ waitUntil, timeout }, waitUntil one of load, domcontentloaded, networkidle, commit.
  • waitForSelector{ selector, timeout }.
  • waitForTimeout — fixed delay in ms (max 60000).
  • waitForFunction{ fn, timeout }, a JS expression to poll.
  • viewport{ width, height } for this request.
  • rejectResourceTypes / rejectRequestPattern — block resource types (e.g. image) or URL patterns from loading.
  • setExtraHTTPHeaders — extra request headers.
  • bestAttempt — return whatever loaded even if a wait condition times out, instead of erroring.

Scraping through a profile

Add "profile": "research-eu" to any of the three requests to run the scrape inside that profile's persistent, logged-in browser context instead of a throwaway one:

POST /api/v1/scrape
curl -X POST http://localhost:3000/api/v1/scrape \
  -H "Authorization: Bearer $MORROW_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"url": "https://example.com/account", "profile": "research-eu", "format": "markdown"}'

No cookie or session handoff required — if research-eu is already logged into the site, the scrape sees exactly what a signed-in visit would see. The profile auto-starts if it's stopped.

Full reference & codegen

Every request/response shape, including error codes, is documented at /api-docs — a themed Swagger UI backed by an OpenAPI 3 document at /api/v1/openapi.json. Point any OpenAPI client generator at it to produce a typed SDK in your language of choice.