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ştur

2. 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
readNumaralar, şablonlar, sohbetler, mesajlar ve kampanyaları okur.
sendMesaj 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öntemYolYetkiAçıklama
GET/mereadİşletme, kullanıcı, anahtar yetkisi ve bağlı numaralar
GET/numbersreadBağlı WhatsApp numaraları
GET/templatesreadŞablonlar (?number_id=&status=APPROVED)
GET/conversationsreadSohbetler, son mesaja göre (?search=&number_id=&page=)
GET/conversations/{id}readSohbet ve son mesajlar (?limit=1–150)
POST/conversations/{id}/readsendOkundu işaretle, müşteriye okundu bilgisi gönder
POST/messagessendMetin ya da şablon gönder
GET/messages/{id}readMesaj ve iletim durumu
GET/campaignsreadKampanyalar
POST/campaignssendİzinli toplu şablon gönderimi
GET/campaigns/{id}readKampanya ve sayaçlar
POST/campaigns/{id}/cancelsendKampanyayı 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"
  }
}
codeHTTPAnlamı
unauthorized401Anahtar yok, hatalı ya da iptal edilmiş
insufficient_scope403Anahtar salt okunur; gönderme yetkisi gerekli
plan_upgrade_required402Paket API içermiyor (Pro veya İşletme gerekli)
subscription_inactive402Abonelik etkin değil
validation_failed422Geçersiz alan; detail alanı hangisi olduğunu söyler
not_found404Kayıt bulunamadı ya da bu işletmeye ait değil
window_closed40924 saat penceresi kapalı ya da henüz sohbet yok: şablon gönderin
no_wa_account409Bağlı WhatsApp numarası yok
template_not_available422Şablon yok, onaylı değil ya da bu dilde değil
undeliverable422Numara WhatsApp kullanmıyor olabilir
rate_limited429Hı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.receivedMüşteriden yeni mesaj (metin, medya, konum, tepki…).
message.statusGönderdiğiniz mesajın durumu değişti: sent, delivered, read, failed.

Başlıklar

header
X-SMW-EventOlay türü
X-SMW-Event-IdOlay kimliği; tekrar gelen olayları ayıklamak için kullanın
X-SMW-DeliveryBu gönderimin kimliği
X-SMW-Signaturet=<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/mcp

Claude ve ChatGPT (tek tıkla bağlan)

  1. 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.
  2. 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.
  3. 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çYetkiNe yapar
get_accountreadİşletme, paket, bağlantının yetkileri ve numaralar
list_whatsapp_numbersreadBağlı numaralar
list_templatesreadOnaylı şablonlar ve değişken sayıları
list_conversationsreadSohbetler, okunmamış sayısı, pencere durumu
get_conversationreadSohbetin son mesajları
get_message_statusreadİletildi / okundu / başarısız
send_text_messagesendAçık pencerede serbest metin
send_template_messagesendOnaylı şablon (yeni sohbet ya da pencere kapalıyken)
mark_conversation_readsendOkundu 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.json

Sü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]