İçeriğe geç

API Dokümantasyonu

Planlanan genel REST API'nin taslak sözleşmesi

v2.0 Taslak
Bu API henüz yayında değil.

Aşağıdaki uç noktalar planlanan genel REST API'nin taslağıdır; bugün çağrı yapılabilecek bir api.synaptixai.services servisi bulunmuyor. Bot kurulumu ve kanal bağlantıları için kurulum rehberini kullanın.

Kurulum rehberine gidin

Bir bölüm istisna: Giden webhook’lar yazıldı ve bugün çalışıyor. Aşağıdaki webhook bölümü taslak değil, bugünkü sözleşmedir. Giden webhook’lar bölümüne gidin

Taslak

🚀 Başlangıç

Synaptix API, RESTful mimari kullanır ve JSON formatında veri döner. Tüm istekler HTTPS üzerinden yapılmalıdır.

Base URL

https://api.synaptixai.services/v2

Hızlı Başlangıç

cURL
curl -X GET "https://api.synaptixai.services/v2/chatbots" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json"
Taslak

🔐 Kimlik Doğrulama

API istekleri için Bearer token kullanılır. API anahtarınızı dashboard'dan alabilirsiniz.

Authorization Header
Authorization: Bearer sk_live_abc123xyz456
⚠️ Güvenlik Uyarısı: API anahtarlarınızı asla public repository'lerde paylaşmayın. Environment variables kullanın.
Taslak

🤖 Chatbots

GET /chatbots

Tüm chatbot'larınızı listeler.

Response

{
  "data": [
    {
      "id": "bot_abc123",
      "name": "Customer Support Bot",
      "status": "active",
      "language": "tr",
      "created_at": "2026-01-15T10:30:00Z"
    }
  ],
  "total": 1,
  "page": 1
}
POST /chatbots

Yeni bir chatbot oluşturur.

Request Body

{
  "name": "Sales Bot",
  "language": "en",
  "model_tier": "pro",
  "training_data": [
    {
      "type": "url",
      "content": "https://example.com/faq"
    }
  ]
}
Taslak

💬 Messages

POST /messages

Chatbot'a mesaj gönderir ve yanıt alır.

Request Body

{
  "chatbot_id": "bot_abc123",
  "message": "Merhaba, yardımcı olabilir misiniz?",
  "user_id": "user_xyz789",
  "language": "tr"
}

Response

{
  "id": "msg_def456",
  "chatbot_id": "bot_abc123",
  "message": "Merhaba! Elbette yardımcı olabilirim. Size nasıl yardımcı olabilirim?",
  "language": "tr",
  "confidence": 0.95,
  "timestamp": "2026-01-28T14:30:00Z"
}
Yayında

🔔 Giden webhook’lar

Bu bölüm yayında.

Sayfanın geri kalanı taslaktır; buradaki sözleşme bugün çalışan koddur. Business ve Enterprise planlarında kullanılabilir ve panelden, botun webhook ayarından kurulur — kurulum için çağırabileceğiniz bir REST ucu yoktur.

Botunuz bir talep ya da randevu yakaladığında, sizin belirlediğiniz https adresine imzalı bir JSON POST gönderiyoruz. Bağlantı tek yönlüdür: çağrıyı biz yaparız, siz bize çağrı yapmazsınız.

Gönderilen olaylar

  • request.created — bot bir talep yakaladıktan ve kayıt yazıldıktan sonra gönderilir.
  • appointment.created — bot bir randevu yakaladıktan ve kayıt yazıldıktan sonra gönderilir.
  • webhook.test — panelden test gönderimini siz başlattığınızda gönderilir. Abone olunacak bir olay değildir; gövdesi gerçek bir request.created ile aynı biçimdedir ve is_test alanı taşır.

Başlıklar

HTTP
POST https://example.com/synaptix
Content-Type: application/json
User-Agent: Synaptix-Webhooks/1.0
X-Synaptix-Event: request.created
X-Synaptix-Delivery: 6d0f1c2e-6a1f-4f4a-9a8d-2f7c5b1ea91b
X-Synaptix-Signature: sha256=<lowercase hex>

