INVALID_URL
The url was missing or unparseable, used a scheme other than http(s), or pointed at a private or internal host.
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]{
"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' });
}The /v1/batch body wasn't JSON, had neither urls nor site, or listed no valid URLs.
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.