Transactions

Every write is a ledger row. Send an Idempotency-Key and a retry will return the first result instead of double-charging a customer.

Endpoints

POST /cards/{serial}/earn

Award points from a sale amount or a fixed point count.

POST /cards/{serial}/stamp

Add stamps, respecting the cooldown and per-visit maximum.

POST /cards/{serial}/redeem

Redeem a reward and write the redemption row.

POST /cards/{serial}/checkin

Record a membership check-in.

POST /cards/{serial}/adjust

Manual correction with a reason, recomputed from the ledger.

POST /cards/{serial}/topup

Prepaid: sell packs. Body packs (default 1) and amount (default packs × pack_price). Adds packs × units_per_pack.

POST /cards/{serial}/use

Prepaid: deduct count units, 1 up to max_use_per_scan. Refused with insufficient_units when fewer remain.

GET /cards/{serial}/transactions

The ledger for one card, newest first.

Example

curl -X POST https://perfito.al/v1/cards/PF-8F2A-19/earn \
  -H "Authorization: Bearer sk_test_…" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: 34dc17ae" \
  -d '{ "amount": 1450, "reference": "order_10492" }'