> ## Documentation Index
> Fetch the complete documentation index at: https://docs.fastcac.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Verify a business

> Checks the number and name your applicant gave against CAC's register, whether CAC lists the business as
active, and, if you send them, whether its officers include those names: each matched name comes back with
every role that person holds and their record (`officer`). You get a `result` and each check, not the
business's full record (that's a lookup). Free unless you send officer names (see `amount_charged`); a number CAC doesn't have is the
free `not_found` result. Test keys check
against one made-up business: ADA FOODS VENTURES (type BN) or ADA FOODS LIMITED, with officer ADA CHIOMA OBI (director, shareholder and psc in the
limited company) and shareholder EMEKA JOHN OBI.



## OpenAPI

````yaml /openapi.json post /businesses/verifications
openapi: 3.1.0
info:
  title: FastCAC API
  description: Register Nigerian businesses with CAC from your own product.
  version: '2026-11-01'
servers:
  - url: https://api.fastcac.com/v1
security:
  - apiKey: []
tags:
  - name: Account
    description: Check your key and see your organization.
  - name: Names
    description: >-
      Check a business name against CAC's rules and registry, and the categories
      it takes, before registering it.
  - name: Registrations
    description: Register a Business Name with CAC, from draft to certificate.
  - name: Lookup
    description: >-
      Search CAC's register for free, and look up a business's full record with
      its officers.
  - name: Verification
    description: >-
      Check that a business your applicant names is real, active and run by the
      people they say.
  - name: Monitoring
    description: >-
      Watch businesses on CAC's register and get an event when one goes inactive
      or changes name.
  - name: Identities
    description: >-
      Look up a proprietor's NIN with NIMC, to prefill a registration and use
      their photo.
  - name: Balance
    description: >-
      Your prepaid wallet: what's available, its transactions and your funding
      account.
  - name: Test helpers
    description: >-
      Test keys only: move a registration on without waiting, or simulate a
      deposit.
  - name: Webhooks
    description: Endpoints that receive events, and the events sent to them.
  - name: Webhook events
    description: What FastCAC POSTs to your webhook endpoints.
