---
title: "Verify a customer in sandbox"
description: "What happens when you verify a sandbox customer today, what you cannot test, and how to keep building while sandbox verification does not complete."
---
Use this recipe to see what happens when you verify a sandbox customer today, what you cannot test, and how to keep building while sandbox verification does not complete.

**Who it is for.** A neobank that is building its onboarding screens and needs verified sandbox customers to open accounts and cards.

**Status.** Not yet available. A sandbox verification does not complete for a new customer, and you cannot test a rejection or a resubmission.

## Money example

No money moves here, but verification decides what money can move. You create Amara in sandbox, and she finishes the hosted check. Her `basic` verification stays `pending`, so you cannot open a USD account or a card for her. You ask support for an already verified sandbox customer and test accounts and cards with that customer instead.

## Before you start

A sandbox key. The customer fields follow the same rules as in live. Send a phone number in a real format, and ISO country and state codes. See [Verify a person on a hosted page](/recipes/customers-and-kyc/verify-a-person-on-a-hosted-page).

## Find out what is required

`GET /v1/customers/{customer_id}` shows each level's `status` in `kyc[]`. Start only when `basic` is `not_started` or `failed`. Read `status`, not `verified_at`. Gravv sets `verified_at` on every row when it creates the customer.

## Steps

### 1. Create the customer and start the hosted check

Follow [Verify a person on a hosted page](/recipes/customers-and-kyc/verify-a-person-on-a-hosted-page) with your sandbox key. The `web_url` in the response opens the verification partner's test page.

### 2. See what happens today

<CodeGroup>
```bash title="cURL"
curl --request GET \
     --url https://api.gravv.xyz/v1/customers/3f6b2a1e-8c4d-4e7f-9a2b-5c1d0e9f8a71/kyc/status \
     --header 'Api-Key: <API_KEY>'
```
```javascript title="Node"
const response = await fetch("https://api.gravv.xyz/v1/customers/3f6b2a1e-8c4d-4e7f-9a2b-5c1d0e9f8a71/kyc/status", {
  method: "GET",
  headers: {
    "Api-Key": process.env.GRAVV_API_KEY,
  },
});
console.log(response.status, await response.json());
```
```python title="Python"
import os

import requests

response = requests.get(
    "https://api.gravv.xyz/v1/customers/3f6b2a1e-8c4d-4e7f-9a2b-5c1d0e9f8a71/kyc/status",
    headers={
        "Api-Key": os.environ["GRAVV_API_KEY"],
    },
)
print(response.status_code, response.json())
```
</CodeGroup>

Within about 3 minutes of submitting, the review comes back rejected with a retry (`reviewAnswer` `rejected`, `reviewRejectType` `RETRY`), whatever you uploaded. The `basic` row stays `pending`, and Gravv sends no `customer.kyc.status.completed` or `customer.kyc.status.failed`. Stop polling after a few minutes.

### 3. Keep building with a verified customer

Ask Gravv support for an already verified sandbox customer, and use that customer for [accounts](/recipes/accounts-v2/overview) and [cards](/recipes/cards/overview). Test the rejected screen with a recorded `customer.kyc.status.failed` payload.

## What can go wrong

| Response | Why | Fix |
| :-- | :-- | :-- |
| The row stays `pending`, and `kyc/status` shows `reviewStatus` `completed` and `reviewAnswer` `rejected` | Sandbox verification does not complete today | Changing the images or restarting does not help. Use a verified sandbox customer from support |
| The row stays `pending`, and `kyc/status` shows `reviewStatus` `pending` | The customer did not submit the hosted steps | Finish the hosted page. If needed, start again once the link's 1 hour has passed |
| `CUSTOMER_KYC_INCOMPLETE` on `POST /v2/accounts` | The customer is not verified | Use a verified sandbox customer |
| 500 `failed to upload documents to verification provider` on a second server-to-server start | You resubmitted after the rejected review | Do not retry in a loop |
| 413 `the uploaded file is too large — the maximum is 10MB` on a small file | Sandbox refuses files from about 600 KB | Send JPEG or PDF files under 500 KB |
| `associated person "<name>" must complete basic KYC before business verification can proceed` | A business's people cannot complete verification in sandbox today | You cannot test business verification today |

## Webhooks you will receive

You receive `customer.created`, then `customer.kyc.status.pending` about 9 seconds after a hosted start. Today, no other events follow.

## Testing in sandbox

This page is the sandbox guide for verification. Gravv charges a verification fee to your sandbox billing as in live, on its own `fee_charge` row.

## Reference

- [Get a customer](/api-reference/customers/get-v1-customers-customer-id)
- [KYC status](/api-reference/kyc/get-v1-customers-customer-id-kyc-status)
- [Environments](/getting-started/environments)
