# Self-serve ACH R29 returns

> Approved accounts can reset a bank account errored by ACH return code R29 by attesting the end user reauthorized debits, via the API or Moov Dashboard.

> AI agents: search and read all Moov docs with the docs MCP server at https://docs.moov.io/mcp (no API key). Setup: https://docs.moov.io/guides/developer-tools/mcp-ai/docs-mcp/index.md

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 or a debit attempt 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. See [ACH returns](/guides/money-movement/ach/returns/index.md) for every return code and how Moov handles it.

> **Tip:** 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/).

## Resolve in the Dashboard

When an R29 return occurs, an **Errored** status appears on the bank account within the **Account overview** or **Bank account details** view, and a **Failed source payment error** appears within the **Transfer details** view. Click **Resolve ACH return** from any of these views to start the authorization attestation process.

**Account overview**

![Account errored](images/bank-account-dropdown-r29.png)

**Bank account details**

![Bank account errored](images/bank-account-details-r29.png)

**Transfer details**

![Transfer failed](images/transfer-details-r29.png)

To resolve the error and restore the account, confirm a new authorization by contacting the account holder. Provide the date the new authorization was obtained, a description (such as how the new authorization was obtained), and check the box confirming the account holder reauthorizes Moov to originate debits. You are responsible for retaining supporting evidence of the authorization attestation.

![Restore account modal](images/restore-account-r29.png)

A successful authorization will show accounts as **Verified** and transfers as **Completed**.

## Resolve with the API

The attestation endpoints are supported on Moov API `v2026.10.00` and higher, so the examples below set that version header.

### 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/index.md).

```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

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/index.md).

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

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/index.md).

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/index.md). 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}
```

> **Note:** Moov reserves the right to audit and require documentation for any attestation submitted.