paths:
  /businesses/verifications:
    post:
      tags:
        - Verification
      summary: Verify a business
      description: >-
        Checks the number and name your applicant gave against CAC's register,
        whether CAC lists the business as

        active, and, if you send them, whether its officers include those names:
        each matched name comes back with

        every role that person holds and their record (`officer`). You get a
        `result` and each check, not the

        business's full record (that's a lookup). Free unless you send officer
        names (see `amount_charged`); a number CAC doesn't have is the

        free `not_found` result. Test keys check

        against one made-up business: ADA FOODS VENTURES (type BN) or ADA FOODS
        LIMITED, with officer ADA CHIOMA OBI (director, shareholder and psc in
        the

        limited company) and shareholder EMEKA JOHN OBI.
      operationId: create_verification_businesses_verifications_post
      parameters:
        - name: simulate
          in: query
          required: false
          schema:
            anyOf:
              - type: string
              - type: 'null'
            description: >-
              Test keys only: not_found, inactive or cac_search_unavailable
              (503); with officer names, also lookup_unavailable (503) or
              insufficient_balance (402). Ignored with a live key.
            title: Simulate
          description: >-
            Test keys only: not_found, inactive or cac_search_unavailable (503);
            with officer names, also lookup_unavailable (503) or
            insufficient_balance (402). Ignored with a live key.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/VerificationIn'
            example:
              number: RC 7654321
              name: Ada Foods Ltd
              officers:
                - Ada Obi
      responses:
        '201':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/V1BusinessVerification'
              examples:
                Match, with officers:
                  value:
                    object: business_verification
                    id: bver_2wuH3qrorTKV8jDHcfHvgj
                    number: '7654321'
                    type: RC
                    result: match
                    checks:
                      number_found: true
                      name:
                        result: exact
                        score: 1
                        registered_name: ADA FOODS LIMITED
                      active: true
                      status: ACTIVE
                      officers:
                        - name: Ada Obi
                          matched: true
                          role: director
                          roles:
                            - director
                            - shareholder
                            - psc
                          officer:
                            name: ADA CHIOMA OBI
                            role: director
                            roles:
                              - director
                              - shareholder
                              - psc
                            corporate: false
                            status: active
                            appointed_on: '2024-03-18'
                            gender: female
                            date_of_birth: '1990-05-14'
                            nationality: NIGERIAN
                            occupation: CHEF
                            phone: '+2348000000001'
                            email: ada@adafoods.ng
                            address: 12 ADMIRALTY WAY, LEKKI, LAGOS
                            shares:
                              count: 750000
                              type: ordinary
                              percent: 75
                            psc:
                              shares_percent_direct: 75
                              shares_percent_indirect: 0
                              votes_percent_direct: 75
                              votes_percent_indirect: 0
                              appoints_directors: true
                              significant_influence: true
                              since: '2024-03-18'
                    amount_charged: '200.00'
                    transaction_id: wtx_1XVPtIxfqt3pdtF5rBbicq
                    created_at: '2026-10-29T01:52:13Z'
                Match, without officers (free):
                  value:
                    object: business_verification
                    id: bver_7PxrDao1VDm30QWIz871eQ
                    number: '7654321'
                    type: RC
                    result: match
                    checks:
                      number_found: true
                      name:
                        result: exact
                        score: 1
                        registered_name: ADA FOODS LIMITED
                      active: true
                      status: ACTIVE
                      officers: null
                    amount_charged: '0.00'
                    transaction_id: null
                    created_at: '2026-10-29T01:52:13Z'
                'Partial: an officer didn''t match':
                  value:
                    object: business_verification
                    id: bver_2PzanwKDt0ofdqARYsmFMU
                    number: '7654321'
                    type: RC
                    result: partial
                    checks:
                      number_found: true
                      name:
                        result: exact
                        score: 1
                        registered_name: ADA FOODS LIMITED
                      active: true
                      status: ACTIVE
                      officers:
                        - name: Ada Obi
                          matched: true
                          role: director
                          roles:
                            - director
                            - shareholder
                            - psc
                          officer:
                            name: ADA CHIOMA OBI
                            role: director
                            roles:
                              - director
                              - shareholder
                              - psc
                            corporate: false
                            status: active
                            appointed_on: '2024-03-18'
                            gender: female
                            date_of_birth: '1990-05-14'
                            nationality: NIGERIAN
                            occupation: CHEF
                            phone: '+2348000000001'
                            email: ada@adafoods.ng
                            address: 12 ADMIRALTY WAY, LEKKI, LAGOS
                            shares:
                              count: 750000
                              type: ordinary
                              percent: 75
                            psc:
                              shares_percent_direct: 75
                              shares_percent_indirect: 0
                              votes_percent_direct: 75
                              votes_percent_indirect: 0
                              appoints_directors: true
                              significant_influence: true
                              since: '2024-03-18'
                        - name: Emeka Nwosu
                          matched: false
                          role: null
                          roles: []
                          officer: null
                    amount_charged: '200.00'
                    transaction_id: wtx_5dNKsO4OAquOcnFoTu5OUc
                    created_at: '2026-10-29T01:52:13Z'
                'Partial: close name':
                  value:
                    object: business_verification
                    id: bver_1D2e8gg5snOOdTx5yC8xKb
                    number: '7654321'
                    type: RC
                    result: partial
                    checks:
                      number_found: true
                      name:
                        result: close
                        score: 0.94
                        registered_name: ADA FOODS LIMITED
                      active: true
                      status: ACTIVE
                      officers: null
                    amount_charged: '0.00'
                    transaction_id: null
                    created_at: '2026-10-29T01:52:13Z'
                No match:
                  value:
                    object: business_verification
                    id: bver_6Fs88DQscd2qdMjFLVzUY0
                    number: '7654321'
                    type: RC
                    result: no_match
                    checks:
                      number_found: true
                      name:
                        result: no_match
                        score: 0.42
                        registered_name: ADA FOODS LIMITED
                      active: true
                      status: ACTIVE
                      officers: null
                    amount_charged: '0.00'
                    transaction_id: null
                    created_at: '2026-10-29T01:52:13Z'
                Not found:
                  value:
                    object: business_verification
                    id: bver_6i5kh3xrqieUKXDKf5ugh6
                    number: '9999999'
                    type: null
                    result: not_found
                    checks:
                      number_found: false
                      name: null
                      active: null
                      status: null
                      officers: null
                    amount_charged: '0.00'
                    transaction_id: null
                    created_at: '2026-10-29T01:52:14Z'
        '400':
          description: The request is invalid; `param` names the field.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                Example:
                  value:
                    error:
                      type: invalid_request_error
                      code: parameter_invalid
                      message: Send each officer's full name, at least two words.
                      param: officers[0]
                      request_id: req_TW6GjTeKZYTtwHtQTc1bSv1q
        '401':
          description: The API key is missing, malformed, revoked or expired.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                Example:
                  value:
                    error:
                      type: authentication_error
                      code: api_key_missing
                      message: 'Send your API key as `Authorization: Bearer <key>`.'
                      param: null
                      request_id: req_frd2UlzYqbxvNBzh0KlVjXtT
        '402':
          description: >-
            The wallet can't cover it: `insufficient_balance`, with `details`.
            Nothing was charged or checked.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/V1Error'
              examples:
                Example:
                  value:
                    error:
                      type: payment_error
                      code: insufficient_balance
                      message: >-
                        Your balance is ₦0.00; this verification costs ₦200.00.
                        Fund your wallet by bank transfer to your funding
                        account, then try again.
                      param: null
                      request_id: req_IvGVqbWRy7awzryQ2PWJ3AkG
                      details:
                        amount_due: '200.00'
                        balance: '0.00'
                        currency: NGN
                        funding_account:
                          account_number: '0000000000'
                          bank_name: TEST BANK
                          account_name: FastCAC - TEST MODE
        '403':
          description: >-
            The key can't do this (for example, a test helper called with a live
            key).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                Example:
                  value:
                    error:
                      type: permission_error
                      code: live_mode_unavailable
                      message: >-
                        Live registrations are paused right now. Use a test key
                        (fc_test_…) meanwhile.
                      param: null
                      request_id: req_NgRhpG4Cex8pMaLHrlFLrNbP
        '404':
          description: No such object for this key's organization and mode.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                Example:
                  value:
                    error:
                      type: not_found_error
                      code: resource_missing
                      message: 'No such registration: reg_0000000000000000000000.'
                      param: id
                      request_id: req_q0eCI4lKSfk7uWxnMju7SxAE
        '409':
          description: >-
            The object's state doesn't allow this, or the Idempotency-Key was
            reused.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '429':
          description: Too many requests; wait for `Retry-After` seconds.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '503':
          description: >-
            `cac_search_unavailable` or `lookup_unavailable`: CAC didn't answer.
            Not charged.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/V1Error'
