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

Campaigns API

Δημιουργήστε, εκκινήστε και παρακολουθήστε καμπάνιες προγραμματιστικά.

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

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

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

Authorization: Bearer jry_live_your_api_key_here
Content-Type: application/json

Το κλειδί σας πρέπει να φέρει το scope που απαιτεί κάθε endpoint:

ScopeEndpoints
campaigns:readΛίστα, λήψη, στατιστικά, παραλήπτες, εκδόσεις, ιστορικό
campaigns:writeΔημιουργία, ενημέρωση, αντιγραφή, αρχειοθέτηση, ετικέτες, rollback εκδόσεων
campaigns:sendΑποστολή, παύση, συνέχιση, ακύρωση, επανάληψη, δοκιμαστικές αποστολές, transactional αποστολή
campaigns:deleteΔιαγραφή, μαζική διαγραφή

Δείτε Κλειδιά API για τη διαχείριση scopes.


Δημιουργία καμπάνιας

Endpoint

POST /campaigns

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

ΠεδίοΤύποςΑπαιτείταιΠεριγραφή
namestringΝαιΌνομα καμπάνιας (μέγιστο 255 χαρακτήρες)
descriptionstringΌχιΠεριγραφή (μέγιστο 1000 χαρακτήρες)
channelstringΝαιemail, sms, viber, push, webhook, whatsapp, in_app ή ai_optimized
variantsarrayΝαι*Παραλλαγές μηνύματος (απαιτούνται για κάθε κανάλι εκτός του in_app)
targetingobjectΌχιΚοινό: userIds, filterGroups, excludeFilterGroups, filterOperator, subscriptionPreference
sendTypestringΌχιimmediate, scheduled, triggered, intelligent, recurring ή ai_optimized
scheduledAtstringΌχιΗμερομηνία ISO 8601 για sendType: "scheduled"
scheduledTimezonestringΌχιΖώνη ώρας IANA στην οποία ερμηνεύεται η προγραμματισμένη ώρα
triggerConfigobjectΌχιΚανόνας εναύσματος για sendType: "triggered" (type, eventName, conditions, reEntry, cooldownHours)
recurringScheduleobjectΌχιΓια sendType: "recurring": frequency (daily/weekly/monthly/custom), cron, dayOfWeek, dayOfMonth, timeOfDay, timezone, endDate, maxOccurrences
conversionTrackingobjectΌχιprimaryConversion / secondaryConversions (όνομα συμβάντος + συνθήκες ιδιοτήτων), conversionWindowHours, attributionModel (first_touch/last_touch/linear)
emailConfigIdstringΌχιΑποθηκευμένη ταυτότητα αποστολέα email (κανάλι email)
subscriptionCategoryIdstringΌχιΚατηγορία συγκατάθεσης (λίστα συνδρομών) υπό την οποία στέλνει η καμπάνια
sendVolumeLimitobjectΌχιenabled, maxSends, cadence (lifetime/per_send)

Περιεχόμενο in-app μηνύματος

Κάθε in-app παραλλαγή φέρει το συντεταγμένο περιεχόμενό της στο customContent. Το mode καθορίζει ποια πεδία ισχύουν:

modeΠεδίαΑποδίδεται ως
nativetitle, body, imageUrl, buttons, closeButton, backdropDismissible, styleΤα ίδια τα στοιχεία της εφαρμογής - χωρίς web view
html (προεπιλογή)html, cssΚώδικας του συντάκτη μέσα σε web view
drag_drophtml, css, grapejsDataΌπως το html· το grapejsData είναι η κατάσταση του οπτικού επεξεργαστή

Το mode μπορεί να παραλειφθεί, οπότε σημαίνει html.

