Business Verification (KYB)
CAC company verification through NIBSS CIV: status, registration, directors, shareholders, share capital and winding-up.
Verifies a company or business name on the Corporate Affairs Commission (CAC) register through NIBSS CIV: registration status, type and date, and optionally directors, shareholders, share capital, affiliates and winding-up records.
- Availability
- Sandbox and live
- Indicative price
- ₦500.00 per completed check
- Consent
- Not needed: CAC records are a public registry (
public_registry). - MCP tool
verify_business
Body parameters
rc_numberstringCAC RC or BN number, e.g. RC1234567. At least 3 characters.
tinstringAt least 5 characters.
company_namestringAt least 2 characters.
includearray of stringsEach one of:
directors,shareholders,share_capital,line_of_business,affiliates,status_report,winding_up,certificate. Defaults to["directors","shareholders","share_capital","status_report"].reasonstringPurpose of the check. One of the 38 NIMC purpose codes. See the purpose code list.
matchobjectmatch.company_namestringAt least 2 characters.
- Provide exactly one of
rc_number,tinorcompany_name. Live CAC lookups needrc_numberortin;company_namesearch is sandbox only. company_typeis optional: Speedmap reads it from the RC prefix (RCcompany,BNbusiness name,ITincorporated trustee,LP/LLPpartnerships). Send it when the number has no prefix.reasonis optional for business checks.matchistruewhen the company isACTIVEand, if you sentmatch.company_name, the names agree (case, punctuation and suffixes such as LIMITED, LTD and PLC are ignored).- The sections in
includedecide what the full record (data) contains.
Send an Idempotency-Key header so a retried request is never billed twice. See Idempotency.
curl -X POST http://localhost:4000/v1/verify/business \
-H "Authorization: Bearer sk_test_..." \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"rc_number": "RC1234567",
"include": [
"directors",
"shareholders",
"share_capital",
"status_report"
]
}'A completed check returns 200 with a verification object. status is verified or not_found. If the provider has not answered in time you get 202 with status: "pending"; retrieve it later or wait for the verification.completed webhook.
{
"reference_id": "spm_8171f3a87cbe221341f7185f",
"object": "verification",
"product": "business",
"method": "cac_rc",
"status": "verified",
"match": true,
"field_matches": null,
"field_confidence": null,
"mode": "sandbox",
"reason": null,
"subject": null,
"summary": {
"company_name": "SPEEDILY SERVICES LIMITED",
"rc_number": "RC1234567",
"status": "ACTIVE",
"active": true,
"type": "Private Company Limited by Shares",
"registered_at": "2016-05-12",
"state": "FCT",
"name_match": null
},
"consent": {
"mechanism": "public_registry",
"consent_id": null,
"timestamp": "2026-10-19T09:41:07.512Z"
},
"source": "api",
"error": null,
"billing": {
"amount_kobo": 0,
"currency": "NGN"
},
"latency_ms": 640,
"created_at": "2026-10-19T09:41:07.512Z",
"updated_at": "2026-10-19T09:41:07.874Z"
}summary
company_namestringRegistered name.
rc_numberstringRC or BN number.
statusstringCAC status as registered, e.g.
ACTIVEorWOUND UP.activebooleanWhether the status is
ACTIVE.typestringCompany type.
registered_atstringRegistration date,
YYYY-MM-DD.statestringState of the registered address.
name_matchboolean | nullResult of
match.company_name;nullwhen not requested.name_match_confidencenumber | nullHow close
match.company_nameis to the registered name, 0 to 100.
Full-tier accounts calling the REST API also receive provider, provider_reference and data, the normalized record. MCP, webhooks, lists and bulk results never include it. See Response shaping.
{
"provider": "sandbox",
"provider_reference": "SBX6CB753DB2C",
"data": {
"company_name": "SPEEDILY SERVICES LIMITED",
"rc_number": "RC1234567",
"tin": "12345678-0001",
"type": "Private Company Limited by Shares",
"status": "ACTIVE",
"registered_at": "2016-05-12",
"address": {
"street": "12 Adetokunbo Ademola Crescent, Wuse II",
"city": "Abuja",
"state": "FCT"
},
"email": "info@speedily.ng",
"share_capital": {
"authorized": 10000000,
"issued": 10000000,
"currency": "NGN"
},
"directors": [
{
"name": "THELONIOUS JAHA",
"role": "Director",
"appointedAt": "2016-05-12"
}
],
"shareholders": [
"…"
],
"status_report": {
"status": "ACTIVE",
"active": true,
"last_checked": "2026-10-19T09:41:07.512Z"
}
}
}Send these bodies with a sandbox key. More outcome triggers are on the Sandbox page.
{
"rc_number": "RC1234567"
}{
"rc_number": "RC1111111",
"include": [
"directors",
"winding_up"
]
}{
"rc_number": "BN2345678"
}{
"tin": "23456789-0001"
}| Status | Code | Meaning |
|---|---|---|
400 | invalid_request | The body failed validation. details lists each field. |
401 | unauthorized | Missing or invalid API key. |
402 | insufficient_balance | Live only: wallet balance is below the check price. |
403 | not_entitled | Your workspace is not enabled for this product or method. |
409 | idempotency_key_reused | The Idempotency-Key was used with a different body. |
422 | provider_rejected_request | The upstream registry rejected the request. |
503 | verification_unavailable | Temporary failure. Retry, with the same or a new Idempotency-Key. |
All errors share one shape. See Errors for the full list.
Questions? Email developers@speedmap.ng. This page is also available as Markdown.