E-Commerce API
Διαχειριστείτε τον κατάλογο προϊόντων σας, παρακολουθήστε παραγγελίες, εποπτεύστε τη δραστηριότητα καλαθιών και αναλύστε τα τμήματα RFM των πελατών σας.
Όλα τα endpoints αυτής της σελίδας είναι σχετικά ως προς το βασικό URL: https://api-eu1.joryio.com/api - δείτε Επισκόπηση API.
Δικαιώματα
Η ανάγνωση δεδομένων καταλόγου, καλαθιού και παραγγελιών απαιτεί analytics:read. Η δημιουργία ή ενημέρωση προϊόντων, καλαθιών και παραγγελιών απαιτεί ecommerce:write. Και τα δύο εκχωρούνται σε κλειδί API από τις Ρυθμίσεις → Κλειδιά API.
Οι διαδρομές εγγραφής απαιτούσαν προηγουμένως integrations:write, το οποίο δεν προσφέρεται σε κλειδιά API επειδή διέπει επίσης το OAuth των συνδέσεων και τη διαμόρφωση συγχρονισμού warehouse. Εξακολουθούν να το δέχονται, οπότε οι υπάρχοντες καλούντες δεν επηρεάζονται.
Σύμβαση ονομασίας ID
Το Joryio χρησιμοποιεί μια σαφή σύμβαση ονομασίας για τα αναγνωριστικά:
Τα δικά σας ID (χρησιμοποιήστε τα κατά τη δημιουργία/καταγραφή δεδομένων)
| Πεδίο | Περιγραφή | Παράδειγμα |
|---|---|---|
productId | Το δικό σας αναγνωριστικό προϊόντος (SKU, ID προϊόντος από την πλατφόρμα e-commerce σας) | "SKU-12345" |
orderId | Το δικό σας αναγνωριστικό παραγγελίας (αριθμός παραγγελίας από την πλατφόρμα σας) | "ORD-2024-001" |
userId | Το δικό σας αναγνωριστικό χρήστη | "user-123" |
ID του Joryio (επιστρέφονται στις αποκρίσεις του API)
| Πεδίο | Περιγραφή | Πότε να το χρησιμοποιήσετε |
|---|---|---|
id | Το εσωτερικό ID του Joryio για προϊόντα/παραγγελίες | Επιστρέφεται στις αποκρίσεις του API· χρησιμοποιήστε το για ενημερώσεις/διαγραφές |
joryioUserId | Το εσωτερικό ID χρήστη του Joryio (το 24-hex id που επιστρέφεται στις αποκρίσεις του user API) | Εναλλακτικό του userId όταν θέλετε αναφορά μέσω του ID του Joryio |
Ευέλικτη ταυτοποίηση χρήστη
Κατά τη δημιουργία παραγγελιών ή την καταγραφή συμβάντων, μπορείτε να ταυτοποιήσετε χρήστες με οποιοδήποτε από τα δύο:
userId- Το δικό σας αναγνωριστικό χρήστη (το συνηθέστερο)joryioUserId- Το εσωτερικό ID χρήστη του Joryio
// Using your user ID (recommended)
{ "orderId": "ORD-001", "userId": "user-123", ... }
// Using Joryio's internal user ID
{ "orderId": "ORD-001", "joryioUserId": "66a1f2c3d4e5f6a7b8c9d0e1", ... }
Έλεγχος ταυτότητας
Όλα τα αιτήματα απαιτούν έλεγχο ταυτότητας JWT:
Authorization: Bearer your_jwt_token
Content-Type: application/json
X-Workspace-Id: your_workspace_id
Κατάλογος προϊόντων
Δημιουργία προϊόντος
Δημιουργήστε ένα νέο προϊόν στον κατάλογό σας.
POST /catalog/products
Σώμα αιτήματος:
| Πεδίο | Τύπος | Απαιτείται | Περιγραφή |
|---|---|---|---|
productId | string | Ναι | Το δικό σας μοναδικό αναγνωριστικό προϊόντος (SKU, ID προϊόντος) |
name | string | Ναι | Όνομα προϊόντος |
price | number | Ναι | Τιμή προϊόντος |
description | string | Όχι | Περιγραφή προϊόντος |
compareAtPrice | number | Όχι | Αρχική τιμή (για εκπτώσεις) |
currency | string | Όχι | Κωδικός νομίσματος (προεπιλογή: USD) |
categories | string[] | Όχι | Κατηγορίες προϊόντος |
tags | string[] | Όχι | Ετικέτες προϊόντος |
brand | string | Όχι | Όνομα επωνυμίας |
imageUrl | string | Όχι | URL κύριας εικόνας προϊόντος |
url | string | Όχι | URL σελίδας προϊόντος |
inStock | boolean | Όχι | Διαθεσιμότητα αποθέματος (προεπιλογή: true) |
sku | string | Όχι | Μονάδα διατήρησης αποθέματος (SKU) |
variants | object[] | Όχι | Παραλλαγές προϊόντος |
customFields | object | Όχι | Προσαρμοσμένα γνωρίσματα |
Παράδειγμα αιτήματος:
curl -X POST https://api-eu1.joryio.com/api/catalog/products \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"productId": "SKU-12345",
"name": "Classic Blue T-Shirt",
"price": 29.99,
"compareAtPrice": 39.99,
"currency": "USD",
"categories": ["Clothing", "T-Shirts"],
"tags": ["sale", "bestseller"],
"brand": "Acme Apparel",
"imageUrl": "https://example.com/images/blue-tshirt.jpg",
"url": "https://example.com/products/blue-tshirt",
"inStock": true,
"sku": "BTS-001-BL",
"variants": [
{
"id": "var-s",
"name": "Small",
"sku": "BTS-001-BL-S",
"price": 29.99,
"inStock": true,
"options": { "size": "S", "color": "Blue" }
},
{
"id": "var-m",
"name": "Medium",
"sku": "BTS-001-BL-M",
"price": 29.99,
"inStock": true,
"options": { "size": "M", "color": "Blue" }
}
]
}'
Απόκριση:
{
"id": "prod_abc123",
"productId": "SKU-12345",
"name": "Classic Blue T-Shirt",
"price": 29.99,
"createdAt": "2024-01-20T10:00:00.000Z"
}
Μαζικό upsert προϊόντων (σώμα-πίνακας)
Δεν υπάρχει ξεχωριστό endpoint μαζικών λειτουργιών: το POST /catalog/products δέχεται είτε ένα μεμονωμένο αντικείμενο προϊόντος είτε έναν σκέτο πίνακα JSON με αντικείμενα προϊόντων (χωρίς αντικείμενο-περιτύλιγμα). Η μορφή πίνακα δημιουργεί ή ενημερώνει έως 500 προϊόντα σε ένα αίτημα, με upsert βάσει productId.
POST /catalog/products
Σώμα αιτήματος:
Ένας πίνακας JSON (μέγιστο 500 στοιχεία· κενός πίνακας ή περισσότερα από 500 επιστρέφει 400). Κάθε στοιχείο ακολουθεί την ίδια μορφή με τη μορφή μεμονωμένου αντικειμένου, συμπεριλαμβανομένου του προαιρετικού πεδίου source ανά προϊόν.
Κάθε στοιχείο περνά από πλήρη επικύρωση. Ένα μη έγκυρο στοιχείο αναφέρεται στο failed με τον δείκτη του στον πίνακα - δεν γίνεται ποτέ σιωπηλά αποδεκτό - και τα υπόλοιπα έγκυρα στοιχεία εξακολουθούν να γίνονται upsert.
[
{ "productId": "SKU-001", "name": "Product 1", "price": 19.99 },
{ "productId": "SKU-002", "name": "Product 2", "price": 29.99, "source": "shopify" }
]
Απόκριση:
Σε αντίθεση με τη μορφή αντικειμένου (που επιστρέφει το προϊόν που δημιουργήθηκε), η μορφή πίνακα επιστρέφει μια συγκεντρωτική σύνοψη:
{
"processed": 2,
"upserted": 2,
"failed": []
}
| Πεδίο | Περιγραφή |
|---|---|
processed | Πλήθος στοιχείων που παραλήφθηκαν στον πίνακα του αιτήματος |
upserted | Προϊόντα που πραγματικά δημιουργήθηκαν ή ενημερώθηκαν |
failed | Αποτυχίες ανά στοιχείο: index (θέση στον πίνακα του αιτήματος), productId / sku (όταν υπάρχουν στο στοιχείο), reason |
Λίστα προϊόντων
Ερώτημα προϊόντων με φιλτράρισμα και σελιδοποίηση.
GET /catalog/products
Παράμετροι query:
| Παράμετρος | Τύπος | Περιγραφή |
|---|---|---|
search | string | Αναζήτηση βάσει ονόματος, περιγραφής ή SKU |
categories | string[] | Φιλτράρισμα βάσει κατηγοριών |
tags | string[] | Φιλτράρισμα βάσει ετικετών |
brand | string | Φιλτράρισμα βάσει επωνυμίας |
inStock | boolean | Φιλτράρισμα βάσει κατάστασης αποθέματος |
minPrice | number | Ελάχιστη τιμή |
maxPrice | number | Μέγιστη τιμή |
limit | number | Αποτελέσματα ανά σελίδα (προεπιλογή: 50) |
offset | number | Μετατόπιση σελιδοποίησης |
sortBy | string | Πεδίο ταξινόμησης: name, price, createdAt, updatedAt |
sortOrder | string | asc ή desc |
Παράδειγμα:
curl "https://api-eu1.joryio.com/api/catalog/products?categories=T-Shirts&inStock=true&limit=20" \
-H "Authorization: Bearer $TOKEN"
Πεδία που συμπληρώνουν οι ενσωματώσεις καταστημάτων. Οι αποκρίσεις προϊόντων περιέχουν επίσης πεδία που συμπληρώνει ένα συνδεδεμένο κατάστημα (WooCommerce) και που οι διαδρομές δημιουργίας και ενημέρωσης δεν δέχονται: gtin (GTIN, UPC, EAN ή ISBN, ή null), attributes (όνομα χαρακτηριστικού προς τις τιμές του, για παράδειγμα {"Material": ["Linen"]}, ή null), variants[].gtin και sourceModifiedAt (πότε το κατάστημα άλλαξε τελευταία το προϊόν). Τα brand και description (απλό κείμενο) συμπληρώνονται με τον ίδιο τρόπο για συγχρονισμένα προϊόντα.
Λήψη κατηγοριών
Λίστα όλων των κατηγοριών προϊόντων.
GET /catalog/categories
Λήψη επωνυμιών
Λίστα όλων των επωνυμιών προϊόντων.
GET /catalog/brands
Στατιστικά καταλόγου
Σύνολα και υγεία καταλόγου, υπολογισμένα σε όλα τα προϊόντα - ποτέ σε μία σελίδα.
GET /catalog/stats
Απάντηση:
{
"productCount": 8214,
"categoryCount": 37,
"brandCount": 12,
"outOfStockCount": 341,
"lowStockCount": 96,
"unclassifiedCount": 18,
"lowStockThreshold": 10
}
| Πεδίο | Περιγραφή |
|---|---|
outOfStockCount | Προϊόντα με quantity 0, ή inStock: false όταν δεν παρακολουθείται ποσότητα |
lowStockCount | Προϊόντα με quantity από 1 έως lowStockThreshold |
unclassifiedCount | Προϊόντα χωρίς κατηγορία ή χωρίς μάρκα |
lowStockThreshold | Το όριο μονάδων στο οποίο υπολογίστηκε το lowStockCount |
Παραγγελίες
Δημιουργία παραγγελίας
Καταγράψτε μια νέα παραγγελία.
POST /orders
Σώμα αιτήματος:
| Πεδίο | Τύπος | Απαιτείται | Περιγραφή |
|---|---|---|---|
orderId | string | Ναι | Το δικό σας ID παραγγελίας (αριθμός παραγγελίας από την πλατφόρμα σας) |
userId | string | Ένα από τα δύο | Το δικό σας ID χρήστη-πελάτη |
joryioUserId | string | Ένα από τα δύο | Το εσωτερικό ID χρήστη του Joryio (εναλλακτικό του userId) |
total | number | Ναι | Σύνολο παραγγελίας |
items | object[] | Ναι | Γραμμές παραγγελίας |
status | string | Όχι | Κατάσταση παραγγελίας (προεπιλογή: pending) |
paymentStatus | string | Όχι | paid ή unpaid: αν η παραγγελία έχει πληρωθεί. Μια παραγγελία με αντικαταβολή ή τραπεζική μεταφορά είναι processing και unpaid μέχρι να φτάσουν τα χρήματα, και εμφανίζεται στη σελίδα Παραγγελίες ως Αναμένεται πληρωμή αντί για Πληρωμένη. Χωρίς αυτό, μια παραγγελία σε επεξεργασία / απεσταλμένη / παραδομένη μετράει ως πληρωμένη (μια υπάρχουσα παραγγελία κρατά την τιμή της). Τα έσοδα δεν εξαρτώνται από αυτό. Δείτε Πληρωμένη ή αναμένεται πληρωμή. |
currency | string | Όχι | Κωδικός νομίσματος |
subtotal | number | Όχι | Μερικό σύνολο πριν τις εκπτώσεις |
discount | number | Όχι | Ποσό έκπτωσης |
shipping | number | Όχι | Κόστος αποστολής |
tax | number | Όχι | Ποσό φόρου |
totalRefunded | number | Όχι | Ποσό που επιστράφηκε μέχρι τώρα, στο νόμισμα της παραγγελίας (προεπιλογή 0). Για μερική επιστροφή στείλτε το μερικό ποσό με status: partiallyRefunded· για πλήρη επιστροφή ορίστε το στο total με status: refunded. Οι επιστροφές αφαιρούνται από τα αποδιδόμενα έσοδα. |
refunds | object[] | Όχι | Όλες οι επιστροφές μέχρι τώρα (έως 100): { "id": "RF-1", "amount": 29.99, "createdAt": "2026-06-03T09:00:00Z", "reason": "Wrong size", "items": [{ "productId": "SKU-1", "quantity": 1 }] } - μόνο το amount είναι υποχρεωτικό. Κάθε νέα επιστροφή δημιουργεί ένα συμβάν Order Refunded (ανά id· χωρίς αυτό, όταν αυξάνεται το ποσό που επιστράφηκε) και μια επιστροφή που έχει ήδη αναφερθεί δεν δημιουργεί τίποτα ξανά. Χωρίς totalRefunded, το άθροισμά τους είναι το ποσό που επιστράφηκε. Η μετάβαση σε status: cancelled (ή POST /orders/:id/cancel) δημιουργεί ένα Order Cancelled. Δείτε Συμβάντα επιστροφής και ακύρωσης. |
couponCode | string | Όχι | Εφαρμοσμένο κουπόνι |
coupons | object[] | Όχι | Κάθε κωδικός κουπονιού που χρησιμοποιήθηκε στην παραγγελία (έως 50): { "code": "SUMMER10", "amount": 10.0, "type": "fixed_amount" }. Τα amount (η έκπτωση του κωδικού) και type είναι προαιρετικά. Στο upsert, το coupons αντικαθιστά τους αποθηκευμένους κωδικούς (το [] τους διαγράφει)· παραλείψτε το για να τους διατηρήσετε. Όταν στέλνονται και τα δύο, υπερισχύει το coupons έναντι του couponCode |
shippingAddress | object | Όχι | Διεύθυνση αποστολής |
campaignId | string | Όχι | Καμπάνια απόδοσης (attribution) |
canvasId | string | Όχι | Canvas απόδοσης (attribution) |
source | string | Όχι | Πηγή παραγγελίας (email, sms, direct) |
utmSource | string | Όχι | UTM source |
utmMedium | string | Όχι | UTM medium |
utmCampaign | string | Όχι | UTM campaign |
salesChannel | string | Όχι | Πού έγινε η παραγγελία: online, pos, app, phone, marketplace ή other (πεζά ή κεφαλαία). Οποιαδήποτε άλλη τιμή επιστρέφει 400. Αν λείπει, μια νέα παραγγελία είναι online και μια υπάρχουσα κρατά το κανάλι της. Δείτε Κατάστημα και κανάλι πωλήσεων |
storeId | string | Όχι | Το δικό σας ID για το κατάστημα στο οποίο ανήκει η παραγγελία (φυσικό κατάστημα, υποκατάστημα, δεύτερος ιστότοπος), έως 100 χαρακτήρες. Το φίλτρο Καταστήματος στη σελίδα Παραγγελιών και η συνθήκη τμήματος "Αγόρασε στο κατάστημα" το συγκρίνουν |
storeName | string | Όχι | Το εμφανιζόμενο όνομα του καταστήματος, έως 255 χαρακτήρες, εμφανίζεται μαζί με το storeId |
Πρέπει να παρέχεται είτε το userId είτε το joryioUserId. Χρησιμοποιήστε το userId με τα δικά σας αναγνωριστικά χρηστών (το συνηθέστερο). Χρησιμοποιήστε το joryioUserId όταν έχετε το εσωτερικό ID χρήστη του Joryio (το 24-hex id που επιστρέφεται στις αποκρίσεις του user API).
Δομή γραμμής παραγγελίας:
{
"productId": "prod_abc123",
"name": "Blue T-Shirt",
"sku": "BTS-001",
"quantity": 2,
"price": 29.99,
"total": 59.98,
"imageUrl": "https://example.com/image.jpg"
}
Παράδειγμα αιτήματος:
curl -X POST https://api-eu1.joryio.com/api/orders \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"orderId": "ORD-2024-001",
"userId": "user-123",
"total": 89.97,
"subtotal": 99.97,
"discount": 10.00,
"shipping": 5.99,
"tax": 4.99,
"currency": "USD",
"coupons": [
{ "code": "SAVE10", "amount": 10.00, "type": "fixed_amount" }
],
"items": [
{
"productId": "prod_abc123",
"name": "Blue T-Shirt",
"quantity": 2,
"price": 29.99,
"total": 59.98
},
{
"productId": "prod_def456",
"name": "Black Jeans",
"quantity": 1,
"price": 49.99,
"total": 49.99
}
],
"source": "email",
"salesChannel": "pos",
"storeId": "tlv-dizengoff",
"storeName": "Tel Aviv - Dizengoff",
"campaignId": "camp_xyz789"
}'
Κατάστημα και κανάλι πωλήσεων
Κάθε παραγγελία δηλώνει πού πουλήθηκε (salesChannel) και, όταν ορίζει ένα, σε ποιο κατάστημα ανήκει (storeId). Ένας έμπορος με φυσικό κατάστημα και ιστότοπο, ή με δύο καταστήματα, μπορεί έτσι να φιλτράρει και να χωρίζει τις παραγγελίες ανά καθένα και να φτιάχνει τμήματα όπως "αγόρασε στο φυσικό κατάστημα τις τελευταίες 90 ημέρες".
salesChannel | Σημασία |
|---|---|
online | Ο δικός σας ιστότοπος ή web checkout (προεπιλογή) |
pos | Ταμείο σε φυσικό κατάστημα |
app | Η δική σας εφαρμογή για κινητά |
phone | Καταχωρήθηκε από το προσωπικό: τηλέφωνο, email, χειροκίνητη παραγγελία, πρόχειρο |
marketplace | Marketplace τρίτου |
other | Οτιδήποτε άλλο |
Οι τιμές είναι σταθερές και ίδιες παντού: σε αυτό το API, στις ιδιότητες συμβάντων (sales_channel), στις συνθήκες τμημάτων και στην εξαγωγή CSV των Παραγγελιών.
Τα συνδεδεμένα καταστήματα τα συμπληρώνουν και τα δύο για εσάς. Το κατάστημα είναι η ίδια η σύνδεση καταστήματος· το κανάλι προκύπτει από ό,τι καταγράφει η πλατφόρμα:
| Κατάστημα | Κανάλι πωλήσεων |
|---|---|
| Shopify | Από το source_name της παραγγελίας: τα web, online_store, checkout και οι παραγγελίες συνδρομής είναι online· το pos είναι pos· τα shopify_draft_order, iphone και android (παραγγελίες που δημιουργεί το προσωπικό στο admin ή στην εφαρμογή Shopify) είναι phone· οτιδήποτε άλλο είναι other |
| WooCommerce | Από το created_via: τα checkout και store-api είναι online· το admin είναι phone· ένα πρόσθετο POS είναι pos· το rest-api και οτιδήποτε άλλο είναι other |
| Magento | Παραγγελία που δημιουργήθηκε στο admin (χωρίς IP αγοραστή) είναι phone· κάθε άλλη είναι online |
| PrestaShop | Πάντα online - το PrestaShop δεν καταγράφει πού έγινε η παραγγελία |
Ένα συμβάν Order Completed από το SDK μπορεί να στείλει sales_channel (και store_id, store_name). Χωρίς αυτό, μια παραγγελία από εφαρμογή iOS ή Android είναι app και μία από ιστότοπο είναι online. Τα συμβάντα Order Completed, Order Refunded και Order Cancelled φέρουν sales_channel και, όταν η παραγγελία έχει κατάστημα, store_id, ώστε ένα ταξίδι να μπορεί να ξεκινά με βάση αυτά.
Ολοκλήρωση παραγγελίας (fulfill)
Επισημάνετε μια παραγγελία ως απεσταλμένη.
POST /orders/:id/fulfill
Σώμα αιτήματος:
{
"trackingNumber": "1Z999AA10123456784",
"carrier": "UPS"
}
Ακύρωση παραγγελίας
Ακυρώστε μια παραγγελία.
POST /orders/:id/cancel
Σώμα αιτήματος:
{
"reason": "Customer requested cancellation"
}
Επιστροφή χρημάτων παραγγελίας
Επεξεργαστείτε μια επιστροφή χρημάτων.
POST /orders/:id/refund
Σώμα αιτήματος:
{
"refundAmount": 29.99,
"reason": "Product defective",
"partial": true
}
Στατιστικά παραγγελιών
Λήψη στατιστικών παραγγελιών για ένα εύρος ημερομηνιών.
GET /orders/stats?startDate=2024-01-01&endDate=2024-01-31
Απόκριση:
{
"totalOrders": 156,
"totalRevenue": 12450.50,
"averageOrderValue": 79.81,
"ordersByStatus": {
"pending": 5,
"processing": 12,
"shipped": 45,
"delivered": 90,
"cancelled": 4
}
}
Παρακολούθηση καλαθιών
Ενημέρωση καλαθιού
Καταγράψτε ή ενημερώστε το καλάθι ενός χρήστη.
PUT /carts
Σώμα αιτήματος:
{
"userId": "user_123",
"items": [
{
"productId": "prod_abc123",
"name": "Blue T-Shirt",
"price": 29.99,
"quantity": 2,
"total": 59.98,
"imageUrl": "https://example.com/image.jpg"
}
],
"value": 59.98,
"subtotal": 59.98,
"currency": "USD",
"checkoutUrl": "https://store.example.com/checkout?cart=abc123"
}
Το value είναι το σύνολο του καλαθιού όπως το μετράτε (μπορεί να περιλαμβάνει αποστολή και φόρους). Το subtotal είναι προαιρετικό: το υποσύνολο των ειδών, πριν από αποστολή και φόρους - όταν παραλείπεται υπολογίζεται από τα είδη (το total κάθε γραμμής, αλλιώς price x quantity). Το υποσύνολο είναι η αξία του καλαθιού στο E-Commerce → Καλάθια, στο φίλτρο τμήματος Αξία καλαθιού, στο minValue και στο totalAbandonedValue.
Προσθήκη στο καλάθι
Προσθέστε ένα προϊόν στο καλάθι ενός χρήστη.
POST /carts/add
Σώμα αιτήματος:
{
"userId": "user_123",
"item": {
"productId": "prod_abc123",
"name": "Blue T-Shirt",
"price": 29.99,
"quantity": 1,
"total": 29.99
}
}
Λήψη εγκαταλελειμμένων καλαθιών
Λίστα εγκαταλελειμμένων καλαθιών για καμπάνιες ανάκτησης.
GET /carts/abandoned
Παράμετροι query:
| Παράμετρος | Τύπος | Περιγραφή |
|---|---|---|
minValue | number | Ελάχιστη αξία καλαθιού |
abandonedMinutesAgo | number | Μέγιστα λεπτά από την εγκατάλειψη |
limit | number | Αποτελέσματα ανά σελίδα |
offset | number | Μετατόπιση σελιδοποίησης |
Απόκριση:
{
"data": [
{
"id": "cart_123",
"userId": "user_456",
"items": [...],
"value": 149.99,
"abandonedAt": "2024-01-20T15:30:00.000Z",
"checkoutUrl": "https://store.example.com/checkout?cart=abc"
}
],
"total": 42,
"hasMore": true
}
Στατιστικά καλαθιών
Λήψη στατιστικών καλαθιών και εγκατάλειψης.
GET /carts/stats
Απόκριση:
{
"totalCarts": 1250,
"abandonedCarts": 312,
"recoveredCarts": 87,
"totalAbandonedValue": 45670.50,
"recoveryRate": 27.88
}
Ανάλυση RFM
Η ανάλυση RFM (Recency, Frequency, Monetary - πρόσφατη επαφή, συχνότητα, χρηματική αξία) τμηματοποιεί τους πελάτες βάσει της αγοραστικής τους συμπεριφοράς.
Λήψη δεδομένων RFM χρήστη
Λήψη βαθμολογιών RFM και τμήματος για έναν συγκεκριμένο χρήστη.
GET /rfm/user/:userId
Το :userId είναι το εσωτερικό αναγνωριστικό χρήστη ή το εξωτερικό αναγνωριστικό με το οποίο η εφαρμογή σας αναγνωρίζει το άτομο· ένα άγνωστο αναγνωριστικό επιστρέφει 404.
Απόκριση:
{
"totalOrders": 12,
"totalSpent": 849.50,
"averageOrderValue": 70.79,
"firstOrderDate": "2023-06-15T10:00:00.000Z",
"lastOrderDate": "2024-01-18T14:30:00.000Z",
"daysSinceLastOrder": 2,
"hasActiveCart": false,
"rfmRecency": 5,
"rfmFrequency": 4,
"rfmMonetary": 4,
"rfmScore": "544",
"rfmSegment": "champions"
}
Τα πεδία RFM είναι null για επαφή χωρίς μετρήσιμη παραγγελία (οι ακυρωμένες και οι επιστραφείσες παραγγελίες δεν μετρούν).
Λήψη κατανομής RFM
Λήψη της κατανομής πελατών στα τμήματα RFM.
GET /rfm/distribution
Απόκριση:
{
"champions": { "count": 150, "totalValue": 125000 },
"loyal": { "count": 320, "totalValue": 89000 },
"potential_loyalists": { "count": 180, "totalValue": 32000 },
"new_customers": { "count": 450, "totalValue": 28000 },
"at_risk": { "count": 95, "totalValue": 42000 },
"lost": { "count": 280, "totalValue": 15000 },
"scoring": {
"computedAt": "2026-09-02T02:00:00.000Z",
"method": "quantile",
"buyers": 1475
}
}
Οι βαθμίδες είναι πεμπτημόρια μέσα στο κατάστημα (method: "quantile"): καθένα από πρόσφατη αγορά, συχνότητα και καθαρή δαπάνη κατατάσσεται σε όλους τους αγοραστές του καταστήματος και χωρίζεται σε πέντε ίσες ομάδες, ώστε η κορυφαία βαθμίδα να σημαίνει το κορυφαίο πέμπτο των δικών σας πελατών, σε οποιοδήποτε νόμισμα. Κατάστημα με λιγότερους από 25 αγοραστές χρησιμοποιεί σταθερά όρια (method: "fixed"). Οι βαθμολογίες υπολογίζονται ξανά κάθε νύχτα και σε κάθε παραγγελία - το scoring.computedAt λέει πότε.
Τμήματα RFM
| Τμήμα | Περιγραφή | Τυπικές βαθμολογίες RFM |
|---|---|---|
| Champions | Οι καλύτεροι πελάτες: αγοράζουν συχνά, ξοδεύουν τα περισσότερα | 555, 554, 545 |
| Loyal | Σταθεροί πελάτες | 444, 443, 434 |
| Potential Loyalists | Πρόσφατοι με μέση συχνότητα | 433, 343, 333 |
| New Customers | Μόλις έκαναν την πρώτη τους αγορά | 511, 512, 411 |
| Promising | Πρόσφατοι αλλά με χαμηλή συχνότητα | 422, 322, 312 |
| Needs Attention | Μέσοι, με φθίνουσα αλληλεπίδραση | 332, 322, 233 |
| About to Sleep | Κάτω από τον μέσο όρο, σε κίνδυνο | 211, 212, 221 |
| At Risk | Ήταν πιστοί, δεν έχουν αγοράσει πρόσφατα | 144, 143, 244 |
| Can't Lose | Ήταν οι καλύτεροι πελάτες, τώρα ανενεργοί | 155, 154, 255 |
| Hibernating | Χαμηλή αλληλεπίδραση, ανενεργοί για καιρό | 122, 121, 112 |
| Lost | Χαμηλότερες βαθμολογίες, πιθανότατα χαμένοι | 111 |
Παρακολούθηση καταστήματος Shopify
Ενεργοποιεί (ή ανανεώνει) το pixel του Joryio στο συνδεδεμένο κατάστημα Shopify - συμβάντα καταστήματος και ταμείου - και γράφει τις ρυθμίσεις που διαβάζει το app embed του Joryio. Όταν το pixel ενεργοποιηθεί, το παλιό script παρακολούθησης του καταστήματος (καταστήματα που συνδέθηκαν πριν από τον Οκτώβριο του 2026) σταματά να στέλνει συμβάντα - το Joryio δεν το διαγράφει· το Shopify το αφαιρεί όταν απεγκατασταθεί η εφαρμογή και σταματά να το φορτώνει την 1η Μαρτίου 2027. Μπορεί να κληθεί ξανά με ασφάλεια. Απαιτεί integrations:write.
POST /api/integrations/shopify/storefront-tracking
Authorization: Bearer YOUR_API_KEY
{
"pixel": { "status": "active", "id": "gid://shopify/WebPixel/123", "error": null, "checkedAt": "2026-10-03T10:00:00.000Z" },
"missingScopes": [],
"legacyScriptTag": false,
"appEmbed": {
"configured": true,
"themeEditorUrl": "https://my-store.myshopify.com/admin/themes/current/editor?context=apps&activateAppId=<api-key>/joryio-embed"
}
}
pixel.status | Σημασία |
|---|---|
active | Το pixel είναι στο κατάστημα και στέλνει συμβάντα |
needs_scopes | Το κατάστημα δεν έχει εγκρίνει τα write_pixels και read_customer_events. Ξεκινήστε ξανά τη σύνδεση Shopify (ζητά από τον ιδιοκτήτη να τα εγκρίνει)· το missingScopes τα απαριθμεί |
error | Το Shopify απέρριψε το pixel· το pixel.error εξηγεί γιατί |
not_registered | Δεν έχει ρυθμιστεί ακόμη |
Το GET /api/integrations/shopify επιστρέφει το ίδιο αντικείμενο ως storefrontTracking. Δείτε Ενσωμάτωση Shopify.
Επιστρέφει επίσης το themeEmbed, τη γραμμή Αναδυόμενα μηνύματα στο κατάστημά σας: το activateUrl ανοίγει τον επεξεργαστή θέματος με το embed του Joryio ενεργό (ο ιδιοκτήτης πατά Αποθήκευση· null όταν ο διακομιστής δεν έχει ρυθμισμένη εφαρμογή Shopify), και το status είναι on όταν το SDK του καταστήματος έχει αναφερθεί τις τελευταίες 7 ημέρες, αλλιώς not_reported. Δείτε Ενεργοποίηση αναδυόμενων μηνυμάτων.
"themeEmbed": {
"activateUrl": "https://my-store.myshopify.com/admin/themes/current/editor?context=apps&activateAppId=<api-key>/joryio-embed",
"status": "not_reported"
}
Το installUrl (και όταν δεν υπάρχει συνδεδεμένο κατάστημα) είναι η διεύθυνση όπου το Εγκατάσταση του Joryio από το Shopify στέλνει έναν έμπορο που δεν έχει εγκαταστήσει ακόμη το Joryio: η σελίδα της εφαρμογής Joryio στο Shopify App Store ή ένας σύνδεσμος εγκατάστασης, ή null όταν ο διακομιστής δεν έχει ρυθμισμένη διεύθυνση (τότε ο πίνακας ελέγχου οδηγεί στα βήματα εγκατάστασης). Το Joryio δεν ζητά ποτέ τη διεύθυνση ενός καταστήματος - ένα κατάστημα εγκαθίσταται από το Shopify και συνδέεται. Δείτε Σύνδεση του καταστήματός σας.
Άνοιγμα της εφαρμογής από το Shopify
Όταν ένας έμπορος εγκαθιστά ή ανοίγει την εφαρμογή Joryio από το Shopify, το Shopify προσθέτει στη διεύθυνση της εφαρμογής υπογεγραμμένες παραμέτρους (shop, hmac, timestamp, host). Στείλτε τις αμετάβλητες· το Joryio ελέγχει την υπογραφή του Shopify και ότι ο σύνδεσμος δεν είναι παλαιότερος από μία ώρα, και επιστρέφει την κατάσταση του καταστήματος για τον τρέχοντα χώρο εργασίας. Δεν συνδέει ποτέ τίποτα. Απαιτεί integrations:read.
POST /api/integrations/shopify/app-launch
Authorization: Bearer YOUR_API_KEY
Content-Type: application/json
{ "query": { "shop": "my-store.myshopify.com", "host": "YWRtaW4uc2hvcGlmeS5jb20vc3RvcmUvbXktc3RvcmU", "timestamp": "1760000000", "hmac": "<from Shopify>" } }
{ "status": "not_connected", "shopDomain": "my-store.myshopify.com" }
status | Σημασία |
|---|---|
connected_here | Το κατάστημα είναι συνδεδεμένο σε αυτόν τον χώρο εργασίας |
connected_elsewhere | Συνδεδεμένο σε άλλον χώρο εργασίας του οργανισμού· το workspaceId τον ορίζει |
not_connected | Δεν είναι συνδεδεμένο στον οργανισμό - ξεκινήστε τη σύνδεση με POST /api/integrations/shopify/oauth/initiate |
Παράμετροι χωρίς υπογραφή, αλλοιωμένες ή παλαιότερες από μία ώρα παίρνουν 400. Δείτε Ενσωμάτωση Shopify.
Ρύθμιση επανεγγραφής από το ταμείο του καταστήματος
Ενεργοποιεί ή απενεργοποιεί τη ρύθμιση Οι επιλογές συγκατάθεσης στο ταμείο επανεγγράφουν όσους απεγγράφηκαν της σύνδεσης καταστήματος. Το :platform είναι shopify, woocommerce, magento ή prestashop. Απενεργοποιημένη από προεπιλογή. Όταν είναι ενεργή, μια συγκατάθεση στο ταμείο ή στην εγγραφή πελάτη από αυτό το κατάστημα - και σε ταμείο επισκέπτη - με ημερομηνία μετά την τελευταία απεγγραφή της επαφής την επανεγγράφει. Δεν παρακάμπτει ποτέ καταγγελία spam, σκληρή επιστροφή, STOP σε SMS (μόνο επιβεβαίωση διπλής συγκατάθεσης), αποκλεισμό σε επίπεδο οργανισμού ή απεγγραφή άλλης επαφής. Κάθε αλλαγή καταγράφεται στο αρχείο ελέγχου. Απαιτεί settings:write.
PUT /api/integrations/shopify/consent-settings
Authorization: Bearer YOUR_API_KEY
Content-Type: application/json
{ "checkoutResubscribe": true }
{ "checkoutResubscribe": true }
Το GET /api/integrations/<platform> επιστρέφει την τρέχουσα τιμή ως checkoutResubscribe. Δείτε Συγκατάθεση μάρκετινγκ από καταστήματα.
Δικλίδες για τις επιλογές συγκατάθεσης στο ταμείο (WooCommerce, Magento, PrestaShop)
Η ίδια διαδρομή δέχεται τις δικλίδες του Record consent immediately μιας σύνδεσης WooCommerce ή Magento, και τις ίδιες δικλίδες για το κουτί newsletter του checkout του PrestaShop, που φτάνει πάντα στο Joryio πριν από την παραγγελία (μονάδα 1.2.8 ή νεότερη - βλ. Πότε μετράει ένα τικ). Το :platform είναι woocommerce, magento ή prestashop· το Shopify λαμβάνει 400. Μια επιλογή στο ταμείο που φτάνει πριν από παραγγελία μετράει αμέσως μόνο για γνωστό αγοραστή ή συνδρομητή· όλοι οι άλλοι μένουν σε εκκρεμότητα μέχρι την παραγγελία τους ή τον σύνδεσμο επιβεβαίωσης - βλ. Πότε μετράει μια επιλογή. Το checkoutConsentConfirmEmail (προεπιλογή false) στέλνει σε έναν τέτοιο επισκέπτη έναν σύνδεσμο επιβεβαίωσης με email. Το checkoutConsentTickLimit (1-100, προεπιλογή 3) είναι πόσες επιλογές γίνονται δεκτές ανά διεύθυνση IP αγοραστή, ανά ταμείο και ανά διεύθυνση email την ώρα· μια επιλογή πάνω από αυτό αγνοείται. Στείλτε το ένα ή και τα δύο, μόνα τους ή μαζί με το checkoutResubscribe. Κάθε αλλαγή καταγράφεται στο αρχείο ελέγχου. Απαιτεί settings:write.
PUT /api/integrations/magento/consent-settings
Authorization: Bearer YOUR_API_KEY
Content-Type: application/json
{ "checkoutConsentConfirmEmail": true, "checkoutConsentTickLimit": 5 }
{ "checkoutConsentConfirmEmail": true, "checkoutConsentTickLimit": 5 }
Τα GET /api/integrations/woocommerce, GET /api/integrations/magento και GET /api/integrations/prestashop επιστρέφουν και τις δύο τιμές.
Το newShopperOptIns - Συγκαταθέσεις από νέους αγοραστές (που δεν έχουν αγοράσει ακόμη) - είναι hold (προεπιλογή) ή immediate. Ισχύει για κάθε συγκατάθεση που φτάνει χωρίς παραγγελία από κάποιον που το Joryio δεν γνωρίζει ακόμη: μια επιλογή στο checkout που στάλθηκε πριν από την παραγγελία, και μια συγκατάθεση στην εγγραφή, στη σελίδα λογαριασμού, στο newsletter ή από τον συγχρονισμό πελατών. Το hold την κρατά σε εκκρεμότητα μέχρι την παραγγελία ή τον σύνδεσμο επιβεβαίωσης· το immediate τη μετράει αμέσως (λιγότερο αυστηρό - οποιοσδήποτε επισκέπτης μπορεί να εισαγάγει οποιοδήποτε email). Οι γνωστοί αγοραστές και οι υπάρχοντες συνδρομητές μετράνε αμέσως σε κάθε περίπτωση, μια απεγγραφή ισχύει πάντα αμέσως και το checkoutConsentTickLimit παραμένει σε ισχύ. Ίδια διαδρομή και πλατφόρμες, μόνο του ή μαζί με τα άλλα πεδία· κάθε αλλαγή καταγράφεται στο αρχείο ελέγχου· απαιτεί settings:write. Το GET /api/integrations/<platform> το επιστρέφει ως newShopperOptIns.
PUT /api/integrations/woocommerce/consent-settings
Authorization: Bearer YOUR_API_KEY
Content-Type: application/json
{ "newShopperOptIns": "immediate" }
{ "newShopperOptIns": "immediate" }
Τα GET /api/integrations/woocommerce και GET /api/integrations/magento επιστρέφουν επίσης storeCheckoutOptIn: τις ρυθμίσεις συγκατάθεσης στο ταμείο του ίδιου του πρόσθετου όπως τις ανέφερε τελευταία φορά (πρόσθετο WooCommerce 1.6.16 ή νεότερο, επέκταση Magento 1.4.17 ή νεότερη). Είναι μόνο για ανάγνωση - ορίζονται στο κατάστημα, ποτέ μέσω αυτού του API - και είναι null μέχρι να τις αναφέρει το πρόσθετο. Το recordMode είναι order (μόνο όταν γίνεται η παραγγελία) ή immediate (καταγραφή συγκατάθεσης αμέσως).
{ "storeCheckoutOptIn": { "pluginVersion": "1.6.16", "checkoutBox": true, "preTicked": false, "recordMode": "order", "reportedAt": "2026-10-27T10:00:00.000Z" } }
Ταυτότητα επισκεπτών: αναγνώριση επισκεπτών από το email που πληκτρολογούν
Recognise visitors by the email they type - δείτε WooCommerce και Shopify. Ενεργό από προεπιλογή: ένα email που πληκτρολογείται στο ταμείο ή σε φόρμα αναγνωρίζει τον browser του επισκέπτη ως την επαφή με αυτό το email. Ανενεργό (αυστηρή ταυτότητα): ένα πληκτρολογημένο email δεν αναγνωρίζει ποτέ τον browser· καλάθια, παραγγελίες και υποβολές φορμών πηγαίνουν και πάλι στην επαφή του email.
Το GET /api/integrations/<platform> επιστρέφει visitorIdentity: identifyByTypedEmail, source (default - τίποτα δεν έχει αναφερθεί ή οριστεί ακόμη, άρα ενεργό· plugin - αναφέρθηκε από το πρόσθετο WooCommerce 1.6.22 ή νεότερο, την επέκταση Magento 1.4.21 ή νεότερη ή το module PrestaShop 1.2.10 ή νεότερο· joryio - ορίστηκε στο Joryio), pluginVersion και reportedAt. Για WooCommerce, Magento και PrestaShop η ρύθμιση βρίσκεται στο πρόσθετο του καταστήματος και εδώ είναι μόνο για ανάγνωση. Για Shopify, ορίστε την με την παρακάτω διαδρομή· οι άλλες πλατφόρμες παίρνουν 400. Κάθε αλλαγή καταγράφεται στο αρχείο ελέγχου. Απαιτεί settings:write.
PUT /api/integrations/shopify/visitor-identity
Authorization: Bearer YOUR_API_KEY
Content-Type: application/json
{ "identifyByTypedEmail": false }
{ "visitorIdentity": { "identifyByTypedEmail": false, "source": "joryio", "pluginVersion": null, "reportedAt": "2026-11-01T10:00:00.000Z" } }
Σύνδεση PrestaShop (πρώιμη πρόσβαση)
Ανάγνωση και διαχείριση της σύνδεσης PrestaShop του χώρου εργασίας (ένα κατάστημα PrestaShop ανά σύνδεση· δείτε Ενσωμάτωση PrestaShop). Το GET επιστρέφει { "connected": false, "platform": "prestashop" } όταν δεν υπάρχει σύνδεση. Η διαδρομή api-key επιστρέφει το κλειδί jry_ps_ που επικολλάτε στο module (απαιτεί integrations:write, όπως και τα settings, sync και DELETE). Το GET επιστρέφει επίσης workspaceId, prestashopVersion και moduleVersion. Το sync δέχεται type: full (προεπιλογή), delta (προϊόντα, πελάτες και παραγγελίες που άλλαξαν από τον τελευταίο επιτυχή συγχρονισμό), products, customers, orders ή carts (ανοιχτά καλάθια των τελευταίων 24 ωρών), και επιστρέφει αμέσως ενώ ο συγχρονισμός εκτελείται. Το DELETE αποσυνδέει το κατάστημα και ανακαλεί το κλειδί.
GET /api/integrations/prestashop
Authorization: Bearer YOUR_API_KEY
{
"connected": true,
"status": "connected",
"platform": "prestashop",
"storeName": "My Shop",
"storeUrl": "https://shop.example.com",
"shopId": 1,
"workspaceId": "6f1c2d3e-...",
"prestashopVersion": "8.2.1",
"moduleVersion": "1.0.0",
"syncSettings": { "syncProducts": true, "syncOrders": true, "syncCustomers": true, "syncCarts": true, "historicalDays": 90 },
"checkoutResubscribe": false,
"syncStats": { "productCount": 120, "orderCount": 860, "customerCount": 540 },
"lastSyncAt": "2026-10-21T10:00:00.000Z",
"connectedAt": "2026-10-21T09:58:00.000Z"
}
Το connectedAt είναι η τελευταία φορά που συνδέθηκε το κατάστημα (κάθε επανασύνδεση το μετακινεί)· το επιστρέφουν και τα GET /api/integrations/shopify, /woocommerce και /magento. Για σύνδεση πριν καταγραφεί, επιστρέφεται η ώρα δημιουργίας της εγγραφής.
GET /api/integrations/prestashop/api-key
Authorization: Bearer YOUR_API_KEY
{ "apiKey": "jry_ps_...", "isNew": false }
PUT /api/integrations/prestashop/settings
Authorization: Bearer YOUR_API_KEY
Content-Type: application/json
{ "syncCarts": true, "historicalDays": 90 }
POST /api/integrations/prestashop/sync
Authorization: Bearer YOUR_API_KEY
Content-Type: application/json
{ "type": "full" }
DELETE /api/integrations/prestashop
Authorization: Bearer YOUR_API_KEY
Webhooks
Τα συμβάντα e-commerce εκπέμπουν webhooks που μπορούν να ενεργοποιήσουν ροές canvas:
| Συμβάν | Περιγραφή |
|---|---|
ecommerce.order.created | Νέα παραγγελία καταχωρήθηκε |
ecommerce.order.fulfilled | Η παραγγελία απεστάλη |
ecommerce.order.cancelled | Η παραγγελία ακυρώθηκε |
ecommerce.order.refunded | Έγινε επιστροφή χρημάτων παραγγελίας |
ecommerce.order.status_changed | Η κατάσταση της παραγγελίας άλλαξε |
ecommerce.cart.abandoned | Το καλάθι επισημάνθηκε ως εγκαταλελειμμένο |
ecommerce.cart.recovered | Το εγκαταλελειμμένο καλάθι ανακτήθηκε |
ecommerce.cart.updated | Το περιεχόμενο του καλαθιού άλλαξε |
Αναζήτηση με τα δικά σας ID
Λήψη προϊόντος με το δικό σας ID προϊόντος
Ανακτήστε ένα προϊόν χρησιμοποιώντας το δικό σας αναγνωριστικό προϊόντος.
GET /catalog/products/by-product-id/:productId
Ένα αναγνωριστικό χωρίς αντίστοιχη εγγραφή απαντά 404, όχι 200 με κενό σώμα.
Παράδειγμα:
curl "https://api-eu1.joryio.com/api/catalog/products/by-product-id/SKU-12345" \
-H "Authorization: Bearer $TOKEN"
Λήψη παραγγελίας με το δικό σας ID παραγγελίας
Ανακτήστε μια παραγγελία χρησιμοποιώντας το δικό σας αναγνωριστικό παραγγελίας.
GET /orders/by-order-id/:orderId
Ένα αναγνωριστικό χωρίς αντίστοιχη εγγραφή απαντά 404, όχι 200 με κενό σώμα.
Παράδειγμα:
curl "https://api-eu1.joryio.com/api/orders/by-order-id/ORD-2024-001" \
-H "Authorization: Bearer $TOKEN"
Παραγγελίες, καλάθια και RFM μέσω API
Μαζική εισαγωγή/ενημέρωση παραγγελιών
POST /orders/upsert
Ο βασικός τρόπος με τον οποίο ένα κατάστημα εκτός Shopify, WooCommerce ή Magento στέλνει τις παραγγελίες του. Ιδεμποτεντικό ως προς το orderId: η επαναποστολή της ίδιας παραγγελίας την ενημερώνει αντί να δημιουργήσει διπλότυπο, οπότε μια επανάληψη μετά από σφάλμα δικτύου είναι ασφαλής.
Στείλτε κάθε παραγγελία στο νόμισμα που πληρώθηκε, χωρίς καμία μετατροπή: το Joryio μετατρέπει το total στο νόμισμα αναφορών του χώρου εργασίας με την ισοτιμία της Ευρωπαϊκής Κεντρικής Τράπεζας της ημερομηνίας placedAt της παραγγελίας, και οι αναφορές αθροίζουν το μετατρεπόμενο ποσό.
Σώμα αιτήματος:
{
"orders": [
{
"orderId": "1001",
"userId": "user_123",
"total": 89.90,
"currency": "EUR",
"placedAt": "2026-08-27T10:15:00Z",
"status": "completed",
"items": [
{ "productId": "prod_abc123", "quantity": 2, "price": 29.95 }
]
}
]
}
Απόκριση:
{ "upserted": 1, "created": 1, "updated": 0 }
Τάση εσόδων
GET /orders/revenue-trend?days=30&granularity=day
Καθαρά έσοδα στον χρόνο (χωρίς επιστροφές και ακυρώσεις). Το granularity είναι day, week ή month.
Απόκριση:
{
"currency": "EUR",
"points": [
{ "date": "2026-08-25", "revenue": 1240.50, "orders": 14 },
{ "date": "2026-08-26", "revenue": 980.00, "orders": 11 }
]
}
Κύκλος ζωής καλαθιού
POST /carts/remove
POST /carts/clear
POST /carts/mark-abandoned
POST /carts/recovered
Τέσσερις ενέργειες που οδηγούν τα ταξίδια ανάκτησης καλαθιού. Τα clear και recovered τερματίζουν και τα δύο το καλάθι και ΔΕΝ είναι εναλλάξιμα: το recovered λέει ότι η ανάκτηση πέτυχε και της αποδίδει την παραγγελία, ενώ το clear λέει απλώς ότι το καλάθι έπαψε να υπάρχει. Το clear μετά από αγορά σβήνει σιωπηλά την απόδειξη ότι το ταξίδι ανάκτησης απέδωσε.
{ "userId": "user_123", "orderId": "1001" }
Λίστα τμημάτων RFM
GET /rfm/segments
Τα τμήματα RFM του χώρου εργασίας με τα τρέχοντα μεγέθη τους, ώστε μια ενσωμάτωση να τα στοχεύει χωρίς να ξαναϋπολογίζει τη βαθμολόγηση.
Απόκριση:
{
"segments": [
{ "segment": "champions", "users": 412, "avgRecencyDays": 8, "avgOrders": 6.2 },
{ "segment": "at_risk", "users": 1180, "avgRecencyDays": 96, "avgOrders": 2.1 }
],
"computedAt": "2026-08-27T02:10:00Z"
}
Αποκρίσεις σφαλμάτων
{
"statusCode": 404,
"message": "Product SKU-12345 not found",
"error": "Not Found"
}
| Κωδικός κατάστασης | Περιγραφή |
|---|---|
| 400 | Μη έγκυρο σώμα αιτήματος |
| 401 | Απαιτείται έλεγχος ταυτότητας |
| 403 | Ανεπαρκή δικαιώματα |
| 404 | Ο πόρος δεν βρέθηκε |
| 409 | Σύγκρουση (διπλότυπο εξωτερικό ID) |
| 500 | Εσωτερικό σφάλμα διακομιστή |