{
"name": "Weekend offer",
"channel": "in_app",
"channelConfig": { "type": "modal", "triggers": [] },
"variants": [
{
"id": "v1",
"name": "Native",
"weight": 100,
"customContent": {
"mode": "native",
"title": "Weekend only",
"body": "Hi {{ firstName }}, members get 20% off through Sunday.",
"imageUrl": "https://cdn.example.com/weekend.png",
"buttons": [
{ "id": "cta", "text": "See offer", "action": "url", "url": "https://example.com/offer" },
{ "id": "later", "text": "Not now", "action": "dismiss" }
],
"closeButton": true,
"backdropDismissible": true,
"style": {
"backgroundColor": "#0A1240",
"textColor": "#FFFFFF",
"primaryButtonColor": "#00C8B7",
"cornerRadius": 18
}
}
}
]
}

Τα native πεδία είναι κείμενο, όχι markup. Παραδίδονται στην εφαρμογή χωρίς escaping, επειδή η εφαρμογή τα αποδίδει σε στοιχεία κειμένου, οπότε το A & B φτάνει ως A & B και όχι ως A & B. Η εξατομίκευση Liquid λειτουργεί στα title, body και στα text και url των κουμπιών.

Το buttons περιορίζεται σε 3. Το action είναι ένα από dismiss, url ή deep_link· για τα δύο τελευταία απαιτείται url.

style - προαιρετικές παρακάμψεις εμφάνισης

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

ΠεδίοΤύποςΙσχύει σεΣημασία
backgroundColorstringweb, iOS, AndroidΦόντο κάρτας
textColorstringweb, iOS, AndroidΤίτλος και σώμα (το σώμα ελαφρώς απαλότερο)
primaryButtonColorstringweb, iOS, AndroidΓέμισμα του πρώτου κουμπιού
primaryButtonTextColorstringweb, iOS, AndroidΗ ετικέτα του. Αν παραλειφθεί, επιλέγεται μαύρο ή λευκό με βάση την αντίθεση
cornerRadiusnumberweb, iOS, Android0-48. Αγνοείται στο fullscreen, όπου οι στρογγυλεμένες γωνίες θα άφηναν την εφαρμογή να φαίνεται
fontSizenumberweb, iOS, Android10-32. Μέγεθος σώματος· ο τίτλος κλιμακώνεται από αυτό. Στο κινητό εφαρμόζεται επιπλέον η ρύθμιση μεγέθους κειμένου του χρήστη
titleWeightstringweb, iOS, Androidregular, medium, semibold, bold. Μόνο ο ΤΙΤΛΟΣ - το σώμα μένει κανονικό για αναγνωσιμότητα
textAlignstringweb, iOS, Androidauto (προεπιλογή), start, center, end. Το auto ακολουθεί τη γλώσσα του ίδιου του μηνύματος, ώστε τα εβραϊκά και τα αραβικά να διαβάζονται από δεξιά
fontFamilystringweb· στο κινητό κατά προσέγγισηΣτο κινητό ισχύει μόνο αν η εφαρμογή περιλαμβάνει τη γραμματοσειρά (iOS: καταχωρημένη· Android: res/font ή οικογένεια συστήματος). Αλλιώς κρατά τη δική της
customCssstringμόνο webΧειρόγραφο CSS, έως 20000 χαρακτήρες. Το web SDK ξαναγράφει κάθε επιλογέα ώστε να ισχύει μέσα στο μήνυμα πριν την εισαγωγή, άρα κανένας κανόνας δεν φτάνει στη σελίδα, και το @import απορρίπτεται. Τα κινητά δεν έχουν μηχανή CSS

Τα χρώματα περνούν όπως γράφτηκαν - hex, rgb() ή λέξη-κλειδί CSS. Μια τιμή που δεν μπορεί να αναλυθεί επιστρέφει στην κληρονομημένη, αντί να αποτύχει το μήνυμα.

Στο customCss μπορείτε να στοχεύσετε την ίδια την κάρτα, h2, p, button.primary και button.secondary, ενώ τα παραπάνω πεδία εκτίθενται και ως μεταβλητές CSS: --joryio-inapp-bg, --joryio-inapp-fg, --joryio-inapp-primary, --joryio-inapp-primary-fg, --joryio-inapp-radius και --joryio-inapp-font.

