Errors

All errors return a JSON body with error and status fields:

{
  "error": "Description of what went wrong",
  "status": 400
}

Error Codes

400 — Bad Request

ErrorCauseFix
Invalid JSON bodyRequest body isn't valid JSONCheck your JSON syntax
Missing or invalid 'url' fieldNo url in the body, or it's not a stringSend {"url": "https://..."}
Invalid URL formatThe URL can't be parsedUse a full URL with https://
URL exceeds maximum length of 2048URL is longer than 2048 charactersShorten the URL or use a redirect
Unsupported URL scheme: <scheme>:URL uses a scheme other than http: or https:Only http:// and https:// are supported
URL targets a private IPv4 address / URL resolves to a private hostURL points to a private, loopback, or link-local address (e.g. localhost, 127.0.0.1, 10.x, 192.168.x, 169.254.x)Use a publicly reachable URL
DNS resolution failedThe hostname could not be resolvedVerify the domain exists and is spelled correctly
Cannot revoke the key you are currently usingTrying to delete your own active keyUse a different key to authenticate

401 — Unauthorized

ErrorCauseFix
Missing or invalid Authorization headerNo Authorization header or wrong formatAdd Authorization: Bearer YOUR_KEY
API key is emptyHeader present but key is blankInclude the key after Bearer
Invalid API keyKey doesn't match any active keyCheck the key, or it may have been revoked

404 — Not Found

ErrorCauseFix
Key not found or already revokedKey ID doesn't exist or is already revokedCheck the key ID
Page not found at the given URLThe target URL returned a 404Verify the URL is correct

422 — Unprocessable

ErrorCauseFix
Domain not found. Check the URL.DNS resolution failedVerify the domain exists

429 — Rate Limited

ErrorCauseFix
Monthly usage limit exceededYou've hit your plan's monthly page limitUpgrade your plan or wait for the next billing cycle
Rate limited by CloudflareToo many concurrent scraping requestsWait a few seconds and retry

The 429 response includes extra fields:

{
  "error": "Monthly usage limit exceeded",
  "status": 429,
  "limit": 50,
  "usage": 50,
  "plan": "free"
}

502 — Bad Gateway

ErrorCauseFix
Connection refused by the target serverTarget server blocked the connectionThe site may block automated access
SSL/TLS error connecting to the target serverSSL certificate issue on targetThe target site has a certificate problem
Scraping failed: Rate limiter timeout: too many concurrent requestsOur upstream scraping provider is saturated and we couldn't get a slot within 30sRetry after a short delay — this is rare

504 — Gateway Timeout

ErrorCauseFix
Page took too long to loadThe target page didn't finish loading in timeThe site may be very slow or heavily JS-dependent. Try again — we retry automatically.

Automatic Retries

The API automatically retries on transient errors (408, 429, 500, 502, 503, 504) with exponential backoff:

  • Attempt 1: Immediate
  • Attempt 2: After 1 second
  • Attempt 3: After 3 seconds

If all retries fail, the error message includes (retried) to indicate that retries were attempted. You generally don't need to implement your own retry logic for scraping failures.

Thin Content Warning

When a page returns fewer than 200 words, the response includes a warning field:

{
  "markdown": "...",
  "metadata": { ... },
  "warning": "Content appears thin (under 200 words). The page may require JavaScript rendering or have limited content."
}

This is not an error — you still get the content. It's a signal that the extraction may be incomplete, often because:

  • The page is behind a login wall
  • The page uses heavy client-side rendering
  • The page genuinely has little content