Kulak API dokümantasyonu
Bahsedilmeleri, anahtar kelimeleri, alarmları ve webhook'ları kendi uygulamandan yönet. REST API her planda, deneme dahil, ek ücret olmadan açık.
Hızlı başlangıç
- 1Kulak'a kayıt ol ve bir proje oluştur; anahtar kelimelerini ekle.
- 2Panelde Geliştirici bölümünden bir API anahtarı oluştur. Anahtar yalnızca bir kez gösterilir, güvenli bir yerde sakla.
- 3Aşağıdaki istekle en acil bahsedilmeleri çek. Proje kimliğini panelin adres çubuğunda veya GET /projects yanıtında bulursun.
curl "https://kulak.app/api/v1/mentions?projectId=prj_123&minUrgency=4&limit=20" \ -H "Authorization: Bearer kl_live_xxxxxxxxxxxxxxxx"Kimlik doğrulama
Her istekte Authorization: Bearer kl_live_... başlığını gönder. Anahtarlar sunucuda yalnızca özetlenmiş (hash) olarak saklanır; kaybedersen yenisini oluşturup eskisini iptal et.
Anahtarlar kapsam (scope) ile sınırlandırılır. :write kapsamı aynı kaynağın :read iznini de içerir. Bir anahtarı tek bir projeyle de sınırlayabilirsin; bu durumda projectId parametresi opsiyoneldir.
Erişimin olmayan ya da var olmayan kaynaklar aynı şekilde 404 döner; böylece başka hesaplara ait kimlikler tahmin edilemez.
REST kuralları
Temel adres https://kulak.app/api/v1. İstek ve yanıt gövdeleri JSON'dur; gövde en fazla 64 KB olabilir.
Her yanıt aynı zarfı kullanır. Başarılı yanıtlar data ve meta, hatalar error alanı taşır. Her yanıtta x-request-id başlığı ve meta.requestId bulunur; destek taleplerinde bu kimliği paylaş.
{ "data": { "id": "mnt_8f2k", "source": "x", "sentiment": "olumsuz", "urgency": 5 }, "meta": { "requestId": "req_3b1c9e", "idempotencyReplayed": false }}{ "error": { "code": "validation_error", "message": "Gönderilen veri geçersiz.", "requestId": "req_3b1c9e", "issues": [ { "path": "term", "message": "En az 2 karakter olmalı." } ] }}Hatalar
Hata kodu makine tarafından okunur ve sabittir; mesaj insan içindir ve değişebilir. İstemcinde her zaman error.code alanına göre dallan.
Idempotency
Yazma isteklerinde (POST, PATCH, DELETE) Idempotency-Key başlığı gönderebilirsin (en fazla 255 karakter). Aynı anahtarla tekrarlanan istek 24 saat boyunca ilk yanıtı döndürür ve meta.idempotencyReplayed alanı true olur.
Ağ hatasından sonra yeniden denerken aynı anahtarı kullan; çift kayıt oluşmaz. Her yeni işlem için yeni bir anahtar (ör. UUID) üret.
curl -X POST "https://kulak.app/api/v1/keywords" \ -H "Authorization: Bearer kl_live_xxxxxxxxxxxxxxxx" \ -H "Content-Type: application/json" \ -H "Idempotency-Key: 7d0e2c1a-4f5b-4a51-9d0c-2a4f0e6b1c11" \ -d '{"projectId":"prj_123","term":"Tencere","type":"brand"}'Sayfalama
Liste uç noktaları cursor tabanlıdır: ?limit= (varsayılan 25, en fazla 100) ve ?cursor=. Sonraki sayfa için yanıttaki meta.nextCursor değerini gönder; değer null ise son sayfadasın.
Cursor'lar opaktır; içeriğini ayrıştırma ya da elle üretme.
Rate limit
Her API anahtarı dakikada 120 istek yapabilir. Sınır aşıldığında 429 rate_limited ve saniye cinsinden Retry-After başlığı döner.
Toplu okumalarda en büyük sayfa boyutunu kullan, yeni veriyi sürekli sorgulamak yerine webhook'lara abone ol.
Webhook'lar
Panelden bir endpoint ekle ve dinlemek istediğin olayları seç. Kulak her olayı imzalı bir POST isteğiyle gönderir. Endpoint'in 2xx dönmelidir; aksi durumda teslimat yeniden denenir.
İstek zaman aşımı 10 saniyedir, yönlendirmeler takip edilmez. Başarısız teslimatlar üstel beklemeyle en fazla 8 kez denenir; art arda 20 başarısızlıktan sonra endpoint otomatik devre dışı kalır. Teslimat geçmişini panelden görebilir, tek tıkla yeniden gönderebilirsin.
Aynı olay birden fazla kez ulaşabilir; webhook-id başlığını saklayarak tekrarları ayıkla.
Olaylar
mention.createdmention.updatedmention.status_changedmention.marked_irrelevantkeyword.createdkeyword.updatedkeyword.deletedkeyword_group.createdkeyword_group.updatedkeyword_group.deletedalert.createdalert.updatedalert.deletedalert.deliveredproject.createdproject.updatedproject.deletedintegration.connectedintegration.disconnectedwebhook.test
{ "id": "evt_k2x9p1", "type": "mention.created", "timestamp": "2026-09-29T08:41:12.000Z", "projectId": "prj_123", "data": { "id": "mnt_8f2k", "source": "x", "url": "https://x.com/...", "text": "Tencere uygulamasında ödeme adımında sürekli hata alıyorum...", "category": "hata_bildirimi", "sentiment": "olumsuz", "urgency": 5 }}İmza doğrulama
İmzalar Standard Webhooks biçimindedir: HMAC-SHA256(anahtar, "{webhook-id}.{webhook-timestamp}.{ham gövde}") sonucunun base64 kodlaması. Anahtar, whsec_ önekinden sonraki base64 değerin çözülmüş byte'larıdır.
Doğrulamayı JSON'u ayrıştırmadan önce, ham gövde üzerinde yap. Zaman damgası 5 dakikadan eskiyse isteği reddet (tekrar saldırılarına karşı) ve karşılaştırmada sabit zamanlı fonksiyon kullan.
import { createHmac, timingSafeEqual } from "node:crypto"; const TOLERANCE_SECONDS = 300; /** rawBody: ayrıştırılmamış istek gövdesi (string). */export function verifyKulakWebhook(secret, headers, rawBody) { const id = headers["webhook-id"]; const ts = headers["webhook-timestamp"]; const sigHeader = headers["webhook-signature"]; if (!id || !ts || !sigHeader) return false; if (Math.abs(Date.now() / 1000 - Number(ts)) > TOLERANCE_SECONDS) return false; const key = Buffer.from(secret.replace(/^whsec_/, ""), "base64"); const expected = createHmac("sha256", key).update(`${id}.${ts}.${rawBody}`).digest(); return sigHeader.split(" ").some((part) => { const [version, sig] = part.split(",", 2); if (version !== "v1" || !sig) return false; const given = Buffer.from(sig, "base64"); return given.length === expected.length && timingSafeEqual(given, expected); });}Uç nokta referansı
Bu liste uygulamanın ürettiği OpenAPI belgesinden otomatik oluşturulur; her zaman API ile birebir aynıdır.
Projeler
GET
/api/v1/projectsProjeleri listeleKapsam:projects:readBaşarı:200POST
/api/v1/projectsProje oluşturKapsam:projects:writeBaşarı:201Idempotency-Key desteklerGövde alanları
GET
/api/v1/projects/{id}Proje ayrıntısıKapsam:projects:readBaşarı:200Parametreler
PATCH
/api/v1/projects/{id}Proje güncelleKapsam:projects:writeBaşarı:200Idempotency-Key desteklerParametreler
Gövde alanları
DELETE
/api/v1/projects/{id}Proje silKapsam:projects:writeBaşarı:200Idempotency-Key desteklerParametreler
GET
/api/v1/projects/{id}/membersÜyeler ve davetlerKapsam:projects:readBaşarı:200Parametreler
POST
/api/v1/projects/{id}/membersÜye davet etKapsam:projects:writeBaşarı:201Idempotency-Key desteklerParametreler
Gövde alanları
Anahtar kelimeler
GET
/api/v1/keywordsKeyword'leri listeleKapsam:keywords:readBaşarı:200Parametreler
POST
/api/v1/keywordsKeyword oluştur (plan limiti uygulanır)Kapsam:keywords:writeBaşarı:201Idempotency-Key desteklerGövde alanları
GET
/api/v1/keywords/{id}Keyword ayrıntısıKapsam:keywords:readBaşarı:200Parametreler
PATCH
/api/v1/keywords/{id}Keyword güncelle / duraklat (active)Kapsam:keywords:writeBaşarı:200Idempotency-Key desteklerParametreler
Gövde alanları
DELETE
/api/v1/keywords/{id}Keyword silKapsam:keywords:writeBaşarı:200Idempotency-Key desteklerParametreler
GET
/api/v1/keyword-groupsGrupları listeleKapsam:keywords:readBaşarı:200Parametreler
POST
/api/v1/keyword-groupsGrup oluşturKapsam:keywords:writeBaşarı:201Idempotency-Key desteklerGövde alanları
GET
/api/v1/keyword-groups/{id}Grup ayrıntısıKapsam:keywords:readBaşarı:200Parametreler
PATCH
/api/v1/keyword-groups/{id}Grup güncelleKapsam:keywords:writeBaşarı:200Idempotency-Key desteklerParametreler
Gövde alanları
DELETE
/api/v1/keyword-groups/{id}Grup silKapsam:keywords:writeBaşarı:200Idempotency-Key desteklerParametreler
Mention'lar
GET
/api/v1/mentionsMention akışı (filtreli, cursor sayfalı)Kapsam:mentions:readBaşarı:200Cursor sayfalıParametreler
GET
/api/v1/mentions/{id}Mention ayrıntısı (tespit özeti + notlar; maliyet/model/ham tespit içermez)Kapsam:mentions:readBaşarı:200Parametreler
PATCH
/api/v1/mentions/{id}Durum güncelleKapsam:mentions:writeBaşarı:200Idempotency-Key desteklerParametreler
Gövde alanları
POST
/api/v1/mentions/{id}/irrelevantAlakasız işaretle / geri alKapsam:mentions:writeBaşarı:200Idempotency-Key desteklerParametreler
Gövde alanları
Analiz
GET
/api/v1/analytics/mentionsMention analizi (zaman serisi, dağılımlar, ses payı)Kapsam:mentions:readBaşarı:200Parametreler
Kategoriler
GET
/api/v1/categoriesKategorileri listeleKapsam:projects:readBaşarı:200Parametreler
POST
/api/v1/categoriesKategori oluşturKapsam:projects:writeBaşarı:201Idempotency-Key desteklerGövde alanları
GET
/api/v1/categories/{id}Kategori ayrıntısıKapsam:projects:readBaşarı:200Parametreler
PATCH
/api/v1/categories/{id}Kategori güncelleKapsam:projects:writeBaşarı:200Idempotency-Key desteklerParametreler
Gövde alanları
DELETE
/api/v1/categories/{id}Kategori sil (sistem kategorileri hariç)Kapsam:projects:writeBaşarı:200Idempotency-Key desteklerParametreler
Alarmlar
GET
/api/v1/alertsAlarmları listeleKapsam:alerts:readBaşarı:200Parametreler
POST
/api/v1/alertsAlarm oluşturKapsam:alerts:writeBaşarı:201Idempotency-Key desteklerGövde alanları
GET
/api/v1/alerts/{id}Alarm ayrıntısıKapsam:alerts:readBaşarı:200Parametreler
PATCH
/api/v1/alerts/{id}Alarm güncelleKapsam:alerts:writeBaşarı:200Idempotency-Key desteklerParametreler
Gövde alanları
DELETE
/api/v1/alerts/{id}Alarm silKapsam:alerts:writeBaşarı:200Idempotency-Key desteklerParametreler
Kayıtlı görünümler
GET
/api/v1/saved-viewsGörünümleri listeleKapsam:mentions:readBaşarı:200Parametreler
POST
/api/v1/saved-viewsGörünüm oluşturKapsam:mentions:writeBaşarı:201Idempotency-Key desteklerGövde alanları
GET
/api/v1/saved-views/{id}Görünüm ayrıntısıKapsam:mentions:readBaşarı:200Parametreler
PATCH
/api/v1/saved-views/{id}Görünüm güncelleKapsam:mentions:writeBaşarı:200Idempotency-Key desteklerParametreler
Gövde alanları
DELETE
/api/v1/saved-views/{id}Görünüm silKapsam:mentions:writeBaşarı:200Idempotency-Key desteklerParametreler
Webhook'lar
GET
/api/v1/webhooksWebhook'ları listeleKapsam:webhooks:readBaşarı:200Parametreler
POST
/api/v1/webhooksWebhook oluştur (secret yalnızca bu yanıtta)Kapsam:webhooks:writeBaşarı:201Idempotency-Key desteklerGövde alanları
GET
/api/v1/webhooks/{id}Webhook ayrıntısıKapsam:webhooks:readBaşarı:200Parametreler
PATCH
/api/v1/webhooks/{id}Webhook güncelleKapsam:webhooks:writeBaşarı:200Idempotency-Key desteklerParametreler
Gövde alanları
DELETE
/api/v1/webhooks/{id}Webhook silKapsam:webhooks:writeBaşarı:200Idempotency-Key desteklerParametreler
POST
/api/v1/webhooks/{id}/testTest olayı gönder (senkron sonuç)Kapsam:webhooks:writeBaşarı:200Idempotency-Key desteklerParametreler
GET
/api/v1/webhooks/{id}/deliveriesTeslimat geçmişiKapsam:webhooks:readBaşarı:200Cursor sayfalıParametreler
POST
/api/v1/webhooks/{id}/deliveries/{deliveryId}/replayTeslimatı yeniden gönderKapsam:webhooks:writeBaşarı:202Idempotency-Key desteklerParametreler
Hesap
GET
/api/v1/usagePlan ve kota kullanımıKapsam:usage:readBaşarı:200Parametreler
GET
/api/v1/accountHesap bilgisiKapsam:account:readBaşarı:200
Anahtarını oluştur, ilk isteğini at
API ve webhook her planda, deneme dahil. Kredi kartı gerekmez.