CAD payouts
Send CAD over one of two rails:
- Interac e-Transfer — recipients are identified by email + name, no bank account or address required. The recipient receives a deposit notification by email.
- EFT (bank transfer) — recipients are identified by a Canadian bank account:
institution_number(3-digit) +transit_number(5-digit) +account_number+bank_name, plus the recipient’semailand address for compliance.
Choosing the rail. Set the top-level method field to select it explicitly — "interac" or "eft". If you omit method, the rail is inferred from the recipient shape you send: EFT coordinates (institution_number / transit_number) ⇒ EFT; Interac fields (email + first_name + last_name) ⇒ Interac. If neither a method nor a rail-specific field is present, your account’s default CAD routing configuration decides. An explicit method must match the recipient shape — sending method: "eft" with Interac-only fields (or vice versa) is rejected with a clear missing_field / invalid_field error.
See the Payouts overview for common fields + customer attribution, and the NGN page for the shared payout object + management endpoints.
Want the exact fee before you send? Preview it with POST /v1/payouts/quote — an advisory, read-only fee + cost breakdown for your account.
Prerequisites
- International accounts enabled on your merchant account.
- A sender for compliance — how you supply it depends on your flow: the individual flow passes
sender_customer_idon every payout; the business/treasury flow passes no per-payout sender; an account configured for both passes it or omits it per payout. See below. - For attribution reads on the customer feed: the API key needs
customer_transaction_view.
There is no virtual-account requirement for CAD on either rail. The active-international-account checks apply to GBP, USD and EUR only — CAD is exempt by currency, so neither Interac nor EFT is gated on one.
POSTSave a CAD beneficiary, then pay by reference
CAD beneficiaries use flat top-level fields (no bank / address blocks).
| Field | Required | Notes |
|---|---|---|
interac_email | yes | Recipient’s Interac-registered email. |
first_name / last_name | yes | Recipient name. |
name | yes | Display name. |
curl https://api.swappr.me/api/v1/beneficiaries \
-H "Authorization: Bearer sk_test_..." \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"currency": "CAD",
"name": "Jane Doe",
"interac_email": "jane.doe@example.com",
"first_name": "Jane",
"last_name": "Doe"
}'POSTCreate a CAD payout
amount_minor is in cents (75000 = CA$750.00). Prefer the by-beneficiary path; the inline recipient is soft-deprecated for FX.
Rail selector (top-level, optional):
| Field | Required | Notes |
|---|---|---|
method | no | "interac" or "eft" — selects the CAD rail explicitly. Omit to let the recipient shape (or your account’s default CAD routing) decide. When set, the recipient shape must match. |
Interac shape:
| Path | Field | Required | Notes |
|---|---|---|---|
| Inline | recipient.email | yes | Recipient’s Interac email. |
| Inline | recipient.first_name / recipient.last_name | yes | Recipient name. |
EFT shape:
| Path | Field | Required | Notes |
|---|---|---|---|
| Inline | recipient.name | yes | Account holder name. |
| Inline | recipient.institution_number | yes | 3-digit financial-institution number. |
| Inline | recipient.transit_number | yes | 5-digit branch transit number. |
| Inline | recipient.account_number | yes | Recipient account number. |
| Inline | recipient.bank_name | yes | Recipient’s bank name. |
| Inline | recipient.email | yes | Required for the recipient record. |
| Inline | recipient.street / recipient.city / recipient.country | yes | Recipient address (country as ISO alpha-2, e.g. CA). |
| Inline | recipient.state / recipient.zip_code | yes (CA) | Province + postal code — required for Canadian recipients. |
Send either the Interac shape or the EFT shape. Set method to pick the rail explicitly, or omit it and we infer the rail from the shape you send (falling back to your account’s default CAD routing) — see the note above.
Sender attribution
CAD requires the sending customer to be identified for compliance, and how you identify them depends on your flow.
Individual flow — pass sender_customer_id on every payout (the id of a customer created via POST /v1/customers); Swappr resolves their stored KYC. It is required — an inline sender block does not substitute for it, and omitting it returns missing_field. You may still send an inline sender alongside it: the two are complementary, inline fields winning per-field while the referenced customer’s stored KYC backfills any you omit.
Business / treasury flow — omit sender_customer_id. The sender is your merchant treasury customer, resolved automatically. If only this flow is enabled on your account, sending one anyway returns customer_id_mismatch. If your account is configured to require sender identity, supply it with an inline sender block.
Both flows enabled — if Technest has enabled both flows on your account, sender_customer_id is optional, and it selects the flow per payout. Supply it and the payout is attributed to that end customer; omit it and it is attributed to your treasury customer. CAD is exempt from the account checks either way (see Prerequisites). customer_id_mismatch does not apply — supplying a sender is a valid instruction for this configuration, not an error. This is a Technest-configured capability, not a per-request option.
customer_id must match sender_customer_id if both are passed.
Response
201 Created with the payout object (currency: "CAD").
Webhook events
CAD Interac fires twice — an initiation event and a completion event — so expect payout.processing followed by payout.paid (or payout.failed). customer_id / customer_reference are included when set. See Webhooks.
Errors
| Code | HTTP | Cause |
|---|---|---|
fx_features_not_enabled | 403 | International accounts not enabled |
missing_field | 400/422 | Required recipient field absent — Interac (email, first_name, last_name) or EFT (institution_number 3-digit, transit_number 5-digit, account_number). Also raised when method: "eft" is sent without EFT coordinates. |
invalid_field | 400 | method is not "interac" / "eft", or method: "interac" was sent alongside EFT coordinates (contradiction) |
beneficiary_not_found | 404 | beneficiary_id unknown / not yours / wrong env |
beneficiary_currency_mismatch | 400 | beneficiary_id is not a CAD beneficiary |
missing_field (sender) | 400 | (Individual) sender_customer_id absent — it is required on FX payouts and an inline sender block does not substitute. Returned before sender_info_required. |
sender_info_required | 422 | Your account is configured to require sender identity and the merged sender details (inline sender block + the referenced customer’s stored KYC) are still incomplete |
customer_id_mismatch | 400 | customer_id ≠ sender_customer_id — or a business/treasury-only account sent a per-payout sender_customer_id (omit it; the sender is your treasury customer). The second cause does not apply to an account configured for both flows |
no_treasury_customer | 400 | (Business/treasury) Your treasury customer isn’t provisioned yet — contact Technest to set up your international payouts |
idempotency_key_conflict | 409 | Same Idempotency-Key, different body |
idempotency_conflict | 409 | Same Idempotency-Key as a prior payout that differs in amount or recipient account — narrower than idempotency_key_conflict, which compares the whole request body |
merchant_reference_duplicate | 409 | merchant_reference was already used on a recent payout; each reference is single-use within the cool-down window |
insufficient_funds | 402 | Wallet balance is below the payout amount plus fees |
wallet_frozen | 403 | The source wallet is frozen; no debits are permitted |
beneficiary_blacklisted | 403 | Recipient is on your merchant blacklist — un-blacklist them on the Beneficiaries page, or send to a different recipient |
beneficiary_globally_blocked | 403 | Recipient is on the platform-wide blacklist and cannot be overridden — contact support |
provider_not_entitled | 403 | Your account isn’t enabled to send this currency through any configured route — contact Technest to enable it. Distinct from routing_failed: routes exist, your account is not enabled for them |
provider_paused | 403 | Sending this currency is temporarily paused on your account — contact Technest. Distinct from provider_not_entitled: your account is enabled for a route, but Technest has paused it |
routing_failed | 422 | No disbursement route is available for this payout at all, or the destination bank could not be identified |
beneficiary_cooldown | 429 | Same recipient paid recently — pass allow_duplicate: true if intentional |
provider_error | 502 | Downstream rail unreachable; retry-safe with the same key |
Shared management endpoints are on the NGN page.
curl https://api.swappr.me/api/v1/payouts \
-H "Authorization: Bearer sk_test_..." \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"amount_minor": "75000",
"currency": "CAD",
"beneficiary_id": "ben_cmo8x2p9q0...",
"sender_customer_id": "cust_cmoji8...",
"customer_id": "cust_cmoji8...",
"merchant_reference": "CA-PAY-12"
}'curl https://api.swappr.me/api/v1/payouts \
-H "Authorization: Bearer sk_test_..." \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"amount_minor": "75000",
"currency": "CAD",
"recipient": { "email": "jane.doe@example.com", "first_name": "Jane", "last_name": "Doe" },
"sender_customer_id": "cust_cmoji8...",
"merchant_reference": "CA-PAY-12"
}'curl https://api.swappr.me/api/v1/payouts \
-H "Authorization: Bearer sk_test_..." \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"amount_minor": "75000",
"currency": "CAD",
"recipient": {
"name": "Jane Doe",
"institution_number": "001",
"transit_number": "12345",
"account_number": "7654321",
"bank_name": "Royal Bank of Canada",
"email": "jane.doe@example.com",
"street": "10 King St",
"city": "Toronto",
"state": "ON",
"zip_code": "M5H 1A1",
"country": "CA"
},
"sender_customer_id": "cust_cmoji8...",
"merchant_reference": "CA-PAY-12"
}'