Το περιεχόμενο HTML απαιτεί ρητή συγκατάθεση της εφαρμογής. Τα SDK για κινητά και web αρνούνται τα in-app μηνύματα HTML εκτός αν η εφαρμογή ορίσει allowHtmlJsInAppMessages κατά την αρχικοποίηση, επειδή ένα τέτοιο μήνυμα εκτελεί JavaScript του συντάκτη μέσα στην εφαρμογή. Το native περιεχόμενο εμφανίζεται πάντα. Δείτε τους οδηγούς Android, iOS και Web.

| sendRateLimit | object | Όχι | enabled, maxPerMinute | | quietTimeOverride | object | Όχι | Παράκαμψη ωρών ησυχίας ανά καμπάνια | | utmSettings | object | Όχι | Παράκαμψη UTM/επισήμανσης συνδέσμων ανά καμπάνια | | channelConfig | object | Όχι | Ρύθμιση ειδική ανά κανάλι (η μορφή εξαρτάται από το κανάλι) | | stoConfig / abTestConfig | object | Όχι | Ρύθμιση βελτιστοποίησης ώρας αποστολής / δοκιμής A/B | | resendPolicy | string | Όχι | Πολιτική επαναποστολής για το «Αποστολή ξανά» μιας εφάπαξ καμπάνιας: only_new (προεπιλογή), everyone ή cooldown | | resendCooldownDays | number | Όχι | Παράθυρο πρόσφατης επαφής (ημέρες) για resendPolicy: "cooldown" | | tags | string[] | Όχι | Ετικέτες | | status | string | Όχι | draft, scheduled, active, paused, completed ή cancelled |

Δομή παραλλαγής

Κάθε στοιχείο στο variants:

ΠεδίοΤύποςΑπαιτείταιΠεριγραφή
idstringΝαιId παραλλαγής
namestringΝαιΌνομα παραλλαγής
weightnumberΝαιΜερίδιο κίνησης, 0-100 (τα βάρη πρέπει να αθροίζονται σωστά κατά τους κανόνες του καναλιού)
messageobjectΌχιΜήνυμα καναλιού. Email: subject, preheader, from, fromName, html ή templateId, text. SMS: body, from, shortenLinks. Push: title, body, icon, image, data. WhatsApp: messageType (template/reply), templateId, wabaId, variableMapping, replyText. Webhook: url, method, headers, body, auth, bodyType
isControlGroupbooleanΌχιΕπισημαίνει την παραλλαγή ως παρακρατημένη ομάδα ελέγχου (ενεργοποιεί τη μέτρηση uplift)

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

curl -X POST https://api-eu1.joryio.com/campaigns \
-H "Authorization: Bearer jry_live_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"name": "July Newsletter",
"channel": "email",
"sendType": "scheduled",
"scheduledAt": "2026-07-20T10:00:00.000Z",
"scheduledTimezone": "America/New_York",
"variants": [
{
"id": "variant-a",
"name": "Variant A",
"weight": 100,
"message": {
"subject": "Your July update",
"from": "news@example.com",
"fromName": "Example",
"html": "<h1>Hello {{ user.firstName }}</h1>"
}
}
],
"targeting": {
"filterGroups": [
{
"filters": [
{ "type": "attribute", "field": "plan", "operator": "equals", "value": "premium" }
],
"operator": "AND"
}
]
}
}'

Απόκριση

Επιστρέφει το αντικείμενο της καμπάνιας που δημιουργήθηκε:

{
"id": "8f14e45f-ceea-467f-a11d-2f4b6a1c9e3b",
"name": "July Newsletter",
"channel": "email",
"status": "scheduled",
"sendType": "scheduled",
"scheduledAt": "2026-07-20T14:00:00.000Z",
"variants": [ ... ],
"targeting": { ... },
"tags": [],
"createdAt": "2026-07-12T09:00:00.000Z",
"updatedAt": "2026-07-12T09:00:00.000Z"
}

Λίστα καμπανιών

Endpoint

GET /campaigns

Παράμετροι query

