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

Analytics API

Το Analytics API παρέχει προγραμματιστική πρόσβαση στις δυνατότητες αναλυτικών στοιχείων προϊόντος, όπως ερωτήματα συμβάντων, funnels, ανάλυση διατήρησης (retention) και ανάλυση διαδρομών.

Όλα τα endpoints αυτής της σελίδας είναι σχετικά ως προς το βασικό URL: https://api-eu1.joryio.com/api - δείτε Επισκόπηση API.

Έλεγχος ταυτότητας​

Όλα τα endpoints απαιτούν έλεγχο ταυτότητας μέσω κλειδιού API:

Authorization: Bearer YOUR_API_KEY
X-Workspace-Id: YOUR_WORKSPACE_ID

Εξερεύνηση συμβάντων​

Λίστα συμβάντων​

Λήψη σύνοψης όλων των καταγεγραμμένων συμβάντων.

GET /analytics/events

Παράμετροι query:

ΠαράμετροςΤύποςΠεριγραφή
startDatestringΗμερομηνία έναρξης (YYYY-MM-DD)
endDatestringΗμερομηνία λήξης (YYYY-MM-DD)
searchstringΦιλτράρισμα βάσει ονόματος συμβάντος
limitnumberΜέγιστα αποτελέσματα (προεπιλογή: 100)
channelsstringΠροαιρετικό. Μέτρηση συμβάντων μηνυμάτων και in-app μόνο σε αυτά τα κανάλια, χωρισμένα με κόμμα - δείτε Φίλτρο καναλιών

Απόκριση:

{
"events": [
{
"eventName": "signup_completed",
"totalCount": 15420,
"uniqueUsers": 12350,
"lastSeen": "2024-01-15T14:30:00Z"
}
],
"total": 45
}

Φίλτρο καναλιών​

Τα GET /analytics/events, POST /analytics/events/trend και POST /analytics/events/query δέχονται προαιρετικό φίλτρο channels. Ισχύει μόνο για συμβάντα μηνυμάτων (message.*) και συμβάντα in-app (in_app.*): αυτά μετρώνται μόνο όταν το κανάλι τους είναι στη λίστα. Τα συμβάντα χωρίς κανάλι - αγορές, συνεδρίες, προσαρμοσμένα συμβάντα - μετρώνται πάντα, ό,τι κι αν λέει η λίστα.

  • Κανάλια: email, sms, whatsapp, push, viber, webhook, wallet, in_app, connector. Κάθε άλλη τιμή απορρίπτεται με 400.
  • Το GET δέχεται λίστα χωρισμένη με κόμμα (channels=email,sms)· οι διαδρομές POST δέχονται πίνακα JSON ("channels": ["email", "sms"]).
  • Χωρίς την παράμετρο: κανένα φίλτρο - οι ίδιοι αριθμοί με πριν υπάρξει η παράμετρος. Κενό (channels= ή []): κανένα συμβάν μηνύματος ή in-app.

Όταν στέλνεται το channels, το GET /analytics/events επιστρέφει επίσης hiddenByChannel: τα συμβάντα μηνυμάτων και in-app που άφησε έξω το φίλτρο, ανά κανάλι.

{
"events": [],
"total": 45,
"hiddenByChannel": [{ "channel": "webhook", "count": 4012 }]
}

Λήψη τάσης συμβάντος​

Λήψη πλήθους συμβάντων στον χρόνο.

POST /analytics/events/trend

Δέχεται το προαιρετικό φίλτρο channels - δείτε Φίλτρο καναλιών.

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

{
"eventNames": ["signup_completed", "purchase_completed"],
"startDate": "2024-01-01",
"endDate": "2024-01-31",
"timeGranularity": "day"
}

Απόκριση:

[
{
"date": "2024-01-01",
"count": 523,
"uniqueUsers": 498
}
]

Λήψη ιδιοτήτων συμβάντος​

Λίστα ιδιοτήτων για ένα συγκεκριμένο συμβάν.

GET /analytics/events/:eventName/properties

Απόκριση:

[
{
"propertyName": "plan_type",
"valueCount": 4
},
{
"propertyName": "source",
"valueCount": 12
}
]

Λήψη ανάλυσης ιδιότητας​

Λήψη της κατανομής τιμών για μια ιδιότητα συμβάντος.

POST /analytics/events/property-breakdown

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

