Payment Initiation (UK and Europe)
API reference for Payment Initiation endpoints and webhooks
Make payment transfers from your app. Plaid supports both domestic payments denominated in local currencies and international payments, generally denominated in Euro. Domestic payments can be made in pound sterling (typically via the Faster Payments network), Euro (via SEPA Credit Transfer or SEPA Instant) and other local currencies (Polish Zloty, Danish Krone, Swedish Krona, Norwegian Krone), typically via local payment schemes.
For payments in the US, see Transfer.
Looking for guidance on how to integrate using these endpoints? Check out the Payment Initiation documentation.
| Endpoints | |
|---|---|
/payment_initiation/recipient/create | Create a recipient |
/payment_initiation/recipient/get | Fetch recipient data |
/payment_initiation/recipient/list | List all recipients |
/payment_initiation/payment/create | Create a payment |
/payment_initiation/payment/get | Fetch a payment |
/payment_initiation/payment/list | List all payments |
/payment_initiation/payment/reverse | Refund a payment from a virtual account |
/payment_initiation/consent/create | Create a payment consent |
/payment_initiation/consent/get | Fetch a payment consent |
/payment_initiation/consent/revoke | Revoke a payment consent |
/payment_initiation/consent/payment/execute | Execute a payment using payment consent |
Users will be prompted to authorise the payment once you initialise Link. See the documentation for link/token/create for more information on how to obtain a payments link_token.
| Webhooks | |
|---|---|
PAYMENT_STATUS_UPDATE | The status of a payment has changed |
Endpoints
/payment_initiation/recipient/create
Create payment recipient
Create a payment recipient for payment initiation. The recipient must be in Europe, within a country that is a member of the Single Euro Payment Area (SEPA) or a non-Eurozone country supported by Plaid. For a standing order (recurring) payment, the recipient must be in the UK.
It is recommended to use bacs in the UK and iban in EU.
The endpoint is idempotent: if a developer has already made a request with the same payment details, Plaid will return the same recipient_id.
Request fields and example
client_idclient_id. The client_id is required and may be provided either in the PLAID-CLIENT-ID header or as part of a request body.secretsecret. The secret is required and may be provided either in the PLAID-SECRET header or as part of a request body.name1 iban15 34 addressstreet1 1 city1 35 postal_code1 16 country2 2 1// Using BACS, without IBAN or address2const request: PaymentInitiationRecipientCreateRequest = {3 name: 'John Doe',4 bacs: {5 account: '26207729',6 sort_code: '560029',7 },8};9try {10 const response = await plaidClient.paymentInitiationRecipientCreate(request);11 const recipientID = response.data.recipient_id;12} catch (error) {13 // handle error14}Response fields and example
recipient_idrequest_id1{2 "recipient_id": "recipient-id-sandbox-9b6b4679-914b-445b-9450-efbdb80296f6",3 "request_id": "4zlKapIkTm8p5KM"4}Was this helpful?
/payment_initiation/recipient/get
Get payment recipient
Get details about a payment recipient you have previously created.
payment_initiation/recipient/getRequest fields and example
client_idclient_id. The client_id is required and may be provided either in the PLAID-CLIENT-ID header or as part of a request body.secretsecret. The secret is required and may be provided either in the PLAID-SECRET header or as part of a request body.recipient_id1const request: PaymentInitiationRecipientGetRequest = {2 recipient_id: recipientID,3};4try {5 const response = await plaidClient.paymentInitiationRecipientGet(request);6 const recipientID = response.data.recipient_id;7 const name = response.data.name;8 const iban = response.data.iban;9 const address = response.data.address;10} catch (error) {11 // handle error12}Response fields and example
recipient_idnameaddressstreet1 1 city1 35 postal_code1 16 country2 2 ibanrequest_id1{2 "recipient_id": "recipient-id-sandbox-9b6b4679-914b-445b-9450-efbdb80296f6",3 "name": "Wonder Wallet",4 "iban": "GB29NWBK60161331926819",5 "address": {6 "street": [7 "96 Guild Street",8 "9th Floor"9 ],10 "city": "London",11 "postal_code": "SE14 8JW",12 "country": "GB"13 },14 "request_id": "4zlKapIkTm8p5KM"15}Was this helpful?
/payment_initiation/recipient/list
List payment recipients
The /payment_initiation/recipient/list endpoint list the payment recipients that you have previously created.
Request fields and example
1try {2 const response = await plaidClient.paymentInitiationRecipientList({});3 const recipients = response.data.recipients;4} catch (error) {5 // handle error6}Response fields and example
recipientsrecipient_idnameaddressstreet1 1 city1 35 postal_code1 16 country2 2 ibanrequest_id1{2 "recipients": [3 {4 "recipient_id": "recipient-id-sandbox-9b6b4679-914b-445b-9450-efbdb80296f6",5 "name": "Wonder Wallet",6 "iban": "GB29NWBK60161331926819",7 "address": {8 "street": [9 "96 Guild Street",10 "9th Floor"11 ],12 "city": "London",13 "postal_code": "SE14 8JW",14 "country": "GB"15 }16 }17 ],18 "request_id": "4zlKapIkTm8p5KM"19}Was this helpful?
/payment_initiation/payment/create
Create a payment
After creating a payment recipient, you can use the /payment_initiation/payment/create endpoint to create a payment to that recipient. Payments can be one-time or standing order (recurring) and can be denominated in either EUR, GBP or other chosen currency. If making domestic GBP-denominated payments, your recipient must have been created with BACS numbers. In general, EUR-denominated payments will be sent via SEPA Credit Transfer, GBP-denominated payments will be sent via the Faster Payments network and for non-Eurozone markets typically via the local payment scheme, but the payment network used will be determined by the institution. Payments sent via Faster Payments will typically arrive immediately, while payments sent via SEPA Credit Transfer or other local payment schemes will typically arrive in one business day.
Standing orders (recurring payments) must be denominated in GBP and can only be sent to recipients in the UK. Once created, standing order payments cannot be modified or canceled via the API. An end user can cancel or modify a standing order directly on their banking application or website, or by contacting the bank. Standing orders will follow the payment rules of the underlying rails (Faster Payments in UK). Payments can be sent Monday to Friday, excluding bank holidays. If the pre-arranged date falls on a weekend or bank holiday, the payment is made on the next working day. It is not possible to guarantee the exact time the payment will reach the recipient’s account, although at least 90% of standing order payments are sent by 6am.
In the Development environment, payments must be below 5 GBP or other chosen currency. For details on any payment limits in Production, contact your Plaid Account Manager.
Request fields and example
client_idclient_id. The client_id is required and may be provided either in the PLAID-CLIENT-ID header or as part of a request body.secretsecret. The secret is required and may be provided either in the PLAID-SECRET header or as part of a request body.recipient_idreferencereference and adjusted_reference fields, respectively.1 18 amountcurrency"GBP" must be used. For Poland, Denmark, Sweden and Norway, only the local currency is currently supported.GBP, EUR, PLN, SEK, DKK, NOK3 3 value1.23. Minimum accepted value is 1.double scheduleintervalWEEKLY, MONTHLY1 interval_execution_dayIf the payment interval is weekly,
interval_execution_day should be an integer from 1 (Monday) to 7 (Sunday).If the payment interval is monthly,
interval_execution_day should be an integer indicating which day of the month to make the payment on. Integers from 1 to 28 can be used to make a payment on that day of the month. Negative integers from -1 to -5 can be used to make a payment relative to the end of the month. To make a payment on the last day of the month, use -1; to make the payment on the second-to-last day, use -2, and so on.start_dateinterval_execution_day on or after the start_date.If the first
interval_execution_day on or after the start date is also the same day that /payment_initiation/payment/create was called, the bank may make the first payment on that day, but it is not guaranteed to do so.date end_dateinterval_execution_day on or before the end_date.
If the only interval_execution_day between the start date and the end date (inclusive) is also the same day that /payment_initiation/payment/create was called, the bank may make a payment on that day, but it is not guaranteed to do so.date adjusted_start_datenull.date optionsrequest_refund_detailstrue, Plaid will attempt to request refund details from the payee's financial institution. Support varies between financial institutions and will not always be available. If refund details could be retrieved, they will be available in the /payment_initiation/payment/get response.iban15 34 bacsschemeSEPA_CREDIT_TRANSFER for EU). Using unsupported values will result in a failed payment.LOCAL_DEFAULT: The default payment scheme for the selected market and currency will be used.LOCAL_INSTANT: The instant payment scheme for the selected market and currency will be used (if applicable). Fees may be applied by the institution. If the market does not support an Instant Scheme (e.g. Denmark), the default in the region will be used.SEPA_CREDIT_TRANSFER: The standard payment to a beneficiary within the SEPA area.SEPA_CREDIT_TRANSFER_INSTANT: Instant payment within the SEPA area. May involve additional fees and may not be available at some banks.null, LOCAL_DEFAULT, LOCAL_INSTANT, SEPA_CREDIT_TRANSFER, SEPA_CREDIT_TRANSFER_INSTANT1const request: PaymentInitiationPaymentCreateRequest = {2 recipient_id: recipientID,3 reference: 'TestPayment',4 amount: {5 currency: 'GBP',6 value: 100.0,7 },8};9try {10 const response = await plaidClient.paymentInitiationPaymentCreate(request);11 const paymentID = response.data.payment_id;12 const status = response.data.status;13} catch (error) {14 // handle error15}Response fields and example
payment_idstatusPAYMENT_STATUS_INPUT_NEEDED: The initial phase of the paymentPAYMENT_STATUS_INPUT_NEEDEDrequest_id1{2 "payment_id": "payment-id-sandbox-feca8a7a-5591-4aef-9297-f3062bb735d3",3 "status": "PAYMENT_STATUS_INPUT_NEEDED",4 "request_id": "4ciYVmesrySiUAB"5}Was this helpful?
/payment_initiation/payment/get
Get payment details
The /payment_initiation/payment/get endpoint can be used to check the status of a payment, as well as to receive basic information such as recipient and payment amount. In the case of standing orders, the /payment_initiation/payment/get endpoint will provide information about the status of the overall standing order itself; the API cannot be used to retrieve payment status for individual payments within a standing order.
Request fields and example
client_idclient_id. The client_id is required and may be provided either in the PLAID-CLIENT-ID header or as part of a request body.secretsecret. The secret is required and may be provided either in the PLAID-SECRET header or as part of a request body.payment_idpayment_id returned from /payment_initiation/payment/create.1const request: PaymentInitiationPaymentGetRequest = {2 payment_id: paymentID,3};4try {5 const response = await plaidClient.paymentInitiationPaymentGet(request);6 const paymentID = response.data.payment_id;7 const paymentToken = response.data.payment_token;8 const reference = response.data.reference;9 const amount = response.data.amount;10 const status = response.data.status;11 const lastStatusUpdate = response.data.last_status_update;12 const paymentTokenExpirationTime =13 response.data.payment_token_expiration_time;14 const recipientID = response.data.recipient_id;15} catch (error) {16 // handle error17}Response fields and example
payment_idpayment_id is case sensitive.amountcurrency"GBP" must be used. For Poland, Denmark, Sweden and Norway, only the local currency is currently supported.GBP, EUR, PLN, SEK, DKK, NOK3 3 value1.23. Minimum accepted value is 1.double statusPAYMENT_STATUS_INPUT_NEEDED: This is the initial state of all payments. It indicates that the payment is waiting on user input to continue processing. A payment may re-enter this state later on if further input is needed.PAYMENT_STATUS_INITIATED: The payment has been successfully authorised and accepted by the financial institution. For successful payments, this is a potential terminal status. Further status transitions can be to REJECTED and, when supported by the institution, to EXECUTED.PAYMENT_STATUS_INSUFFICIENT_FUNDS: The payment has failed due to insufficient funds.PAYMENT_STATUS_FAILED: The payment has failed to be initiated. This error may be caused by transient system outages and is retryable once the root cause is resolved.PAYMENT_STATUS_BLOCKED: The payment has been blocked by Plaid. This can occur, for example, due to Plaid flagging the payment as potentially risky. This is a retryable error.PAYMENT_STATUS_AUTHORISING: The payment is currently being processed. The payment will automatically exit this state when the financial institution has authorised the transaction.PAYMENT_STATUS_CANCELLED: The payment was cancelled (typically by the end user) during authorisation.PAYMENT_STATUS_EXECUTED: The funds have successfully left the payer account and payment is considered complete. Not all institutions support this status: support is more common in the UK, and less common in the EU. For institutions where this status is not supported, the terminal status for a successful payment will be PAYMENT_STATUS_INITIATED.PAYMENT_STATUS_SETTLED: The payment has settled and funds are available for use. A payment will typically settle within seconds to several days, depending on which payment rail is used. This status is only available to customers using Plaid Virtual Accounts.PAYMENT_STATUS_ESTABLISHED: Indicates that the standing order has been successfully established. This state is only used for standing orders.PAYMENT_STATUS_REJECTED: The payment was rejected by the financial institution.Deprecated: These statuses will be removed in a future release.
PAYMENT_STATUS_UNKNOWN: The payment status is unknown.PAYMENT_STATUS_PROCESSING: The payment is currently being processed. The payment will automatically exit this state when processing is complete.PAYMENT_STATUS_COMPLETED: Indicates that the standing order has been successfully established. This state is only used for standing orders.PAYMENT_STATUS_INPUT_NEEDED, PAYMENT_STATUS_PROCESSING, PAYMENT_STATUS_INITIATED, PAYMENT_STATUS_COMPLETED, PAYMENT_STATUS_INSUFFICIENT_FUNDS, PAYMENT_STATUS_FAILED, PAYMENT_STATUS_BLOCKED, PAYMENT_STATUS_UNKNOWN, PAYMENT_STATUS_EXECUTED, PAYMENT_STATUS_SETTLED, PAYMENT_STATUS_AUTHORISING, PAYMENT_STATUS_CANCELLED, PAYMENT_STATUS_ESTABLISHED, PAYMENT_STATUS_REJECTEDrecipient_idreferenceadjusted_referencelast_status_updatestatus was updated, in IS0 8601 formatdate-time scheduleintervalWEEKLY, MONTHLY1 interval_execution_dayIf the payment interval is weekly,
interval_execution_day should be an integer from 1 (Monday) to 7 (Sunday).If the payment interval is monthly,
interval_execution_day should be an integer indicating which day of the month to make the payment on. Integers from 1 to 28 can be used to make a payment on that day of the month. Negative integers from -1 to -5 can be used to make a payment relative to the end of the month. To make a payment on the last day of the month, use -1; to make the payment on the second-to-last day, use -2, and so on.start_dateinterval_execution_day on or after the start_date.If the first
interval_execution_day on or after the start date is also the same day that /payment_initiation/payment/create was called, the bank may make the first payment on that day, but it is not guaranteed to do so.date end_dateinterval_execution_day on or before the end_date.
If the only interval_execution_day between the start date and the end date (inclusive) is also the same day that /payment_initiation/payment/create was called, the bank may make a payment on that day, but it is not guaranteed to do so.date adjusted_start_datenull.date refund_detailsbacs/payment_initiation/payment/create call.iban/payment_initiation/payment/create call.refund_idsamount_refundedcurrency"GBP" must be used. For Poland, Denmark, Sweden and Norway, only the local currency is currently supported.GBP, EUR, PLN, SEK, DKK, NOK3 3 value1.23.double 0.01 wallet_idschemeSEPA_CREDIT_TRANSFER for EU). Using unsupported values will result in a failed payment.LOCAL_DEFAULT: The default payment scheme for the selected market and currency will be used.LOCAL_INSTANT: The instant payment scheme for the selected market and currency will be used (if applicable). Fees may be applied by the institution. If the market does not support an Instant Scheme (e.g. Denmark), the default in the region will be used.SEPA_CREDIT_TRANSFER: The standard payment to a beneficiary within the SEPA area.SEPA_CREDIT_TRANSFER_INSTANT: Instant payment within the SEPA area. May involve additional fees and may not be available at some banks.null, LOCAL_DEFAULT, LOCAL_INSTANT, SEPA_CREDIT_TRANSFER, SEPA_CREDIT_TRANSFER_INSTANTadjusted_schemeSEPA_CREDIT_TRANSFER for EU). Using unsupported values will result in a failed payment.LOCAL_DEFAULT: The default payment scheme for the selected market and currency will be used.LOCAL_INSTANT: The instant payment scheme for the selected market and currency will be used (if applicable). Fees may be applied by the institution. If the market does not support an Instant Scheme (e.g. Denmark), the default in the region will be used.SEPA_CREDIT_TRANSFER: The standard payment to a beneficiary within the SEPA area.SEPA_CREDIT_TRANSFER_INSTANT: Instant payment within the SEPA area. May involve additional fees and may not be available at some banks.null, LOCAL_DEFAULT, LOCAL_INSTANT, SEPA_CREDIT_TRANSFER, SEPA_CREDIT_TRANSFER_INSTANTconsent_idtransaction_idrequest_id1{2 "payment_id": "payment-id-sandbox-feca8a7a-5591-4aef-9297-f3062bb735d3",3 "payment_token": "payment-token-sandbox-c6a26505-42b4-46fe-8ecf-bf9edcafbebb",4 "reference": "Account Funding 99744",5 "amount": {6 "currency": "GBP",7 "value": 1008 },9 "status": "PAYMENT_STATUS_INPUT_NEEDED",10 "last_status_update": "2019-11-06T21:10:52Z",11 "recipient_id": "recipient-id-sandbox-9b6b4679-914b-445b-9450-efbdb80296f6",12 "bacs": {13 "account": "31926819",14 "account_id": "vzeNDwK7KQIm4yEog683uElbp9GRLEFXGK98D",15 "sort_code": "601613"16 },17 "iban": null,18 "request_id": "aEAQmewMzlVa1k6"19}Was this helpful?
/payment_initiation/payment/list
List payments
The /payment_initiation/payment/list endpoint can be used to retrieve all created payments. By default, the 10 most recent payments are returned. You can request more payments and paginate through the results using the optional count and cursor parameters.
Request fields and example
client_idclient_id. The client_id is required and may be provided either in the PLAID-CLIENT-ID header or as part of a request body.secretsecret. The secret is required and may be provided either in the PLAID-SECRET header or as part of a request body.countcount is not specified, a maximum of 10 payments will be returned, beginning with the most recent payment before the cursor (if specified).1 200 10 cursordate-time consent_id1const request: PaymentInitiationPaymentListRequest = {2 count: 10,3 cursor: '2019-12-06T22:35:49Z',4};5try {6 const response = await plaidClient.paymentInitiationPaymentList(request);7 const payments = response.data.payments;8 const nextCursor = response.data.next_cursor;9} catch (error) {10 // handle error11}Response fields and example
paymentsclient_id.payment_idpayment_id is case sensitive.amountcurrency"GBP" must be used. For Poland, Denmark, Sweden and Norway, only the local currency is currently supported.GBP, EUR, PLN, SEK, DKK, NOK3 3 value1.23. Minimum accepted value is 1.double statusPAYMENT_STATUS_INPUT_NEEDED: This is the initial state of all payments. It indicates that the payment is waiting on user input to continue processing. A payment may re-enter this state later on if further input is needed.PAYMENT_STATUS_INITIATED: The payment has been successfully authorised and accepted by the financial institution. For successful payments, this is a potential terminal status. Further status transitions can be to REJECTED and, when supported by the institution, to EXECUTED.PAYMENT_STATUS_INSUFFICIENT_FUNDS: The payment has failed due to insufficient funds.PAYMENT_STATUS_FAILED: The payment has failed to be initiated. This error may be caused by transient system outages and is retryable once the root cause is resolved.PAYMENT_STATUS_BLOCKED: The payment has been blocked by Plaid. This can occur, for example, due to Plaid flagging the payment as potentially risky. This is a retryable error.PAYMENT_STATUS_AUTHORISING: The payment is currently being processed. The payment will automatically exit this state when the financial institution has authorised the transaction.PAYMENT_STATUS_CANCELLED: The payment was cancelled (typically by the end user) during authorisation.PAYMENT_STATUS_EXECUTED: The funds have successfully left the payer account and payment is considered complete. Not all institutions support this status: support is more common in the UK, and less common in the EU. For institutions where this status is not supported, the terminal status for a successful payment will be PAYMENT_STATUS_INITIATED.PAYMENT_STATUS_SETTLED: The payment has settled and funds are available for use. A payment will typically settle within seconds to several days, depending on which payment rail is used. This status is only available to customers using Plaid Virtual Accounts.PAYMENT_STATUS_ESTABLISHED: Indicates that the standing order has been successfully established. This state is only used for standing orders.PAYMENT_STATUS_REJECTED: The payment was rejected by the financial institution.Deprecated: These statuses will be removed in a future release.
PAYMENT_STATUS_UNKNOWN: The payment status is unknown.PAYMENT_STATUS_PROCESSING: The payment is currently being processed. The payment will automatically exit this state when processing is complete.PAYMENT_STATUS_COMPLETED: Indicates that the standing order has been successfully established. This state is only used for standing orders.PAYMENT_STATUS_INPUT_NEEDED, PAYMENT_STATUS_PROCESSING, PAYMENT_STATUS_INITIATED, PAYMENT_STATUS_COMPLETED, PAYMENT_STATUS_INSUFFICIENT_FUNDS, PAYMENT_STATUS_FAILED, PAYMENT_STATUS_BLOCKED, PAYMENT_STATUS_UNKNOWN, PAYMENT_STATUS_EXECUTED, PAYMENT_STATUS_SETTLED, PAYMENT_STATUS_AUTHORISING, PAYMENT_STATUS_CANCELLED, PAYMENT_STATUS_ESTABLISHED, PAYMENT_STATUS_REJECTEDrecipient_idreferenceadjusted_referencelast_status_updatestatus was updated, in IS0 8601 formatdate-time scheduleintervalWEEKLY, MONTHLY1 interval_execution_dayIf the payment interval is weekly,
interval_execution_day should be an integer from 1 (Monday) to 7 (Sunday).If the payment interval is monthly,
interval_execution_day should be an integer indicating which day of the month to make the payment on. Integers from 1 to 28 can be used to make a payment on that day of the month. Negative integers from -1 to -5 can be used to make a payment relative to the end of the month. To make a payment on the last day of the month, use -1; to make the payment on the second-to-last day, use -2, and so on.start_dateinterval_execution_day on or after the start_date.If the first
interval_execution_day on or after the start date is also the same day that /payment_initiation/payment/create was called, the bank may make the first payment on that day, but it is not guaranteed to do so.date end_dateinterval_execution_day on or before the end_date.
If the only interval_execution_day between the start date and the end date (inclusive) is also the same day that /payment_initiation/payment/create was called, the bank may make a payment on that day, but it is not guaranteed to do so.date adjusted_start_datenull.date refund_detailsbacs/payment_initiation/payment/create call.iban/payment_initiation/payment/create call.refund_idsamount_refundedcurrency"GBP" must be used. For Poland, Denmark, Sweden and Norway, only the local currency is currently supported.GBP, EUR, PLN, SEK, DKK, NOK3 3 value1.23.double 0.01 wallet_idschemeSEPA_CREDIT_TRANSFER for EU). Using unsupported values will result in a failed payment.LOCAL_DEFAULT: The default payment scheme for the selected market and currency will be used.LOCAL_INSTANT: The instant payment scheme for the selected market and currency will be used (if applicable). Fees may be applied by the institution. If the market does not support an Instant Scheme (e.g. Denmark), the default in the region will be used.SEPA_CREDIT_TRANSFER: The standard payment to a beneficiary within the SEPA area.SEPA_CREDIT_TRANSFER_INSTANT: Instant payment within the SEPA area. May involve additional fees and may not be available at some banks.null, LOCAL_DEFAULT, LOCAL_INSTANT, SEPA_CREDIT_TRANSFER, SEPA_CREDIT_TRANSFER_INSTANTadjusted_schemeSEPA_CREDIT_TRANSFER for EU). Using unsupported values will result in a failed payment.LOCAL_DEFAULT: The default payment scheme for the selected market and currency will be used.LOCAL_INSTANT: The instant payment scheme for the selected market and currency will be used (if applicable). Fees may be applied by the institution. If the market does not support an Instant Scheme (e.g. Denmark), the default in the region will be used.SEPA_CREDIT_TRANSFER: The standard payment to a beneficiary within the SEPA area.SEPA_CREDIT_TRANSFER_INSTANT: Instant payment within the SEPA area. May involve additional fees and may not be available at some banks.null, LOCAL_DEFAULT, LOCAL_INSTANT, SEPA_CREDIT_TRANSFER, SEPA_CREDIT_TRANSFER_INSTANTconsent_idtransaction_idnext_cursorcursor parameter to /payment_initiation/payment/list, will return the next unreturned payment as its first payment.date-time request_id1{2 "payments": [3 {4 "payment_id": "payment-id-sandbox-feca8a7a-5591-4aef-9297-f3062bb735d3",5 "reference": "Account Funding 99744",6 "amount": {7 "currency": "GBP",8 "value": 1009 },10 "status": "PAYMENT_STATUS_INPUT_NEEDED",11 "last_status_update": "2019-11-06T21:10:52Z",12 "recipient_id": "recipient-id-sandbox-9b6b4679-914b-445b-9450-efbdb80296f6",13 "bacs": {14 "account": "31926819",15 "account_id": "vzeNDwK7KQIm4yEog683uElbp9GRLEFXGK98D",16 "sort_code": "601613"17 },18 "iban": null19 }20 ],21 "next_cursor": "2020-01-01T00:00:00Z",22 "request_id": "aEAQmewMzlVa1k6"23}Was this helpful?
/payment_initiation/payment/reverse
Reverse an existing payment
Reverse a settled payment from a Plaid virtual account.
The original payment must be in a settled state to be refunded.
To refund partially, specify the amount as part of the request.
If the amount is not specified, the refund amount will be equal to all
of the remaining payment amount that has not been refunded yet.
The refund will go back to the source account that initiated the payment.
The original payment must have been initiated to a Plaid virtual account
so that this account can be used to initiate the refund.
Request fields and example
client_idclient_id. The client_id is required and may be provided either in the PLAID-CLIENT-ID header or as part of a request body.secretsecret. The secret is required and may be provided either in the PLAID-SECRET header or as part of a request body.payment_ididempotency_keyThe API supports idempotency for safely retrying requests without accidentally performing the same operation twice. If a request to execute a wallet transaction fails due to a network connection error, then after a minimum delay of one minute, you can retry the request with the same idempotency key to guarantee that only a single wallet transaction is created. If the request was successfully processed, it will prevent any transaction that uses the same idempotency key, and was received within 24 hours of the first request, from being processed.
128 1 reference18 6 amountcurrency"GBP" must be used. For Poland, Denmark, Sweden and Norway, only the local currency is currently supported.GBP, EUR, PLN, SEK, DKK, NOK3 3 value1.23.double 0.01 1const request: PaymentInitiationPaymentReverseRequest = {2 payment_id: paymentID,3 reference: 'Refund for purchase ABC123',4 idempotency_key: 'ae009325-df8d-4f52-b1e0-53ff26c23912',5};6try {7 const response = await plaidClient.paymentInitiationPaymentReverse(request);8 const refundID = response.data.refund_id;9 const status = response.data.status;10} catch (error) {11 // handle error12}Response fields and example
refund_idstatusAUTHORISING: The transaction is being processed for validation and compliance.INITIATED: The transaction has been initiated and is currently being processed.EXECUTED: The transaction has been successfully executed and is considered complete. This is only applicable for debit transactions.SETTLED: The transaction has settled and funds are available for use. This is only applicable for credit transactions. A transaction will typically settle within seconds to several days, depending on which payment rail is used.FAILED: The transaction failed to process successfully. This is a terminal status.BLOCKED: The transaction has been blocked for violating compliance rules. This is a terminal status.AUTHORISING, INITIATED, EXECUTED, SETTLED, BLOCKED, FAILEDrequest_id1{2 "refund_id": "wallet-transaction-id-production-c5f8cd31-6cae-4cad-9b0d-f7c10be9cc4b",3 "request_id": "HtlKzBX0fMeF7mU",4 "status": "INITIATED"5}Was this helpful?
/payment_initiation/consent/create
Create payment consent
The /payment_initiation/consent/create endpoint is used to create a payment consent, which can be used to initiate payments on behalf of the user. Payment consents are created with UNAUTHORISED status by default and must be authorised by the user before payments can be initiated.
Consents can be limited in time and scope, and have constraints that describe limitations for payments.
Request fields and example
client_idclient_id. The client_id is required and may be provided either in the PLAID-CLIENT-ID header or as part of a request body.secretsecret. The secret is required and may be provided either in the PLAID-SECRET header or as part of a request body.recipient_idreference1 18 scopes1 ME_TO_ME, EXTERNALconstraintsvalid_date_timeto date the payment consent expires and can no longer be used for payment initiation.max_payment_amountcurrency"GBP" must be used. For Poland, Denmark, Sweden and Norway, only the local currency is currently supported.GBP, EUR, PLN, SEK, DKK, NOK3 3 value1.23. Minimum accepted value is 1.double periodic_amounts1 amountcurrency"GBP" must be used. For Poland, Denmark, Sweden and Norway, only the local currency is currently supported.GBP, EUR, PLN, SEK, DKK, NOK3 3 value1.23. Minimum accepted value is 1.double intervalDAY, WEEK, MONTH, YEARalignmentCALENDAR: line up with a calendar.CONSENT: on the date of consent creation.CALENDAR, CONSENToptionsrequest_refund_detailstrue, Plaid will attempt to request refund details from the payee's financial institution. Support varies between financial institutions and will not always be available. If refund details could be retrieved, they will be available in the /payment_initiation/payment/get response.iban15 34 bacs1const request: PaymentInitiationConsentCreateRequest = {2 recipient_id: recipientID,3 reference: 'TestPaymentConsent',4 scopes: new Set([PaymentInitiationConsentScope.MeToMe]),5 constraints: {6 valid_date_time: {7 to: '2024-12-31T23:59:59Z',8 },9 max_payment_amount: {10 currency: PaymentAmountCurrency.Gbp,11 value: 15,12 },13 periodic_amounts: [14 {15 amount: {16 currency: PaymentAmountCurrency.Gbp,17 value: 40,18 },19 alignment: PaymentConsentPeriodicAlignment.Calendar,20 interval: PaymentConsentPeriodicInterval.Month,21 },22 ],23 },24};2526try {27 const response = await plaidClient.paymentInitiationConsentCreate(request);28 const consentID = response.data.consent_id;29 const status = response.data.status;30} catch (error) {31 // handle error32}Response fields and example
consent_idstatusUNAUTHORISED: Consent created, but requires user authorisation.REJECTED: Consent authorisation was rejected by the user and/or the bank.AUTHORISED: Consent is active and ready to be used.REVOKED: Consent has been revoked and can no longer be used.EXPIRED: Consent is no longer valid.UNAUTHORISED, AUTHORISED, REVOKED, REJECTED, EXPIREDrequest_id1{2 "consent_id": "consent-id-production-feca8a7a-5491-4444-9999-f3062bb735d3",3 "status": "UNAUTHORISED",4 "request_id": "4ciYmmesdqSiUAB"5}Was this helpful?
/payment_initiation/consent/get
Get payment consent
The /payment_initiation/consent/get endpoint can be used to check the status of a payment consent, as well as to receive basic information such as recipient and constraints.
Request fields and example
client_idclient_id. The client_id is required and may be provided either in the PLAID-CLIENT-ID header or as part of a request body.secretsecret. The secret is required and may be provided either in the PLAID-SECRET header or as part of a request body.consent_idconsent_id returned from /payment_initiation/consent/create.1const request: PaymentInitiationConsentGetRequest = {2 consent_id: consentID,3};45try {6 const response = await plaidClient.paymentInitiationConsentGet(request);7 const consentID = response.data.consent_id;8 const status = response.data.status;9} catch (error) {10 // handle error11}Response fields and example
consent_id1 statusUNAUTHORISED: Consent created, but requires user authorisation.REJECTED: Consent authorisation was rejected by the user and/or the bank.AUTHORISED: Consent is active and ready to be used.REVOKED: Consent has been revoked and can no longer be used.EXPIRED: Consent is no longer valid.UNAUTHORISED, AUTHORISED, REVOKED, REJECTED, EXPIREDcreated_atrecipient_id1 referenceconstraintsvalid_date_timeto date the payment consent expires and can no longer be used for payment initiation.max_payment_amountcurrency"GBP" must be used. For Poland, Denmark, Sweden and Norway, only the local currency is currently supported.GBP, EUR, PLN, SEK, DKK, NOK3 3 value1.23. Minimum accepted value is 1.double periodic_amounts1 amountcurrency"GBP" must be used. For Poland, Denmark, Sweden and Norway, only the local currency is currently supported.GBP, EUR, PLN, SEK, DKK, NOK3 3 value1.23. Minimum accepted value is 1.double intervalDAY, WEEK, MONTH, YEARalignmentCALENDAR: line up with a calendar.CONSENT: on the date of consent creation.CALENDAR, CONSENTscopesME_TO_ME, EXTERNALrequest_id1{2 "request_id": "4ciYuuesdqSiUAB",3 "consent_id": "consent-id-production-feca8a7a-5491-4aef-9298-f3062bb735d3",4 "status": "AUTHORISED",5 "created_at": "2021-10-30T15:26:48Z",6 "recipient_id": "recipient-id-production-9b6b4679-914b-445b-9450-efbdb80296f6",7 "reference": "ref-00001",8 "constraints": {9 "valid_date_time": {10 "from": "2021-12-25T11:12:13Z",11 "to": "2022-12-31T15:26:48Z"12 },13 "max_payment_amount": {14 "currency": "GBP",15 "value": 10016 },17 "periodic_amounts": [18 {19 "amount": {20 "currency": "GBP",21 "value": 30022 },23 "interval": "WEEK",24 "alignment": "CALENDAR"25 }26 ]27 },28 "scopes": [29 "ME_TO_ME"30 ]31}Was this helpful?
/payment_initiation/consent/revoke
Revoke payment consent
The /payment_initiation/consent/revoke endpoint can be used to revoke the payment consent. Once the consent is revoked, it is not possible to initiate payments using it.
Request fields and example
client_idclient_id. The client_id is required and may be provided either in the PLAID-CLIENT-ID header or as part of a request body.secretsecret. The secret is required and may be provided either in the PLAID-SECRET header or as part of a request body.consent_id1const request: PaymentInitiationConsentRevokeRequest = {2 consent_id: consentID,3};4try {5 const response = await plaidClient.paymentInitiationConsentRevoke(request);6} catch (error) {7 // handle error8}Response fields and example
request_id1{2 "request_id": "4ciYaaesdqSiUAB"3}Was this helpful?
/payment_initiation/consent/payment/execute
Execute a single payment using consent
The /payment_initiation/consent/payment/execute endpoint can be used to execute payments using payment consent.
Request fields and example
client_idclient_id. The client_id is required and may be provided either in the PLAID-CLIENT-ID header or as part of a request body.secretsecret. The secret is required and may be provided either in the PLAID-SECRET header or as part of a request body.consent_idamountcurrency"GBP" must be used. For Poland, Denmark, Sweden and Norway, only the local currency is currently supported.GBP, EUR, PLN, SEK, DKK, NOK3 3 value1.23. Minimum accepted value is 1.double idempotency_keyThe API supports idempotency for safely retrying requests without accidentally performing the same operation twice. If a request to execute a consent payment fails due to a network connection error, you can retry the request with the same idempotency key to guarantee that only a single payment is created. If the request was successfully processed, it will prevent any payment that uses the same idempotency key, and was received within 24 hours of the first request, from being processed.
128 1 referencereference and adjusted_reference fields, respectively.1 18 scopeME_TO_ME, EXTERNAL1const request: PaymentInitiationConsentPaymentExecuteRequest = {2 consent_id: consentID,3 amount: {4 currency: PaymentAmountCurrency.Gbp,5 value: 7.99,6 },7 reference: 'Payment#1',8 idempotency_key: idempotencyKey,9};10try {11 const response = await plaidClient.paymentInitiationConsentPaymentExecute(12 request,13 );14 const paymentID = response.data.payment_id;15 const status = response.data.status;16} catch (error) {17 // handle error18}Response fields and example
payment_idstatusPAYMENT_STATUS_INPUT_NEEDED: This is the initial state of all payments. It indicates that the payment is waiting on user input to continue processing. A payment may re-enter this state later on if further input is needed.PAYMENT_STATUS_INITIATED: The payment has been successfully authorised and accepted by the financial institution. For successful payments, this is a potential terminal status. Further status transitions can be to REJECTED and, when supported by the institution, to EXECUTED.PAYMENT_STATUS_INSUFFICIENT_FUNDS: The payment has failed due to insufficient funds.PAYMENT_STATUS_FAILED: The payment has failed to be initiated. This error may be caused by transient system outages and is retryable once the root cause is resolved.PAYMENT_STATUS_BLOCKED: The payment has been blocked by Plaid. This can occur, for example, due to Plaid flagging the payment as potentially risky. This is a retryable error.PAYMENT_STATUS_AUTHORISING: The payment is currently being processed. The payment will automatically exit this state when the financial institution has authorised the transaction.PAYMENT_STATUS_CANCELLED: The payment was cancelled (typically by the end user) during authorisation.PAYMENT_STATUS_EXECUTED: The funds have successfully left the payer account and payment is considered complete. Not all institutions support this status: support is more common in the UK, and less common in the EU. For institutions where this status is not supported, the terminal status for a successful payment will be PAYMENT_STATUS_INITIATED.PAYMENT_STATUS_SETTLED: The payment has settled and funds are available for use. A payment will typically settle within seconds to several days, depending on which payment rail is used. This status is only available to customers using Plaid Virtual Accounts.PAYMENT_STATUS_ESTABLISHED: Indicates that the standing order has been successfully established. This state is only used for standing orders.PAYMENT_STATUS_REJECTED: The payment was rejected by the financial institution.Deprecated: These statuses will be removed in a future release.
PAYMENT_STATUS_UNKNOWN: The payment status is unknown.PAYMENT_STATUS_PROCESSING: The payment is currently being processed. The payment will automatically exit this state when processing is complete.PAYMENT_STATUS_COMPLETED: Indicates that the standing order has been successfully established. This state is only used for standing orders.PAYMENT_STATUS_INPUT_NEEDED, PAYMENT_STATUS_PROCESSING, PAYMENT_STATUS_INITIATED, PAYMENT_STATUS_COMPLETED, PAYMENT_STATUS_INSUFFICIENT_FUNDS, PAYMENT_STATUS_FAILED, PAYMENT_STATUS_BLOCKED, PAYMENT_STATUS_UNKNOWN, PAYMENT_STATUS_EXECUTED, PAYMENT_STATUS_SETTLED, PAYMENT_STATUS_AUTHORISING, PAYMENT_STATUS_CANCELLED, PAYMENT_STATUS_ESTABLISHED, PAYMENT_STATUS_REJECTEDrequest_id1{2 "payment_id": "payment-id-sandbox-feca8a7a-5591-4aef-9297-f3062bb735d3",3 "request_id": "4ciYccesdqSiUAB",4 "status": "PAYMENT_STATUS_INITIATED"5}Was this helpful?
Webhooks
Updates are sent to indicate that the status of an initiated payment has changed. All Payment Initiation webhooks have a webhook_type of PAYMENT_INITIATION.
PAYMENT_STATUS_UPDATE
Fired when the status of a payment has changed.
webhook_typePAYMENT_INITIATIONwebhook_codePAYMENT_STATUS_UPDATEpayment_idpayment_id for the payment being updatedtransaction_idnew_payment_statusPAYMENT_STATUS_INPUT_NEEDED: This is the initial state of all payments. It indicates that the payment is waiting on user input to continue processing. A payment may re-enter this state later on if further input is needed.PAYMENT_STATUS_INITIATED: The payment has been successfully authorised and accepted by the financial institution. For successful payments, this is a potential terminal status. Further status transitions can be to REJECTED and, when supported by the institution, to EXECUTED.PAYMENT_STATUS_INSUFFICIENT_FUNDS: The payment has failed due to insufficient funds.PAYMENT_STATUS_FAILED: The payment has failed to be initiated. This error may be caused by transient system outages and is retryable once the root cause is resolved.PAYMENT_STATUS_BLOCKED: The payment has been blocked by Plaid. This can occur, for example, due to Plaid flagging the payment as potentially risky. This is a retryable error.PAYMENT_STATUS_AUTHORISING: The payment is currently being processed. The payment will automatically exit this state when the financial institution has authorised the transaction.PAYMENT_STATUS_CANCELLED: The payment was cancelled (typically by the end user) during authorisation.PAYMENT_STATUS_EXECUTED: The funds have successfully left the payer account and payment is considered complete. Not all institutions support this status: support is more common in the UK, and less common in the EU. For institutions where this status is not supported, the terminal status for a successful payment will be PAYMENT_STATUS_INITIATED.PAYMENT_STATUS_SETTLED: The payment has settled and funds are available for use. A payment will typically settle within seconds to several days, depending on which payment rail is used. This status is only available to customers using Plaid Virtual Accounts.PAYMENT_STATUS_ESTABLISHED: Indicates that the standing order has been successfully established. This state is only used for standing orders.PAYMENT_STATUS_REJECTED: The payment was rejected by the financial institution.Deprecated: These statuses will be removed in a future release.
PAYMENT_STATUS_UNKNOWN: The payment status is unknown.PAYMENT_STATUS_PROCESSING: The payment is currently being processed. The payment will automatically exit this state when processing is complete.PAYMENT_STATUS_COMPLETED: Indicates that the standing order has been successfully established. This state is only used for standing orders.PAYMENT_STATUS_INPUT_NEEDED, PAYMENT_STATUS_PROCESSING, PAYMENT_STATUS_INITIATED, PAYMENT_STATUS_COMPLETED, PAYMENT_STATUS_INSUFFICIENT_FUNDS, PAYMENT_STATUS_FAILED, PAYMENT_STATUS_BLOCKED, PAYMENT_STATUS_UNKNOWN, PAYMENT_STATUS_EXECUTED, PAYMENT_STATUS_SETTLED, PAYMENT_STATUS_AUTHORISING, PAYMENT_STATUS_CANCELLED, PAYMENT_STATUS_ESTABLISHED, PAYMENT_STATUS_REJECTEDold_payment_statusPAYMENT_STATUS_INPUT_NEEDED: This is the initial state of all payments. It indicates that the payment is waiting on user input to continue processing. A payment may re-enter this state later on if further input is needed.PAYMENT_STATUS_INITIATED: The payment has been successfully authorised and accepted by the financial institution. For successful payments, this is a potential terminal status. Further status transitions can be to REJECTED and, when supported by the institution, to EXECUTED.PAYMENT_STATUS_INSUFFICIENT_FUNDS: The payment has failed due to insufficient funds.PAYMENT_STATUS_FAILED: The payment has failed to be initiated. This error may be caused by transient system outages and is retryable once the root cause is resolved.PAYMENT_STATUS_BLOCKED: The payment has been blocked by Plaid. This can occur, for example, due to Plaid flagging the payment as potentially risky. This is a retryable error.PAYMENT_STATUS_AUTHORISING: The payment is currently being processed. The payment will automatically exit this state when the financial institution has authorised the transaction.PAYMENT_STATUS_CANCELLED: The payment was cancelled (typically by the end user) during authorisation.PAYMENT_STATUS_EXECUTED: The funds have successfully left the payer account and payment is considered complete. Not all institutions support this status: support is more common in the UK, and less common in the EU. For institutions where this status is not supported, the terminal status for a successful payment will be PAYMENT_STATUS_INITIATED.PAYMENT_STATUS_SETTLED: The payment has settled and funds are available for use. A payment will typically settle within seconds to several days, depending on which payment rail is used. This status is only available to customers using Plaid Virtual Accounts.PAYMENT_STATUS_ESTABLISHED: Indicates that the standing order has been successfully established. This state is only used for standing orders.PAYMENT_STATUS_REJECTED: The payment was rejected by the financial institution.Deprecated: These statuses will be removed in a future release.
PAYMENT_STATUS_UNKNOWN: The payment status is unknown.PAYMENT_STATUS_PROCESSING: The payment is currently being processed. The payment will automatically exit this state when processing is complete.PAYMENT_STATUS_COMPLETED: Indicates that the standing order has been successfully established. This state is only used for standing orders.PAYMENT_STATUS_INPUT_NEEDED, PAYMENT_STATUS_PROCESSING, PAYMENT_STATUS_INITIATED, PAYMENT_STATUS_COMPLETED, PAYMENT_STATUS_INSUFFICIENT_FUNDS, PAYMENT_STATUS_FAILED, PAYMENT_STATUS_BLOCKED, PAYMENT_STATUS_UNKNOWN, PAYMENT_STATUS_EXECUTED, PAYMENT_STATUS_SETTLED, PAYMENT_STATUS_AUTHORISING, PAYMENT_STATUS_CANCELLED, PAYMENT_STATUS_ESTABLISHED, PAYMENT_STATUS_REJECTEDoriginal_referenceadjusted_referenceoriginal_start_datestart_date provided during the creation of a standing order. If the payment is not a standing order, this field will be null.date adjusted_start_datenull.date errorerror_type. In general, 200 HTTP codes correspond to success, 40X codes are for developer- or user-related failures, and 50X codes are for Plaid-related issues. An Item with a non-null error object will only be part of an API response when calling /item/get to view Item status. Otherwise, error fields will be null if no error has occurred; if an error has occurred, an error code will be returned instead.error_typeINVALID_REQUEST, INVALID_RESULT, INVALID_INPUT, INSTITUTION_ERROR, RATE_LIMIT_EXCEEDED, API_ERROR, ITEM_ERROR, ASSET_REPORT_ERROR, RECAPTCHA_ERROR, OAUTH_ERROR, PAYMENT_ERROR, BANK_TRANSFER_ERROR, INCOME_VERIFICATION_ERROR, MICRODEPOSITS_ERRORerror_codeerror_messagedisplay_messagenull if the error is not related to user action.This may change over time and is not safe for programmatic use.
request_idcausescauses will return an array of errors containing a breakdown of these errors on the individual Item level, if any can be identified.causes will only be provided for the error_type ASSET_REPORT_ERROR. causes will also not be populated inside an error nested within a warning object.statusdocumentation_urlsuggested_actionenvironmentdevelopment, sandbox, production1{2 "webhook_type": "PAYMENT_INITIATION",3 "webhook_code": "PAYMENT_STATUS_UPDATE",4 "payment_id": "payment-id-production-2ba30780-d549-4335-b1fe-c2a938aa39d2",5 "new_payment_status": "PAYMENT_STATUS_INITIATED",6 "old_payment_status": "PAYMENT_STATUS_PROCESSING",7 "original_reference": "Account Funding 99744",8 "adjusted_reference": "Account Funding 99",9 "original_start_date": "2017-09-14",10 "adjusted_start_date": "2017-09-15",11 "timestamp": "2017-09-14T14:42:19.350Z",12 "environment": "production"13}