Kişiler API’si
Bir kişi, mesajlaştığınız tek bir bireydir; adı, telefon numarası, e-postası, kanalı, etiketleri, özel alanları ve dahil olduğu listeler ve kampanyalar bu kapsamdadır. Kişiler API’si, kontrol panelini kullanmadan kişileri oluşturmanıza, aramanıza, güncellemenize, etiketlemenize, toplu olarak içe aktarmanıza ve silmenize olanak tanır.
Bu sayfadaki tüm yollar, temel URL’ye göre belirlenmiştir:
https://api.youraiconnector.com/v1
Yani /contacts ifadesi https://api.youraiconnector.com/v1/contacts anlamına gelir.
API’de yeni misiniz? Öncelikle API Erişimi bölümünü okuyun; bu bölüm API anahtarınızı nasıl oluşturacağınızı, üç kimlik doğrulama yöntemini, hız sınırlarını ve hata biçimini kapsar. Bu sayfadaki her şey, halihazırda çalışan bir API anahtarınız olduğunu varsayar.
Kişi kimlikleri (ID) hakkında
Her kişinin benzersiz bir kimliği (ID) vardır. Bir kişiyi oluşturduğunuzda (bkz. data.contactId) aldığınız kimlik, diğer her yerde (o kişiyi getirmek, güncellemek, etiketlemek, mesaj göndermek veya silmek için) kullandığınız kimliğin aynısıdır. Bir kez kaydedin ve tekrar kullanın.
Kimliğini almak için bir kişi oluşturmak zorunda değilsiniz. Ayrıca telefon numarası veya e-posta ile arama yapabilir (bkz. Bir kişiyi getir) veya tüm kişilerinizi sayfalayarak listeleyebilirsiniz (bkz. Kişileri listele). Bunların her biri aynı kimliği döndürür.
Bir kişi oluştur
POST /contacts
Hesabınıza yeni bir kişi ekler. Ülke koduyla birlikte bir telefon numarası zorunludur; sadece e-posta yeterli değildir. Diğer her şey isteğe bağlıdır.
İsteğe bağlı olarak, yeni kişiyi listId (tek bir liste) veya listIds (bir dizi) kullanarak doğrudan bir veya daha fazla listeye ekleyebilirsiniz. Her ikisi de gönderilirse, listIds önceliklidir.
Aşağıdaki Kişi oluşturma alanı tablosunda listelenen standart oluşturma alanlarından biri olmayan gönderdiğiniz her alan (phoneNumber, firstName, lastName, email, channel, is_bot_active, is_private, lead_profile, listId, listIds, custom_fields) otomatik olarak özel alan olarak kaydedilir; bu sayede Make veya Zapier gibi bir araçtan gelen düz bir yük, iç içe yerleştirme gerektirmeden çalışır. Ayrıca açık bir custom_fields nesnesi de iletebilirsiniz.
| Alan | Zorunlu | Açıklama |
|---|---|---|
phoneNumber |
Evet | Kişinin ülke koduyla birlikte telefon numarası (örneğin +15551234567). |
firstName |
Hayır | Ad. |
lastName |
Hayır | Soyad. |
email |
Hayır | E-posta adresi. |
channel |
Hayır | Mesajlaşma kanalı. whatsapp, sms, whatsapp_web değerlerinden biri. Varsayılan değer whatsapp’dur. |
is_bot_active |
Hayır | Yapay zeka asistanının bu kişiye yanıt verip vermeyeceği. Varsayılan değer true’dir. |
is_private |
Hayır | Kişiyi özel olarak işaretleyin. true olduğunda, yapay zeka asistanı onlar için kapatılır. Varsayılan değer false’tür. |
lead_profile |
Hayır | Aday hakkında serbest metin notları. |
listId |
Hayır | Kişinin ekleneceği tek bir liste kimliği. |
listIds |
Hayır | Kişinin ekleneceği liste kimliklerinden oluşan bir dizi (listId değerine göre önceliklidir). |
custom_fields |
Hayır | Kendi anahtar/değer alanlarınızdan oluşan bir nesne. Bunları en üst düzey anahtarlar olarak da iletebilirsiniz. |
cURL
curl -X POST "https://api.youraiconnector.com/v1/contacts?apiKey=YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"phoneNumber": "+15551234567",
"firstName": "Jane",
"lastName": "Smith",
"email": "jane@example.com",
"is_bot_active": true,
"listIds": ["list123", "list456"]
}'
JavaScript
const res = await fetch("https://api.youraiconnector.com/v1/contacts", {
method: "POST",
headers: {
"X-API-Key": "YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
phoneNumber: "+15551234567",
firstName: "Jane",
lastName: "Smith",
email: "jane@example.com",
is_bot_active: true,
listIds: ["list123", "list456"],
}),
});
const data = await res.json();
console.log(data.data.contactId);
Python
import requests
res = requests.post(
"https://api.youraiconnector.com/v1/contacts",
headers={"X-API-Key": "YOUR_API_KEY"},
json={
"phoneNumber": "+15551234567",
"firstName": "Jane",
"lastName": "Smith",
"email": "jane@example.com",
"is_bot_active": True,
"listIds": ["list123", "list456"],
},
)
print(res.json()["data"]["contactId"])
Yanıt
{
"success": true,
"data": {
"message": "Successfully created new contact",
"contactId": "contact_abc123",
"listsAdded": ["list123", "list456"]
}
}
Yeni kişinin kimliği data.contactId adresindedir. Eklendiği listeler data.listsAdded içinde geri yansıtılır.
Yinelenenler oluşturulmaz. Aynı telefon numarasına sahip bir kişi zaten mevcutsa, oluşturma çağrısı onu oluşturmaz veya döndürmez. Yanıt, HTTP durumu
200ve gövdesinde409değerine sahip birerror_codeile döner, bu nedenle HTTP durumu yerineerror_codedeğerine göre dallanma yapın:{ "success": false, "error_code": 409, "error": "A contact with this phone number already exists for the current user." }
error_codedeğeri409olan bir işlemden sonra mevcut bir kişiyle çalışmak için, Telefon veya e-posta ile kişi alma yöntemini kullanarak onu arayın —GET /contacts?phoneNumber=...— ve döndürdüğü kimliği (ID) yeniden kullanın.
Eşdeğer WhatsApp yazımları aynı numara olarak sayılır. Bazı ülkelerde aynı mobil hat için iki geçerli yazım biçimi bulunur ve WhatsApp bunlardan herhangi birini bildirebilir: Meksika (
+52…ve eski+521…), Brezilya (dokuzuncu hane olsun veya olmasın) ve Arjantin (+54’ten sonra9olsun veya olmasın). Oluşturma sırasındaki kopya denetimi veGET /contacts?phoneNumber=, her iki yazım biçimiyle de eşleşir; bu sayede hangi biçimi gönderirseniz gönderin mevcut kişiyi geri alırsınız. Kişi üzerinde kayıtlı olanphone_numberhiçbir zaman yeniden yazılmaz.
Telefon veya e-posta ile kişi getirme
GET /contacts?phoneNumber=... veya GET /contacts?email=...
Tek bir kişiyi arar ve { id, name } çiftlerine çözümlenmiş listeleri, etiketleri ve kampanyaları ile son mesajlaşmayı içeren tam, zenginleştirilmiş kişi nesnesini döndürür.
Ya phoneNumber (uluslararası formatta) ya da email gönderin. İkisini de göndermezseniz, bu uç nokta bunun yerine Kişileri listele moduna geçer.
cURL
curl "<span data-t="apiBaseUrl">https://api.youraiconnector.com</span>/v1/contacts?phoneNumber=%2B15551234567&apiKey=YOUR_API_KEY"
JavaScript
const phone = encodeURIComponent("+15551234567");
const res = await fetch(`https://api.youraiconnector.com/v1/contacts?phoneNumber=${phone}`, {
headers: { "X-API-Key": "YOUR_API_KEY" },
});
const data = await res.json();
console.log(data.contact);
Python
import requests
res = requests.get(
"<span data-t="apiBaseUrl">https://api.youraiconnector.com</span>/v1/contacts",
headers={"X-API-Key": "YOUR_API_KEY"},
params={"phoneNumber": "+15551234567"},
)
print(res.json()["contact"])
Yanıt
{
"success": true,
"contactId": "contact_abc123",
"contact": {
"id": "contact_abc123",
"firstName": "Jane",
"lastName": "Smith",
"email": "jane@example.com",
"phoneNumber": "+15551234567",
"channel": "whatsapp",
"isBotActive": true,
"isPrivate": false,
"doNotDisturb": false,
"lead_profile": null,
"avatarUrl": "https://example.com/photo.jpg",
"customFields": {},
"lists": [{ "id": "list123", "name": "VIP customers" }],
"tags": [{ "id": "tagHotLead", "name": "Hot lead" }],
"campaigns": [{ "id": "campaign789", "name": "Spring promo" }],
"currentCampaign": { "id": "campaign789", "name": "Spring promo" },
"lastMessage": {
"direction": "inbound",
"body": "Sounds good, thanks!",
"status": "received",
"timestamp": "2026-06-09T10:21:00.000Z"
}
}
}
Kişi kimliği hem en üst düzeyde (contactId) hem de nesnenin içinde (contact.id) döndürülür. Eşleşme olmazsa, { "success": false, "message": "Contact not found" } içeren bir 404 alırsınız.
avatarUrl, kişiye mesaj attığında WhatsApp veya Meta’dan alınan profil fotoğrafıdır. Salt okunurdur: bunu ayarlayamazsınız ve fotoğrafı olmayan veya fotoğraf paylaşmayan bir kanaldan size ulaşan kişiler içinnulldeğerindedir. Bu fotoğraf bağlantılarından bazıları süreli olup otomatik olarak yenilendiğinden, bağlantıyı saklamak yerine geçici olarak değerlendirin. (Aşağıdaki liste uç noktasında aynı değeravatar_urlolarak adlandırılır.)
URL’lerdeki telefon numaraları. Sorgu dizesindeki bir
+işareti%2Bolarak URL kodlanmalıdır, aksi takdirde boşluk olarak okunur. Yukarıdaki örnekler bunu sizin için yapar.
Kimlik (ID) ile kişi getirme
GET /contacts/{contactId}
Bir kişinin kimliğine (ID) zaten sahipseniz, onu doğrudan getirebilirsiniz. Yanıt biçimi yukarıdaki arama ile aynıdır.
cURL
curl "<span data-t="apiBaseUrl">https://api.youraiconnector.com</span>/v1/contacts/contact_abc123?apiKey=YOUR_API_KEY"
JavaScript
const res = await fetch("<span data-t="apiBaseUrl">https://api.youraiconnector.com</span>/v1/contacts/contact_abc123", {
headers: { "X-API-Key": "YOUR_API_KEY" },
});
const data = await res.json();
console.log(data.contact);
Python
import requests
res = requests.get(
"<span data-t="apiBaseUrl">https://api.youraiconnector.com</span>/v1/contacts/contact_abc123",
headers={"X-API-Key": "YOUR_API_KEY"},
)
print(res.json()["contact"])
Hesabınızda bulunmayan bir kişi kimliği, 404 döndürür.
İletişim istatistiklerini al
GET /contacts/{contactId}/stats
Bir kişi için toplu mesaj istatistiklerini döndürür: toplamlar, yapay zeka ve insan yanıtları, harcanan krediler ve ilk/son mesaj zaman damgaları.
cURL
curl "<span data-t="apiBaseUrl">https://api.youraiconnector.com</span>/v1/contacts/contact_abc123/stats?apiKey=YOUR_API_KEY"
JavaScript
const res = await fetch("<span data-t="apiBaseUrl">https://api.youraiconnector.com</span>/v1/contacts/contact_abc123/stats", {
headers: { "X-API-Key": "YOUR_API_KEY" },
});
const data = await res.json();
console.log(data.totalMessages, data.creditsUsed);
Python
import requests
res = requests.get(
"<span data-t="apiBaseUrl">https://api.youraiconnector.com</span>/v1/contacts/contact_abc123/stats",
headers={"X-API-Key": "YOUR_API_KEY"},
)
data = res.json()
print(data["totalMessages"], data["creditsUsed"])
Yanıt
{
"success": true,
"totalMessages": 48,
"sent": 21,
"received": 27,
"aiReplies": 18,
"humanReplies": 3,
"creditsUsed": 34,
"botMessageCount": 18,
"firstMessageAt": "2026-05-01T09:00:00.000Z",
"lastMessageAt": "2026-06-09T10:21:00.000Z"
}
botMessageCount, uygulama içindeki “sıfırla” düğmesinin bir kişi için sıfırladığı yapay zeka mesaj sayacıyla aynıdır. creditsUsed, sadece bu yanıtın sayıları değil, bu kişi için devam eden toplam kredi miktarıdır. Hesabınızda bulunmayan bir kişi kimliği 404 döndürür.
Kişileri listeleme
GET /contacts
Tüm kişilerinizi en yeniden başlayarak sayfalamak için GET /contacts öğesini ne phoneNumber ne de email olmadan çağırın. Her sayfa, kompakt kişi özetleri (listeler, etiketler ve kampanyalar tam nesneler yerine kimlik dizileri olarak döner) ve bir next_cursor döndürür.
| Sorgu parametresi | Açıklama |
|---|---|
limit |
Sayfa boyutu. Varsayılan 50, maksimum 100’dür. |
cursor |
Önceki sayfadan gelen next_cursor değeri. İlk sayfada atlayın. |
listId |
İsteğe bağlı. Yalnızca bu listeye ait kişileri döndürür. |
Her sayfayı gezmek için: ilk çağrıyı imleç (cursor) olmadan yapın, ardından dönen next_cursor değerini cursor olarak iletmeye devam edin. next_cursor değeri null olduğunda durun — bu, başka sonuç kalmadığı anlamına gelir.
cURL
curl "<span data-t="apiBaseUrl">https://api.youraiconnector.com</span>/v1/contacts?limit=50&apiKey=YOUR_API_KEY"
# next page:
curl "<span data-t="apiBaseUrl">https://api.youraiconnector.com</span>/v1/contacts?limit=50&cursor=contact_abc123&apiKey=YOUR_API_KEY"
JavaScript
async function listAllContacts() {
const all = [];
let cursor = null;
do {
const url = new URL("<span data-t="apiBaseUrl">https://api.youraiconnector.com</span>/v1/contacts");
url.searchParams.set("limit", "100");
if (cursor) url.searchParams.set("cursor", cursor);
const res = await fetch(url, { headers: { "X-API-Key": "YOUR_API_KEY" } });
const data = await res.json();
all.push(...data.contacts);
cursor = data.next_cursor;
} while (cursor);
return all;
}
Python
import requests
def list_all_contacts():
all_contacts = []
cursor = None
while True:
params = {"limit": 100}
if cursor:
params["cursor"] = cursor
res = requests.get(
"<span data-t="apiBaseUrl">https://api.youraiconnector.com</span>/v1/contacts",
headers={"X-API-Key": "YOUR_API_KEY"},
params=params,
)
data = res.json()
all_contacts.extend(data["contacts"])
cursor = data["next_cursor"]
if not cursor:
break
return all_contacts
Yanıt
{
"success": true,
"contacts": [
{
"id": "contact_abc123",
"first_name": "Jane",
"last_name": "Smith",
"email": "jane@example.com",
"phone_number": "+15551234567",
"channel": "whatsapp",
"is_bot_active": true,
"is_private": false,
"do_not_disturb": false,
"avatar_url": "https://example.com/photo.jpg",
"custom_fields": {},
"created_at": "2026-06-01T09:00:00.000Z",
"list_ids": ["list123"],
"tag_ids": ["tagHotLead"],
"campaign_ids": ["campaign789"],
"current_campaign_id": "campaign789"
}
],
"next_cursor": "contact_abc123"
}
Not: Hesabınızda bulunmayan bir listId ile filtreleme yapmak 404 döndürür. Geçersiz bir cursor ise 400 döndürür.
Kişi sayısını al
GET /contacts/count
Filtreyle eşleşen kaç kişi olduğunu, kanal bazlı dağılımıyla birlikte, sayfalandırma yapmadan döndürür. Bu uç nokta; kontrol paneli kutucukları, otomasyonlar veya Champ’e soru sormak gibi “kaç tane” sorusunun sorulduğu her durum için doğru tercihtir. Tüm filtreler isteğe bağlıdır ve birden fazlasını birleştirmek sayıyı daraltır (bir kişinin gönderdiğiniz her bir filtreyle eşleşmesi gerekir).
| Sorgu parametresi | Açıklama |
|---|---|
agentId |
Yalnızca bu yapay zeka temsilcisine atanmış kişiler. Atanmış temsilcisi olmayan kişiler için (bunlar kanalın varsayılan temsilcisi tarafından yanıtlanır) none değerini gönderin. |
channel |
Yalnızca bu kanaldaki kişiler, örneğin whatsapp, messenger, instagram, sms, email, chat_widget. |
tag |
Yalnızca bu etiketi taşıyan kişiler, etiket adı ile (büyük/küçük harf duyarlı değildir). Sahip olmadığınız bir etiket adı 404 döndürür. |
listId |
Yalnızca bu listedeki kişiler. |
botActive |
true veya false — yalnızca yapay zeka asistanı açık veya kapalı olan kişiler. |
status |
Yalnızca bu duruma sahip kişiler, örneğin Lead. |
rules |
Akıllı liste ile aynı yapıda URL kodlu bir JSON kuralları nesnesi (aşağıdaki The smart_rules shape bölümüne bakın). Diğer filtrelerle birleştirilemez. |
Hiç filtre göndermezseniz, hesabınızdaki toplam kişi sayısını alırsınız.
cURL
# everything
curl "<span data-t="apiBaseUrl">https://api.youraiconnector.com</span>/v1/contacts/count?apiKey=YOUR_API_KEY"
# only the contacts one agent handles on Messenger
curl "<span data-t="apiBaseUrl">https://api.youraiconnector.com</span>/v1/contacts/count?agentId=agent_xyz789&channel=messenger&apiKey=YOUR_API_KEY"
JavaScript
const url = new URL("<span data-t="apiBaseUrl">https://api.youraiconnector.com</span>/v1/contacts/count");
url.searchParams.set("agentId", "agent_xyz789");
url.searchParams.set("channel", "messenger");
const res = await fetch(url, { headers: { "X-API-Key": "YOUR_API_KEY" } });
const data = await res.json();
console.log(data.total);
Python
import requests
res = requests.get(
"<span data-t="apiBaseUrl">https://api.youraiconnector.com</span>/v1/contacts/count",
headers={"X-API-Key": "YOUR_API_KEY"},
params={"agentId": "agent_xyz789", "channel": "messenger"},
)
data = res.json()
print(data["total"])
Yanıt
{
"success": true,
"total": 3423,
"by_channel": { "messenger": 2744, "instagram": 667, "none": 12 },
"filters": { "agentId": "agent_xyz789" }
}
by_channel, aynı toplamı kanal bazında böler; hiçbir kanalda olmayan kişiler none altında sayılır. filters, uygulanan filtreleri geri yansıtır, böylece çağrının istediğiniz işlemi yapıp yapmadığını kontrol edebilirsiniz.
Not: rules değerini başka bir filtreyle veya geçerli bir JSON olmayan bir rules değeriyle birlikte göndermek 400 döndürür. Hesabınızda bulunmayan bir etiket adı veya liste kimliği 404 döndürür.
Bir kişiyi güncelle
PUT /contacts/{contactId}
Mevcut bir kişiyi günceller. Yalnızca dahil ettiğiniz alanlar değiştirilir; dokunmak istemediğiniz hiçbir şeyi göndermeyin. En az bir alan göndermelisiniz, aksi takdirde bir 400 (“Güncellenecek alan yok”) alırsınız.
| Alan | Açıklama |
|---|---|
firstName |
Ad. |
lastName |
Soyadı. |
email |
E-posta adresi. |
is_bot_active |
Yapay zeka asistanının bu kişiye yanıt verip vermeyeceği. |
is_private |
Gizli olarak işaretle. Bunu true olarak ayarlamak, yapay zeka asistanını da kapatır. |
do_not_disturb |
Bu kişiye yönelik otomatik erişimi duraklatın. Ayrıca yapay zekanın yanıt vermesini de durdurur. |
follow_ups_disabled |
Yapay zeka gönderdikleri mesajlara yanıt vermeye devam ederken, bu kişi için tüm otomatik takip işlemlerini (hızlı, döngüsel ve soğuk müşteri adayı) durdurun. Birisi satın alma işlemi yaptığında kullanışlıdır. Siz tekrar false olarak ayarlayana kadar kapalı kalır. |
lead_profile |
Serbest metin müşteri adayı notları. |
custom_fields |
Özel alanlardan oluşan bir nesne. Anahtar bazında birleştirilir — yalnızca gönderdiğiniz anahtarlar yazılır, mevcut özel alanların geri kalanı korunur. Ayrıca en üst düzeyde özel alan anahtarları da iletebilirsiniz. |
cURL
curl -X PUT "<span data-t="apiBaseUrl">https://api.youraiconnector.com</span>/v1/contacts/contact_abc123?apiKey=YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "firstName": "Jane", "do_not_disturb": true }'
JavaScript
const res = await fetch("<span data-t="apiBaseUrl">https://api.youraiconnector.com</span>/v1/contacts/contact_abc123", {
method: "PUT",
headers: {
"X-API-Key": "YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({ firstName: "Jane", do_not_disturb: true }),
});
const data = await res.json();
console.log(data.message);
Python
import requests
res = requests.put(
"<span data-t="apiBaseUrl">https://api.youraiconnector.com</span>/v1/contacts/contact_abc123",
headers={"X-API-Key": "YOUR_API_KEY"},
json={"firstName": "Jane", "do_not_disturb": True},
)
print(res.json()["message"])
Yanıt
{
"success": true,
"message": "Contact updated successfully"
}
Özel alanlar değiştirilmez, birleştirilir.
{ "custom_fields": { "tier": "gold" } }göndermek yalnızcatierdeğerini ayarlar; kişideki diğer tüm özel alanlar tam olarak oldukları gibi kalır. Bir özel alanı tüm kişiler genelinde tamamen kaldırmak için Özel alanı sil özelliğini kullanın.
Etiket ekle veya kaldır
POST /contacts/{contactId}/tags
Tek bir çağrıda tek bir kişiye etiket ekler ve/veya kaldırır. Etiket ID’lerini addTagIds ve removeTagIds içinde iletin. İkisinden en az biri boş olmamalıdır.
Etiketler hesabınızda zaten mevcut olmalıdır; bunları önce etiketler uç noktası aracılığıyla oluşturun. Kişi veya referans verilen herhangi bir etiket mevcut değilse, bir 404 alırsınız.
| Alan | Açıklama |
|---|---|
addTagIds |
Kişiye eklenecek etiket kimliklerinden (ID) oluşan dizi. |
removeTagIds |
Kişiden kaldırılacak etiket kimliklerinden (ID) oluşan dizi. |
cURL
curl -X POST "<span data-t="apiBaseUrl">https://api.youraiconnector.com</span>/v1/contacts/contact_abc123/tags?apiKey=YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "addTagIds": ["tagHotLead"], "removeTagIds": ["tagColdLead"] }'
JavaScript
const res = await fetch("<span data-t="apiBaseUrl">https://api.youraiconnector.com</span>/v1/contacts/contact_abc123/tags", {
method: "POST",
headers: {
"X-API-Key": "YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
addTagIds: ["tagHotLead"],
removeTagIds: ["tagColdLead"],
}),
});
const data = await res.json();
console.log(data.added, data.removed);
Python
import requests
res = requests.post(
"<span data-t="apiBaseUrl">https://api.youraiconnector.com</span>/v1/contacts/contact_abc123/tags",
headers={"X-API-Key": "YOUR_API_KEY"},
json={"addTagIds": ["tagHotLead"], "removeTagIds": ["tagColdLead"]},
)
data = res.json()
print(data["added"], data["removed"])
Yanıt
{
"success": true,
"contact_id": "contact_abc123",
"added": 1,
"removed": 1
}
Etiket kitaplığınızı yönetin
Bu uç noktalar, bir kişiye etiket uygulamak veya kaldırmaktan (yukarıdaki Etiket ekle veya kaldır bölümüne bakın) farklı olarak, etiketin kendisini yönetir; yani hesabınızdaki bir etiketi yeniden adlandırır veya siler. Hesabınızdaki her etiketin bir kimliği (tagId) vardır: bu, kontrol panelinizin etiket yöneticisinde gösterilen ve POST /tags ile { "name": "..." } JSON gövdesi (hiçbir phoneNumber, email veya contactId olmadan) kullanarak bir etiket oluşturduğunuzda data.tag_id olarak döndürülen kimliktir.
Bir etiketi güncelle
PUT /tags/{tagId}
Yalnızca değiştirdiğiniz alanları gönderin.
| Alan | Açıklama |
|---|---|
name |
Etiketin adı. |
curl -X PUT "<span data-t="apiBaseUrl">https://api.youraiconnector.com</span>/v1/tags/tagHotLead?apiKey=YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "name": "Hot lead (Q3)" }'
Yanıt
{ "success": true, "tag_id": "tagHotLead" }
Hesabınızda bulunmayan bir tagId, 404 döndürür.
Bir etiketi sil
DELETE /tags/{tagId}
Bir etiketi kimliğine göre siler. Bu işlem geri alınamaz — etiketi taşıyan kişiler etiketi kaybeder. Zaten silinmiş (veya hiç var olmamış) bir etiketi silmek, numaralandırılacak bir şey olmadığından 404 yerine deleted: 0 ile 200 döndürür.
curl -X DELETE "<span data-t="apiBaseUrl">https://api.youraiconnector.com</span>/v1/tags/tagColdLead?apiKey=YOUR_API_KEY"
Yanıt
{ "success": true, "deleted": 1 }
Birden fazla etiketi aynı anda sil
DELETE /tags
| Alan | Açıklama |
|---|---|
tagIds |
Silinecek etiket kimliklerinden (ID) oluşan dizi (maksimum 1000). |
curl -X DELETE "<span data-t="apiBaseUrl">https://api.youraiconnector.com</span>/v1/tags?apiKey=YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "tagIds": ["tagColdLead", "tagUnsubscribed"] }'
Yanıt
{ "success": true, "deleted": 2 }
Mevcut olmayan veya başka bir hesaba ait olan kimlikler sessizce atlanır ve deleted içinde sayılmaz.
Toplu bayrak ayarla
POST /contacts/bulk-flag
Birçok kişide aynı anda bir boolean bayrağı ayarlar. İstek başına en fazla 500 kişi kimliği. Hesabınızda bulunmayan kimlikler atlanır ve skipped içinde sayılır.
| Alan | Açıklama |
|---|---|
contactIds |
Güncellenecek kişi kimliklerinden (ID) oluşan dizi (maks. 500). |
field |
Hangi bayrağın ayarlanacağı. Şunlardan biri: bot_active (yapay zeka asistanı açık/kapalı), dnd (otomatik erişimi duraklat), spam, private. |
value |
Bayrağın ayarlanacağı boolean değeri. |
cURL
curl -X POST "<span data-t="apiBaseUrl">https://api.youraiconnector.com</span>/v1/contacts/bulk-flag?apiKey=YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"contactIds": ["contactId1", "contactId2"],
"field": "bot_active",
"value": false
}'
JavaScript
const res = await fetch("<span data-t="apiBaseUrl">https://api.youraiconnector.com</span>/v1/contacts/bulk-flag", {
method: "POST",
headers: {
"X-API-Key": "YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
contactIds: ["contactId1", "contactId2"],
field: "bot_active",
value: false,
}),
});
const data = await res.json();
console.log(data.updated, data.skipped);
Python
import requests
res = requests.post(
"<span data-t="apiBaseUrl">https://api.youraiconnector.com</span>/v1/contacts/bulk-flag",
headers={"X-API-Key": "YOUR_API_KEY"},
json={
"contactIds": ["contactId1", "contactId2"],
"field": "bot_active",
"value": False,
},
)
data = res.json()
print(data["updated"], data["skipped"])
Yanıt
{
"success": true,
"updated": 2,
"skipped": 0
}
Toplu kişi içe aktarma
POST /contacts/import
Bir JSON dizisinden tek bir çağrıda 500’e kadar kişi oluşturur. Her kaydın uluslararası formatta bir phone_number değerine ihtiyacı vardır; diğer her şey isteğe bağlıdır. Geçersiz telefon numaralarına veya desteklenmeyen kanallara sahip kayıtlar atlanır (oluşturulmaz) ve atlanan her kayıt, dizini ve nedeni ile birlikte raporlanır; böylece yalnızca hatalı olanları düzeltip yeniden deneyebilirsiniz.
Hesabınızda zaten mevcut olan telefon numaraları varsayılan olarak duplicate şeklinde atlanır. Bunun yerine bu kişileri güncellemek için updateExisting: true gönderin: kayıtta bulunan alanlar kişinin (first_name, last_name, email, lead_profile ve custom_fields anahtar bazında birleştirilir) üzerine yazılır, tags eklenir ve kişi listId listesine eklenir. Mevcut bir kişide kanal, telefon numarası ve bot bayrakları asla değiştirilmez.
İsteğe bağlı olarak, içe aktarılan (veya güncellenen) her kişiyi listId ile bir listeye ekleyebilir, belirtilmeyen kayıtlar için bir defaultChannel ayarlayabilir ve kayıtları tags ile etiketleyebilirsiniz (etiket adları — eksik etiketler oluşturulur, mevcut olanlar büyük/küçük harf duyarsız olarak eşleştirilir).
Üst düzey alanlar
| Alan | Gerekli | Açıklama |
|---|---|---|
contacts |
Evet | Kişi kayıtları dizisi (maks. 500). |
listId |
Hayır | İçe aktarılan (ve güncellenen) her kişinin ekleneceği liste. Hesabınızda mevcut bir liste olmalıdır. |
defaultChannel |
Hayır | channel belirtilmeyen kayıtlara uygulanan kanal. whatsapp, sms, whatsapp_web değerlerinden biri. Varsayılan olarak whatsapp. |
updateExisting |
Hayır | Telefon numarası zaten mevcut olan kişileri duplicate olarak atlamak yerine güncellemek için true. Varsayılan olarak false. |
Kayıt bazlı alanlar
| Alan | Gerekli | Açıklama |
|---|---|---|
phone_number |
Evet | Uluslararası formatta telefon numarası (eksikse başına + eklenir). |
first_name |
Hayır | Ad. |
last_name |
Hayır | Soyadı. |
email |
Hayır | E-posta adresi. |
channel |
Hayır | whatsapp, sms, whatsapp_web değerlerinden biri. defaultChannel değerine geri döner. |
is_bot_active |
Hayır | Yapay zeka asistanının yanıt verip vermeyeceği. Varsayılan olarak true. |
is_private |
Hayır | Özel olarak işaretle. Varsayılan olarak false. |
lead_profile |
Hayır | Serbest metin müşteri adayı notları. |
custom_fields |
Hayır | Özel alan anahtarları ve değerlerinden oluşan nesne. |
tags |
Hayır | Etiket adları dizisi (tek bir "a; b" dizesi de çalışır). Mevcut olmayan etiketler oluşturulur; mevcut olanlar büyük/küçük harf dikkate alınmadan eşleştirilir. Kayıt başına maksimum 25 adet. |
cURL
curl -X POST "<span data-t="apiBaseUrl">https://api.youraiconnector.com</span>/v1/contacts/import?apiKey=YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"contacts": [
{ "phone_number": "+12025551234", "first_name": "Ann", "last_name": "Lee", "tags": ["vip", "newsletter"] },
{ "phone_number": "+12025551235", "first_name": "Bob" }
],
"listId": "list123",
"defaultChannel": "whatsapp_web",
"updateExisting": true
}'
JavaScript
const res = await fetch("<span data-t="apiBaseUrl">https://api.youraiconnector.com</span>/v1/contacts/import", {
method: "POST",
headers: {
"X-API-Key": "YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
contacts: [
{ phone_number: "+12025551234", first_name: "Ann", last_name: "Lee", tags: ["vip", "newsletter"] },
{ phone_number: "+12025551235", first_name: "Bob" },
],
listId: "list123",
defaultChannel: "whatsapp_web",
updateExisting: true,
}),
});
const data = await res.json();
console.log(`Imported ${data.imported}, updated ${data.updated}, skipped ${data.skipped.length}`);
Python
import requests
res = requests.post(
"<span data-t="apiBaseUrl">https://api.youraiconnector.com</span>/v1/contacts/import",
headers={"X-API-Key": "YOUR_API_KEY"},
json={
"contacts": [
{"phone_number": "+12025551234", "first_name": "Ann", "last_name": "Lee", "tags": ["vip", "newsletter"]},
{"phone_number": "+12025551235", "first_name": "Bob"},
],
"listId": "list123",
"defaultChannel": "whatsapp_web",
"updateExisting": True,
},
)
data = res.json()
print(f"Imported {data['imported']}, updated {data['updated']}, skipped {len(data['skipped'])}")
Yanıt
{
"success": true,
"imported": 2,
"contact_ids": ["contact_abc123", "contact_def456"],
"updated": 0,
"updated_contact_ids": [],
"skipped": []
}
Bazı kayıtlar oluşturulamazsa, nedeni ile birlikte skipped içinde görünürler (burada updateExisting olmadan, bu nedenle mevcut numara atlanır):
{
"success": true,
"imported": 1,
"contact_ids": ["contact_abc123"],
"updated": 0,
"updated_contact_ids": [],
"skipped": [
{ "index": 1, "phone_number": "+12025551235", "reason": "duplicate" }
]
}
updateExisting: true ile aynı istek, mevcut kişiyi updated / updated_contact_ids altında raporlar.
Olası atlama nedenleri: invalid_record, missing_phone_number, invalid_phone_number, invalid_channel, duplicate_in_request, duplicate, contact_limit_reached, create_failed.
Plan limitleri. Planınızın kişi limiti bu kadar yeni kişiye izin vermiyorsa, isteğin tamamı en başta
403ile reddedilir. Limit işlem sırasında aşılırsa, kalan kayıtlarcontact_limit_reachednedeni ile atlanmış olarak geri döner.
Bir CSV dosyasından kişileri içe aktarma
Toplu içe aktarma özelliğinin desteklediğinden daha büyük içe aktarmalar için (yaklaşık 50.000 satıra kadar), hesabınızın depolama alanında zaten bulunan bir CSV dosyası için eşzamansız (async) bir içe aktarma işini sıraya alın ve tamamlanana kadar sorgulayın.
İçe aktarmayı başlatma
POST /contacts/import-csv
| Alan | Gerekli | Açıklama |
|---|---|---|
csvStoragePath |
Evet | CSV dosyasının users/{your account id}/imports/ altındaki, .csv ile biten depolama yolu. |
listName |
Evet | Bu isimde bir liste oluşturur (veya yeniden kullanır) ve içe aktarılan her kişiyi bu listeye ekler. |
existingListRefs |
Hayır | İçe aktarılan her kişinin ayrıca ekleneceği mevcut liste kimliklerinden (ID) oluşan dizi. |
defaultChannel |
Hayır | Belirtilmeyen satırlara uygulanan kanal. |
curl -X POST "<span data-t="apiBaseUrl">https://api.youraiconnector.com</span>/v1/contacts/import-csv?apiKey=YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"csvStoragePath": "users/abc123/imports/leads.csv",
"listName": "Webinar signups"
}'
JavaScript
const res = await fetch("<span data-t="apiBaseUrl">https://api.youraiconnector.com</span>/v1/contacts/import-csv", {
method: "POST",
headers: {
"X-API-Key": "YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
csvStoragePath: "users/abc123/imports/leads.csv",
listName: "Webinar signups",
}),
});
const data = await res.json();
console.log(data.job_id);
Python
import requests
res = requests.post(
"<span data-t="apiBaseUrl">https://api.youraiconnector.com</span>/v1/contacts/import-csv",
headers={"X-API-Key": "YOUR_API_KEY"},
json={
"csvStoragePath": "users/abc123/imports/leads.csv",
"listName": "Webinar signups",
},
)
job_id = res.json()["job_id"]
Yanıt (202 — içe aktarma sıraya alındı, henüz tamamlanmadı)
{
"success": true,
"job_id": "csvimp_abc123",
"status": "queued"
}
Dosyayı depolama alanına alma. Bu uç nokta içe aktarma işini başlatır ve takip eder; dosya yüklemesini doğrudan kabul etmez. CSV dosyasının, siz bu uç noktayı çağırmadan önce
csvStoragePathkonumunda bulunması gerekir — kontrol panelinin kendi CSV içe aktarıcısı bu işlemi ilk adım olarak gerçekleştirir.
İçe aktarma işini sorgulama
GET /contacts/import-csv/{jobId}
curl "<span data-t="apiBaseUrl">https://api.youraiconnector.com</span>/v1/contacts/import-csv/csvimp_abc123?apiKey=YOUR_API_KEY"
Yanıt
{
"success": true,
"job_id": "csvimp_abc123",
"status": "completed",
"imported": 812,
"updated": 0,
"skipped": 14,
"errors": [],
"error_message": null
}
status, queued → processing → completed aşamalarından geçer veya error_message içindeki neden ile failed durumuna düşer. Hesabınızda bulunmayan bir jobId, 404 döndürür.
Kişileri dışa aktarma
Kişilerinizin eşzamansız (async) CSV dışa aktarma işlemini başlatır ve tamamlanma durumunu sorgulayabileceğiniz bir iş döndürür.
Dışa aktarmayı başlat
POST /contacts/export
| Alan | Zorunlu | Açıklama |
|---|---|---|
listId |
Hayır | Yalnızca bu listeye ait kişileri dışa aktar. |
contactIds |
Hayır | Yalnızca bu belirli kişi kimliklerini (ID) dışa aktar. |
Her ikisini de boş bırakmak, hesabınızdaki tüm kişileri dışa aktarır.
curl -X POST "<span data-t="apiBaseUrl">https://api.youraiconnector.com</span>/v1/contacts/export?apiKey=YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "listId": "list123" }'
JavaScript
const res = await fetch("<span data-t="apiBaseUrl">https://api.youraiconnector.com</span>/v1/contacts/export", {
method: "POST",
headers: {
"X-API-Key": "YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({ listId: "list123" }),
});
const data = await res.json();
console.log(data.job_id);
Python
import requests
res = requests.post(
"<span data-t="apiBaseUrl">https://api.youraiconnector.com</span>/v1/contacts/export",
headers={"X-API-Key": "YOUR_API_KEY"},
json={"listId": "list123"},
)
job_id = res.json()["job_id"]
Yanıt (202 — dışa aktarma kuyruğa alındı)
{
"success": true,
"job_id": "export_abc123",
"status": "queued"
}
Dışa aktarma işini sorgula
GET /contacts/export/{jobId}
curl "<span data-t="apiBaseUrl">https://api.youraiconnector.com</span>/v1/contacts/export/export_abc123?apiKey=YOUR_API_KEY"
Yanıt
{
"success": true,
"job_id": "export_abc123",
"status": "completed",
"export_id": "exp_xyz789",
"contact_count": 812,
"error_message": null
}
status"completed"olduğundaexport_idvecontact_countalırsınız. Oluşturulan CSV dosyasını indirme işlemi, kontrol panelinizin Dışa Aktarmalar sayfasından yapılır.
Bir kişiye mesaj gönderin
POST /contacts/{contactId}/send-message
Mevcut bir kişiye, zaten kullandıkları kanal üzerinden bir mesaj gönderir. Mesaj kuyruğa alınır ve arka planda iletilir; yanıt, mesajın teslim edildiğini değil, kabul edildiğini doğrular.
| Alan | Gerekli | Açıklama |
|---|---|---|
body |
Evet | Gönderilecek mesajın metni. |
mediaUrl |
Hayır | Eklenecek medya dosyasının URL’si. |
mediaContentType |
Hayır | Ekli medyanın MIME türü (örneğin image/jpeg). |
cURL
curl -X POST "<span data-t="apiBaseUrl">https://api.youraiconnector.com</span>/v1/contacts/contact_abc123/send-message?apiKey=YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "body": "Hi! Your appointment is confirmed." }'
JavaScript
const res = await fetch("<span data-t="apiBaseUrl">https://api.youraiconnector.com</span>/v1/contacts/contact_abc123/send-message", {
method: "POST",
headers: {
"X-API-Key": "YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({ body: "Hi! Your appointment is confirmed." }),
});
const data = await res.json();
console.log(data.messageId);
Python
import requests
res = requests.post(
"<span data-t="apiBaseUrl">https://api.youraiconnector.com</span>/v1/contacts/contact_abc123/send-message",
headers={"X-API-Key": "YOUR_API_KEY"},
json={"body": "Hi! Your appointment is confirmed."},
)
print(res.json()["messageId"])
Yanıt
{
"success": true,
"messageId": "aB3dE5fG7hI9jK1lM2nO",
"contactId": "contact_abc123",
"channel": "whatsapp",
"message": "Message created successfully. Delivery is being processed."
}
Şu anda gönderilemiyor mu? Kişinin rahatsız etmeyin veya gizli modu etkinse ya da giden mesajları alabilen bir kanalda değilse, istek bir
422ve açıklayıcı birerrorile reddedilir.
Kişi kimliği yerine telefon numarası, Instagram kimliği veya diğer kanal kimlikleri ile göndermek için — ve genel olarak mesajlaşma hakkında daha fazla bilgi için — Messages API bölümüne bakın.
Bir kişiye yapay zeka temsilcisi atayın
POST /contacts/{contactId}/assign-agent
Mevcut bir konuşmayı, bir sonraki mesajdan itibaren farklı bir yapay zeka temsilcisine taşır. Bu, bir sohbetin menüsündeki Yapay Zeka Temsilcisi Ata seçeneğiyle ve Otomasyonlardaki Yapay zeka temsilcisi veya kampanya ata eyleminin kullandığı adımla aynıdır.
| Alan | Zorunlu | Açıklama |
|---|---|---|
agentId |
Evet | Devralması gereken yapay zeka temsilcisinin kimliği veya konuşmanın ekip gelen kutunuza geri dönmesi için atamayı temizlemek üzere null. |
triggerAIResponse |
Hayır | true, yeni atanan temsilcinin kişinin yanıtlanmamış en son mesajlarına hemen yanıt vermesini sağlar. Varsayılan değer false şeklindedir. |
triggerAIResponse: trueile dikkatli olun — kişiye o anda bir mesaj gönderir, bu yüzden yalnızca hemen mesajlaşmak istediğinizde kullanın. Messenger ve Instagram’da, kişi size en son 24 saatten daha uzun süre önce yazdıysa bu mesaj başarısız olur.
cURL
curl -X POST "<span data-t="apiBaseUrl">https://api.youraiconnector.com</span>/v1/contacts/contact_abc123/assign-agent?apiKey=YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "agentId": "agent_xyz789" }'
JavaScript
const res = await fetch("<span data-t="apiBaseUrl">https://api.youraiconnector.com</span>/v1/contacts/contact_abc123/assign-agent", {
method: "POST",
headers: {
"X-API-Key": "YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({ agentId: "agent_xyz789" }),
});
const data = await res.json();
console.log(data.data.agentId);
Python
import requests
res = requests.post(
"<span data-t="apiBaseUrl">https://api.youraiconnector.com</span>/v1/contacts/contact_abc123/assign-agent",
headers={"X-API-Key": "YOUR_API_KEY"},
json={"agentId": "agent_xyz789"},
)
print(res.json()["data"]["agentId"])
Yanıt
{
"success": true,
"data": {
"contactId": "contact_abc123",
"agentId": "agent_xyz789",
"aiResponseTriggered": false
}
}
Temsilci, kişiyle aynı hesaba ait olmalıdır; aksi takdirde istek bir
404veya403ile reddedilir. Temsilci kimliklerini Yapay Zeka Temsilcileri sayfasında bulabilirsiniz (her temsilcinin URL’si kendi kimliğiyle biter).
Birçok kişiye yapay zeka temsilcisi atama
POST /contacts/bulk-assign-agent
Birçok görüşmeyi tek bir çağrıda farklı bir yapay zeka temsilcisine taşır veya null ile hepsinin atamasını temizler. Bu tamamen bir yönlendirme değişikliğidir: hiçbir mesaj gönderilmez ve temsilci kimseye yanıt vermez. Her kişi, bir sonraki yazışmasında yeni temsilciye atanmış olur. (Bu yüzden burada triggerAIResponse yoktur.)
| Alan | Gerekli | Açıklama |
|---|---|---|
agentId |
Evet | Devralması gereken yapay zeka temsilcisi veya atamayı temizlemek için null. |
contactIds |
Üçünden biri | Taşınacak en fazla 500 kişi kimliği. |
filter |
Üçünden biri | Kişileri listelemek yerine sunucudan seçin, en yeniden başlayarak. Sayım uç noktasının filtreleriyle aynı anahtarları alır: agentId (veya none), channel, tag, listId, botActive, status. |
rules |
Üçünden biri | Bir akıllı liste kuralları nesnesi — The smart_rules shape bölümüne bakın. |
limit |
Hayır | filter veya rules ile seçim yaptığınızda bu çağrıda kaç kişinin taşınacağı. 1 ile 500 arası, varsayılan 500’dür. |
contactIds, filter veya rules değerlerinden tam olarak birini gönderin.
cURL
curl -X POST "<span data-t="apiBaseUrl">https://api.youraiconnector.com</span>/v1/contacts/bulk-assign-agent?apiKey=YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"agentId": "agent_xyz789",
"filter": { "agentId": "agent_abc123", "channel": "messenger" }
}'
JavaScript
const res = await fetch("<span data-t="apiBaseUrl">https://api.youraiconnector.com</span>/v1/contacts/bulk-assign-agent", {
method: "POST",
headers: {
"X-API-Key": "YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
agentId: "agent_xyz789",
filter: { agentId: "agent_abc123", channel: "messenger" },
}),
});
const data = await res.json();
console.log(data.updated, data.remaining);
Python
import requests
res = requests.post(
"<span data-t="apiBaseUrl">https://api.youraiconnector.com</span>/v1/contacts/bulk-assign-agent",
headers={"X-API-Key": "YOUR_API_KEY"},
json={
"agentId": "agent_xyz789",
"filter": {"agentId": "agent_abc123", "channel": "messenger"},
},
)
data = res.json()
print(data["updated"], data["remaining"])
Yanıt
{
"success": true,
"agentId": "agent_xyz789",
"matched": 3415,
"updated": 500,
"skipped": 0,
"remaining": 2915,
"filters": { "agentId": "agent_abc123" }
}
matched, seçimin toplamda kaç kişi bulduğudur, updated bu çağrıyla kaç kişinin taşındığıdır, skipped gönderdiğiniz kimliklerden kaçının hesabınızda bulunamadığıdır ve remaining bu çağrı bittiğinde hala kaç kişinin eşleştiğidir.
Herkesi taşıma. Bir çağrı en fazla 500 kişiyi taşıdığından, büyük bir grup birkaç çağrı gerektirir. Bir kişi taşındıktan sonra eşleşmeyi durduran bir filtre kullanın — örneğin agent_xyz789’e atarken filter: { "agentId": "agent_abc123" } kullanın — ve remaining değeri 0 olarak dönene kadar aynı çağrıyı tekrarlayın. Bunun yerine contactIds gönderdiğinizde, remaining her zaman 0 olur.
Bir kişiyi departmana ata
POST /contacts/{contactId}/department
“Bu adayı Satış departmanına ata” — bir kişiyi adlandırılmış bir departman altında dosyalar ve varsayılan olarak, o departmanda şu anda en az kişiye sahip olan kişiye yönlendirir. Bu, bir yapay zeka temsilcisi atamaktan ayrıdır: bir departman “bunun sahibi hangi ekip” sorusunu yanıtlar, bir temsilci “bunu hangi yapay zeka yanıtlar” sorusunu yanıtlar ve birini ayarlamak diğerini asla temizlemez.
| Alan | Zorunlu | Açıklama |
|---|---|---|
department_id |
Evet | Kişinin altında dosyalanacağı departman. Temizlemek için null değerini iletin. |
hand_to_member |
Hayır | Kişiyi ayrıca o departmandaki en az iş yüküne sahip kişiye yönlendirir. Varsayılan olarak true değerindedir. Zaten birinin sahip olduğu bir kişiyi asla yeniden atamaz. |
cURL
curl -X POST "<span data-t="apiBaseUrl">https://api.youraiconnector.com</span>/v1/contacts/contact_abc123/department?apiKey=YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "department_id": "dept_sales" }'
JavaScript
const res = await fetch("<span data-t="apiBaseUrl">https://api.youraiconnector.com</span>/v1/contacts/contact_abc123/department", {
method: "POST",
headers: {
"X-API-Key": "YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({ department_id: "dept_sales" }),
});
const data = await res.json();
console.log(data.assigned_to);
Python
import requests
res = requests.post(
"<span data-t="apiBaseUrl">https://api.youraiconnector.com</span>/v1/contacts/contact_abc123/department",
headers={"X-API-Key": "YOUR_API_KEY"},
json={"department_id": "dept_sales"},
)
print(res.json()["assigned_to"])
Yanıt
{
"success": true,
"department_id": "dept_sales",
"assigned_to": "member_uid_123"
}
assigned_to, kişi zaten birine ait olduğunda veya hand_to_member: false değerini ilettiğinizde null olur.
Bir kişiyi kanallar arasında bağla
“WhatsApp’ta devam et” (veya SMS), bu kişinin iletişim bilgilerini başka bir telefon tabanlı kanalda bulur veya oluşturur ve uygulamanın geri kalanının onları aynı kişi olarak tanıması için ikisini birbirine bağlar.
Başka bir kanala bağlantı kurma
POST /contacts/{contactId}/link-channel
| Alan | Zorunlu | Açıklama |
|---|---|---|
channel |
Evet | Bağlantı kurulacak kanal. whatsapp, whatsapp_web, sms değerlerinden biri. |
phoneNumber |
Hayır | Yeni kanalda kullanılacak telefon numarası. Varsayılan olarak kaynak kişinin kendi numarası kullanılır. |
curl -X POST "<span data-t="apiBaseUrl">https://api.youraiconnector.com</span>/v1/contacts/contact_abc123/link-channel?apiKey=YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "channel": "sms" }'
Yanıt
{
"success": true,
"data": {
"contact_id": "contact_def456",
"person_id": "person_xyz789",
"created": true
}
}
created, hedef kanal için yeni bir kişi oluşturulup oluşturulmadığını veya mevcut bir kişinin bulunup bağlanıp bağlanmadığını size bildirir. Bunu ikinci kez çağırmak güvenlidir; kopya oluşturmak yerine created: false ile aynı contact_id değerini döndürür.
422, hesabın bu bağlantıyı şu anda gerçekleştiremeyeceği anlamına gelir: kişi zaten o kanal ailesindedir, kullanılacak bir telefon numarası yoktur veya hedef kanal için bağlı bir gönderici bulunmamaktadır. 409 ise iki kişinin zaten iki farklı kişiye bağlı olduğu anlamına gelir; önce birinin bağlantısını kesin.
Bir kişinin bağlı görüşmelerini listeleme
GET /contacts/{contactId}/linked
Bu kişiyle aynı kişi olan diğer görüşmeleri döndürür. Bağlantısı olmayan bir kişi, 404 yerine boş bir dizi döndürür; “bu kişinin başka kanalı yok” durumu normal bir durumdur.
curl "<span data-t="apiBaseUrl">https://api.youraiconnector.com</span>/v1/contacts/contact_abc123/linked?apiKey=YOUR_API_KEY"
Yanıt
{
"success": true,
"data": [
{
"contact_id": "contact_def456",
"channel": "sms",
"custom_channel": null,
"first_name": "Jane",
"last_name": "Smith",
"phone_number": "+15551234567",
"last_message": "Sounds good, thanks!",
"last_message_timestamp": "2026-06-09T10:21:00.000Z",
"linked_from": {
"contact_id": "contact_abc123",
"channel": "whatsapp",
"linked_at": "2026-06-01T09:00:00.000Z",
"reason": "continue_on_channel"
}
}
]
}
Bir kişinin bağlantısını kesme
DELETE /contacts/{contactId}/link
Bu kişiyi, tek taraflı olarak bağlı olduğu kişiden ayırır; o kişiye bağlı olan diğer kişiler bağlantılarını korur, bu nedenle üç kişiden birinin bağlantısını kesmek grubu dağıtmaz.
curl -X DELETE "<span data-t="apiBaseUrl">https://api.youraiconnector.com</span>/v1/contacts/contact_abc123/link?apiKey=YOUR_API_KEY"
Yanıt
{ "success": true }
Bir kişinin profil resmini getirme
POST /contacts/{contactId}/profile-pic
Kişinin WhatsApp veya Meta profil fotoğrafını talep üzerine getirir (ve önbelleğe alır); bu, Kişi getirme işleminde avatarUrl olarak döndürülen fotoğrafın aynısıdır ve yenilenmiştir.
curl -X POST "<span data-t="apiBaseUrl">https://api.youraiconnector.com</span>/v1/contacts/contact_abc123/profile-pic?apiKey=YOUR_API_KEY"
Yanıt
{
"success": true,
"avatar_url": "https://example.com/photo.jpg",
"cached": false
}
cached: true, URL’nin yeni bir sağlayıcı sorgusu yerine yakın zamandaki bir getirme işleminden geldiği anlamına gelir; resimler 7 gün boyunca önbelleğe alınır ve sağlayıcının ulaşılabilir bir fotoğrafı olmadığını bildirdiği bir kişi, 24 saat boyunca kullanılamaz olarak önbelleğe alınır. Getirilecek bir resim olmadığında avatar_url atlanır ve message bunun nedenini açıklar.
Kişileri yapay zeka ile otomatik etiketleme
Hesabınızın etiket kurallarını bir veya daha fazla kişinin tüm konuşma geçmişi üzerinde çalıştırır ve tıpkı canlı sohbet sırasında çalışan gerçek zamanlı etiketlemede olduğu gibi etiketleri uygular (veya kaldırır) — aynı kurallar, etiket başına aynı kredi maliyeti geçerlidir.
Bir çalıştırma başlatın
POST /contacts/auto-tag
| Alan | Gerekli | Açıklama |
|---|---|---|
scope |
Evet | Belirli kişileri etiketlemek için "contacts" veya bir yapay zeka temsilcisi tarafından halihazırda yönetilen her konuşmayı etiketlemek için "agent". |
contact_ids |
scope, "contacts" olduğunda gereklidir |
1 ila 500 arasında kişi kimliği dizisi. |
agent_id |
scope, "agent" olduğunda gereklidir |
Konuşmaları etiketlenecek yapay zeka temsilcisi. scope, "contacts" olduğunda bu isteğe bağlıdır ve yalnızca temsilcinin hangi etiket kurallarının çalışacağını daraltır. |
curl -X POST "<span data-t="apiBaseUrl">https://api.youraiconnector.com</span>/v1/contacts/auto-tag?apiKey=YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "scope": "contacts", "contact_ids": ["contact_abc123", "contact_def456"] }'
Tek bir kişi satır içi olarak çalışır ve sonucu hemen döndürür:
{ "success": true, "result": { "tags_applied": 2, "tags_removed": 0 } }
İki veya daha fazla kişi (veya scope: "agent") arka plan işi olarak çalışır ve hemen 202 döndürür:
{ "success": true, "run_id": "m1x2y3-a1b2c3d4", "total": 214 }
Bir çalıştırmayı sorgulayın
GET /contacts/auto-tag/run
Hesabın mevcut (veya en son) çalıştırmasını döndürür, böylece run_id takibini kendiniz yapmadan ilerlemeyi sorgulayabilirsiniz.
curl "<span data-t="apiBaseUrl">https://api.youraiconnector.com</span>/v1/contacts/auto-tag/run?apiKey=YOUR_API_KEY"
Yanıt
{
"success": true,
"run": {
"run_id": "m1x2y3-a1b2c3d4",
"status": "running",
"total": 214,
"processed": 58,
"tagged_contacts": 12,
"tags_applied": 15,
"tags_removed": 2,
"credits_charged": 15
}
}
Hesap hiç çalıştırma başlatmadığında run, null değerindedir. status, "running" durumundan "completed" veya "failed" durumuna geçer.
Hesap başına aynı anda yalnızca bir toplu çalıştırma devam edebilir; başka bir çalıştırma devam ederken ikincisini başlatmak error_code: "auto_tag_run_in_progress" ile 409 döndürür. Tek kişilik bir çalıştırmada kredinin bitmesi error_code: "insufficient_credits" ile 402 döndürür; toplu çalıştırma ise bunun yerine erken durur ve run içinde ne kadar ilerlediğini bildirir.
Bir kişiyi silin
DELETE /contacts/{contactId}
Bir kişiyi kimliğiyle birlikte mesaj geçmişiyle beraber kalıcı olarak siler. Bu işlem geri alınamaz. Tek bir çağrıda birden fazla kişiyi silmek için aşağıdaki Kişileri sil kısmını kullanın.
cURL
curl -X DELETE "<span data-t="apiBaseUrl">https://api.youraiconnector.com</span>/v1/contacts/contact_abc123?apiKey=YOUR_API_KEY"
JavaScript
const res = await fetch("<span data-t="apiBaseUrl">https://api.youraiconnector.com</span>/v1/contacts/contact_abc123", {
method: "DELETE",
headers: { "X-API-Key": "YOUR_API_KEY" },
});
const data = await res.json();
console.log(data.success);
Python
import requests
res = requests.delete(
"<span data-t="apiBaseUrl">https://api.youraiconnector.com</span>/v1/contacts/contact_abc123",
headers={"X-API-Key": "YOUR_API_KEY"},
)
print(res.json()["success"])
Yanıt
{
"success": true
}
Hesabınızda bulunmayan veya farklı bir hesaba ait olan bir kişi kimliği, 404 döndürür.
Kişileri sil
DELETE /contacts
Tek bir çağrıda (500 kimliğe kadar) bir veya daha fazla kişiyi kimliklerine göre kalıcı olarak siler. Hesabınızda bulunmayan kimlikler atlanır ve skipped içinde sayılır. Bu işlem geri alınamaz.
| Alan | Açıklama |
|---|---|
contactIds |
Silinecek kişi kimlikleri dizisi (maks. 500). |
cURL
curl -X DELETE "<span data-t="apiBaseUrl">https://api.youraiconnector.com</span>/v1/contacts?apiKey=YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "contactIds": ["contactId1", "contactId2"] }'
JavaScript
const res = await fetch("<span data-t="apiBaseUrl">https://api.youraiconnector.com</span>/v1/contacts", {
method: "DELETE",
headers: {
"X-API-Key": "YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({ contactIds: ["contactId1", "contactId2"] }),
});
const data = await res.json();
console.log(`Deleted ${data.deleted}, skipped ${data.skipped}`);
Python
import requests
res = requests.delete(
"<span data-t="apiBaseUrl">https://api.youraiconnector.com</span>/v1/contacts",
headers={"X-API-Key": "YOUR_API_KEY"},
json={"contactIds": ["contactId1", "contactId2"]},
)
data = res.json()
print(f"Deleted {data['deleted']}, skipped {data['skipped']}")
Yanıt
{
"success": true,
"deleted": 2,
"skipped": 0
}
Özel bir alanı silme
DELETE /contacts/custom-fields/{fieldKey}
Hesabınızdaki her kişiden bir özel alan anahtarını kaldırır. Bunu, özel bir alanı yeniden adlandırdıktan veya kullanımdan kaldırdıktan sonra temizlik yapmak için kullanın. Anahtar yalnızca harfler, rakamlar, alt çizgiler ve kısa çizgiler içerebilir. Kaç kişinin güncellendiğini döndürür. Bu işlem geri alınamaz.
cURL
curl -X DELETE "<span data-t="apiBaseUrl">https://api.youraiconnector.com</span>/v1/contacts/custom-fields/webinar_date_nh?apiKey=YOUR_API_KEY"
JavaScript
const res = await fetch("<span data-t="apiBaseUrl">https://api.youraiconnector.com</span>/v1/contacts/custom-fields/webinar_date_nh", {
method: "DELETE",
headers: { "X-API-Key": "YOUR_API_KEY" },
});
const data = await res.json();
console.log(`Removed from ${data.updated} contacts`);
Python
import requests
res = requests.delete(
"<span data-t="apiBaseUrl">https://api.youraiconnector.com</span>/v1/contacts/custom-fields/webinar_date_nh",
headers={"X-API-Key": "YOUR_API_KEY"},
)
print(f"Removed from {res.json()['updated']} contacts")
Yanıt
{
"success": true,
"updated": 42
}
Not: Desteklenmeyen karakterler içeren bir alan anahtarı 400 döndürür.
Listeler
Listeler kişileri gruplandırır. Bir liste ya statik (kimin listede olacağına siz karar verirsiniz) ya da akıllı (üyelik kurallara göre hesaplanır ve otomatik olarak güncel tutulur — bkz. Listeleri ve Kişileri Düzenleme) olabilir.
| Alan | Açıklama |
|---|---|
name |
Oluşturma sırasında gereklidir. En fazla 100 karakter. |
status |
live (varsayılan) veya draft. Küçük harf. |
contact_ids |
Listeye eklenecek kişi kimlikleri dizisi. Yalnızca statik listeler. |
type |
static (varsayılan) veya smart. |
smart_rules |
Kural kümesi — type, smart olduğunda gereklidir. Aşağıya bakın. |
Liste oluşturma
POST /lists
curl -X POST "<span data-t="apiBaseUrl">https://api.youraiconnector.com</span>/v1/lists?apiKey=YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Hot leads (active)",
"type": "smart",
"smart_rules": {
"match": "all",
"conditions": [
{ "field": "tags", "op": "has_any", "value": ["tagHotLead"] },
{ "field": "last_activity_at", "op": "within_last", "value": { "amount": 90, "unit": "days" } }
]
}
}'
Yanıt
{
"success": true,
"list_id": "list_abc123",
"evaluation": { "added": 3, "removed": 0, "total": 3 }
}
Akıllı bir liste, aynı istek içinde satır içi olarak değerlendirilir, bu nedenle evaluation size tam olarak kimin listede yer aldığını söyler. Statik bir listede evaluation, null değerindedir.
Liste güncelleme
PUT /lists/{listId}
Yalnızca değiştirdiğiniz alanları gönderin. smart_rules değerini değiştirmek listeyi anında yeniden değerlendirir ve aynı evaluation nesnesini döndürür.
curl -X PUT "<span data-t="apiBaseUrl">https://api.youraiconnector.com</span>/v1/lists/list_abc123?apiKey=YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "smart_rules": { "match": "any", "conditions": [ { "field": "tags", "op": "has_any", "value": ["tagHotLead", "tagWebinar"] } ] } }'
Bir listeyi iki tür arasında değiştirebilirsiniz:
- Statik → akıllı:
{ "type": "smart", "smart_rules": { … } }gönderin. Kurallar anında devreye girer. - Akıllı → statik:
{ "type": "static" }gönderin. Kurallar kaldırılır ve listede kim varsa orada kalmaya devam eder.
smart_rules yapısı
{
"match": "all",
"conditions": [
{ "field": "tags", "op": "has_any", "value": ["tagHotLead"] },
{ "field": "channel", "op": "is_any", "value": ["whatsapp", "sms"] },
{ "field": "last_incoming_message_at", "op": "not_within_last", "value": { "amount": 7, "unit": "days" } },
{ "field": "created_at", "op": "after", "value": "2026-01-01" },
{ "field": "is_bot_active", "op": "is", "value": true },
{ "field": "email", "op": "is_set" },
{ "field": "custom_field", "key": "Plan", "op": "eq", "value": "pro" }
]
}
match—all(her koşul doğru olmalıdır) veyaany(en az biri).conditions— 1 ila 20 koşul, her biri en fazla 100 değer, 200 karaktere kadar dizeler.
field |
op |
value |
|---|---|---|
tags |
has_any, has_all, has_none |
etiket kimlikleri dizisi |
lists |
in_any, not_in_any |
liste kimlikleri dizisi (yalnızca statik listeler — akıllı bir liste başka bir akıllı listeden oluşturulamaz) |
channel |
is_any, is_none |
kanal dizisi |
status |
is_any, is_none |
kişi durumu dizisi |
created_at, last_activity_at, last_incoming_message_at, last_outgoing_message_at, first_ai_interaction_at, last_ai_interaction_at |
within_last, not_within_last |
{ "amount": 1–3650, "unit": "hours" | "days" } |
| aynı tarih alanları | before, after |
ISO tarihi ("2026-01-01", tam günler olarak karşılaştırılır) veya tam ISO tarih-saati ("2026-01-01T14:30:00Z", tam ana göre karşılaştırılır) |
| aynı tarih alanları | is_set, not_set |
— |
has_interacted_with_ai |
is |
true / false — true, yapay zekanın en az bir kez (herhangi bir zamanda) mesaj gönderdiği kişileri eşleştirir |
is_bot_active, do_not_disturb, is_private, has_ever_responded |
is |
true / false |
email, phone_number, first_name, last_name |
is_set, not_set, contains, not_contains |
contains formları için dize |
current_campaign_id, assigned_agent |
is_any, is_none, is_set, not_set |
is_any / is_none formları için kimlik dizisi |
custom_field (artı bir key) |
eq, neq, contains, not_contains, is_set, not_set |
değer formları için dize |
not_within_last ayrıca tarihin hiç ayarlanmadığı kişileri de eşleştirir (“N’den daha önce, veya hiç”), ve metin karşılaştırmaları büyük/küçük harf duyarlılığını göz ardı eder.
Yapay zeka etkileşimi. has_interacted_with_ai yaşam boyu bayrağıdır: Yapay zekanızın en az bir mesaj gönderdiği her kişi için true, diğer herkes için (yalnızca ekibinizin yanıt verdiği kişiler dahil) false. Bu bayrak, yapay zekanın bir kişiye gönderdiği ilk mesaja damgalanır ve asla silinmez; bu nedenle kişinin yapay zeka yanıtlarını kapatmak veya onları başka bir kampanyaya taşımak bunu sıfırlamaz. Bir dönem için — “yapay zekamın bu ay ilgilendiği kişiler”, yani genel faturalandırma sorusu — bunun yerine last_ai_interaction_at aralığını kullanın:
{ "field": "last_ai_interaction_at", "op": "within_last", "value": { "amount": 30, "unit": "days" } }
Bunların hiçbirini is_bot_active (yapay zekanın yanıt vermesine izin verilmiştir, yanıt verdiği anlamına gelmez) veya has_ever_responded (kişi herhangi birine geri yazmıştır) ile karıştırmayın. Aynı iki damga her kişide first_ai_interaction_at / last_ai_interaction_at olarak döndürülür ve tüm kural kümesi GET /contacts?rules= üzerinde de çalışır, böylece bir liste oluşturmadan eşleşmeleri sayabilirsiniz.
Bir kural kümesini önizleyin
POST /lists/preview
Hiçbir şeyi oluşturmadan veya değiştirmeden, bir kural kümesinin eşleşeceği kişileri sayar ve örneklendirir. Kuralları kaydetmeden önce doğruluğunu kontrol etmek için kullanın.
curl -X POST "<span data-t="apiBaseUrl">https://api.youraiconnector.com</span>/v1/lists/preview?apiKey=YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "smart_rules": { "match": "all", "conditions": [ { "field": "tags", "op": "has_any", "value": ["tagHotLead"] } ] } }'
Yanıt
{
"success": true,
"count": 3,
"sample": [
{
"id": "contact_abc123",
"first_name": "Sofia",
"last_name": "Martinez",
"phone_number": "+31600000000",
"email": "sofia@example.com",
"channel": "whatsapp"
}
]
}
sample, en son aktif olandan başlayarak 10 kişiye kadar tutar.
Akıllı listeyi şimdi yeniden çalıştırın
POST /lists/{listId}/evaluate
Anında yeniden değerlendirmeyi zorunlu kılar (paneldeki Şimdi yenile ile aynı işlevi görür). Akıllı listeler zaten bir kişi değiştiğinde ve zamana dayalı kurallar için her 15 dakikada bir güncellenir, bu nedenle bu işlem yalnızca sonucu hemen şimdi istediğinizde gereklidir.
Yanıt
{
"success": true,
"list_id": "list_abc123",
"evaluation": { "added": 2, "removed": 1, "total": 4 }
}
evaluation.skipped: true, aynı listenin başka bir değerlendirmesinin zaten çalışmakta olduğu ve bu çağrının hiçbir şey yapmadığı anlamına gelir.
Akıllı listeler elle seçilen üyeleri kabul etmez
Üyelik uç noktaları, hedef liste akıllı olduğunda "This is a smart list — its members are computed from its rules. Edit the rules instead." ile 409 döndürür. Bu durum POST /contacts/lists, DELETE /contacts/lists, POST /contacts/lists/batch, contact_ids üzerindeki POST /lists ve PUT /lists/{listId} işlemlerini ve CSV içe aktarma hedefi olarak bir akıllı liste seçmeyi kapsar. Bunun yerine kuralları değiştirin.
Statik bir listede POST /lists/{listId}/evaluate çağırmak da bir 409 hatasıdır; çünkü çalıştırılacak kuralları yoktur.
Kişiler API hataları
Kişi uç noktaları standart hata zarfını döndürür:
{
"success": false,
"error": "Contact not found"
}
Bazı uç noktalar, genellikle HTTP durumuyla eşleşen error_code değerini de içerir; bunun tek istisnası, HTTP durumunun 200 olduğu ve yalnızca error_code değerinin 409 bilgisini taşıdığı aşağıdaki yinelenen kişi durumudur. Kişi uç noktalarına özgü kodlar şunlardır:
| Kod | Bir kişi uç noktasında gerçekleştiğinde |
|---|---|
400 |
Hatalı istek — eksik/geçersiz alan, boş gövde, hatalı imleç veya toplu işlemde 500’den fazla kimlik. |
402 |
Bir kişi üzerinde yapay zeka etiketleme işlemini tamamlamak için yeterli kredi yok (error_code: "insufficient_credits"). |
404 |
Kişi, liste veya etiket hesabınızda bulunamadı. |
409 |
Bu telefon numarasına sahip bir kişi zaten mevcut (oluşturma sırasında). Gövdede error_code olarak ve 200 HTTP durumuyla döndürülür, bu yüzden burada error_code üzerinden dallanma yapın. Ayrıca toplu otomatik etiketleme işlemi zaten devam ediyorsa (error_code: "auto_tag_run_in_progress") veya bir kişiyi başka bir kanala bağlamak, halihazırda iki farklı kişiye bağlı olan iki kişiyi birleştirecekse döndürülür. |
422 |
Kişi şu anda mesaj alamıyor (rahatsız etmeyin, gizli veya desteklenmeyen kanal). Kanal bağlantısı uç noktasında, telefon numarası olmaması, desteklenmeyen bir kanal eşleşmesi veya hedef kanal için bağlı bir gönderici olmaması durumlarını da kapsar. |
Bir kişi uç noktasındaki 403, plan erişiminden ziyade kişi sınırı veya liste izni sorunu anlamına da gelebilir. Her uç noktanın döndürebileceği ortak kodlar — 401, 403 (planınız API erişimini içermiyor), 429 (hız sınırı) ve 500 — yeniden deneme rehberliği ile birlikte Hatalar ve Sayfalandırma bölümünde listelenmiştir.
Sonraki adımlar
- Mesajlar API’si — kanal kimliğine göre mesaj gönderin ve konuşmaları yönetin.
- API Başvurusu — etiketler ve listeler dahil olmak üzere tam uç nokta listesi.
- API Erişimi — kimlik doğrulama, hız sınırları ve hata işleme.