{
"eventName": "purchase_completed",
"property": "payment_method",
"startDate": "2024-01-01",
"endDate": "2024-01-31"
}

Απόκριση:

{
"total": 5420,
"values": [
{ "value": "credit_card", "count": 3250, "percentage": 59.96 },
{ "value": "paypal", "count": 1520, "percentage": 28.04 },
{ "value": "bank_transfer", "count": 650, "percentage": 11.99 }
]
}

Ανάλυση funnel​

Δημιουργία funnel​

Αποθήκευση νέου ορισμού funnel.

POST /analytics/funnels

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

{
"name": "Signup to Purchase",
"steps": [
{
"id": "step_1",
"order": 0,
"eventName": "signup_completed",
"filters": []
},
{
"id": "step_2",
"order": 1,
"eventName": "onboarding_completed",
"filters": []
},
{
"id": "step_3",
"order": 2,
"eventName": "purchase_completed",
"filters": []
}
],
"conversionWindowDays": 7
}

Λίστα funnels​

GET /analytics/funnels

Ανάλυση funnel​

Εκτέλεση ανάλυσης σε αποθηκευμένο funnel.

POST /analytics/funnels/:id/analyze

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

{
"startDate": "2024-01-01",
"endDate": "2024-01-31",
"breakdown": {
"type": "event_property",
"property": "utm_source"
}
}

Απόκριση:

{
"totalUsers": 10000,
"overallConversion": 12.5,
"steps": [
{
"id": "step_1",
"order": 0,
"eventName": "signup_completed",
"enteredCount": 10000,
"conversionRate": 100,
"dropOffRate": 0
},
{
"id": "step_2",
"order": 1,
"eventName": "onboarding_completed",
"enteredCount": 6500,
"conversionRate": 65,
"dropOffRate": 35
},
{
"id": "step_3",
"order": 2,
"eventName": "purchase_completed",
"enteredCount": 1250,
"conversionRate": 19.23,
"dropOffRate": 80.77
}
],
"breakdown": [
{
"breakdownValue": "google",
"overallConversion": 15.2,
"steps": [...]
}
]
}

Γρήγορη ανάλυση funnel​

Ανάλυση χωρίς αποθήκευση.

POST /analytics/funnels/quick-analysis

Ανάλυση διατήρησης​

Ανάλυση διατήρησης​

POST /analytics/retention/analyze

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

{
"startEvent": "signup_completed",
"returnEvent": "session_started",
"startDate": "2024-01-01",
"endDate": "2024-01-31",
"timeUnit": "week",
"periods": 8
}

Απόκριση:

{
"timeUnit": "week",
"cohorts": [
{
"cohortDate": "2024-01-01",
"cohortSize": 1250,
"periods": [
{ "period": 0, "retained": 1250, "retentionRate": 100 },
{ "period": 1, "retained": 562, "retentionRate": 44.96 },
{ "period": 2, "retained": 375, "retentionRate": 30.0 }
]
}
],
"overallRetention": [100, 45.2, 31.5, 25.8, 22.1, 19.5, 17.8, 16.2]
}

Εξαγωγή διατήρησης​

POST /analytics/retention/export

Επιστρέφει δεδομένα CSV.

Σύγκριση διατήρησης τμημάτων​

Εκτελεί την ίδια ανάλυση διατήρησης σε 1 έως 10 αποθηκευμένα τμήματα και επιστρέφει μία γραμμή ανά τμήμα, ώστε να συγκριθούν οι καμπύλες τους. Αντικατέστησε το POST /analytics/retention/compare-cohorts, το οποίο δεν υπάρχει πλέον.

POST /analytics/retention/compare-segments

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

{
"segmentIds": ["seg_9f2a", "seg_71bc"],
"startDate": "2024-01-01",
"endDate": "2024-01-31",
"entryEvent": "signup_completed",
"returnEvent": "session_started",
"timeUnit": "week",
"periods": 8
}
ΠεδίοΥποχρεωτικόΠεριγραφή
segmentIdsναιΑπό 1 έως 10 αναγνωριστικά τμημάτων.
startDate, endDateναιΤο παράθυρο από το οποίο διαβάζονται τα συμβάντα εισόδου.
entryEventόχιΗ ενέργεια που εντάσσει έναν χρήστη σε κοόρτη.
returnEventόχιΗ ενέργεια που μετρά ως επιστροφή.
timeUnitόχιday, week ή month.
periodsόχιΠόσες περίοδοι να παρακολουθηθούν.

