DEVELOPERS
PREVIEWAdd palm checkout to a POS in an afternoon.
Your POS asks the VenaPass app on the same terminal to identify the customer. You get back your own customer ID and a signed token your payment provider can trust.
Android POS: start the payment screen
VenaPass shows the amount, scans the palm and returns the result. Amounts are in minor units with an ISO 4217 currency.
val pay = Intent("com.venapass.action.PAY")
.putExtra("amount", 500000L) // NGN 5,000.00
.putExtra("currency", "NGN")
.putExtra("terminal_id", "LEKKI-POS-1")
.putExtra("request_id", UUID.randomUUID().toString())
startActivityForResult(pay, PAY_WITH_PALM)
// Result extras: success, customer_ref,
// assertion, receipt_id (gateway mode), message
Gateway URL: call the app on the terminal
For POS software with a configurable payment gateway address. Retry with the same request_id, never a new one.
POST http://127.0.0.1:9090/api/pay_direct
{ "amount": 500000, "currency": "NGN",
"terminal_id": "LEKKI-POS-1",
"request_id": "6f1c2e9a-…" }
200 OK
{ "success": true,
"customer_ref": "CUST-1042",
"assertion": "eyJhbGciOiJFZERTQSIs…",
"receipt_id": null,
"message": "Identity verified" }
For payment providers: trust the token
The assertion is a standard signed JWT (EdDSA). Any JWT library can verify it with our public keys:
https://api.venapass.com/.well-known/venapass-keys
Its sub is the merchant's own customer ID, so you charge the payment method you already hold for that customer.
- 1The signature verifies with a current VenaPass key.
- 2It has not expired (tokens live about two minutes).
- 3txn matches the exact amount and currency you are about to charge.
- 4terminal_id matches the POS terminal that sent the sale.
- 5You have not accepted this jti before.
Gateway mode: receive charges from VenaPass
If the merchant chooses gateway mode, we post each identified sale to your URL, signed with a secret only you and we hold. Treat request_id as an idempotency key.
POST https://your-provider.example/venapass
X-VenaPass-Signature: sha256=<HMAC of the body>
{ "assertion": "eyJ…", "customer_ref": "CUST-1042",
"amount": 500000, "currency": "NGN",
"terminal_id": "LEKKI-POS-1", "request_id": "6f1c…" }
Reply: { "approved": true, "reference": "PSP-88213",
"message": "Approved" }
Register customers from your POS
Start com.venapass.action.ENROLL with your customer_ref. VenaPass guides three palm scans and returns success. No name or phone number is sent to us.
Request sandbox access