ΠαράμετροςΤύποςΠροεπιλογήΠεριγραφή
statusstring-Φιλτράρισμα βάσει κατάστασης (χωρισμένες με κόμμα για πολλαπλές)
channelstring-Φιλτράρισμα βάσει καναλιού (χωρισμένα με κόμμα για πολλαπλά)
tagsstring-Φιλτράρισμα βάσει ετικετών (χωρισμένες με κόμμα)
qstring-Αναζήτηση ελεύθερου κειμένου
createdBy / editedBystring-Φιλτράρισμα βάσει δημιουργού / τελευταίου συντάκτη (ids χρηστών χωρισμένα με κόμμα)
createdFromstring-Μόνο καμπάνιες που δημιουργήθηκαν από αυτή την ημερομηνία ISO και μετά
pagenumber1Αριθμός σελίδας
limitnumber20Αποτελέσματα ανά σελίδα (μέγιστο 100)

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

curl -X GET "https://api-eu1.joryio.com/campaigns?status=active&channel=email&limit=50" \
-H "Authorization: Bearer jry_live_your_api_key"

Απόκριση

{
"data": [
{ "id": "8f14e45f-ceea-467f-a11d-2f4b6a1c9e3b", "name": "July Newsletter", "channel": "email", "status": "active" }
],
"pagination": {
"total": 23,
"page": 1,
"limit": 50,
"offset": 0,
"totalPages": 1,
"hasMore": false
}
}

Λήψη καμπάνιας

GET /campaigns/:campaignId
curl -X GET https://api-eu1.joryio.com/campaigns/8f14e45f-ceea-467f-a11d-2f4b6a1c9e3b \
-H "Authorization: Bearer jry_live_your_api_key"

Επιστρέφει το πλήρες αντικείμενο της καμπάνιας. Η κατάσταση καμπάνιας είναι μία από τις: draft, scheduled, active, paused, completed, cancelled, archived, failed (μόνιμο σφάλμα αποστολής - δείτε failureReason).


Ενημέρωση καμπάνιας

PUT /campaigns/:campaignId

Το σώμα δέχεται τα ίδια πεδία με τη Δημιουργία καμπάνιας - όλα προαιρετικά· ενημερώνονται μόνο τα πεδία που παρέχονται.

curl -X PUT https://api-eu1.joryio.com/campaigns/8f14e45f-ceea-467f-a11d-2f4b6a1c9e3b \
-H "Authorization: Bearer jry_live_your_api_key" \
-H "Content-Type: application/json" \
-d '{ "name": "July Newsletter v2" }'
Επεξεργασία ενεργής καμπάνιας

Οι triggered και recurring καμπάνιες παραμένουν active σε όλη τη ζωή τους. Η επεξεργασία μιας active καμπάνιας δεν αλλάζει αυτό που αποστέλλεται τη δεδομένη στιγμή - οι αλλαγές αποθηκεύονται προσωρινά ως εκκρεμές προσχέδιο. Καλέστε POST /campaigns/:campaignId/publish για να εφαρμοστούν ατομικά στην τρέχουσα καμπάνια, ή POST /campaigns/:campaignId/discard-draft για να απορριφθούν. Οι καμπάνιες-προσχέδια ενημερώνονται επιτόπου (χωρίς βήμα δημοσίευσης).


Διαγραφή καμπάνιας

DELETE /campaigns/:campaignId

Επιστρέφει 204 No Content. Μόνο προσχέδια που δεν εκτελέστηκαν ποτέ διαγράφονται οριστικά· καμπάνιες με ιστορικό αποστολών πρέπει αντ' αυτού να αρχειοθετούνται (POST /campaigns/:campaignId/archive), κάτι που σταματά την αποστολή διατηρώντας τα αναλυτικά στοιχεία.


Κύκλος ζωής καμπάνιας

