REST API מלא לאינטגרציה עם חנויות QuickShop.
הזמנות, מוצרים, מלאי, לקוחות, Storefront ומובייל - הכל בגישת API.
https://my-quickshop.com/api/v1היכנסו לאדמין Settings → API Keys ויצרו מפתח חדש עם ה-Scopes הרלוונטיים.
כל קריאה דורשת Header בשם X-API-Key עם המפתח שלכם.
קראו את התיעוד המלא ותתחילו לבנות אינטגרציות מדהימות!
curl -X GET "https://my-quickshop.com/api/v1/orders" \
-H "X-API-Key: qs_live_xxxxxxxxxxxxxxxxxxxx"כל הקריאות דורשות API Key
orders:readorders:writeproducts:readproducts:writecustomers:readinventory:readinventory:writediscounts:readdiscounts:writeanalytics:readwebhooks:readwebhooks:writestorefront:readcustomer:readcustomer:writemobile:writeX-RateLimit-Remaining - כמה קריאות נשארוX-RateLimit-Reset - מתי יתאפס המונהunauthorized- API key לא תקין או חסרforbidden- אין הרשאה (scope חסר)not_found- משאב לא נמצאinvalid_request- בקשה לא תקינהrate_limited- חריגה ממגבלת קריאות/api/v1/ordersרשימת הזמנות/api/v1/orders/{id}פרטי הזמנה/api/v1/orders/{id}עדכון הזמנה/api/v1/orders/{id}/edit-itemsעריכת פריטי הזמנה/api/v1/orders/{id}/fulfillסימון הזמנה כנשלחה/api/v1/orders/{id}/cancelביטול הזמנה/api/v1/productsרשימת מוצרים/api/v1/productsיצירת מוצר/api/v1/products/{id}פרטי מוצר/api/v1/products/{id}עדכון מוצר/api/v1/categoriesרשימת קטגוריות/api/v1/categoriesיצירת קטגוריה/api/v1/categories/{id}פרטי קטגוריה/api/v1/categories/{id}עדכון קטגוריה/api/v1/categories/{id}מחיקת קטגוריה/api/v1/inventory/{id}צפייה במלאי/api/v1/inventory/{id}עדכון מלאי/api/v1/customersרשימת לקוחות/api/v1/discountsרשימת הנחות וקופונים/api/v1/discountsיצירת הנחה/קופון/api/v1/discounts/{id}פרטי הנחה/api/v1/discounts/{id}עדכון הנחה/api/v1/discounts/{id}מחיקת הנחה/api/v1/analyticsסטטיסטיקות וניתוח נתונים/api/v1/webhooksרשימת וובהוקים/api/v1/webhooksיצירת וובהוק/api/v1/webhooks/{id}פרטי וובהוק/api/v1/webhooks/{id}עדכון וובהוק/api/v1/webhooks/{id}מחיקת וובהוק/api/v1/webhooks/{id}/deliveriesהיסטוריית משלוחים (סטטוס, תגובה, שגיאות)מה נשלח לכתובת שמוגדרת ב־POST /api/v1/webhooks כשמתרחש אירוע בחנות
QuickShop שולחת POST עם Content-Type: application/json. השדה העליון הוא תמיד event (לא type), יחד עם חותמת זמן ושדה data שתוכנו תלוי בסוג האירוע.
{
"event": "order.created",
"timestamp": "2026-04-23T12:00:00.000Z",
"data": {
/* שדות לפי סוג האירוע - ראו טבלה למטה */
}
}Content-Type: application/jsonX-Webhook-Signature: sha256=<hmac> (HMAC של ה־body עם הסוד - אמתו בצד שלכם).X-Webhook-Event: <event> ו־X-Webhook-Test: true, וגוף הבקשה כולל "test": true ברמת ה־top.בדיקת אינטגרציה:בדף Webhooks באדמין יש כפתור "בדיקה ▾" שפותח רשימה של האירועים שה־webhook רשום אליהם. בחירה של אירוע שולחת payload סינתטי במבנה הזהה לפרודקשן (כולל חתימה) עם הדגל "test": true ברמת ה־top - מאפשר לבדוק parsing וחתימה בלי הזמנה אמיתית.
לוגי משלוח: GET /api/v1/webhooks/{id}/deliveries מחזיר את ניסיונות המשלוח האחרונים. לכל רשומה: request_body (ה־JSON שנשלח בפועל), status_code, response_body, error, duration_ms, ו־event_type - כך שאפשר לאמת מה נשלח בלי גישה לדשבורד הסוחר.
data אינו מודל REST מלא של ההזמנה או המוצר - לפרטים מלאים (פריטים, כתובות משלוח וכו׳) השתמשו ב־API עם X-API-Key, למשל GET /api/v1/orders/{id} כשיש לכם את מזהה ההזמנה.
| event | שדות עיקריים ב־data |
|---|---|
| order.created | orderId, orderNumber, customerEmail, customerName, total, itemCount, couponCode (אופציונלי), timestamp |
| order.paid | כל השדות של order.created + paymentMethod. נשלח אחרי תשלום מוצלח, סימון ידני "שולם" בדשבורד, או גביית יתרה (collect-remaining). |
| order.updated | orderId, orderNumber, changes (מפה: שדה → { before, after }), source (admin/api/system), timestamp. נשלח על שינוי כתובת, סטטוס, פריטים, הערות, סכומים - בדקו את changes כדי לזהות מה השתנה. |
| order.cancelled | orderId, orderNumber, customerEmail, customerName, cancelReason, timestamp |
| product.low_stock | productName, inventory |
| product.out_of_stock | productName, inventory (0) |
ניתן להירשם לכל האירועים ברשימה באמצעות * בהגדרת הוובהוק (לפי מסך האדמין / API).
Endpoints ציבוריים לפרונט חנות ואפליקציית מובייל. אימות לקוח באמצעות Customer Session.
/api/storefront/{slug}/configהגדרות חנות (שם, לוגו, צבעים, מטבע)/api/storefront/{slug}/app-configהגדרות אפליקציית מובייל (JSON)/api/storefront/{slug}/app-configשמירת הגדרות מובייל (Admin)/api/storefront/{slug}/productsקטלוג מוצרים (פילטר, מיון, דפדוף)/api/storefront/{slug}/products/{productSlug}פרטי מוצר + וריאנטים + תמונות/api/storefront/{slug}/categoriesרשימת קטגוריות (עם ספירת מוצרים)/api/customer/ordersהיסטוריית הזמנות הלקוח/api/customer/orders/{orderNumber}פרטי הזמנה + מעקב משלוח/api/customer/updateעדכון פרופיל לקוח/api/customer/addressesרשימת כתובות/api/customer/addressesהוספת כתובת/api/customer/addressesמחיקת כתובת/api/customer/wishlistרשימת המשאלות/api/customer/wishlistהוספה לרשימה/api/customer/wishlistToggle (הוסף/הסר)/api/customer/wishlist/{productId}בדיקה אם מוצר ברשימה/api/mobile/device/registerרישום מכשיר לפוש נוטיפיקציות/api/mobile/notifications/preferencesהעדפות התראות/api/mobile/notifications/preferencesעדכון העדפות התראותה-Storefront API משתמש ב-Customer Session (OTP via Email) לאימות לקוחות. Endpoints ציבוריים כמו config, products ו-categories לא דורשים אימות. Endpoints של לקוח (customer/*) דורשים session token.
const API_KEY = 'qs_live_xxxx';
const BASE_URL = 'https://my-quickshop.com/api/v1';
async function getOrders() {
const response = await fetch(`${BASE_URL}/orders`, {
headers: {
'X-API-Key': API_KEY,
},
});
const { data, meta } = await response.json();
return data;
}
async function updateInventory(productId, adjustment) {
const response = await fetch(`${BASE_URL}/inventory/${productId}`, {
method: 'PATCH',
headers: {
'X-API-Key': API_KEY,
'Content-Type': 'application/json',
},
body: JSON.stringify({
type: 'product',
adjustment,
}),
});
return response.json();
}import requests
API_KEY = 'qs_live_xxxx'
BASE_URL = 'https://my-quickshop.com/api/v1'
HEADERS = {'X-API-Key': API_KEY}
def get_orders(page=1, limit=50):
response = requests.get(
f'{BASE_URL}/orders',
headers=HEADERS,
params={'page': page, 'limit': limit}
)
return response.json()['data']
def update_order_status(order_id, status):
response = requests.patch(
f'{BASE_URL}/orders/{order_id}',
headers=HEADERS,
json={'status': status}
)
return response.json()// יצירת מוצר חדש עם הורדת תמונות לשרת
const response = await fetch('https://my-quickshop.com/api/v1/products', {
method: 'POST',
headers: {
'X-API-Key': API_KEY,
'Content-Type': 'application/json',
},
body: JSON.stringify({
name: "מוצר לדוגמא",
slug: "sample-product",
description: "תיאור המוצר",
price: "99.90",
compare_price: "149.90",
inventory: 100,
track_inventory: true,
category_ids: ["cat_123"],
// תמונות - URL חיצוני
images: [
{ url: "https://example.com/image1.jpg", alt: "תמונה ראשית", is_primary: true },
{ url: "https://example.com/image2.jpg" }
],
// download_images: true = הורד וממיר ל-WebP ב-Vercel Blob
// download_images: false (ברירת מחדל) = שמור URL כמו שהוא
download_images: true
})
});
// Response
{
"success": true,
"data": {
"id": "prod_xxx",
"name": "מוצר לדוגמא",
"slug": "sample-product",
"images": [
{ "id": "img_1", "url": "https://xxx.blob.vercel-storage.com/...", "is_primary": true }
]
}
}💡 עם download_images: true, תמונות יורדות, ממירות ל-WebP, ואז עולות ל-Vercel Blob.
🎥 וידאו (media_type: "video") נשמר כ-URL כפי שהוא - כל מקור ציבורי (CDN / R2 / יוטיוב וכו׳).
// Edit order items: add, remove, or change quantity
const response = await fetch(
`${BASE_URL}/orders/${orderId}/edit-items`,
{
method: 'POST',
headers: {
'X-API-Key': API_KEY,
'Content-Type': 'application/json',
},
body: JSON.stringify({
// Change quantity of an existing item
update_quantity: [
{ item_id: "order-item-uuid", new_quantity: 3 }
],
// Add a new item to the order
add: [
{
product_id: "product-uuid",
variant_id: "variant-uuid", // optional
name: "Product Name",
variant_title: "M / Red", // optional
quantity: 2,
price: 49.90
}
],
// Remove items from the order
remove: ["order-item-uuid-to-remove"]
})
}
);
// Response
{
"data": {
"id": "order-uuid",
"order_number": 1042,
"old_total": 199.60,
"new_total": 249.50,
"price_difference": 49.90, // positive = charge more, negative = refund
"subtotal": 259.50,
"discount_amount": 10.00, // stays frozen (not recalculated)
"total": 249.50,
"line_items": [
{ "id": "...", "name": "...", "quantity": 3, "price": 49.90, "total": 149.70 }
]
}
}Only unfulfilled orders can be edited. Discounts remain frozen - only item totals change.
Inventory is automatically adjusted (both product and variant levels).
const STORE = 'my-store';
const BASE = 'https://my-quickshop.com/api';
// שליפת הגדרות חנות
const config = await fetch(
`${BASE}/storefront/${STORE}/config`
).then(r => r.json());
// שליפת מוצרים עם פילטרים
const products = await fetch(
`${BASE}/storefront/${STORE}/products?page=1&limit=20&sort=newest`
).then(r => r.json());
// שליפת מוצר בודד
const product = await fetch(
`${BASE}/storefront/${STORE}/products/my-product`
).then(r => r.json());// הוספה לרשימת משאלות
await fetch('/api/customer/wishlist', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Cookie': sessionCookie,
},
body: JSON.stringify({
productId: 'prod_xxx'
}),
});
// שליפת הזמנות לקוח
const orders = await fetch(
'/api/customer/orders?page=1&limit=10',
{ headers: { 'Cookie': sessionCookie } }
).then(r => r.json());
// עדכון פרופיל
await fetch('/api/customer/update', {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
'Cookie': sessionCookie,
},
body: JSON.stringify({
firstName: 'דניאל',
lastName: 'כהן',
phone: '0501234567',
}),
});{
"data": [
{
"id": "uuid",
"order_number": "1001",
"status": "processing",
"total": 480.00,
"created_at": "2026-01-06T10:00:00Z"
}
],
"meta": {
"pagination": {
"page": 1,
"limit": 50,
"total": 150,
"total_pages": 3,
"has_next": true,
"has_prev": false
}
}
}{
"error": {
"code": "not_found",
"message": "Order not found"
}
}צרו חשבון מפתח, קבלו API Key והתחילו לבנות אינטגרציות מדהימות.