# ACH error (R29)

Approved Moov accounts can self-serve ACH return code R29 bank account errors. Contact [Moov support](https://support.moov.io/) to find out more about approved account eligibility.

Verifying a bank account may result in an ACH return code `R29` *"corporate customer advises not authorized"*, causing bank accounts to become `errored`. Approved accounts can use the attestation endpoints (supported on Moov API `v2026.10.00` and higher) to reset the bank account back to a `verified` status by attesting the end user has reauthorized debits.

Each bank account can attempt one new authorization attestation in a rolling 365-day period. If an account receives an `R29` ACH return code a second time within that timeframe, you must contact [Moov support](https://support.moov.io/).

## [Get attestation](#get-attestation)

To view all authorization attestations associated with a bank account, use the get attestations [endpoint](/api/v2026.10.00/sources/bank-accounts/get-attestations/).

```zsh
curl -X GET "https://api.moov.io/accounts/{accountID}/bank-accounts/{bankAccountID}/attestations" \
  -H "Authorization: Bearer {token}" \
  -H "X-Moov-Version: v2026.10.00"
```

The response will include the details of all authorization attestations.

```json
[
  {
    "attestationID": "string",
    "description": "string",
    "createdOn": "2026-05-15T14:30:00Z",
    "attestedAt": "2026-05-05"
  }
]
```

## [Get attestation eligibility](#get-attestation-eligibility)

All Moov accounts can check eligibility, but only approved accounts can submit a new authorization attestation. You can check whether a bank account is currently eligible for a new authorization attestation with the eligibility [endpoint](/api/v2026.10.00/sources/bank-accounts/attestations-eligibility/).

The request takes an `attestedAt` query parameter (`YYYY-MM-DD` format), which represents the date to check eligibility against. If `attestedAt` is not provided, it defaults to the current date.

```zsh
curl -X GET "https://api.moov.io/accounts/{accountID}/bank-accounts/{bankAccountID}/attestations-eligibility" \
  -H "Authorization: Bearer {token}" \
  -H "X-Moov-Version: v2026.10.00"
```

The response will identify if the account is enabled for authorization attestation and if it's currently eligible to receive a new authorization attestation.

```json
{
  "enabled": true,
  "eligible": true
}
```

## [Submit attestation](#submit-attestation)

If the account is enabled and eligible, a new authorization attestation can be submitted with the submit attestation [endpoint](/api/v2026.10.00/sources/bank-accounts/submit-attestation/).

You must submit an attestation with the date the authorization was obtained and a brief description of how the authorization was obtained. If the attestation is accepted, the bank account transitions from `errored` to `verified`.

```zsh
curl -X POST "https://api.moov.io/accounts/{accountID}/bank-accounts/{bankAccountID}/attestations" \
  -H "Authorization: Bearer {token}" \
  -H "X-Moov-Version: v2026.10.00" \
  -d '{
    "attestedAt": "2026-05-15",
    "description": "string"
}'
```

You can check the bank account's status with the retrieve a bank account [endpoint](/api/sources/bank-accounts/get/). The response will include the bank account's status.

```json
 1{
 2  "bankAccountID": "833fa3ef-14d3-4c97-ba45-6af66f739832",
 3  "bankAccountType": "checking",
 4  "bankName": "Big Bank",
 5  "fingerprint": "dd4cbfe5fbaf47b392770b5b595bec604fd99394749b7d017153e2b9cfbea40e",
 6  "holderName": "John Doe",
 7  "holderType": "individual",
 8  "lastFourAccountNumber": "6789",
 9  "routingNumber": "123456780",
10  "status": "verified",
11  "statusReason": "bank-account-created",
12  "updatedOn": "2026-12-31T22:37:06Z"
13}
```

Moov reserves the right to audit and require documentation for any attestation submitted.