ΜέθοδοςΔιαδρομήΠεριγραφή
POST/campaigns/:campaignId/sendΕκκίνηση της καμπάνιας (ξεκινά την αποστολή / ενεργοποιεί μια triggered καμπάνια)
POST/campaigns/:campaignId/pauseΠαύση καμπάνιας σε εξέλιξη
POST/campaigns/:campaignId/resumeΣυνέχιση καμπάνιας σε παύση
POST/campaigns/:campaignId/publishΑτομική εφαρμογή των προσωρινών αλλαγών σε ενεργή καμπάνια (400 αν δεν εκκρεμούν)
POST/campaigns/:campaignId/discard-draftΑπόρριψη των προσωρινών αλλαγών ενεργής καμπάνιας (χωρίς αποτέλεσμα αν δεν υπάρχουν)
POST/campaigns/:campaignId/cancelΑκύρωση καμπάνιας
POST/campaigns/:campaignId/resendΕπαναποστολή («Αποστολή ξανά») μιας ολοκληρωμένης εφάπαξ καμπάνιας σύμφωνα με το resendPolicy της
POST/campaigns/:campaignId/retryΕπανάληψη μιας failed καμπάνιας (την επαναφέρει σε scheduled)
POST/campaigns/:campaignId/preview-launchΣύνοψη πριν την εκκίνηση (μέγεθος κοινού, έλεγχοι) χωρίς αποστολή
POST/campaigns/:campaignId/duplicateΑντιγραφή καμπάνιας
POST/campaigns/:campaignId/archiveΑρχειοθέτηση (σταματά την αποστολή, διατηρεί το ιστορικό)
POST/campaigns/:campaignId/unarchiveΕπαναφορά σε κατάσταση μη αποστολής (συνεχίστε ρητά για να σταλεί ξανά)
POST/campaigns/:campaignId/stop-recurringΔιακοπή μελλοντικών επαναλήψεων μιας recurring καμπάνιας
curl -X POST https://api-eu1.joryio.com/campaigns/8f14e45f-ceea-467f-a11d-2f4b6a1c9e3b/send \
-H "Authorization: Bearer jry_live_your_api_key"
Αποστολή ξανά (πολιτική επαναποστολής)

Μια ολοκληρωμένη εφάπαξ καμπάνια μπορεί να επανασταλεί με POST /campaigns/:campaignId/resend. Το ποιος τη λαμβάνει διέπεται από το resendPolicy της καμπάνιας:

  • only_new (προεπιλογή) - παραλείπεται όποιος την έχει ήδη λάβει (τη λαμβάνουν μόνο χρήστες που δεν είχαν προσεγγιστεί ποτέ).
  • everyone - επαναποστολή σε όλο το κοινό, συμπεριλαμβανομένων των προηγούμενων παραληπτών.
  • cooldown - επαναποστολή σε όλους εκτός από όσους έλαβαν μήνυμα τις τελευταίες resendCooldownDays ημέρες.

Η συγκατάθεση και η καταστολή επιβάλλονται πάντα. Τα όρια συχνότητας ακολουθούν τη σημαία ignoreTouchingRules της καμπάνιας. Οι triggered καμπάνιες χρησιμοποιούν το triggerConfig.reEntry αντ' αυτού· οι recurring καμπάνιες επαναποστέλλουν βάσει του προγράμματός τους. Επιστρέφει 400 για αυτούς τους τύπους, για in-app, ή για καμπάνια που δεν έχει ολοκληρώσει την αποστολή.


Στατιστικά καμπάνιας

GET /campaigns/:campaignId/stats

Παράμετροι query: startDate, endDate (ISO 8601, προαιρετικά).

Απόκριση

{
"campaignId": "8f14e45f-ceea-467f-a11d-2f4b6a1c9e3b",
"name": "July Newsletter",
"channel": "email",
"status": "completed",
"stats": {
"queued": 1200,
"sent": 1180,
"delivered": 1150,
"failed": 30,
"opened": 640,
"clicked": 210
},
"conversionStats": { ... },
"revenue": { ... },
"uplift": null,
"conversionTracking": { ... },
"startedAt": "2026-07-20T14:00:00.000Z",
"completedAt": "2026-07-20T14:12:00.000Z",
"createdAt": "2026-07-12T09:00:00.000Z"
}

