UK Entity API · v1
API Reference
Aggregates UK regulatory data from Companies House into a single normalised JSON response. Designed for AI agents performing due diligence and KYB checks on UK companies.
https://api.rotuli.co.uk/v1
Authorization: Bearer uk_live_your_key
API key prefixed with uk_live_ or uk_test_. Pass as: Authorization: Bearer uk_live_xxx
Responses follow the API's design guarantees: every field is always present (null or empty rather than omitted), enum values are stable and only ever added to, and an unavailable upstream yields a partial 200 with the failure recorded in sources_failed rather than an error.
/entity/{company_number}entity.show
uk_live_ for production or uk_test_ for sandbox) in the Authorization header.Parameters
Path parameters
company_numberstringrequiredQuery parameters
sourcesstringoptionalfreshstringoptionaldefault: falseinclude_resignedbooleanoptionaldefault: falseInclude resigned officers in officers.items (default false — active officers only). total_results, active_count and resigned_count always reflect the full officer set regardless of this flag.
Example request
curl "https://api.rotuli.co.uk/v1/entity/01234567" \
-H "Authorization: Bearer uk_live_your_key"Responses
Body
company_numberstringrequirednamestring | nullrequiredstatusstring | nullrequiredfetched_atstringdate-timerequiredsources_checkedstring[]requiredSources the API attempted to query for this request — the requested set (defaults to all available for your tier, or the ?sources= subset). A source that failed remains listed here and also appears in sources_failed; sources_failed is a subset of sources_checked. Successfully consulted sources = sources_checked minus the keys of sources_failed.
Array items — allowed values
chch_pscinsolvencychargesofficerssources_failedobjectrequiredSources that could not be queried, as an object keyed by source name with a human-readable failure reason. Empty object when every attempted source succeeded. Always present. Its keys are always a subset of sources_checked.
Object with dynamic string keys; each value is string.
chobjectrequiredCompanies House profile data
namestringoptionalcompany_numberstringoptionalstatusstringoptionaltypestring | nulloptionalincorporated_onstring | nulldateoptionaldissolved_onstring | nulldateoptionalsic_codesstring[]optionalregistered_office_addressobject | nulloptionalaccounts_overduebooleanoptionalconfirmation_overduebooleanoptionalhas_chargesbooleanoptionalhas_insolvency_historybooleanoptionalpostcodestring | nulloptionalch_fetched_atstringdate-timeoptionalch_pscobjectrequiredPersons with significant control
personsobject[]requiredArray items
namestring | nulloptionalnature_of_controlstring[]optionalnotified_onstring | nulldateoptionalnationalitystring | nulloptionalcountry_of_residencestring | nulloptionalinsolvencyobjectrequiredInsolvency proceedings
has_active_insolvencybooleanrequiredcasesobject[]requiredinsolvency_fetched_atstringdate-timerequiredchargesobjectrequiredCompanies House registered charges (security interests) against company assets. Always present; a tri-state status distinguishes "no charges" from "not requested / fetch failed".
statusstringrequired"none" = confirmed no charges recorded. "present" = one or more charges exist (satisfied charges are included as borrowing history). "unknown" = not requested, or the fetch failed (then charges also appears in sources_failed). Never "none" for a skipped or failed fetch.
Allowed values
nonepresentunknowntotal_countintegerrequiredsatisfied_countintegerrequiredpart_satisfied_countintegerrequiredoutstanding_countintegerrequiredDerived: total_count minus satisfied_count minus part_satisfied_count.
truncatedbooleanrequiredTrue when upstream pagination could not return every charge — items is shorter than total_count and must not be treated as a complete list.
itemsobject[]requiredArray items
charge_numberintegerrequiredstatusstringrequiredAllowed values
outstandingsatisfiedfully_satisfiedpart_satisfiedothercreated_onstring | nulldaterequireddelivered_onstring | nulldaterequiredsatisfied_onstring | nulldaterequiredpersons_entitledstring[]requiredclassificationstring | nullrequiredparticularsstring | nullrequiredcontains_floating_chargeboolean | nullrequiredFrom CH structured particulars. Null when Companies House did not supply the flag.
floating_charge_covers_allboolean | nullrequiredTrue when the floating charge covers the whole undertaking (debenture-style). Null when Companies House did not supply the flag.
assets_ceased_releasedstring | nullrequiredofficersobjectrequiredCompanies House officers (directors, secretaries, LLP members) for this company. Always present; a tri-state status distinguishes "no officers" from "not requested / fetch failed". Active officers only by default — pass ?include_resigned=true to add resigned officers to items; total_results, active_count and resigned_count are always full counts regardless of include_resigned.
statusstringrequired"none" = confirmed no officers recorded (only assertable once company existence is proven). "present" = one or more officers exist. "unknown" = not requested, or the fetch failed (then officers also appears in sources_failed). Never "none" for a skipped or failed fetch.
Allowed values
nonepresentunknowntotal_resultsintegerrequiredFull officer count Companies House holds, regardless of include_resigned.
active_countintegerrequiredresigned_countintegerrequiredtruncatedbooleanrequiredTrue when the fetched items fell short of total_results (defensive pagination against unreliable upstream paging).
itemsobject[]requiredActive officers only by default; resigned officers are included when include_resigned=true.
Array items
officer_idstring | nullrequiredStable CH officer identifier, parsed from the appointments link. Null when absent or unparseable.
namestring | nullrequiredofficer_rolestring | nullrequiredRaw Companies House officer_role value (28 upstream values, e.g. director, corporate-director, nominee-director, corporate-nominee-director, secretary, llp-member). Stored intact — callers should tolerate unknown values.
appointed_onstring | nulldaterequiredappointed_beforestring | nulldaterequiredSet instead of appointed_on for appointments predating Companies House's digital record (pre-1992).
is_pre_1992_appointmentbooleanrequiredresigned_onstring | nulldaterequiredNull means the officer is currently active.
nationalitystring | nullrequiredcountry_of_residencestring | nullrequireddate_of_birthobject | nullrequiredMonth and year only — the day is never returned (data minimisation, same treatment as PSC dates of birth).
monthintegerrequiredyearintegerrequiredformer_namesobject[]requiredArray items
forenamesstring | nullrequiredsurnamestring | nullrequiredidentificationobject | nullrequiredCorporate officers only. Null for natural persons.
legal_formstring | nullrequiredplace_registeredstring | nullrequiredregistration_numberstring | nullrequiredlegal_authoritystring | nullrequiredidentity_verificationobject | nullrequiredECCTA identity verification details. Null when the upstream record carries none.
identity_verified_onstring | nulldaterequiredauthorised_corporate_service_provider_namestring | nullrequiredanti_money_laundering_supervisory_bodiesstring[]requiredappointment_verification_statement_due_onstring | nulldaterequiredappointment_verification_statement_start_onstring | nulldaterequiredappointment_verification_statement_end_onstring | nulldaterequiredpreferred_namestring | nullrequireddirectorsobject[]requiredArray items
officer_idstring | nullrequirednamestring | nullrequiredappointed_onstring | nulldaterequiredresigned_onstring | nulldaterequiredrisk_signalsobjectoptionalRisk signals derived from the assembled profile. Paid feature: omitted entirely for free-tier keys (treat absence as "not entitled", not "no risk"), so it is not a required field.
scoreintegerrequiredPoints from confirmed (triggered) flags only, 0-100. A floor (lower bound) when score_is_floor is true.
score_is_floorbooleanrequiredWhen true, a required source was unavailable so score is a lower bound — a low value does not mean low risk.
potential_scoreintegerrequiredWorst-case ceiling: score plus the points of every indeterminate flag, capped at 100. Equals score when indeterminate is empty.
coveragestring[]requiredRisk-bearing sources actually consulted for this score. A source absent here was not assessed.
Array items — allowed values
chch_pscinsolvencychargesflagsobject[]requiredArray items
codestringrequiredAllowed values
INSOLVENCY_ACTIVECOMPANY_DISSOLVEDACCOUNTS_OVERDUECONFIRMATION_OVERDUECOMPANY_VERY_NEWNO_PSC_RECORDEDOUTSTANDING_CHARGESALL_ASSETS_CHARGEDseveritystringrequiredAllowed values
criticalwarninginfodescriptionstringrequiredtriggered_atstringdate-timerequiredindeterminateobject[]requiredFlags that could not be evaluated because a required source was unavailable.
Array items
codestringrequiredAllowed values
INSOLVENCY_ACTIVECOMPANY_DISSOLVEDACCOUNTS_OVERDUECONFIRMATION_OVERDUECOMPANY_VERY_NEWNO_PSC_RECORDEDOUTSTANDING_CHARGESALL_ASSETS_CHARGEDseveritystringrequiredAllowed values
criticalwarninginfosourcestringrequiredAllowed values
chch_pscinsolvencychargesreasonstringrequiredAllowed values
source_unavailablenot_requestedfeature_disabledBody
errorstringrequiredAllowed values
company_not_foundmessagestringrequiredBody
messagestringrequiredErrors overview.
errorsobjectrequiredA detailed description of each field that failed validation.
Object with dynamic string keys; each value is string[].
Response headers
Retry-AfterSeconds to wait before retrying.Body
errorstringrequiredAllowed values
upstream_capacitymessagestringrequired/entity/{company_number}/riskentity.risk
uk_live_ for production or uk_test_ for sandbox) in the Authorization header.Parameters
Path parameters
company_numberstringrequiredExample request
curl "https://api.rotuli.co.uk/v1/entity/01234567/risk" \
-H "Authorization: Bearer uk_live_your_key"Responses
Body
company_numberstringrequiredrisk_signalsobjectrequiredRisk signals derived from the assembled profile. Paid feature: omitted entirely for free-tier keys (treat absence as "not entitled", not "no risk"), so it is not a required field.
scoreintegerrequiredPoints from confirmed (triggered) flags only, 0-100. A floor (lower bound) when score_is_floor is true.
score_is_floorbooleanrequiredWhen true, a required source was unavailable so score is a lower bound — a low value does not mean low risk.
potential_scoreintegerrequiredWorst-case ceiling: score plus the points of every indeterminate flag, capped at 100. Equals score when indeterminate is empty.
coveragestring[]requiredRisk-bearing sources actually consulted for this score. A source absent here was not assessed.
Array items — allowed values
chch_pscinsolvencychargesflagsobject[]requiredArray items
codestringrequiredAllowed values
INSOLVENCY_ACTIVECOMPANY_DISSOLVEDACCOUNTS_OVERDUECONFIRMATION_OVERDUECOMPANY_VERY_NEWNO_PSC_RECORDEDOUTSTANDING_CHARGESALL_ASSETS_CHARGEDseveritystringrequiredAllowed values
criticalwarninginfodescriptionstringrequiredtriggered_atstringdate-timerequiredindeterminateobject[]requiredFlags that could not be evaluated because a required source was unavailable.
Array items
codestringrequiredAllowed values
INSOLVENCY_ACTIVECOMPANY_DISSOLVEDACCOUNTS_OVERDUECONFIRMATION_OVERDUECOMPANY_VERY_NEWNO_PSC_RECORDEDOUTSTANDING_CHARGESALL_ASSETS_CHARGEDseveritystringrequiredAllowed values
criticalwarninginfosourcestringrequiredAllowed values
chch_pscinsolvencychargesreasonstringrequiredAllowed values
source_unavailablenot_requestedfeature_disabledfetched_atstringdate-timerequiredBody
errorstringrequiredAllowed values
company_not_foundmessagestringrequiredBody
messagestringrequiredErrors overview.
errorsobjectrequiredA detailed description of each field that failed validation.
Object with dynamic string keys; each value is string[].
Response headers
Retry-AfterSeconds to wait before retrying.Body
errorstringrequiredAllowed values
upstream_capacitymessagestringrequired/searchsearch.search
uk_live_ for production or uk_test_ for sandbox) in the Authorization header.Parameters
Query parameters
qstringoptionaltypestringoptionalApply ?type= filter on raw items before normalisation
active_onlystringoptionaldefault: falseExample request
curl "https://api.rotuli.co.uk/v1/search?q=acme" \
-H "Authorization: Bearer uk_live_your_key"Responses
Body
querystringrequiredtotal_resultsintegerrequiredOption 1 — any
Option 2 — integer
Allowed values
0resultsany[]requiredBody
errorstringrequiredAllowed values
invalid_querymessagestringrequiredAllowed values
The q parameter is required and must be at least 2 characters.Response headers
Retry-AfterSeconds to wait before retrying.Body
errorstringrequiredAllowed values
upstream_unavailablemessagestringrequired