Geliştiriciler için API, MCP ve webhook
WhatsApp gelen kutunuzu kendi yazılımınıza, CRM'inize ve yapay zekâ asistanlarınıza bağlayın. Her kullanıcı kendi API anahtarını panelden üretir; aynı kurallar (24 saat penceresi, onaylı şablonlar) her yerde geçerlidir.
REST API
Sohbetleri okuyun, mesaj ve şablon gönderin, kampanya başlatın.
MCP (yapay zekâ)
Claude, ChatGPT, Cursor gibi asistanlar gelen kutunuzla çalışsın.
Webhook'lar
Yeni mesaj ve iletim durumlarını anında, imzalı olarak alın.
API, webhook ve MCP, Pro ve İşletme paketlerinde (14 günlük deneme dahil) kullanılabilir.
Hızlı başlangıç
1. Panelde API ve MCP sayfasını açın ve bir anahtar oluşturun. Anahtar yalnızca bir kez gösterilir; güvenli bir yere kaydedin.
Panelde anahtar oluştur2. Anahtarı her istekte Authorization başlığıyla gönderin ve deneme isteği atın:
curl https://sosyalmedya.website/api/v1/me \
-H "Authorization: Bearer smw_live_…"3. Onaylı bir şablonla ilk mesajınızı gönderin:
curl -X POST https://sosyalmedya.website/api/v1/messages \
-H "Authorization: Bearer smw_live_…" \
-H "Content-Type: application/json" \
-d '{
"to": "905321234567",
"template": {
"name": "randevu_hatirlatma",
"language": "tr",
"params": ["Ayşe", "yarın 10:00"]
}
}'Kimlik doğrulama ve yetkiler
Her istekte kişisel API anahtarınızı Bearer token olarak gönderin. Anahtar, onu oluşturan kullanıcının yetkisiyle çalışır; kullanıcı ekipten çıkarılırsa ya da anahtar iptal edilirse hemen geçersiz olur.
Authorization: Bearer smw_live_…Yetkiler
| scope | |
|---|---|
| read | Numaralar, şablonlar, sohbetler, mesajlar ve kampanyaları okur. |
| send | Mesaj ve şablon gönderir, okundu işaretler, kampanya başlatır ve durdurur. Her zaman read'i de içerir. |
Güvenlik
- Anahtarı tarayıcıda, mobil uygulamada ya da herkese açık kodda kullanmayın; yalnızca sunucunuzda saklayın.
- Yapay zekâ asistanına salt okunur anahtar vermek en güvenli başlangıçtır.
- Sızdığından şüphelendiğiniz anahtarı panelden hemen iptal edip yenisini oluşturun.
WhatsApp kuralları
- 24 saat penceresi
- Müşteri size yazdıktan sonraki 24 saat içinde serbest metin gönderebilirsiniz (Click-to-WhatsApp reklamından gelenlerde 72 saat). Sohbetteki window_open alanı bunu gösterir.
- Onaylı şablon
- Yeni bir sohbet başlatmak ya da pencere kapalıyken yazmak için Meta'nın onayladığı bir şablon gönderilmelidir. Şablonları panelden oluşturup /templates ile listeleyebilirsiniz.
- İzin (opt-in)
- Yalnızca sizden WhatsApp mesajı almayı kabul etmiş kişilere yazın. Kampanyalarda opt_in_confirmed: true beyanı zorunludur.
- Numara biçimi
- Ülke koduyla, yalnızca rakam: 905321234567. Türkiye cep numaralarında 0532… ve 532… biçimleri otomatik düzeltilir.
- Ücretler
- Meta'nın mesaj ücretleri doğrudan WhatsApp Business hesabınızdan tahsil edilir; API ek mesaj ücreti almaz.
Uç noktalar
Taban adres aşağıdadır. Tüm gövdeler ve yanıtlar JSON, zamanlar ISO 8601 (UTC) biçimindedir.
https://sosyalmedya.website/api/v1| Yöntem | Yol | Yetki | Açıklama |
|---|---|---|---|
| GET | /me | read | İşletme, kullanıcı, anahtar yetkisi ve bağlı numaralar |
| GET | /numbers | read | Bağlı WhatsApp numaraları |
| GET | /templates | read | Şablonlar (?number_id=&status=APPROVED) |
| GET | /conversations | read | Sohbetler, son mesaja göre (?search=&number_id=&page=) |
| GET | /conversations/{id} | read | Sohbet ve son mesajlar (?limit=1–150) |
| POST | /conversations/{id}/read | send | Okundu işaretle, müşteriye okundu bilgisi gönder |
| POST | /messages | send | Metin ya da şablon gönder |
| GET | /messages/{id} | read | Mesaj ve iletim durumu |
| GET | /campaigns | read | Kampanyalar |
| POST | /campaigns | send | İzinli toplu şablon gönderimi |
| GET | /campaigns/{id} | read | Kampanya ve sayaçlar |
| POST | /campaigns/{id}/cancel | send | Kampanyayı durdur |
Örnekler
Şablonla sohbet başlatma
curl -X POST https://sosyalmedya.website/api/v1/messages \
-H "Authorization: Bearer smw_live_…" \
-H "Content-Type: application/json" \
-d '{
"to": "905321234567",
"template": {
"name": "randevu_hatirlatma",
"language": "tr",
"params": ["Ayşe", "yarın 10:00"]
}
}'Birden fazla numaranız varsa to ile gönderimde number_id de verin.
Açık sohbete yanıt (24 saat içinde)
curl -X POST https://sosyalmedya.website/api/v1/messages \
-H "Authorization: Bearer smw_live_…" \
-H "Content-Type: application/json" \
-d '{ "conversation_id": "CONVERSATION_ID", "text": "Merhaba, nasıl yardımcı olabilirim?" }'Okunmamış sohbetleri bulma
curl "https://sosyalmedya.website/api/v1/conversations?page=1" \
-H "Authorization: Bearer smw_live_…"JavaScript (Node 18+)
const res = await fetch("https://sosyalmedya.website/api/v1/messages", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.SMW_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
to: "905321234567",
template: { name: "randevu_hatirlatma", language: "tr", params: ["Ayşe", "yarın 10:00"] },
}),
});
const data = await res.json();
if (!res.ok) throw new Error(`${data.error.code}: ${data.error.message}`);
console.log(data.message.id, data.message.status);Python
import os, requests
res = requests.post(
"https://sosyalmedya.website/api/v1/messages",
headers={"Authorization": f"Bearer {os.environ['SMW_API_KEY']}"},
json={
"to": "905321234567",
"template": {"name": "randevu_hatirlatma", "language": "tr", "params": ["Ayşe", "yarın 10:00"]},
},
timeout=30,
)
data = res.json()
if not res.ok:
raise RuntimeError(f"{data['error']['code']}: {data['error']['message']}")
print(data["message"]["id"], data["message"]["status"])Hatalar
Hatalarda HTTP durum kodu ve aşağıdaki gövde döner. code alanına göre işlem yapın; message insanlar içindir.
{
"error": {
"code": "window_closed",
"message": "The 24-hour customer service window is closed …",
"detail": "no_conversation"
}
}| code | HTTP | Anlamı |
|---|---|---|
| unauthorized | 401 | Anahtar yok, hatalı ya da iptal edilmiş |
| insufficient_scope | 403 | Anahtar salt okunur; gönderme yetkisi gerekli |
| plan_upgrade_required | 402 | Paket API içermiyor (Pro veya İşletme gerekli) |
| subscription_inactive | 402 | Abonelik etkin değil |
| validation_failed | 422 | Geçersiz alan; detail alanı hangisi olduğunu söyler |
| not_found | 404 | Kayıt bulunamadı ya da bu işletmeye ait değil |
| window_closed | 409 | 24 saat penceresi kapalı ya da henüz sohbet yok: şablon gönderin |
| no_wa_account | 409 | Bağlı WhatsApp numarası yok |
| template_not_available | 422 | Şablon yok, onaylı değil ya da bu dilde değil |
| undeliverable | 422 | Numara WhatsApp kullanmıyor olabilir |
| rate_limited | 429 | Hız sınırı aşıldı; Retry-After kadar bekleyin |
Hız sınırları
- Anahtar (ya da bağlı uygulama) başına dakikada 120 istek.
- Bunun içinde dakikada en fazla 30 gönderim (mesaj, okundu, kampanya). Yapay zekâ (MCP) bağlantılarında gönderim sınırı dakikada 10'dur.
- Sınır aşılınca 429 ve Retry-After: 60 döner. Toplu gönderim için tek tek mesaj yerine kampanya kullanın; kampanyalar Meta'nın hız sınırlarına uygun partilerle gönderilir.
Webhook'lar
Hesap sahibi panelde API ve MCP → Webhook'lar bölümünden en fazla 3 https adresi ekleyebilir. Her olay, adresinize JSON gövdeli bir POST olarak gelir.
Olaylar
| event | |
|---|---|
| message.received | Müşteriden yeni mesaj (metin, medya, konum, tepki…). |
| message.status | Gönderdiğiniz mesajın durumu değişti: sent, delivered, read, failed. |
Başlıklar
| header | |
|---|---|
| X-SMW-Event | Olay türü |
| X-SMW-Event-Id | Olay kimliği; tekrar gelen olayları ayıklamak için kullanın |
| X-SMW-Delivery | Bu gönderimin kimliği |
| X-SMW-Signature | t=<unix zamanı>,v1=<imza> |
Örnek gövde
{
"id": "evt_5f0c2a1e-…",
"type": "message.received",
"created_at": "2026-10-19T09:41:12.000Z",
"data": {
"message": {
"id": "…", "conversation_id": "…", "number_id": "…",
"direction": "in", "type": "text", "text": "Fiyat alabilir miyim?",
"status": "received", "source": "contact", "media": null,
"created_at": "2026-10-19T09:41:11.000Z"
},
"conversation": {
"id": "…", "contact": { "wa_id": "905321234567", "name": "Ayşe" },
"unread_count": 1, "window_open": true,
"window_expires_at": "2026-10-20T09:41:11.000Z"
},
"number": { "id": "…", "display_phone_number": "+90 532 000 00 00" }
}
}İmzayı doğrulama
İmza, panelde gösterilen sır ile HMAC-SHA256("<t>.<ham gövde>") değeridir. Gövdeyi ayrıştırmadan önce ham haliyle doğrulayın ve 5 dakikadan eski zaman damgalarını reddedin.
Node.js
import crypto from "node:crypto";
// rawBody: ayrıştırılmamış gövde (string) · header: X-SMW-Signature
export function verifySignature(rawBody, header, secret) {
const parts = Object.fromEntries(header.split(",").map((p) => p.split("=")));
if (Math.abs(Date.now() / 1000 - Number(parts.t)) > 300) return false;
const expected = crypto.createHmac("sha256", secret).update(`${parts.t}.${rawBody}`).digest("hex");
return expected.length === parts.v1?.length &&
crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(parts.v1));
}Python
import hashlib, hmac, time
def verify_signature(raw_body: bytes, header: str, secret: str) -> bool:
parts = dict(p.split("=", 1) for p in header.split(","))
if abs(time.time() - int(parts["t"])) > 300:
return False
expected = hmac.new(secret.encode(), parts["t"].encode() + b"." + raw_body, hashlib.sha256).hexdigest()
return hmac.compare_digest(expected, parts.get("v1", ""))Teslim ve yeniden deneme
- 10 saniye içinde 2xx dönerseniz olay teslim edilmiş sayılır.
- Aksi halde 1 dk, 5 dk, 30 dk, 2 sa, 6 sa, 12 sa ve 24 sa sonra tekrar denenir (toplam 8 deneme).
- Üst üste 25 başarısızlıkta adres otomatik durdurulur; panelden yeniden etkinleştirebilirsiniz.
- Aynı olay birden fazla gelebilir; X-SMW-Event-Id ile tekilleştirin.
MCP: yapay zekâ asistanları
MCP (Model Context Protocol), yapay zekâ asistanlarının dış sistemleri araç olarak kullanmasını sağlayan açık bir standarttır. MCP sunucumuz, asistanınızın gelen kutunuzu okumasını ve sizin onayınızla mesaj göndermesini sağlar.
MCP sunucusu
https://sosyalmedya.website/api/mcpClaude ve ChatGPT (tek tıkla bağlan)
- Claude: Ayarlar → Bağlayıcılar → "Özel bağlayıcı ekle" ekranına MCP adresini yapıştırın. ChatGPT: geliştirici modunda yeni uygulama (bağlayıcı) ekleyip aynı adresi girin.
- Açılan sayfada sosyalmedya.website hesabınızla giriş yapın, izinleri seçip onaylayın. Gönderme iznini vermezseniz bağlantı salt okunur olur.
- Bağlantıyı istediğiniz zaman panelde API ve MCP → Bağlı yapay zekâ uygulamaları bölümünden kesebilirsiniz.
API anahtarıyla (Claude Code, Cursor, VS Code, Windsurf)
Bu araçlar OAuth'u da destekler; anahtar vermek istemezseniz yalnızca adresi ekleyin, ilk kullanımda giriş sayfası açılır.
Claude Code
# OAuth (tarayıcıda giriş) / OAuth (sign in in the browser)
claude mcp add --transport http sosyalmedya https://sosyalmedya.website/api/mcp
# API anahtarıyla / With an API key
claude mcp add --transport http sosyalmedya https://sosyalmedya.website/api/mcp \
--header "Authorization: Bearer smw_live_…"Cursor — .cursor/mcp.json
{
"mcpServers": {
"sosyalmedya": {
"url": "https://sosyalmedya.website/api/mcp",
"headers": {
"Authorization": "Bearer smw_live_…"
}
}
}
}VS Code — .vscode/mcp.json
{
"servers": {
"sosyalmedya": {
"type": "http",
"url": "https://sosyalmedya.website/api/mcp",
"headers": {
"Authorization": "Bearer smw_live_…"
}
}
}
}Windsurf — ~/.codeium/windsurf/mcp_config.json
{
"mcpServers": {
"sosyalmedya": {
"serverUrl": "https://sosyalmedya.website/api/mcp",
"headers": {
"Authorization": "Bearer smw_live_…"
}
}
}
}Araçlar
| Araç | Yetki | Ne yapar |
|---|---|---|
| get_account | read | İşletme, paket, bağlantının yetkileri ve numaralar |
| list_whatsapp_numbers | read | Bağlı numaralar |
| list_templates | read | Onaylı şablonlar ve değişken sayıları |
| list_conversations | read | Sohbetler, okunmamış sayısı, pencere durumu |
| get_conversation | read | Sohbetin son mesajları |
| get_message_status | read | İletildi / okundu / başarısız |
| send_text_message | send | Açık pencerede serbest metin |
| send_template_message | send | Onaylı şablon (yeni sohbet ya da pencere kapalıyken) |
| mark_conversation_read | send | Okundu işaretle |
Güvenlik ilkeleri
- Gönderme araçları dış etkili olarak işaretlidir; asistanlar göndermeden önce sizden onay ister.
- Toplu kampanya MCP'de bilerek yoktur: bir yapay zekânın yanlışlıkla çok sayıda kişiye yazması numaranızın kalite puanını düşürebilir. Kampanyaları panelden ya da REST API'den başlatın.
- Müşterilerden gelen mesajlar güvenilmeyen içerik olarak işaretlenir; asistana bu mesajlardaki talimatları uygulamaması söylenir. Gönderme iznini yalnızca güvendiğiniz asistana verin.
- Asistan yalnızca bağlanan kullanıcının görebildiklerini görür.
OpenAPI ve sürümleme
Tüm uçların makine tarafından okunabilir tanımı OpenAPI 3.1 biçimindedir. Postman, n8n, Make ya da ChatGPT Actions'a içeri aktarabilirsiniz.
https://sosyalmedya.website/api/v1/openapi.jsonSürüm 1 kararlıdır: yeni alan ve uçlar eklenebilir, var olanlar değişmez. Geriye uyumsuz bir değişiklik olursa /api/v2 olarak yayımlanır ve önceden duyurulur.
Sorularınız için: [email protected]