API ve webhook'lar — Craft'ı CRM'inize veya web sitenize bağlayın
Craft'ı anahtarlı isteklerle nasıl kontrol eder ve yeni kişiler, düğme tıklamaları, ödemeler ve gönderiler hakkındaki olayları kendi sunucunuzda nasıl alırsınız.
Craft'ı CRM'inize, bir müşterinin web sitesine veya kendi herhangi bir hizmetinize bağlayabilirsiniz. MCP bağlayıcısının yapabildiği her şey anahtarlı düz bir HTTPS isteği olarak mevcuttur: huniler, kişiler, toplu mesajlar, gönderiler, karuseller, görseller. Webhook'lar ters yönde çalışır: yeni bir kişi göründüğünde, biri bir düğmeye tıkladığında, bir huni hedefine ulaştığında, ödeme yaptığında veya bir gönderi yayına girdiğinde Craft sunucunuza bir olay gönderir.
Nasıl çalışır#
- Craft'ta bir anahtar oluşturur ve ne yapabileceğini seçersiniz: yalnızca okuma veya huniler, kişiler, toplu mesajlar, gönderiler vb. ile çalışma.
- Sunucunuz, başlıkta anahtarla
https://craftopen.space/api/v1/tools/<method>adresine bir istek gönderir. Yöntem parametreleri JSON istek gövdesinde gider. - Craft yöntemi hesabınızda çalıştırır — tıpkı siz web sitesinde yapmış veya MCP bağlayıcısı üzerinden yapay zekânızdan istemiş gibi, aynı kontroller ve limitlerle.
- Olaylar için bir webhook eklersiniz — sunucunuzun adresi. Craft oraya imzalı bir istek gönderir ve sunucunuz yanıt vermezse yeniden dener.
Neye ihtiyacınız var#
- Herhangi bir tarife: anahtarlar ve webhook'lar ücretsiz dahil her tarifede oluşturulabilir.
- HTTPS istekleri gönderip alabilen bir sunucu veya hizmet: kendi kodunuz, Make, n8n, Zapier veya gelen webhook'ları olan bir CRM.
Adım 1. Bir anahtar oluşturun#
Profil menüsü → API ve webhook'lar (API & webhooks) (veya Ayarlar → API ve webhook'lar) → Yeni anahtar.
- Anahtara sonra tanıyacağınız bir ad verin: "HubSpot", "Müşteri web sitesi".
- Anahtarın ne yapabileceğini seçin. Yeni bir anahtar varsayılan olarak yalnızca okuyabilir. Diğer her şey onay kutularıyla açılır: huniler, kişiler, toplu mesajlar, gönderiler, içerik, İçerik Fabrikası, hesaplar. "Her şey", sonradan eklenenler dahil tüm yetenekleri açar.
- Anahtarın gönderileri ve toplu mesajları nasıl yayınlayacağını seçin: - Yalnızca taslaklar — her şey taslak olarak kaydedilir ve siz Craft'ta kendiniz gönderirsiniz; - Zamanlanmış — en erken 10 dakika sonra, böylece iptal etmek için zaman olur; - Anında — istek anında yayınlar ve gönderir.
- Görsel harcamaları için günlük limiti ve anahtarın bir bottan günde kaç toplu mesaj gönderebileceğini ayarlayın.
- Anahtar oluştur'a tıklayın ve hemen kopyalayın.
🔴 Anahtar yalnızca bir kez gösterilir. Craft yalnızca parmak izini saklar ve onu geri getiremez. Kaybettiniz mi? İptal edin ve yenisini oluşturun. Anahtarı asla web sayfası koduna veya bir mobil uygulamaya koymayın — her ziyaretçi onu görürdü. Anahtarın yeri yalnızca bir sunucudur.
Bir anahtarın izinlerini ve ayarlarını istediğiniz zaman "Ayarlar" ile değiştirebilirsiniz — değişiklikler bir dakika içinde etkili olur. "İptal et" anahtarı hemen kapatır.
Adım 2. İlk isteğiniz#
curl -X POST https://craftopen.space/api/v1/tools/list_funnels \
-H "Authorization: Bearer craft_your_key" \
-H "Content-Type: application/json" \
-d '{}'
Başarılı bir yanıt her zaman böyle görünür — verinin kendisi data içindedir:
{"ok": true, "data": {"funnels": [ ... ]}}
Bir şey yanlışsa "ok": false ve açık bir neden alırsınız:
{"ok": false, "error": {"code": "funnel_not_found", "message": "Воронка не найдена."}}
⚠️ Hata mesajları şu anda Rusça yazılıyor. Mantığınızı error.code üzerine kurun —
kararlıdır ve dilden bağımsızdır.
Mevcut yöntemler#
Tüm yöntemler ve açıklamalı parametreleri:
- Craft'ta: anahtarınızla
GET https://craftopen.space/api/v1/tools— liste her yöntemin hangi izni gerektirdiğini ve bu anahtarın onu çağırıp çağıramayacağını söyler; - bir OpenAPI açıklaması: craftopen.space/api/v1/openapi.json — Postman, Insomnia ve istemci üreteçleri onu anlar.
Yöntemler MCP bağlayıcısınınkilerle aynıdır. En yaygın olanlar:
| Görev | Yöntem | Anahtar izni |
|---|---|---|
| Huniler ve istatistikleri listesi | list_funnels, get_funnel_stats |
okuma |
| Bot abonelerini bulma | find_contacts |
okuma |
| Abone kartı | get_contact |
okuma |
| Etiket ekleme veya kaldırma | tag_contacts |
kişiler |
| Bir kişi için huni çalıştırma | run_funnel_for_contact |
kişiler, "Anında" modu |
| Zamanlanmış gönderi | list_publishing_accounts → schedule_post |
gönderiler |
| Telegram toplu mesajı | save_broadcast_draft → send_broadcast_test → send_broadcast |
toplu mesajlar |
| Metninizden karusel | create_carousel, render_carousel |
içerik |
| Credits karşılığında görsel | generate_image |
içerik |
GET https://craftopen.space/api/v1/me hangi anahtarı kullandığınızı, izinlerini ve bugün kaç
istek kaldığını gösterir.
Çift kayıt olmadan yeniden deneme#
Bir istek koptuysa ve geçip geçmediğini bilmiyorsanız aynı Idempotency-Key başlığıyla
yeniden gönderin. Gönderi iki kez çıkmaz ve bir görsel iki kez ücretlendirilmez.
curl -X POST https://craftopen.space/api/v1/tools/schedule_post \
-H "Authorization: Bearer craft_your_key" \
-H "Idempotency-Key: post-2026-09-27-lime-1" \
-H "Content-Type: application/json" \
-d '{"account_ids": ["..."], "confirm_usernames": ["@lime_agency"],
"carousel_id": "...", "caption": "Post text",
"scheduled_at": "2026-09-27T19:00:00+03:00"}'
⚠️ Onaylar isteğin bir parçasıdır. Web sitesinin "emin misiniz" diye soracağı yerde
API parametrelerde bir onay bekler: bir gönderi için hesap @kullanıcıadları
(confirm_usernames), bir toplu mesaj için tam alıcı sayısı (confirm_recipients),
düzenlediğiniz aktif bir huninin adı, bir ödeme bloğunun fiyatı. Onay Craft'ın gördüğüyle
uyuşmazsa hiçbir şey gönderilmez — yanıt size doğru değeri söyler.
Hatalar ve ne yapmalı#
| Durum | Anlamı |
|---|---|
| 400 | Geçersiz parametreler — message hangisi olduğunu söyler |
| 401 | Anahtar yok, yanlış anahtar veya anahtar iptal edilmiş |
| 403 | API'siz tarife (plan_required), anahtarda izin eksik (scope_required) veya yayınlama modu işleme izin vermiyor |
| 404 | Bulunamadı: huni, kişi, gönderi veya yöntem |
| 409 | Siz okuduktan sonra veriler değişti veya bir onay uyuşmadı — yeniden okuyun |
| 429 | Hız limiti — Retry-After başlığının söylediği kadar saniye bekleyin |
| 500, 503 | Geçici hata — aynı Idempotency-Key ile bir dakika sonra yeniden deneyin |
Limitler#
- Hesap başına dakikada 60 istek ve günde 10.000 — tüm anahtarlar genelinde. Gün Moskova saatiyle (UTC+3) sayılır. Daha fazlası mı gerekiyor? Destek ekibine yazın; limit tarifenizi değiştirmeden artırılır.
- Webhook'lar limite sayılmaz.
- Görseller web sitesindeki fiyatlarla credits harcar ve asla anahtar için belirlediğiniz günlük limiti aşmaz.
- Toplu mesajlar: bot başına günde seçilen sayıdan fazla değil. Göndermeden önce
send_broadcast_testile aynı metnin kendinize test gönderimi zorunludur.
Webhook'lar#
API ve webhook'lar → Webhook ekle: sunucu adresinizi girin (yalnızca https://) ve
olayları seçin. Oluşturduktan hemen sonra Craft imzalama sırrını gösterir — kaydedin,
bir daha gösterilmez ("Yeni sır" ile yenisini oluşturabilirsiniz).
Test, bir ping olayı gönderir ve sunucunuzun ne yanıt verdiğini gösterir. Günlük
son teslimatları listeler: ne gönderildiği, ulaşıp ulaşmadığı, yanıt ve bir "Yeniden dene"
düğmesi.
Olaylar#
| Olay | Ne zaman gelir |
|---|---|
contact.created |
Biri bir bota abone oldu veya Instagram Direct'inize ilk kez yazdı |
funnel.button_clicked |
Biri bir hunideki düğmeye tıkladı |
funnel.goal_reached |
Biri huni hedefine ulaştı |
payment.succeeded |
Bir huni ödeme bloğu üzerinden bir ödeme geçti |
post.published |
Bir gönderi sosyal ağda yayına girdi |
agent.message_received |
Bir müşterinin mesajı yapay zekâ ajanına ulaştı — Instagram'da veya Telegram'da |
agent.replied |
Yapay zekâ ajanı müşteriye yanıt verdi ve yanıt gönderildi. Veride yanıt metni var |
agent.handed_over |
Yapay zekâ ajanı müşteriyi personele devretti. Veride özet ve teslim edilip edilmediği, kime teslim edildiği var |
Ajan olayları platform (instagram veya telegram), account_id (Instagram hesabı veya bot), contact_id ve bir zaman damgası taşır, böylece ajanın konuşma geçmişini kendi CRM'inizde veya hizmetinizde tutabilirsiniz.
Örnek istek gövdesi:
{
"id": "6f1c…",
"type": "contact.created",
"created_at": "2026-09-26T09:04:11+00:00",
"data": {
"platform": "telegram",
"contact_id": "…",
"bot_username": "shop_bot",
"first_name": "Anna",
"username": "anna",
"source": {"type": "link", "ref": "promo"}
}
}
Olay id'si yeniden denemeler boyunca aynı kalır — çift kayıtları atmak için kullanın.
Bir isteğin Craft'tan geldiğini doğrulama#
Her isteğin bir Craft-Signature: t=<zaman>,v1=<imza> başlığı vardır. İmza, sırrınızla
<zaman>.<istek gövdesi> dizesinin HMAC-SHA256'sıdır. Hesaplayın ve karşılaştırın:
import hmac, hashlib, time
def craft_signature_ok(header: str, body: bytes, secret: str) -> bool:
parts = dict(p.split("=", 1) for p in header.split(","))
if abs(time.time() - int(parts["t"])) > 300: # older than 5 minutes — reject
return False
expected = hmac.new(secret.encode(), f"{parts['t']}.".encode() + body, hashlib.sha256).hexdigest()
return hmac.compare_digest(expected, parts["v1"])
const crypto = require("crypto");
function craftSignatureOk(header, rawBody, 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 crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(parts.v1));
}
⚠️ İmza ham istek gövdesi üzerinden hesaplanır — tam olarak gelen baytlar. Çatınız önce JSON'u ayrıştırıp yeniden serileştiriyorsa imza uyuşmaz.
Yeniden denemeler#
Craft bir yanıt için 10 saniyeye kadar bekler. Herhangi bir 2xx yanıtı teslim edilmiş
sayılır. Aksi halde Craft 1 dakika, 5 dakika, 30 dakika, 2, 6, 12 ve 24 saat sonra yeniden
dener — toplam 8 deneme, ardından olay "başarısız" olarak işaretlenir (günlükten yeniden
gönderebilirsiniz).
🔴 Art arda 50 başarısız teslimattan sonra webhook, ölü bir adrese vurmaya devam etmesin diye kapatılır. Sunucunuzu düzeltin ve "Aç"a tıklayın — sayaç sıfırlanır. Webhook kapalıyken olan olaylar gönderilmez.
Hızlı yanıt verin ve yavaş işi yanıttan sonra yapın: sunucunuz 10 saniyeden uzun sürerse Craft denemeyi başarısız sayar ve olayı yeniden gönderir.
Kendi kanalınız: yapay zekâ ajanı yanıtları#
Müşteriler size Craft'ın bağlı olmadığı yerlerde yazıyorsa (kendi mesajlaşma uygulamanız, web sitesi sohbeti, CRM), yapay zekâ ajanı orada da yanıt verebilir. Sisteminiz müşterinin mesajını gönderir — Craft ajanın yanıtını döndürür. Sisteminiz onu müşteriye iletir.
curl -X POST https://craftopen.space/api/v1/agent/reply \
-H "Authorization: Bearer craft_…" -H "Content-Type: application/json" \
-d '{"ig_user_id": "1784…", "contact_id": "client-42", "text": "How much is JET+?", "name": "Ivan"}'
- Kimin ajanı yanıt verir — ajanı kurulu bir Instagram hesabının
ig_user_id'si veya bir Telegram botununtg_bot_id'si. Onun kuralları, bilgi tabanı, modeli ve devir ayarları kullanılır. contact_id— sabit müşteri kimliğiniz; ajan konuşmayı bununla hatırlar.name— isteğe bağlı, personele devir için.- Yanıt:
reply— müşteri için metin,handed_over— ajan müşteriyi personele devretti (potansiyel müşteri Instagram potansiyel müşterilerinin gittiği yere gider),paused— ajan personel onu geri verene kadar sessiz kalır,credits_charged— harcanan credits. - Yanıtlar, Instagram'daki gibi credits tutar. Credits biterse
no_creditshatası alırsınız. agent.message_received,agent.repliedveagent.handed_overolayları bu kanal için de tetiklenir.
⚠️ Bu kanal üzerinden ajan yalnızca metin gönderir — hunilerden video veya dosya yok.
Henüz mevcut değil#
- Hazır istemci kütüphaneleri — OpenAPI açıklamasını kullanın.
- Anahtar ve webhook'ları API'nin kendisiyle oluşturma — yalnızca API ve webhook'lar sayfasında.
- Üçüncü taraf uygulamalar için "Craft ile giriş yap": bir anahtar yalnızca kendi hesabınıza erişim verir.