Wow! WhatsApp entegrasyonunuzu oluşturun. Ücretsiz başlayın. Şimdi Kaydol
Randevu · WhatsApp API kullanım senaryosu

Müşterilerin WhatsApp'ta ziyaret saatini bir listeden seçmesine izin verin

Müşteriler gidip gelen yazışma yerine net bir saate dokunduğunda rezervasyonu daha hızlı bitirir. Rezervasyon akışınız saat seçimi adımına geldiğinde backend, Whapi.Cloud üzerinden müşteri sohbetine etkileşimli bir liste POST edebilir. Bu kullanım senaryosu entegratörlere bu akışı WhatsApp API ile nasıl kuracaklarını gösterir.

En fazla on slot satırlı type list Seçim messages.post üzerinde list_reply olarak gelir
Geliştirici paneli yanında WhatsApp rezervasyon sohbeti ve açık etkileşimli randevu saati listesi olan bir telefon.
Kullanım senaryosu

Bu akış ne zaman kullanılır

Boş slotlar takviminizde zaten var

own_backend hangi ziyaret saatlerinin boş olduğunu zaten biliyorsa ve müşterinin sohbette birini seçmesi yeterliyse bu akışı kullanın.

Rezervasyon özel WhatsApp sohbetinde kalır

Müşteri işletme numaranızla direct_chat içinde rezervasyon yapıyorsa, grup veya kanalda değilse bu akışı kullanın.

Serbest metin yerine yapılandırılmış dokunuş istiyorsunuz

«Salı 15:00» yazmak hata çıkarıyorsa ve backend'in rezerve edebileceği sabit bir slot id'si olan liste satırını tercih ediyorsanız bu akışı kullanın.

Telefonda ziyaret saatlerinin etkileşimli listesi ve seçilen slotun gönderilen yanıt olarak vurgulandığı WhatsApp sohbeti.
Müşteri deneyimi

Müşteri boş bir slota dokunur

Otomasyondan önce müşteriler saatleri serbest metinde tahmin eder, personel takvimi elle kontrol eder.

Liste gelince müşteri menüyü açar, bir satıra dokunur ve seçimini aynı sohbette gönderilmiş olarak görür. Entegratörler bu sonucu WhatsApp API ile kurar.

Akış

Boş slotlardan yakalanan id'ye

1

Rezervasyon saat seçimi istiyor

own_backend içindeki planlama mantığı, müşterinin güncel boş ziyaret saatleri arasından seçmesi gereken adıma gelir.

2

Slot liste mesajını gönderin

POST /messages/interactive

Boş slotlardan oluşturulan action.list.sections satırları (title, id, description) ile type list, header/body/footer metinleri için /messages/interactive adresine POST—genelde bir bölümde en fazla on satır. Her satır id'sini backend'in rezerve edebileceği bir slot anahtarına eşleyin (örneğin slot-2026-04-02-10-00).

Müşteri dokunuşunu webhook'unuzda mı istiyorsunuz? Listeyi gönderdikten sonra kanal webhook'unuzda gelen yanıtı dinleyin. Teslimat durumu hakkında →

Ön koşullar

Akışı çalıştırmadan önce

Rezervasyon listelerini gönderecek WhatsApp numarasını Whapi.Cloud'a bağlayın ve sendMessageInteractive çağrılarında o kanalın API token'ını kullanın. Gelen list_reply olayları aynı kanalda bir webhook URL'si gerektirir.

İsteğe bağlı — bu akışta derinleşin

API uygulaması

Liste isteğini adım adım oluşturun

Tek POST menüyü iletir. type değerini list yapın, header, body ve footer nesnelerini doldurun, ardından düğme etiketi ve sections[].rows ile action.list—her satır backend'deki boş bir slota bağlı title, id ve isteğe bağlı description gerektirir.

whapi.cloud'da kayıt olduktan sonra ücretsiz API token alın ve örneklerdeki Your_Token yerine kodda onu kullanın.

Slot liste mesajını gönderin

Müşteriye en fazla on slot satırlı etkileşimli liste (type list) gönderin; müşteri action.list.label ile menüyü açar ve bir satıra dokunur.

