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:
| Scope | Endpoints |
|---|---|
campaigns:read | Λίστα, λήψη, στατιστικά, παραλήπτες, εκδόσεις, ιστορικό |
campaigns:write | Δημιουργία, ενημέρωση, αντιγραφή, αρχειοθέτηση, ετικέτες, rollback εκδόσεων |
campaigns:send | Αποστολή, παύση, συνέχιση, ακύρωση, επανάληψη, δοκιμαστικές αποστολές, transactional αποστολή |
campaigns:delete | Διαγραφή, μαζική διαγραφή |
Δείτε Κλειδιά API για τη διαχείριση scopes.
Δημιουργία καμπάνιας
Endpoint
POST /campaigns
Σώμα αιτήματος
| Πεδίο | Τύπος | Απαιτείται | Περιγραφή |
|---|---|---|---|
name | string | Ναι | Όνομα καμπάνιας (μέγιστο 255 χαρακτήρες) |
description | string | Όχι | Περιγραφή (μέγιστο 1000 χαρακτήρες) |
channel | string | Ναι | email, sms, viber, push, webhook, whatsapp, in_app ή ai_optimized |
variants | array | Ναι* | Παραλλαγές μηνύματος (απαιτούνται για κάθε κανάλι εκτός του in_app) |
targeting | object | Όχι | Κοινό: userIds, filterGroups, excludeFilterGroups, filterOperator, subscriptionPreference |
sendType | string | Όχι | immediate, scheduled, triggered, intelligent, recurring ή ai_optimized |
scheduledAt | string | Όχι | Ημερομηνία ISO 8601 για sendType: "scheduled" |
scheduledTimezone | string | Όχι | Ζώνη ώρας IANA στην οποία ερμηνεύεται η προγραμματισμένη ώρα |
triggerConfig | object | Όχι | Κανόνας εναύσματος για sendType: "triggered" (type, eventName, conditions, reEntry, cooldownHours) |
recurringSchedule | object | Όχι | Για sendType: "recurring": frequency (daily/weekly/monthly/custom), cron, dayOfWeek, dayOfMonth, timeOfDay, timezone, endDate, maxOccurrences |
conversionTracking | object | Όχι | primaryConversion / secondaryConversions (όνομα συμβάντος + συνθήκες ιδιοτήτων), conversionWindowHours, attributionModel (first_touch/last_touch/linear) |
emailConfigId | string | Όχι | Αποθηκευμένη ταυτότητα αποστολέα email (κανάλι email) |
subscriptionCategoryId | string | Όχι | Κατηγορία συγκατάθεσης (λίστα συνδρομών) υπό την οποία στέλνει η καμπάνια |
sendVolumeLimit | object | Όχι | enabled, maxSends, cadence (lifetime/per_send) |
Περιεχόμενο in-app μηνύματος
Κάθε in-app παραλλαγή φέρει το συντεταγμένο περιεχόμενό της στο customContent. Το mode καθορίζει ποια πεδία ισχύουν:
mode | Πεδία | Αποδίδεται ως |
|---|---|---|
native | title, body, imageUrl, buttons, closeButton, backdropDismissible, style | Τα ίδια τα στοιχεία της εφαρμογής - χωρίς web view |
html (προεπιλογή) | html, css | Κώδικας του συντάκτη μέσα σε web view |
drag_drop | html, 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 περιεχομένου, οπότε στείλτε ένα πεδίο μόνο όταν το χρειάζεται η καμπάνια.
| Πεδίο | Τύπος | Ισχύει σε | Σημασία |
|---|---|---|---|
backgroundColor | string | web, iOS, Android | Φόντο κάρτας |
textColor | string | web, iOS, Android | Τίτλος και σώμα (το σώμα ελαφρώς απαλότερο) |
primaryButtonColor | string | web, iOS, Android | Γέμισμα του πρώτου κουμπιού |
primaryButtonTextColor | string | web, iOS, Android | Η ετικέτα του. Αν παραλειφθεί, επιλέγεται μαύρο ή λευκό με βάση την αντίθεση |
cornerRadius | number | web, iOS, Android | 0-48. Αγνοείται στο fullscreen, όπου οι στρογγυλεμένες γωνίες θα άφηναν την εφαρμογή να φαίνεται |
fontSize | number | web, iOS, Android | 10-32. Μέγεθος σώματος· ο τίτλος κλιμακώνεται από αυτό. Στο κινητό εφαρμόζεται επιπλέον η ρύθμιση μεγέθους κειμένου του χρήστη |
titleWeight | string | web, iOS, Android | regular, medium, semibold, bold. Μόνο ο ΤΙΤΛΟΣ - το σώμα μένει κανονικό για αναγνωσιμότητα |
textAlign | string | web, iOS, Android | auto (προεπιλογή), start, center, end. Το auto ακολουθεί τη γλώσσα του ίδιου του μηνύματος, ώστε τα εβραϊκά και τα αραβικά να διαβάζονται από δεξιά |
fontFamily | string | web· στο κινητό κατά προσέγγιση | Στο κινητό ισχύει μόνο αν η εφαρμογή περιλαμβάνει τη γραμματοσειρά (iOS: καταχωρημένη· Android: res/font ή οικογένεια συστήματος). Αλλιώς κρατά τη δική της |
customCss | string | μόνο 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:
| Πεδίο | Τύπος | Απαιτείται | Περιγραφή |
|---|---|---|---|
id | string | Ναι | Id παραλλαγής |
name | string | Ναι | Όνομα παραλλαγής |
weight | number | Ναι | Μερίδιο κίνησης, 0-100 (τα βάρη πρέπει να αθροίζονται σωστά κατά τους κανόνες του καναλιού) |
message | object | Όχι | Μήνυμα καναλιού. 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 |
isControlGroup | boolean | Όχι | Επισημαίνει την παραλλαγή ως παρακρατημένη ομάδα ελέγχου (ενεργοποιεί τη μέτρηση 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
| Παράμετρος | Τύπος | Προεπιλογή | Περιγραφή |
|---|---|---|---|
status | string | - | Φιλτράρισμα βάσει κατάστασης (χωρισμένες με κόμμα για πολλαπλές) |
channel | string | - | Φιλτράρισμα βάσει καναλιού (χωρισμένα με κόμμα για πολλαπλά) |
tags | string | - | Φιλτράρισμα βάσει ετικετών (χωρισμένες με κόμμα) |
q | string | - | Αναζήτηση ελεύθερου κειμένου |
createdBy / editedBy | string | - | Φιλτράρισμα βάσει δημιουργού / τελευταίου συντάκτη (ids χρηστών χωρισμένα με κόμμα) |
createdFrom | string | - | Μόνο καμπάνιες που δημιουργήθηκαν από αυτή την ημερομηνία ISO και μετά |
page | number | 1 | Αριθμός σελίδας |
limit | number | 20 | Αποτελέσματα ανά σελίδα (μέγιστο 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
Σώμα αιτήματος
| Πεδίο | Τύπος | Απαιτείται | Περιγραφή |
|---|---|---|---|
userId | string | Ναι | Id χρήστη-στόχου |
channel | string | Ναι | email, sms, push ή viber |
message | object | Ναι | subject (email), body (απλό κείμενο), html (email). Μπορεί να είναι {} για viber - το σώμα του εγκεκριμένου προτύπου είναι το μήνυμα |
viberTemplateId | string | Μόνο Viber | Ένα εγκεκριμένο πρότυπο από το μητρώο προτύπων Viber. Η Rakuten Viber επιβάλλει προεγκεκριμένα πρότυπα για transactional/OTP μηνύματα (από τον Ιούλιο του 2026)· το μη εγκεκριμένο περιεχόμενο χρεώνεται με την προωθητική τιμή, οπότε το API αρνείται να στείλει χωρίς αυτό |
variables | object | Όχι | Μόνο Viber - τιμές για τα δυναμικά πεδία του προτύπου (συγχωνεύονται στο πλαίσιο εξατομίκευσης) |
triggerData | object | Όχι | Πλαίσιο διαθέσιμο στην εξατομίκευση (type, name, properties, metadata) |
idempotencyKey | string | Όχι | Κλειδί 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.") ή αποστολή καμπάνιας που δεν είναι πλέον σε κατάσταση δυνατής αποστολής |
Σχετικά
- Δημιουργία καμπανιών
- Αναλυτικά στοιχεία καμπανιών
- Segments API - δημιουργήστε τα κοινά που στοχεύουν οι καμπάνιες
- Canvas API - journeys πολλαπλών βημάτων