CA • US
Annually
SaaS to Gov
Full Automation
.NET PHP Python Node JS
365 Days/Year
Two environments, one simple API format
Every API call uses the same format: POST [BaseURL]/Data/[MethodName]
The API uses Rijndael (AES-256) encryption for all payloads. Our SDKs handle encryption automatically — the cURL examples below show the decrypted JSON structure for clarity.
// Your first call: CreateSession
POST https://sandboxportal.tib.finance/Data/CreateSession
// Request:
{
"ClientId": "YOUR_CLIENT_ID",
"Username": "YOUR_USERNAME",
"Password": "YOUR_PASSWORD"
}
// Response:
{
"SessionId": "46a84f3f-c4fb-4d00-b3ff-caf6c85d06d4",
"HasError": false,
"Messages": ""
}
SessionId is used in all subsequent API calls. SDKs for .NET, PHP, Python, Node.js, JavaScript handle encryption and session management automatically.
Enterprise infrastructure with startup simplicity
Credit cards, bank transfers, Interac, instant deposits — one integration covers everything. No juggling multiple providers.
Process in CAD and USD. Serve businesses in Canada and the US from a single platform.
Build a payment platform with sub-clients, white-labeling, and per-merchant configuration. Used by SaaS and fintech companies.
Test with real API calls, fake money. $2,500 in free development for qualifying businesses through our Beta Program.
Follow the 8 steps from authentication to payment confirmation
Bank account or Credit card details
PaymentMethodId (GUID)
CreateDirectAccountPaymentMethodMerchantId, DateRange
TransferStatus + BankResultCode
Each money transfer generates a minimum of 3 operations, each with up to 4 transactions.
To get the full transfer status, verify all sub-transaction statuses across all operations.
Decision branch — check BankResultCode
Check each transaction status using this simple approach:
Status 0 Still waiting for process execution.
Note: payback check can stay in this status for up to 3 months.
Status 1 TIB Validation — TIB confirms the transaction is valid and accepted.
Status 2 Banking Network — The banking network has confirmed the transaction.
Status 3 Funds Settled — Funds have been successfully deposited.
Status 4 Process Complete — Full process completed, including payback verification.
All transactions have a status and a detailed description. Verify all sub-transaction statuses to determine the overall process status.
Email or Phone, Amount
Interac transaction created — customer receives email/SMS
CreateDirectInteracTransaction — replaces steps 3, 4, and 5 in a single call. Canada only.Click any card to jump to the full code example
Charge a known customer with a registered payment method. No customer interaction — the payment processes automatically using Payment Flow 5.
// Step 1: Create Session (see Getting Started above)
// Step 2: Create Customer
POST /Data/CreateCustomer
{
"SessionToken": "session-guid",
"ServiceId": "your-service-id",
"Customer": {
"CustomerName": "John Smith",
"CustomerExternalId": "CUST-001",
"Language": 2
}
}
// Response: { "CustomerId": "customer-guid" }
// Step 3: Add Bank Account (set as default)
POST /Data/CreateDirectAccountPaymentMethod
{
"SessionToken": "session-guid",
"CustomerId": "customer-guid",
"IsCustomerAutomaticPaymentMethod": true,
"Account": {
"Owner": "John Smith",
"AccountName": "Main checking",
"BankNumber": "003",
"InstitutionNumber": "12345",
"AccountNumber": "9876543"
}
}
// Response: { "PaymentMethodId": "pm-guid" }
// Step 4: Create Bill
POST /Data/CreateBill
{
"SessionToken": "session-guid",
"BreakIfMerchantNeverBeenAuthorized": true,
"BillData": {
"MerchantId": "your-merchant-id",
"BillTitle": "Invoice #1001",
"BillDescription": "Monthly service fee",
"BillAmount": 99.99,
"BillCurrency": 1,
"Language": 2,
"RelatedCustomerId": "customer-guid"
}
}
// Response: { "BillId": "bill-guid" }
// Step 5: Create Payment (Flow 5 = automatic)
POST /Data/CreatePayment
{
"SessionToken": "session-guid",
"BillId": "bill-guid",
"SetPaymentCustomerFromBill": true,
"PaymentInfo": {
"PaymentFlow": 5
}
}
// Response: { "PaymentId": "pay-guid", "PaymentFlowParsingResult": 1 }
IsCustomerAutomaticPaymentMethod: true makes this the default method — required for Flow 5. PaymentFlowParsingResult: 1 means success. Steps 2-3 only need to be done once per customer — reuse CustomerId for future bills.
The customer receives an email with a secure link to enter their payment information. No pre-saved payment method needed. Uses Payment Flow 1 (Anonymous).
// Steps 1-2: CreateSession + CreateCustomer (same as Use Case 1)
// Step 3: Create Bill (no payment method needed)
POST /Data/CreateBill
{
"SessionToken": "session-guid",
"BillData": {
"MerchantId": "your-merchant-id",
"BillTitle": "Invoice #2001",
"BillDescription": "Consulting services",
"BillAmount": 250.00,
"BillCurrency": 1,
"Language": 2,
"RelatedCustomerId": "customer-guid"
}
}
// Step 4: Create Payment with email link
POST /Data/CreatePayment
{
"SessionToken": "session-guid",
"BillId": "bill-guid",
"SetPaymentCustomerFromBill": true,
"CustomerEmail": "[email protected]",
"PaymentInfo": {
"PaymentFlow": 1,
"Language": "EN"
}
}
// TIB sends the email automatically with a secure payment link.
CustomerEmail is required for Flow 1. The email is sent automatically by TIB — you don't need to build an email system. The customer can pay with bank account or credit card.
Set up automatic monthly collection for subscriptions, rent, memberships. Same as Use Case 1 but with TransferFrequency: 4 (Monthly).
// Steps 1-4: Same as Use Case 1 (Session, Customer, PaymentMethod, Bill)
// Step 5: Create RECURRING Payment
POST /Data/CreatePayment
{
"SessionToken": "session-guid",
"BillId": "bill-guid",
"SetPaymentCustomerFromBill": true,
"PaymentInfo": {
"PaymentFlow": 5,
"TransferFrequency": 4
}
}
// The payment repeats every month automatically!
// List active recurring transfers
POST /Data/GetRecuringTransfers
{
"SessionToken": "session-guid",
"ServiceId": "your-service-id"
}
// Cancel a recurring transfer
POST /Data/DeleteRecuringTransfer
{
"SessionToken": "session-guid",
"RecuringTransferId": "recurring-guid"
}
0=Once, 1=Daily, 2=Weekly, 3=Every 2 Weeks, 4=Monthly, 5=Trimester, 6=Bi-Annual, 7=Annual
Send money from your merchant account to any external bank account. Payroll, supplier payments, refunds. Only 2 API calls.
// Step 1: CreateSession (see Getting Started)
// Step 2: Direct Deposit
POST /Data/CreateDirectDeposit
{
"SessionToken": "session-guid",
"OriginMerchantId": "your-merchant-id",
"DestinationAccount": {
"Owner": "Supplier Corp Inc.",
"AccountName": "Business account",
"BankNumber": "006",
"InstitutionNumber": "54321",
"AccountNumber": "1234567"
},
"Amount": 5000.00,
"Currency": 1,
"Language": 2,
"ReferenceNumber": "PAY-2026-001"
}
DepositDueDate to schedule a future deposit.
Send or request money via Interac e-Transfer using an email or phone number. Only 2 API calls.
// Send money (Deposit) via Interac
POST /Data/CreateDirectInteracTransaction
{
"SessionToken": "session-guid",
"MerchantId": "your-merchant-id",
"InteracInformation": {
"Description": "Freelancer payment",
"Owner": "Kelly Freelancer",
"TargetEmailAddress": "[email protected]",
"InteracQuestion": "What is your pet name?",
"InteracAnswer": "Buddy"
},
"TransferDirection": 2,
"Amount": 500.00,
"Currency": 1,
"Language": 2
}
// Request money (Collect) via Interac
POST /Data/CreateDirectInteracTransaction
{
"SessionToken": "session-guid",
"MerchantId": "your-merchant-id",
"InteracInformation": {
"Description": "Invoice #3001",
"Owner": "Customer Name",
"TargetEmailAddress": "[email protected]"
},
"TransferDirection": 1,
"Amount": 150.00,
"Currency": 1
}
TransferDirection: 1 = Collect (request money), 2 = Deposit (send money). InteracQuestion and InteracAnswer are required for deposits. Either TargetEmailAddress or TargetMobilePhoneNumber must be provided.
Process hundreds of transactions at once by uploading an ACP (Automated Clearing & Payment) file. Payroll, mass disbursements, bulk collections.
// Upload ACP file (Base64-encoded)
POST /Data/CreateTransactionFromRaw
{
"SessionToken": "session-guid",
"MerchantId": "your-merchant-id",
"RawFileBody": "BASE64_ENCODED_ACP_FILE"
}
// Check batch results
POST /Data/ListExecutedOperations
{
"SessionToken": "session-guid",
"MerchantId": "your-merchant-id",
"GroupId": "batch-group-id",
"FromDateTime": "2026-02-01T00:00:00Z",
"ToDateTime": "2026-02-28T23:59:59Z",
"TransferType": 7,
"DateType": 1,
"OperationTarget": 1
}
GroupId from the response to track all transactions in the batch.
Accept Visa, Mastercard, and Amex across North America. Register a credit card as a payment method and charge it automatically using Payment Flow 5.
// Steps 1-2: CreateSession + CreateCustomer (same as Use Case 1)
// Step 3: Register Credit Card
POST /Data/CreateCreditCardPaymentMethod
{
"SessionToken": "session-guid",
"CustomerId": "customer-guid",
"IsCustomerAutomaticPaymentMethod": true,
"CreditCard": {
"Pan": 4242424242424242,
"Cvd": 123,
"ExpirationMonth": 12,
"ExpirationYear": 27,
"CardOwner": "John Smith"
},
"CreditCardRegisteredAddress": {
"CivicNumber": "360",
"Street": "Rue Saint-Jacques",
"City": "Montreal",
"Province": "QC",
"Country": "CA",
"PostalCode": "H2Y1P5"
}
}
// Response: { "PaymentMethodId": "pm-guid" }
// Steps 4-5: CreateBill + CreatePayment (Flow 5) — same as Use Case 1
CreditCardRegisteredAddress is optional but recommended for AVS (Address Verification System) which reduces fraud. Pan accepts Visa (4xxx), Mastercard (5xxx), and Amex (3xxx). In sandbox, use test card number 4242424242424242.
Collect money directly without creating an invoice or bill. Uses CreateFreeOperation with TransferType: 3 (FreeCollection). Ideal for tips, micro-payments, and adjustments.
// Step 1: CreateSession (see Getting Started)
// Step 2: Free Collection — collect without a bill
POST /Data/CreateFreeOperation
{
"SessionToken": "session-guid",
"MerchantId": "your-merchant-id",
"PaymentMethodId": "customer-pm-guid",
"TransferType": 3,
"Amount": 25.00,
"Currency": 1,
"Language": 2,
"ReferenceNumber": "TIP-001"
}
TransferType: 3 = FreeCollection (collect money), TransferType: 2 = FreeDeposit (send money). The PaymentMethodId must belong to an existing customer. This bypasses the full bill workflow — perfect for streamlining operations.
Send money to any registered payment method instantly without creating a bill. Uses CreateFreeOperation with TransferType: 2 (FreeDeposit). Ideal for refunds, cashbacks, and payouts.
// Step 1: CreateSession (see Getting Started)
// Step 2: Free Deposit — send money without a bill
POST /Data/CreateFreeOperation
{
"SessionToken": "session-guid",
"MerchantId": "your-merchant-id",
"PaymentMethodId": "customer-pm-guid",
"TransferType": 2,
"Amount": 150.00,
"Currency": 1,
"Language": 2,
"ReferenceNumber": "REFUND-001"
}
PaymentMethodId can be a bank account or credit card registered to any customer. This is the fastest way to send money — no customer, bill, or payment object needed. Just the merchant and the destination payment method.
From startups to enterprises — one API to power them all.
Get Sandbox Credentials Contact SalesBuild your own payment platform. Each sub-client gets their own isolated environment with dedicated merchants, customers, and payment methods. Used by SaaS platforms, property management companies, and financial institutions across North America.
// Step 1: CreateSession (see Getting Started)
// Step 2: Create a Sub-Client
POST /Data/CreateSubClient
{
"SessionToken": "session-guid",
"ClientName": "Acme Property Management",
"ClientLanguage": 2
}
// Response: { "ServiceId": "new-service-guid" }
// Step 3: Configure the Sub-Client
POST /Data/SetClientSettings
{
"SessionToken": "session-guid",
"ServiceId": "new-service-guid",
"Settings": {
"AllowCreditCard": true,
"AllowDirectDebit": true,
"AllowInterac": true
}
}
// Read the Sub-Client configuration
POST /Data/GetClientSettings
{
"SessionToken": "session-guid",
"ServiceId": "new-service-guid"
}
// Now use the ServiceId in all subsequent calls for this sub-client
// CreateCustomer, CreateBill, CreatePayment, etc. all scoped to this sub-client
SetClientDefaultServiceFeeSettings. The ServiceId returned by CreateSubClient replaces your own ServiceId in all API calls for that sub-client.
Your brand, our infrastructure. Customize payment pages with your colors, logo, and style. Your customers never see TIB — they see YOU.
// Step 1: CreateSession (see Getting Started)
// Step 2: Set White-Labeling (Merchant level)
POST /Data/SetWhiteLabeling
{
"SessionToken": "session-guid",
"WhiteLabelingLevel": 1,
"WhiteLabelingLevelId": "your-merchant-id",
"CssProperties": {
"background-color": "#1a1a2e",
"color": "#ffffff",
"font-family": "Inter, sans-serif",
"button-background": "#e94560"
}
}
// Read white-labeling data
POST /Data/GetWhiteLabelingData
{
"SessionToken": "session-guid",
"WhiteLabelingLevel": 1,
"WhiteLabelingLevelId": "your-merchant-id"
}
// Update or delete white-labeling
// POST /Data/UpdateWhiteLabelingData
// POST /Data/DeleteWhiteLabeling
1 = Merchant level, 2 = Service level, 3 = Client level. You can apply different branding at each level. Use GetListWhiteLabelingData to list all white-labeling configurations.
Full control over which payment method to charge. Instead of using the customer's default, specify exactly which card or bank account to use via Payment Flow 6.
// Steps 1-4: CreateSession, CreateCustomer, CreatePaymentMethod, CreateBill
// (same as Use Case 1 — customer may have multiple payment methods)
// Step 5: Create Payment with FORCED method
POST /Data/CreatePayment
{
"SessionToken": "session-guid",
"BillId": "bill-guid",
"SetPaymentCustomerFromBill": true,
"PaymentInfo": {
"PaymentFlow": 6,
"ForcedCustomerPaymentMethodId": "specific-pm-guid"
}
}
// Charges the exact payment method you specified, not the default
ListPaymentMethods to get all payment methods for a customer, then pass the desired PaymentMethodId as ForcedCustomerPaymentMethodId. This is ideal when a customer has multiple cards and you want to charge a specific one (e.g., a backup card after the primary fails).
Handle refunds and reversals seamlessly. One API call to revert any transaction. You can also cancel a payment before it's processed.
// Step 1: CreateSession (see Getting Started)
// Option A: Revert a completed transaction (refund)
POST /Data/RevertTransfer
{
"SessionToken": "session-guid",
"TransferId": "transfer-guid-to-revert"
}
// Creates a reverse transaction — money goes back to the customer
// Option B: Cancel a payment before it's processed
POST /Data/DeletePayment
{
"SessionToken": "session-guid",
"PaymentId": "payment-guid-to-cancel"
}
RevertTransfer works on completed transactions — it creates a new reverse operation. DeletePayment cancels a payment that hasn't been processed yet. Use ListExecutedOperations to find the TransferId of the original transaction.
Join thousands of businesses already using TIB Finance across North America.
Start Free Integration View PricingBuilt for scale. Trusted by businesses processing $600M+ annually.
Process payments in Canada (EFT, Interac, credit cards) and the United States (ACH, credit cards). Multi-currency support in CAD and USD from a single integration.
Full CRUD operations: GetCustomer, SaveCustomer, DeleteCustomer, GetCustomersByExternalId, ListCustomers, ListPaymentMethods, ListBills. Your data, your control.
ListExecutedOperations with filters by date range, merchant, transfer type, and group. Track every transaction across your entire organization in real-time.
Every method available in the TIB Finance API, organized by category
| Category | Methods |
|---|---|
| Session | CreateSession |
| Customers | CreateCustomer SaveCustomer GetCustomer GetCustomersByExternalId DeleteCustomer ListCustomers |
| Payment Methods | CreateDirectAccountPaymentMethod CreateCreditCardPaymentMethod CreateInteracPaymentMethod GetPaymentMethod ListPaymentMethods DeletePaymentMethod SetDefaultPaymentMethod ChangeInteracPaymentMethodQuestionAndAnswer |
| Bills | CreateBill GetBill DeleteBill ListBills |
| Payments | CreatePayment (9 flows) DeletePayment RevertTransfer |
| Direct Operations | CreateDirectDeposit CreateDirectInteracTransaction CreateFreeOperation |
| Batch | CreateTransactionFromRaw |
| Recurring | GetRecuringTransfers DeleteRecuringTransfer |
| Reporting | ListExecutedOperations |
| Sub-Clients | CreateSubClient SetClientSettings GetClientSettings SetClientDefaultServiceFeeSettings |
| White-Labeling | SetWhiteLabeling GetWhiteLabelingData UpdateWhiteLabelingData GetListWhiteLabelingData DeleteWhiteLabeling |
POST [BaseURL]/Data/[MethodName].
Get sandbox credentials in seconds and test all 13 use cases for free.
Get Sandbox Credentials Full API ReferenceChoose the right flow for your scenario
| Flow | Name | Customer Known? | Has Payment Method? | Automatic? | Best For |
|---|---|---|---|---|---|
1 |
Anonymous | No | No | No | One-time invoices, new customers |
2 |
Known - Existing Methods | Yes | Yes | No | Customer chooses from saved methods |
3 |
Known - Can Add Methods | Yes | Optional | No | Customer can add new payment method |
4 |
Known - Full Management | Yes | Optional | No | Customer manages all methods + default |
5 |
Automatic (Default) | Yes | Yes (default set) | Yes | Most common: subscriptions, recurring |
6 |
Automatic (Forced) | Yes | Yes (specific) | Yes | Charge a specific payment method |
7 |
Auto Select | Any | Any | Depends | Let the API choose the best flow |
8 |
Auto Select (Non-Automatic) | Any | Any | Never | Auto-select but require customer action |
9 |
Anonymous with Consent | No | No | No | Anonymous with consent capture |
Key data structures used in the TIB API
| Property | Type | Required | Description |
|---|---|---|---|
CustomerName | string | Yes | Full name (max 150 chars) |
CustomerExternalId | string | No | Your internal customer ID (max 50) |
Language | int | No | 1 = French, 2 = English |
CustomerDescription | string | No | Notes (max 250) |
| Property | Type | Required | Description |
|---|---|---|---|
Owner | string | Yes | Account holder name (max 150) |
AccountName | string | Yes | Account description (max 150) |
BankNumber | string | Yes | Bank ID (3 digits) |
InstitutionNumber | string | Yes | Transit number (5 digits) |
AccountNumber | string | Yes | Account number (max 15) |
| Property | Type | Required | Description |
|---|---|---|---|
Pan | number | Yes | Card number (14-16 digits) |
Cvd | number | No | CVV code (3-4 digits) |
ExpirationMonth | int | Yes | 1-12 |
ExpirationYear | int | Yes | 2-digit year (e.g. 26) |
CardOwner | string | Yes | Name on card (max 150) |
| Property | Type | Required | Description |
|---|---|---|---|
MerchantId | GUID | Yes | Merchant this bill belongs to |
BillTitle | string | Yes | Title shown to customer (max 150) |
BillDescription | string | Yes | Description (max 1000) |
BillAmount | decimal | Yes | Amount: 0.01 to 50,000 |
BillCurrency | int | No | 1 = CAD, 2 = USD |
RelatedCustomerId | GUID | No | Customer paying this bill |
1 | CreditCard |
2 | DirectAccount (Bank) |
3 | Interac |
1 | CAD (Canadian Dollar) |
2 | USD (US Dollar) |
1 | French |
2 | English |
1 | Collect (request money) |
2 | Deposit (send money) |
0 | Once |
1 | Daily |
2 | Weekly |
4 | Monthly |
7 | Annually |
Understanding API responses
// Success
{
"HasError": false,
"Errors": [],
"Messages": ""
}
// Error
{
"HasError": true,
"Errors": [{
"ErrorMessage": "Bad Credentials",
"ErrorCode": 403
}]
}
| Value | Meaning |
|---|---|
1 | Success |
2 | Invalid Payment Flow |
3 | Bill not related to customer |
4 | Customer has no payment method |
5 | No default payment method set |
6 | Forced method ID needed (Flow 6) |
7 | Customer doesn't have specified method |
8 | Anonymous must have email (Flow 1/9) |
9 | PPA consent needed |
| Value | Result | Description |
|---|---|---|
0 | No result yet | Still being processed |
1 | Confirmed | Transaction completed successfully |
2 | Other errors | Unspecified bank error |
3 | NSF | Non-Sufficient Funds |
4 | Account error | Invalid, closed, or frozen account |
5 | Opposition | Customer opposed the transaction |
6 | Interac Refused | Interac transfer was refused |
7 | Interac Failed | Interac transfer failed |
Our team of experts can handle your project. You might even qualify for a free integration!
Contact Us Create Live Account