Skip to content

Business Verification (KYB)

CAC company verification through NIBSS CIV: status, registration, directors, shareholders, share capital and winding-up.

View as Markdown

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.

POST/v1/verify/business
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

Request

Body parameters

  • rc_numberstring

    CAC RC or BN number, e.g. RC1234567. At least 3 characters.

  • tinstring

    At least 5 characters.

  • company_namestring

    At least 2 characters.

  • includearray of strings

    Each one of: directors, shareholders, share_capital, line_of_business, affiliates, status_report, winding_up, certificate. Defaults to ["directors","shareholders","share_capital","status_report"].

  • reasonstring

    Purpose of the check. One of the 38 NIMC purpose codes. See the purpose code list.

  • matchobject
  • match.company_namestring

    At least 2 characters.

  • Provide exactly one of rc_number, tin or company_name. Live CAC lookups need rc_number or tin; company_name search is sandbox only.
  • company_type is optional: Speedmap reads it from the RC prefix (RC company, BN business name, IT incorporated trustee, LP / LLP partnerships). Send it when the number has no prefix.
  • reason is optional for business checks.
  • match is true when the company is ACTIVE and, if you sent match.company_name, the names agree (case, punctuation and suffixes such as LIMITED, LTD and PLC are ignored).
  • The sections in include decide 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"
  ]
}'

Response

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.

200 OK · assertion
{
  "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_namestring

    Registered name.

  • rc_numberstring

    RC or BN number.

  • statusstring

    CAC status as registered, e.g. ACTIVE or WOUND UP.

  • activeboolean

    Whether the status is ACTIVE.

  • typestring

    Company type.

  • registered_atstring

    Registration date, YYYY-MM-DD.

  • statestring

    State of the registered address.

  • name_matchboolean | null

    Result of match.company_name; null when not requested.

  • name_match_confidencenumber | null

    How close match.company_name is 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.

Full tier only
{
  "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"
    }
  }
}

Test values

Send these bodies with a sandbox key. More outcome triggers are on the Sandbox page.

Active company
{
  "rc_number": "RC1234567"
}
Wound-up company
{
  "rc_number": "RC1111111",
  "include": [
    "directors",
    "winding_up"
  ]
}
Business name
{
  "rc_number": "BN2345678"
}
By TIN
{
  "tin": "23456789-0001"
}

Errors

StatusCodeMeaning
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.