curl --request POST \
     --url https://gate.whapi.cloud/messages/interactive \
     --header 'accept: application/json' \
     --header 'authorization: Bearer Your_Token' \
     --header 'content-type: application/json' \
     --data '
{
  "to": "447123456789",
  "type": "list",
  "header": {
    "text": "Choose a visit time"
  },
  "body": {
    "text": "Tap View times and pick an open slot for your visit."
  },
  "footer": {
    "text": "Clinic bookings via WhatsApp"
  },
  "action": {
    "list": {
      "label": "View times",
      "sections": [
        {
          "title": "Available slots",
          "rows": [
            {
              "id": "slot-2026-04-02-10-00",
              "title": "Wed 10:00",
              "description": "Open \u00b7 Dr. Lee"
            },
            {
              "id": "slot-2026-04-02-11-30",
              "title": "Wed 11:30",
              "description": "Open \u00b7 Dr. Lee"
            },
            {
              "id": "slot-2026-04-02-14-00",
              "title": "Wed 14:00",
              "description": "Open \u00b7 Dr. Lee"
            }
          ]
        }
      ]
    }
  }
}
'
$curl = curl_init();

curl_setopt_array($curl, [
  CURLOPT_URL => "https://gate.whapi.cloud/messages/interactive",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => "{\"to\": \"447123456789\", \"type\": \"list\", \"header\": {\"text\": \"Choose a visit time\"}, \"body\": {\"text\": \"Tap View times and pick an open slot for your visit.\"}, \"footer\": {\"text\": \"Clinic bookings via WhatsApp\"}, \"action\": {\"list\": {\"label\": \"View times\", \"sections\": [{\"title\": \"Available slots\", \"rows\": [{\"id\": \"slot-2026-04-02-10-00\", \"title\": \"Wed 10:00\", \"description\": \"Open \\u00b7 Dr. Lee\"}, {\"id\": \"slot-2026-04-02-11-30\", \"title\": \"Wed 11:30\", \"description\": \"Open \\u00b7 Dr. Lee\"}, {\"id\": \"slot-2026-04-02-14-00\", \"title\": \"Wed 14:00\", \"description\": \"Open \\u00b7 Dr. Lee\"}]}]}}}",
  CURLOPT_HTTPHEADER => [
    "accept: application/json",
    "authorization: Bearer Your_Token",
    "content-type: application/json"
  ],
]);

$response = curl_exec($curl);
curl_close($curl);
echo $response;
import requests

url = "https://gate.whapi.cloud/messages/interactive"
payload = {
    "to": "447123456789",
    "type": "list",
    "header": {
        "text": "Choose a visit time"
    },
    "body": {
        "text": "Tap View times and pick an open slot for your visit."
    },
    "footer": {
        "text": "Clinic bookings via WhatsApp"
    },
    "action": {
        "list": {
            "label": "View times",
            "sections": [
                {
                    "title": "Available slots",
                    "rows": [
                        {
                            "id": "slot-2026-04-02-10-00",
                            "title": "Wed 10:00",
                            "description": "Open \u00b7 Dr. Lee"
                        },
                        {
                            "id": "slot-2026-04-02-11-30",
                            "title": "Wed 11:30",
                            "description": "Open \u00b7 Dr. Lee"
                        },
                        {
                            "id": "slot-2026-04-02-14-00",
                            "title": "Wed 14:00",
                            "description": "Open \u00b7 Dr. Lee"
                        }
                    ]
                }
            ]
        }
    }
}
headers = {
    "accept": "application/json",
    "authorization": "Bearer Your_Token",
    "content-type": "application/json"
}

response = requests.post(url, json=payload, headers=headers)
print(response.text)
const response = await fetch('https://gate.whapi.cloud/messages/interactive', {
  method: 'POST',
  headers: {
    accept: 'application/json',
    authorization: 'Bearer Your_Token',
    'content-type': 'application/json',
  },
  body: JSON.stringify({"to": "447123456789", "type": "list", "header": {"text": "Choose a visit time"}, "body": {"text": "Tap View times and pick an open slot for your visit."}, "footer": {"text": "Clinic bookings via WhatsApp"}, "action": {"list": {"label": "View times", "sections": [{"title": "Available slots", "rows": [{"id": "slot-2026-04-02-10-00", "title": "Wed 10:00", "description": "Open \u00b7 Dr. Lee"}, {"id": "slot-2026-04-02-11-30", "title": "Wed 11:30", "description": "Open \u00b7 Dr. Lee"}, {"id": "slot-2026-04-02-14-00", "title": "Wed 14:00", "description": "Open \u00b7 Dr. Lee"}]}]}}}),
});

console.log(await response.text());
OkHttpClient client = new OkHttpClient();

MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\"to\": \"447123456789\", \"type\": \"list\", \"header\": {\"text\": \"Choose a visit time\"}, \"body\": {\"text\": \"Tap View times and pick an open slot for your visit.\"}, \"footer\": {\"text\": \"Clinic bookings via WhatsApp\"}, \"action\": {\"list\": {\"label\": \"View times\", \"sections\": [{\"title\": \"Available slots\", \"rows\": [{\"id\": \"slot-2026-04-02-10-00\", \"title\": \"Wed 10:00\", \"description\": \"Open \\u00b7 Dr. Lee\"}, {\"id\": \"slot-2026-04-02-11-30\", \"title\": \"Wed 11:30\", \"description\": \"Open \\u00b7 Dr. Lee\"}, {\"id\": \"slot-2026-04-02-14-00\", \"title\": \"Wed 14:00\", \"description\": \"Open \\u00b7 Dr. Lee\"}]}]}}}");
Request request = new Request.Builder()
  .url("https://gate.whapi.cloud/messages/interactive")
  .post(body)
  .addHeader("accept", "application/json")
  .addHeader("authorization", "Bearer Your_Token")
  .addHeader("content-type", "application/json")
  .build();

Response response = client.newCall(request).execute();
using RestSharp;

var options = new RestClientOptions("https://gate.whapi.cloud/messages/interactive");
var client = new RestClient(options);
var request = new RestRequest("");
request.AddHeader("accept", "application/json");
request.AddHeader("authorization", "Bearer Your_Token");
request.AddHeader("content-type", "application/json");
request.AddJsonBody(System.Text.Json.JsonSerializer.Deserialize<object>(@"{\"to\": \"447123456789\", \"type\": \"list\", \"header\": {\"text\": \"Choose a visit time\"}, \"body\": {\"text\": \"Tap View times and pick an open slot for your visit.\"}, \"footer\": {\"text\": \"Clinic bookings via WhatsApp\"}, \"action\": {\"list\": {\"label\": \"View times\", \"sections\": [{\"title\": \"Available slots\", \"rows\": [{\"id\": \"slot-2026-04-02-10-00\", \"title\": \"Wed 10:00\", \"description\": \"Open \\u00b7 Dr. Lee\"}, {\"id\": \"slot-2026-04-02-11-30\", \"title\": \"Wed 11:30\", \"description\": \"Open \\u00b7 Dr. Lee\"}, {\"id\": \"slot-2026-04-02-14-00\", \"title\": \"Wed 14:00\", \"description\": \"Open \\u00b7 Dr. Lee\"}]}]}}}"));
var response = await client.PostAsync(request);

Console.WriteLine("{0}", response.Content);
package main

import (
	"bytes"
	"fmt"
	"io"
	"net/http"
)

func main() {
	body := []byte(`{"to": "447123456789", "type": "list", "header": {"text": "Choose a visit time"}, "body": {"text": "Tap View times and pick an open slot for your visit."}, "footer": {"text": "Clinic bookings via WhatsApp"}, "action": {"list": {"label": "View times", "sections": [{"title": "Available slots", "rows": [{"id": "slot-2026-04-02-10-00", "title": "Wed 10:00", "description": "Open \u00b7 Dr. Lee"}, {"id": "slot-2026-04-02-11-30", "title": "Wed 11:30", "description": "Open \u00b7 Dr. Lee"}, {"id": "slot-2026-04-02-14-00", "title": "Wed 14:00", "description": "Open \u00b7 Dr. Lee"}]}]}}}`)
	req, _ := http.NewRequest("POST", "https://gate.whapi.cloud/messages/interactive", bytes.NewReader(body))
	req.Header.Set("accept", "application/json")
	req.Header.Set("authorization", "Bearer Your_Token")
	req.Header.Set("content-type", "application/json")

	res, _ := http.DefaultClient.Do(req)
	defer res.Body.Close()
	out, _ := io.ReadAll(res.Body)
	fmt.Println(string(out))
}
Gelen seçim

Slotu list_reply içinden okuyun