Τα conversionStats και revenue συμπληρώνονται όταν έχει ρυθμιστεί παρακολούθηση μετατροπών· το uplift συμπληρώνεται μόνο όταν μια παραλλαγή έχει επισημανθεί με isControlGroup.

Σχετικά endpoints στατιστικών

ΜέθοδοςΔιαδρομήΠεριγραφή
GET/campaigns/:campaignId/variant-statsΣτατιστικά A/B ανά παραλλαγή με στατιστική σημαντικότητα (startDate/endDate)
GET/campaigns/:campaignId/linksΣτατιστικά κλικ συνδέσμων (startDate/endDate)
GET/campaigns/:campaignId/failure-reasonsΑποτυχίες παράδοσης ομαδοποιημένες κατά κωδικό σφάλματος DLR ([{ code, reason, count }])
GET/campaigns/:campaignId/time-to-engageΠόσο χρόνο χρειάστηκαν οι παραλήπτες για το πρώτο άνοιγμα ή κλικ, σε ομάδες - μετριέται ανά παραλήπτη από τη ΔΙΚΗ ΤΟΥ αποστολή, οπότε έχει νόημα για καμπάνιες με trigger
GET/campaigns/:campaignId/send-occurrencesΑνάλυση ανά αποστολή για επαναλαμβανόμενη καμπάνια, με κλειδί την ημερομηνία αποστολής - η αλληλεπίδραση αποδίδεται στην αποστολή που προηγήθηκε
GET/campaigns/:campaignId/recipientsΣελιδοποιημένοι παραλήπτες με την κατάσταση τελευταίου μηνύματος (status, limit μέγιστο 200, offset)
GET/campaigns/:campaignId/recipients/:userIdΧρονολόγιο συμβάντων μηνυμάτων ανά χρήστη για αυτή την καμπάνια
GET/campaigns/:campaignId/in-app-statsΣτατιστικά εμφάνισης in-app (in-app καμπάνιες). Περιλαμβάνει το displayFrequency - την κατανομή εμφανίσεων ανά χρήστη ως { tailBucket, buckets: [{ displays, users, impressions }], maxPerUser }. Οι τιμές από tailBucket και πάνω συμπτύσσονται σε έναν κάδο, οπότε displays === tailBucket σημαίνει "τόσες ή περισσότερες"· για τον μέσο όρο χρησιμοποιήστε το impressions κάθε κάδου (όχι displays * users), και το maxPerUser για τον χρήστη με τις περισσότερες εμφανίσεις
GET/campaigns/:campaignId/impressionsΛίστα εμφανίσεων in-app (limit, offset, startDate, endDate)

Αποστολή transactional μηνύματος

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

POST /campaigns/transactional/send

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

ΠεδίοΤύποςΑπαιτείταιΠεριγραφή
userIdstringΝαιId χρήστη-στόχου
channelstringΝαιemail, sms, push ή viber
messageobjectΝαιsubject (email), body (απλό κείμενο), html (email). Μπορεί να είναι {} για viber - το σώμα του εγκεκριμένου προτύπου είναι το μήνυμα
viberTemplateIdstringΜόνο ViberΈνα εγκεκριμένο πρότυπο από το μητρώο προτύπων Viber. Η Rakuten Viber επιβάλλει προεγκεκριμένα πρότυπα για transactional/OTP μηνύματα (από τον Ιούλιο του 2026)· το μη εγκεκριμένο περιεχόμενο χρεώνεται με την προωθητική τιμή, οπότε το API αρνείται να στείλει χωρίς αυτό
variablesobjectΌχιΜόνο Viber - τιμές για τα δυναμικά πεδία του προτύπου (συγχωνεύονται στο πλαίσιο εξατομίκευσης)
triggerDataobjectΌχιΠλαίσιο διαθέσιμο στην εξατομίκευση (type, name, properties, metadata)
idempotencyKeystringΌχιΚλειδί dedup που δίνει ο καλών - μια επανάληψη με το ίδιο κλειδί δεν παραδίδεται δύο φορές
curl -X POST https://api-eu1.joryio.com/campaigns/transactional/send \
-H "Authorization: Bearer jry_live_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"userId": "user_123",
"channel": "email",
"message": {
"subject": "Your receipt",
"html": "<p>Thanks for your order, {{ user.firstName }}.</p>"
},
"idempotencyKey": "order-98421-receipt"
}'

