# Send the Customer's Verifications

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

Send the checks behind the customer's details — an identity document, a selfie match, a proof of address, the source of funds — each with the documents you uploaded.

## Overview

- The verifications you send are updated; the others stay as they are.
- **Which kinds your app sends** depends on your tenant's strategy: with `reliance`, every kind; with `identity_sharing`, only `sourceOfFunds` — the shared applicant brings the rest ([Share a KYC Applicant](https://docs.aureahub.com/docs/bank-customer-share.md)). Another kind answers `400` `BANK_RAMP_KYC_VERIFICATION_UNAVAILABLE`, with `details.allowed` and the refused items in `details.fields`. With `hosted_oauth`: `403` `BANK_RAMP_KYC_STRATEGY_OFF`.
- **Documents first.** A verification's `documents` name files uploaded for this customer with [Upload a Document](https://docs.aureahub.com/docs/bank-customer-file-upload.md), by their `fileId`. Any other id — another customer's, an unknown one — answers `400` `BANK_RAMP_KYC_FILE_UNKNOWN` with the fields, before anything reaches the bank ramp.
- The other rules of [Send Details](https://docs.aureahub.com/docs/bank-customer-details.md) apply: the KYC on, a confirmed customer of the kind the body names, exactly one of `personal` and `corporate`, refused with field names only, `202` with `accepted: "verifications"`, nothing kept.

## Endpoint

### `PATCH /v1/ramp/bank/customer/verifications`

Authentication: bearer token required.

Sends some of the customer's verifications to the bank ramp for review.

**Request body**

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `isTestnet` | boolean | no | `true` for the sandbox; `false` or omitted for production |
| `personal[]` | array | no | A person's verifications, 1 to 4. Exactly one of `personal` and `corporate` |
| `personal[].kind` | string | yes | `idDocument`, `facialSimilarity`, `proofOfResidency` or `sourceOfFunds` |
| `personal[].documents[]` | array | no | Up to 10 documents |
| `personal[].documents[].fileId` | string | yes | The `fileId` of a document uploaded for this customer |
| `personal[].documents[].kind` | string | no | `passport`, `nationalIdentityCard`, `drivingLicense`, `residencePermit`, `proofOfResidency`, `sourceOfFunds`, `companyFilePDF` or `other` |
| `personal[].documents[].side` | string | no | `front` or `back` |
| `corporate[]` | array | no | A company's verifications, 1 to 100 |
| `corporate[].kind` | string | yes | `sourceOfFunds`, `corporateName`, `corporateAddress`, `registrationNumber`, `dateOfRegistration`, `beneficialOwnership`, `powerOfAttorney`, `idDocument` or `proofOfResidency` |
| `corporate[].personId` | string | no | Which of the company's people the verification is about, by the bank ramp's id (a UUID) |
| `corporate[].documents[]` | array | no | Up to 10 documents, each `{ fileId, kind, side }` as for a person |

**Responses**

`202` Accepted

```json
{
  "environment": "sandbox",
  "customer": { "customerId": "2f6c1e84-5b3a-4d97-8e21-0c4a7b9d3f15", "kind": "personal", "state": "incomplete", "…": "…" },
  "verification": {
    "state": "incomplete",
    "nextStep": "continue_onboarding",
    "missing": ["verifications"],
    "kycStrategy": "reliance"
  },
  "accepted": "verifications"
}
```

`400` Kind not sent

```json
{
  "statusCode": 400,
  "error": "BadRequestError",
  "message": "This tenant's bank ramp KYC in sandbox sends only these verifications: sourceOfFunds.",
  "details": {
    "code": "BANK_RAMP_KYC_VERIFICATION_UNAVAILABLE",
    "environment": "sandbox",
    "allowed": ["sourceOfFunds"],
    "fields": ["personal.0.kind"]
  }
}
```

`400` Not the customer's document

```json
{
  "statusCode": 400,
  "error": "BadRequestError",
  "message": "A verification names a document this customer did not upload.",
  "details": {
    "code": "BANK_RAMP_KYC_FILE_UNKNOWN",
    "environment": "sandbox",
    "fields": ["personal.0.documents.1.fileId"]
  }
}
```

## Implementation

```javascript
// Reliance: the identity document, front and back, uploaded first with Upload a Document
async function sendIdDocument(token, frontFileId, backFileId) {
  const res = await fetch('https://api.aureahub.com/v1/ramp/bank/customer/verifications', {
    method: 'PATCH',
    headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${token}` },
    body: JSON.stringify({
      isTestnet: true,
      personal: [{
        kind: 'idDocument',
        documents: [
          { kind: 'passport', fileId: frontFileId, side: 'front' },
          { kind: 'passport', fileId: backFileId, side: 'back' }
        ]
      }]
    })
  });
  const data = await res.json();
  if (!res.ok) throw new Error(`${res.status} ${data.details?.code}: ${(data.details?.fields ?? []).join(', ')}`);
  return data.verification; // the review moves the customer's states later
}
```

---

Web version: https://docs.aureahub.com/#bank-customer-verifications
