Помощен център Meta & Instagram API интеграция

Meta & Instagram API интеграция

Справка за изграждане на приложение на Instagram на SMSBAT ChatHub Platform: удостоверяване, Директни разговори в Instagram, коментари за публикации и барабани, отговори на истории, уеб кукички и анкети.

Извори

Тази страница обединява вътрешната спецификация на API за мета коментари с живия OpenAPI определения в https://chatapi.smsbat.com/swagger/v1/swagger.json и https://restapi.smsbat.com/swagger/v1/swagger.json. Когато двамата не са съгласни, разликата се извиква на линия и е посочена под Отворени въпроси.


1. Основни URL адреси

ЦелURL
API за чат + API за метаhttps://chatapi.smsbat.com
Swagger UI / OpenAPIhttps://chatapi.smsbat.com/index.html · …/swagger/v1/swagger.json
REST API (организации, URL адреси за обратно извикване)https://restapi.smsbat.com
REST API Swaggerhttps://restapi.smsbat.com/swagger/v1/swagger.json
Уеб панел на оператораhttps://chat.smsbat.com

2. Удостоверяване

Схемата за удостоверяване зависи от групата крайни точки. Смесването им е най-честата причина за 401.

ГрупаЗаглавка
chatapi.smsbat.com/api/meta/* (публикации, коментари)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 · Основно удостоверяване

Токенът на организацията за X-Authorization-Key се издава в панела под Профил. JWT на компанията и оператора идват от /api/company/get-token и /api/operator/get-token.

Несъответствие

Документът chatapi OpenAPI декларира една единствена схема за сигурност — Bearer — и я прилага глобално. X-Authorization-Key изобщо не е деклариран там, въпреки че вътрешният Meta Спецификацията на API за коментари го нарича /api/meta/*. Най-вероятно се обработва от междинен софтуер, който не е отразен в Swagger. Потвърдете емпирично, преди да изпратите.

2.1 Фирмен токен

POST https://chatapi.smsbat.com/api/company/get-token
Content-Type: application/json

{ "login": "company_login", "password": "company_password" }

200 OK връща гол символичен низ.

2.2 Организации

GET https://chatapi.smsbat.com/api/company/organization
Authorization: Bearer <company_token>
[ { "id": 24, "name": "My Instagram Store" } ]

2.3 Оператори в организация

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" }
  }
]

Статуси на оператора: 0 Активен, 1 Неактивен, 2 Изтрит.

2.4 Добавяне / синхронизиране на оператори

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 Оператор 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 като низ.

2.6 Валидирайте токен на оператор

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
}

Когато е невалиден: { "isValid": false, "error": "Invalid token" }.

2.7 Вграждане на операторския чат панел

<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. Дълбоки връзки към панела за чат

Външна система (CRM, ERP, уебсайт) може да отвори конкретен разговор в https://chat.smsbat.com/. Операторът е упълномощен от JWT, подаден като параметър на заявката.

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>
ПараметърОписание
chat_raw_idID на чата
phoneТелефонен номер в международен формат
fromИдентификатор на марка/бизнес акаунт (bm_id)
sourceИзточник на чат — 7 за Instagram, вижте §8.1
tokenВалиден, неизтекъл оператор JWT с достъп до чатове

Невалиден JWT отвежда посетителя на екрана за вход на операторския панел.


4. Директни разговори в Instagram

4.1 Списък на чатове

GET https://chatapi.smsbat.com/api/chat/chats?source=7&page=1&per_page=20
Authorization: Bearer <token>

Note

Пагинацията тук е per_page (snake_case). Под /api/meta/* и анкетата крайната точка е perPage (camelCase). Това не е правописна грешка — API използва и двете.

Параметри на заявката, всички незадължителни:

ПараметърТипОписание
sourceChatSource7 ограничава резултатите до Instagram
entityIdintID на бизнес акаунт. Прилага се само заедно с source
instagram_user_idintПотребителски идентификатор на Instagram в ChatHub
facebook_user_idintFacebook потребителски идентификатор в ChatHub
page / per_pageintСтраниране, по подразбиране 1 / 20
statusChatStatus[]Състояние на чата, повторяемо
searchstringТърсене в свободен текст (име, телефон, …)
organizationIdintID на организация
operatorIdint[]Филтриране по присвоени оператори
datestring[]Две граници: ?date=…&date=…
isChainboolВръщане на чатове като вериги, носещи съобщения от предишни чатове
isUnread, starMark, isOperator, isAIAgentboolДопълнителни филтри
phone, email, contactId, clientId, tagIds, rate, sortedBy—Други филтри

200 OK връща GetChatsResponse:

{
  "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": []
    }
  ]
}

Полетата, които имат значение за приложението на Instagram:

ПолеЗначение
instaAccountБизнес акаунтът в Instagram (магазинът). id е стойността на филтъра entityId; name е името на акаунта от Meta
instagramUserКлиентът. name е манипулаторът на Instagram, id е instagram_user_id стойността на филтъра
metaUserIdID с обхват на клиента от страната на Meta (низ)
messSource7 за Instagram
phoneОбикновено null за Instagram — не го използвайте като ключ

ChatDTO носи също olxUser, promUser, waba, rozetkaUser, facebookAccount, facebookUser, viberAccount, tgBot, tgUser, viberBot, viberBotUser, widget, media, isConnectedAI, isPromo, rate, rateComment, closedBy, draft, lang, starMark, contactId, contactName, block, isInStopList, stopList, isSmsFallbackEnabled и taggedMessages.

4.2 Съобщения в чата

GET https://chatapi.smsbat.com/api/chat/chats/1867/messages?isChain=false
Authorization: Bearer <token>

200 OK връща масив от ChatMessageDTO:

[
  {
    "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 се попълва, когато съобщението е свързано с публикация в Instagram или история — предайте го обратно като id / postId към Meta API. media е ChatMediaDTO: { name, format, type, uri, raw, length, isUploaded }.

4.3 Изпратете съобщение (JSON)

POST https://chatapi.smsbat.com/api/chat/1867/message
Authorization: Bearer <token>
Content-Type: application/json

Тяло — 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
  }
}
ПолеТипОписание
textMessagestring?Текст на съобщението. Може да е празно, когато присъства media
authorAuthorMessage?0 оператор, 1 клиент
isInternalbool?true маркира вътрешна бележка, която не е доставена на клиента
replyToMessageIdint?ID на съобщението, на което се отговаря
appGuiduuid?GUID за препоръка
mediaMediaDTO?{ name, format, dataBase64, thumbnail, duration, type }

200 OK → { "id": 9930, "messageStatus": 0 }

GUID за препращане може също да бъде предаден в пътя: POST /api/chat/{chatId}/{referralGuid}/message (също …/message/v1, …/message/v2).

4.4 Изпращане на файл или видео (multipart, v2)

POST https://chatapi.smsbat.com/api/chat/1867/message/v2
Authorization: Bearer <token>
Content-Type: multipart/form-data

Имената на полетата на формуляра са PascalCase с нотация с точка

textMessage и media.file се игнорират тихо. Използвайте точните имена по-долу.

Поле на формулярТипОписание
TextMessagestringТекст на съобщението
Authorint0 оператор, 1 клиент
IsInternalboolВътрешна бележка
ReplyToMessageIdintСъобщение, на което се отговаря
AppGuiduuidGUID за препоръка
Media.FilebinaryСамият файл
Media.NamestringИме на файла
Media.FormatstringMIME тип (video/mp4, image/png, application/pdf)
Media.TypeMediaTypeВижте §8.5
Media.DataBase64stringАлтернатива на Media.File
Media.ThumbnailstringРамка за преглед на видео Base64
Media.DurationdoubleПродължителност на видеото в секунди
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 Промяна на състоянието на чата

PUT https://chatapi.smsbat.com/api/chat/status
Authorization: Bearer <token>
Content-Type: application/json

{ "id": 1867, "status": 4 }

200 OK отразява актуализирания обект.

4.6 Актуализиране на статусите на съобщенията

PUT https://chatapi.smsbat.com/api/chat/messages/status
Authorization: Bearer <token>
Content-Type: application/json

{ "status": 3, "messageIds": [9928, 9929] }

4.7 Изтриване на чат

DELETE https://chatapi.smsbat.com/api/chat/chats/1867
Authorization: Bearer <token>

5. Публикации, ролки и истории

Основен път: https://chatapi.smsbat.com/api/meta Автор: X-Authorization-Key: <organization token>

5.1 Списък с публикации, ролки и истории

GET https://chatapi.smsbat.com/api/meta/posts?platform=instagram&mediaType=story&page=1&perPage=20
X-Authorization-Key: <token>
ПараметърТипЗадължителноОписание
pageintнеСтраница, по подразбиране 1
perPageintнеЕлементи на страница, по подразбиране 20
idintнеФилтриране по ID на вътрешен пост
platformstringнеinstagram или facebook
mediaTypestringнеpost, reel или story. Всички типове, когато са пропуснати
# 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"
      }
    }
  ]
}

Несъответствие — име на полето на брояча

Схемата Swagger MetaCommentPostListItemDtoPaginationDTO дефинира total. The вътрешни спецификационни документи totalCount. Swagger се генерира от кода, така че total е по-вероятната истина. Анализирайте total ?? totalCount, докато това бъде уредено.

ПолеОписание
idID на вътрешен пост
metaIdВъншна публикация / барабан / ИД на история в мета
textНадпис на публикация
imageUrlURL адрес на прокси медия, въведен от непоследователния MetaPost.Guid или null
platformfacebook или instagram
mediaTypepost, reel или story
createdAtДата на създаване (датата на платформата или датата на базата данни)
storyПредлага се само за mediaType: "story"
story.idID на вътрешната история; равно на post.id
story.metaIdВъншен идентификатор на история в мета
story.urlСтабилен прокси URL на съхранената Story медия; null ако медията не може да бъде запазена

Пощенските медии се обслужват по два маршрута: GET /api/meta/post/media/{id:int} за обратно съвместимост и GET /api/meta/post/media/{guid:guid}. Нови отговори и обратни извиквания на API винаги генерирайте формуляра GUID.

5.2 Списък с коментари

GET https://chatapi.smsbat.com/api/meta/comments?platform=instagram&postId=42&page=1&perPage=20
X-Authorization-Key: <token>
ПараметърТипЗадължителноОписание
pageintнеСтраница, по подразбиране 1
perPageintнеЕлементи на страница, по подразбиране 20
postIdintнеФилтриране по ID на публикация
parentCommentIdintнеДетски коментари (отговори) на даден коментар
platformstringнеfacebook или 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..."
      }
    }
  ]
}
ПолеОписание
idID на вътрешен коментар
metaIdВъншен идентификатор в мета. null за чакащ отговор от нас до изпращането му
textТекст на коментар
createdAtДата на създаване
platformfacebook или instagram
replyStatusnull за входящ потребителски коментар; "pending" / "sent" / "failure" за нашия отговор
author.type"meta_user" външен потребител, "owner" собственик на страница
author.nameИме на автора
author.metaUserIdИдентификатор на потребител с обхват в мета; null за "owner"
postПубликацията, барабанът или историята, към които принадлежи коментарът
post.mediaTypepost, reel или story
post.storyСправка към историята { id, metaId, url }, само истории
mediaUrlМедия, прикачена към коментара, или null
replyToКоментар на родител { id, metaId, text }; null на най-високо ниво

Несъответствие — тип `author.type`

Вътрешната спецификация документира низовете "meta_user" / "owner". Наперени типове MetaCommentAuthorType като цяло число с enum [0, 1]. A JsonStringEnumConverter би обяснило празнината, но това не е потвърдено срещу реален отговор. Напишете a анализатор, който приема и двете.

5.3 Отговорете на коментар

Поставете отговор на опашка за доставка.

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"

Тяло на заявката: { "text": "Reply text" }

202 Accepted връща обекта за коментар — същата форма като GET /api/meta/comments — с replyStatus: "pending" и metaId: null. Резултатът от доставката пристига по-късно като a source: 13 обратно извикване (§6.4).

Несъответствие — код на отговор

Суагър обявява 200 без тяло; вътрешната спецификация декларира 202 Accepted с коментар като тяло. На контролера най-вероятно липсва ProducesResponseType атрибут, оставяйки Swagger по подразбиране. Приемете всякакви 2xx и не зависете от тяло.


6. Уеб кукички

SMSBAT изпраща POST заявки с application/json към вашия URL адрес и очаква HTTP 200 обратно.

Нулевите полета са напълно пропуснати

Поле, чиято стойност е null, изобщо не се сериализира в тялото на обратното извикване. За а съобщение, което не идва от Facebook или Instagram, просто няма ключ MetaUserId. Третирайте „отсъстващ“ и null като едно и също нещо.

6.1 Регистрирайте URL за обратно извикване

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
  }'
ПолеТипОписание
urlstringВашата крайна точка
sourceSendingSourceCallbackТип събитие, вижте §8.2
headerName / headerValuestringПроизволна заглавка за удостоверяване, която прикачваме към заявката (по избор)
channelTypeChatSourceКанал. 7 за Instagram. По избор
channelEntityIdintКонкретен бизнес акаунт. Изисква channelType

Без channelType URL получава събития от всеки канал.

Tip

Пълното покритие на коментарите изисква две регистрации: source: 12 за нови коментари и source: 13 за статуси на отговор. За директни и исторически отговори добавете source: 3 (и 11, ако искате всяко съобщение в чата).

Оставащи операции:

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 връща:

[
  {
    "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 Ново съобщение и отговор на Instagram Story (source: 3, 11)

Отговорът на потребител на Instagram Story пристига като обикновено съобщение в тези обратни повиквания, с допълнителен блок Story от най-високо ниво:

{
  "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"
  }
}
ПолеОписание
ChatId / MessageIdИдентификатори за чат и съобщения
Author0 потребител, 1 оператор
UsernameИме или манипулатор на Instagram/Facebook
UserIdВътрешен цифров потребителски идентификатор в SMSBAT
MetaUserIdID с обхват на партньора за разговор в Meta. При изходящо операторско съобщение това все още идентифицира мета потребителя на чата, а не оператора
ShopIdВътрешен идентификатор на бизнес акаунта в Instagram / Facebook
ShopNameИме на бизнес акаунт, както е получено от Meta по време на свързване
MessageTextТекст на съобщението
MessageMediaURL адрес на медия, когато съобщението е медия
type_messengerИзточник, 7 за Instagram
operator_nameИме на оператора, когато Author = 1
StoryПредставяне само при входящ отговор на история
Story.IdID на вътрешната история (MetaPost) — използва се директно като id / postId в Meta API
Story.MetaIdВъншен идентификатор на история в мета
Story.UrlСтабилен прокси URL адрес на съхранената медия Story. Отсъства, когато медията не може да бъде запазена — блокът Story и съобщението все още се доставят

`Author` е обърнат спрямо API за чат

В ChatMessageDTO.author, 0 означава оператор, а 1 означава клиент. В това обратно извикване е така обратното: 0 е потребителят, 1 е операторът. Не споделяйте картографирането.

6.3 Нов коментар (source: 12)

Задейства се, когато Meta потребител коментира публикация във Facebook или публикация в Instagram / Reel.

Note

Instagram Отговорите на Story не се доставят чрез source: 12. Те пристигат като обикновени входящи съобщения на source: 3 и/или 11 с блок Story — вижте §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 Статус на отговор на коментар (source: 13)

Задейства се, след като се опитаме да доставим отговор, независимо дали е успешен или неуспешен.

{
  "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 Полета за обратно извикване на споделени коментари

И двете обратни извиквания на коментари споделят една форма на тялото и се различават само с type.

ПолеОписание
type"new_comment" или "comment_status"
platform"facebook" или "instagram"
comment.idID на вътрешен коментар
comment.metaIdВъншен идентификатор в мета; null за чакащ отговор, преди да бъде изпратен
comment.parentCommentIdID на родителския коментар. Отсъства за коментар от най-високо ниво
comment.parentMetaIdID на външен родителски коментар. Отсъства на най-високо ниво
comment.parentCommentTextТекст на родителския коментар. Отсъства на най-високо ниво
comment.textТекст на коментар
comment.createdAtДата на създаване
comment.updatedAtПоследна актуализация. Отсъства, ако коментарът никога не е бил редактиран
comment.replyStatus"pending" / "sent" / "failure". Отсъства за входящ потребителски коментар
comment.author.type"meta_user" или "owner"
comment.author.nameИме на автора
comment.author.metaUserIdID на автора с обхват в мета. Отсъства за "owner"
comment.mediaUrlКоментирайте медиите. Отсъства, когато няма
post.idID на вътрешен пост
post.metaIdВъншна публикация / барабан / ИД на история в мета
post.textПубликувай текст
post.imageUrlПубликувайте URL адрес на изображение или null
post.createdAtДата на създаване на публикацията
post.mediaTypeПри обратни повиквания за коментари само post или reel

6.6 Нов чат (source: 7)

{ "ChatId": 12345, "Phone": "+380501234567", "chat.Source": 7 }

6.7 Промени в състоянието на съобщения и чат (source: 6 / 5)

{ "name": "changed_message_status", "id": 9928, "status": 6 }
{ "name": "changed_chat_status",    "id": 1867, "status": 4 }

6.8 Съобщението е редактирано или изтрито (source: 9)

{ "messageId": 9930, "text": "Updated message text" }
{ "messageId": 9931, "delete": true }

6.9 Индикатор за въвеждане (source: 8)

{ "chat_id": 1867, "event": "start_typing", "operator_name": "Iryna" }
{ "chat_id": 1867, "event": "end_typing" }

7. Проучване на събития

За среди, които не могат да приемат входящ HTTP.

7.1 Извличане на събития

GET https://chatapi.smsbat.com/api/chat/callback-events?page=1&perPage=20
Authorization: Bearer <token>
ПараметърОписание
organizationIdНе е задължително. Взет от токена, когато е пропуснат
page / perPageСтраниране, по подразбиране 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"
    }
  ]
}

Всяко събитие носи event_guid, timestamp, organization_id и callback_type — a низ, съответстващ на стойностите source в §8.2. Останалите полета съвпадат със съответните webhook в §6.

7.2 Потвърждаване на обработените събития

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 }

Вече премахнатите събития просто не се броят към deleted. Поръчването и повторните опити са ваши отговорност на страната.

7.3 Препоръчителен цикъл

  1. Анкета GET /api/chat/callback-events по график.
  2. Обработвайте събитията във вашата услуга.
  3. Изпратете обработения списък event_guid на /callback-events/processed.
  4. Повторете.

8. Препратка към списък

8.1 ChatSource — канал (0–9)

КодКанал
0Viber
1ViberBot
2TelegramBot
3Whatsapp
4Джаджа
5Розетка
6Facebook
7Instagram
8Абитуриентски бал
9Olx

8.2 SendingSourceCallback — тип събитие за обратно извикване (0–13)

КодСъбитие
3Chat — ново съобщение в чата, включително отговори на историята
5Състоянието на чата е променено
6Състоянието на съобщението е променено
7Създаден е нов чат
8Индикатор за въвеждане
9Съобщението е актуализирано или изтрито
11AnyChatMessage — всяко съобщение в чата
12MetaNewComment — нов коментар в Instagram / Facebook
13MetaCommentStatus — състояние на доставка на нашия отговор на коментар

Изброяването обхваща 0–13; останалите стойности не са необходими за интеграции в Instagram.

8,3 ChatStatus (0–4)

0 Ново, 1 Отворено, 2 Изчакване, 3 На пауза, 4 Затворено

8,4 MessageStatus (0–11)

КодИме
0НОВО
1УСПЕХ
2ОТХВЪРЛЕНО
3ПРОЧЕТЕТЕ
4НЕИЗВЕСТНО
5ОБРАБОТКА
6ДОСТАВЕН
7BLOCKED_BY_USER
8USER_NOT_FOUND

Преброяването обхваща 0–11. Стойностите 9, 10 и 11 съществуват в API, но все още не са документирани — третирайте ги като UNKNOWN.

8,5 MediaType (1–10)

1 Снимка, 2 Файл, 3 Аудио, 4 Видео, 5 Стикер, 6 Анимиран стикер, 7 StickerVideo, 8 Анимация, 9 Глас, 10 VideoNote

8.6 AuthorMessage — автор в API за чат (0–4)

0 Оператор, 1 Клиент, 2 Бот, 3 Viber акаунт

Енумът обхваща 0–4; стойността 4 е недокументирана. Обратните извиквания „ново съобщение“ използват противоположно картографиране — виж §6.2.

8,7 ChatMessageType (0–2)

0 Текст, 1 Снимка, 2 Файл

8.8 Коментар replyStatus

null входящ потребителски коментар, "pending" нашият отговор е на опашка, "sent" доставен, "failure" доставката е неуспешна.


Отворени въпроси

Три точки, в които вътрешната спецификация и генерираният от код Swagger не са съгласни. един заявка с реален токен урежда всички тях; дотогава пишете на клиента отбранително.

#ВъпросСпецификацияСуагърКак да проверите
1Заглавка за удостоверяване за /api/meta/*X-Authorization-Keyсамо Bearer декларираниcurl -i -H "X-Authorization-Key: <token>" ".../api/meta/posts?perPage=1" — очаквайте 200, а не 401
2Поле за брояч в Мета отговориtotalCounttotalСъщата заявка — четене на основния JSON ключ
3author.type тип и reply код на състоянието"meta_user" / "owner", 202 с тялоint [0,1], 200 без тялоcurl -i .../api/meta/comments?perPage=1 плюс тестов отговор

Временно ръководство:

  • брояч — четене total ?? totalCount;
  • author.type — приема както низ, така и цяло число (0 ↔ meta_user, 1 ↔ owner, картографирането трябва да бъде потвърдено);
  • reply — третира всеки 2xx като успех, не изисква тяло, взема крайния статус от обратното извикване source: 13.

Бележки за изпълнение

  • Удостоверяването се различава за група крайни точки — /api/meta/* използва X-Authorization-Key, чатове и операторите използват Bearer, restapi приема и двете.
  • Пагинацията се изписва по два начина — per_page на /api/chat/chats, perPage на /api/meta/* и /api/chat/callback-events.
  • Полетата multipart/form-data са PascalCase с нотация с точка (Media.File, Media.Type).
  • Нулевите полета са пропуснати от обратните извиквания — липсващ ключ означава null.
  • phone обикновено е null в Instagram. Идентифицирайте клиента чрез instagramUser.id / metaUserId и магазина от instaAccount.id (стойността на филтъра entityId).
  • Story.Id от обратно извикване може да се предаде направо обратно като id / postId към Meta API.
  • Проверете expiresAt на оператора JWT, преди да го използвате в дълбока връзка или джаджа.