Refund Interac Payments

Interac card payments in Canada can only be refunded when the payment card is present and the original payment is no more than 365 days old. This means that an integration must use a connected Square Terminal to process an Interac refund. Use a Square Terminal and the CreateTerminalRefund endpoint to request a refund of Interac payments on a Square Terminal for Canadian sellers. All other payment types are refunded using the Refunds API.

Did you know?

You can test your Terminal API integration in the Square Sandbox. Use Sandbox test values to test your integration against successful and failed Terminal refunds.

Link to section

Requirements and limitations

  • Applications must have the following OAuth permissions: PAYMENTS_WRITE to process refunds and PAYMENTS_READ to retrieve refunds.
  • You cannot refund non-Interac payments with the Terminal API.
Link to section

Verify that the payment requires an in-person refund

The Payment.CardPaymentDetails object has a refund_requires_card_presence Boolean field that when set to true requires that any refunds occur in-person and on a Square Terminal. To get the Payment object to be refunded, review the TerminalCheckout.payment_ids collection to get the payment IDs used in the checkout. For any payments that must be refunded in person, use the Terminal API. Other payments must use the Refunds API.

Link to section

Search for a Terminal checkout payment

Completed Terminal checkout requests are only held for 30 days. To refund an older Interac payment, you should provide a list of completed Payment objects for the seller to select from.

The following example lists all payments for a seller location within a time range and in descending order:

List payments

An Interac payment refund can be completed when the following requirements are met:

  • The status of the payment must be COMPLETED.
  • The CardPaymentDetails.refund_requires_card_presence must be true.
  • The payment card processed by the payment must be an Interac payment card and the transaction must be in Canadian dollars (CAD).
  • The requested refund amount isn't greater than the initial payment minus the sum of completed refunds.

Important

Refunds must be requested from the seller who took the original Interac payment but can be requested from any of the seller's locations.

Link to section

Create a Terminal refund

Request a refund using the following example. The TerminalCheckout might have been completed with multiple payment cards, which results in multiple payment IDs. Payment cards are refunded individually, which requires a refund request for each card.

Note that the amount of a refund request isn't the Terminal checkout total. Instead, it's the Payment.total_money minus Payment.refunded_money for each payment to be refunded.

Create terminal refund

After a Terminal refund is created, it's in a PENDING state for a short period of time while the Square Terminal device receives the refund request and starts the process with the buyer.

When the Square Terminal device starts interacting with the buyer, the Terminal refund moves to the IN_PROGRESS state.

When the buyer is done with the refund flow, the Terminal refund moves to the COMPLETED state. The buyer might also cancel the flow from the Square Terminal device interface, in which case it moves to the CANCELED state.

When a Terminal refund is in the COMPLETED state, it includes a refund ID that you can reference when calling the Refunds API (that is, to call GetRefund).

Link to section

Webhook notifications

If your application is accepting the terminal.refund.updated and payment.updated webhook notifications, the application receives a notification when the refund request is completed and then a notification when the payment is refunded. The Payment.refunded_money field is incremented with the refunded amount.

Link to section

Get a Terminal refund

To check the status of your Terminal refund, you can issue a GET request with the ID returned from your initial POST request.

Terminal refund objects are specified by appending a Terminal refund ID to the GetTerminalRefund endpoint URL.

Get terminal refund

The response includes a TerminalRefund.

Link to section

Cancel a Terminal refund

You can cancel a Terminal refund request as long as the status of the request is PENDING. The following is an example of a cancel refund request:

Cancel terminal refund

Link to section

Webhook notifications

If your application is accepting the terminal.refund.updated webhook notification, the application receives a notification when the refund request is canceled and a notification when the payment is refunded. The Payment.refunded_money field is incremented with the refunded amount.

Link to section

Search for Terminal refunds

You can retrieve a filtered list of Terminal refund requests created by the seller making the request.

In this example, a list of completed Terminal refunds is requested:

Search terminal refunds

Link to section

Terminal refund webhooks

To get notification of status changes on a Square Terminal Interac refund request, you should configure your application to receive the following webhook events:

  • terminal.refund.created
  • terminal.refund.updated
  • payment.updated

When a refund request is created or the state of the request is updated, a full copy of the TerminalRefund object is sent to your application at the URL you specify.