Everything the dashboard does, your code can do. Bearer-key auth, idempotent writes, signed webhooks. No SDK required — it's plain JSON over HTTPS.
Create API keys in Dashboard → Settings (owner keys have full access; staff keys are scanner-only). Send the key as a bearer token:
curl https://api.rewardfinity.com/v1/members \
-H "authorization: Bearer lp_sk_…" \
-H "content-type: application/json" \
-d '{"email":"customer@example.com","name":"Priya"}'
POST/v1/merchantsPOST/v1/membersGET/v1/members/:idPOST/v1/events/purchasePOST/v1/events/refundPOST/v1/rewardsPOST/v1/redemptionsPOST/v1/campaignsPOST/v1/campaigns/:id/codesPATCH/v1/campaigns/:idGET/v1/campaigns/:idPOST/v1/promosPOST/v1/wheels/:id/spinPOST/v1/importGET/v1/insightsGET/v1/automationsPublic (no auth): GET /p/:slug member page · POST /p/:slug/join self-enroll · POST /p/:slug/redeem member self-redemption · GET /c/:code claim page. Money is integer cents; points are integers; the ledger is append-only.
Set a webhook URL in Dashboard → Automations. Rewardfinity POSTs batched events — member.joined, points.earned, stamp.added, reward.redeemed, campaign.claimed, plus automation firings — signed with your secret:
// verify: hex(HMAC-SHA256(rawBody, secret)) === headers['x-torna-signature']
{ "type": "torna.outbox", "events": [
{ "id": "out_…", "kind": "points.earned",
"payload": { "email": "…", "pointsEarned": 25, "balance": 125 },
"createdAt": 1783380000000 } ] }
Failed deliveries stay pending and retry on the next daily tick. Wire the webhook to Zapier/Make/your server to reach email or SMS tools you own.
Square connects natively (Dashboard → Integrations: paste your own access token; Rewardfinity registers its webhook and matches payments to members by email). Shopify & Shopify POS use signed store webhooks. Every other POS (Clover, Lightspeed, Loyverse, Zettle…) drives the signed inbound endpoint POST /webhooks/in/:merchantId — directly or through Zapier/Make.