> ## Documentation Index
> Fetch the complete documentation index at: https://www.marqeta.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Instant Card Transfers

> Learn how Instant Card Transfers moves money between a Marqeta-issued card and an external, non-Marqeta debit or prepaid card over card network rails.

> [!NOTE]
>
> **Note**
> This feature is currently in beta and subject to change. To learn more about the Beta program for this feature, contact your Marqeta Customer Success representative.

Account holders funding a new deposit account or card typically rely on direct deposit or an ACH transfer from another bank account, both of which can take three to five days to complete. Instant Card Transfers gives account holders a faster alternative: it moves funds between a Marqeta-issued card and an external, non-Marqeta debit or prepaid card over card network rails, so funds are available for spending within seconds instead of days.

This guide provides an overview of Instant Card Transfers and the APIs you can use to implement it.

At the end of this guide, you should understand:

* What Instant Card Transfers is, and the use cases it supports.
* How to add, view, and manage an external card.
* How to create a transfer, and which `transfer_type` to use for your use case.
* What to check before a transfer fails because of an ineligible card.
* Where to find the API reference pages for the Transfers and External Cards APIs.

## What is Instant Card Transfers

Instant Card Transfers connects a Marqeta-issued card to an external card (a debit or prepaid card issued by another financial institution) and lets you move funds between them in real time. A Marqeta customer adds the external card to the Marqeta platform, then uses that card as the source or destination for a transfer.

Instant Card Transfers uses Cross River Bank (CRB) as the acquirer for the external card side of each transfer. Because the transfer happens over card network rails instead of ACH, funds are available to spend immediately, without waiting for a batch settlement cycle.

