INVALID_URL[01]

INVALID_URL

The url was missing or unparseable, used a scheme other than http(s), or pointed at a private or internal host.

Code · HTTP status · Retryable?
INVALID_URL[400][No]

What this means

[02]

Onto returns INVALID_URL when it can't use the url you sent. The body wasn't JSON, the `url` field was missing, or its value couldn't be parsed as a URL. It also fires when the URL isn't http or https, or points at a private or internal address. On /v1/batch a bad body is INVALID_REQUEST instead. Failed requests are refunded.

When you'll see it

[03]

HTTP 400. Body always includes code: "INVALID_URL". Branch on code, never on the human-readable message — wording can change without notice; the code is the stable contract.

Example response

[04]
example response[json]
{
  "status": "error",
  "code": "INVALID_URL",
  "message": "\"url\" field is required"
}

How to handle

[05]

Check the URL before you send it. It needs an `http://` or `https://` scheme and a public host, and `new URL(...)` must parse it. Most of the time the bug is a missing scheme. Retrying the same value won't help.

Suggested handling in a Node client:

if (data.code === 'INVALID_URL') {
  // Surface as a 400 to your own client — never retry.
  return res.status(400).json({ error: 'Provide a valid http(s) URL' });
}
Code · Status · What it means
INVALID_REQUEST[HTTP 400]

The /v1/batch body wasn't JSON, had neither urls nor site, or listed no valid URLs.

URL_NOT_FOUND[HTTP 404]

The target URL returned 404, or its hostname doesn't resolve.

See the full error index for the complete catalog with the handling switch statement covering every code at once.