Webhooks

Create a webhook subscription

Create a webhook subscription to watch UK companies for changes.

Registrum checks each watched company roughly every 15 minutes. When a change is detected (e.g., status becomes dissolved, accounts go overdue), a signed POST is delivered to your URL.

Supported events:

  • status_change - company_status changes (e.g., active → dissolved)
  • accounts_overdue - accounts filing deadline missed
  • confirmation_overdue - confirmation statement deadline missed
  • directors_changed - a director is appointed or resigned (checked every 6 hours)
  • pscs_changed - a PSC is added, ceased, or their ECCTA verification status changes (every 6 hours)
  • compliance_risk_changed - the company's overall ECCTA risk rating changes, e.g., compliant → partial (every 6 hours). Requires Pro/Enterprise or the Compliance Monitoring add-on.

Webhook watch caps - the number of distinct companies you can watch across all your webhooks (existing + this request combined), by plan:

PlanCompanies watched
Free1
Web5
Pro25
Enterprise250

Exceeding your cap, or requesting compliance_risk_changed without Pro/Enterprise, returns 403 PLAN_REQUIRED. The Compliance Monitoring add-on raises your cap to 100 companies and unlocks compliance_risk_changed on any plan.

Payload delivered to your URL:

{
  "event": "company_updated",
  "company_number": "00445790",
  "changes": {
    "status_change": {"from": "active", "to": "dissolved"}
  },
  "triggered_at": "2026-03-11T10:00:00Z"
}

Verifying signatures: Every delivery includes an X-Registrum-Signature: sha256=<hex> header. Verify it with HMAC-SHA256 using the secret returned at creation time:

import hmac, hashlib
expected = "sha256=" + hmac.new(secret.encode(), request.body, hashlib.sha256).hexdigest()
assert hmac.compare_digest(expected, request.headers["X-Registrum-Signature"])

Note: The secret is returned once at creation - store it securely.

post/v1/webhooks

Request

  • Base URL: https://api.registrum.co.uk
  • URL: https://api.registrum.co.uk/v1/webhooks
  • Auth: API key in header X-API-Key

Request body

urlstring uri required

HTTPS URL that will receive POST requests when a watched company changes.

company_numbersstring[] required

List of Companies House company numbers to watch (1–50).

eventsstring[]

Event types to subscribe to. Valid values: ['accounts_overdue', 'company_updated', 'compliance_risk_changed', 'confirmation_overdue', 'directors_changed', 'pscs_changed', 'status_change']. Default: status_change + accounts_overdue.

Example request

{
  "company_numbers": [
    "00445790"
  ],
  "events": [
    "status_change",
    "accounts_overdue"
  ],
  "url": "https://yourapp.example.com/hooks/registrum"
}

Response

Webhook created. Response includes the signing secret - store it securely.

statusstring

'success' or 'error'

cachedboolean

True if this response was served from cache rather than fetched live

cache_age_secondsinteger nullable

How many seconds ago this data was fetched from Companies House (null if not cached)

fetched_atstring nullable

ISO 8601 instant (UTC) when this data was actually fetched from Companies House. Use this, not cache_age_seconds, to show a user when the data was last checked: an age is measured at the moment this response was produced, so anything that caches the response downstream will overstate freshness by however long it held it. This instant does not drift. Null when unknown - render nothing rather than a guessed date.

data_sourcestring

'live' - fetched from Companies House right now; 'cached' - served from local cache (data is recent, no upstream call needed); 'cached_rate_conserved' - served from cache because the CH API budget is above 70% utilisation; data may be up to 30 days old in this state

credits_usedinteger

Number of API credits consumed by this request

credits_remaininginteger nullable

API credits remaining this month (null in dev mode)

Example response

{
  "cache_age_seconds": 3421,
  "cached": true,
  "credits_remaining": 487,
  "credits_used": 1,
  "data": {
    "company_age_years": 78,
    "company_name": "TESCO PLC",
    "company_number": "00445790",
    "company_status": "active",
    "company_type": "plc"
  },
  "data_source": "cached",
  "status": "success"
}

Changes

No recorded changes to this operation across all 1 revision of this API.