# Instant micro-deposit verification

Link and verify eligible user bank accounts to their Moov accounts with instant micro-deposit verification via RTP or same-day ACH.

Available to RTP-enabled accounts, instant micro-deposit verification provides a fast and efficient, single-session method to confirm bank account ownership while meeting Nacha bank validation requirements. This method improves upon traditional micro-deposit methods, which can take several days.

Instant micro-deposit verification:

- Initiates a $0.01 credit containing a unique verification code is sent to the user's bank account
- Delivers instantly over the RTP network for RTP-enabled banks and over same-day ACH for non-RTP-enabled banks, ensuring broad compatibility
- Allows the user to retrieve a code from their transaction history and enters it to complete verification

Users have 14 days and five attempts to submit the code for verification. If the code has not been submitted or entered incorrectly five times, you can reinitiate the bank account verification process. Verification can be attempted a total of three times per bank account.

If you initiate verification for a bank account that is not RTP-enabled, Moov will automatically use same-day ACH instead of RTP for verification. ACH verification is not instant.

## [Initiate](#initiate)

Initiate the instant bank account verification process through Moov's instant micro-deposit verification `POST` [endpoint](/api/sources/bank-accounts/initiate-bank-account-verification/). A 4-digit numeric code is generated and sent with a $0.01 credit to the user's bank account. The code appears on the user’s transaction history as `MV{code}`.

Use the `X-Wait-For: rail-response` header to synchronously receive the outcome of the instant credit in the response payload. The response will contain the details of the `verificationMethod` and status. The `verificationMethod` (`instant` for RTP or `ach` for same-day ACH) is automatically selected based on the bank's capabilities.

[cURL](#tab-983746125-0-0) [Go](#tab-983746125-0-1)

```zsh
curl -X POST "https://api.moov.io/accounts/{accountID}/bank-accounts/{bankAccountID}/verify" \
  -H "Authorization: Bearer {token}" \
  -H "x-moov-version: v2024.01.00" \
```

```go
mc, _ := moov.NewClient()

var accountID string
var bankAccountID string

mc.InstantVerificationInitiate(ctx, accountID, bankAccountID)
```

Possible response status:

- `new`: Verification initiated, credit pending
- `sent-credit`: Credit sent, available for verification in the external bank account
- `failed`: Verification failed due to credit rejection/return, see `exceptionDetails`

## [Complete](#complete)

Complete the verification by submitting the 4-digit code via the instant micro-deposit verification `PUT` [endpoint](/api/sources/bank-accounts/complete-bank-account-verification/). You'll receive a `2XX` response if the correct code is provided. An incorrect code will result in a `409` response with details.

The code is case-insensitive and can be entered with or without the "MV" prefix. The code can follow any of the following accepted formats:

- `MV0000`
- `mv0000`
- `0000`

[cURL](#tab-697582143-0-0) [Go](#tab-697582143-0-1)

```zsh
curl -X PUT "https://api.moov.io/accounts/{accountID}/bank-accounts/{bankAccountID}/verify" \
  -H "Authorization: Bearer {token}" \
  -H "x-moov-version: v2024.01.00" \
  --data-raw '{
    "code":"MV1234"
  }'\
```

```go
mc, _ := moov.NewClient()

var accountID string
var bankAccountID string

mc.InstantVerificationComplete(ctx, accountID, bankAccountID, "MV1234")
```

Upon successful verification, the bank account status will be updated to `verified`, enabling ACH debit transactions.

## [Check status](#check-status)

Check the status of the verification using the instant micro-deposit verification `GET` [endpoint](/api/sources/bank-accounts/get-bank-account-verification/). The response includes the `verificationMethod` and the current `status`.

```json
{
  "status": "successful",
  "verificationMethod": "instant"
}
```

The `status` will indicate the following:

- `new`: Verification initiated, credit pending to the payment network
- `sent-credit`: Credit sent, available for verification
- `failed`: Verification failed, description provided, user needs to add a new bank account
- `expired`: Verification expired after 14 days, reinitiate verification
- `max-attempts-exceeded`: Five incorrect attempts, reinitiate verification