X-Synaptix-Delivery her deneme için yeniden üretilir ve gövdedeki delivery_id ile aynı değerdir. Tekilleştirme yapacaksanız bu değeri değil data.id alanını kullanın: aynı kayıt yeniden gönderilirse teslimat kimliği değişir, kayıt kimliği değişmez.

Webhook Payload

Zarf her olayda aynıdır; olaya göre değişen tek alan data’dır. Aşağıda bir request.created gövdesi var.

request.created
{
  "event": "request.created",
  "delivery_id": "6d0f1c2e-6a1f-4f4a-9a8d-2f7c5b1ea91b",
  "created_at": "2026-09-09T12:04:11.482Z",
  "bot_id": "1f0b6d5e-2a44-4c9f-8b21-9e6a2f3c7d10",
  "data": {
    "id": "9c1a7f22-4d63-4b0e-9d61-3a8f5c2b7e04",
    "request_type": "lead_collection",
    "status": "new",
    "message": "Fiyat listesi alabilir miyim?",
    "visitor_name": "Ada Yılmaz",
    "visitor_email": "ada@example.com",
    "visitor_phone": null,
    "source_page_host": "example.com",
    "created_at": "2026-09-09T12:04:11.101Z"
  }
}

appointment.created olayında zarf aynı kalır, data alanı ise şu alanları taşır:

appointment.created · data
{
  "id": "2b7d4f10-9c33-4a6e-8f52-71c0d9ab3e64",
  "request_id": "9c1a7f22-4d63-4b0e-9d61-3a8f5c2b7e04",
  "status": "pending",
  "message": "Cuma 14:30 için randevu",
  "visitor_name": "Ada Yılmaz",
  "visitor_email": "ada@example.com",
  "visitor_phone": "+90 555 000 00 00",
  "appointment_date": "2026-09-11",
  "appointment_time": "14:30",
  "appointment_at": "2026-09-11T11:30:00Z",
  "source_page_host": "example.com",
  "created_at": "2026-09-09T12:04:11.101Z"
}

İmzayı doğrulama

İmza şudur: HMAC-SHA256(imza anahtarınız, gövdenin ham baytları), küçük harfli hex. Başlıkta “sha256=” önekiyle taşınır. Aşağıdaki iki örnek doğrudan kendi ucunuza yapıştırılabilir.

Ham gövde şarttır. Gövdeyi ayrıştırıp yeniden JSON’a çevirirseniz anahtar sırası ve boşluklar değişir; imza o an tutmaz. Doğrulamayı ayrıştırmadan önce, aldığınız baytların üzerinde yapın.

Node.js (Express)
const crypto = require('crypto');
const express = require('express');
const app = express();

// express.raw: the signature covers the bytes we sent, so the handler
// must see the raw body and not a re-serialised object.
app.post('/synaptix', express.raw({ type: 'application/json' }), (req, res) => {
  const expected = 'sha256=' + crypto
    .createHmac('sha256', process.env.SYNAPTIX_WEBHOOK_SECRET)
    .update(req.body)
    .digest('hex');

  const received = req.get('X-Synaptix-Signature') || '';
  const a = Buffer.from(expected, 'utf8');
  const b = Buffer.from(received, 'utf8');

  // timingSafeEqual throws when the lengths differ, so length is checked
  // first - and it is checked in constant time for equal-length input.
  if (a.length !== b.length || !crypto.timingSafeEqual(a, b)) {
    return res.status(401).send('invalid signature');
  }

  const payload = JSON.parse(req.body.toString('utf8'));
  // payload.event, payload.delivery_id, payload.bot_id, payload.data
  res.sendStatus(200);
});
Python (Flask)
import hashlib
import hmac
import os
from flask import Flask, request

app = Flask(__name__)
SECRET = os.environ["SYNAPTIX_WEBHOOK_SECRET"].encode("utf-8")

@app.post("/synaptix")
def synaptix():
    raw = request.get_data()  # bytes, exactly as received
    expected = "sha256=" + hmac.new(SECRET, raw, hashlib.sha256).hexdigest()
    received = request.headers.get("X-Synaptix-Signature", "")

    # compare_digest is constant time and safe on unequal lengths.
    if not hmac.compare_digest(expected, received):
        return "invalid signature", 401

    payload = request.get_json()
    # payload["event"], payload["delivery_id"], payload["bot_id"], payload["data"]
    return "", 200
