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

# Credit

> Pull a borrower's credit report or score from Nigeria's bureaus with just a BVN — CRC, CreditRegistry, FirstCentral and FICO.

Assess whether someone can borrow, using nothing but their **BVN**. Numero fronts Nigeria's credit bureaus — **CRC**, **CreditRegistry**, **FirstCentral** and **FICO** — so you can pull a full credit picture in one call.

## Which endpoint should I use?

| If you want…                                   | Use                                                       |
| ---------------------------------------------- | --------------------------------------------------------- |
| **The full picture in one call** (recommended) | `credit-summary`                                          |
| **A numeric score** to derive a lending band   | `credit-score`                                            |
| A specific bureau's report                     | `credit-crc` · `credit-registry` · `credit-first-central` |

**`credit-summary` aggregates all four bureaus in a single request** — it's the one to reach for unless you specifically need a named bureau. Calling the four individually costs more and takes longer.

<Note>
  **Pricing is per merchant** — check your own rates rather than assuming a list price. Every response tells you
  exactly what that call cost you in **`data.walletAmount`**, and the debit carries `data.walletTransactionReference`.
  That's the authoritative figure; bill your customers from it, not from a number in a doc.
</Note>

## Endpoints

| Method | Endpoint                                             | Description                         |
| ------ | ---------------------------------------------------- | ----------------------------------- |
| POST   | `/api/v1/business/verification/credit-summary`       | All four bureaus aggregated + score |
| POST   | `/api/v1/business/verification/credit-score`         | FICO score                          |
| POST   | `/api/v1/business/verification/credit-crc`           | CRC Credit Bureau report            |
| POST   | `/api/v1/business/verification/credit-registry`      | CreditRegistry report               |
| POST   | `/api/v1/business/verification/credit-first-central` | FirstCentral report                 |

Every one takes the same body — a BVN — and is **signed** like other money-adjacent calls.

## Request

**Signature required:** Yes

| Header               | Required | Description       |
| -------------------- | -------- | ----------------- |
| `X-Numero-Api-Key`   | Yes      | Your API key      |
| `X-Numero-Signature` | Yes      | Request signature |

| Field            | Type   | Required | Description                                                 |
| ---------------- | ------ | -------- | ----------------------------------------------------------- |
| `bvn`            | string | Yes      | The borrower's BVN (11 digits)                              |
| `idempotencyKey` | string | No       | Makes a retry safe — credit pulls are billable, so send one |

```bash theme={null}
curl -X POST "https://api.usenumero.com/numeroaccount/api/v1/business/verification/credit-summary" \
  -H "Content-Type: application/json" \
  -H "X-Numero-Api-Key: your_api_key" \
  -H "X-Numero-Signature: generated_signature" \
  -d '{ "bvn": "12345678901", "idempotencyKey": "credit_check_10231" }'
```

## Response

Results come back **in the response** — credit checks are synchronous, not webhook-driven. The `VERIFICATION_NOTIFICATION` webhook also fires afterwards carrying the charge, for your own reconciliation; you don't need to handle it to use these endpoints.

```json theme={null}
{
  "data": {
    "verificationRequestId": 90123,
    "reference": "VER-2024-abc123",
    "success": true,
    "statusCode": "PASSED",
    "normalizedResult": {
      "name": "John Doe",
      "totalNoOfLoans": "2",
      "totalNoOfActiveLoans": "1",
      "totalBorrowed": "257500",
      "totalOutstanding": "84000",
      "totalOverdue": "0",
      "totalNoOfDelinquentFacilities": "0"
    },
    "walletTransactionReference": "TXN-2024-xyz",
    "walletAmount": 1200
  },
  "error": null,
  "meta": {
    "request_id": "req_365123ebc73323f1482508560ce6400e",
    "pagination": null
  }
}
```

<Note>
  **Expect gaps.** A bureau returns only what it holds — if someone has no history with a lender, fields come back
  as `null`. The field is still there: we return every field the bureau sends, `null` included, so the shape doesn't
  shift between subjects. Treat `null` as "no data", not zero.
