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 } ] }
Automation kinds are lifecycle triggers (birthday, winback, welcome, anniversary, and expiry). Firings keep web push and signed webhook events, and queue each consented email, SMS, or WhatsApp leg through the first-party dispatcher. Provider submission occurs only when the corresponding operator-enabled provider path is configured. Failed webhook deliveries stay pending and retry on the next daily tick; provider callbacks distinguish acceptance from delivery for direct channels.
Square connects natively (Dashboard → Integrations: paste your own access token; Rewardfinity registers its webhook and matches payments to members by email). Shopify uses signed store order and refund webhooks; Shopify POS remains an order-ingestion boundary until a POS extension is separately shipped and verified. Other POS systems (Clover, Lightspeed, Loyverse, Zettle…) drive the signed inbound endpoint POST /webhooks/in/:merchantId — directly or through Zapier/Make. Do not read the Shopify, Square, or generic webhook paths as one shared POS integration.