API Reference
Base URL: https://api.checkerfin.com/v1
Authentication
All API requests are authenticated using your API key in the Authorization header. API keys are prefixed with chkr_live_ for production and chkr_test_ for the test environment.
# Example request with authentication
curl https://api.checkerfin.com/v1/payments/route \
-H "Authorization: Bearer chkr_live_..." \
-H "Content-Type: application/json" \
-d '{"amount": 49700, "currency": "SGD", "method": "paynow"}'
Test-mode keys (chkr_test_) route through simulated providers and do not generate real transactions. Transactions in test mode do not count toward your monthly quota.
Route a payment
/payments/route
Select the optimal payment provider for a transaction and return routing metadata. The transaction is not executed; use the returned provider and provider_payload to submit the payment to the provider directly.
Request body
| Parameter | Type | Required | Description |
|---|---|---|---|
amount |
integer | Yes | Amount in the smallest currency unit (e.g. cents for SGD) |
currency |
string | Yes | ISO 4217 currency code (SGD, MYR, THB, PHP, IDR) |
method |
string | Yes | Payment method: paynow, fast, promptpay, qris, card |
reference |
string | No | Your internal order or transaction reference |
metadata |
object | No | Arbitrary key-value pairs passed through to reconciliation records |
Response
{
"transaction_id": "pay_7xKm4r",
"provider": "hitpay",
"routing_score": 97,
"estimated_fee_sgd": 2.98,
"compliance_status": "passed",
"provider_payload": { /* provider-specific object */ }
}
Rate limits
API requests are rate-limited per API key. Test-mode and live-mode keys have separate limits. When a rate limit is exceeded, the API returns a 429 rate_limited error.
| Plan | Requests / second | Transactions / month |
|---|---|---|
| Developer | 10 | 500 |
| Scale | 50 | 25,000 |
| Enterprise | 200 | Unlimited |
Error codes
Checker uses standard HTTP status codes. All errors return a JSON body with a code and message field.
| Status | Code | Description |
|---|---|---|
| 400 | invalid_request | Missing or invalid parameter in the request body |
| 401 | unauthorized | Missing or invalid API key |
| 403 | forbidden | API key does not have permission for this action |
| 422 | compliance_hold | Transaction blocked by compliance rules; check reason field |
| 429 | rate_limited | Monthly transaction limit reached or per-second rate limit exceeded |
| 503 | provider_unavailable | All eligible providers for this transaction are currently unavailable |
Get payment
/payments/:transaction_id
Retrieve the routing metadata and current status for a previously routed payment. Supply the transaction_id returned by POST /payments/route.
Path parameter
| Parameter | Type | Description |
|---|---|---|
transaction_id |
string | The ID returned when the payment was routed |
List payments
/payments
Returns a paginated list of routed payments for your account. Results are ordered newest-first. Use cursor for pagination.
Query parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
limit | integer | 20 | Number of records (max 100) |
cursor | string | none | Pagination cursor from previous response |
provider | string | none | Filter by provider name |
status | string | none | Filter: routed, settled, failed |
Get reconciliation record
/reconciliation/:transaction_id
Returns the reconciliation record for a transaction, including settlement match status and any discrepancy details.
List reconciliation records
/reconciliation
Returns a paginated list of reconciliation records. Use status=discrepancy to surface unmatched items.
Run compliance check
/compliance/check
Run a compliance check on a transaction before routing. Returns pass/fail with a structured reason code. This is called automatically during POST /payments/route but can also be called independently.
Request body
| Parameter | Type | Required | Description |
|---|---|---|---|
amount | integer | Yes | Amount in smallest currency unit |
currency | string | Yes | ISO 4217 code |
counterparty_id | string | No | Counterparty identifier for FATF screening |
Webhooks
Checker sends webhook events when key state changes occur. Configure your webhook endpoint in the dashboard. All POST requests include an X-Checker-Signature header for verification.
| Event | Description |
|---|---|
payment.routed |
A routing decision was made and returned to the caller |
reconciliation.matched |
A settlement event was matched to a transaction record |
reconciliation.discrepancy |
A settlement amount does not match the expected routing amount |
compliance.hold |
A transaction was blocked by a compliance rule |
provider.failover |
Automatic failover occurred to an alternate provider |