Απόκριση:

[
{
"segmentId": "seg_9f2a",
"segmentName": "Power users",
"retention": { "timeUnit": "week", "cohorts": [], "overallRetention": [] },
"resolvedUsers": 4820,
"analyzedUsers": 4820,
"truncated": false
},
{
"segmentId": "seg_71bc",
"segmentName": "All customers",
"retention": { "timeUnit": "week", "cohorts": [], "overallRetention": [] },
"resolvedUsers": 480000,
"analyzedUsers": 50000,
"truncated": true
}
]
ΠεδίοΠεριγραφή
resolvedUsersΤο πραγματικό μέγεθος του τμήματος - κάθε μέλος στο οποίο αναλύθηκε.
analyzedUsersΑπό πόσα μέλη υπολογίστηκε το retention. Ίσο με το resolvedUsers εκτός αν το τμήμα ξεπέρασε το όριο.
truncatedtrue όταν το τμήμα ξεπέρασε το όριο των 50.000 μελών, οπότε το retention περιγράφει ένα ντετερμινιστικό τυχαίο δείγμα analyzedUsers μελών - ποτέ τα πρώτα N, που θα ήταν μεροληπτικά. Δηλώστε και τους δύο αριθμούς όπου εμφανίζετε τα ποσοστά.
errorΥπάρχει όταν αυτό ακριβώς το τμήμα δεν μπόρεσε να αναλυθεί. Οι υπόλοιπες γραμμές επιστρέφονται κανονικά και η γραμμή που απέτυχε δεν φέρει ποσοστά - μην την εμφανίσετε ως 0%.

Ανάλυση διαδρομών​

Ανάλυση διαδρομών​

POST /analytics/paths/analyze

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

{
"startDate": "2024-01-01",
"endDate": "2024-01-31",
"startEvent": "landing_page_view",
"direction": "forward",
"maxSteps": 5,
"minPathCount": 10,
"minPathPercent": 0.5,
"maxBranchesPerStep": 5,
"excludeEvents": ["heartbeat", "scroll"]
}

Απόκριση:

{
"totalUsers": 25000,
"totalPaths": 342,
"paths": [
{
"path": ["landing_page_view", "signup_started", "signup_completed"],
"count": 3250,
"percentage": 13.0
}
],
"sankey": {
"nodes": [
{ "id": "landing_page_view_0", "name": "landing_page_view" }
],
"links": [
{ "source": "landing_page_view_0", "target": "signup_started_1", "value": 5200 }
]
}
}

Dashboards​

Δημιουργία dashboard​

POST /analytics/dashboards

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

{
"name": "Executive Dashboard",
"description": "Key metrics overview",
"widgets": [
{
"id": "widget-1",
"type": "metric",
"title": "Active Users",
"config": {
"eventName": "session_started",
"metric": "unique_users"
},
"layout": { "x": 0, "y": 0, "width": 3, "height": 2 }
}
]
}

Λίστα dashboards​

GET /analytics/dashboards

Λήψη dashboard​

GET /analytics/dashboards/:id

Ενημέρωση dashboard​

PUT /analytics/dashboards/:id

Διαγραφή dashboard​

DELETE /analytics/dashboards/:id

Αναλυτικά στοιχεία σε πραγματικό χρόνο​

Λήψη ενεργών χρηστών​

GET /analytics/realtime/active-users

Απόκριση:

{
"count": 1523,
"trend": 5.2
}

Ζωντανή ροή συμβάντων (SSE)​

GET /analytics/realtime/events/stream

Επιστρέφει ροή Server-Sent Events με ζωντανά συμβάντα.


Προσαυξητικότητα​

Δύο τελικά σημεία απαντούν σε ερωτήσεις που οι συνήθεις αναφορές δεν μπορούν: προκάλεσαν κάτι τα μηνύματα και στέλνω υπερβολικά πολλά. Και τα δύο στηρίζονται στην καθολική ομάδα ελέγχου - ένα τυχαία επιλεγμένο τμήμα επαφών που εξαιρείται από κάθε μάρκετινγκ, ώστε να υπάρχει κάτι έντιμο για σύγκριση.

Προσαύξηση έναντι καθολικής ομάδας ελέγχου​

GET /analytics/global-holdout?startDate=2026-08-01&endDate=2026-08-31

