The Payment API allows merchants to:
Create and manage payment charges
Perform captures, increments, voids, and releases
Issue and manage refunds
Perform card verifications
It supports multiple payment methods including cards, terminals, cash, wallets (Apple Pay / Google Pay), and stored payment tokens.
| Environment | Base URL |
|---|---|
| UAT (Integration) | https://uat.ca.api.payfacto.cloud/payments/v1 |
| Production | https://ca.api.payfacto.cloud/payments/v1 |
Authentication: HTTP Basic Authentication
All endpoints require valid credentials
Idempotency is supported on creation endpoints (charges, refunds, verifications)
A charge represents a payment transaction.
A charge can be:
Captured immediately
Authorized first and captured later
Incremented (pre-authorization increase)
Released (remaining uncaptured amount)
Voided (if captured and unbatched)
Refunded (fully or partially)
A refund returns funds from a completed charge back to the customer.
A verification validates a payment card without charging it.
Typical charge flow:
Create Charge
(Optional) Increment amount (pre-auth only)
(Optional) Capture authorized amount
(Optional) Void captured charge (before batching)
(Optional) Release uncaptured amount
(Optional) Refund captured charge
POST /charges
Creates a new payment transaction.
Supports:
Card payments
Terminal payments
Cash
Wallets (Apple Pay, Google Pay)
3-D Secure authentication
Stored credentials
Key behavior:
If capture = true (default): charge is immediately captured
If capture = false: charge is authorized and must be captured later
Responses:
201 – Charge created
200 – Charge already created (same idempotency key)
402 – Charge declined
400 / 500 – Error
GET /charges
Returns a paginated list of charges, sorted by most recent.
Filters include:
Terminal ID
Authorization code
Idempotency key
Invoice number
Card last four digits
Date range
Pagination (offset, limit)
GET /charges/{chargeId}
Retrieves a single charge by its unique identifier.
POST /charges/{chargeId}/captures
Captures an existing authorized (uncaptured) charge.
Rules:
Charge must exist
Charge must not already be fully captured
Partial capture is supported
POST /charges/{chargeId}/increments
Increases the authorized amount on a pre-authorized charge.
Used for:
Hospitality
Car rentals
Variable-amount transactions
POST /charges/{chargeId}/voids
Voids a captured charge before it is batched.
POST /charges/{chargeId}/releases
Releases the remaining uncaptured portion of a charge.
POST /refunds
Issues a refund against a completed charge.
Features:
Full or partial refunds
Idempotent creation
Reason required
GET /refunds
Returns a list of refunds, sorted by most recent.
Supports the same filtering and pagination logic as charges.
GET /refunds/{refundId}
Retrieves a specific refund.
POST /refunds/{refundId}/voids
Voids an unbatched refund.
POST /verifications
Verifies a credit card without charging it.
Use cases:
Card validation
Storing payment methods
GET /verifications/{verificationId}
Retrieves the result of a verification request.
CARD – Manual entry, EMV, magstripe
TERMINAL – POS-based payments
CASH
PAYMENT_TOKEN – Stored credentials
WALLETS
Apple Pay
Google Pay
RECEIVED
PENDING
SUCCEEDED
FAILED
VOIDED
RELEASED
CANCELLED
ERROR
Provides:
Authorization codes
Decline reasons
Processor and issuer response codes
Batch information
Errors include:
Type (CARD_ERROR, INVALID_REQUEST_ERROR, etc.)
Error code
Human-readable message
Field-level validation errors
Documentation reference URL
Idempotency prevents duplicate charges/refunds
Partial capture and refund are supported
Stored credentials comply with recurring payment standards
Terminal transactions include EMV and track data
3-D Secure and wallet authentication are supported
When an API GET request returns multiple results, PayFacto applies pagination by default to limit the response size. By default, only the first 10 records are returned. Clients can control both the number of results returned and the starting position by using query parameters.
In addition, results can be filtered by a date range using UTC timestamps.
If no query parameters are provided:
Limit: 10 records
Offset: 0 (starting from the first record)
Date range: From 30 days prior to the current date and time up to the current date and time (UTC)
limitDescription: The maximum number of records to return.
Type: Integer
Maximum value: 100
Default: 10
offsetDescription: The starting position of the results.
Type: Integer
Default: 0
Notes:
offset=0 starts from the first record.
Useful for pagination when combined with limit.
startDateDescription: The start of the date range filter.
Type: UTC date-time
Default: 30 days before endDate
Notes:
Must be provided in UTC format.
If omitted, it is automatically calculated.
endDateDescription: The end of the date range filter.
Type: UTC date-time
Default: Current date and time (UTC)
Request
GET /transactions?limit=20&offset=40
Behavior
Returns 20 records
Starts from the 41st record in the result set
Request
GET /transactions?startDate=2025-01-01T00:00:00Z&endDate=2025-01-31T23:59:59Z
Behavior
Returns records created within the specified UTC date range
Applies default pagination unless limit and offset are explicitly provided
Request
GET /transactions?limit=50&offset=0&startDate=2025-01-01T00:00:00Z&endDate=2025-01-15T00:00:00Z
Behavior
Returns up to 50 records
Starts from the first record
Filters results to the specified date range
PayFacto GET endpoints support flexible pagination and date-based filtering. By adjusting limit, offset, startDate, and endDate, clients can efficiently retrieve large result sets in manageable segments while controlling the time range of returned data.
| Parameter | Location | Type / Format | Required | Endpoints |
|---|---|---|---|---|
chargeId | Path | string (uuid) | Yes | GET /charges/{chargeId}POST /charges/{chargeId}/capturesPOST /charges/{chargeId}/incrementsPOST /charges/{chargeId}/voidsPOST /charges/{chargeId}/releases |
refundId | Path | string (uuid) | Yes | GET /refunds/{refundId}POST /refunds/{refundId}/voids |
verificationId | Path | string (uuid) | Yes | GET /verifications/{verificationId} |
| Parameter | Location | Type / Format | Required | Endpoints |
|---|---|---|---|---|
terminalId | Query | string (uuid) | No | GET /chargesGET /refunds |
authCode | Query | string (max 6) | No | GET /chargesGET /refunds |
idempotencyKey | Query | string (max 64) | No | GET /chargesGET /refunds |
invoiceNumber | Query | string (max 25) | No | GET /chargesGET /refunds |
lastFour | Query | string (4 digits) | No | GET /chargesGET /refunds |
startDate | Query | string (YYYY-MM-DD) | No | GET /chargesGET /refunds |
endDate | Query | string (YYYY-MM-DD) | No | GET /chargesGET /refunds |
offset | Query | integer (int32) | No | GET /chargesGET /refunds |
limit | Query | integer (int32) | No | GET /chargesGET /refunds |
| Parameter | Type / Format | Required | Endpoints |
|---|---|---|---|
amount | integer (int64) | Yes | POST /charges |
invoiceNumber | string (max 25) | Yes | POST /charges |
paymentMethod | object | Yes | POST /charges |
capture | boolean | No | POST /charges |
billingDetail | object | No | POST /charges |
shippingDetail | object | No | POST /charges |
metadata | object (KVP) | No | POST /charges |
statementDescriptor | string (max 23) | No | POST /charges |
| Parameter | Type / Format | Required | Endpoints |
|---|---|---|---|
amount | integer (int64) | Yes | POST /charges/{chargeId}/captures |
statementDescriptor | string (max 23) | No | POST /charges/{chargeId}/captures |
terminal | object | No | POST /charges/{chargeId}/captures |
| Parameter | Type / Format | Required | Endpoints |
|---|---|---|---|
amount | integer (int64) | Yes | POST /charges/{chargeId}/increments |
terminal | object | No | POST /charges/{chargeId}/increments |
| Parameter | Type / Format | Required | Endpoints |
|---|---|---|---|
reason | enum (voidReason) | Yes | POST /charges/{chargeId}/voids |
terminal | object | No | POST /charges/{chargeId}/voids |
| Parameter | Type / Format | Required | Endpoints |
|---|---|---|---|
reason | enum (releaseReason) | Yes | POST /charges/{chargeId}/releases |
terminal | object | No | POST /charges/{chargeId}/releases |
| Parameter | Type / Format | Required | Endpoints |
|---|---|---|---|
amount | integer (int64) | Yes | POST /refunds |
chargeId | string (uuid) | Yes | POST /refunds |
reason | enum | Yes | POST /refunds |
metadata | object (KVP) | No | POST /refunds |
| Parameter | Type / Format | Required | Endpoints |
|---|---|---|---|
reason | enum (voidReason) | Yes | POST /refunds/{refundId}/voids |
terminal | object | No | POST /refunds/{refundId}/voids |
| Parameter | Type / Format | Required | Endpoints |
|---|---|---|---|
card | object | Yes | POST /verifications |
billingDetail | object | No | POST /verifications |
metadata | object (KVP) | No | POST /verifications |
Terminal object appears in capture, increment, void, release, refund void
Amount fields always use smallest currency unit (e.g. cents)