Skip to main content

Console

Capture the JavaScript console output a page produces as it loads — errors, warnings and uncaught exceptions. Useful for monitoring third-party scripts, catching regressions and health-checking your own pages.

It uses no AI, and costs 1 credit per call. See Credits.

POST/console

Capture console messages

Body parameters

  • Name
    url
    Type
    string
    Required
    Required
    Description
    The absolute URL of the page to process. Rendered with headless Chrome, so JavaScript runs and redirects are followed. It must not include a username or password (https://user:pass@example.com).
  • Name
    page_options
    Type
    object
    Description
    Wait for the page, and remove ads, cookie banners or your own elements from it before it is read — gone from this result, not merely hidden. See Page options.
  • Name
    residential
    Type
    boolean
    Description
    Fetch the page from a residential exit — an address on a home broadband line rather than one in a datacentre. Reach for it when a site serves you less than it serves a browser, or nothing at all. Defaults to false. Adds 25 credits per page fetch on top of what the operation costs, and its results are kept separate from the ordinary ones.
  • Name
    report_to
    Type
    string
    Description
    Webhook URL — an http or https address URLpipe POSTs the result to when it's ready. Optional: without it we deliver to your project's default endpoint if it has one, and otherwise send no webhook at all — the result still waits for you at GET /result/:token. A value we cannot deliver to returns 422. Ignored on a sync=true request. Deliveries can be signed so your endpoint can verify they came from us.
  • Name
    sync
    Type
    boolean
    Description
    Process the request synchronously, returning the result inline in the response. Defaults to false (async: return a token now, and either receive the result at a webhook or fetch it with GET /result/:token). See Async & sync modes for the full contract.
  • Name
    max_age
    Type
    string | integer
    Description
    How fresh a cached result must be to be accepted. Either an integer number of seconds (3600) or a duration string of the form "<number> <unit>" — units s/min/h/d/w (e.g. "2 hours", "3 days", "30m"). Defaults to 7 days, clamped to a max of 30 days; 0 always bypasses the cache. See Caching for all accepted units.
  • Name
    labels
    Type
    object
    Description
    Your own keys to find and account for this request by — a client, a project, a campaign: {"client": "acme"}. Returned with the result, in the webhook and in the X-Labels header, and your dashboard filters history and totals credits by them. Up to 16 keys; string values. See Labels.

Response

Content type application/json — an array of message objects. An empty array [] means the page produced no errors or warnings.

Message fields

  • Name
    type
    Type
    string
    Description
    One of error, warning or exception.
  • Name
    text
    Type
    string
    Description
    The message text.
POST/console
curl -X POST https://urlpipe.dev/console \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"url": "https://example.com"}'
Response
[
  {
    "type": "error",
    "text": "Cart failed to load: TypeError: Failed to fetch"
  },
  {
    "type": "warning",
    "text": "[analytics] consent not given, events are queued"
  },
  {
    "type": "exception",
    "text": "ReferenceError: bar is not defined"
  }
]

Message types

  • Name
    error
    Description
    From console.error() calls.
  • Name
    warning
    Description
    From console.warn() calls.
  • Name
    exception
    Description
    Uncaught JavaScript exceptions, and promise rejections nothing handled. Plain console.log() output is not captured.

How it works

URLpipe loads the page in a headless browser, listens for console errors, warnings and uncaught exceptions, then waits briefly after the page's network activity settles so asynchronous scripts have time to run and report. All captured messages are returned together.

Messages come from the page itself. Scripts inside embedded frames — ads, widgets, third-party players — log to their own console, so what you get back is your page's output rather than everyone else's.

Responses

Whatever the status, the response carries metadata headers: the result token, whether it was served from cache and how old that result is, how long we took, what it cost in credits, and the allowance you have left.

Status
When
Body
200 OK
The request succeeded.
Sync: the result, in this endpoint's format (see Response above). Async: a job token and the request's labels — { "token": "…", "status": "accepted", "labels": {} }.
422 Unprocessable Entity
The analysis failed, or a parameter was invalid (a bad max_age, a screenshot_options value out of range, labels that break the rules, or a report_to we will not deliver to).
{ "error": "<message>" }
429 Too Many Requests
Three causes, told apart by the error field: concurrency_limit (too many of your requests already running), rate_limited (sending too fast), or quota_exceeded (Free plan only — out of credits with no card on file to bill the extra to, and checked only on a cache miss; a paid plan keeps serving at the overage rate and is never refused for credits).
All three carry "error" and "message". Extra fields: concurrency_limit → "limit", "running" · rate_limited → "retry_after" · quota_exceeded → "limit", "used", "needed", "resets_at".
504 Gateway Timeout
Sync only: the analysis didn't finish within 60s. It keeps running — fetch it via GET /result/:token.
{ "error": "processing_timeout", "token": "…" }
401 Unauthorized
Missing or invalid API key.
{ "error": "invalid_api_key", "message": "…" }

Try it live — no API key needed

Run this endpoint against any URL right in your browser.

Open tool