# Sandbox and test data

> Sandbox keys return deterministic test data for every product, including not-found, timeout and provider-failure outcomes.

Requests made with an `sk_test_` key never leave Speedmap. They run through the same validation, entitlement, consent and idempotency checks as live requests, then a simulator answers with fixed test identities. Sandbox calls are free and `billing.amount_kobo` is always `0`.

Use the values below as request bodies. Each one is copyable and produces the outcome in its title.

## Test identities

The simulator knows six people. Their NIN, BVN and phone number are linked, so the same person can be found through any product.

| Name | NIN | BVN | Phone | Date of birth | Notes |
| --- | --- | --- | --- | --- | --- |
| Clarke Eliza Griffin | `98765432109` | `22222222221` | `08031234567` | 1992-04-18 | Share code `SPM001` |
| Bellamy Augustus Blake | `09876543210` | `22222222222` | `08029876543` | 1988-11-02 | SIM swapped 210 days ago |
| Octavia Aurora Blake | `45612378903` | `22222222223` | `08051112233` | 1999-07-25 | |
| Monty Green | `11111111111` | `22222222224` | `08061234500` | 1985-01-30 | SIM swapped 400 days ago |
| John Paxton Murphy | `22222222222` | `22222222225` | `08099990000` | 1990-03-12 | Watchlisted, SIM swapped 2 days ago |
| Raven Marie Reyes | `33333333333` | `22222222226` | `08187654321` | 1995-12-05 | SIM swapped 20 days ago |

## Outcome triggers

These identifiers work on any product that takes an NIN, BVN or other identifier:

| Identifier | Outcome |
| --- | --- |
| All zeros, e.g. `00000000000` | `200` with `status: "not_found"` and `match: false` |
| All nines, e.g. `99999999999` | `202` with `status: "pending"` (provider timeout). The next `GET /v1/verifications/{reference_id}` resolves it. |
| `51515151515` | The provider fails. The request returns `503 verification_unavailable`. Retrying is safe. |

For **face** checks, the image value controls the outcome: a value containing `SPOOF` fails liveness, and a value containing `MISMATCH` with a `bvn` fails the face comparison. Any other value of at least 20 characters passes.

> **Raw NIN access:** Test values with `method: "nin"` need the raw-NIN entitlement, which NIMC restricts to financial institutions and government agencies. Without it they return `403 not_entitled`. The same NINs work with `method: "in_person"` and any `selfie_image` of at least 100 characters.

## Consent in the sandbox

[Consent requests](https://speedmap-delta.vercel.app/docs/consent) behave like live ones, but you can play the data subject:

- On the hosted consent page (`authorization_url`), the one-time code is always `123456`. Five wrong codes lock the request.
- Or skip the page and decide through the API with your sandbox key:

_cURL_

```bash
curl -X POST "http://localhost:4000/v1/sandbox/consents/cns_.../approve" \
  -H "Authorization: Bearer sk_test_..."
```

_Node.js_

```javascript
const res = await fetch("http://localhost:4000/v1/sandbox/consents/cns_.../approve", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.SPEEDMAP_API_KEY}`,
  },
});

const consent = await res.json();
if (!res.ok) throw new Error(consent.error.message);
console.log(consent);
```

_Python_

```python
import os, requests