components:
  schemas:
    VerificationIn:
      properties:
        number:
          type: string
          title: Number
          description: >-
            The registration number your applicant gave, with or without its
            prefix: "8911267" or "RC 8911267".
        type:
          anyOf:
            - type: string
              enum:
                - BN
                - RC
                - IT
                - LP
                - LLP
            - type: 'null'
          title: Type
          description: >-
            The register. Needed only when the number is in more than one
            (`type_required`).
        name:
          type: string
          title: Name
          description: The business name your applicant gave.
        officers:
          anyOf:
            - items:
                type: string
              type: array
            - type: 'null'
          title: Officers
          description: >-
            Optional: up to 10 full names of proprietors, directors,
            shareholders or other officers to check against CAC's record.
            Sending any makes the verification charged; without them it's free.
      type: object
      required:
        - number
        - name
      title: VerificationIn
    V1BusinessVerification:
      properties:
        object:
          type: string
          const: business_verification
          title: Object
          default: business_verification
        id:
          type: string
          title: Id
          description: bver_…
        number:
          type: string
          title: Number
        type:
          anyOf:
            - type: string
              enum:
                - BN
                - RC
                - IT
                - LP
                - LLP
            - type: 'null'
          title: Type
          description: The register the number is in; null when CAC doesn't have it.
        result:
          type: string
          enum:
            - match
            - partial
            - no_match
            - not_found
          title: Result
          description: >-
            match: the name is exact, the business is active and every officer
            you sent matched. partial: the name is close, the business isn't
            active, or an officer didn't match. no_match: the name is a
            different business's. not_found: CAC has no business with that
            number.
        checks:
          $ref: '#/components/schemas/V1VerificationChecks'
        amount_charged:
          type: string
          title: Amount Charged
          description: >-
            What the verification cost, in naira, as a decimal string: "0.00"
            when it didn't check officers.
        transaction_id:
          anyOf:
            - type: string
            - type: 'null'
          title: Transaction Id
          description: The wtx_… business_verification_charge; null when it was free.
        created_at:
          anyOf:
            - type: string
            - type: 'null'
          title: Created At
      type: object
      required:
        - id
        - number
        - type
        - result
        - checks
        - amount_charged
        - transaction_id
        - created_at
      title: V1BusinessVerification
    Error:
      properties:
        error:
          $ref: '#/components/schemas/ErrorDetail'
      required:
        - error
      title: V1Error
      type: object
    V1Error:
      properties:
        error:
          $ref: '#/components/schemas/ErrorDetail'
      required:
        - error
      title: V1Error
      type: object
    V1VerificationChecks:
      properties:
        number_found:
          type: boolean
          title: Number Found
          description: CAC has a business with that number.
        name:
          anyOf:
            - $ref: '#/components/schemas/V1NameCheck'
            - type: 'null'
          description: Null when the number wasn't found.
        active:
          anyOf:
            - type: boolean
            - type: 'null'
          title: Active
          description: CAC lists it as ACTIVE. Null when the number wasn't found.
        status:
          anyOf:
            - type: string
            - type: 'null'
          title: Status
          description: 'As CAC lists it: ACTIVE, INACTIVE, STRUCK OFF and so on.'
        officers:
          anyOf:
            - items:
                $ref: '#/components/schemas/V1OfficerCheck'
              type: array
            - type: 'null'
          title: Officers
          description: >-
            One per name you sent; null when you sent none or the number wasn't
            found.
      type: object
      required:
        - number_found
        - name
        - active
        - status
        - officers
      title: V1VerificationChecks
    ErrorDetail:
      properties:
        type:
          type: string
          enum:
            - invalid_request_error
            - authentication_error
            - payment_error
            - permission_error
            - not_found_error
            - idempotency_error
            - rate_limit_error
            - api_error
          title: Type
        code:
          type: string
          title: Code
          description: Stable and machine-readable, e.g. registration_incomplete.
        message:
          type: string
          title: Message
          description: For a developer to read; may change.
        param:
          anyOf:
            - type: string
            - type: 'null'
          title: Param
          description: The parameter at fault, as a path like proprietors[0].nin.
        request_id:
          anyOf:
            - type: string
            - type: 'null'
          title: Request Id
          description: Also in the FastCAC-Request-Id header. Quote it to support.
        details:
          anyOf:
            - additionalProperties: true
              type: object
            - type: 'null'
          title: Details
          description: >-
            Only on some errors. A 402 insufficient_balance carries amount_due,
            balance, currency and funding_account (number, bank, name; null
            until it's active).
      type: object
      required:
        - type
        - code
        - message
        - param
        - request_id
      title: ErrorDetail
    V1NameCheck:
      properties:
        result:
          type: string
          enum:
            - exact
            - close
            - no_match
          title: Result
          description: >-
            exact: the same name once case, punctuation and LTD/LIMITED-style
            spellings are ignored. close: a small difference, such as a typo or
            a missing word. no_match: a different name.
        score:
          type: number
          title: Score
          description: Similarity from 0 to 1.
        registered_name:
          type: string
          title: Registered Name
          description: The name on CAC's register.
      type: object
      required:
        - result
        - score
        - registered_name
      title: V1NameCheck
    V1OfficerCheck:
      properties:
        name:
          type: string
          title: Name
          description: The name you sent.
        matched:
          type: boolean
          title: Matched
          description: >-
            True when CAC lists an officer, shareholder or person with
            significant control by that name (word order and case ignored).
        role:
          anyOf:
            - type: string
            - type: 'null'
          title: Role
          description: The first of `roles`, when matched.
        roles:
          items:
            type: string
          type: array
          title: Roles
          description: >-
            Every role the matched person holds, such as ["director",
            "shareholder", "psc"]. Empty when not matched.
        officer:
          anyOf:
            - $ref: '#/components/schemas/V1CacOfficer'
            - type: 'null'
          description: >-
            The matched person's record from CAC: shares, PSC details, contact
            and personal details. Null when not matched.
      type: object
      required:
        - name
        - matched
        - role
        - roles
        - officer
      title: V1OfficerCheck
    V1CacOfficer:
      properties:
        name:
          anyOf:
            - type: string
            - type: 'null'
          title: Name
        role:
          type: string
          title: Role
          description: The first of `roles`, for a quick read.
        roles:
          items:
            type: string
          type: array
          title: Roles
          description: >-
            Every role this person holds: proprietor, partner, trustee,
            director, secretary, shareholder or psc (a person with significant
            control), in that order. CAC lists one entry per role; here each
            person is listed once.
        corporate:
          type: boolean
          title: Corporate
          description: A company rather than a person (such as a corporate shareholder).
        status:
          anyOf:
            - type: string
            - type: 'null'
          title: Status
          description: As CAC lists it, lower case, such as "active".
        appointed_on:
          anyOf:
            - type: string
            - type: 'null'
          title: Appointed On
          description: YYYY-MM-DD, when CAC has it.
        gender:
          anyOf:
            - type: string
            - type: 'null'
          title: Gender
          description: '"male" or "female", when CAC has it.'
        date_of_birth:
          anyOf:
            - type: string
            - type: 'null'
          title: Date Of Birth
          description: YYYY-MM-DD, when CAC has it.
        nationality:
          anyOf:
            - type: string
            - type: 'null'
          title: Nationality
        occupation:
          anyOf:
            - type: string
            - type: 'null'
          title: Occupation
        phone:
          anyOf:
            - type: string
            - type: 'null'
          title: Phone
          description: As filed with CAC.
        email:
          anyOf:
            - type: string
            - type: 'null'
          title: Email
          description: As filed with CAC.
        address:
          anyOf:
            - type: string
            - type: 'null'
          title: Address
          description: >-
            Their address as filed, as one line. Null when they asked CAC to
            hide it.
        shares:
          anyOf:
            - $ref: '#/components/schemas/V1CacShares'
            - type: 'null'
          description: Null when they hold no shares.
        psc:
          anyOf:
            - $ref: '#/components/schemas/V1CacPsc'
            - type: 'null'
          description: >-
            How they control the business, when CAC records it. Often null even
            for a psc.
      type: object
      required:
        - name
        - role
        - roles
        - corporate
        - status
        - appointed_on
        - gender
        - date_of_birth
        - nationality
        - occupation
        - phone
        - email
        - address
        - shares
        - psc
      title: V1CacOfficer
    V1CacShares:
      properties:
        count:
          type: integer
          title: Count
          description: Shares allotted to this person.
        type:
          anyOf:
            - type: string
            - type: 'null'
          title: Type
          description: As CAC lists it, lower case, such as "ordinary".
        percent:
          anyOf:
            - type: number
            - type: 'null'
          title: Percent
          description: Their share of all the shares CAC lists for the business, 0 to 100.
      type: object
      required:
        - count
        - type
        - percent
      title: V1CacShares
    V1CacPsc:
      properties:
        shares_percent_direct:
          type: number
          title: Shares Percent Direct
        shares_percent_indirect:
          type: number
          title: Shares Percent Indirect
        votes_percent_direct:
          type: number
          title: Votes Percent Direct
        votes_percent_indirect:
          type: number
          title: Votes Percent Indirect
        appoints_directors:
          type: boolean
          title: Appoints Directors
          description: Has the right to appoint or remove most directors.
        significant_influence:
          type: boolean
          title: Significant Influence
          description: Has or exercises significant influence or control.
        since:
          anyOf:
            - type: string
            - type: 'null'
          title: Since
          description: YYYY-MM-DD, when CAC has it.
      type: object
      required:
        - shares_percent_direct
        - shares_percent_indirect
        - votes_percent_direct
        - votes_percent_indirect
        - appoints_directors
        - significant_influence
        - since
      title: V1CacPsc
  securitySchemes:
    apiKey:
      type: http
      scheme: bearer
      description: 'Your secret API key: fc_test_… in test mode, fc_live_… in live mode.'

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.