However, creating a transfer and fulfilling it are two separate, asynchronous steps. Marqeta accepts a valid request immediately, then completes fulfillment in the background. A successful request means Marqeta accepted the transfer, not that funds have already moved. Track the outcome of a transfer with [webhooks](#webhooks) or by [retrieving the transfer](#retrieving-a-single-transfer).

## Use cases

Instant Card Transfers supports several money movement scenarios:

* **Account funding**: An account holder funds a new deposit account or card by pulling funds from an external card, instead of waiting on direct deposit or ACH.
* **Cardholder funding ("me to me")**: A cardholder tops up their Marqeta-issued card from a card of their own held elsewhere.
* **Account-to-account (A2A) transfers**: A cardholder sends funds from their Marqeta-issued card to their own external card.
* **Business-to-consumer (B2C) disbursements**: A Marqeta customer's program disburses funds, such as gig-economy wages, insurance payouts, or government benefits, directly to a consumer's external card.
* **Business-to-business (B2B) transfers**: A Marqeta customer sends funds to a commercial external card. Instant Card Transfers supports consumer, commercial, and B2B cards without differentiation, as long as the destination card passes validity checks for account funding transactions (AFT) and original credit transactions (OCT).

## Transfer types

Every transfer you create has a `transfer_type` that determines the direction funds move:

* **`CARD_PULL`**: Pulls funds from an external card to a Marqeta-issued card or account.
* **`CARD_PUSH`**: Pushes funds from a Marqeta-issued card or account to an external card.
* **`CARD_DISBURSEMENT`**: Pushes funds to an external card with no associated Marqeta source account, such as a one-time payout.

## Adding an external card

Before you can create a transfer, the external card involved must exist as an `externalcard` resource on the Marqeta platform.

Send a `POST` request to `/v3/moneymovement/externalcards` with the card's primary account number (PAN), CVV2, expiration date, and billing details. You must collect this data using your own PCI-compliant user interface.

The billing details you supply must include either the external cardholder's first and last name, or a business name, depending on whether the external account holder is a person or a business. See [Add external card](/docs/core-api/external-cards/#addExternalCard) for sample request and response bodies covering both cases.

If you already know which Marqeta user or business the external card belongs to, link it at add time by supplying `user_token` or `business_token`. This way, you can omit the corresponding token later when you create a transfer, as described in [Creating a transfer](#creating-a-transfer).

If you require a card to support push or pull transfers before you add it, set `require_push_funds_eligibility` or `require_pull_funds_eligibility` to `true`; the request fails if the card is not eligible. See [Handling ineligible cards and failed requests](#handling-ineligible-cards-and-failed-requests).

## Managing external cards

### Listing a customer's external cards

Send a `GET` request to `/v3/moneymovement/externalcards/accountholders/{account_holder_token}` to retrieve every external card associated with a user or business. Use the `count` and `start_index` query parameters to page through the results. See [List external cards](/docs/core-api/external-cards/#getAccountholderExternalCards) for the complete field reference.

### Retrieving a single external card

Send a `GET` request to `/v3/moneymovement/externalcards/{token}` to retrieve a specific external card by its token. See [Retrieve external card](/docs/core-api/external-cards/#getExternalCard).

### Checking a card's status and eligibility

An external card's `status` is `ACTIVE`, `SUSPENDED`, or `TERMINATED`. Its `is_eligible_for_pull`, `is_eligible_for_push`, and `is_eligible_for_disbursement` flags indicate which `transfer_type` values will succeed for that card. Check these values (returned when you add, list, or retrieve an external card) before creating a transfer, rather than relying on the transfer request to fail.

### Suspending or terminating an external card

Send a `PATCH` request to `/v3/moneymovement/externalcards/{token}` with `status` set to `SUSPENDED` or `TERMINATED`, for example if the account holder removes the card or it becomes invalid. You can also reactivate a suspended card by setting its status back to `ACTIVE`. See [Update external card](/docs/core-api/external-cards/#updateExternalCard).

## Creating a transfer

Send a `POST` request to `/v3/moneymovement/transfers` with the `transfer_type`, the `card_token` of the external card, the `amount`, and the `currency`.

Depending on the transfer type, you can optionally identify the Marqeta-side account holder using a user or business token, but only if you didn't already link the external card to that user or business when you added it:

* For a `CARD_PUSH` transfer, use `source_user_token` or `source_business_token`, not both.
* For a `CARD_PULL` transfer, use `destination_user_token` or `destination_business_token`, not both.

`CARD_DISBURSEMENT` transfers don't accept a source or destination token.

See [Create transfer](/docs/core-api/digital-banking-transfers/#createTransfer) for sample request bodies covering each combination.

### Matching a use case to a transfer type

Several of the use cases described earlier use the same `transfer_type`. The difference between them is where in your flow you call the endpoint, not anything in the request itself:

| `transfer_type` | Moves funds | Include a token when... |
| - | - | - |
| `CARD_PULL` | From the external card to a Marqeta account or card. Used for account funding, cardholder "me to me" funding, and an A2A pull. | The external card wasn't already linked to a Marqeta user or business when you added it. Set `destination_user_token` or `destination_business_token`. |
| `CARD_PUSH` | From a Marqeta account or card to the external card. Used for an A2A push and for a B2C disbursement funded from a program's own account. | The external card wasn't already linked to a Marqeta user or business when you added it. Set `source_user_token` or `source_business_token`. |
| `CARD_DISBURSEMENT` | To the external card, with no associated Marqeta source account. Used for a one-time payout not backed by an ongoing Marqeta account relationship. | Never. `CARD_DISBURSEMENT` doesn't accept a source or destination token. |

### Tracking fulfillment status

A successful `POST` request to `/v3/moneymovement/transfers` returns the transfer with `status` set to `PENDING`. This means the request passed validation and was accepted for processing. The funds haven't moved yet.

Marqeta then fulfills the transfer in the background. When fulfillment finishes, the transfer moves to a final status:

* **`COMPLETE`**: Funds moved successfully.
* **`REJECTED`**: Fulfillment failed, for example because the external card was declined. No funds moved.

A transfer can later move to `CHARGEBACK` if a dispute is raised after completion.

To learn the outcome of a transfer, use one of these approaches:

* **Webhooks (recommended)**: Subscribe to `instantcardtransfertransition` events, as described in [Webhooks](#webhooks).
* **Polling**: Send a `GET` request to `/v3/moneymovement/transfers/{token}` and check `status`. Use this as a fallback, for example to reconcile after a missed webhook.

Don't treat a `PENDING` transfer as successful. Wait for the transfer to reach `COMPLETE` before you credit the account holder or release goods or services. Pending transfers count toward the 24-hour rolling limit described in [Velocity controls](#velocity-controls).

## Viewing a transfer

### Listing transfers for an account holder

Send a `GET` request to `/v3/moneymovement/transfers/accountholders/{account_holder_token}` to retrieve a paginated list of transfers for a user or business. Use the `count` and `start_index` query parameters to page through the results. See [List transfers for an account holder](/docs/core-api/digital-banking-transfers/#getAccountholderTransfers).

### Retrieving a single transfer

Send a `GET` request to `/v3/moneymovement/transfers/{token}` to retrieve a specific transfer by its token. See [Retrieve transfer](/docs/core-api/digital-banking-transfers/#getTransfer).

A transfer's `status` field defines the values `PENDING`, `COMPLETE`, `REJECTED`, and `CHARGEBACK`, matching the states a transfer moves through during fulfillment.

## Handling ineligible cards and failed requests

A request can fail for a few different reasons:

* If you set `require_push_funds_eligibility` or `require_pull_funds_eligibility` to `true` when adding an external card, the request fails if the card doesn't meet that requirement.
* If you create a transfer using a `transfer_type` the card isn't eligible for, the request fails. Check the card's `is_eligible_for_pull`, `is_eligible_for_push`, and `is_eligible_for_disbursement` flags first, as described in [Checking a card's status and eligibility](#checking-a-cards-status-and-eligibility).
* If you retrieve an external card or transfer with a token that doesn't exist, the request returns a `404` response.

<note>A transfer that passes validation can still fail during fulfillment. The create request succeeds with a PENDING transfer, and the failure appears later as a transition to REJECTED. See [Tracking fulfillment status](#tracking-fulfillment-status).</note>

For the full list of Core API error codes, see [Errors](/docs/core-api/errors/).

## Velocity controls

Instant Card Transfers currently enforces two velocity controls, configured per program:

* A per-transaction amount limit.
* A 24-hour rolling daily amount limit, calculated per account holder from completed and pending transfers.

There's currently no monthly transaction-count limit. If a program doesn't configure these limits during onboarding, fallback default limits apply: \$10,000 per transaction and \$50,000 per rolling 24 hours.

## Webhooks

Instant Card Transfers uses the same webhook subscription model available across the Marqeta platform. Subscribe to `instantcardtransfertransition` events to receive a notification as a transfer moves through fulfillment, such as when it completes, is rejected, or is charged back. For more information, see [Instant card transfer transition events](/docs/core-api/event-types/#_instant_card_transfer_transition_events), [About Webhooks](/docs/developer-guides/about-webhooks/), and the [Webhooks](/docs/core-api/webhooks/) API reference page.

## Related content

* [External Cards](/docs/core-api/external-cards/): add, list, retrieve, and update external cards.
* [Transfers](/docs/core-api/digital-banking-transfers/): create, list, and retrieve transfers.
* [Money Movement Overview](/docs/developer-guides/money-movement-overview/): how money moves through the Marqeta platform for standard card transactions.


## Related topics

- [Event Types](/docs/core-api/event-types.md)
- [Account & Money Movement Release Notes](/docs/developer-guides/account-money-movement-release-notes/2026.md)
- [Money Movement Overview](/docs/developer-guides/money-movement-overview.md)
- [Transfers Overview](/docs/core-api/digital-banking-transfers.md)
- [Provisioning Digital Wallet Tokens](/docs/developer-guides/provisioning-digital-wallet-tokens.md)