Μετατροπές και έσοδα για όσους έλαβαν μάρκετινγκ στην περίοδο, έναντι της τυχαία εξαιρεθείσας ομάδας.

Το αποτέλεσμα τυλίγεται σε έναν φάκελο uplift. Είναι { "uplift": null } όταν δεν εκτελείται καθολική ομάδα ελέγχου - δεν υπάρχει σημείο σύγκρισης, και ένα αμέτρητο αποτέλεσμα δεν είναι μηδέν.

Απόκριση:

{
"uplift": {
"treatmentRecipients": 41280,
"treatmentConverters": 1650,
"treatmentRevenue": 82560,
"treatmentRevenuePerRecipient": 2.0,
"controlRecipients": 4600,
"controlConverters": 138,
"controlRevenue": 6900,
"controlRevenuePerRecipient": 1.5,
"incrementalRevenue": 20640,
"upliftPct": 33.3,
"significance": {
"controlRate": 0.03,
"treatmentRate": 0.04,
"pValue": 0.002,
"significant": true,
"controlInterval": [0.0255, 0.0353],
"treatmentInterval": [0.0381, 0.0419],
"reason": "significant",
"minConvertersPerArm": 10
},
"currency": "EUR",
"mixedCurrency": false,
"windowHours": 168
}
}

Το significance.significant ελέγχει το ΠΟΣΟΣΤΟ μετατροπής, όχι τα έσοδα: τα έσοδα ανά παραλήπτη είναι συνεχή και με βαριά ουρά, και ένας έλεγχος αναλογίας πάνω τους παράγει αριθμούς που φαίνονται βέβαιοι χωρίς να σημαίνουν τίποτα. Αντιμετωπίστε το incrementalRevenue ((treatmentRevenuePerRecipient - controlRevenuePerRecipient) x treatmentRecipients) ως εκτίμηση της οποίας η αξιοπιστία προέρχεται από το significance.significant, όχι από τη δική της ακρίβεια. Το significance είναι null όταν κάποιο σκέλος δεν έχει παραλήπτες· το reason λέει γιατί ένα αποτέλεσμα δεν είναι ακόμη σημαντικό (not_enough_conversions, no_difference_detected). Το upliftPct είναι null όταν το σκέλος ελέγχου δεν απέφερε έσοδα. Το windowHours είναι το παράθυρο συμπεριφοράς στο οποίο μετρήθηκαν και τα δύο σκέλη (προεπιλογή 168), και το mixedCurrency είναι true όταν οι αγορές εκτείνονται σε περισσότερα από ένα νομίσματα - δεν εφαρμόζεται μετατροπή συναλλάγματος.

Συχνότητα μηνυμάτων​

GET /analytics/message-frequency?startDate=2026-08-01&endDate=2026-08-31

Μετατροπές ανά αριθμό μηνυμάτων που έλαβε ένα άτομο, χωρισμένες κατά το αν ήταν ήδη ενεργό πριν από την περίοδο.

Απόκριση:

{
"buckets": [
{ "bucket": "0", "tier": "engaged", "people": 2300, "buyers": 69, "purchaseRate": 3.0, "converters": 69, "conversionRate": 3.0,
"revenue": 3450, "revenuePerPerson": 1.5, "randomised": true },
{ "bucket": "1", "tier": "engaged", "people": 8100, "buyers": 405, "purchaseRate": 5.0, "converters": 405, "conversionRate": 5.0,
"revenue": 20250, "revenuePerPerson": 2.5 },
{ "bucket": "6-9", "tier": "engaged", "people": 1200, "buyers": 48, "purchaseRate": 4.0, "converters": 48, "conversionRate": 4.0,
"revenue": 4800, "revenuePerPerson": 4.0 }
],
"anchored": true,
"currency": "EUR",
"mixedCurrency": false,
"priorWindowDays": 90
}

Οι κάδοι είναι 0, 1, 2, 3, 4-5, 6-9, 10+. Το tier είναι engaged ή quiet, με βάση ανοίγματα και κλικ στις priorWindowDays πριν από την περίοδο - ποτέ εντός της, κάτι που θα ήταν κυκλικό.

