Events API
Καταγράψτε συμβάντα και συμπεριφορά χρηστών προγραμματιστικά μέσω REST API.
Όλα τα endpoints αυτής της σελίδας είναι σχετικά ως προς το βασικό URL: https://api-eu1.joryio.com/api - δείτε Επισκόπηση API.
Έλεγχος ταυτότητας
Όλα τα αιτήματα απαιτούν έλεγχο ταυτότητας με κλειδί API:
Authorization: Bearer jry_live_your_api_key_here
Content-Type: application/json
Το συμβάν αγοράς
Η αναφορά εσόδων, η απόδοση, το CLV και τα προβλεπτικά μοντέλα διαβάζουν όλα ένα συμβάν. Αν στέλνετε αγορές με διαφορετικό όνομα, δεν προσμετρώνται - πουθενά.
| Όνομα συμβάντος | Order Completed |
| Απαιτούμενες ιδιότητες | total, currency |
| Συνιστώμενες | total_base, base_currency, orderId |
{
"eventName": "Order Completed",
"userId": "user_123",
"properties": {
"total": 149.90,
"currency": "EUR",
"total_base": 162.35,
"base_currency": "USD",
"orderId": "1024"
}
}
Γιατί μόνο ένα όνομα
Άλλες πλατφόρμες χρησιμοποιούν άλλα ονόματα - Placed Order,
purchase (GA4). Σκόπιμα δεν τα δεχόμαστε, επειδή η αποδοχή πολλών
ονομάτων σημαίνει πρόσθεσή τους: ένα κατάστημα που τρέχει ετικέτα GA4 μαζί με
τον σύνδεσμό μας θα στείλει μία πώληση με δύο ονόματα και θα δει τα έσοδά του
διπλασιασμένα. Ένα ποσό εσόδων που είναι σιωπηλά 2x εντοπίζεται πολύ
δυσκολότερα από ένα που είναι προφανώς 0.
Έτσι ο κανόνας είναι ένα και μόνο δημοσιευμένο συμβόλαιο. Αν οι παραγγελίες σας δεν εμφανίζονται, η αιτία φαίνεται αμέσως κατά την ενσωμάτωση - και διορθώνεται - αντί να είναι σιωπηλά λανθασμένη για μήνες.
Σχετικά με τα ποσά
Τα total και total_base είναι δύο διαφορετικά μεγέθη, όχι εναλλακτικές:
total- τι πλήρωσε ο πελάτης, στο νόμισμα στο οποίο πλήρωσε (presentment).total_base+base_currency- η ίδια παραγγελία μετατραπείσα στο νόμισμα αναφοράς σας. Στείλτε τα αν πουλάτε σε περισσότερα από ένα νομίσματα, ώστε τα σύνολα μεταξύ νομισμάτων να αθροίζονται σωστά.
Στείλτε μόνο το total αν έχετε ένα νόμισμα. Το orderId είναι προαιρετικό
αλλά συνιστάται: απαλείφει ως διπλότυπη μια παραγγελία που φτάνει
περισσότερες από μία φορές (μια επανάληψη, μια ανανέωση σελίδας στο ταμείο).
Αν ήδη στέλνετε άλλο όνομα
Τα ιστορικά σας συμβάντα διατηρούνται, αλλά δεν αντιμετωπίζονται ως
παραγγελίες. Μεταφέρετε τις νέες παραγγελίες στο Order Completed και η
αναφορά εσόδων ξεκινά από εκείνο το σημείο. Δεν ξαναγράφουμε παλιά συμβάντα,
ώστε τίποτα να μην επανερμηνεύεται σιωπηλά χωρίς να το ξέρετε.
Κωδικοί κουπονιών στο συμβάν
Όταν η παραγγελία προέρχεται από συνδεδεμένο κατάστημα ή το Orders API, το Order Completed περιέχει επίσης:
| Ιδιότητα | Τύπος | Περιγραφή |
|---|---|---|
coupon_codes | string[] | Κάθε κωδικός κουπονιού της παραγγελίας, με πεζά (["summer10", "vip"])· [] όταν δεν υπάρχει κανένας |
coupon_count | number | Πόσους κωδικούς χρησιμοποίησε η παραγγελία |
Ένα ταξίδι μπορεί να ξεκινά με Order Completed όπου το coupon_codes περιέχει summer10 - η αντιστοίχιση αγνοεί πεζά-κεφαλαία και ελέγχει κάθε κωδικό.
Κατάστημα και κανάλι πωλήσεων στο συμβάν
Τα Order Completed, Order Refunded και Order Cancelled φέρουν πού πουλήθηκε η παραγγελία και το κατάστημά της:
| Ιδιότητα | Τύπος | Περιγραφή |
|---|---|---|
sales_channel | string | online, pos, app, phone, marketplace ή other - υπάρχει πάντα |
store_id | string | Το κατάστημα στο οποίο ανήκει η παραγγελία (το ID ενός συνδεδεμένου καταστήματος ή το storeId που έστειλε η παραγγελία σας μέσω API) - μόνο όταν υπάρχει |
Μια εφαρμογή μπορεί να τα στείλει στο δικό της Order Completed: sales_channel (γίνεται δεκτό και ως salesChannel· μια τιμή εκτός λίστας αποθηκεύεται ως other), store_id και store_name. Χωρίς sales_channel, μια παραγγελία από εφαρμογή iOS ή Android είναι app και μία από ιστότοπο είναι online. Ένα ταξίδι μπορεί να ξεκινά με Order Completed όπου sales_channel είναι pos. Δείτε Κατάστημα και κανάλι πωλήσεων.
Αποστολή συμβάντων
Τα συμβάντα εισάγονται μέσω του POST /users/track, το οποίο δέχεται attributes, συμβάντα και αγορές σε μία κλήση.
curl -X POST https://api-eu1.joryio.com/api/users/track \
-H "Authorization: Bearer jry_live_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"events": {
"externalId": "user_123",
"name": "Product Viewed",
"properties": { "productId": "SKU-456", "price": 49.99 }
}
}'
Το events δέχεται ένα μεμονωμένο αντικείμενο ή έναν πίνακα έως 500 στοιχείων. Δείτε Track για την πλήρη αναφορά πεδίων, τους κανόνες ταυτότητας και τη μορφή της απόκρισης.
Order Completed δεν αποστέλλεται ως συμβάνΕκπέμπεται αυτόματα από μια αγορά. Στείλτε τις αγορές στον πίνακα purchases αντ' αυτού - δείτε Το συμβάν αγοράς παραπάνω για το γιατί η χειροκίνητη αποστολή του είτε καταγράφει έσοδα χωρίς παραγγελία από πίσω, είτε μετρά την πώληση δύο φορές.
Ερώτημα συμβάντων
Ανακτήστε συμβάντα με φιλτράρισμα και σελιδοποίηση. Δεν υπάρχει endpoint ανάκτησης βάσει ID συμβάντος - φιλτράρετε αυτό το ερώτημα αντ' αυτού.
Endpoint
GET /events/query
Παράμετροι query
| Παράμετρος | Τύπος | Προεπιλογή | Περιγραφή |
|---|---|---|---|
userId | string | - | Φιλτράρισμα βάσει ID χρήστη |
eventName | string | - | Φιλτράρισμα βάσει ονόματος συμβάντος |
startDate | string | - | Φιλτράρισμα συμβάντων μετά από αυτή την ημερομηνία (ISO 8601) |
endDate | string | - | Φιλτράρισμα συμβάντων πριν από αυτή την ημερομηνία (ISO 8601) |
limit | number | 100 | Αποτελέσματα ανά σελίδα (μέγιστο 1000) |
offset | number | 0 | Πλήθος συμβάντων που παραλείπονται |
Παράδειγμα αιτήματος
# Get all "Order Completed" events in January 2024
curl -X GET "https://api-eu1.joryio.com/api/events/query?eventName=Order+Completed&startDate=2024-01-01T00:00:00Z&endDate=2024-02-01T00:00:00Z&limit=100" \
-H "Authorization: Bearer jry_live_your_api_key"
Απόκριση
Ένας σκέτος πίνακας JSON, με τα νεότερα πρώτα. Τα πεδία των συμβάντων χρησιμοποιούν snake_case (προέρχονται από το analytics store):
[
{
"event_id": "9b2f6c1e-4a8d-4f0b-9c3d-2e1f5a6b7c8d",
"user_id": "665f1e2a9b3c4d5e6f7a8b9c",
"anonymous_id": "",
"event_name": "Order Completed",
"properties": {
"orderId": "order_456",
"total": 99.99
},
"timestamp": "2024-01-20 14:30:00",
"session_id": "",
"device_id": ""
},
{
"event_id": "1c3e5a7b-9d2f-4b6c-8e0a-3f5d7b9c1e2a",
"user_id": "665f1e2a9b3c4d5e6f7a8b9d",
"anonymous_id": "",
"event_name": "Order Completed",
"properties": {
"orderId": "order_789",
"total": 149.99
},
"timestamp": "2024-01-19 10:15:00",
"session_id": "",
"device_id": ""
}
]
Συγκεντρωτικά συμβάντων
Λήψη συγκεντρωτικών στατιστικών συμβάντων με ομαδοποίηση και μετρικές.
Endpoint
POST /events/aggregate
Σώμα αιτήματος
| Πεδίο | Τύπος | Απαιτείται | Περιγραφή |
|---|---|---|---|
eventName | string | Ναι | Όνομα του συμβάντος προς συγκέντρωση |
startDate | string | Όχι | Ημερομηνία έναρξης (ISO 8601) |
endDate | string | Όχι | Ημερομηνία λήξης (ISO 8601) |
groupBy | string | Όχι | Χρονική ομαδοποίηση: hour, day, week, month (προεπιλογή: day) |
metrics | array | Όχι | Μετρικές προς υπολογισμό: count, sum, avg, min, max (προεπιλογή: ['count']) |
sumField | string | Υπό συνθήκη | Όνομα του κλειδιού στο properties προς άθροιση/συγκέντρωση (π.χ. total). Απαιτείται όταν το metrics περιλαμβάνει sum, min ή max |
avgField | string | Υπό συνθήκη | Όνομα του κλειδιού στο properties για μέσο όρο. Απαιτείται όταν το metrics περιλαμβάνει avg |
Ένα άγνωστο όνομα μετρικής, ή μια μετρική της οποίας λείπει το πεδίο (sum χωρίς sumField), επιστρέφει 400. Και τα δύο επέστρεφαν παλιότερα 200 με τη μετρική απλώς απούσα από το αποτέλεσμα - κάτι που δεν ξεχωρίζει από ένα πραγματικό μηδέν.
| eventProperties | object | Όχι | Φιλτράρισμα βάσει ιδιοτήτων συμβάντος |
Παράδειγμα αιτήματος
curl -X POST https://api-eu1.joryio.com/api/events/aggregate \
-H "Authorization: Bearer jry_live_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"eventName": "Order Completed",
"startDate": "2024-01-01T00:00:00Z",
"endDate": "2024-02-01T00:00:00Z",
"groupBy": "day",
"metrics": ["count", "sum"],
"sumField": "total"
}'
Απόκριση
{
"success": true,
"data": {
"eventName": "Order Completed",
"groupBy": "day",
"metrics": ["count", "sum"],
"results": [
{
"period": "2024-01-01T00:00:00Z",
"count": 45,
"sum_value": 4567.89
},
{
"period": "2024-01-02T00:00:00Z",
"count": 52,
"sum_value": 5123.45
},
{
"period": "2024-01-03T00:00:00Z",
"count": 38,
"sum_value": 3890.12
}
],
"total": 3
}
}
Υποστηριζόμενες μετρικές
- count: Συνολικό πλήθος συμβάντων
- sum: Άθροισμα των τιμών του καθορισμένου πεδίου
- avg: Μέσος όρος των τιμών του καθορισμένου πεδίου
- min: Ελάχιστη τιμή του καθορισμένου πεδίου
- max: Μέγιστη τιμή του καθορισμένου πεδίου
Παράδειγμα: Ανάλυση εσόδων
# Get daily revenue from purchases
curl -X POST https://api-eu1.joryio.com/api/events/aggregate \
-H "Authorization: Bearer jry_live_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"eventName": "Order Completed",
"startDate": "2024-01-01T00:00:00Z",
"endDate": "2024-01-31T00:00:00Z",
"groupBy": "day",
"metrics": ["count", "sum", "avg"],
"sumField": "total"
}'
Παράδειγμα: Χρήση λειτουργίας ανά ώρα
# Track feature usage patterns by hour
curl -X POST https://api-eu1.joryio.com/api/events/aggregate \
-H "Authorization: Bearer jry_live_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"eventName": "Feature Used",
"startDate": "2024-01-20T00:00:00Z",
"endDate": "2024-01-21T00:00:00Z",
"groupBy": "hour",
"metrics": ["count"]
}'
Ανακάλυψη όσων στέλνει ένας χώρος εργασίας
Πριν χτίσετε πάνω στα συμβάντα ενός χώρου εργασίας, ρωτήστε τον τι πραγματικά λαμβάνει. Αυτές οι τέσσερις διαδρομές είναι ο τρόπος με τον οποίο μια ενσωμάτωση το μαθαίνει αντί να το μαντεύει.
Λίστα ονομάτων συμβάντων
GET /events/names
Κάθε όνομα συμβάντος που εμφανίστηκε σε αυτόν τον χώρο εργασίας, ως γυμνός πίνακας JSON ταξινομημένος αλφαβητικά. Αυτό είναι το πραγματικό λεξιλόγιο, όχι εκείνο που κάποιος σχεδίαζε.
Απόκριση:
["Order Completed", "Page Viewed", "Product Viewed"]
Στατιστικά συμβάντων
GET /events/stats?startDate=2026-08-20T00:00:00Z&endDate=2026-08-27T00:00:00Z
Όγκος ανά συμβάν σε ένα χρονικό παράθυρο - ο γρηγορότερος τρόπος να επιβεβαιώσετε ότι μια
ενσωμάτωση εξακολουθεί να στέλνει δεδομένα, και να προσέξετε πότε κάποια σταμάτησε σιωπηλά.
Τα startDate και endDate είναι προαιρετικές χρονοσφραγίδες ISO 8601 (δεν υπάρχει
παράμετρος days)· χωρίς αυτά μετριέται ολόκληρο το ιστορικό.
Απόκριση - πίνακας JSON, τα πολυπληθέστερα συμβάντα πρώτα, έως 1.000 γραμμές. Το count είναι διακριτά συμβάντα, το unique_users διακριτά άτομα:
[
{ "event_name": "Page Viewed", "count": 1204331, "unique_users": 88012 },
{ "event_name": "Order Completed", "count": 48210, "unique_users": 31877 }
]
Σχήματα συμβάντων
GET /events/schema?limit=50&offset=0
GET /events/schema/Order%20Completed
Η διαδρομή λίστας σελιδοποιεί κάθε συμβάν που έχει λάβει ο χώρος εργασίας (limit
προεπιλογή 50, μέγιστο 1000· offset προεπιλογή 0) με πλήθη αλλά χωρίς ιδιότητες. Η
διαδρομή ανά συμβάν παίρνει το όνομα του συμβάντος στη διαδρομή, κωδικοποιημένο για URL -
δεν υπάρχει παράμετρος query ?event= - και επιστρέφει τις ιδιότητες που πράγματι
παρατηρήθηκαν σε αυτό: τον τύπο στον οποίο κατέληξε καθεμία και από πού προήλθε
(typeSource είναι declared, canonical ή inferred), σε πόσα συμβάντα εμφανίζεται
(occurrences), δείγματα τιμών, και αν οι τιμές μοιάζουν με αναγνωριστικό. Δεν υπάρχει
πεδίο fillRate - διαιρέστε το occurrences με το totalCount του συμβάντος από τη
διαδρομή λίστας. Μια ιδιότητα δηλωμένη και ποτέ απεσταλμένη είναι η συνήθης αιτία ενός
τμήματος που δεν ταιριάζει με κανέναν.
Απόκριση λίστας:
{
"data": [
{ "name": "Order Completed", "totalCount": 48210, "uniqueUsers": 31877,
"lastSeen": "2026-08-27T09:12:00.000Z", "propertyCount": 6,
"description": "A purchase was completed", "descriptionSource": "platform", "isPlatform": true }
],
"pagination": { "total": 42, "limit": 50, "offset": 0, "hasMore": false }
}
Απόκριση ανά συμβάν:
{
"eventName": "Order Completed",
"properties": [
{ "name": "total", "type": "number", "typeSource": "canonical", "typeDeclared": false,
"typeMixed": false, "typeCounts": { "string": 0, "number": 48210, "boolean": 0, "array": 0, "object": 0 },
"typeReason": "single", "occurrences": 48210, "exampleValues": [129.9, 42.5],
"cardinalityVerdict": "high_cardinality", "uniquenessRatio": 0.31, "looksLikeIdentifier": false,
"pii": false },
{ "name": "coupon", "type": "string", "typeSource": "inferred",
"typeMixed": false, "typeCounts": { "string": 3857, "number": 0, "boolean": 0, "array": 0, "object": 0 },
"typeReason": "single", "occurrences": 3857, "exampleValues": ["SPRING10"],
"cardinalityVerdict": "low_cardinality", "uniquenessRatio": 0.004, "looksLikeIdentifier": false,
"pii": false }
]
}
Το exampleValues είναι κενό για ιδιότητα PII όταν ο καλών δεν επιτρέπεται να δει PII
(το pii λέει ποιες). Το typeMixed με τα typeCounts του επισημαίνει ιδιότητα της οποίας
οι τιμές φτάνουν με περισσότερους από έναν τύπους.
Δήλωση σχήματος συμβάντος
POST /events/schema
Καταγράφει την περιγραφή ενός συμβάντος. Τα συμβάντα παραμένουν χωρίς σχήμα: η περιγραφή αποθηκεύεται στο λεξικό δεδομένων του χώρου εργασίας, το οποίο διαβάζουν οι επιλογείς ιδιοτήτων και ο βοηθός AI - τίποτα δεν επικυρώνεται ή απορρίπτεται, και δεν δηλώνονται ιδιότητες εδώ.
Σώμα αιτήματος:
{ "name": "Order Completed", "description": "A purchase was completed" }
Απόκριση:
{ "success": true, "message": "Event schema defined successfully",
"data": { "name": "Order Completed", "description": "A purchase was completed" } }
Οι περιγραφές ιδιοτήτων γράφονται με PUT /events/schema/:eventName
({ "description"?, "properties"?: [{ "name", "description" }] }). Το
POST /events/schema/:eventName/properties ({ "name", "type", "description"? })
δηλώνει τον τύπο μιας ιδιότητας - string, number, boolean ή date - στο
ίδιο λεξικό δεδομένων· η διαδρομή ανά συμβάν τον αναφέρει έπειτα με
typeSource: "declared" και τα φίλτρα τμημάτων συγκρίνουν με αυτόν. Ένας
άγνωστος τύπος, όπως και μια τυπική ιδιότητα της οποίας τον τύπο ορίζει η
πλατφόρμα (total, price...), απορρίπτονται με 400.
Κατάλογος συμβάντων πλατφόρμας
GET /events/platform-catalog
Τα κανονικά συμβάντα που το Joryio κατανοεί εγγενώς, με τις ιδιότητες που περιμένει το καθένα. Αν ταιριάξετε αυτά τα ονόματα, οι ενσωματωμένες αναφορές, οι εκκινητές και οι λειτουργίες ηλεκτρονικού εμπορίου δουλεύουν χωρίς αντιστοίχιση - με δικά σας ονόματα, όχι.
Συνήθη συμβάντα
Συμβάντα e-commerce
// Product Viewed
POST /users/track
{
"userId": "user_123",
"eventName": "Product Viewed",
"properties": {
"productId": "prod_456",
"productName": "Premium Plan",
"category": "Subscription",
"price": 99.99,
"currency": "USD"
}
}
// Added To Cart
POST /users/track
{
"userId": "user_123",
"eventName": "Added To Cart",
"properties": {
"productId": "prod_456",
"quantity": 1,
"price": 99.99
}
}
// Order Completed
POST /users/track
{
"userId": "user_123",
"eventName": "Order Completed",
"properties": {
"orderId": "order_789",
"total": 249.99,
"currency": "USD",
"itemCount": 3,
"discount": 25.00,
"paymentMethod": "credit_card"
}
}
Συμβάντα κύκλου ζωής χρήστη
// Signup Completed
POST /users/track
{
"userId": "user_123",
"eventName": "Signup Completed",
"properties": {
"method": "email",
"source": "homepage_cta"
}
}
// Onboarding Completed
POST /users/track
{
"userId": "user_123",
"eventName": "Onboarding Completed",
"properties": {
"stepsCompleted": 5,
"timeSpent": "8m 30s"
}
}
// Trial Started
POST /users/track
{
"userId": "user_123",
"eventName": "Trial Started",
"properties": {
"plan": "premium",
"trialDays": 14
}
}
Συμβάντα αλληλεπίδρασης
// Feature Used
POST /users/track
{
"userId": "user_123",
"eventName": "Feature Used",
"properties": {
"featureName": "export",
"exportFormat": "csv",
"recordCount": 1500
}
}
// Page Viewed
POST /users/track
{
"userId": "user_123",
"eventName": "Page Viewed",
"properties": {
"page": "/pricing",
"category": "Marketing",
"referrer": "google"
}
}
Ιδιότητες συμβάντων
Καλές πρακτικές
Χρησιμοποιείτε περιγραφικά ονόματα ιδιοτήτων:
Σωστό:
{
"properties": {
"productId": "prod_123",
"productName": "Premium Plan",
"price": 99.99,
"currency": "USD"
}
}
Λάθος:
{
"properties": {
"pid": "prod_123",
"n": "Premium Plan",
"p": 99.99
}
}
Υποστηριζόμενοι τύποι δεδομένων
{
"properties": {
"string": "value",
"number": 99.99,
"integer": 5,
"boolean": true,
"date": "2024-01-15T10:30:00Z",
"array": ["tag1", "tag2"],
"object": {
"nested": "value",
"deep": {
"property": "value"
}
}
}
}
Δεσμευμένες ιδιότητες
Οι ιδιότητες που ξεκινούν με $ είναι δεσμευμένες για χρήση από το σύστημα:
$app_id- Αναγνωριστικό εφαρμογής$app_name- Όνομα εφαρμογής$platform- Πλατφόρμα (web, ios, android)$session_id- Αναγνωριστικό συνεδρίας$anonymous_id- ID ανώνυμου χρήστη
Μην χρησιμοποιείτε αυτά τα ονόματα για προσαρμοσμένες ιδιότητες.
Δεσμευμένα ονόματα συμβάντων
Τα ονόματα συμβάντων που ξεκινούν με canvas. είναι δεσμευμένα για τα συμβάντα διαδρομών του Joryio - τα canvas.step.entered, canvas.step.left, canvas.experiment.entered και κάθε άλλο όνομα canvas. καταγράφονται μόνο από τη μηχανή διαδρομών (συμβάντα πλατφόρμας). Ένα συμβάν που στέλνετε με όνομα που ξεκινά με canvas. απορρίπτεται (μετονομάστε το) - εμφανίζεται ως αποτυχημένο, με την αιτία, στην απάντηση του POST /users/track, οριστική απόρριψη (rejectedIndices) σε παρτίδα SDK, και γραμμή που παραλείπεται με την αιτία σε εισαγωγή CSV ή συγχρονισμό αποθήκης δεδομένων. Η ιδιότητα $emitted_by αφαιρείται επίσης από κάθε συμβάν που στέλνετε.
Τα ονόματα που ξεκινούν με message. ή in_app. είναι δεσμευμένα με τον ίδιο τρόπο, για τα συμβάντα μηνυμάτων του Joryio - οι αποστολές, οι παραδόσεις, τα ανοίγματα και τα κλικ (message.sent, message.opened, message.clicked, ...) και οι εμφανίσεις, τα κλικ και οι απορρίψεις μηνυμάτων in-app (in_app.displayed, in_app.clicked, ...) καταγράφονται μόνο από το Joryio, ώστε ένα προσαρμοσμένο συμβάν να μη μετράται ποτέ ως ένα από αυτά σε αναφορές, φίλτρα τμημάτων ή εναύσματα διαδρομών. Ένα συμβάν που στέλνετε με τέτοιο όνομα απορρίπτεται με τον ίδιο τρόπο, ακόμη και ως γραμμή σε ιστορική εισαγωγή CSV ή συγχρονισμό αποθήκης δεδομένων - μετονομάστε το (για παράδειγμα Newsletter Opened). Ο έλεγχος αγνοεί τα πεζά-κεφαλαία. Οι αποδείξεις παράδοσης και τα κλικ push που αναφέρουν τα SDK, καθώς και τα συμβάντα in-app που αναφέρονται μέσω των endpoints in-app των SDK, είναι συμβάντα του ίδιου του Joryio και συνεχίζουν να λειτουργούν.
Όρια συμβάντων
Όρια μεγέθους
| Όριο | Τιμή |
|---|---|
| Μέγιστο μήκος ονόματος συμβάντος | 255 χαρακτήρες |
| Μέγιστο μήκος αναγνωριστικού (userId, anonymousId, sessionId, deviceId, clientEventId) | 255 χαρακτήρες |
| Μέγιστα κλειδιά ιδιοτήτων ανώτατου επιπέδου ανά συμβάν | 200 |
| Μέγιστο μέγεθος ιδιοτήτων (JSON) | 50 KB |
| Μέγιστο βάθος ένθεσης ιδιοτήτων | 5 επίπεδα |
| Μέγιστα συμβάντα ανά αίτημα σώματος-πίνακα | 500 |
Όρια ρυθμού
Το Events API δεν έχει σήμερα σταθερά όρια ρυθμού ανά endpoint - δείτε Επισκόπηση API: Όρια ρυθμού.
Αποκρίσεις σφαλμάτων
Όλα τα σφάλματα χρησιμοποιούν το τυπικό σώμα σφάλματος - δείτε Επισκόπηση API: Απόκριση σφάλματος.
400 Bad Request - Αποτυχία επικύρωσης
{
"statusCode": 400,
"message": "Bad Request Exception",
"timestamp": "2026-01-15T10:30:00.000Z",
"path": "/api/users/track",
"errors": [
"eventName should not be empty"
]
}
400 Bad Request - Υπερμεγέθεις ιδιότητες
{
"statusCode": 400,
"message": "Event properties exceed maximum size of 50KB (received 63KB)",
"timestamp": "2026-01-15T10:30:00.000Z",
"path": "/api/users/track"
}
Καλές πρακτικές
1. Ομαδοποιείτε τα συμβάντα όπου είναι δυνατόν
Σωστό - Ομαδοποίηση πολλών συμβάντων με σώμα-πίνακα:
await fetch('/api/users/track', {
method: 'POST',
body: JSON.stringify([event1, event2, event3])
});
Λάθος - Μεμονωμένα αιτήματα:
await fetch('/api/users/track', { method: 'POST', body: JSON.stringify(event1) });
await fetch('/api/users/track', { method: 'POST', body: JSON.stringify(event2) });
await fetch('/api/users/track', { method: 'POST', body: JSON.stringify(event3) });
2. Χρησιμοποιείτε συνεπή ονομασία συμβάντων
Ακολουθήστε το μοτίβο «Αντικείμενο + ρήμα σε παρελθόντα χρόνο»:
Σωστό: Product Viewed, Order Completed, Trial Started
Λάθος: view_product, clicked, user_action_123
3. Συμπεριλαμβάνετε χρονοσφραγίδες
Για ιστορικά συμβάντα, συμπεριλαμβάνετε πάντα ακριβείς χρονοσφραγίδες:
{
"userId": "user_123",
"eventName": "Order Completed",
"timestamp": "2024-01-15T10:30:00.000Z", // Actual event time
"properties": { ... }
}
4. Κρατήστε τις ιδιότητες λιτές
Συμπεριλαμβάνετε μόνο τις σχετικές ιδιότητες:
Σωστό:
{
"eventName": "Order Completed",
"properties": {
"orderId": "order_123",
"total": 99.99,
"currency": "USD"
}
}
Λάθος:
{
"eventName": "Order Completed",
"properties": {
"orderId": "order_123",
"total": 99.99,
"currency": "USD",
"userAgent": "Mozilla/5.0...", // Too much detail
"sessionData": { /* large object */ },
"cookies": [ /* array of cookies */ ]
}
}
5. Χειρίζεστε τα σφάλματα ομαλά
Υλοποιήστε λογική επαναλήψεων με εκθετική αναμονή:
async function trackWithRetry(event, maxRetries = 3) {
for (let i = 0; i < maxRetries; i++) {
try {
const response = await fetch('/api/users/track', {
method: 'POST',
headers: {
'Authorization': `Bearer ${API_KEY}`,
'Content-Type': 'application/json'
},
body: JSON.stringify(event)
});
if (response.ok) return await response.json();
if (response.status === 429) {
const retryAfter = response.headers.get('Retry-After') || Math.pow(2, i);
await sleep(retryAfter * 1000);
continue;
}
throw new Error(`HTTP ${response.status}`);
} catch (error) {
if (i === maxRetries - 1) throw error;
await sleep(Math.pow(2, i) * 1000); // 1s, 2s, 4s
}
}
}
Εντοπισμός σφαλμάτων
Ενεργοποίηση λειτουργίας debug (SDK)
Όταν χρησιμοποιείτε το Web SDK:
import JoryioSDK from '@joryio/web-sdk';
const joryio = new JoryioSDK({
sdkKey: 'jry_sdk_web_...',
enableDebug: true // Log all events to console
});
Επαλήθευση συμβάντων στο dashboard
- Μεταβείτε στους Χρήστες → Βρείτε τον χρήστη
- Κάντε κλικ στην καρτέλα Δραστηριότητα
- Δείτε όλα τα καταγεγραμμένα συμβάντα
Συνήθη προβλήματα
Τα συμβάντα δεν εμφανίζονται:
- Επαληθεύστε ότι το κλειδί API είναι σωστό
- Ελέγξτε ότι ο χρήστης έχει ταυτοποιηθεί
- Βεβαιωθείτε ότι το όνομα συμβάντος και οι ιδιότητες είναι έγκυρα
- Ελέγξτε τα όρια ρυθμού
Οι ιδιότητες δεν εμφανίζονται:
- Επαληθεύστε ότι τα ονόματα ιδιοτήτων είναι σωστά
- Ελέγξτε ότι οι τύποι δεδομένων υποστηρίζονται
- Αποφύγετε τα δεσμευμένα ονόματα ιδιοτήτων (πρόθεμα $)
SDKs
Για ευκολότερη ενσωμάτωση, χρησιμοποιήστε τα επίσημα SDK:
- Web SDK: Οδηγός ενσωμάτωσης
- iOS SDK: Swift Package / CocoaPods
- Android SDK: Gradle
- React Native SDK: npm install @joryio/react-native-sdk