res = requests.post(
    "http://localhost:4000/v1/sandbox/consents/cns_.../approve",
    headers={
        "Authorization": f"Bearer {os.environ['SPEEDMAP_API_KEY']}",
    },
    timeout=30,
)
res.raise_for_status()
print(res.json())
```

Use `/deny` instead of `/approve` to simulate a refusal. Both return the updated consent and fire `consent.updated` to your webhook endpoints. With a live key these endpoints return `403 sandbox_only`.

A full BVN record check in the sandbox: create a consent for BVN `22222222221`, approve it, then call `POST /v1/verify/bvn` with `method: "core"` and the `consent_id`.

## Test values by product

Generated from the live product catalog.

### NIN Verification

`POST /v1/verify/nin` · [Product reference](https://speedmap-delta.vercel.app/docs/products/nin)

**Verified (Clarke Griffin)**

```json
{
  "method": "nin",
  "nin": "98765432109",
  "reason": "financialProducts",
  "consent": {
    "obtained": true
  }
}
```

**Verified (Bellamy Blake)**

```json
{
  "method": "nin",
  "nin": "09876543210",
  "reason": "employmentRecruitment",
  "consent": {
    "obtained": true
  }
}
```

**Share code**

```json
{
  "method": "share_code",
  "share_code": "SPM001",
  "reason": "financialProducts"
}
```

**Not found**

```json
{
  "method": "nin",
  "nin": "00000000000",
  "reason": "financialProducts",
  "consent": {
    "obtained": true
  }
}
```

**Provider timeout (resolves on requery)**

```json
{
  "method": "nin",
  "nin": "99999999999",
  "reason": "financialProducts",
  "consent": {
    "obtained": true
  }
}
```

### BVN Verification

`POST /v1/verify/bvn` · [Product reference](https://speedmap-delta.vercel.app/docs/products/bvn)

**Boolean match**

```json
{
  "method": "boolean",
  "bvn": "22222222221",
  "reason": "financialProducts",
  "consent": {
    "obtained": true
  },
  "match": {
    "first_name": "Clarke",
    "last_name": "Griffin"
  }
}
```

**Boolean no-match**

```json
{
  "method": "boolean",
  "bvn": "22222222222",
  "reason": "financialProducts",
  "consent": {
    "obtained": true
  },
  "match": {
    "last_name": "Smith"
  }
}
```

**Watchlisted BVN (boolean)**

```json
{
  "method": "boolean",
  "bvn": "22222222225",
  "reason": "creditBackgroundCheck",
  "consent": {
    "obtained": true
  },
  "match": {
    "last_name": "Murphy"
  }
}
```

### Face Liveness & Match

`POST /v1/verify/face` · [Product reference](https://speedmap-delta.vercel.app/docs/products/face)

**Live and matching**

```json
{
  "image": "data-LIVE-selfie-0001",
  "bvn": "22222222221",
  "reason": "financialProducts"
}
```

**Spoof (fails liveness)**

```json
{
  "image": "data-SPOOF-photo-of-photo",
  "reason": "financialProducts"
}
```

**Different person**

```json
{
  "image": "data-MISMATCH-selfie",
  "bvn": "22222222221",
  "reason": "financialProducts"
}
```

### Phone Identity Lookup

`POST /v1/verify/phone` · [Product reference](https://speedmap-delta.vercel.app/docs/products/phone)

**Linked number**

```json
{
  "phone": "08031234567",
  "reason": "financialProducts",
  "consent": {
    "obtained": true
  }
}
```

**Unlinked number**

```json
{
  "phone": "08000000000",
  "reason": "financialProducts",
  "consent": {
    "obtained": true
  }
}
```

### Business Verification (KYB)

`POST /v1/verify/business` · [Product reference](https://speedmap-delta.vercel.app/docs/products/business)

**Active company**

```json
{
  "rc_number": "RC1234567"
}
```

**Wound-up company**

```json
{
  "rc_number": "RC1111111",
  "include": [
    "directors",
    "winding_up"
  ]
}
```

**Business name**

```json
{
  "rc_number": "BN2345678"
}
```

**By TIN**

```json
{
  "tin": "23456789-0001"
}
```

### Bank Account Verification

`POST /v1/verify/account` · [Product reference](https://speedmap-delta.vercel.app/docs/products/account)

**Name matches**

```json
{
  "account_number": "0123456789",
  "bank_code": "058",
  "match": {
    "name": "Clarke Griffin"
  }
}
```

**Name mismatch**

```json
{
  "account_number": "1234567890",
  "bank_code": "044",
  "match": {
    "name": "John Doe"
  }
}
```

**Corporate account**

```json
{
  "account_number": "4567890123",
  "bank_code": "011"
}
```

### Fraud Signals

`POST /v1/signals` · [Product reference](https://speedmap-delta.vercel.app/docs/products/signals)

**High risk**

```json
{
  "phone": "08099990000",
  "bvn": "22222222225",
  "reason": "financialProducts",
  "consent": {
    "obtained": true
  }
}
```

**Medium risk (recent SIM swap)**

```json
{
  "phone": "08187654321",
  "bvn": "22222222226",
  "reason": "financialProducts",
  "consent": {
    "obtained": true
  }
}
```

**Low risk**

```json
{
  "phone": "08031234567",
  "bvn": "22222222221",
  "reason": "financialProducts",
  "consent": {
    "obtained": true
  }
}
```

### International Passport

`POST /v1/verify/passport` · Preview: sandbox only · [Product reference](https://speedmap-delta.vercel.app/docs/products/passport)

**Valid document**

```json
{
  "passport_number": "A12345678",
  "reason": "financialProducts",
  "consent": {
    "obtained": true
  }
}
```

**Not found**

```json
{
  "passport_number": "A00000000",
  "reason": "financialProducts",
  "consent": {
    "obtained": true
  }
}
```

### Driver's Licence

`POST /v1/verify/drivers-license` · Preview: sandbox only · [Product reference](https://speedmap-delta.vercel.app/docs/products/drivers_license)

**Valid document**

```json
{
  "license_number": "LAG12345AA01",
  "reason": "financialProducts",
  "consent": {
    "obtained": true
  }
}
```

**Not found**

```json
{
  "license_number": "LAG00000AA00",
  "reason": "financialProducts",
  "consent": {
    "obtained": true
  }
}
```

### Voter's Card

`POST /v1/verify/voters-card` · Preview: sandbox only · [Product reference](https://speedmap-delta.vercel.app/docs/products/voters_card)

**Valid document**

```json
{
  "vin": "90F5B1A2C3D4E5F6071",
  "reason": "financialProducts",
  "consent": {
    "obtained": true
  }
}
```

**Not found**

```json
{
  "vin": "00F0B0A0C0D0E0F0000",
  "reason": "financialProducts",
  "consent": {
    "obtained": true
  }
}
```

---

Source: https://speedmap-delta.vercel.app/docs/sandbox
