Error reference
Every error uses RFC 7807 problem+json, and the type field links straight to the entry below. All 46 errors are listed here.
{
"type": "https://www.ipaddresstoday.com/docs/errors#invalid-ip",
"title": "Invalid IP address",
"status": 400,
"detail": "'999.1.1.1' is not a valid IPv4 or IPv6 address."
}Lookups
Returned by the lookup and batch endpoints.
invalid-ip400Invalid IP addressThe value in the path is not a valid IPv4 or IPv6 address.
Fix: Send a literal address such as 8.8.8.8 or 2001:4860:4860::8888. Hostnames are not resolved — resolve them yourself first.
non-routable-ip400Non-routable IP addressThe address is private, loopback, link-local, or otherwise reserved, so it has no public geolocation.
Fix: Only look up publicly routable addresses. Use the ipInfo fields to classify an address before looking it up.
unsupported-lang400Unsupported languageThe lang parameter is not one we support.
Fix: Use one of: en, de, es, fr, ja, pt-BR, ru, zh-CN.
invalid-callback400Invalid JSONP callbackformat=jsonp was requested without a callback, or the callback is not a valid JavaScript identifier.
Fix: Pass callback=myFunction using letters, digits, underscore, or dollar sign, up to 64 characters.
empty-batch400No addresses suppliedA batch request arrived with an empty or missing ips array.
Fix: Send a body of the form {"ips": ["8.8.8.8", "1.1.1.1"]}.
batch-too-large400Too many addressesA batch may contain at most 100 addresses.
Fix: Split the work into chunks of 100 or fewer.
Authentication and keys
Returned when a key is missing, wrong, or lacks permission.
api-key-required401API key requiredThe endpoint requires a key and none was supplied.
Fix: Send your key as the X-API-Key header, an Authorization: Bearer header, or a ?key= query parameter.
missing-scope403Missing scopeThe key is valid but does not carry the scope this endpoint needs.
Fix: Create or rotate the key with the required scope — lookup.read for lookups, batch.lookup for batch.
plan-required403Paid plan requiredThe feature is not available on the Free plan.
Fix: Upgrade from the billing page in your dashboard.
invalid-scope400Invalid scopeA scope named when creating a key is not one we recognise.
Fix: Valid scopes are lookup.read, batch.lookup, usage.read, and account.read.
invalid-label400Invalid labelThe key label is empty or too long.
Fix: Use a short descriptive label, for example “production web app”.
invalid-expiration400Invalid expiryThe requested expiry is out of range.
Fix: Choose between 1 and 365 days, or omit it for a key that does not expire.
invalid-allowed-ip400Invalid IP restrictionAn entry in the key's IP allow-list is not a valid address or CIDR block.
Fix: Use addresses or CIDR blocks such as 203.0.113.4 or 203.0.113.0/24.
key-limit-reached409Key limit reachedYour plan's maximum number of API keys already exists.
Fix: Revoke a key you no longer use, or upgrade for a higher limit.
key-not-found404Key not foundNo key with that id belongs to your account.
Fix: List your keys to get the current ids — a revoked key is gone for good.
Rate limits and abuse
Returned when you exceed a limit or are blocked.
rate-limited429Too many requestsThe keyless limit of 45 requests per minute was exceeded, or a wider per-network limit was hit.
Fix: Back off until the time in the Retry-After header, or use an API key for a much higher allowance.
quota-exceeded429Monthly quota exceededYour plan's monthly request quota is exhausted. Requests beyond quota are refused, never billed.
Fix: Wait for the reset shown in X-RateLimit-Reset, or upgrade your plan.
abuse-blocked403Access blockedThe address or network has been blocked for abuse.
Fix: Contact support if you believe this is a mistake.
Accounts and sign-in
Returned by the authentication endpoints.
invalid-credentials401Invalid credentialsThe email or password is incorrect.
Fix: Check both, or sign in with an emailed code instead.
invalid-email400Invalid emailThe email address is not well-formed.
Fix: Supply a valid address.
email-taken409Email already registeredAn account with this email already exists.
Fix: Sign in instead, or use the emailed sign-in code if you have forgotten the password.
weak-password400Password too shortPasswords must be at least 8 characters.
Fix: Choose a longer password.
account-suspended403Account suspendedThis account has been suspended.
Fix: Contact support.
invalid-refresh-token401Invalid refresh tokenThe refresh token is expired, revoked, or unknown.
Fix: Sign in again to get a new token pair.
invalid-otp401Invalid or expired sign-in codeThe emailed code is wrong, expired after 10 minutes, or was attempted too many times.
Fix: Request a new code.
invalid-mfa-code401Invalid two-factor codeThe authenticator or recovery code did not match.
Fix: Check your device clock is accurate, or use a recovery code.
invalid-mfa-ticket401Invalid or expired two-factor ticketThe short-lived ticket issued after the password step has expired.
Fix: Sign in again with your password to get a new ticket.
mfa-already-enabled409Two-factor already enabledYou tried to enrol while two-factor is already active.
Fix: Disable it first if you want to enrol a new device.
invalid-current-password400Current password incorrectThe current password did not match, or the account has no password because it was created through Google.
Fix: Check the password, or use the reset flow for OAuth-only accounts.
invalid-verification-token400Invalid or expired verification linkThe email verification link is wrong, already used, or older than 24 hours.
Fix: Request a fresh link from your dashboard.
already-verified409Email already verifiedYou asked to resend verification for an address that is already confirmed.
Fix: No action needed.
invalid-google-token401Invalid Google tokenThe Google credential could not be verified.
Fix: Try signing in with Google again.
google-not-configured503Google sign-in not configuredThe server has no Google client id configured.
Fix: Use email and password, or an emailed sign-in code.
session-not-found404Session not foundNo active session with that id belongs to your account.
Fix: List your sessions again — it may already have been revoked.
user-not-found404User not foundNo account matches the identifier supplied.
Fix: Check the id or email.
Billing
Returned by the billing and subscription endpoints.
billing-not-configured503Billing not configuredPayments are not enabled on this deployment.
Fix: Contact support if you are trying to subscribe.
billing-upstream-error502Payment provider errorStripe returned an error we could not handle.
Fix: Try again shortly. If it persists, contact support with the time of the attempt.
no-billing-account409No billing accountYou opened the billing portal before subscribing to anything.
Fix: Start a subscription first.
unknown-plan400Unknown planThe plan requested at checkout does not exist.
Fix: Choose a plan from the pricing page.
invalid-webhook-signature400Invalid webhook signatureA request to our Stripe webhook failed signature verification.
Fix: This endpoint is for Stripe only — you should not be calling it.
Support and administration
Returned by support tickets and admin endpoints.
invalid-ticket400Invalid ticketThe support ticket is missing a subject or message, or the field is too long.
Fix: Supply both a subject and a message body.
invalid-abuse-rule400Invalid abuse ruleAn admin abuse rule is malformed.
Fix: Use a valid IP, CIDR block, or AS number.
cannot-suspend409Cannot suspendThe account cannot be suspended — for example, it is your own or another admin's.
Fix: Admins cannot suspend themselves or other admins.
cannot-unsuspend409Cannot unsuspendThe account is not currently suspended.
Fix: No action needed.
cannot-promote409Cannot promoteThe account cannot be promoted to admin.
Fix: The account may already be an admin.
Hit something not listed here? Tell us — an undocumented error is a bug in these docs.