curl --request POST \
--url https://www.{baseurl}.com/api/v1/transactions \
--header 'Content-Type: application/json' \
--header 'x-client-id: <x-client-id>' \
--data '
[
{
"transactionCode": 1,
"amount": 250,
"description": "Invoice 1001",
"crossReferenceNumber": "INV-1001",
"paymentDirection": "DEBIT",
"currency": "CAD",
"payor": {
"accountInfo": {
"institutionCode": "001",
"transitNumber": "12345",
"accountNumber": "1234567"
},
"contactInfo": {
"firstName": "Jane",
"lastName": "Doe"
}
},
"scheduleInfo": {
"paymentFrequency": "OneTime",
"startDate": "2026-04-15"
}
}
]
'import requests
url = "https://www.{baseurl}.com/api/v1/transactions"
payload = [
{
"transactionCode": 1,
"amount": 250,
"description": "Invoice 1001",
"crossReferenceNumber": "INV-1001",
"paymentDirection": "DEBIT",
"currency": "CAD",
"payor": {
"accountInfo": {
"institutionCode": "001",
"transitNumber": "12345",
"accountNumber": "1234567"
},
"contactInfo": {
"firstName": "Jane",
"lastName": "Doe"
}
},
"scheduleInfo": {
"paymentFrequency": "OneTime",
"startDate": "2026-04-15"
}
}
]
headers = {
"x-client-id": "<x-client-id>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'x-client-id': '<x-client-id>', 'Content-Type': 'application/json'},
body: JSON.stringify([
{
transactionCode: 1,
amount: 250,
description: 'Invoice 1001',
crossReferenceNumber: 'INV-1001',
paymentDirection: 'DEBIT',
currency: 'CAD',
payor: {
accountInfo: {institutionCode: '001', transitNumber: '12345', accountNumber: '1234567'},
contactInfo: {firstName: 'Jane', lastName: 'Doe'}
},
scheduleInfo: {paymentFrequency: 'OneTime', startDate: '2026-04-15'}
}
])
};
fetch('https://www.{baseurl}.com/api/v1/transactions', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://www.{baseurl}.com/api/v1/transactions",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
[
'transactionCode' => 1,
'amount' => 250,
'description' => 'Invoice 1001',
'crossReferenceNumber' => 'INV-1001',
'paymentDirection' => 'DEBIT',
'currency' => 'CAD',
'payor' => [
'accountInfo' => [
'institutionCode' => '001',
'transitNumber' => '12345',
'accountNumber' => '1234567'
],
'contactInfo' => [
'firstName' => 'Jane',
'lastName' => 'Doe'
]
],
'scheduleInfo' => [
'paymentFrequency' => 'OneTime',
'startDate' => '2026-04-15'
]
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-client-id: <x-client-id>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://www.{baseurl}.com/api/v1/transactions"
payload := strings.NewReader("[\n {\n \"transactionCode\": 1,\n \"amount\": 250,\n \"description\": \"Invoice 1001\",\n \"crossReferenceNumber\": \"INV-1001\",\n \"paymentDirection\": \"DEBIT\",\n \"currency\": \"CAD\",\n \"payor\": {\n \"accountInfo\": {\n \"institutionCode\": \"001\",\n \"transitNumber\": \"12345\",\n \"accountNumber\": \"1234567\"\n },\n \"contactInfo\": {\n \"firstName\": \"Jane\",\n \"lastName\": \"Doe\"\n }\n },\n \"scheduleInfo\": {\n \"paymentFrequency\": \"OneTime\",\n \"startDate\": \"2026-04-15\"\n }\n }\n]")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-client-id", "<x-client-id>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://www.{baseurl}.com/api/v1/transactions")
.header("x-client-id", "<x-client-id>")
.header("Content-Type", "application/json")
.body("[\n {\n \"transactionCode\": 1,\n \"amount\": 250,\n \"description\": \"Invoice 1001\",\n \"crossReferenceNumber\": \"INV-1001\",\n \"paymentDirection\": \"DEBIT\",\n \"currency\": \"CAD\",\n \"payor\": {\n \"accountInfo\": {\n \"institutionCode\": \"001\",\n \"transitNumber\": \"12345\",\n \"accountNumber\": \"1234567\"\n },\n \"contactInfo\": {\n \"firstName\": \"Jane\",\n \"lastName\": \"Doe\"\n }\n },\n \"scheduleInfo\": {\n \"paymentFrequency\": \"OneTime\",\n \"startDate\": \"2026-04-15\"\n }\n }\n]")
.asString();require 'uri'
require 'net/http'
url = URI("https://www.{baseurl}.com/api/v1/transactions")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-client-id"] = '<x-client-id>'
request["Content-Type"] = 'application/json'
request.body = "[\n {\n \"transactionCode\": 1,\n \"amount\": 250,\n \"description\": \"Invoice 1001\",\n \"crossReferenceNumber\": \"INV-1001\",\n \"paymentDirection\": \"DEBIT\",\n \"currency\": \"CAD\",\n \"payor\": {\n \"accountInfo\": {\n \"institutionCode\": \"001\",\n \"transitNumber\": \"12345\",\n \"accountNumber\": \"1234567\"\n },\n \"contactInfo\": {\n \"firstName\": \"Jane\",\n \"lastName\": \"Doe\"\n }\n },\n \"scheduleInfo\": {\n \"paymentFrequency\": \"OneTime\",\n \"startDate\": \"2026-04-15\"\n }\n }\n]"
response = http.request(request)
puts response.read_body{
"schedules": [
{
"id": "a1b2c3d4-5678-90ab-cdef-1234567890ab",
"amount": 250,
"startDate": "2026-04-15T00:00:00",
"endDate": "0001-01-01T00:00:00",
"transactionsCount": 1,
"frequency": "OneTime",
"payor": {
"name": "Jane Doe",
"email": null
},
"payee": {
"name": null,
"email": null
},
"status": "Active",
"padStatus": null,
"padId": null,
"crossReferenceNumber": "INV-1001",
"paymentDirection": "DEBIT"
}
]
}{
"type": "https://tools.ietf.org/html/rfc7231#section-6.5.1",
"title": "Bad Request",
"status": 400,
"errors": {
"Amount": [
"Amount should be greater than 1 cent"
],
"ScheduleInfo.StartDate": [
"Start Date must be in future"
]
}
}{
"type": "https://tools.ietf.org/html/rfc7231#section-6.5.1",
"title": "Bad Request",
"status": 400,
"detail": "<string>",
"errors": {}
}Create Transaction
Create a new EFT transaction with optional recurring schedule. Supports both debit (collect from customer) and credit (send to customer) directions.
curl --request POST \
--url https://www.{baseurl}.com/api/v1/transactions \
--header 'Content-Type: application/json' \
--header 'x-client-id: <x-client-id>' \
--data '
[
{
"transactionCode": 1,
"amount": 250,
"description": "Invoice 1001",
"crossReferenceNumber": "INV-1001",
"paymentDirection": "DEBIT",
"currency": "CAD",
"payor": {
"accountInfo": {
"institutionCode": "001",
"transitNumber": "12345",
"accountNumber": "1234567"
},
"contactInfo": {
"firstName": "Jane",
"lastName": "Doe"
}
},
"scheduleInfo": {
"paymentFrequency": "OneTime",
"startDate": "2026-04-15"
}
}
]
'import requests
url = "https://www.{baseurl}.com/api/v1/transactions"
payload = [
{
"transactionCode": 1,
"amount": 250,
"description": "Invoice 1001",
"crossReferenceNumber": "INV-1001",
"paymentDirection": "DEBIT",
"currency": "CAD",
"payor": {
"accountInfo": {
"institutionCode": "001",
"transitNumber": "12345",
"accountNumber": "1234567"
},
"contactInfo": {
"firstName": "Jane",
"lastName": "Doe"
}
},
"scheduleInfo": {
"paymentFrequency": "OneTime",
"startDate": "2026-04-15"
}
}
]
headers = {
"x-client-id": "<x-client-id>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'x-client-id': '<x-client-id>', 'Content-Type': 'application/json'},
body: JSON.stringify([
{
transactionCode: 1,
amount: 250,
description: 'Invoice 1001',
crossReferenceNumber: 'INV-1001',
paymentDirection: 'DEBIT',
currency: 'CAD',
payor: {
accountInfo: {institutionCode: '001', transitNumber: '12345', accountNumber: '1234567'},
contactInfo: {firstName: 'Jane', lastName: 'Doe'}
},
scheduleInfo: {paymentFrequency: 'OneTime', startDate: '2026-04-15'}
}
])
};
fetch('https://www.{baseurl}.com/api/v1/transactions', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://www.{baseurl}.com/api/v1/transactions",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
[
'transactionCode' => 1,
'amount' => 250,
'description' => 'Invoice 1001',
'crossReferenceNumber' => 'INV-1001',
'paymentDirection' => 'DEBIT',
'currency' => 'CAD',
'payor' => [
'accountInfo' => [
'institutionCode' => '001',
'transitNumber' => '12345',
'accountNumber' => '1234567'
],
'contactInfo' => [
'firstName' => 'Jane',
'lastName' => 'Doe'
]
],
'scheduleInfo' => [
'paymentFrequency' => 'OneTime',
'startDate' => '2026-04-15'
]
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-client-id: <x-client-id>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://www.{baseurl}.com/api/v1/transactions"
payload := strings.NewReader("[\n {\n \"transactionCode\": 1,\n \"amount\": 250,\n \"description\": \"Invoice 1001\",\n \"crossReferenceNumber\": \"INV-1001\",\n \"paymentDirection\": \"DEBIT\",\n \"currency\": \"CAD\",\n \"payor\": {\n \"accountInfo\": {\n \"institutionCode\": \"001\",\n \"transitNumber\": \"12345\",\n \"accountNumber\": \"1234567\"\n },\n \"contactInfo\": {\n \"firstName\": \"Jane\",\n \"lastName\": \"Doe\"\n }\n },\n \"scheduleInfo\": {\n \"paymentFrequency\": \"OneTime\",\n \"startDate\": \"2026-04-15\"\n }\n }\n]")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-client-id", "<x-client-id>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://www.{baseurl}.com/api/v1/transactions")
.header("x-client-id", "<x-client-id>")
.header("Content-Type", "application/json")
.body("[\n {\n \"transactionCode\": 1,\n \"amount\": 250,\n \"description\": \"Invoice 1001\",\n \"crossReferenceNumber\": \"INV-1001\",\n \"paymentDirection\": \"DEBIT\",\n \"currency\": \"CAD\",\n \"payor\": {\n \"accountInfo\": {\n \"institutionCode\": \"001\",\n \"transitNumber\": \"12345\",\n \"accountNumber\": \"1234567\"\n },\n \"contactInfo\": {\n \"firstName\": \"Jane\",\n \"lastName\": \"Doe\"\n }\n },\n \"scheduleInfo\": {\n \"paymentFrequency\": \"OneTime\",\n \"startDate\": \"2026-04-15\"\n }\n }\n]")
.asString();require 'uri'
require 'net/http'
url = URI("https://www.{baseurl}.com/api/v1/transactions")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-client-id"] = '<x-client-id>'
request["Content-Type"] = 'application/json'
request.body = "[\n {\n \"transactionCode\": 1,\n \"amount\": 250,\n \"description\": \"Invoice 1001\",\n \"crossReferenceNumber\": \"INV-1001\",\n \"paymentDirection\": \"DEBIT\",\n \"currency\": \"CAD\",\n \"payor\": {\n \"accountInfo\": {\n \"institutionCode\": \"001\",\n \"transitNumber\": \"12345\",\n \"accountNumber\": \"1234567\"\n },\n \"contactInfo\": {\n \"firstName\": \"Jane\",\n \"lastName\": \"Doe\"\n }\n },\n \"scheduleInfo\": {\n \"paymentFrequency\": \"OneTime\",\n \"startDate\": \"2026-04-15\"\n }\n }\n]"
response = http.request(request)
puts response.read_body{
"schedules": [
{
"id": "a1b2c3d4-5678-90ab-cdef-1234567890ab",
"amount": 250,
"startDate": "2026-04-15T00:00:00",
"endDate": "0001-01-01T00:00:00",
"transactionsCount": 1,
"frequency": "OneTime",
"payor": {
"name": "Jane Doe",
"email": null
},
"payee": {
"name": null,
"email": null
},
"status": "Active",
"padStatus": null,
"padId": null,
"crossReferenceNumber": "INV-1001",
"paymentDirection": "DEBIT"
}
]
}{
"type": "https://tools.ietf.org/html/rfc7231#section-6.5.1",
"title": "Bad Request",
"status": 400,
"errors": {
"Amount": [
"Amount should be greater than 1 cent"
],
"ScheduleInfo.StartDate": [
"Start Date must be in future"
]
}
}{
"type": "https://tools.ietf.org/html/rfc7231#section-6.5.1",
"title": "Bad Request",
"status": 400,
"detail": "<string>",
"errors": {}
}Validation Rules
DEBIT Transactions
payoris required;payeemust benullstartDatemust be a future date- OneTime: only
startDateis required - Recurring:
startDateplus exactly one ofendDateortransactionsCountendDatemust be afterstartDatetransactionsCountmaximum is 300
CREDIT Transactions
payeeis required;payormust benull- Only
OneTimefrequency is supported startDatemust be today’s date (same-day processing only)
Account Info Logic
Provide eitheraccountId or the combination of institutionCode + transitNumber + accountNumber. You cannot provide both.
Contact Info Logic
Provide eithercontactId or name fields (firstName + lastName, or legalName). You cannot provide both.Headers
Your API key provided during onboarding.
Body
1 elementThree-digit code identifying the payment type, as defined by Payments Canada Standard 007.
450
Payment amount. Minimum $0.01.
x >= 0.01250
DEBIT to collect from customer, CREDIT to send to customer.
DEBIT, CREDIT "DEBIT"
Currency code. Only CAD is supported.
CAD "CAD"
Show child attributes
Show child attributes
Short description. Max 15 characters.
15"Invoice 1001"
Your reference identifier. Alphanumeric and hyphens, max 36 characters.
36^[A-Za-z0-9-]+$"INV-1001"
Category for the payment purpose.
Required for DEBIT transactions. Must be null for CREDIT.
Show child attributes
Show child attributes
Required for CREDIT transactions. Must be null for DEBIT.
Show child attributes
Show child attributes
Response
Transaction created successfully
Show child attributes
Show child attributes
Was this page helpful?