UPPU API'sine başlangıç
UPPU API v1 ile kendi sistemleriniz WhatsApp, Messenger, Instagram, Telegram ve web sohbeti mesajlarını UPPU üzerinden gönderir ve alır. Kodunuz yalnızca UPPU ile konuşur: mesajlaşma ağlarıyla UPPU konuşur, yanıt penceresini ve izin kurallarını UPPU uygular, her olayı size imzalı bir webhook olarak gönderir.
Bu rehber ilk anahtardan canlıya geçişe kadar yol gösterir. API başvurusu her ucu ve alanı, webhook sayfası her olayı listeler; kod örnekleri sık yapılan işleri PHP, Node.js, Python ve C# ile gösterir.
Ortamlar
| Canlı | Sahne | |
|---|---|---|
| Taban adres | https://messaging.uppu.net/v1 |
https://messaging-staging.uppu.net/v1 |
| Anahtar öneki | uppu_live_ |
uppu_test_ |
| Simüle WhatsApp kanalı | yok | var |
- Anahtar yalnızca kendi ortamında çalışır. Canlıya gönderilen sahne anahtarı ya da tersi
401 wrong_environmentalır. - API'yi yalnızca kendi sunucularınızdan çağırın.
Originbaşlığı taşıyan istek (tarayıcı)403 browser_request_refusedalır; CORS başlığı gönderilmez. Anahtarı asla bir web sayfasına ya da mobil uygulamaya koymayın. - İstekler ve yanıtlar UTF-8 JSON'dur. İstek gövdesi en çok 1 MB, yüklenen dosya en çok 25 MB'tır.
- Makinenin okuyacağı tanım
GET /v1/openapi.jsonadresindeki OpenAPI belgesidir (anahtar gerekmez). API başvurusu aynı belgeyi sayfa olarak gösterir.
Başlamadan önce
- Firmanızın paketinde API vardır. Paketi UPPU belirler. Paketinde API olmayan firmada her istek
403 api_disabledalır,details.reasonnot_in_planolur; olay da gönderilmez. UPPU'daki muhatabınıza yazın. - Bir kanal bağlıdır (WhatsApp, Messenger, Instagram, Telegram ya da web sohbeti). Kendi sisteminizin yanıtladığı kanalda firma sahibi kanallar sayfasında kanalın Yönetim ayarını Harici sistem (API) yapar: ekibin gelen kutusu bu kanalın konuşmalarını kendiliğinden atamaz, temsilciler yine okuyup yanıt verebilir.
- Firma sahibi bir anahtar oluşturur: UPPU panelinde firmanın ayarları, ardından Geliştiriciler. Anahtarları ve webhook'ları yalnızca firma sahibi, parolasını onaylayarak yönetir.
API anahtarları
- Biçim:
uppu_live_(ya dauppu_test_), 12 karakterlik önek,_ve 43 karakterlik sır. Panel anahtarın tamamını yalnızca bir kez, oluşturulurken gösterir. Anahtarı sır kasanızda saklayın, hiçbir kayda yazmayın; UPPU sonradan yalnızca öneki gösterir. - Başlık: her istek
Authorization: Bearer <anahtar>taşır. - Seçenekler: ad ve yazar etiketi (gelen kutusu mesajlarınızı "API · etiket" olarak gösterir), kapsamlar, tek kanal ya da bütün kanallar, isteğe bağlı izinli IP aralıkları (CIDR) ve isteğe bağlı bitiş tarihi.
- Kanala bağlama: tek kanala bağlı anahtar yalnızca o kanalı görür. Başka bir kanalın ya da firmanın kimliği
404 not_foundalır: kimlikler yoklanamaz. - Yenileme: "Yenile" aynı ayarlarla yeni bir anahtar oluşturur; eski anahtar bir geçiş süresi boyunca (varsayılan 24 saat, en çok 7 gün) çalışmaya devam eder. Yeni anahtarı dağıtın, eskisinin süresinin dolmasını bekleyin.
- İptal sonraki istekte geçerlidir. Firma sahibi etkin bir anahtarın kapsamlarını ve kanalını sırrını değiştirmeden de değiştirebilir.
- UPPU 90 gündür kullanılmayan anahtar için firma sahibine e-posta gönderir; anahtarı hiçbir zaman kendiliğinden iptal etmez.
Kapsamlar
Anahtar kapsamlar taşır (panelde "Yetkiler"). Panel üç hazır seçim sunar; "özel" kapsamları tek tek seçtirir. Eksik kapsam 403 insufficient_scope alır, details.required gereken kapsamı söyler.
| Kapsam | İzin verdiği | Uç noktalar | Bot | Bildirim gönderici | Salt okuma |
|---|---|---|---|---|---|
| Her anahtar | Anahtarın kanallarını okur | GET /v1/channelsGET /v1/channels/{id} | evet | evet | evet |
messages:send | Mesaj, okundu bildirimi ve yazıyor göstergesi gönderme | POST /v1/conversations/{id}/typingPOST /v1/messagesPOST /v1/messages/{id}/read | evet | evet | — |
messages:read | Mesajları ve konuşmaları okuma | GET /v1/conversationsGET /v1/conversations/{id}GET /v1/messagesGET /v1/messages/{id} | evet | evet | evet |
conversations:write | Konuşmaları çözme ve devretme | POST /v1/conversations/{id}/handoverPOST /v1/conversations/{id}/releasePOST /v1/conversations/{id}/resolve | evet | — | — |
media:write | Medya yükleme | POST /v1/media | evet | evet | — |
media:read | Medya indirme | GET /v1/media/{id}GET /v1/media/{id}/contentPOST /v1/media/{id}/link | evet | — | evet |
templates:read | Şablonları okuma | GET /v1/templatesGET /v1/templates/{id} | evet | evet | evet |
contacts:read | Kişileri arama ve okuma | GET /v1/contacts/{id}GET /v1/contacts/{id}/consentsPOST /v1/contacts/lookup | evet | evet | evet |
consents:write | İzin kaydetme | POST /v1/consents | — | evet | — |
events:read | Olayları okuma | GET /v1/events | — | evet | evet |
webhooks:manage | Webhook uç noktalarını yönet | DELETE /v1/webhook-endpoints/{id}GET /v1/webhook-endpointsGET /v1/webhook-endpoints/{id}PATCH /v1/webhook-endpoints/{id}POST /v1/webhook-endpointsPOST /v1/webhook-endpoints/{id}/activatePOST /v1/webhook-endpoints/{id}/disablePOST /v1/webhook-endpoints/{id}/probePOST /v1/webhook-endpoints/{id}/secretPOST /v1/webhook-endpoints/{id}/test | — | — | — |
reports:read | Raporları okuma | GET /v1/reports/dailyGET /v1/reports/summary | — | — | — |
templates:write | WhatsApp şablonlarını oluşturma ve silme | DELETE /v1/templates/{id}POST /v1/templates | — | — | — |
Simülatörün uçları (/v1/sandbox/...) yalnızca sahnede vardır ve messages:send ister; /v1/sandbox/action-target ise anahtar istemez (aşağıda, sahne simülatörü).
Sahne simülatörü
Sahnede firma sahibi Geliştiriciler sayfasından en çok üç simüle WhatsApp kanalı ekleyebilir. Simüle kanal API'de ve webhook'larda gerçek bir WhatsApp kanalı gibi davranır (yanıt penceresi, izin kuralları, tekrar anahtarı, durumlar, medya, olaylar), ama Meta'ya hiçbir şey gitmez: durumlar birkaç saniye arayla message.status olayı olarak gelir. Simüle kanala bağlı, Bot hazır seçimli bir test anahtarı oluşturun.
Sihirli alıcılar. Kişinin telefon numarasının son iki hanesi, gönderdiğiniz mesajın sonucunu seçer:
| Son iki hane | Sonuç |
|---|---|
| diğerleri | accepted, sent, delivered, read |
01 |
accepted, sent, delivered (okunmaz) |
02 |
accepted, sent (teslim bildirimi gelmez) |
03 |
accepted, sonra failed, recipient_unreachable |
04 |
accepted, sonra failed, window_closed |
05 |
accepted, sonra failed, marketing_opt_out (UPPU geri çekmeyi kaydeder) |
06 |
accepted, sonra failed, payment_required |
07 |
hemen reddedilir: failed, invalid_parameter |
08 |
hız sınırı: UPPU 10, 60 ve 300 saniye sonra yeniden dener, sonra failed, provider_rate_limited |
09 |
yanıt yok: unknown, sonra delivered |
Denemelerde kurgu için ayrılmış numaralar kullanın, örneğin +447700900100. ttl açıldıktan sonra 08'e kısa bir ttl ile (örneğin 30 saniye) gönderilen mesaj daha erken biter: ttl dolunca UPPU yeniden denemeyi bırakır ve mesaj expired değil, provider_rate_limited ile failed olur, çünkü ağ hatayla yanıt vermiştir.
Şablon seti (hepsi tr dilinde): uppu_sim_order_update (UTILITY, iki sıralı gövde parametresi), uppu_sim_appointment (UTILITY, adlı customer_name ve appointment_time, iki hızlı yanıt düğmesi), uppu_sim_payment (UTILITY, değişkenli metin başlık), uppu_sim_campaign (MARKETING: kayıtlı izin ister), uppu_sim_login_code (AUTHENTICATION: her zaman reddedilir) ve uppu_sim_pending (onaylanmamış).
Simülatörün uçları (test anahtarı, messages:send):
POST /v1/sandbox/inbound: bir kişiden mesaj; içerik, gelen mesajın içeriği biçiminde. Simüle kanalflowlistelediği süreceflow_reply({"response": {…}}, akış mesajınızıncontext.message_id'siyle) kişinin formunuzu tamamlamasını simüle eder.POST /v1/sandbox/statuses: mesajlarınızdan biri için teslim durumu.POST /v1/sandbox/identity-rotation: kişinin WhatsApp kullanıcı kimliği değişir.POST /v1/sandbox/contacts/{id}/close-window: kişinin son mesajını 25 saat geriye alır, yanıt penceresi kapanır.POST /v1/sandbox/channels/{id}/health: simüle kanalın sağlığıgreen,amberya daredolur; gerçek kanalınchannel.health_changedolayıyla.POST /v1/sandbox/templates/{id}/status: simüle şablonAPPROVED,PENDING,REJECTED,PAUSEDya daDISABLEDolur; gerçek şablonuntemplate.updatedolayıyla.
Simüle trafik firmanın kullanımında sayılmaz. UPPU simüle kanalların verisini istek üzerine siler; gerçek kanallara hiç dokunulmaz.
/v1/sandbox/action-target sizin çağırdığınız API'nin parçası değildir: sahnede UPPU Bot'un eylemleri firmanın kendi API'si yerine onu çağırır. Anahtar istemez, istemci adresi başına sınırlıdır; başvuru onu anlatır.
Canlıda /v1/sandbox yolları yoktur.
İlk mesajınız
Adımlar sahnede ve curl ile. Önce anahtarı ortama koyun:
export UPPU_API_BASE=https://messaging-staging.uppu.net/v1
export UPPU_API_KEY=uppu_test_...
1. Kanalınızı bulun. Simüle kanalın id'sini not edin.
curl -s "$UPPU_API_BASE/channels" -H "Authorization: Bearer $UPPU_API_KEY"
2. Bir kişi size yazsın. WhatsApp serbest mesaja yalnızca kişinin son mesajından sonraki 24 saat içinde izin verir; bu yüzden bir mesaj simüle edin. Yanıt bir sandbox_event'tir; contact_id o kişidir.
curl -s -X POST "$UPPU_API_BASE/sandbox/inbound" \
-H "Authorization: Bearer $UPPU_API_KEY" \
-H "Content-Type: application/json" \
-d '{"channel_id": "<kanal kimliği>", "from": {"phone": "+447700900100", "name": "Deniz"}, "content": {"type": "text", "text": {"body": "Merhaba"}}}'
3. Yanıt verin. Her gönderim bir Idempotency-Key taşır: bu gönderimin her yeniden denemesinde aynı anahtar kullanılır, böylece yeniden deneme hiçbir zaman ikinci mesaj göndermez.
curl -s -X POST "$UPPU_API_BASE/messages" \
-H "Authorization: Bearer $UPPU_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: ticket-42-reply-1" \
-d '{"channel_id": "<kanal kimliği>", "to": {"contact_id": "<kişi kimliği>"}, "content": {"type": "text", "text": {"body": "Teşekkürler, ilgileniyoruz."}}, "client_reference": "ticket-42"}'
Yanıt 202 ve mesajdır, status queued.
4. Durumu izleyin. GET /v1/messages/{id} mesajın accepted, sent, delivered ve read olarak ilerlediğini gösterir; webhook uç noktanız varsa aynı adımlar message.status olayı olarak gelir.
curl -s "$UPPU_API_BASE/messages/<mesaj kimliği>" -H "Authorization: Bearer $UPPU_API_KEY"
5. Şablon gönderin. Onaylı şablon 24 saatlik pencerenin dışında da gider:
{
"channel_id": "<kanal kimliği>",
"to": {"contact_id": "<kişi kimliği>"},
"content": {
"type": "template",
"template": {"name": "uppu_sim_order_update", "language": "tr", "body": {"parameters": ["Deniz", "A-1001"]}}
},
"client_reference": "order-A-1001"
}
Mesaj gönderme
POST /v1/messages her türden mesajı gönderir; bir kanalın neyi kabul ettiğini GET /v1/channels söyler (capabilities.content_types, capabilities.limits).
- Alıcı (
to): tam olarak biri:contact_id(önerilen),phone(+ile E.164, yalnızca WhatsApp; bilinmeyen numara yeni kişi olur) ya daidentity, kanalda zaten var olan bir kimlik (bsuid,psid,igsid,web_visitor,telegram). Kişiyi telefonlaPOST /v1/contacts/lookupile bulun: kişisel veri hiçbir zaman adrese girmez. - İçerik:
text,interactive(düğmeler, liste, hızlı yanıtlar),image,video,audio,document(POST /v1/media'dan gelenmedia_idile ya da UPPU'nun indirdiği birhttpsbağlantısıyla),reaction,locationve WhatsApp'tatemplate. WhatsApp ve Telegram'da ayrıcasticker(POST /v1/media'yakind=stickerform alanıyla yüklenen 512×512 bir WebP,media_idile; durağan en çok 100 KB, hareketli en çok 500 KB, Telegram'da yalnızca durağan) vecontacts(gelen kişi kartının şeklinde kartlar: ad ve en az bir telefon numarası ya da e-posta adresi; Telegram tek kart ve tek telefon alır). WhatsApp ve Messenger'dainteractiveayrıcacta_urlalır: birhttpsadresini kişinin tarayıcısında açan tek düğme ("cta_url": {"display_text": "…", "url": "…"}; düğmenin metni en çok 20 karakter, adres yazıldığı gibi gider ve yalnızca web adresinin karakterlerinden oluşur: boşluğu%20olarak kodlayın). WhatsApp'taflow, WhatsApp hesabınızda yayınladığınız bir WhatsApp Flows formunu açar ("flow": {"flow_id": "…", "flow_cta": "…"}; yalnızca navigate akışları), kanalcapabilities.interactive_types'taflowlistelediğinde; kişinin tamamladığı formmessage.received'da, mesajınızınflow_token'ıylaflow_replyolarak döner. client_reference: kendi referansınız (en çok 64 karakter, kişisel veri değil). Mesajda ve hermessage.statusolayında geri gelir.ttl(isteğe bağlı): mesajın ömrü, 10 ile 86400 arasında tam saniye. UPPU mesajı bu süre içinde WhatsApp'a, Messenger'a, Instagram'a ya da Telegram'a veremediyse (kuyrukta, hız sınırında ya da yeniden denemede bekledi ya da kanal gönderemedi) mesaj gönderilmez:statusexpired,error.codettl_expiredve birmessage.statusolayı. Önceki bir deneme ağa ulaştıysa ve ağ hatayla yanıt verdiyse (örneğin hız sınırı),ttldolunca UPPU yeniden denemeyi bırakır ve mesaj bunun yerine o hataylafailedbiter (örneğinprovider_rate_limited). Sağlayıcıya verilmiş mesaj asla geri alınmaz; web sohbetinde mesaj hemen iletilir,ttlorada bir şey değiştirmez. Alan UPPU onu açınca çalışır; o zamana kadar422 validation_failed(unknown_field) alır.- Yanıt:
202ve mesaj (statusqueued). Sonra durumlar:accepted,sent,delivered,readya dafailed(birttldolduysaexpired); her kanal bunların yalnızca bir kısmını bildirir (capabilities.delivery_statuses).unknown, UPPU'nun ağın mesajı alıp almadığını doğrulayamadığı anlamına gelir: bu mesajı asla kendiliğinden yeniden göndermeyin. - Okundu bildirimi:
POST /v1/messages/{id}/readkişinin bir WhatsApp mesajını okundu yapar. - Yazıyor göstergesi:
POST /v1/conversations/{id}/typing, siz yanıtı hazırlarken kişiye «yazıyor…» gösterir (WhatsApp, Messenger ve Telegram;capabilities.typing_indicator). Mesaj değildir: hiçbir şey saklanmaz, ücretlendirilmez ve webhook gelmez. Mesajınız ulaşınca ya da birkaç saniye sonra biter (WhatsApp 25, Telegram 5); WhatsApp'ta kişinin en yeni mesajını da okundu yapar. Konuşma başına birkaç saniyede en çok bir kez. - Konuşmalar:
GET /v1/conversationslisteler,POST /v1/conversations/{id}/resolvebir konuşmayı kapatır (conversations:write); kişinin sonraki mesajı yeni konuşma açar. Sisteminizin ya da UPPU Bot'un yanıtladığı kanallardahandoververeleasekonuşmayı onlarla ekibiniz arasında taşır (bkz. devir).
Yanıt penceresi ve şablonlar
- WhatsApp, Messenger ve Instagram metni, etkileşimli mesajı, medyayı, tepkiyi ve konumu yalnızca kişinin son mesajından sonraki 24 saat içinde kabul eder. Pencere o mesajın ağdaki zamanından sayılır; ağın geç teslim ettiği bir mesaj pencere çoktan kapanmış olarak gelebilir (
message.received'daservice_window.openfalse). Messenger ve Instagram'da kişinin tepkisi de pencereyi açar. Pencere dışında gönderim422 window_closedalır: WhatsApp'ta onaylı bir şablon gönderin, Messenger ve Instagram'da kişinin yeniden yazmasını ya da tepki vermesini bekleyin. - Telegram'da pencere yoktur, ama bot yalnızca önce kendisine yazmış kişiye yazabilir.
- Web sohbeti açık bir konuşma ister. Dosya yalnızca
media_idile gider (bağlantı yok); ziyaretçi onu sohbet penceresinde açar. - Şablon kuralları (WhatsApp): MARKETING şablonu kayıtlı bir pazarlama izni ister; UTILITY şablonu kayıtlı bir bilgilendirme izni ya da kişinin son geri çekmesinden sonra yazdığı bir mesaj ister; AUTHENTICATION şablonu hiç gönderilmez. İzni
POST /v1/consentsile ya da şablon gönderiminin içinde kaydedin (ikisi deconsents:writeister). STOP, DUR ya da İPTAL yazan kişi iki amacı birden geri çeker. - Şablonun başlığı ve düğmeleri (WhatsApp): başlığı görsel, video ya da PDF belge olan şablon dosyayı
"header": {"type": "image", "image": {"media_id": "…"}}ile alır: dosyayı önce aynı kanalaPOST /v1/mediaile yükleyin. Adresi değişkenle biten adres düğmesi değerini düğmenin sırasıyla alır,"buttons": [{"index": 0, "type": "url", "parameter": "A-1001"}]; hızlı yanıt, kişinin dokunuşundaidolarak dönen birpayloadtaşıyabilir. Değişkensiz düğme bir şey istemez.GET /v1/templatesher şablonun neye ihtiyacı olduğunu (parameters.header_media,parameters.buttons) söyler ve birsend_exampleverir. WhatsApp'ta düğmeli mesaj da görsel, video ya da belge başlığını aynı biçimde alır.
Tekrar anahtarı
POST /v1/messagesbirIdempotency-Keybaşlığı ister: harf, rakam,.,_,:ya da-ile 1-64 karakter.- Aynı anahtar ve aynı gövde, ilk mesajın güncel hâliyle
200veIdempotent-Replayed: truedöner. Aynı anahtar başka bir gövdeyle409 idempotency_key_reusedalır. - Anahtar kanal başına kalıcı olarak tekildir. Her mantıksal gönderime bir anahtar verin (UUID, ULID ya da
order-1001-shippedgibi kendi kimliğiniz) ve o gönderimin her yeniden denemesinde onu kullanın: ağ hatasından,429'dan ya da5xx'ten sonra. - Gövdenin her değerini mantıksal gönderimden kurun, denemeden ya da o anki saatten değil: yeniden deneme aynı istek olsun.
- Reddedilen gönderim (örneğin
window_closed) anahtarı tutmaz: koşul değişince aynı anahtar yeniden kullanılabilir. failedile biten bir mesajı yeniden göndermek için yeni anahtar kullanın.POST /v1/consents,POST /v1/mediavePOST /v1/templatesisteğe bağlı anahtar alır; okundu bildirimi anahtar istemez (tekrarı200döner).
Hız sınırları
| Sınır | Değer |
|---|---|
| Anahtar başına, bütün uçlar | herhangi bir saniyede 100 istek ve dakikada 3.000 |
| Anahtar başına, gönderim ve okundu bildirimi (POST /v1/messages, POST /v1/messages/{id}/read) | saniyede 20 istek |
| Anahtar başına, dosya yükleme (POST /v1/media) | saniyede 2 istek ve günde 1 GB |
| Anahtar başına, dosya indirme (GET /v1/media/{id}/content) | saniyede 10 istek ve saatte 2 GB |
| Anahtar başına, kaçırılan olaylar (GET /v1/events) | saniyede 2 istek |
| Yazıyor göstergesi (POST /v1/conversations/{id}/typing) | anahtar başına saniyede 20 istek ve konuşma başına 3 saniyede bir |
| Firma başına, webhook uç noktasının test olayı ve yanlış imzalı denemesi (POST /v1/webhook-endpoints/{id}/test ve /probe) | dakikada 10 istek, aynı anda bir |
| İmzalı medya bağlantıları (POST /v1/media/{id}/link) | Bağlantı 300 saniye ve 30 istek boyunca çalışır; her indirme onu veren anahtarın saatlik medya baytından düşer |
| Anahtar başına, raporlar (GET /v1/reports/summary ve /daily) | saniyede 2 istek |
| Firma başına, şablon oluşturma ve silme (POST /v1/templates, DELETE /v1/templates/{id}) | dakikada 10 istek, aynı anda bir; Meta bir WhatsApp hesabına saatte 100 yeni şablon izin verir |
| Bir ağdan gelen geçersiz anahtarlar | dakikada 30; sonra her istek 10 dakika boyunca 429 alır |
| Kanal başına bekleyen gönderimler | 10.000 bekleyen gönderimden itibaren ya da en eskisi 15 dakika beklemişse yeni gönderim 429 channel_backlog alır |
- Sınırı aşan istek
429 rate_limitedveRetry-After(saniye) alır. O kadar bekleyip aynı isteği yeniden gönderin. - Başarılı yanıtlar anahtar başına sınır için
RateLimit-Limit,RateLimit-RemainingveRateLimit-Resettaşır; gönderim sınırı ayrıdır, gönderim hızınızı kendiniz onun altında tutun. - Ağlara teslimin hızını UPPU kendisi ayarlar. Kanalda büyük bir birikme
429 channel_backlogalır;Retry-After'dan sonra yeniden deneyin.
Hatalar
Her hatanın zarfı aynıdır:
{
"error": {
"type": "policy",
"code": "window_closed",
"status": 422,
"retryable": false,
"message": "Kişi son 24 saatte yazmadı; yalnızca onaylı bir şablon gönderilebilir.",
"request_id": "01jace0e1v2m4n6p8q0r2s4t6a",
"doc_url": "https://messaging.uppu.net/docs/errors#window_closed",
"details": {"window_closed_at": "2026-10-19T08:58:00.000Z", "hint": "send_template"},
"provider_error": null
}
}
codekararlı sözleşmedir; kararı ona göre verin.messageinsanlar içindir veAccept-Language'i izler (varsayılan Türkçe, istenirse İngilizce).typeşunlardan biridir:authentication,permission,invalid_request,conflict,policy,rate_limitveserver.retryable: trueşu demektir: bekleyin (varsaRetry-Afterkadar) ve aynı isteği aynıIdempotency-Keyile yeniden gönderin.- Doğrulama hatası alanları listeler:
details.fields{field, code, message}öğeleri taşır. - Her yanıt
X-Request-Idtaşır. Bir isteği sonra bulmak için kendi değerinizi gönderin (en çok 64 görünür karakter) ve UPPU'ya yazarken onu belirtin. 202'den sonra, ağ mesajı teslim ederken oluşan hatalarmessage.status'ta ve mesajınerroralanındafailedolarak gelir.- Hata kodları sayfası her kodu HTTP durumu ve anlamıyla listeler.
Webhook'lar
UPPU her olayı (gelen mesaj, durum, değişen kimlik) HTTPS uç noktanıza imzalı bir POST olarak gönderir. İmzayı ham gövde üzerinden doğrulayın, 10 saniye içinde 2xx dönün, tekrarları webhook-id ile ayıklayın ve olayı sonra işleyin. Kaçırdığınız olaylar 7 gün boyunca GET /v1/events'te durur. Webhook sayfası kurulumu (panelde ya da API'den), imzayı, yeniden denemeleri ve her olayı örneğiyle anlatır. Bir dosyayı anahtarınız olmadan vermek için POST /v1/media/{id}/link birkaç dakika çalışan imzalı bir indirme bağlantısı döner; indirmeleri anahtarınızın saatlik medya baytından düşer.
Ekibinize devir
Kendi sisteminizin (yönetim kipi api) ya da UPPU Bot'un (bot) yanıtladığı kanalda her konuşmayı otomasyon tutar (held_by api ya da bot), ta ki ekibinize devredilene kadar (held_by team). İki çağrı da conversations:write ister («Bot» hazır seçiminde var).
- Devir:
POST /v1/conversations/{id}/handover, gövde boş ya da{"reason": "address_change", "note": "Kişi teslimat adresini değiştirmek istiyor."}. Konuşma ekibin gelen kutusuna girer (Atanmamış); kanalın otomatik ataması açıksa müsait bir temsilciye atanır, 10 dakika içinde kimse yanıtlamazsa ekip e-posta alır. Bot kanalında UPPU Bot hemen durur. Kişiye hiçbir şey gitmez: isterseniz önce kendi mesajınızı gönderin.reason(kişisel veri içermeyen kısa bir kod) venoteyalnızca ekibin gelen kutusunda görünür; API ve webhook'lar onları hiç döndürmez. - Bırakma:
POST /v1/conversations/{id}/releasekonuşmayı geri verir: api kanalında sisteminize, bot kanalında UPPU Bot'a. UPPU Bot bundan sonra yalnızca kişinin bir sonraki mesajını yanıtlar; bu yüzden kişinin son mesajı önce yanıtlanmış olmalı (ekipten ya da sisteminizden), yoksa409 bot_not_ready,details.reasonreply_first. - Tekrarsız: istenen durumdaki konuşma yine
200döner ve hiçbir şey iki kez yazılmaz; rahatça yeniden deneyin. Çözülmüş konuşma409 not_heldya da409 not_handed_over, ekip gelen kutusunun kanalı422 handling_not_supportedalır. - Durum: konuşma
held_byvehandover_reasontaşır: kendi devriniz içinapi, ya da UPPU Bot'un nedeni, örneğinkeyword(kişi bir temsilci istedi) ya daagent_takeover(bir temsilci yanıtladı). - Olaylar: her devri, geri vermeyi ve bırakmayı, ekibin her çözmesini, yeniden açmasını ve atamasını izlemek için uç noktanızı
conversation.updated'e abone edin (olay). Yeni uç noktada kapalı gelir. Kanalın yönetim kipinin panelde değişmesi kanalın açık konuşmalarını olaysız taşır: kanalınhandling'i değişince onları yeniden okuyun.
API'den şablonlar
Hiçbir hazır seçimde olmayan templates:write kapsamıyla («Özel» seçimle verilir) sisteminiz bir kanalın WhatsApp Business hesabının WhatsApp şablonlarını panelin şablon sayfasının kurallarıyla oluşturur ve siler.
- Oluşturma:
POST /v1/templates. Yanıt şablonla birlikte201, çoğunluklaPENDING: Meta şablonu inceler, genellikle 24 saat içinde; sonucutemplate.updatedbildirir.
{
"channel_id": "01j9z0ch5k2m4n6p8q0r2s4t6v",
"name": "order_update",
"language": "tr",
"category": "UTILITY",
"header": {"type": "text", "text": "Sipariş {{1}}", "example": "A-1001"},
"body": {"text": "Merhaba {{1}}, siparişiniz yola çıktı.", "examples": ["Ayşe"]},
"footer": {"text": "Bilgilendirme"},
"buttons": [{"type": "quick_reply", "text": "Teşekkürler"}]
}
- Kurallar: ad küçük harf, rakam ve alt çizgi; dil
trya daen; kategoriUTILITYya daMARKETING; değişkenler ya numaralı ({{1}},{{2}}…) ya adlı ({{first_name}}), her biri tek satırlık bir örnekle (examplesnumaralı değişkenlerde liste, adlılarda ada göre nesne); isteğe bağlı, en çok bir değişkenli metin başlığı ve değişkensiz alt bilgi; en çok 3 hızlı yanıt, 2 adres düğmesi ({"type": "url", "text": …, "url": …, "example": …}: değişken yalnızca adresin sonunda{{1}}, o sonun bir örneğiyle) ve 1 telefon düğmesi (artı işaretiyle E.164); hızlı yanıtlar yan yana. Görsel, video ya da belge başlığı bir örnek dosya alır; dosyayı önce aynı kanalaPOST /v1/mediaile yükleyin:"header": {"type": "image", "image": {"media_id": "…"}}(en çok 5 MB JPEG ya da PNG görsel, en çok 16 MB MP4 video, en çok 25 MB PDF belge). UPPU örneği inceleme için Meta'ya yükler; şablonla gönderdiğiniz her mesaj yine kendi dosyasını taşır. Yükleme ve oluşturma isteğinizin süresi içinde yapılır (yaklaşık 26 saniye): yükleme çok uzun sürerse503 provider_unavailable(details.reasonunreachable) alırsınız ve hiçbir şey oluşmaz; yeniden deneyin ya da daha küçük bir örnek kullanın. Kurala uymayan alan, alanın yoluyla422 validation_failedalır, örneğinbody.examples.1. - Sınırlar: aynı ad ve dil ikinci kez ya da bütün dilleri son 30 günde silinmiş bir ad
422alır (alanname); Meta bir WhatsApp hesabına saatte 100 yeni şablon izin verir (429,Retry-Afterile). UPPU Meta'yı isteğiniz sırasında çağırır, firma başına aynı anda bir oluşturma ya da silme (yoksa429,details.reasonconcurrent_writes). Meta'nın kendi hız sınırı dolarsadetails.reasonprovider_rate_limitedile429alırsınız (Retry-Afterveprovider_error'da Meta'nın koduyla). Meta'ya ulaşılamazsa503 provider_unavailablealırsınız;details.reasonunconfirmedise (yanıt zamanında gelmedi ya da Meta geçici bir hata verdi) şablon oluşmuş olabilir. AynıIdempotency-Keyve şablonla yeniden deneyin: UPPU Meta'ya yeniden bakar; önceki istek şablonu oluşturduysa şablonu200ile (Idempotent-Replayed: true) verir, oluşturmadıysa oluşturur. Anahtarsız yeniden denemeden önceGET /v1/templates?name=&language=okuyun. Meta kanalın hesabının erişim jetonunu reddedersedetails.reasoncredentialsile409 channel_unavailablealırsınız. İsteğe bağlıIdempotency-Keyyeniden denemeyi güvenli kılar. - Silme:
DELETE /v1/templates/{id}şablonu yalnızca o dilde siler; adın öteki dilleri kalır. ŞablonDELETEDdurumuyla okunmaya devam eder; yeniden silmek aynı yanıtı verir.
Raporlar
Yine hiçbir hazır seçimde olmayan reports:read kapsamıyla GET /v1/reports/summary panelin «Raporlar» sayfasının sayılarını, GET /v1/reports/daily aynı sayıları gün gün verir. Sayılar her gece toplanır: yalnızca sayılar; kişi, konuşma ya da mesaj yok.
- Dönem:
days=7,30(varsayılan) ya da90bitmiş gün, ya dafromveto(firmanızın saat dilimindeki takvim günleri, en çok 90 gün). Dönem gece sayımının bitirdiği son günde biter: hangisi olduğunuperiod.tosöyler; dün henüz sayılıyorkenperiod.pendingtrueolur. - Kapsam: bütün firma ya da
channel_id,member_idvegroup_id'den biri (özetinbreakdowns'undaki kimlikler). Bir kanala bağlı anahtar yalnızca kendi kanalını okur. UPPU'nun API'ye durdurduğu kanal, kanallar arasında kimliksiz ve adsız tek satırdır (hiddentrue); toplamlar firmanızın bütün kanallarını sayar. - Sayılar: kişilerin açtığı ve ekibinize gelen konuşmalar, gününde yanıtsız kalanlar, ekibin yanıtları, ilk yanıt ve çözüm süreleri (kovalara göre, ortanca, yüzde 90 ve ortalamayla), çözmeler ve yeniden açmalar, dönem sonunda açık konuşmalar, tutturulan ve kaçırılan SLA hedefleri, konular ve etiketler; bütün firma için ayrıca kanal, temsilci ve gruba göre.
- Raporlar mesajlaşma panelinin parçasıdır: paketinde panel olmayan firma
details.resourcereportsile403 api_disabledalır. Anahtar başına saniyede en çok 2 istek.
Uyumluluk
v1 içinde UPPU yalnızca ekler; hiçbir şeyi kaldırmaz ya da yeniden adlandırmaz:
- yeni alanlar, uçlar, olay türleri, içerik türleri, hata kodları ve enum değerleri her an gelebilir;
- bilmediğiniz alanları ve olayları yok sayın, bilmediğiniz
content.type'ıunsupportedsayın, bilmediğiniz enum değerlerini kabul edin (örneğin yeni birauthor.typeya da mesajınstatus'uexpired); - geriye uyumsuz değişiklik yalnızca
/v2olarak, en az 12 ay birlikte çalışma süresiyle gelir.
Kişisel veri
- Kullanıcılarınızı telefon numarasıyla değil,
contact_idile tutun: telefon hiç gelmeyebilir, WhatsApp kullanıcı kimlikleri değişebilir (contact.identity_changed). client_reference'a,Idempotency-Key'e,source_ref'e ve adreslere kişisel veri koymayın.- UPPU bir kişiyi sildiğinde
contact.erasedalırsınız: kendi kopyanızı da silin.
Canlıya geçiş
- Canlı panelde oluşturulmuş, sır kasanızda saklanan ve doğru kanala bağlı bir canlı anahtar (
uppu_live_). - Canlıda kaydedilip etkinleştirilmiş bir webhook uç noktası: imza doğrulaması,
webhook-idile tekrar ayıklama ve hızlı2xx. - Her gönderimin kararlı bir
Idempotency-Key'i var; yeniden denemeler onu kullanıyor. window_closed,consent_required,failedveexpireddurumları alarm değil, beklenen sonuçlar olarak işleniyor.- Kullanıcılar
contact_idile tutuluyor;contact.identity_changedvecontact.erasedişleniyor. - Kesintiden sonra sisteminiz
GET /v1/eventsile eksiği tamamlıyor ya daGET /v1/messagesile uzlaşıyor.