Meta ve Instagram API Entegrasyonu
SMSBAT ChatHub Platformu üzerinde Instagram uygulaması oluşturmaya yönelik referans: kimlik doğrulama, Instagram Direct sohbetleri, gönderiler ve Reels hakkındaki yorumlar, Hikaye yanıtları, web kancaları ve anketler.
Kaynaklar
Bu sayfa, dahili Meta Yorumları API spesifikasyonunu canlı OpenAPI ile birleştirir
https://chatapi.smsbat.com/swagger/v1/swagger.json’deki tanımlar ve
https://restapi.smsbat.com/swagger/v1/swagger.json. İkisinin anlaşamadığı yerde,
fark satır içinde belirtilir ve Açık sorular altında listelenir.
1. Temel URL’ler
| Amaç | URL’si |
|---|---|
| Sohbet API’si + Meta API | https://chatapi.smsbat.com |
| Swagger Kullanıcı Arayüzü / OpenAPI | https://chatapi.smsbat.com/index.html · …/swagger/v1/swagger.json |
| REST API (kuruluşlar, geri çağırma URL’leri) | https://restapi.smsbat.com |
| REST API Swagger | https://restapi.smsbat.com/swagger/v1/swagger.json |
| Operatör web paneli | https://chat.smsbat.com |
2. Kimlik Doğrulama
Kimlik doğrulama şeması uç nokta grubuna bağlıdır. Bunları karıştırmak 401’un en yaygın nedenidir.
| Grup | Başlık |
|---|---|
chatapi.smsbat.com/api/meta/* (gönderiler, yorumlar) | X-Authorization-Key: <organization token> |
chatapi.smsbat.com/api/chat/*, /api/company/*, /api/operator/* | Authorization: Bearer <JWT> |
restapi.smsbat.com/* | X-Authorization-Key · Authorization: Bearer · Temel Kimlik Doğrulaması |
X-Authorization-Key için organizasyon jetonu, Profil altındaki panelde düzenlenir.
Şirket ve operatör JWT’leri /api/company/get-token ve /api/operator/get-token’den gelir.
Tutarsızlık
chatapi OpenAPI belgesi tek bir güvenlik şemasını (Bearer) bildirir ve onu uygular
küresel olarak. X-Authorization-Key orada hiç bildirilmiyor, ancak dahili Meta
Yorumlar API spesifikasyonu bunu /api/meta/* olarak adlandırır. Büyük olasılıkla tarafından ele alınır
Swagger’a yansımayan ara yazılım. Göndermeden önce ampirik olarak onaylayın.
2.1 Şirket jetonu
POST https://chatapi.smsbat.com/api/company/get-token
Content-Type: application/json
{ "login": "company_login", "password": "company_password" }
200 OK çıplak bir belirteç dizesi döndürür.
2.2 Organizasyonlar
GET https://chatapi.smsbat.com/api/company/organization
Authorization: Bearer <company_token>
[ { "id": 24, "name": "My Instagram Store" } ]
2.3 Bir kuruluştaki operatörler
GET https://chatapi.smsbat.com/api/operator?organizationId=24
Authorization: Bearer <company_token>
[
{
"id": 21,
"name": "Jane Doe",
"status": 0,
"organization": { "id": 24, "name": "My Instagram Store" }
}
]
Operatör durumları: 0 Aktif, 1 Aktif Değil, 2 Silindi.
2.4 Operatör ekleme / senkronize etme
POST https://chatapi.smsbat.com/api/operator/synchronize
Authorization: Bearer <company_token>
Content-Type: application/json
[ { "organizationId": 24, "name": "John Operator" } ]
200 OK → [ { "id": 21, "status": 0, "name": "John Operator" } ]
2.5 Operatör JWT
POST https://chatapi.smsbat.com/api/operator/get-token
Authorization: Bearer <company_token>
Content-Type: application/json
{ "id": 21, "expiresAt": "2026-12-31T23:59:59.000Z" }
200 OK JWT’yi bir dize olarak döndürür.
2.6 Operatör jetonunu doğrulama
POST https://chatapi.smsbat.com/api/operator/validate-token
Authorization: Bearer <company_token>
Content-Type: application/json
"eyJhbGciOi..."
{
"isValid": true,
"operatorId": 21,
"clientId": 0,
"expiresAt": "2026-12-31T23:59:59.000Z",
"error": null
}
Geçersiz olduğunda: { "isValid": false, "error": "Invalid token" }.
2.7 Operatör sohbet panelini yerleştirme
<script type="module" id="operator-chat-panel-script"
src="https://widget.smsbat.com/operator-chat-panel/widget-script.js"
token="YOUR_OPERATOR_JWT_TOKEN"></script>
3. Sohbet paneline derin bağlantılar
Harici bir sistem (CRM, ERP, web sitesi) belirli bir konuşmayı açabilir.
https://chat.smsbat.com/. Operatör, sorgu parametresi olarak iletilen bir JWT tarafından yetkilendirilir.
https://chat.smsbat.com/?chat_raw_id=<chat_id>&token=<jwt>
https://chat.smsbat.com/?phone=<phone>&token=<jwt>
https://chat.smsbat.com/?from=<bm_id>&phone=<phone>&token=<jwt>
https://chat.smsbat.com/?source=7&from=<bm_id>&phone=<phone>&token=<jwt>
| Parametre | Açıklama |
|---|---|
chat_raw_id | Sohbet Kimliği |
phone | Uluslararası formatta telefon numarası |
from | Marka / işletme hesabı tanımlayıcı (bm_id) |
source | Sohbet kaynağı — 7 Instagram için, bkz. §8.1 |
token | Sohbetlere erişimi olan geçerli, süresi dolmamış operatör JWT |
Geçersiz bir JWT, ziyaretçiyi operatör panelinin oturum açma ekranına yönlendirir.
4. Instagram Doğrudan sohbetleri
4.1 Sohbetleri listeleme
GET https://chatapi.smsbat.com/api/chat/chats?source=7&page=1&per_page=20
Authorization: Bearer <token>
Note
Buradaki sayfalandırma per_page (snake_case) şeklindedir. /api/meta/* altında ve oylama
bitiş noktası perPage (camelCase). Bu bir yazım hatası değildir; API her ikisini de kullanır.
Sorgu parametreleri, tümü isteğe bağlı:
| Parametre | Tür | Açıklama |
|---|---|---|
source | ChatSource | 7 sonuçları Instagram ile kısıtlıyor |
entityId | int | İşletme hesabı kimliği. Yalnızca source |
instagram_user_id | int | ChatHub’da Instagram kullanıcı kimliği |
facebook_user_id | int | ChatHub’da Facebook kullanıcı kimliği |
page / per_page | int | Sayfalandırma, varsayılanlar 1 / 20 |
status | ChatStatus[] | Sohbet durumu, tekrarlanabilir |
search | string | Serbest metin araması (isim, telefon,…) |
organizationId | int | Kuruluş Kimliği |
operatorId | int[] | Atanan operatörlere göre filtrele |
date | string[] | İki sınır: ?date=…&date=… |
isChain | bool | Önceki sohbetlerden gelen mesajları taşıyarak sohbetleri zincirler halinde döndürün |
isUnread, starMark, isOperator, isAIAgent | bool | Ek filtreler |
phone, email, contactId, clientId, tagIds, rate, sortedBy | — | Diğer filtreler |
200 OK GetChatsResponse değerini döndürür:
{
"total": 1,
"newMessagesCount": 2,
"items": [
{
"id": 1867,
"theme": null,
"messSource": 7,
"chatStatus": 1,
"countUnread": 2,
"metaUserId": "1585775752382460",
"instaAccount": { "id": 12, "name": "my_instagram_shop", "photo": "https://..." },
"instagramUser": { "id": 123, "name": "marianna_cat", "photo": "https://..." },
"operator": { "id": 21, "name": "Jane", "photo": "https://..." },
"client": { "id": 55, "name": "Marianna", "photo": null },
"textLastMess": "Hello! Is this product available?",
"timeLastMess": "2026-08-13T10:15:00Z",
"authorLastMessage": 1,
"messageStatus": 6,
"isMedia": false,
"phone": null,
"organizationId": 1,
"createdAt": "2026-08-13T10:14:00Z",
"isStarred": false,
"isBlocked": false,
"tags": []
}
]
}
Bir Instagram uygulaması için önemli olan alanlar:
| Alan | Anlamı |
|---|---|
instaAccount | Instagram işletme hesabı (mağaza). id, entityId filtre değeridir; name Meta’daki hesap adıdır |
instagramUser | Müşteri. name Instagram tanıtıcısıdır, id instagram_user_id filtre değeridir |
metaUserId | Müşterinin Meta tarafındaki kapsamlı kimliği (string) |
messSource | 7 Instagram için |
phone | Genellikle Instagram için null — bunu anahtar olarak kullanmayın |
ChatDTO ayrıca olxUser, promUser, waba, rozetkaUser, facebookAccount’yi de taşır
facebookUser, viberAccount, tgBot, tgUser, viberBot, viberBotUser, widget,
media, isConnectedAI, isPromo, rate, rateComment, closedBy, draft, lang,
starMark, contactId, contactName, block, isInStopList, stopList,
isSmsFallbackEnabled ve taggedMessages.
4.2 Sohbet mesajları
GET https://chatapi.smsbat.com/api/chat/chats/1867/messages?isChain=false
Authorization: Bearer <token>
200 OK, ChatMessageDTO dizisini döndürür:
[
{
"id": 9928,
"chatId": 1867,
"message": "Hi! Do you have size M in stock?",
"messageTranslation": null,
"phone": null,
"author": 1,
"source": 7,
"media": null,
"replyTo": null,
"status": 6,
"date": "2026-08-13T10:14:00Z",
"operator": null,
"client": { "id": 123, "name": "marianna_cat", "photo": "https://..." },
"messageType": 0,
"isInternal": false,
"isBroadcast": false,
"starMark": false,
"referralGuid": null,
"postId": null,
"isConnectedAI": false,
"organizationId": 1,
"countUnreadMessages": 0
}
]
postId, mesaj bir Instagram gönderisi veya Hikayeyle ilgili olduğunda doldurulur - iletin
id / postId olarak Meta API’ye geri dönün. media bir ChatMediaDTO’dir:
{ name, format, type, uri, raw, length, isUploaded }.
4.3 Mesaj gönderme (JSON)
POST https://chatapi.smsbat.com/api/chat/1867/message
Authorization: Bearer <token>
Content-Type: application/json
Gövde — SendChatMessageDTO:
{
"textMessage": "Hello! Yes, size M is available.",
"author": 0,
"isInternal": false,
"replyToMessageId": 9928,
"appGuid": "550e8400-e29b-41d4-a716-446655440000",
"media": {
"name": "item.jpg",
"format": "image/jpeg",
"dataBase64": "/9j/4AAQSkZJRg...",
"type": 1
}
}
| Alan | Tür | Açıklama |
|---|---|---|
textMessage | string? | Mesaj metni. media mevcut olduğunda boş olabilir |
author | AuthorMessage? | 0 operatör, 1 istemci |
isInternal | bool? | true müşteriye teslim edilmeyen dahili notu işaret eder |
replyToMessageId | int? | Yanıtlanan mesajın kimliği |
appGuid | uuid? | Yönlendirme GUID’i |
media | MediaDTO? | { name, format, dataBase64, thumbnail, duration, type } |
200 OK → { "id": 9930, "messageStatus": 0 }
Yolda bir yönlendirme GUID’si de iletilebilir:
POST /api/chat/{chatId}/{referralGuid}/message (aynı şekilde …/message/v1, …/message/v2).
4.4 Dosya veya video gönderme (çok parçalı, v2)
POST https://chatapi.smsbat.com/api/chat/1867/message/v2
Authorization: Bearer <token>
Content-Type: multipart/form-data
Form alanı adları nokta gösterimli PascalCase'dir
textMessage ve media.file sessizce göz ardı edilir. Aşağıdaki adları tam olarak kullanın.
| Form alanı | Tür | Açıklama |
|---|---|---|
TextMessage | string | Mesaj metni |
Author | int | 0 operatör, 1 istemci |
IsInternal | bool | Dahili not |
ReplyToMessageId | int | Yanıtlanan mesaj |
AppGuid | uuid | Yönlendirme GUID’i |
Media.File | binary | Dosyanın kendisi |
Media.Name | string | Dosya adı |
Media.Format | string | MIME türü (video/mp4, image/png, application/pdf) |
Media.Type | MediaType | §8.5’e bakın |
Media.DataBase64 | string | Media.File’ye alternatif |
Media.Thumbnail | string | Base64 video önizleme çerçevesi |
Media.Duration | double | Saniye cinsinden video süresi |
curl -X POST "https://chatapi.smsbat.com/api/chat/1867/message/v2" \
-H "Authorization: Bearer <token>" \
-F "TextMessage=Here is the price list" \
-F "Author=0" \
-F "Media.Type=2" \
-F "Media.File=@./price.pdf"
200 OK → { "id": 9931, "messageStatus": 0 }
4.5 Sohbet durumunu değiştir
PUT https://chatapi.smsbat.com/api/chat/status
Authorization: Bearer <token>
Content-Type: application/json
{ "id": 1867, "status": 4 }
200 OK güncellenen nesneyi yansıtır.
4.6 Mesaj durumlarını güncelleyin
PUT https://chatapi.smsbat.com/api/chat/messages/status
Authorization: Bearer <token>
Content-Type: application/json
{ "status": 3, "messageIds": [9928, 9929] }
4.7 Sohbeti silme
DELETE https://chatapi.smsbat.com/api/chat/chats/1867
Authorization: Bearer <token>
5. Gönderiler, Makaralar ve Hikayeler
Temel yol: https://chatapi.smsbat.com/api/meta
Yazarı: X-Authorization-Key: <organization token>
5.1 Gönderileri, Makaraları ve Hikayeleri listeleyin
GET https://chatapi.smsbat.com/api/meta/posts?platform=instagram&mediaType=story&page=1&perPage=20
X-Authorization-Key: <token>
| Parametre | Tür | Gerekli | Açıklama |
|---|---|---|---|
page | int | hayır | Sayfa, varsayılan 1 |
perPage | int | hayır | Sayfa başına öğe sayısı, varsayılan 20 |
id | int | hayır | Dahili posta kimliğine göre filtrele |
platform | string | hayır | instagram veya facebook |
mediaType | string | hayır | post, reel veya story. Atlandığında tüm türler |
# Every post
curl -H "X-Authorization-Key: <token>" \
"https://chatapi.smsbat.com/api/meta/posts?page=1&perPage=10"
# Instagram only
curl -H "X-Authorization-Key: <token>" \
"https://chatapi.smsbat.com/api/meta/posts?platform=instagram"
# A single post by ID
curl -H "X-Authorization-Key: <token>" \
"https://chatapi.smsbat.com/api/meta/posts?id=42"
# Instagram Stories only
curl -H "X-Authorization-Key: <token>" \
"https://chatapi.smsbat.com/api/meta/posts?platform=instagram&mediaType=story"
200 OK:
{
"total": 42,
"items": [
{
"id": 42,
"metaId": "18113450675314072",
"text": "Check out our new collection!",
"imageUrl": "https://dashboard.smsbat.com/api/meta/post/media/7d124c36-1711-4aa8-b21d-f6dbf8f347ef",
"platform": "instagram",
"mediaType": "story",
"createdAt": "2026-07-22T09:35:30Z",
"story": {
"id": 42,
"metaId": "18113450675314072",
"url": "https://dashboard.smsbat.com/api/meta/post/media/7d124c36-1711-4aa8-b21d-f6dbf8f347ef"
}
}
]
}
Tutarsızlık — sayaç alanı adı
Swagger şeması MetaCommentPostListItemDtoPaginationDTO total’yi tanımlar.
dahili spesifikasyon belgeleri totalCount. Swagger koddan oluşturulmuştur, dolayısıyla
total daha muhtemel gerçektir. Bu sorun çözülene kadar total ?? totalCount’yi ayrıştırın.
| Alan | Açıklama |
|---|---|
id | Dahili gönderi kimliği |
metaId | Meta’da harici gönderi / Makara / Hikaye Kimliği |
text | Yazı başlığı |
imageUrl | Sıralı olmayan MetaPost.Guid veya null ile anahtarlanan proxy medya URL’si |
platform | facebook veya instagram |
mediaType | post, reel veya story |
createdAt | Oluşturulma tarihi (platform tarihi veya veritabanı tarihi) |
story | yalnızca mediaType: "story" için mevcut |
story.id | Dahili Hikaye Kimliği; eşittir post.id |
story.metaId | Meta’da Harici Hikaye Kimliği |
story.url | Saklanan Hikaye ortamının kararlı proxy URL’si; null medya kaydedilemezse |
Posta medyası iki yolla sunulur: GET /api/meta/post/media/{id:int} geriye doğru
uyumluluk ve GET /api/meta/post/media/{guid:guid}. Yeni API yanıtları ve geri aramalar
her zaman GUID formunu oluşturun.
5.2 Yorumları listele
GET https://chatapi.smsbat.com/api/meta/comments?platform=instagram&postId=42&page=1&perPage=20
X-Authorization-Key: <token>
| Parametre | Tür | Gerekli | Açıklama |
|---|---|---|---|
page | int | hayır | Sayfa, varsayılan 1 |
perPage | int | hayır | Sayfa başına öğe sayısı, varsayılan 20 |
postId | int | hayır | Posta kimliğine göre filtrele |
parentCommentId | int | hayır | Belirli bir yorumun alt yorumları (yanıtları) |
platform | string | hayır | facebook veya instagram |
200 OK:
{
"total": 100,
"items": [
{
"id": 5,
"metaId": "179000000000005",
"text": "What is the price?",
"createdAt": "2026-04-15T10:30:00Z",
"platform": "instagram",
"replyStatus": null,
"author": {
"type": "meta_user",
"name": "John Doe",
"metaUserId": "1585775752382460"
},
"post": {
"id": 1,
"metaId": "18113450675314072",
"text": null,
"imageUrl": "https://dashboard.smsbat.com/api/meta/post/media/7d124c36-…",
"createdAt": "2026-07-22T09:35:30Z",
"mediaType": "story",
"story": {
"id": 1,
"metaId": "18113450675314072",
"url": "https://dashboard.smsbat.com/api/meta/post/media/7d124c36-…"
}
},
"mediaUrl": "https://chatapi.smsbat.com/api/meta/comment/media/5",
"replyTo": {
"id": 3,
"metaId": "179000000000003",
"text": "Parent comment..."
}
}
]
}
| Alan | Açıklama |
|---|---|
id | Dahili yorum kimliği |
metaId | Meta’da harici kimlik. null gönderilinceye kadar bekleyen cevabımız için |
text | Yorum metni |
createdAt | Oluşturulma tarihi |
platform | facebook veya instagram |
replyStatus | null gelen kullanıcı yorumu için; "pending" / "sent" / "failure" cevabımız için |
author.type | "meta_user" harici kullanıcı, "owner" sayfa sahibi |
author.name | Yazar adı |
author.metaUserId | Meta’da kapsamlı kullanıcı kimliği; null için "owner" |
post | Yorumun ait olduğu gönderi, Reel veya Hikaye |
post.mediaType | post, reel veya story |
post.story | Hikaye referansı { id, metaId, url }, Yalnızca hikayeler |
mediaUrl | Yoruma eklenen medya veya null |
replyTo | Veli yorumu { id, metaId, text }; null üst seviyede |
Tutarsızlık — `author.type` türü
Dahili spesifikasyon "meta_user" / "owner" dizelerini belgelemektedir. Havalı türleri
MetaCommentAuthorType enum [0, 1] ile tamsayı olarak. bir JsonStringEnumConverter
boşluğu açıklayabilir, ancak bu gerçek bir yanıtla doğrulanmadı. Bir yaz
her ikisini de kabul eden ayrıştırıcı.
5.3 Bir yorumu yanıtlama
Teslimat için bir yanıtı sıraya koyar.
curl -X POST \
-H "X-Authorization-Key: <token>" \
-H "Content-Type: application/json" \
-d '{"text": "Thanks for the feedback!"}' \
"https://chatapi.smsbat.com/api/meta/comments/5/reply"
Talep gövdesi: { "text": "Reply text" }
202 Accepted, GET /api/meta/comments ile aynı şekle sahip olan yorum nesnesini döndürür.
replyStatus: "pending" ve metaId: null. Teslimat sonucu daha sonra gelir
source: 13 geri arama (§6.4).
Tutarsızlık — yanıt kodu
Swagger gövde olmadan 200 ilan eder; dahili spesifikasyon şunu belirtir: 202 Accepted
vücut olarak yorumla. Denetleyicide büyük ihtimalle ProducesResponseType eksik
özelliği, Swagger’ı varsayılan olarak bırakıyor. Herhangi bir 2xx kabul edin ve bir bedene bağımlı olmayın.
6. Web Kancaları
SMSBAT, URL’nize application/json ile POST istek gönderir ve HTTP 200 geri dönüş bekler.
Boş alanlar tamamen atlandı
Değeri null olan bir alan, geri çağırma gövdesinde hiçbir şekilde serileştirilmez. bir için
Facebook veya Instagram’dan gelmeyen mesajda MetaUserId tuşu yoktur.
“Yok” ve null’yi aynı şeymiş gibi ele alın.
6.1 Geri arama URL’sini kaydedin
curl -X POST 'https://restapi.smsbat.com/organizations/callback_urls' \
-H 'X-Authorization-Key: <token>' \
-H 'Content-Type: application/json' \
-d '{
"url": "https://your-server.com/webhook",
"source": 12,
"headerName": "X-Webhook-Secret",
"headerValue": "your-secret",
"channelType": 7,
"channelEntityId": 12
}'
| Alan | Tür | Açıklama |
|---|---|---|
url | string | Uç noktanız |
source | SendingSourceCallback | Olay türü, bkz. §8.2 |
headerName / headerValue | string | İsteğe eklediğimiz rastgele kimlik doğrulama başlığı (isteğe bağlı) |
channelType | ChatSource | Kanal. 7 Instagram için. İsteğe bağlı |
channelEntityId | int | Belirli bir işletme hesabı. channelType gerektirir |
channelType olmadan URL her kanaldan etkinlik alır.
Tip
Yorumların tam kapsamı iki kayıt gerektirir: source: 12 yeni yorumlar ve
source: 13 yanıt durumları için. Doğrudan ve Hikaye yanıtları için source: 3 ekleyin
(ve her sohbet mesajını istiyorsanız 11).
Geriye kalan işlemler:
GET https://restapi.smsbat.com/organizations/callback_urls?source=12
GET https://restapi.smsbat.com/organizations/callback_urls/{id}
PUT https://restapi.smsbat.com/organizations/callback_urls/{id}
DELETE https://restapi.smsbat.com/organizations/callback_urls/{id}
GET şunu döndürür:
[
{
"id": 101,
"url": "https://your-server.com/webhook",
"source": 12,
"headerName": "X-Webhook-Secret",
"headerValue": "your-secret",
"createdAt": "2026-08-13T09:00:00Z",
"channelType": 7,
"channelEntityId": 12
}
]
6.2 Yeni mesaj ve Instagram Hikaye yanıtı (source: 3, 11)
Bir kullanıcının Instagram Hikayesine verdiği yanıt, bu geri aramalarda sıradan bir mesaj olarak gelir.
ekstra üst düzey Story bloğuyla:
{
"ChatId": 123,
"MessageId": 456,
"MessageText": "😍",
"Username": "Jane Smith",
"UserId": 789,
"MetaUserId": "1585775752382460",
"ShopId": 12,
"ShopName": "instagram shop name",
"Author": 0,
"type_messenger": 7,
"Story": {
"Id": 42,
"MetaId": "18113450675314072",
"Url": "https://dashboard.smsbat.com/api/meta/post/media/7d124c36-1711-4aa8-b21d-f6dbf8f347ef"
}
}
| Alan | Açıklama |
|---|---|
ChatId / MessageId | Sohbet ve mesaj tanımlayıcıları |
Author | 0 kullanıcı, 1 operatör |
Username | Instagram / Facebook görünen adı veya tanıtıcısı |
UserId | SMSBAT’ta dahili sayısal kullanıcı kimliği |
MetaUserId | Meta’daki konuşma ortağının Kapsamlı Kimliği. Giden operatör mesajında bu, operatörü değil, yine de sohbetin Meta kullanıcısını tanımlar |
ShopId | Instagram / Facebook işletme hesabının dahili kimliği |
ShopName | Bağlantı anında Meta’dan alınan işletme hesabı adı |
MessageText | Mesaj metni |
MessageMedia | Mesaj medya olduğunda medya URL’si |
type_messenger | Kaynak, 7 Instagram için |
operator_name | Operatör adı şu durumda: Author = 1 |
Story | Yalnızca gelen Hikaye yanıtında sunum yapın |
Story.Id | Dahili Hikaye (MetaPost) Kimliği — Meta API’sinde doğrudan id / postId olarak kullanılabilir |
Story.MetaId | Meta’da Harici Hikaye Kimliği |
Story.Url | Depolanan Hikaye ortamının kararlı proxy URL’si. Medya kaydedilemediğinde yok — Story bloğu ve mesaj hala teslim ediliyor |
`Author`, Sohbet API'sine göre ters çevrilmiştir
ChatMessageDTO.author’da 0 operatör, 1 ise istemci anlamına gelir. Bu geri aramada
tam tersi: 0 kullanıcı, 1 operatördür. Haritalamayı paylaşmayın.
6.3 Yeni yorum (source: 12)
Bir Meta kullanıcısı bir Facebook gönderisine veya Instagram gönderisine/Reel’e yorum yaptığında tetiklenir.
Note
Instagram Hikaye yanıtları source: 12 üzerinden iletilmiyor. Sıradan bir şekilde geliyor
source: 3 ve/veya 11 üzerinden Story bloğuyla gelen mesajlar — bkz. §6.2.
{
"type": "new_comment",
"platform": "instagram",
"comment": {
"id": 10,
"metaId": "179000000000010",
"parentCommentId": 5,
"parentMetaId": "179000000000005",
"parentCommentText": "The user's previous comment",
"text": "Great product!",
"createdAt": "2026-04-16T12:00:00Z",
"author": {
"type": "meta_user",
"name": "Jane Smith",
"metaUserId": "1585775752382460"
}
},
"post": {
"id": 1,
"metaId": "123456789012345",
"text": "Post description...",
"imageUrl": "https://dashboard.smsbat.com/api/meta/post/media/7d124c36-…",
"createdAt": "2026-04-10T12:00:00Z",
"mediaType": "post"
}
}
6.4 Yorum yanıt durumu (source: 13)
Başarılı ya da başarısız olsun, bir yanıt iletmeye çalıştıktan sonra tetiklenir.
{
"type": "comment_status",
"platform": "instagram",
"comment": {
"id": 15,
"metaId": "179000000000015",
"parentCommentId": 10,
"parentMetaId": "179000000000010",
"parentCommentText": "Great product!",
"text": "Thanks for the feedback!",
"createdAt": "2026-04-16T12:05:00Z",
"updatedAt": "2026-04-16T12:05:03Z",
"replyStatus": "sent",
"author": {
"type": "owner",
"name": "Support Agent"
}
},
"post": {
"id": 1,
"metaId": "179999999999999",
"text": "Reel description...",
"imageUrl": "https://dashboard.smsbat.com/api/meta/post/media/7d124c36-…",
"createdAt": "2026-07-22T09:35:30Z",
"mediaType": "reel"
}
}
6.5 Paylaşılan yorum geri çağırma alanları
Her iki yorum geri araması da bir vücut şeklini paylaşır ve yalnızca type farklılık gösterir.
| Alan | Açıklama |
|---|---|
type | "new_comment" veya "comment_status" |
platform | "facebook" veya "instagram" |
comment.id | Dahili yorum kimliği |
comment.metaId | Meta’da harici kimlik; null gönderilmeden önce bekleyen bir yanıt için |
comment.parentCommentId | Ebeveyn yorum kimliği. Üst düzey bir yorum için yok |
comment.parentMetaId | Harici üst yorum kimliği. Üst düzeyde yok |
comment.parentCommentText | Ebeveyn yorum metni. Üst düzeyde yok |
comment.text | Yorum metni |
comment.createdAt | Oluşturulma tarihi |
comment.updatedAt | Son güncelleme. Yorum hiç düzenlenmemişse yok |
comment.replyStatus | "pending" / "sent" / "failure". Gelen kullanıcı yorumu için yok |
comment.author.type | "meta_user" veya "owner" |
comment.author.name | Yazar adı |
comment.author.metaUserId | Meta’da kapsamlı yazar kimliği. "owner" için yok |
comment.mediaUrl | Yorum medyası. Hiçbiri olmadığında yok |
post.id | Dahili gönderi kimliği |
post.metaId | Meta’da harici gönderi / Makara / Hikaye Kimliği |
post.text | Mesaj metni |
post.imageUrl | Resim URL’sini yayınlayın veya null |
post.createdAt | Gönderinin oluşturulma tarihi |
post.mediaType | Yorum geri aramalarında yalnızca post veya reel |
6.6 Yeni sohbet (source: 7)
{ "ChatId": 12345, "Phone": "+380501234567", "chat.Source": 7 }
6.7 Mesaj ve sohbet durumu değişiklikleri (source: 6 / 5)
{ "name": "changed_message_status", "id": 9928, "status": 6 }
{ "name": "changed_chat_status", "id": 1867, "status": 4 }
6.8 Mesaj düzenlendi veya silindi (source: 9)
{ "messageId": 9930, "text": "Updated message text" }
{ "messageId": 9931, "delete": true }
6.9 Yazma göstergesi (source: 8)
{ "chat_id": 1867, "event": "start_typing", "operator_name": "Iryna" }
{ "chat_id": 1867, "event": "end_typing" }
7. Olay yoklaması
Gelen HTTP’yi kabul edemeyen ortamlar için.
7.1 Olayları getir
GET https://chatapi.smsbat.com/api/chat/callback-events?page=1&perPage=20
Authorization: Bearer <token>
| Parametre | Açıklama |
|---|---|
organizationId | İsteğe bağlı. Atlandığında belirteçten alınır |
page / perPage | Sayfalandırma, varsayılanlar 1 / 20 |
{
"page": 1,
"perPage": 20,
"total": 947,
"items": [
{
"ChatId": 1867,
"MessageId": 9928,
"MessageText": "Hello there!",
"MessageMedia": null,
"Phone": null,
"Username": "marianna_cat",
"UserId": 123,
"ShopId": 12,
"ShopName": "instagram shop name",
"Author": 1,
"type_messenger": 7,
"message_date": "2026-08-13T12:27:39.724Z",
"timestamp": "2026-08-13T12:27:39.736Z",
"event_guid": "ff60129e-c6e4-4876-9d90-badb430c0606",
"organization_id": 1,
"callback_type": "3"
}
]
}
Her olay event_guid, timestamp, organization_id ve callback_type’yi taşır — bir
§8.2’deki source değerleriyle eşleşen dize. Kalan alanlar karşılık gelenlerle eşleşir
§6’daki web kancası.
7.2 İşlenen etkinlikleri onaylama
POST https://chatapi.smsbat.com/api/chat/callback-events/processed
Authorization: Bearer <token>
Content-Type: application/json
[ "ff60129e-c6e4-4876-9d90-badb430c0606" ]
200 OK → { "deleted": 1 }
Halihazırda kaldırılmış olan etkinlikler deleted olarak sayılmaz. Sipariş verme ve yeniden denemeler sizin sorumluluğunuzdadır
tarafın sorumluluğundadır.
7.3 Önerilen döngü
- Bir programa göre
GET /api/chat/callback-eventsanketi yapın. - Hizmetinizdeki olayları işleyin.
- İşlenen
event_guidlistesini/callback-events/processed’ye gönderin. - Tekrar edin.
8. Numaralandırma referansı
8.1 ChatSource — kanal (0–9)
| Kod | Kanal |
|---|---|
| 0 | Viber |
| 1 | ViberBot |
| 2 | TelegramBot |
| 3 | |
| 4 | Widget |
| 5 | Rozetka |
| 6 | |
| 7 | |
| 8 | Balo |
| 9 | Olx |
8.2 SendingSourceCallback — geri arama olayı türü (0–13)
| Kod | Etkinlik |
|---|---|
| 3 | Chat — Hikaye yanıtlarını da içeren yeni sohbet mesajı |
| 5 | Sohbet durumu değişti |
| 6 | Mesaj durumu değişti |
| 7 | Yeni sohbet oluşturuldu |
| 8 | Yazma göstergesi |
| 9 | Mesaj güncellendi veya silindi |
| 11 | AnyChatMessage — herhangi bir sohbet mesajı |
| 12 | MetaNewComment — yeni Instagram / Facebook yorumu |
| 13 | MetaCommentStatus — yorum yanıtımızın teslimat durumu |
Numaralandırma 0–13’yi kapsar; Instagram entegrasyonları için geri kalan değerlere gerek yoktur.
8.3 ChatStatus (0–4)
0 Yeni, 1 Açık, 2 Bekleniyor, 3 OnPause, 4 Kapalı
8,4 MessageStatus (0–11)
| Kod | İsim |
|---|---|
| 0 | YENİ |
| 1 | BAŞARI |
| 2 | REDDEDİLDİ |
| 3 | OKU |
| 4 | BİLİNMİYOR |
| 5 | İŞLENİYOR |
| 6 | TESLİM EDİLDİ |
| 7 | BLOCKED_BY_USER |
| 8 | USER_NOT_FOUND |
Numaralandırma 0–11’yi kapsar. 9, 10 ve 11 değerleri API’de mevcuttur ancak henüz belgelenmemiştir —
onlara UNKNOWN olarak davranın.
8,5 MediaType (1–10)
1 Fotoğraf, 2 Dosya, 3 Ses, 4 Video, 5 Çıkartma, 6 ÇıkartmaAnimasyonlu,
7 ÇıkartmaVideo, 8 Animasyon, 9 Ses, 10 VideoNot
8.6 AuthorMessage — Sohbet API’sindeki yazar (0–4)
0 Operatör, 1 Müşteri, 2 Bot, 3 ViberAccount
Numaralandırma 0–4’yi kapsar; 4 değeri belgelenmemiş. “Yeni mesaj” geri aramaları,
ters eşleme — bkz. §6.2.
8.7 ChatMessageType (0–2)
0 Metin, 1 Fotoğraf, 2 Dosya
8.8 Yorum replyStatus
null gelen kullanıcı yorumu, "pending" yanıtımız sıraya alındı, "sent" iletildi,
"failure" teslimat başarısız oldu.
Açık sorular
Dahili spesifikasyon ile kod tarafından oluşturulan Swagger’ın uyuşmadığı üç nokta. Bir gerçek bir jetonla talep etmek hepsini halleder; o zamana kadar istemciyi savunma amaçlı yazın.
| # | Soru | Şartname | Havalı | Nasıl kontrol edilir |
|---|---|---|---|---|
| 1 | /api/meta/* için kimlik doğrulama başlığı | X-Authorization-Key | yalnızca Bearer ilan edildi | curl -i -H "X-Authorization-Key: <token>" ".../api/meta/posts?perPage=1" — 401 değil, 200 bekliyoruz |
| 2 | Meta yanıtlarındaki sayaç alanı | totalCount | total | Aynı istek — kök JSON anahtarını okuyun |
| 3 | author.type tipi ve reply durum kodu | "meta_user" / "owner", 202 gövdeli | int [0,1], 200 gövdesiz | curl -i .../api/meta/comments?perPage=1 artı bir test yanıtı |
Geçici rehberlik:
- sayaç -
total ?? totalCountdeğerini okuyun; author.type— hem dizeyi hem de tam sayıyı kabul edin (0↔meta_user,1↔owner, eşleme onaylanacak);reply— herhangi bir2xx’yi başarı olarak değerlendirin, gövde gerektirmez,source: 13geri aramasından son durumu alın.
Uygulama notları
- Kimlik doğrulama, uç nokta grubuna göre farklılık gösterir —
/api/meta/*,X-Authorization-Key’yi, sohbetleri ve operatörlerBearerkullanır,restapiikisini de kabul eder. - Sayfa numaralandırma iki şekilde yazılır —
per_page,/api/chat/chats,perPage/api/meta/*ve/api/chat/callback-events. multipart/form-dataalanlar, nokta gösterimli (Media.File,Media.Type) PascalCase’dir.- Geri aramalarda boş alanlar dikkate alınmaz — eksik anahtar,
nullanlamına gelir. phoneInstagram’da genelliklenullolur. MüşteriyiinstagramUser.id/ ile tanımlayınmetaUserIdveinstaAccount.id(entityIdfiltre değeri) ile alışveriş yapın.- Bir geri aramadan gelen
Story.Id, Meta API’yeid/postIdolarak doğrudan geri aktarılabilir. - Derin bağlantıda veya widget’ta kullanmadan önce JWT operatörünün
expiresAtoperatörünü kontrol edin.