API למחירי מתחרים
לפי המק״ט שלכם.
הממשק מחזיר נתונים מנורמלים מרשתות השיווק בישראל ומספק Snapshot יומי שמתאים לעדכון שדות המחיר ב־iStores.
אימות
כל בקשה ל־API חייבת לכלול מפתח בכותרת Authorization. המפתח מוצג פעם אחת בלבד בעת יצירתו.
curl "https://istores-price-intelligence.vercel.app/api/v1/prices?sku=7290001234567" \ -H "Authorization: Bearer pw_live_••••••••"
אל תשמרו את המפתח בדפדפן.
הקריאה צריכה לצאת מהשרת של iStores או משירות Backend מורשה.
Endpoints
GETהשוואת מחיר נוכחית
מחזיר את המחירים הקיימים בכל רשת וסניף, מהזול ליקר.
GETמוצר והיסטוריית מחירים
מחיר נוכחי יחד עם שינויים שנקלטו ב־90 הימים האחרונים.
GETSnapshot יומי
רשימה מדורגת של מק״טי הלקוח, עם cursor ו־changed_only לעדכון יעיל.
PUTמיפוי קטלוג iStores
רישום או עדכון של עד 500 מק״טים, מזהי מוצר ושמות שדות יעד בבקשה אחת.
GETרשימת מיפויים
מחזיר את המיפויים ומציין אילו מק״טים כבר נמצאו במאגר המחירים.
POSTרישום Webhook
יוצר endpoint מאובטח ומחזיר secret חד־פעמי לאימות החתימות.
GETרשימת Webhooks
מחזיר את ה־endpoints של החשבון ללא הסודות המוצפנים.
POSTבדיקת Webhook
מכניס אירוע בדיקה לתור המסירות ומחזיר delivery_id למעקב.
רישום מיפויי iStores
הערכים ב־field_mapping הם שמות שדות היעד שתפתחו ב־iStores. הם מוחזרים בכל שורת Snapshot לצד מזהה המוצר שלכם.
curl -X PUT "https://istores-price-intelligence.vercel.app/api/v1/mappings" \
-H "Authorization: Bearer pw_live_••••••••" \
-H "Content-Type: application/json" \
-d '{"items":[{"sku":"7290001234567","external_product_id":"prd_123","field_mapping":{"rami-levy":"competitor_price_rami_levy","shufersal":"competitor_price_shufersal"}}]}'מבנה תשובה
{
"object": "price_list",
"sku": "7290001234567",
"count": 3,
"data": [{
"chain_slug": "rami-levy",
"chain_name": "רמי לוי",
"store_id": "001",
"price": 16.9,
"unit_price": 6.76,
"source_updated_at": "2026-08-06T06:12:00Z",
"collected_at": "2026-08-06T06:15:00Z"
}]
}אימות חתימת Webhook
רשמו endpoint דרך POST /api/v1/webhooks. ה־secret מוחזר פעם אחת בלבד. כל מסירה כוללת timestamp וחתימה.
curl -X POST "https://istores-price-intelligence.vercel.app/api/v1/webhooks" \
-H "Authorization: Bearer pw_live_••••••••" \
-H "Content-Type: application/json" \
-d '{"name":"iStores daily sync","url":"https://example.co.il/hooks/pricewatch"}'לאימות המסירה, חשבו HMAC-SHA256 על המחרוזת {timestamp}.{raw_body} והשוו בזמן קבוע.
import crypto from "node:crypto";
const signed = `${timestamp}.${rawBody}`;
const expected = "v1=" + crypto
.createHmac("sha256", process.env.PRICEWATCH_WEBHOOK_SECRET)
.update(signed)
.digest("hex");
const valid = crypto.timingSafeEqual(
Buffer.from(expected),
Buffer.from(request.headers["x-pricewatch-signature"])
);מדיניות ניסיונות חוזרים
במקרה של תשובה שאינה 2xx או timeout, המסירה נשלחת שוב לאחר 1, 5, 30, 120 ו־480 דקות. אחרי שישה ניסיונות היא מסומנת כ־dead ונשמרת לבדיקה.