</Note>

### Getting a numeric score

If you need a **number to derive a lending band**, use **`credit-score`** (or **`credit-summary`**, which nests the
same score alongside all four bureaus). This is the **complete response** — exactly what `credit-score` returns in
test mode for BVN `22222222222`:

```json theme={null}
{
  "data": {
    "verificationRequestId": 5,
    "reference": "VER-20260717-7c6710d3f29047a599252cb234f72a5f",
    "success": true,
    "statusCode": "200",
    "statusMessage": "Successful",
    "normalizedResult": {
      "bvn": "22222222222",
      "customerId": "10000001",
      "businessId": null,
      "name": "John  Doe",
      "phone": "08012345678",
      "gender": "Male",
      "dateOfBirth": "12/04/1990",
      "address": "12 Marina Road, Lagos Island, Lagos Nigeria",
      "email": null,
      "score.totalNoOfDelinquentFacilities": "0",
      "score.hasLoans": "YES",
      "score.ficoScore.score": "720",
      "score.ficoScore.rating": "GOOD",
      "score.ficoScore.reasons": "Length of credit history is satisfactory. No recent delinquency on the credit report.",
      "score.lastReportedDate": "31-MAY-2026",
      "score.crcReportOrderNumber": "W-0000000001/2026",
      "searchedDate": "2026-07-17T00:00:00.0000000+01:00"
    },
    "walletTransactionReference": "VER-20260717-7c6710d3f29047a599252cb234f72a5f",
    "walletAmount": 800.00
  },
  "error": null,
  "meta": { "request_id": "req_365123ebc73323f1482508560ce6400e", "pagination": null }
}
```

The score is at **`score.ficoScore.score`** — a **string** (`"720"`), because every `normalizedResult` value is a
string or `null`. In `credit-summary` the same values sit one level deeper, under `ficodata.score.ficoScore.*`.

`walletAmount` above is what *this* call cost on *this* account — yours depends on your own pricing. Read it from
the response; don't hard-code it.

### The thin-file case — a score you must handle being absent

Same call, BVN `11111111111` (a borrower the bureau knows but has never scored). **Every key is still present; the
values are `null`:**

```json theme={null}
"normalizedResult": {
  "bvn": "11111111111",
  "customerId": "10000001",
  "score.hasLoans": "NO",
  "score.ficoScore.score": null,
  "score.ficoScore.rating": null,
  "score.ficoScore.reasons": null,
  "score.lastReportedDate": null,
  "score.crcReportOrderNumber": null
}
```

`success` is still `true` and **you are still charged** — the bureau answered; the answer is "no score". Branch on
`score.ficoScore.score == null`, not on `success`.

### Not found

BVN `00000000000`. **`normalizedResult` is `null`** — there are no fields, so there's no map — and **you are not
charged** (`walletAmount: null`):

```json theme={null}
{
  "data": {
    "verificationRequestId": 7,
    "reference": "VER-20260717-debc807153694c008cd360e5ecc8cf86",
    "success": false,
    "statusCode": "404",
    "statusMessage": "Record not found",
    "normalizedResult": null,
    "walletTransactionReference": null,
    "walletAmount": null
  },
  "error": null
}
```

<Warning>
  **The per-bureau endpoints are reports, not scores.** `credit-crc`, `credit-registry` and `credit-first-central`
  return that bureau's own summary figures — loan counts, amounts borrowed, amounts overdue. A numeric score is
  **not guaranteed** on them and can be `null` even for a borrower with an extensive credit history. Don't build a
  band on them; use `credit-score` or `credit-summary`.

  Remember every value is a **string** — `"658"`, not `658`. Parse before comparing.
</Warning>

## Billing

Each call is **billable on success** and debited from your wallet (`walletAmount` in the response). Send an `idempotencyKey` so a network retry doesn't bill you twice.
