Submit your list. We enrich them in the background, automatically managing the Companies House rate limit. Poll for results — no timeouts, no queue logic, no rate-limit errors on your side.
POST a JSON array of up to 500 UK company numbers. You get a batch_id back instantly — the job is queued and processing begins immediately.
POST /v1/batch
{
"company_numbers": [
"00445790",
"03547512",
...499 more
]
}Our processor runs every 10 seconds, enriching companies in batches and automatically pausing when the shared Companies House budget is near its limit. You do nothing.
What we manage for you
quota_exceeded statusGET the job status every few seconds. Results accumulate as companies are processed. Polling is always free — it never consumes credits. Results are kept for 7 days.
GET /v1/batch/{batch_id}
{
"status": "complete",
"completed": 500,
"results": [...],
"errors": {}
}The Companies House API allows 600 requests every 5 minutes per account — roughly 2 companies per second. If you need to enrich a list of 500 companies, you're looking at 4+ minutes of careful rate management just to avoid 429 errors.
With the Registrum batch API, you submit the list once and walk away. Our cache layer means many companies return instantly without touching Companies House at all. The rest are fetched at the correct pace, automatically. A 500-company batch typically completes in 30 seconds to 3 minutes depending on cache hit rate.
Upload your prospect list overnight. Wake up to 500 enriched company profiles — financials, director names, accounts status — ready for your CRM.
Screen large portfolios in a single API call. Get ownership chains, PSC data, and insolvency flags without writing any rate-limiting logic.
Enrich Companies House data as part of a nightly job. The async model fits naturally into any pipeline that already polls for results.
Submit a batch and poll until complete — in under 20 lines of Python:
import time, requests
API_KEY = "reg_live_..."
BASE = "https://api.registrum.co.uk/v1"
HEADERS = {"X-API-Key": API_KEY}
company_numbers = ["00445790", "03547512", "SC123456"] # up to 500
# 1. Submit
r = requests.post(f"{BASE}/batch",
json={"company_numbers": company_numbers},
headers=HEADERS)
batch_id = r.json()["batch_id"]
print(f"Queued: {batch_id}")
# 2. Poll until done
while True:
r = requests.get(f"{BASE}/batch/{batch_id}", headers=HEADERS)
job = r.json()
print(f"{job['status']} — {job['completed_companies']}/{job['total_companies']}")
if job["status"] in ("complete", "partial", "failed", "quota_exceeded"):
break
time.sleep(5)
# 3. Use results
for item in job["results"]:
print(item["company_number"], item["data"]["company_name"])
for number, error in job["errors"].items():
print(number, "ERROR:", error)Polling the GET endpoint is always free — it does not consume API credits. Credits are charged per company processed (1 credit each).
| Status | Meaning | Terminal? |
|---|---|---|
| queued | Job accepted, waiting to start | No |
| processing | Actively enriching companies | No |
| complete | All companies enriched successfully | Yes |
| partial | Finished — some successes, some errors (see errors field) | Yes |
| quota_exceeded | Monthly credit limit hit mid-batch; remaining companies in errors | Yes |
| failed | All companies errored (upstream issue) | Yes |
Free tier includes 50 calls/month — enough to test the batch endpoint end-to-end. Pro and Enterprise plans unlock higher quotas for production workloads.