Walaora API ریفرنس
POS، ای کامرس اسٹور یا اندرونی سسٹم منسلک کریں۔ HTTPS پر JSON، ہر انٹیگریشن کے لیے ایک API key۔
تصدیق (Authentication)
ڈیش بورڈ ← API اور Webhooks میں ایک key بنائیں (Business یا Enterprise پلان)۔ اسے ہر درخواست کے ساتھ بھیجیں۔ Keys صرف ایک بار دکھائی جاتی ہیں؛ اگر ظاہر ہو جائیں تو انہیں منسوخ کر دیں۔ حد: ہر key کے لیے فی منٹ 120 درخواستیں۔
Authorization: Bearer wl_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxEndpoints
Base URL: https://walaora.com/api/v1
| GET | /programsلائلٹی پروگرامز کی فہرست۔ |
| GET | /customers?phone=0551234567&tag=vipکسٹمرز تلاش کریں (فی صفحہ 50، ?page=2…)۔ ?tag=vip اس ٹیگ والے گاہک دکھاتا ہے؛ ہر گاہک کے ساتھ اس کے ٹیگز ہوتے ہیں۔ |
| POST | /customersکسی کسٹمر کو پروگرام میں رجسٹر کریں۔ باڈی: { programId, name, phone, email?, marketingConsent?, locale? }۔ نیا بننے پر 201 اور پہلے سے رجسٹرڈ ہونے پر 200 واپس آتا ہے۔ |
| GET | /cards/{serial}کسٹمر کے کارڈ / QR پر موجود کوڈ کے ذریعے کارڈ۔ |
| POST | /cards/{serial}/earnاسٹیمپ پروگرامز: { stamps?: 1–10 }۔ پوائنٹس پروگرامز: ورک اسپیس کی کرنسی میں { amount }۔ اختیاری { branchId }۔ ملٹی اسٹیمپ کارڈز: کارڈ کے سیٹس میں سے ایک کا setId بھیجیں۔ |
| POST | /cards/{serial}/redeemایک دستیاب انعام حاصل کریں، یا اسٹیمپس/پوائنٹس میں قیمت والے کیٹلاگ انعام کے لیے {"rewardId"} بھیجیں۔ |
| POST | /cards/{serial}/sellپری پیڈ پیکیجز: ایک پیکیج بیچتا ہے، اس کے استعمال کارڈ میں شامل ہوتے ہیں (ادائیگی آپ کے کاؤنٹر پر)۔ Webhook: package.sold۔ |
| POST | /cards/{serial}/useپری پیڈ پیکیجز: ایک استعمال کم کرتا ہے (ختم یا میعاد گزرنے پر انکار)۔ ملازم کارڈز: روزانہ حد کے اندر سہولت درج کرتا ہے۔ Webhooks: package.used، perk.used۔ |
| GET | /coupons/{code}کوپن استعمال کیے بغیر چیک کریں: اس کی آفر، کیا یہ استعمال ہو سکتا ہے، اور اگر نہیں تو کیوں (استعمال شدہ، میعاد ختم یا موقوف)۔ |
| POST | /coupons/{code}/redeemکوپن ایک بار استعمال کریں۔ اختیاری { amount } (فروخت کی رقم، ورک اسپیس کی کرنسی میں) اور { branchId }۔ پہلے سے استعمال شدہ ہونے یا آفر ختم ہونے پر 409۔ Webhook: coupon.redeemed۔ |
| GET | /coupon-offersکوپن آفرز کی فہرست: ان کی قدر، ختم ہونے کی تاریخ اور کیا ابھی کوڈ بنائے جا سکتے ہیں (usable)۔ |
| POST | /coupon-offers/{id}/couponsکسی آفر کے کوڈ بنائیں۔ { customerId } اس گاہک کو ایک کوڈ دیتا ہے (یہ اس کے کارڈ پیج پر دکھتا ہے)؛ یا { count: 1–500 } پرنٹ یا شیئر کرنے کے لیے بغیر گاہک کے کوڈ۔ کوڈز کے ساتھ 201؛ آفر رکی ہوئی یا ختم ہونے پر 409۔ |
curl -X POST https://walaora.com/api/v1/cards/ABCDE23456/earn \
-H "Authorization: Bearer wl_live_…" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: receipt-10045" \
-d '{"stamps": 1}'دوبارہ کوشش اور idempotency
POST درخواستوں کے لیے Idempotency-Key ہیڈر بھیجیں (کوئی بھی منفرد اسٹرنگ، مثلاً آپ کی رسید کا نمبر)۔ 24 گھنٹوں کے اندر اسی key کے ساتھ دوبارہ کوشش کرنے پر دو بار اسٹیمپ لگنے کے بجائے اصل جواب واپس ملتا ہے۔
غلطیاں (Errors)
غلطی کی صورت میں HTTP اسٹیٹس کے ساتھ JSON باڈی { error: { code, message } } واپس آتی ہے: 401 غلط key · 403 plan_required · 404 نہیں ملا · 409 cooldown / no_reward / program_inactive · 422 توثیق کی غلطی · 429 حد سے زیادہ درخواستیں۔
Webhooks
ڈیش بورڈ میں ایک HTTPS endpoint شامل کریں اور ایونٹس منتخب کریں۔ ہر ڈیلیوری JSON { id, type, createdAt, data } کے ساتھ ایک POST ہوتی ہے جس میں یہ ہیڈرز ہوتے ہیں: Walaora-Event، Walaora-Delivery اور Walaora-Signature۔ 10 سیکنڈ کے اندر 2xx کے ساتھ جواب دیں۔ ناکام ڈیلیوریز 1 منٹ، 5 منٹ، 30 منٹ، 2 گھنٹے اور 12 گھنٹے بعد دوبارہ بھیجی جاتی ہیں۔
ایونٹس
customer.enrolledcard.earnedreward.unlockedreward.redeemedcard.adjustedcustomer.deletedfeedback.receivedpackage.soldpackage.usedperk.usedcoupon.redeemed
دستخطوں کی تصدیق (Node.js)
import crypto from "node:crypto";
// rawBody: the exact request body string; header: req.headers["walaora-signature"]
export function verifyWalaora(rawBody, header, secret) {
const parts = Object.fromEntries(header.split(",").map((p) => p.split("=")));
const t = Number(parts.t);
if (!t || Math.abs(Date.now() / 1000 - t) > 300) return false; // replay window
const expected = crypto.createHmac("sha256", secret).update(`${t}.${rawBody}`).digest("hex");
return crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(parts.v1 ?? ""));
}