Kampanyalar API
Kampanyalar modülünün tüm işlemleri (16) ve veri modelleri (7): adresler, izinler, girdiler, ön koşullar, olaylar ve örnekler.
Müşterilerinize e-posta, SMS ve WhatsApp kampanyaları; açılma ve tıklamalarla.
Modül kodu campaigns · 16 işlem · 7 veri modeli · 12 olay. Bir anahtar ya da token, arkasındaki kişinin bu modülde yapabildiğinden fazlasını asla yapamaz; satır düzeyindeki güvenlik uygulamadakiyle birebir aynıdır. Yetki kapsamları: campaigns (hepsi), campaigns:read (yalnız okuma) ya da campaigns:<yetenek>.
Kaynaklar
| Kaynak | Tablo | Listeleme ve okuma | POST | PATCH | DELETE |
|---|---|---|---|---|---|
audience_facts | audience_fact | /api/v1/audience_facts | |||
audiences | audience | /api/v1/audiences | campaigns.create_audience | campaigns.update_audience | campaigns.delete_audience |
campaign_clicks | campaign_click | /api/v1/campaign_clicks | |||
campaign_links | campaign_link | /api/v1/campaign_links | |||
campaign_recipients | campaign_recipient | /api/v1/campaign_recipients | |||
campaigns | campaign | /api/v1/campaigns | campaigns.create | campaigns.update | campaigns.delete |
marketing_unsubscribes | marketing_unsubscribe | /api/v1/marketing_unsubscribes |
Listeler limit (en çok 200), cursor, order (ör. -created_at), fields ve q alır; diğer her sorgu parametresi bir sütun süzgecidir: ?status=paid, ?total[gte]=100, ?id[in]=a,b, ?x=null.
İşlemler
| İşlem | Gereken izin | Ne yapar |
|---|---|---|
campaigns.cancel | campaigns:write | Göndermeyi durdur |
campaigns.create | campaigns:write | Kampanya taslağı hazırla |
campaigns.create_audience | campaigns:write | Kitle oluştur |
campaigns.delete | campaigns:delete | Taslak kampanyayı sil |
campaigns.delete_audience | campaigns:delete | Kitleyi sil |
campaigns.record_batch | campaigns:handle | Gönderilen grubu kaydet |
campaigns.resubscribe | campaigns:manage | Abonelikten çıkanlar listesinden çıkar |
campaigns.resubscribe_me | campaigns:write | Bana yeniden kampanya mesajı gönderilsin |
campaigns.schedule | campaigns:write | Zamanla veya gönder |
campaigns.send_test | campaigns:write | Test gönder |
campaigns.start | campaigns:handle | Zamanı gelen kampanyayı başlat |
campaigns.unschedule | campaigns:write | Taslağa geri al |
campaigns.unsubscribe | campaigns:write | Adresin aboneliğini iptal et |
campaigns.unsubscribe_me | campaigns:write | Bana kampanya mesajı gönderilmesin |
campaigns.update | campaigns:write | Kampanyayı düzenle |
campaigns.update_audience | campaigns:write | Kitleyi düzenle |
campaigns.cancel
Göndermeyi durdur — Zamanlanmış veya gönderilmekte olan kampanyayı durdurur; henüz gönderilmeyenlere gönderilmez.
Gereken izin campaigns:write · siler ya da geri alınamaz · Era çalıştırırken bir kişiye onaylatır
https://app.getera.io/api/v1/campaigns/{id}/actions/cancel- Asıl adres:
POST /api/v1/actions/campaigns.cancel
Girdi
| Alan | Tür | Zorunlu | Açıklama |
|---|---|---|---|
id | uuid | evet | Doldurulduğu yer: adresteki {id} · Kampanya · kimliği: campaign |
Ön koşullar
Koşul tutmazsa işlem 409 ve şu kodlardan biriyle reddedilir:
| Kod | Ne zaman reddedilir |
|---|---|
campaign_not_found | Kampanya bulunmalı. |
campaign_not_cancellable | Yalnızca zamanlanmış veya gönderilmekte olan bir kampanya durdurulur. |
Yayımladığı olaylar: campaigns.cancelled
Neye yazar: campaign (update) — Marks it cancelled; campaign_recipient (update) — Skips those not yet sent to
curl -X POST https://app.getera.io/api/v1/campaigns/CAMPAIGN_ID/actions/cancel \
-H "Authorization: Bearer $ERA_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{}'{
"ok": true,
"result": "…",
"events": [
"campaigns.cancelled"
]
}import { createEra } from "@getera/sdk"
const era = createEra({ apiKey: process.env.ERA_API_KEY })
const res = await era.campaigns.cancel("CAMPAIGN_ID")era campaigns cancel CAMPAIGN_ID{
"name": "era__campaigns__cancel",
"arguments": {
"id": "CAMPAIGN_ID"
}
}Hatalar: 401 kimlik bilgisi yok ya da süresi dolmuş · 403 kimlik bilgisinde campaigns:write izni yok · 404 kayıt ya da modül erişim dışında · 422 geçersiz girdi (problems[]) · 409 campaign_not_found, campaign_not_cancellable · 429 çok sık istek
campaigns.create
Kampanya taslağı hazırla — Bir kitleye test edilmek, zamanlanmak ve gönderilmek üzere bir e-posta, SMS veya WhatsApp mesajı.
Gereken izin campaigns:write · veriyi değiştirir
https://app.getera.io/api/v1/campaigns/actions/create- REST kısayolu:
POST /api/v1/campaigns - Asıl adres:
POST /api/v1/actions/campaigns.create
Girdi
| Alan | Tür | Zorunlu | Açıklama |
|---|---|---|---|
name | string | evet | Ad · en çok 200 |
channel | string (enum) | Gönderme yolu · İzin verilen değerler: email, sms, whatsapp | |
format | string (enum) | Biçim · İzin verilen değerler: text, html | |
subject | string | Konu · en çok 300 | |
subjectB | string | Konu B (A/B testi) · en çok 300 | |
preheader | string | Önizleme satırı · en çok 200 | |
body | string | Mesaj · en çok 20000 | |
blocks | object / array | E-posta blokları | |
audienceId | uuid | evet | Kitle · kimliği: audience |
Ön koşullar
Koşul tutmazsa işlem 409 ve şu kodlardan biriyle reddedilir:
| Kod | Ne zaman reddedilir |
|---|---|
audience_not_found | Kitle bulunmalı. |
invalid_campaign_blocks | E-posta düzeni, geçerli bağlantılar içeren bilinen bloklardan oluşan bir liste olmalı. |
Yayımladığı olaylar: campaigns.created
Neye yazar: campaign (insert) — Writes the draft
curl -X POST https://app.getera.io/api/v1/campaigns/actions/create \
-H "Authorization: Bearer $ERA_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{"name":"Name","audienceId":"AUDIENCE_ID"}'{
"ok": true,
"result": "…",
"events": [
"campaigns.created"
]
}import { createEra } from "@getera/sdk"
const era = createEra({ apiKey: process.env.ERA_API_KEY })
const res = await era.campaigns.create({
name: "Name",
audienceId: "AUDIENCE_ID"
})era campaigns create \
--name "Name" \
--audience-id "AUDIENCE_ID"{
"name": "era__campaigns__create",
"arguments": {
"name": "Name",
"audienceId": "AUDIENCE_ID"
}
}Hatalar: 401 kimlik bilgisi yok ya da süresi dolmuş · 403 kimlik bilgisinde campaigns:write izni yok · 404 kayıt ya da modül erişim dışında · 422 geçersiz girdi (problems[]) · 409 audience_not_found, invalid_campaign_blocks · 429 çok sık istek
campaigns.create_audience
Kitle oluştur — Kayıtlı bir müşteri segmenti: alanları, etiketleri, potansiyel müşteri olup olmadıkları ve ne satın aldıkları veya ayırttıkları.
Gereken izin campaigns:write · veriyi değiştirir
https://app.getera.io/api/v1/audiences/actions/create_audience- REST kısayolu:
POST /api/v1/audiences - Asıl adres:
POST /api/v1/actions/campaigns.create_audience
Girdi
| Alan | Tür | Zorunlu | Açıklama |
|---|---|---|---|
name | string | evet | Ad · en çok 200 |
description | string | Açıklama · en çok 2000 | |
match | string (enum) | Eşleşme · İzin verilen değerler: all, any | |
rules | object / array | Kurallar |
Ön koşullar
Koşul tutmazsa işlem 409 ve şu kodlardan biriyle reddedilir:
| Kod | Ne zaman reddedilir |
|---|---|
invalid_audience_rules | Her kural bilinen bir alan, işleç ve değer gerektirir. |
Yayımladığı olaylar: campaigns.audience_changed
Neye yazar: audience (insert) — Saves the segment
curl -X POST https://app.getera.io/api/v1/audiences/actions/create_audience \
-H "Authorization: Bearer $ERA_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{"name":"Name"}'{
"ok": true,
"result": "…",
"events": [
"campaigns.audience_changed"
]
}import { createEra } from "@getera/sdk"
const era = createEra({ apiKey: process.env.ERA_API_KEY })
const res = await era.audiences.create({
name: "Name"
})era audiences create \
--name "Name"{
"name": "era__campaigns__create_audience",
"arguments": {
"name": "Name"
}
}Hatalar: 401 kimlik bilgisi yok ya da süresi dolmuş · 403 kimlik bilgisinde campaigns:write izni yok · 404 kayıt ya da modül erişim dışında · 422 geçersiz girdi (problems[]) · 409 invalid_audience_rules · 429 çok sık istek
campaigns.delete
Taslak kampanyayı sil — Hiç gönderilmemiş bir kampanyayı kaldırır.
Gereken izin campaigns:delete · siler ya da geri alınamaz · Era çalıştırırken bir kişiye onaylatır
https://app.getera.io/api/v1/campaigns/{id}/actions/delete- REST kısayolu:
DELETE /api/v1/campaigns/{id} - Asıl adres:
POST /api/v1/actions/campaigns.delete
Girdi
| Alan | Tür | Zorunlu | Açıklama |
|---|---|---|---|
id | uuid | evet | Doldurulduğu yer: adresteki {id} · Kampanya · kimliği: campaign |
Ön koşullar
Koşul tutmazsa işlem 409 ve şu kodlardan biriyle reddedilir:
| Kod | Ne zaman reddedilir |
|---|---|
campaign_not_found | Kampanya bulunmalı. |
campaign_not_draft | Yalnızca taslak değiştirilir. |
Yayımladığı olaylar: campaigns.deleted
Neye yazar: campaign (delete) — Deletes the draft
curl -X POST https://app.getera.io/api/v1/campaigns/CAMPAIGN_ID/actions/delete \
-H "Authorization: Bearer $ERA_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{}'{
"ok": true,
"result": "…",
"events": [
"campaigns.deleted"
]
}import { createEra } from "@getera/sdk"
const era = createEra({ apiKey: process.env.ERA_API_KEY })
const res = await era.campaigns.delete("CAMPAIGN_ID")era campaigns delete CAMPAIGN_ID{
"name": "era__campaigns__delete",
"arguments": {
"id": "CAMPAIGN_ID"
}
}Hatalar: 401 kimlik bilgisi yok ya da süresi dolmuş · 403 kimlik bilgisinde campaigns:delete izni yok · 404 kayıt ya da modül erişim dışında · 422 geçersiz girdi (problems[]) · 409 campaign_not_found, campaign_not_draft · 429 çok sık istek
campaigns.delete_audience
Kitleyi sil — Hiçbir kampanyanın kullanmadığı bir segmenti kaldırır.
Gereken izin campaigns:delete · siler ya da geri alınamaz · Era çalıştırırken bir kişiye onaylatır
https://app.getera.io/api/v1/audiences/{id}/actions/delete_audience- REST kısayolu:
DELETE /api/v1/audiences/{id} - Asıl adres:
POST /api/v1/actions/campaigns.delete_audience
Girdi
| Alan | Tür | Zorunlu | Açıklama |
|---|---|---|---|
id | uuid | evet | Doldurulduğu yer: adresteki {id} · Kitle · kimliği: audience |
Ön koşullar
Koşul tutmazsa işlem 409 ve şu kodlardan biriyle reddedilir:
| Kod | Ne zaman reddedilir |
|---|---|
audience_not_found | Kitle bulunmalı. |
audience_in_use | Bir kampanyanın kullandığı kitle kalır. |
Yayımladığı olaylar: campaigns.audience_changed
Neye yazar: audience (delete) — Deletes the segment
curl -X POST https://app.getera.io/api/v1/audiences/AUDIENCE_ID/actions/delete_audience \
-H "Authorization: Bearer $ERA_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{}'{
"ok": true,
"result": "…",
"events": [
"campaigns.audience_changed"
]
}import { createEra } from "@getera/sdk"
const era = createEra({ apiKey: process.env.ERA_API_KEY })
const res = await era.audiences.deleteAudience("AUDIENCE_ID")era audiences delete_audience AUDIENCE_ID{
"name": "era__campaigns__delete_audience",
"arguments": {
"id": "AUDIENCE_ID"
}
}Hatalar: 401 kimlik bilgisi yok ya da süresi dolmuş · 403 kimlik bilgisinde campaigns:delete izni yok · 404 kayıt ya da modül erişim dışında · 422 geçersiz girdi (problems[]) · 409 audience_not_found, audience_in_use · 429 çok sık istek
campaigns.record_batch
Gönderilen grubu kaydet — Otomatik: hangi alıcıların göndericiye verildiği ve hangilerinin atlandığı.
Gereken izin campaigns:handle · veriyi değiştirir
403 machine_only).https://app.getera.io/api/v1/campaigns/{id}/actions/record_batch- Asıl adres:
POST /api/v1/actions/campaigns.record_batch
Girdi
| Alan | Tür | Zorunlu | Açıklama |
|---|---|---|---|
id | uuid | evet | Doldurulduğu yer: adresteki {id} · Kampanya · kimliği: campaign |
entries | object / array | evet | Kayıtlar |
Ön koşullar
Koşul tutmazsa işlem 409 ve şu kodlardan biriyle reddedilir:
| Kod | Ne zaman reddedilir |
|---|---|
campaign_not_found | Kampanya bulunmalı. |
invalid_batch | Toplu işlem bir liste olmalı. |
Yayımladığı olaylar: campaigns.batch_recorded, campaigns.sent
Neye yazar: campaign_recipient (update) — Queued or skipped; campaign (update) — Sent when nobody is left
Hatalar: 401 kimlik bilgisi yok ya da süresi dolmuş · 403 kimlik bilgisinde campaigns:handle izni yok · 404 kayıt ya da modül erişim dışında · 422 geçersiz girdi (problems[]) · 409 campaign_not_found, invalid_batch · 429 çok sık istek
campaigns.resubscribe
Abonelikten çıkanlar listesinden çıkar — Sizden yeniden haber almak isteyen biri için.
Gereken izin campaigns:manage · siler ya da geri alınamaz · Era çalıştırırken bir kişiye onaylatır
https://app.getera.io/api/v1/marketing_unsubscribes/actions/resubscribe- Asıl adres:
POST /api/v1/actions/campaigns.resubscribe
Girdi
| Alan | Tür | Zorunlu | Açıklama |
|---|---|---|---|
email | string | evet | E-posta veya telefon · en çok 320 |
Ön koşullar
Koşul tutmazsa işlem 409 ve şu kodlardan biriyle reddedilir:
| Kod | Ne zaman reddedilir |
|---|---|
unsubscribe_not_found | Adres listede olmalı. |
Yayımladığı olaylar: campaigns.resubscribed
Neye yazar: marketing_unsubscribe (delete) — Removes the address
curl -X POST https://app.getera.io/api/v1/marketing_unsubscribes/actions/resubscribe \
-H "Authorization: Bearer $ERA_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{"email":"Email or phone"}'{
"ok": true,
"result": "…",
"events": [
"campaigns.resubscribed"
]
}import { createEra } from "@getera/sdk"
const era = createEra({ apiKey: process.env.ERA_API_KEY })
const res = await era.marketingUnsubscribes.resubscribe({
email: "Email or phone"
})era marketing_unsubscribes resubscribe \
--email "Email or phone"{
"name": "era__campaigns__resubscribe",
"arguments": {
"email": "Email or phone"
}
}Hatalar: 401 kimlik bilgisi yok ya da süresi dolmuş · 403 kimlik bilgisinde campaigns:manage izni yok · 404 kayıt ya da modül erişim dışında · 422 geçersiz girdi (problems[]) · 409 unsubscribe_not_found · 429 çok sık istek
campaigns.resubscribe_me
Bana yeniden kampanya mesajı gönderilsin — Giriş yapmış müşteri, kampanya e-postalarını ve SMS’lerini site hesabından yeniden açar.
Gereken izin campaigns:write · siler ya da geri alınamaz · Yayındaki bir siteden de çağrılabilir (customer)
/api/site/v1/{siteId}, örneğin @getera/storefront ile). API anahtarı ya da token ile istek reddedilir (403 site_only).https://app.getera.io/api/v1/marketing_unsubscribes/actions/resubscribe_me- Asıl adres:
POST /api/v1/actions/campaigns.resubscribe_me
Girdi
Bu işlem girdi almaz.
Ön koşullar
Koşul tutmazsa işlem 409 ve şu kodlardan biriyle reddedilir:
| Kod | Ne zaman reddedilir |
|---|---|
no_contact_on_record | Müşterinin kaydında bir e-posta ya da telefon olmalı. |
unsubscribe_not_found | Listede böyle bir abonelikten çıkma kaydı yok. |
Yayımladığı olaylar: campaigns.resubscribed
Neye yazar: marketing_unsubscribe (delete) — Their own address off the list
Hatalar: 401 kimlik bilgisi yok ya da süresi dolmuş · 403 kimlik bilgisinde campaigns:write izni yok · 404 kayıt ya da modül erişim dışında · 422 geçersiz girdi (problems[]) · 409 no_contact_on_record, unsubscribe_not_found · 429 çok sık istek
campaigns.schedule
Zamanla veya gönder — Seçilen zamanda ya da şimdi gönderir; bildirimler üzerinden gruplar hâlinde gider.
Gereken izin campaigns:write · dışarıya ulaşır (gönderir, yayımlar ya da ücret alır) · Era çalıştırırken bir kişiye onaylatır
https://app.getera.io/api/v1/campaigns/{id}/actions/schedule- Asıl adres:
POST /api/v1/actions/campaigns.schedule
Girdi
| Alan | Tür | Zorunlu | Açıklama |
|---|---|---|---|
id | uuid | evet | Doldurulduğu yer: adresteki {id} · Kampanya · kimliği: campaign |
sendAt | date-time | Gönderim zamanı |
Ön koşullar
Koşul tutmazsa işlem 409 ve şu kodlardan biriyle reddedilir:
| Kod | Ne zaman reddedilir |
|---|---|
campaign_not_found | Kampanya bulunmalı. |
campaign_not_draft | Yalnızca taslak değiştirilir. |
campaign_incomplete | Bir mesaj (e-posta için bir konu da) gerekli; SMS en fazla 1500 karakterdir. |
campaign_no_channel | E-posta kampanyası aktif bir e-posta kanalı gerektirir. |
audience_empty | Kitle en az bir adrese ulaşmalı. |
Yayımladığı olaylar: campaigns.scheduled
Neye yazar: campaign (update) — Marks it scheduled
curl -X POST https://app.getera.io/api/v1/campaigns/CAMPAIGN_ID/actions/schedule \
-H "Authorization: Bearer $ERA_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{"sendAt":"2026-11-02T09:00:00Z"}'{
"ok": true,
"result": "…",
"events": [
"campaigns.scheduled"
]
}import { createEra } from "@getera/sdk"
const era = createEra({ apiKey: process.env.ERA_API_KEY })
const res = await era.campaigns.schedule("CAMPAIGN_ID", {
sendAt: "2026-11-02T09:00:00Z"
})era campaigns schedule CAMPAIGN_ID \
--send-at "2026-11-02T09:00:00Z"{
"name": "era__campaigns__schedule",
"arguments": {
"id": "CAMPAIGN_ID",
"sendAt": "2026-11-02T09:00:00Z"
}
}Hatalar: 401 kimlik bilgisi yok ya da süresi dolmuş · 403 kimlik bilgisinde campaigns:write izni yok · 404 kayıt ya da modül erişim dışında · 422 geçersiz girdi (problems[]) · 409 campaign_not_found, campaign_not_draft, campaign_incomplete, campaign_no_channel, audience_empty · 429 çok sık istek
campaigns.send_test
Test gönder — Kampanyanın kullanacağı e-posta kanalından tek bir adrese bir kopya — tasarlanmış e-posta gideceği gibi.
Gereken izin campaigns:write · dışarıya ulaşır (gönderir, yayımlar ya da ücret alır)
https://app.getera.io/api/v1/campaigns/{id}/actions/send_test- Asıl adres:
POST /api/v1/actions/campaigns.send_test
Girdi
| Alan | Tür | Zorunlu | Açıklama |
|---|---|---|---|
id | uuid | evet | Doldurulduğu yer: adresteki {id} · Kampanya · kimliği: campaign |
to | string | evet | Gönderilecek adres · en çok 320 |
variant | string (enum) | Konu · İzin verilen değerler: a, b |
Ön koşullar
Koşul tutmazsa işlem 409 ve şu kodlardan biriyle reddedilir:
| Kod | Ne zaman reddedilir |
|---|---|
campaign_not_found | Kampanya bulunmalı. |
invalid_recipient | Adres bir e-posta adresi olmalı. |
Yayımladığı olaylar: campaigns.test_requested
Neye yazar: campaign (update) — Stamps when a test last went
curl -X POST https://app.getera.io/api/v1/campaigns/CAMPAIGN_ID/actions/send_test \
-H "Authorization: Bearer $ERA_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{"to":"Send to"}'{
"ok": true,
"result": "…",
"events": [
"campaigns.test_requested"
]
}import { createEra } from "@getera/sdk"
const era = createEra({ apiKey: process.env.ERA_API_KEY })
const res = await era.campaigns.sendTest("CAMPAIGN_ID", {
to: "Send to"
})era campaigns send_test CAMPAIGN_ID \
--to "Send to"{
"name": "era__campaigns__send_test",
"arguments": {
"id": "CAMPAIGN_ID",
"to": "Send to"
}
}Hatalar: 401 kimlik bilgisi yok ya da süresi dolmuş · 403 kimlik bilgisinde campaigns:write izni yok · 404 kayıt ya da modül erişim dışında · 422 geçersiz girdi (problems[]) · 409 campaign_not_found, invalid_recipient · 429 çok sık istek
campaigns.start
Zamanı gelen kampanyayı başlat — Otomatik: alıcıları listeler, izlenecek bağlantıları kaydeder ve göndermeye başlar.
Gereken izin campaigns:handle · veriyi değiştirir
403 machine_only).https://app.getera.io/api/v1/campaigns/{id}/actions/start- Asıl adres:
POST /api/v1/actions/campaigns.start
Girdi
| Alan | Tür | Zorunlu | Açıklama |
|---|---|---|---|
id | uuid | evet | Doldurulduğu yer: adresteki {id} · Kampanya · kimliği: campaign |
Ön koşullar
Koşul tutmazsa işlem 409 ve şu kodlardan biriyle reddedilir:
| Kod | Ne zaman reddedilir |
|---|---|
campaign_not_found | Kampanya bulunmalı. |
campaign_not_due | Yalnızca zamanı gelmiş zamanlanmış bir kampanya başlar. |
Yayımladığı olaylar: campaigns.started, campaigns.sent
Neye yazar: campaign_recipient (insert) — One row per address; campaign_link (insert) — One row per link in the email, for click tracking; campaign (update) — Marks it sending
Hatalar: 401 kimlik bilgisi yok ya da süresi dolmuş · 403 kimlik bilgisinde campaigns:handle izni yok · 404 kayıt ya da modül erişim dışında · 422 geçersiz girdi (problems[]) · 409 campaign_not_found, campaign_not_due · 429 çok sık istek
campaigns.unschedule
Taslağa geri al — Zamanlanmış kampanyayı başlamadan önce taslağa geri alır.
Gereken izin campaigns:write · veriyi değiştirir
https://app.getera.io/api/v1/campaigns/{id}/actions/unschedule- Asıl adres:
POST /api/v1/actions/campaigns.unschedule
Girdi
| Alan | Tür | Zorunlu | Açıklama |
|---|---|---|---|
id | uuid | evet | Doldurulduğu yer: adresteki {id} · Kampanya · kimliği: campaign |
Ön koşullar
Koşul tutmazsa işlem 409 ve şu kodlardan biriyle reddedilir:
| Kod | Ne zaman reddedilir |
|---|---|
campaign_not_found | Kampanya bulunmalı. |
campaign_not_scheduled | Yalnızca zamanlanmış bir kampanyanın zamanlaması kaldırılır. |
Yayımladığı olaylar: campaigns.updated
Neye yazar: campaign (update) — Back to draft
curl -X POST https://app.getera.io/api/v1/campaigns/CAMPAIGN_ID/actions/unschedule \
-H "Authorization: Bearer $ERA_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{}'{
"ok": true,
"result": "…",
"events": [
"campaigns.updated"
]
}import { createEra } from "@getera/sdk"
const era = createEra({ apiKey: process.env.ERA_API_KEY })
const res = await era.campaigns.unschedule("CAMPAIGN_ID")era campaigns unschedule CAMPAIGN_ID{
"name": "era__campaigns__unschedule",
"arguments": {
"id": "CAMPAIGN_ID"
}
}Hatalar: 401 kimlik bilgisi yok ya da süresi dolmuş · 403 kimlik bilgisinde campaigns:write izni yok · 404 kayıt ya da modül erişim dışında · 422 geçersiz girdi (problems[]) · 409 campaign_not_found, campaign_not_scheduled · 429 çok sık istek
campaigns.unsubscribe
Adresin aboneliğini iptal et — Bir adresi veya telefon numarasını abonelikten çıkanlar listesine koyar — mesajın bağlantısından ya da talep üzerine bir üye tarafından.
Gereken izin campaigns:write · veriyi değiştirir · Yayındaki bir siteden de çağrılabilir (visitor)
/api/site/v1/{siteId}, örneğin @getera/storefront ile). API anahtarı ya da token ile istek reddedilir (403 site_only).https://app.getera.io/api/v1/marketing_unsubscribes/actions/unsubscribe- Asıl adres:
POST /api/v1/actions/campaigns.unsubscribe
Girdi
| Alan | Tür | Zorunlu | Açıklama |
|---|---|---|---|
token | string | Bağlantı anahtarı · en çok 100 | |
email | string | E-posta · en çok 320 | |
phone | string | Telefon · en çok 40 | |
reason | string | Neden · en çok 1000 |
Ön koşullar
Koşul tutmazsa işlem 409 ve şu kodlardan biriyle reddedilir:
| Kod | Ne zaman reddedilir |
|---|---|
unsubscribe_link_invalid | Bağlantı anahtarı bu çalışma alanının gönderdiği bir anahtar olmalı. |
unsubscribe_link_required | Siteden abonelikten çıkmak yalnızca mesajdaki bağlantıyla yapılabilir. |
invalid_recipient | Adres bir e-posta adresi veya telefon numarası olmalı. |
Yayımladığı olaylar: campaigns.unsubscribed
Neye yazar: marketing_unsubscribe (insert) — Adds the address to the list
Hatalar: 401 kimlik bilgisi yok ya da süresi dolmuş · 403 kimlik bilgisinde campaigns:write izni yok · 404 kayıt ya da modül erişim dışında · 422 geçersiz girdi (problems[]) · 409 unsubscribe_link_invalid, unsubscribe_link_required, invalid_recipient · 429 çok sık istek
campaigns.unsubscribe_me
Bana kampanya mesajı gönderilmesin — Giriş yapmış müşteri, kampanya e-postalarını ve SMS’lerini site hesabından kapatır.
Gereken izin campaigns:write · veriyi değiştirir · Yayındaki bir siteden de çağrılabilir (customer)
/api/site/v1/{siteId}, örneğin @getera/storefront ile). API anahtarı ya da token ile istek reddedilir (403 site_only).https://app.getera.io/api/v1/marketing_unsubscribes/actions/unsubscribe_me- Asıl adres:
POST /api/v1/actions/campaigns.unsubscribe_me
Girdi
Bu işlem girdi almaz.
Ön koşullar
Koşul tutmazsa işlem 409 ve şu kodlardan biriyle reddedilir:
| Kod | Ne zaman reddedilir |
|---|---|
no_contact_on_record | Müşterinin kaydında bir e-posta ya da telefon olmalı. |
already_unsubscribed | Zaten abonelikten çıkılmış. |
Yayımladığı olaylar: campaigns.unsubscribed
Neye yazar: marketing_unsubscribe (insert) — Their own address on the list
Hatalar: 401 kimlik bilgisi yok ya da süresi dolmuş · 403 kimlik bilgisinde campaigns:write izni yok · 404 kayıt ya da modül erişim dışında · 422 geçersiz girdi (problems[]) · 409 no_contact_on_record, already_unsubscribed · 429 çok sık istek
campaigns.update
Kampanyayı düzenle — Taslağın adını, kanalını, konusunu, mesajını, e-posta bloklarını veya kitlesini değiştirir.
Gereken izin campaigns:write · veriyi değiştirir
https://app.getera.io/api/v1/campaigns/{id}/actions/update- REST kısayolu:
PATCH /api/v1/campaigns/{id} - Asıl adres:
POST /api/v1/actions/campaigns.update
Girdi
| Alan | Tür | Zorunlu | Açıklama |
|---|---|---|---|
id | uuid | evet | Doldurulduğu yer: adresteki {id} · Kampanya · kimliği: campaign |
name | string | Ad · en çok 200 | |
channel | string (enum) | Gönderme yolu · İzin verilen değerler: email, sms, whatsapp | |
format | string (enum) | Biçim · İzin verilen değerler: text, html | |
subject | string | Konu · en çok 300 | |
subjectB | string | Konu B (A/B testi) · en çok 300 | |
preheader | string | Önizleme satırı · en çok 200 | |
body | string | Mesaj · en çok 20000 | |
blocks | object / array | E-posta blokları | |
audienceId | uuid | Kitle · kimliği: audience |
Ön koşullar
Koşul tutmazsa işlem 409 ve şu kodlardan biriyle reddedilir:
| Kod | Ne zaman reddedilir |
|---|---|
campaign_not_found | Kampanya bulunmalı. |
campaign_not_draft | Yalnızca taslak değiştirilir. |
audience_not_found | Kitle bulunmalı. |
invalid_campaign_blocks | E-posta düzeni, geçerli bağlantılar içeren bilinen bloklardan oluşan bir liste olmalı. |
Yayımladığı olaylar: campaigns.updated
Neye yazar: campaign (update) — Rewrites the draft
curl -X POST https://app.getera.io/api/v1/campaigns/CAMPAIGN_ID/actions/update \
-H "Authorization: Bearer $ERA_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{"name":"Name"}'{
"ok": true,
"result": "…",
"events": [
"campaigns.updated"
]
}import { createEra } from "@getera/sdk"
const era = createEra({ apiKey: process.env.ERA_API_KEY })
const res = await era.campaigns.update("CAMPAIGN_ID", {
name: "Name"
})era campaigns update CAMPAIGN_ID \
--name "Name"{
"name": "era__campaigns__update",
"arguments": {
"id": "CAMPAIGN_ID",
"name": "Name"
}
}Hatalar: 401 kimlik bilgisi yok ya da süresi dolmuş · 403 kimlik bilgisinde campaigns:write izni yok · 404 kayıt ya da modül erişim dışında · 422 geçersiz girdi (problems[]) · 409 campaign_not_found, campaign_not_draft, audience_not_found, invalid_campaign_blocks · 429 çok sık istek
campaigns.update_audience
Kitleyi düzenle — Segmentin adını veya kurallarını değiştirir. Gönderilmiş kampanyalar kime gönderildiğini korur.
Gereken izin campaigns:write · veriyi değiştirir
https://app.getera.io/api/v1/audiences/{id}/actions/update_audience- REST kısayolu:
PATCH /api/v1/audiences/{id} - Asıl adres:
POST /api/v1/actions/campaigns.update_audience
Girdi
| Alan | Tür | Zorunlu | Açıklama |
|---|---|---|---|
id | uuid | evet | Doldurulduğu yer: adresteki {id} · Kitle · kimliği: audience |
name | string | Ad · en çok 200 | |
description | string | Açıklama · en çok 2000 | |
match | string (enum) | Eşleşme · İzin verilen değerler: all, any | |
rules | object / array | Kurallar |
Ön koşullar
Koşul tutmazsa işlem 409 ve şu kodlardan biriyle reddedilir:
| Kod | Ne zaman reddedilir |
|---|---|
audience_not_found | Kitle bulunmalı. |
invalid_audience_rules | Her kural bilinen bir alan, işleç ve değer gerektirir. |
Yayımladığı olaylar: campaigns.audience_changed
Neye yazar: audience (update) — Rewrites the segment
curl -X POST https://app.getera.io/api/v1/audiences/AUDIENCE_ID/actions/update_audience \
-H "Authorization: Bearer $ERA_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{"name":"Name"}'{
"ok": true,
"result": "…",
"events": [
"campaigns.audience_changed"
]
}import { createEra } from "@getera/sdk"
const era = createEra({ apiKey: process.env.ERA_API_KEY })
const res = await era.audiences.updateAudience("AUDIENCE_ID", {
name: "Name"
})era audiences update_audience AUDIENCE_ID \
--name "Name"{
"name": "era__campaigns__update_audience",
"arguments": {
"id": "AUDIENCE_ID",
"name": "Name"
}
}Hatalar: 401 kimlik bilgisi yok ya da süresi dolmuş · 403 kimlik bilgisinde campaigns:write izni yok · 404 kayıt ya da modül erişim dışında · 422 geçersiz girdi (problems[]) · 409 audience_not_found, invalid_audience_rules · 429 çok sık istek
Veri modelleri
AudienceFact
Tablo audience_fact · Kaynak audience_facts
GET /api/v1/audience_factsGET /api/v1/audience_facts/{id}
| Sütun | Tür | Boş olabilir | İzin verilen değerler | Bağlı olduğu tablo |
|---|---|---|---|---|
id | string (uuid) · uuid | |||
organization_id | string (uuid) · uuid | organization | ||
workspace_id | string (uuid) · uuid | workspace | ||
customer_id | string (uuid) · uuid | customer | ||
kind | string · text | order, visit, package | ||
source_id | string · text | |||
state | string · text | open, done, cancelled | ||
occurred_on | string (date) · date | evet | ||
active_until | string (date) · date | evet | ||
amount | string (int64) · int8 | |||
currency | string · bpchar | evet | en çok 3 | |
event_id | string (int64) · int8 | evet | ||
updated_at | string (date-time) · timestamptz |
Birincil anahtar: id
Tekil: workspace_id, kind, source_id
Denetimler:
CHECK ((amount >= 0))CHECK (((currency IS NULL) OR (currency ~ '^[A-Z]{3}$'::text)))
Audience
Tablo audience · Kaynak audiences
GET /api/v1/audiencesGET /api/v1/audiences/{id}POST /api/v1/audiences→campaigns.create_audiencePATCH /api/v1/audiences/{id}→campaigns.update_audienceDELETE /api/v1/audiences/{id}→campaigns.delete_audience
| Sütun | Tür | Boş olabilir | İzin verilen değerler | Bağlı olduğu tablo |
|---|---|---|---|---|
id | string (uuid) · uuid | |||
organization_id | string (uuid) · uuid | organization | ||
workspace_id | string (uuid) · uuid | workspace | ||
name | string · text | |||
description | string · text | evet | ||
match | string · text | all, any | ||
rules | object · jsonb | |||
created_by_user_id | string (uuid) · uuid | evet | app_user | |
created_at | string (date-time) · timestamptz | |||
updated_at | string (date-time) · timestamptz |
Birincil anahtar: id
Denetimler:
CHECK ((length(TRIM(BOTH FROM name)) > 0))CHECK ((jsonb_typeof(rules) = 'array'::text))
CampaignClick
Tablo campaign_click · Kaynak campaign_clicks
GET /api/v1/campaign_clicksGET /api/v1/campaign_clicks/{id}
| Sütun | Tür | Boş olabilir | İzin verilen değerler | Bağlı olduğu tablo |
|---|---|---|---|---|
id | string (uuid) · uuid | |||
organization_id | string (uuid) · uuid | organization | ||
workspace_id | string (uuid) · uuid | workspace | ||
campaign_id | string (uuid) · uuid | campaign | ||
link_id | string (uuid) · uuid | campaign_link | ||
recipient_id | string (uuid) · uuid | evet | campaign_recipient | |
occurred_at | string (date-time) · timestamptz |
Birincil anahtar: id
CampaignLink
Tablo campaign_link · Kaynak campaign_links
GET /api/v1/campaign_linksGET /api/v1/campaign_links/{id}
| Sütun | Tür | Boş olabilir | İzin verilen değerler | Bağlı olduğu tablo |
|---|---|---|---|---|
id | string (uuid) · uuid | |||
organization_id | string (uuid) · uuid | organization | ||
workspace_id | string (uuid) · uuid | workspace | ||
campaign_id | string (uuid) · uuid | campaign | ||
url | string · text | |||
created_at | string (date-time) · timestamptz |
Birincil anahtar: id
Tekil: campaign_id, url
Denetimler:
CHECK ((url ~* '^(https?://\|mailto:\|tel:)'::text))
CampaignRecipient
Tablo campaign_recipient · Kaynak campaign_recipients
GET /api/v1/campaign_recipientsGET /api/v1/campaign_recipients/{id}
| Sütun | Tür | Boş olabilir | İzin verilen değerler | Bağlı olduğu tablo |
|---|---|---|---|---|
id | string (uuid) · uuid | |||
organization_id | string (uuid) · uuid | organization | ||
workspace_id | string (uuid) · uuid | workspace | ||
campaign_id | string (uuid) · uuid | campaign | ||
customer_id | string (uuid) · uuid | evet | customer | |
email | string · text | evet | ||
name | string · text | evet | ||
state | string · text | pending, queued, skipped | ||
skip_reason | string · text | evet | ||
delivery_id | string (uuid) · uuid | evet | notification_delivery | |
queued_at | string (date-time) · timestamptz | evet | ||
created_at | string (date-time) · timestamptz | |||
phone | string · text | evet | ||
variant | string · bpchar | a, b | ||
opened_at | string (date-time) · timestamptz | evet | ||
open_count | integer · int4 | |||
clicked_at | string (date-time) · timestamptz | evet | ||
click_count | integer · int4 |
Birincil anahtar: id
Tekil: campaign_id, email
Denetimler:
CHECK (((email IS NOT NULL) OR (phone IS NOT NULL)))
Campaign
Tablo campaign · Kaynak campaigns
GET /api/v1/campaignsGET /api/v1/campaigns/{id}POST /api/v1/campaigns→campaigns.createPATCH /api/v1/campaigns/{id}→campaigns.updateDELETE /api/v1/campaigns/{id}→campaigns.delete
| Sütun | Tür | Boş olabilir | İzin verilen değerler | Bağlı olduğu tablo |
|---|---|---|---|---|
id | string (uuid) · uuid | |||
organization_id | string (uuid) · uuid | organization | ||
workspace_id | string (uuid) · uuid | workspace | ||
name | string · text | |||
subject | string · text | |||
body | string · text | |||
audience_id | string (uuid) · uuid | audience | ||
status | string · text | draft, scheduled, sending, sent, cancelled | ||
scheduled_at | string (date-time) · timestamptz | evet | ||
started_at | string (date-time) · timestamptz | evet | ||
completed_at | string (date-time) · timestamptz | evet | ||
cancelled_at | string (date-time) · timestamptz | evet | ||
recipient_count | integer · int4 | |||
test_sent_at | string (date-time) · timestamptz | evet | ||
created_by_user_id | string (uuid) · uuid | evet | app_user | |
created_at | string (date-time) · timestamptz | |||
updated_at | string (date-time) · timestamptz | |||
channel | string · text | email, sms, whatsapp | ||
format | string · text | text, html | ||
blocks | object · jsonb | |||
preheader | string · text | evet | ||
subject_b | string · text | evet |
Birincil anahtar: id
Denetimler:
CHECK ((jsonb_typeof(blocks) = 'array'::text))CHECK ((length(TRIM(BOTH FROM name)) > 0))CHECK (((status <> 'scheduled'::text) OR (scheduled_at IS NOT NULL)))
MarketingUnsubscribe
Tablo marketing_unsubscribe · Kaynak marketing_unsubscribes
GET /api/v1/marketing_unsubscribesGET /api/v1/marketing_unsubscribes/{id}
| Sütun | Tür | Boş olabilir | İzin verilen değerler | Bağlı olduğu tablo |
|---|---|---|---|---|
id | string (uuid) · uuid | |||
organization_id | string (uuid) · uuid | organization | ||
workspace_id | string (uuid) · uuid | workspace | ||
email | string · text | evet | ||
customer_id | string (uuid) · uuid | evet | customer | |
campaign_id | string (uuid) · uuid | evet | campaign | |
source | string · text | link, manual | ||
reason | string · text | evet | ||
created_by_user_id | string (uuid) · uuid | evet | app_user | |
created_at | string (date-time) · timestamptz | |||
phone | string · text | evet |
Birincil anahtar: id
Tekil: workspace_id, email
Denetimler:
CHECK (((email IS NOT NULL) OR (phone IS NOT NULL)))CHECK ((email = lower(email)))
Olaylar
İş akışları ve webhook'lar bu olaylara tepki verir.
| Olay | Ne olur | Taşıdığı alanlar |
|---|---|---|
campaigns.audience_changed | Bir kitle oluşturuldu, düzenlendi ya da silindi. | id |
campaigns.batch_recorded | Bir kampanyanın bir gönderim partisi gönderim servisine iletildi. | id, handled, pending |
campaigns.cancelled | Bir kampanya durduruldu. | id, notSent, ownerUserId |
campaigns.created | Bir kampanya taslağı hazırlandı. | id, ownerUserId |
campaigns.deleted | Taslak bir kampanya silindi. | id |
campaigns.resubscribed | Bir adres yeniden abone oldu. | email, customerId |
campaigns.scheduled | Bir kampanya zamanlandı. | id, scheduledAt, audienceSize, ownerUserId |
campaigns.sent | Bir kampanya tüm alıcılar için gönderim servisine iletildi. | id, recipientCount, ownerUserId |
campaigns.started | Bir kampanya gönderilmeye başladı. | id, recipientCount |
campaigns.test_requested | Bir test kopyası istendi; bildirimler teslim eder. | id, to, subject, text, html, sourceId |
campaigns.unsubscribed | Bir adres abonelikten çıktı. | email, phone, customerId, campaignId, source |
campaigns.updated | Taslak bir kampanya düzenlendi ya da zamanlaması kaldırıldı. | id |