⚠️ Sabit zamanlı karşılaştırma: İki imzayı “===” ya da “==” ile karşılaştırmayın. Bu operatörler ilk farklı baytta durur; harcanan süre, denenen imzanın kaç baytının doğru olduğunu ele verir ve saldırgan doğru imzayı bayt bayt kurabilir. Node’da crypto.timingSafeEqual, Python’da hmac.compare_digest her karşılaştırmada aynı süreyi harcar; örneklerde bu yüzden onlar kullanılıyor.

Adres kuralları

Adres https olmalı ve genel internetten erişilebilen bir konağı göstermelidir. İsteği biz gönderdiğimiz için adres bizim ağ bağlamımızdan çözülür; bu yüzden localhost ve IPv6 karşılığı, 10.x, 172.16–31.x, 192.168.x, 169.254.x, IPv4’e eşlenmiş geri döngü adresleri, Synaptix’in kendi sunucuları ve içinde kullanıcı adı ya da parola taşıyan adresler kabul edilmez. Kendi ağınızın içindeki bir uca ulaşamayız.

Teslimat başarısız olursa

Uç noktanız 2xx dönmelidir. 3xx de başarısızlık sayılır: yönlendirmeyi takip etmiyoruz, çünkü https bir adresten özel bir adrese yapılan yönlendirme yukarıdaki konak kurallarını anlamsız kılardı. Her deneme sınırlı bir zaman aşımına tabidir; önce 2xx dönün, ağır işi sonra yapın. Başarılı da başarısız da her deneme kaydedilir ve panelde görünür; başarısız bir teslimat otomatik olarak tekrarlanmaz. Hiçbir durumda ziyaretçinin sohbeti bundan etkilenmez.

İmza anahtarı bir kez gösterilir

⚠️ Yalnızca bir kez: Anahtar, webhook’u kurduğunuz andaki yanıtta bir kez görünür; hiçbir listede, hiçbir durum sorgusunda bir daha dönmez ve panelin okuduğu görünümde zaten yer almaz. O anda kaydedin. Kaybederseniz panelden yeni bir anahtar üretebilirsiniz; yeni anahtar üretildiği anda eski anahtarla imzalanmış gövdeler doğrulanmaz, bu yüzden ucunuzu aynı anda güncelleyin.
Taslak

⚠️ Error Handling

API, standart HTTP status code'ları kullanır.

Status Code Açıklama
200 Başarılı istek
400 Hatalı istek (Bad Request)
401 Yetkisiz erişim (Unauthorized)
404 Kaynak bulunamadı (Not Found)
429 Rate limit aşıldı
500 Sunucu hatası

Error Response

{
  "error": {
    "code": "invalid_request",
    "message": "Chatbot ID is required",
    "details": {
      "field": "chatbot_id",
      "issue": "missing"
    }
  }
}
Taslak

⏱️ Rate Limits

API istekleri için rate limit uygulanır.

Taslak: Sayısal limitler henüz belirlenmedi. API yayına alındığında limit her plan için ayrı yayımlanacak ve planın aylık mesaj hakkıyla birlikte okunacaktır. Bu sayfada bugün sabit bir sayı yazmıyoruz.

Rate Limit Headers

X-RateLimit-Limit: 60
X-RateLimit-Remaining: 45
X-RateLimit-Reset: 1706450400

Bugün kullanabileceğiniz yol

Yayımlanmış bir SDK paketimiz yok. Botunuzu sitenize bağlamak için kurulum sihirbazının verdiği gömme kodunu kullanın. WhatsApp, Instagram ve Messenger bağlantısı ise yakında açılacak; o zamana kadar panelden kurulamıyor.

Web widget

Kurulum sihirbazı size tek satırlık bir script etiketi verir; sayfanıza yapıştırmanız yeterlidir.

Kurulum rehberi

Meta kanalları

WhatsApp, Instagram ve Messenger tek bir bağlantıyla kurulacak ve kod yazmanız gerekmeyecek. Bu bağlantı yakında kullanıma açılacak.

Entegrasyon rehberi