Limits and errors
The exact rate limits, the billing gate, error codes, and per-domain check outcomes.
Rate limits
The cost-driving endpoints have fixed hourly limits, enforced per organization and per user (both must pass):
| Action | Per organization | Per user |
|---|---|---|
Single checks (POST /check) | 600 / hour | 200 / hour |
| Bulk check creation (incl. name-generator → check) | 60 / hour | 20 / hour |
| Name-generation jobs | 30 / hour | 10 / hour |
Exceeding a limit returns 429 TOO_MANY_REQUESTS; the window is
rolling — wait and retry. Note the bulk limit caps job creation, not
job size: one job with 100,000 domains is one unit against the limit.
Inside a bulk job, throughput is additionally governed by a per-organization concurrency cap (fair scheduling) — that one never errors, it just queues.
Billing gate
Endpoints that create chargeable work — single and bulk checks, saving
domains, name-generation jobs, creating watchers — are refused with
402 ORG_BLOCKED while your organization is blocked over unpaid
invoices. Reads keep working. See
Platform → Billing → Dunning.
Usage and free tiers
Usage is metered by the method that answered each check (index / DNS / RDAP / WHOIS), plus AI content checks, name-generation jobs, and active watchers. Each dimension has a free-tier allowance; the bulk-check dialog shows the free-vs-billable split before a job runs. Rates and allowances: pricing.
Error codes
Errors use the platform shape { "type", "msg", "fields?" }:
| HTTP | type | Meaning |
|---|---|---|
| 400 | INVALID_PAYLOAD | The body or query didn't parse / a required field is missing. |
| 400 | VALIDATION_FAILED | A field failed validation (domain without a dot, bad maxAge duration, keyword too short, cancelling a non-processing job…) — check fields. |
| 401 | UNAUTHORIZED | Token missing, expired, or wrong audience. |
| 402 | ORG_BLOCKED | Organization blocked for unpaid invoices. |
| 404 | NOT_FOUND | The job / watcher / hit doesn't exist — or belongs to another organization (deliberately indistinguishable). |
| 409 | CONFLICT | A watcher with this keyword already exists in the organization. |
| 429 | TOO_MANY_REQUESTS | A rate limit above was exceeded. |
| 500 | INTERNAL_ERROR | Unexpected server error — retry with backoff. |
Per-domain outcomes
Individual domains inside a check or bulk job never fail the request; they resolve to a status on the result itself:
| Status | Meaning |
|---|---|
registered / available | The verdict. |
error | Lookup failed — the result's error message says why (malformed response, no RDAP/WHOIS server for the TLD, network failure). |
timeout | The source didn't answer within the 5-second per-source timeout. |
rate_limited | The registry's WHOIS server rejected the query; re-check later. |
Status
Live platform status: status.norcube.com. Bulk jobs survive incidents by design — queued work is persistent, and items caught mid-processing by a restart are re-queued automatically within minutes.