DEVELOPERS

PREVIEW

Add 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.

  1. 1The signature verifies with a current VenaPass key.
  2. 2It has not expired (tokens live about two minutes).
  3. 3txn matches the exact amount and currency you are about to charge.
  4. 4terminal_id matches the POS terminal that sent the sale.
  5. 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