Create a transfer authorization
POST /transfer/authorization/create
Use the /transfer/authorization/create endpoint to authorize a transfer. This endpoint must be called prior to calling /transfer/create. The transfer authorization will expire if not used after one hour. (You can contact your account manager to change the default authorization lifetime.)
There are four possible outcomes to calling this endpoint:
-
If the
authorization.decisionin the response isdeclined, the proposed transfer has failed the risk check and you cannot proceed with the transfer. -
If the
authorization.decisionisuser_action_required, additional user input is needed, usually to fix a broken bank connection, before Plaid can properly assess the risk. You need to launch Link in update mode to complete the required user action. When calling/link/token/createto get a new Link token, instead of providingaccess_tokenin the request, you should settransfer.authorization_idas theauthorization.id. After the Link flow is completed, you may re-attempt the authorization. -
If the
authorization.decisionisapproved, and theauthorization.rationale_codeisnull, the transfer has passed the risk check and you can proceed to call/transfer/create. -
If the
authorization.decisionisapprovedand theauthorization.rationale_codeis non-null, the risk check could not be run: you may proceed with the transfer, but should perform your own risk evaluation. For more details, see the response schema.
In Plaid's Sandbox environment the decisions will be returned as follows:
-
To approve a transfer with
nullrationale code, make an authorization request with anamountless than the available balance in the account. -
To approve a transfer with the rationale code
MANUALLY_VERIFIED_ITEM, create an Item in Link through the Same Day Micro-deposits flow. -
To get an authorization decision of
user_action_required, reset the login for an Item. -
To decline a transfer with the rationale code
NSF, the available balance on the account must be less than the authorizationamount. See Create Sandbox test data for details on how to customize data in Sandbox. -
To decline a transfer with the rationale code
RISK, the available balance on the account must be exactly $0. See Create Sandbox test data for details on how to customize data in Sandbox.
Request Body
Required
Defines the request schema for /transfer/authorization/create
Parameters
client_id
client_id. The client_id is required and may be provided either in the PLAID-CLIENT-ID header or as part of a request body.
secret
secret. The secret is required and may be provided either in the PLAID-SECRET header or as part of a request body.
access_token
access_token for the account that will be debited or credited.
account_id
account_id corresponding to the end-user account that will be debited or credited.
funding_account_id
funding_account_ids in the Accounts page of your Plaid Dashboard, under the “Account ID” column. If this field is left blank and you are using legacy funding methods, this will default to the default funding_account_id specified during onboarding. Otherwise, Plaid Ledger will be used.
ledger_id
ledger_ids in the Accounts page of your Plaid Dashboard. If this field is left blank, this will default to id of the default ledger balance.
payment_profile_token
access_token.
type
debit or credit. A debit indicates a transfer of money into the origination account; a credit indicates a transfer of money out of the origination account.
network
ach or same-day-ach, the Standard ACH cutoff is 8:30 PM Eastern Time.
For transfers submitted as same-day-ach, the Same Day ACH cutoff is 3:30 PM Eastern Time. It is recommended to send the request 15 minutes prior to the cutoff to ensure that it will be processed in time for submission before the cutoff. If the transfer is processed after this cutoff but before the Standard ACH cutoff, it will be sent over Standard ACH rails and will not incur same-day charges; this will apply to both legs of the transfer if applicable. The transaction limit for a Same Day ACH transfer is $1,000,000. Authorization requests sent with an amount greater than $1,000,000 will fail.
For transfers submitted as rtp, Plaid will automatically route between Real Time Payment rail by TCH or FedNow rails as necessary. If a transfer is submitted as rtp and the counterparty account is not eligible for RTP, the /transfer/authorization/create request will fail with an INVALID_FIELD error code. To pre-check to determine whether a counterparty account can support RTP, call /transfer/capabilities/get before calling /transfer/authorization/create.
Wire transfers are currently in early availability. To request access to wire as a payment network, contact your Account Manager. For transfers submitted as wire, the type must be credit; wire debits are not supported. The cutoff to submit a wire payment is 6:30 PM Eastern Time on a business day; wires submitted after that time will be processed on the next business day. The transaction limit for a wire is $999,999.99. Authorization requests sent with an amount greater than $999,999.99 will fail.
amount
/transfer/authorization/create, specify the maximum amount to authorize. When calling /transfer/create, specify the exact amount of the transfer, up to a maximum of the amount authorized. If this field is left blank when calling /transfer/create, the maximum amount authorized in the authorization_id will be sent.
ach_class
ccd, ppd
Codes supported for debits: ccd, tel, web
"ccd" - Corporate Credit or Debit - fund transfer between two corporate bank accounts
"ppd" - Prearranged Payment or Deposit - The transfer is part of a pre-existing relationship with a consumer. Authorization was obtained in writing either in person or via an electronic document signing, e.g. Docusign, by the consumer. Can be used for credits or debits.
"web" - Internet-Initiated Entry. The transfer debits a consumer’s bank account. Authorization from the consumer is obtained over the Internet (e.g. a web or mobile application). Can be used for single debits or recurring debits.
"tel" - Telephone-Initiated Entry. The transfer debits a consumer. Debit authorization has been received orally over the telephone via a recorded call.
wire_details
message_to_beneficiary
wire_return_fee
user
user.legal_name field is required. Other fields are not currently used and are present to support planned future functionality.
legal_name
phone_number
email_address
address
street
city
region
postal_code
country
device
ip_address
user_agent
origination_account_id
iso_currency_code
idempotency_key
user_action_required. Therefore you may re-attempt the authorization after completing the required user action without changing idempotency_key.
This idempotency key expires after 48 hours, after which the same key can be reused. Failure to provide this key may result in duplicate charges.
user_present
true; for automatic recurring payments where the end user is not actually initiating each individual transfer, it should be false. This field is not currently used and is present to support planned future functionality.
with_guarantee
false, Plaid will not offer a guarantee_decision for this request (Guarantee customers only).
beacon_session_id
originator_client_id
credit_funds_source
test_clock_id
sandbox environment. If provided, the authorization is created at the virtual_time on the provided test clock.
ruleset_key
Response
Defines the response schema for /transfer/authorization/create
Response Properties
authorization
id
created
2006-01-02T15:04:05Z.
decision
approved – The proposed transfer has received the end user’s consent and has been approved for processing by Plaid. The decision_rationale field is set if Plaid was unable to fetch the account information. You may proceed with the transfer, but further review is recommended. Refer to the code field in the decision_rationale object for details.
declined – Plaid reviewed the proposed transfer and declined processing. Refer to the code field in the decision_rationale object for details.
user_action_required – An action is required before Plaid can assess the transfer risk and make a decision. The most common scenario is to update authentication for an Item. To complete the required action, initialize Link by setting transfer.authorization_id in the request of /link/token/create. After Link flow is completed, you may re-attempt the authorization request.
decision_rationale
declined decisions, and may or may not be null for approved decisions.
code
rationale_code is null, the transfer passed the authorization check.
Any non-null value for an approved transfer indicates that the the authorization check could not be run and that you should perform your own risk assessment on the transfer. The code will indicate why the check could not be run. Possible values for an approved transfer are:
MANUALLY_VERIFIED_ITEM – Item created via a manual entry flow (i.e. Same Day Micro-deposit, Instant Micro-deposit, or database-based verification), limited information available.
ITEM_LOGIN_REQUIRED – Unable to collect the account information due to Item staleness. Can be resolved by using Link and setting transfer.authorization_id in the request to /link/token/create.
MIGRATED_ACCOUNT_ITEM - Item created via /transfer/migrate_account endpoint, limited information available.
ERROR – Unable to collect the account information due to an unspecified error.
The following codes indicate that the authorization decision was declined:
NSF – Transaction likely to result in a return due to insufficient funds.
RISK - Transaction is high-risk.
TRANSFER_LIMIT_REACHED - One or several transfer limits are reached, e.g. monthly transfer limit. Check the accompanying description field to understand which limit has been reached.
description
guarantee_decision
GUARANTEED or NOT_GUARANTEED indicating whether Plaid will guarantee the transfer. If the transfer is not guaranteed, additional information will be provided in the guarantee_decision_rationale field. Refer to the code field in guarantee_decision_rationale for details.
guarantee_decision_rationale
null unless guarantee_decision is NOT_GUARANTEED.
code
RETURN_BANK: The risk of a bank-initiated return (for example, an R01/NSF) is too high to guarantee this transfer.
RETURN_CUSTOMER: The risk of a customer-initiated return (for example, a R10/Unauthorized) is too high to guarantee this transfer.
GUARANTEE_LIMIT_REACHED: This transfer is low-risk, but Guarantee has exhausted an internal limit on the number or rate of guarantees that applies to this transfer.
RISK_ESTIMATE_UNAVAILABLE: A risk estimate is unavailable for this Item.
REQUIRED_PARAM_MISSING: Required fields are missing.
description
payment_risk
bank_initiated_return_score
customer_initiated_return_score
risk_level
warnings
warning_type
warning_code
ITEM_LOGIN_REQUIRED warning, we recommend re-authenticating your user by implementing Link’s update mode. This will guide your user to fix their credentials, allowing Plaid to start fetching data again for future Signal requests.
warning_message
proposed_transfer
ach_class
ccd, ppd
Codes supported for debits: ccd, tel, web
"ccd" - Corporate Credit or Debit - fund transfer between two corporate bank accounts
"ppd" - Prearranged Payment or Deposit - The transfer is part of a pre-existing relationship with a consumer. Authorization was obtained in writing either in person or via an electronic document signing, e.g. Docusign, by the consumer. Can be used for credits or debits.
"web" - Internet-Initiated Entry. The transfer debits a consumer’s bank account. Authorization from the consumer is obtained over the Internet (e.g. a web or mobile application). Can be used for single debits or recurring debits.
"tel" - Telephone-Initiated Entry. The transfer debits a consumer. Debit authorization has been received orally over the telephone via a recorded call.
account_id
account_id for the account that will be debited or credited.
funding_account_id
ledger_id
type
debit or credit. A debit indicates a transfer of money into the origination account; a credit indicates a transfer of money out of the origination account.
user
legal_name
phone_number
email_address
address
street
city
region
postal_code
country
amount
/transfer/authorization/create, specify the maximum amount to authorize. When calling /transfer/create, specify the exact amount of the transfer, up to a maximum of the amount authorized. If this field is left blank when calling /transfer/create, the maximum amount authorized in the authorization_id will be sent.
network
wire_details
message_to_beneficiary
wire_return_fee
origination_account_id
iso_currency_code
originator_client_id
credit_funds_source
request_id