Skip to main content
Work in progressThis section is currently under active development as part of improvements planned for 2026. Content may change as we expand product capabilities.If you’re interested in early access or want to learn more about what’s coming, feel free to reach out to the team.
This guide walks you through setting up Flinks Pay with EFT (Electronic Funds Transfer) as the payment method, from sandbox testing to production.

Prerequisites

Before starting your integration:
  • Complete Flinks onboarding and receive your API credentials (x-client-id)
  • Review and finalize your Pre-Authorized Debit (PAD) agreement with Flinks
  • Obtain sandbox access credentials from your Flinks representative

Step 1: Set Up Environments

Use the appropriate base URL for your environment:
EnvironmentBase URL
Sandboxhttps://payments-uat.flinksapp.com
Productionhttps://payments.flinksapp.com
Start development in the sandbox environment. All examples below use the sandbox URL.

Step 2: Authenticate

Obtain an access token using the /api/v1/authorize endpoint with your Client ID and Secret:
curl --location 'https://payments-uat.flinksapp.com/api/v1/authorize' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--header 'Authorization: Basic {{clientId:clientSecret}}' \
--data-urlencode 'grant_type=client_credentials'
The response includes an access_token valid for 599 seconds. See Authorize for details.

Step 3: Create an EFT Transaction

Call POST /api/v1/transactions to create a new EFT transaction. Include your x-client-id header for authentication.

One-Time Debit Example

curl --location 'https://payments-uat.flinksapp.com/api/v1/transactions' \
--header 'Content-Type: application/json' \
--header 'x-client-id: {{your-client-id}}' \
--data '[{
  "transactionCode": 1,
  "amount": 100.00,
  "description": "Invoice 12345",
  "crossReferenceNumber": "INV-12345",
  "paymentDirection": "DEBIT",
  "currency": "CAD",
  "payor": {
    "accountInfo": {
      "institutionCode": "001",
      "transitNumber": "12345",
      "accountNumber": "1234567"
    },
    "contactInfo": {
      "firstName": "John",
      "lastName": "Smith"
    }
  },
  "scheduleInfo": {
    "paymentFrequency": "OneTime",
    "startDate": "2026-04-15"
  }
}]'
The response returns a schedules array containing the created schedule with its ID and status.

Recurring Debit Example

curl --location 'https://payments-uat.flinksapp.com/api/v1/transactions' \
--header 'Content-Type: application/json' \
--header 'x-client-id: {{your-client-id}}' \
--data '[{
  "transactionCode": 1,
  "amount": 50.00,
  "paymentDirection": "DEBIT",
  "currency": "CAD",
  "payor": {
    "accountInfo": {
      "institutionCode": "001",
      "transitNumber": "12345",
      "accountNumber": "1234567"
    },
    "contactInfo": {
      "firstName": "John",
      "lastName": "Smith"
    }
  },
  "scheduleInfo": {
    "paymentFrequency": "Monthly",
    "startDate": "2026-04-15",
    "transactionsCount": 12
  }
}]'
See Create Transaction for the full request and response schema.

Step 4: Monitor Payment Status

Poll the payment request status to track your transaction:
curl --location 'https://payments-uat.flinksapp.com/api/v1/paymentrequests/{{requestId}}'
Optionally pass refreshStatus=true to fetch the latest status from the payment network before responding:
curl --location 'https://payments-uat.flinksapp.com/api/v1/paymentrequests/{{requestId}}?refreshStatus=true'
See Get Payment Request for the full response schema and status values.

Step 5: Handle Recurring Schedules

For recurring debit transactions, you can define a schedule using one of the following approaches:
  • End date — Payments continue on the set frequency until the end date is reached.
  • Transaction count — A fixed number of payments (maximum 300) are executed on the set frequency.
You must provide exactly one of endDate or transactionsCount for recurring schedules.

Available Frequencies

FrequencyDescription
OneTimeSingle payment on the start date
WeeklyEvery week from the start date
BiweeklyEvery two weeks from the start date
MonthlyEvery month from the start date

Step 6: Cancel Schedules When Needed

To cancel an upcoming schedule:
curl --location --request POST \
'https://payments-uat.flinksapp.com/api/v1/schedules/{{scheduleId}}/cancel' \
--header 'x-client-id: {{your-client-id}}'
To cancel a specific payment request:
curl --location --request POST \
'https://payments-uat.flinksapp.com/api/v1/paymentrequests/{{requestId}}/cancel'

Step 7: Go to Production

When you are ready to go live:
  1. Switch your base URL from payments-uat.flinksapp.com to payments.flinksapp.com.
  2. Use your production API credentials (provided by Flinks during onboarding).
  3. Verify your PAD agreement is finalized and approved.
  4. Confirm your settlement account is configured with Flinks.

Field Specifications Summary

FieldConstraint
amountMinimum $0.01
descriptionMax 15 characters
crossReferenceNumberAlphanumeric + hyphens, max 36 characters
institutionCodeExactly 3 digits
transitNumberExactly 5 digits
accountNumber7–12 digits
transactionsCountMax 300 (recurring only)

Common Integration Issues

  • Start date must be in the future for debit transactions. Same-day start dates are only valid for credit transactions.
  • DEBIT requires payor, not payee. CREDIT requires payee, not payor.
  • Recurring schedules need either endDate or transactionsCount, but not both.
  • Credit transactions only support OneTime frequency with a same-day start date.
  • Account info must provide either an accountId or the combination of institutionCode + transitNumber + accountNumber, but not both.