Teslimat durumu webhook'ları giden listeye hâlâ uygulanır. Rezervasyon kararı müşteri bir satıra dokunduğunda messages.post üzerinde ayrı gelir—satır id'nize eşlemek için reply.type list_reply ve reply.list_reply.id (artı title/description) arayın.

  • Dokunuşları test etmeden önce kanal webhook'unu bağlayın; payload event.type messages ve event.event post içerir.

  • reply.list_reply.id'yi gönderdiğiniz satır id'si ile eşleştirin (Whapi ListV3:r1 gibi önekler ekleyebilir—own_backend'de normalize edin).

  • Webhook geldiğinde slot artık boş değilse takvime yazmayın; güncellenmiş liste gönderin veya failure_mode'unuza göre personele devredin.

Teslimat ve webhook hakkında okunacaklar

Bir şeyler ters gittiyse destekle iletişime geçin
Bir şeyler ters gittiğinde

Her adımda hataları yönetin

Rezervasyon tetikleyicinizden sonra sendMessageInteractive başarısız olursa müşteri slot listesini hiç görmez—saatin seçildiğini varsaymadan önce yeniden deneyin veya personeli uyarın.

Liste müşteriye hiç ulaşmadığında

Başarısız gönderim, yasak alıcı veya eksik medya referansı müşteriyi dokunacak satır bırakmaz. Geçerli parametrelerle yeniden deneyin, to içindeki chat id'yi doğrulayın, slot penceresi kapanırsa manuel planlamaya dönün. Sağlıklı bir kanalda tekrarlayan 401 veya 500 ile gönderimler başarısız olursa Whapi desteğine yazın.

Bir şeyler ters gittiyse destekle iletişime geçin

API adımına göre teşhis

Durum Anlamı Ne yapmalı
400 Wrong request parameters List payload biçimini düzeltin—type list, body.text, action.list.label ve OpenAPI'ye göre title ve id içeren en az bir satır.
401 Need channel authorization for send message Kanal Bearer token'ını gönderin; numaranın panelde hâlâ eşleştiğini doğrulayın.
402 Trial version limit exceeded
403 It is forbidden to send to this group/recipient Alıcının bu kanalda izinli olduğunu ve chat id'nin doğru olduğunu doğrulayın.
429 Too many requests Bekleyip yeniden deneyin; aynı slot listesini art arda göndermekten kaçının.
500 Internal Error
Sık sorulan sorular

Listedeki slotlar ve webhook id'leri

Bölümlerinizde toplam en fazla on satır planlayın—aynı gün veya yakın tarih menüsü için yeterli. Daha fazla boş slot varsa müşteri tarih seçtikten sonra yeni liste ile sayfalayın veya göndermeden önce own_backend'den kümeden daraltmasını isteyin.
type değerini list yapın, header, body ve footer metin nesnelerini sağlayın, label ve sections[].rows ile action.list iç içe geçirin (her satır title, id ve isteğe bağlı description ister). to alanında müşteri telefonunu hedefleyin—/messages/interactive için operatör referans curl ile aynı biçim.
messages.post üzerinde reply.list_reply.id ve reply.list_reply.title okuyun. id'yi listeyi oluştururken atadığınız satır id'sine eşleyin, ardından own_backend'de slotu rezerve edin veya tutun.
Katalog failure_mode'unuz gibi ele alın—güncellenmiş liste gönderin, eski satır id'lerini geçersiz kılın veya sohbeti personele yönlendirin. Taze list_reply veya manuel kontrol olmadan takvimde ziyaret saati onaylamayın.
Desteklenen WhatsApp Özellikleri

WhatsApp otomasyonları oluşturmak için ihtiyacınız olan her şey

Whapi.Cloud; mesajlaşma, medya, gruplar, kanallar, webhook’lar ve daha fazlası dahil olmak üzere WhatsApp’ın tüm özelliklerine erişim sağlar. Özellik kısıtlamaları olmadan botlar, otomasyonlar ve entegrasyonlar oluşturun.

Geliştiricilerin tercihi

3.300+ geliştirici ve SaaS ekibi tarafından güveniliyor

Dünya genelindeki geliştiriciler, otomasyonlar, botlar, CRM entegrasyonları, toplu mesaj araçları ve gelişmiş WhatsApp iş akışları oluşturmak için Whapi.Cloud'a güveniyor. Altyapımız her ay yüksek kararlılıkla milyonlarca API isteği işliyor — ve bu sayı giderek artıyor.

Özellik simgesi

5,5K+

aktif API kanalı

Özellik simgesi

21M+

aylık API isteği

“Her şey basit, sezgisel ve kullanımı kolay. Dokümantasyon net ve gerekli tüm bilgiler elimizin altında. Harika iş.”

Roberto K. / Web Geliştirici

“WhatsApp'ı n8n kullanarak iş akışlarımıza sadece birkaç dakikada bağladık. Kod yok, karmaşa yok — her şey ilk denemede çalıştı.”

Martin P. / Geliştirici

“Whapi.Cloud, müşteri iletişimimizin önemli bir parçası haline geldi. Ürün güncellemelerini, sipariş bildirimlerini ve destek mesajlarını Meta şablonlarına veya onaylara ihtiyaç duymadan otomatikleştirdik.”

Oscar T. / CTO

Dekoratif balon