# Register for the Local Rails

> Coming soon, upon request — this feature is turned on for your tenant by the Aurea team. [Contact us](https://www.aureahub.com/contact)

Make the user a customer of the bank ramp's local rails — a person or a company — so the bank ramp verifies them.

## Overview

- `kind` is `individual` or `business`, with who the user is: `legalName`, `country` and, for a person only, `dateOfBirth`. A withdrawal to the user's own wallet names them as its beneficiary.
- The first registration answers `201`; registering again with the same details answers `200` with the same record. Different details replace the earlier ones only while the state is `registered`: once the verification has started, `409` `BANK_RAMP_CUSTOMER_INVALID`.
- The bank ramp's operations then verify the user; the state moves to `pending` and then `verified` or `rejected`, and each change is sent as `ramp.kyc.updated`.
- **With identity verification** [Coming soon, upon request](https://docs.aureahub.com/docs/feature-availability.md): where your tenant has [identity verification](https://docs.aureahub.com/docs/guide-identity.md) deciding this verification in the environment called, the answer — `201` and `200` — also carries `verificationId` and `verificationUrl` (the **With identity verification** tabs below); an `individual` is verified as a person, a `business` as a company.

  - Open `verificationUrl` for the user right away and exactly as it is — in the browser, an iframe or a WebView ([Identity Verification](https://docs.aureahub.com/docs/guide-identity.md) › Show the Verification Page). The link is short-lived: for a later visit, register again with the same details for a fresh one.
  - `verificationUrl` is `null` when there is nothing for the user to complete — or when the page could not be prepared at that moment. The registration is saved all the same: register again with the same details for a link. In the rare case no verification could be started at all, the answer has neither field: register again a little later.
  - Register the legal name and, for a person, the date of birth exactly as on the identity document: the state stays `registered` — and the details can still be corrected — until the user starts on the verification page. The user becomes `verified` only when the identity the verification confirmed matches the registered one; otherwise they stay `pending` while Aurea reviews it ([Identity Verification](https://docs.aureahub.com/docs/guide-identity.md) › With the Bank Ramp).
  - The decision moves `state` and is sent as `ramp.kyc.updated` and `identity.verification.updated` (`verificationId` is that event's).

  Every other tenant gets the answers below, unchanged; ignore fields you don't know.
- `403` `BANK_RAMP_FUNCTION_OFF` when your tenant offers neither pay-ins nor withdrawals on the local rails in this environment.

Called with the user's access token, in one environment (`isTestnet`). See [Bank Ramp: Local Rails](https://docs.aureahub.com/docs/guide-bank-local.md).

## Endpoint

### `POST /v1/ramp/bank/customer/verification`

Authentication: bearer token required.

Registers the user for the bank ramp's local rails with who they are, or answers the registration they have.

**Request body**

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `kind` | string | yes | `individual` or `business` |
| `legalName` | string | yes | The person's or the company's legal name, at most 200 characters |
| `country` | string | yes | ISO 3166-1 alpha-2, in capitals (`KE`) |
| `dateOfBirth` | string | no | `YYYY-MM-DD`. Required for an `individual`; a `business` has none |
| `isTestnet` | boolean | no | `true` for the sandbox; `false` or omitted for production |

**Responses**

`201` Registered

```json
{
  "environment": "production",
  "state": "registered",
  "kind": "individual",
  "nextStep": "await_verification",
  "required": true,
  "verifiedAt": null,
  "updatedAt": "2026-10-23T09:00:00.000Z"
}
```

`201` With identity verification

```json
{
  "environment": "production",
  "state": "registered",
  "kind": "individual",
  "nextStep": "await_verification",
  "required": true,
  "verifiedAt": null,
  "updatedAt": "2026-10-23T09:00:00.000Z",
  "verificationId": "7c1e9a24-5b3d-4f8a-9e6c-2d0b4a8f1e37",
  "verificationUrl": "https://…"
}
```

`200` With identity verification, no page now

```json
{
  "environment": "production",
  "state": "registered",
  "kind": "individual",
  "nextStep": "await_verification",
  "required": true,
  "verifiedAt": null,
  "updatedAt": "2026-10-23T09:00:00.000Z",
  "verificationId": "7c1e9a24-5b3d-4f8a-9e6c-2d0b4a8f1e37",
  "verificationUrl": null
}
```

`400` Not valid

```json
{
  "statusCode": 400,
  "error": "BadRequestError",
  "message": "dateOfBirth is required for a person.",
  "details": {
    "code": "BANK_RAMP_CUSTOMER_INVALID",
    "field": "dateOfBirth"
  }
}
```

`409` Verification started

```json
{
  "statusCode": 409,
  "error": "ConflictError",
  "message": "The user's verification has started: their identity can only be corrected by the bank ramp's operations.",
  "details": {
    "code": "BANK_RAMP_CUSTOMER_INVALID",
    "state": "pending"
  }
}
```

`403` No tenant

```json
{
  "statusCode": 403,
  "error": "ForbiddenError",
  "message": "This request needs a tenant: an admin token without one has no bank ramp customer.",
  "details": {
    "code": "TENANT_REQUIRED"
  }
}
```

---

Web version: https://docs.aureahub.com/#local-verification-register