Δύο πεδία καθορίζουν πώς επιτρέπεται να διαβαστούν οι αριθμοί:

  • Το randomised εμφανίζεται μόνο σε κάδο 0 που χτίστηκε από την καθολική ομάδα ελέγχου. Ένα μηδέν φτιαγμένο με οποιονδήποτε άλλο τρόπο είναι άτομα που έτυχε να μη λάβουν τίποτα, και δεν έλαβαν για λόγους που τα κάνουν επίσης λιγότερο πιθανό να αγοράσουν.
  • Το anchored είναι true όταν υπάρχει τέτοιο μηδέν. Όταν είναι false δεν υπάρχει καθόλου κάδος 0, σκόπιμα: μια επινοημένη βάση θα βρισκόταν ακριβώς στο σημείο έναντι του οποίου μετριέται κάθε άλλος αριθμός.

Διαβάστε την καμπύλη γνωρίζοντας ότι η μεροληψία κινείται προς μία κατεύθυνση. Όσοι λαμβάνουν περισσότερα μηνύματα είναι εξαρχής πιο ενεργοί, οπότε η γραμμή σπρώχνεται προς τα πάνω ό,τι κι αν ισχύει. Μια ανοδική γραμμή δεν αποδεικνύει τίποτα, ενώ μια γραμμή που ισιώνει ή πέφτει σε υψηλότερες συχνότητες είναι αξιόπιστη - εμφανίστηκε παρά τη μεροληψία που δρα εναντίον της.

Το converters μετρά παραγγελίες σε κάθε νόμισμα· το revenue αθροίζει μόνο το κυρίαρχο, που ονομάζεται στο currency. Όταν το mixedCurrency είναι true, η στήλη χρημάτων είναι ένα τμήμα και όχι άθροισμα με συναλλαγματικές ισοτιμίες.

Τα buyers και purchaseRate είναι αγορές (παραγγελίες), όχι μετατροπές: η καμπύλη καλύπτει όλο τον χώρο εργασίας, οπότε δεν υπάρχει στόχος καμπάνιας ή διαδρομής να μετρηθεί. Τα converters και conversionRate είναι τα ίδια δύο νούμερα με τα παλιά τους ονόματα, που διατηρούνται για τους υπάρχοντες πελάτες.


Απόδοση περιεχομένου​

GET /analytics/content-performance?startDate=2026-08-01&endDate=2026-08-31&channel=email

Ποσοστά ανοίγματος, κλικ και αγοράς μετά την αποστολή κατά το τι είναι το μήνυμα - τόνος, τύπος προσφοράς, κάλεσμα σε δράση, μήκος, εξατομίκευση, εικόνες και θέμα - σε κάθε πρότυπο, παραλλαγή καμπάνιας και μήνυμα διαδρομής. Το channel είναι προαιρετικό.

Απόκριση:

{
"startDate": "2026-08-01",
"endDate": "2026-08-31",
"channel": null,
"minReached": 100,
"conversionWindowHours": 168,
"taxonomyVersion": "t1",
"totals": { "sent": 18400, "reached": 12100, "labelledSent": 17900, "unlabelledSent": 500, "identities": 42, "labelledIdentities": 40, "noGoalSent": 2300 },
"fields": {
"tone": [
{ "value": "friendly", "sent": 9100, "reached": 6000, "opened": 2520, "clicked": 420, "converted": 150, "goalReached": 5000, "bought": 180, "openRate": 42.0, "clickRate": 7.0, "conversionRate": 3.0, "purchaseRate": 3.0 },
{ "value": "urgent", "sent": 2200, "reached": 1500, "opened": 720, "clicked": 150, "converted": 0, "goalReached": 0, "bought": 60, "openRate": 48.0, "clickRate": 10.0, "conversionRate": null, "purchaseRate": 4.0 },
{ "value": "premium", "sent": 90, "reached": 80, "opened": 30, "clicked": 4, "converted": 1, "goalReached": 80, "bought": 1, "openRate": null, "clickRate": null, "conversionRate": null, "purchaseRate": null }
],
"offerType": [ "..." ],
"ctaType": [ "..." ]
},
"mergeFields": {
"version": "m2",
"measuredSent": 17400,
"pendingSent": 500,
"buckets": [
{
"field": "user.first_name", "placement": "subject", "usage": "merge", "channels": ["email"],
"with": { "sent": 6100, "reached": 4200, "opened": 1932, "clicked": 315, "converted": 120, "goalReached": 3800, "bought": 130, "openRate": 46.0, "clickRate": 7.5, "conversionRate": 3.16, "purchaseRate": 3.1 },
"without": { "sent": 8800, "reached": 5900, "opened": 2242, "clicked": 354, "converted": 140, "goalReached": 5200, "bought": 160, "openRate": 38.0, "clickRate": 6.0, "conversionRate": 2.69, "purchaseRate": 2.71 }
}
],
"other": null
}
}

