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 re-initiate 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 the instant bank account verification process through Moov’s instant verification POST endpoint. Moov 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.

1
2
curl -X POST "https://api.moov.io/accounts/{accountID}/bank-accounts/{bankAccountID}/verify" \
  -H "Authorization: Bearer {token}" \
1
2
3
4
5
6
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 the verification by submitting the 4-digit code via the instant verification PUT endpoint. 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
1
2
3
4
5
curl -X PUT "https://api.moov.io/accounts/{accountID}/bank-accounts/{bankAccountID}/verify" \
  -H "Authorization: Bearer {token}" \
  --data-raw '{
    "code":"MV1234"
  }'\
1
2
3
4
5
6
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 the status of the verification using the instant verification GET endpoint. The response includes the verificationMethod and the current status.

1
2
3
4
{
  "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
Summary Beta