Μετάβαση στο κύριο περιεχόμενο

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

Σώμα αιτήματος:

ΠεδίοΤύποςΑπαιτείταιΠεριγραφή
productIdstringΝαιΤο δικό σας μοναδικό αναγνωριστικό προϊόντος (SKU, ID προϊόντος)
namestringΝαιΌνομα προϊόντος
pricenumberΝαιΤιμή προϊόντος
descriptionstringΌχιΠεριγραφή προϊόντος
compareAtPricenumberΌχιΑρχική τιμή (για εκπτώσεις)
currencystringΌχιΚωδικός νομίσματος (προεπιλογή: USD)
categoriesstring[]ΌχιΚατηγορίες προϊόντος
tagsstring[]ΌχιΕτικέτες προϊόντος
brandstringΌχιΌνομα επωνυμίας
imageUrlstringΌχιURL κύριας εικόνας προϊόντος
urlstringΌχιURL σελίδας προϊόντος
inStockbooleanΌχιΔιαθεσιμότητα αποθέματος (προεπιλογή: true)
skustringΌχιΜονάδα διατήρησης αποθέματος (SKU)
variantsobject[]ΌχιΠαραλλαγές προϊόντος
customFieldsobjectΌχιΠροσαρμοσμένα γνωρίσματα

Παράδειγμα αιτήματος:

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:

ΠαράμετροςΤύποςΠεριγραφή
searchstringΑναζήτηση βάσει ονόματος, περιγραφής ή SKU
categoriesstring[]Φιλτράρισμα βάσει κατηγοριών
tagsstring[]Φιλτράρισμα βάσει ετικετών
brandstringΦιλτράρισμα βάσει επωνυμίας
inStockbooleanΦιλτράρισμα βάσει κατάστασης αποθέματος
minPricenumberΕλάχιστη τιμή
maxPricenumberΜέγιστη τιμή
limitnumberΑποτελέσματα ανά σελίδα (προεπιλογή: 50)
offsetnumberΜετατόπιση σελιδοποίησης
sortBystringΠεδίο ταξινόμησης: name, price, createdAt, updatedAt
sortOrderstringasc ή 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

Σώμα αιτήματος:

ΠεδίοΤύποςΑπαιτείταιΠεριγραφή
orderIdstringΝαιΤο δικό σας ID παραγγελίας (αριθμός παραγγελίας από την πλατφόρμα σας)
userIdstringΈνα από τα δύοΤο δικό σας ID χρήστη-πελάτη
joryioUserIdstringΈνα από τα δύοΤο εσωτερικό ID χρήστη του Joryio (εναλλακτικό του userId)
totalnumberΝαιΣύνολο παραγγελίας
itemsobject[]ΝαιΓραμμές παραγγελίας
statusstringΌχιΚατάσταση παραγγελίας (προεπιλογή: pending)
paymentStatusstringΌχιpaid ή unpaid: αν η παραγγελία έχει πληρωθεί. Μια παραγγελία με αντικαταβολή ή τραπεζική μεταφορά είναι processing και unpaid μέχρι να φτάσουν τα χρήματα, και εμφανίζεται στη σελίδα Παραγγελίες ως Αναμένεται πληρωμή αντί για Πληρωμένη. Χωρίς αυτό, μια παραγγελία σε επεξεργασία / απεσταλμένη / παραδομένη μετράει ως πληρωμένη (μια υπάρχουσα παραγγελία κρατά την τιμή της). Τα έσοδα δεν εξαρτώνται από αυτό. Δείτε Πληρωμένη ή αναμένεται πληρωμή.
currencystringΌχιΚωδικός νομίσματος
subtotalnumberΌχιΜερικό σύνολο πριν τις εκπτώσεις
discountnumberΌχιΠοσό έκπτωσης
shippingnumberΌχιΚόστος αποστολής
taxnumberΌχιΠοσό φόρου
totalRefundednumberΌχιΠοσό που επιστράφηκε μέχρι τώρα, στο νόμισμα της παραγγελίας (προεπιλογή 0). Για μερική επιστροφή στείλτε το μερικό ποσό με status: partiallyRefunded· για πλήρη επιστροφή ορίστε το στο total με status: refunded. Οι επιστροφές αφαιρούνται από τα αποδιδόμενα έσοδα.
refundsobject[]ΌχιΌλες οι επιστροφές μέχρι τώρα (έως 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. Δείτε Συμβάντα επιστροφής και ακύρωσης.
couponCodestringΌχιΕφαρμοσμένο κουπόνι
couponsobject[]ΌχιΚάθε κωδικός κουπονιού που χρησιμοποιήθηκε στην παραγγελία (έως 50): { "code": "SUMMER10", "amount": 10.0, "type": "fixed_amount" }. Τα amount (η έκπτωση του κωδικού) και type είναι προαιρετικά. Στο upsert, το coupons αντικαθιστά τους αποθηκευμένους κωδικούς (το [] τους διαγράφει)· παραλείψτε το για να τους διατηρήσετε. Όταν στέλνονται και τα δύο, υπερισχύει το coupons έναντι του couponCode
shippingAddressobjectΌχιΔιεύθυνση αποστολής
campaignIdstringΌχιΚαμπάνια απόδοσης (attribution)
canvasIdstringΌχιCanvas απόδοσης (attribution)
sourcestringΌχιΠηγή παραγγελίας (email, sms, direct)
utmSourcestringΌχιUTM source
utmMediumstringΌχιUTM medium
utmCampaignstringΌχιUTM campaign
salesChannelstringΌχιΠού έγινε η παραγγελία: online, pos, app, phone, marketplace ή other (πεζά ή κεφαλαία). Οποιαδήποτε άλλη τιμή επιστρέφει 400. Αν λείπει, μια νέα παραγγελία είναι online και μια υπάρχουσα κρατά το κανάλι της. Δείτε Κατάστημα και κανάλι πωλήσεων
storeIdstringΌχιΤο δικό σας ID για το κατάστημα στο οποίο ανήκει η παραγγελία (φυσικό κατάστημα, υποκατάστημα, δεύτερος ιστότοπος), έως 100 χαρακτήρες. Το φίλτρο Καταστήματος στη σελίδα Παραγγελιών και η συνθήκη τμήματος "Αγόρασε στο κατάστημα" το συγκρίνουν
storeNamestringΌχιΤο εμφανιζόμενο όνομα του καταστήματος, έως 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, χειροκίνητη παραγγελία, πρόχειρο
marketplaceMarketplace τρίτου
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:

ΠαράμετροςΤύποςΠεριγραφή
minValuenumberΕλάχιστη αξία καλαθιού
abandonedMinutesAgonumberΜέγιστα λεπτά από την εγκατάλειψη
limitnumberΑποτελέσματα ανά σελίδα
offsetnumberΜετατόπιση σελιδοποίησης

Απόκριση:

{
"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",
"email": "[email protected]",
"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Εσωτερικό σφάλμα διακομιστή