Πρόσθετα endpoints

ΜέθοδοςΔιαδρομήΠεριγραφή
POST/campaigns/previewΠροεπισκόπηση χρηστών που ταιριάζουν στα κριτήρια στόχευσης (σώμα: targeting, προαιρετικό limit μέγιστο 500, channel, webAppId)
POST/campaigns/spam-checkΈλεγχος spam του περιεχομένου email πριν την αποστολή
GET/campaigns/:campaignId/versionsΛίστα αποθηκευμένων στιγμιοτύπων εκδόσεων
GET/campaigns/:campaignId/versions/compare?v1=&v2=Σύγκριση (diff) δύο εκδόσεων
GET/campaigns/:campaignId/versions/:versionIdΛήψη στιγμιοτύπου έκδοσης
POST/campaigns/:campaignId/versions/:versionId/rollbackΕπαναφορά (rollback) σε μια έκδοση
GET/campaigns/:campaignId/historyΙστορικό ελέγχου (audit log) (limit, μέγιστο 200)
POST/campaigns/bulk-delete / bulk-duplicate / bulk-archive / bulk-unarchiveΜαζικές ενέργειες· σώμα { "ids": [...] }, επιστρέφει { succeeded, failed }
POST/campaigns/bulk-tagΜαζική προσθήκη ετικετών· σώμα { "ids": [...], "tags": [...] }
POST/campaigns/:campaignId/send-test-whatsapp / send-test-sms / send-test-push / send-test-in-appΔοκιμαστικές αποστολές σε τηλέφωνο/χρήστη πριν την εκκίνηση
GET/campaigns/:campaignId/sto-coverageΚάλυψη βελτιστοποίησης ώρας αποστολής για το κοινό
GET/campaigns/:campaignId/recurring-statusΚατάσταση recurring καμπάνιας
POST/campaigns/:campaignId/retest-abΕπαναφορά του νικητή A/B σε recurring καμπάνια νικήτριας παραλλαγής
POST/campaigns/:campaignId/launch-rlΕκκίνηση σε λειτουργία AI-optimized (RL)
GET/campaigns/:campaignId/rl-statsΣτατιστικά dashboard AI-optimized καμπάνιας
POST/campaigns/:campaignId/pause-rl / resume-rlΠαύση / συνέχιση AI-optimized καμπάνιας
POST/campaigns/ml-path-warmthΚατάσταση προθέρμανσης εξατομίκευσης για ids διαδρομών/παραλλαγών

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

Όλα τα σφάλματα μοιράζονται την τυπική μορφή - δείτε Απόκριση σφάλματος στην Επισκόπηση API για τη μορφή και την πλήρη λίστα κωδικών κατάστασης.

{
"statusCode": 404,
"message": "Campaign not found",
"timestamp": "2026-07-12T09:00:00.000Z",
"path": "/campaigns/8f14e45f-ceea-467f-a11d-2f4b6a1c9e3b"
}
ΚατάστασηΠότε
400Αποτυχία επικύρωσης (π.χ. μη έγκυρο channel, λείπει το weight παραλλαγής) - το σώμα προσθέτει πίνακα errors με ένα μήνυμα ανά πεδίο που απέτυχε
401Κλειδί API που λείπει ή είναι μη έγκυρο
403Το κλειδί API δεν έχει το απαιτούμενο scope campaigns:*
404Η καμπάνια δεν βρέθηκε σε αυτόν τον χώρο εργασίας
409Σύγκρουση κύκλου ζωής - π.χ. συνέχιση καμπάνιας που δεν είναι πλέον σε παύση ("Campaign is no longer paused.") ή αποστολή καμπάνιας που δεν είναι πλέον σε κατάσταση δυνατής αποστολής

Σχετικά