Το fields έχει μία λίστα ανά ετικέτα (tone, urgency, offerType, ctaType, lengthBand, personalizationDepth, imageryPresent, primaryTopic), ταξινομημένη κατά άτομα που προσεγγίστηκαν. Τα ποσοστά μετρούν μοναδικά άτομα, χωρίς bots· τα openRate και clickRate είναι μέρος των ατόμων στα οποία παραδόθηκε το μήνυμα (push: επί του reached· in-app: επί των εμφανίσεων) - ο ίδιος κανόνας με τα ποσοστά καμπανιών (δείτε Πώς υπολογίζονται τα ποσοστά ανοίγματος και κλικ). Ένα ποσοστό είναι null κάτω από minReached άτομα, και σε κανάλι που δεν μπορεί να το μετρήσει (το push δεν έχει ανοίγματα). Τα conversionRate και purchaseRate περιγράφονται παρακάτω. Το totals.unlabelledSent είναι κίνηση της οποίας το περιεχόμενο δεν έχει ακόμη ετικέτα· το POST /ai/content/backfill (dashboard) επισημαίνει υπάρχον περιεχόμενο.

Τα conversionRate και converted είναι ο δικός στόχος μετατροπής κάθε μηνύματος - ο στόχος της καμπάνιας ή της διαδρομής του, μετρημένος με το παράθυρο και το μοντέλο απόδοσης αυτού του στόχου και πιστωμένος στην παραλλαγή ή στο μήνυμα της διαδρομής που πιστώνει το μοντέλο - επί του goalReached, των ατόμων που προσέγγισαν μηνύματα με στόχο. Μια γραμμή όπου κανένα μήνυμα δεν έχει στόχο έχει conversionRate: null, και ένα πρότυπο που στάλθηκε μόνο του δεν μετρά ποτέ ως μετατροπή. Το totals.noGoalSent είναι η κίνηση χωρίς στόχο. Τα purchaseRate και bought είναι το νούμερο παραγγελιών: αγορά από το ίδιο άτομο εντός conversionWindowHours μετά την αποστολή, ένα απλό παράθυρο όποιος κι αν είναι ο στόχος. Μέχρι τις 2026-10-14 το conversionRate ήταν αυτό το ποσοστό αγοράς.

Το mergeFields συγκρίνει το περιεχόμενο ανά πεδίο συγχώνευσης: ένας κάδος ανά όνομα πεδίου, placement (subject, preheader, title, body, cta, link - διεύθυνση συνδέσμου· οι μεταβλητές {{n}} του WhatsApp μετρούν ως το πεδίο στο οποίο είναι δεμένες) και usage (merge = εμφανίζεται, conditional = μόνο αποφασίζει τι εμφανίζεται), με τις ίδιες μετρήσεις και ποσοστά για τις αποστολές με ετικέτες που το χρησιμοποιούν (with) και για τις αποστολές με ετικέτες στα ίδια channels που δεν το χρησιμοποιούν (without). Το όριο minReached ισχύει για κάθε πλευρά. Μόνο ονόματα πεδίων, ποτέ τιμές. Εμφανίζονται έως 100 συνδυασμοί, πρώτα αυτοί με τα περισσότερα άτομα· οι υπόλοιποι αθροίζονται στο other και δεν χάνονται. Το pendingSent είναι κίνηση με ετικέτες της οποίας τα πεδία συγχώνευσης δεν έχουν διαβαστεί ακόμη· δεν ανήκει σε καμία πλευρά. Η σύγκριση είναι συσχέτιση, όχι αιτία.


Αποκρίσεις σφαλμάτων​

Όλα τα endpoints επιστρέφουν τυπικές αποκρίσεις σφαλμάτων:

{
"statusCode": 400,
"message": "Invalid date range",
"error": "Bad Request"
}
Κωδικός κατάστασηςΠεριγραφή
400Λανθασμένο αίτημα / σφάλμα επικύρωσης
401Μη εξουσιοδοτημένο
403Απαγορευμένο
404Ο πόρος δεν βρέθηκε
500Εσωτερικό σφάλμα διακομιστή