Help Center Integracja API Meta i Instagrama

Integracja API Meta i Instagrama

Dokumentacja dotycząca tworzenia aplikacji Instagram na platformie SMSBAT ChatHub: uwierzytelnianie, Bezpośrednie rozmowy na Instagramie, komentarze do postów i rolek, odpowiedzi na historie, webhooki i ankiety.

Źródła

Ta strona łączy wewnętrzną specyfikację API Meta Comments z aktywnym OpenAPI definicje pod adresem https://chatapi.smsbat.com/swagger/v1/swagger.json i https://restapi.smsbat.com/swagger/v1/swagger.json. Tam, gdzie obaj się nie zgadzają, różnica jest wywoływana w tekście i wymieniona w sekcji Pytania otwarte.


1. Bazowe adresy URL

CelAdres URL
Czat API + Meta APIhttps://chatapi.smsbat.com
Swagger UI / OpenAPIhttps://chatapi.smsbat.com/index.html · …/swagger/v1/swagger.json
REST API (organizacje, adresy URL wywołań zwrotnych)https://restapi.smsbat.com
REST API Swaggerhttps://restapi.smsbat.com/swagger/v1/swagger.json
Panel WWW operatorahttps://chat.smsbat.com

2. Uwierzytelnianie

Schemat uwierzytelniania zależy od grupy punktów końcowych. Pomieszanie ich jest najczęstszą przyczyną 401.

GrupaNagłówek
chatapi.smsbat.com/api/meta/* (posty, komentarze)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 · Podstawowa autoryzacja

Token organizacji dla X-Authorization-Key wydawany jest w panelu w zakładce Profil. JWT firmy i operatora pochodzą z /api/company/get-token i /api/operator/get-token.

Rozbieżność

Dokument chatapi OpenAPI deklaruje pojedynczy schemat bezpieczeństwa — Bearer — i stosuje go globalnie. X-Authorization-Key w ogóle nie jest tam zadeklarowane, chociaż wewnętrzna Meta Specyfikacja API komentarzy nazywa to /api/meta/*. Najprawdopodobniej jest to obsługiwane przez oprogramowanie pośredniczące, które nie jest odzwierciedlone w formacie Swagger. Potwierdź empirycznie przed wysyłką.

2.1 Token firmy

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

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

200 OK zwraca pusty ciąg tokenów.

2.2 Organizacje

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

2.3 Operatorzy w organizacji

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

Statusy operatora: 0 Aktywny, 1 Nieaktywny, 2 Usunięty.

2.4 Dodawanie/synchronizacja operatorów

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 Operator 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 zwraca JWT jako ciąg znaków.

2.6 Zweryfikuj token operatora

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
}

Gdy nieważne: { "isValid": false, "error": "Invalid token" }.

2.7 Osadź panel czatu operatora

<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. Głębokie linki do panelu czatu

W zewnętrznym systemie (CRM, ERP, stronie internetowej) można otworzyć konkretną rozmowę https://chat.smsbat.com/. Operator jest autoryzowany przez token JWT przekazywany jako parametr zapytania.

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>
ParametrOpis
chat_raw_idIdentyfikator czatu
phoneNumer telefonu w formacie międzynarodowym
fromIdentyfikator konta marki/firmy (bm_id)
sourceŹródło czatu — 7 dla Instagrama, patrz §8.1
tokenObowiązujący, nieważny operator JWT z dostępem do czatów

Nieprawidłowy JWT powoduje wylądowanie gościa na ekranie logowania panelu operatora.


4. Bezpośrednie rozmowy na Instagramie

4.1 Wyświetl listę czatów

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

Note

Paginacja tutaj to per_page (snake_case). Poniżej /api/meta/* i sondaże punkt końcowy to perPage (camelCase). To nie jest literówka — interfejs API używa obu.

Parametry zapytania, wszystkie opcjonalne:

ParametrWpiszOpis
sourceChatSource7 ogranicza wyniki do Instagrama
entityIdintIdentyfikator konta firmowego. Stosowane tylko razem z source
instagram_user_idintIdentyfikator użytkownika Instagrama w ChatHub
facebook_user_idintIdentyfikator użytkownika Facebooka w ChatHub
page / per_pageintPaginacja, domyślnie 1 / 20
statusChatStatus[]Stan czatu, powtarzalny
searchstringWyszukiwanie dowolnego tekstu (imię i nazwisko, telefon, …)
organizationIdintIdentyfikator organizacji
operatorIdint[]Filtruj według przypisanych operatorów
datestring[]Dwie granice: ?date=…&date=…
isChainboolZwróć czaty jako łańcuchy, przenosząc wiadomości z poprzednich czatów
isUnread, starMark, isOperator, isAIAgentboolDodatkowe filtry
phone, email, contactId, clientId, tagIds, rate, sortedBy—Inne filtry

200 OK zwraca 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": []
    }
  ]
}

Pola istotne dla aplikacji na Instagramie:

PoleZnaczenie
instaAccountKonto firmowe na Instagramie (sklep). id to wartość filtra entityId; name to nazwa konta w Meta
instagramUserKlient. name to uchwyt na Instagramie, id to wartość filtra instagram_user_id
metaUserIdIdentyfikator zakresu klienta po stronie Meta (string)
messSource7 na Instagramie
phoneZwykle null dla Instagrama — nie używaj go jako klucza

ChatDTO przenosi również 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 i taggedMessages.

4.2 Wiadomości na czacie

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

200 OK zwraca tablicę 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 jest wypełniane, gdy wiadomość dotyczy postu lub historii na Instagramie — przekaż ją prosto z powrotem jako id / postId do Meta API. media to ChatMediaDTO: { name, format, type, uri, raw, length, isUploaded }.

4.3 Wyślij wiadomość (JSON)

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

Ciało — 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
  }
}
PoleWpiszOpis
textMessagestring?Tekst wiadomości. Może być pusty, gdy obecne jest media
authorAuthorMessage?0 operator, 1 klient
isInternalbool?true oznacza notatkę wewnętrzną, która nie jest dostarczana do klienta
replyToMessageIdint?Identyfikator wiadomości, na którą odpowiadasz
appGuiduuid?Identyfikator GUID skierowania
mediaMediaDTO?{ name, format, dataBase64, thumbnail, duration, type }

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

W ścieżce można także przekazać identyfikator GUID polecenia: POST /api/chat/{chatId}/{referralGuid}/message (podobnie …/message/v1, …/message/v2).

4.4 Wyślij plik lub wideo (wieloczęściowy, v2)

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

Nazwy pól formularza to PascalCase z notacją kropkową

textMessage i media.file są po cichu ignorowane. Użyj dokładnych nazw poniżej.

Pole formularzaWpiszOpis
TextMessagestringTekst wiadomości
Authorint0 operator, 1 klient
IsInternalboolNotatka wewnętrzna
ReplyToMessageIdintWiadomość, na którą odpowiadasz
AppGuiduuidIdentyfikator GUID skierowania
Media.FilebinarySam plik
Media.NamestringNazwa pliku
Media.FormatstringTyp MIME (video/mp4, image/png, application/pdf)
Media.TypeMediaTypeZobacz §8.5
Media.DataBase64stringAlternatywa dla Media.File
Media.ThumbnailstringRamka podglądu wideo Base64
Media.DurationdoubleCzas trwania filmu w sekundach
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 Zmień status czatu

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

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

200 OK powtarza zaktualizowany obiekt.

4.6 Aktualizuj statusy wiadomości

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

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

4.7 Usuń czat

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

5. Posty, krążki i historie

Ścieżka podstawowa: https://chatapi.smsbat.com/api/meta Autoryzacja: X-Authorization-Key: <organization token>

5.1 Listy postów, krążki i historie

GET https://chatapi.smsbat.com/api/meta/posts?platform=instagram&mediaType=story&page=1&perPage=20
X-Authorization-Key: <token>
ParametrWpiszWymaganeOpis
pageintnieStrona, domyślnie 1
perPageintnieElementy na stronę, domyślnie 20
idintnieFiltruj według wewnętrznego identyfikatora postu
platformstringnieinstagram lub facebook
mediaTypestringniepost, reel lub story. Wszystkie typy, jeśli pominięto
# 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"
      }
    }
  ]
}

Rozbieżność — nazwa pola licznika

Schemat Swaggera MetaCommentPostListItemDtoPaginationDTO definiuje total. The dokumenty specyfikacji wewnętrznej totalCount. Swagger jest generowany z kodu, tzw total jest bardziej prawdopodobną prawdą. Analizuj total ?? totalCount, aż sprawa zostanie rozstrzygnięta.

PoleOpis
idWewnętrzny identyfikator postu
metaIdPost zewnętrzny / Reel / Identyfikator historii w Meta
textTytuł wpisu
imageUrlAdres URL nośnika proxy z kluczem niesekwencyjnym MetaPost.Guid lub null
platformfacebook lub instagram
mediaTypepost, reel lub story
createdAtData utworzenia (data platformy lub data bazy danych)
storyObecne tylko dla mediaType: "story"
story.idWewnętrzny identyfikator historii; równe post.id
story.metaIdZewnętrzny identyfikator historii w Meta
story.urlStabilny adres URL proxy przechowywanych multimediów Story; null jeśli nie udało się zapisać multimediów

Media pocztowe są obsługiwane dwiema drogami: GET /api/meta/post/media/{id:int} dla wstecz kompatybilność i GET /api/meta/post/media/{guid:guid}. Nowe odpowiedzi API i wywołania zwrotne zawsze generuj formularz GUID.

5.2 Lista komentarzy

GET https://chatapi.smsbat.com/api/meta/comments?platform=instagram&postId=42&page=1&perPage=20
X-Authorization-Key: <token>
ParametrWpiszWymaganeOpis
pageintnieStrona, domyślnie 1
perPageintnieElementy na stronę, domyślnie 20
postIdintnieFiltruj według identyfikatora postu
parentCommentIdintnieKomentarze podrzędne (odpowiedzi) danego komentarza
platformstringniefacebook lub 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..."
      }
    }
  ]
}
PoleOpis
idWewnętrzny identyfikator komentarza
metaIdZewnętrzny identyfikator w Meta. null za naszą oczekującą odpowiedź do czasu jej wysłania
textTekst komentarza
createdAtData utworzenia
platformfacebook lub instagram
replyStatusnull dla przychodzącego komentarza użytkownika; "pending" / "sent" / "failure" za naszą odpowiedź
author.type"meta_user" użytkownik zewnętrzny, "owner" właściciel strony
author.nameNazwisko autora
author.metaUserIdIdentyfikator użytkownika o określonym zakresie w Meta; null dla "owner"
postPost, Reel lub Story, do którego należy komentarz
post.mediaTypepost, reel lub story
post.storyOdniesienie do historii { id, metaId, url }, Tylko historie
mediaUrlMultimedia dołączone do komentarza, lub null
replyToKomentarz rodzica { id, metaId, text }; null na najwyższym poziomie

Rozbieżność — typ `author.type`

Wewnętrzna specyfikacja dokumentuje ciągi "meta_user" / "owner". Typy swaggerów MetaCommentAuthorType jako liczba całkowita z wyliczeniem [0, 1]. JsonStringEnumConverter wyjaśniałoby tę lukę, ale nie zostało to potwierdzone w rzeczywistej reakcji. Napisz A parser, który akceptuje oba.

5.3 Odpowiedz na komentarz

Kolejkuje odpowiedź do dostarczenia.

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"

Treść żądania: { "text": "Reply text" }

202 Accepted zwraca obiekt komentarza — taki sam kształt jak GET /api/meta/comments — z replyStatus: "pending" i metaId: null. Wynik dostawy pojawia się później jako a source: 13 oddzwonienie (§6.4).

Rozbieżność — kod odpowiedzi

Swagger deklaruje 200 bez ciała; wewnętrzna specyfikacja deklaruje 202 Accepted z komentarzem jako treścią. W kontrolerze najprawdopodobniej brakuje ProducesResponseType atrybut, pozostawiając Swagger na wartości domyślnej. Zaakceptuj dowolne 2xx i nie polegaj na ciele.


6. Webhooki

SMSBAT wysyła POST żądań z application/json na Twój adres URL i oczekuje HTTP 200 odpowiedzi.

Pola zerowe są całkowicie pomijane

Pole, którego wartość wynosi null, w ogóle nie jest serializowane w treści wywołania zwrotnego. Dla wiadomość, która nie pochodzi z Facebooka czy Instagrama, po prostu nie ma klawisza MetaUserId. Traktuj „nieobecny” i null jako to samo.

6.1 Zarejestruj adres URL wywołania zwrotnego

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
  }'
PoleWpiszOpis
urlstringTwój punkt końcowy
sourceSendingSourceCallbackTyp zdarzenia, patrz §8.2
headerName / headerValuestringDowolny nagłówek autoryzacji, który dołączamy do żądania (opcjonalnie)
channelTypeChatSourceKanał. 7 na Instagramie. Opcjonalne
channelEntityIdintKonkretne konto firmowe. Wymaga channelType

Bez channelType adres URL odbiera zdarzenia z każdego kanału.

Tip

Pełne pokrycie komentarzy wymaga dwóch rejestracji: source: 12 dla nowych komentarzy i source: 13 dla statusów odpowiedzi. W przypadku odpowiedzi bezpośrednich i fabularnych dodaj source: 3 (i 11, jeśli chcesz otrzymać każdą wiadomość na czacie).

Pozostałe operacje:

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 zwraca:

[
  {
    "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 Nowa wiadomość i odpowiedź na historię na Instagramie (source: 3, 11)

Odpowiedź użytkownika na Historię na Instagramie pojawia się jako zwykła wiadomość w ramach tych wywołań zwrotnych, z dodatkowym blokiem najwyższego poziomu 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"
  }
}
PoleOpis
ChatId / MessageIdIdentyfikatory czatów i wiadomości
Author0 użytkownik, 1 operator
UsernameNazwa wyświetlana lub uchwyt na Instagramie / Facebooku
UserIdWewnętrzny numeryczny identyfikator użytkownika w SMSBAT
MetaUserIdIdentyfikator zakresu rozmówcy w Meta. W wychodzącej wiadomości operatora nadal identyfikuje to użytkownika Meta czatu, a nie operatora
ShopIdWewnętrzny identyfikator konta firmowego na Instagramie / Facebooku
ShopNameNazwa konta firmowego otrzymana od Meta w momencie połączenia
MessageTextTekst wiadomości
MessageMediaAdres URL multimediów, gdy wiadomość jest multimedialna
type_messengerŹródło, 7 dla Instagrama
operator_nameNazwa operatora, gdy Author = 1
StoryPrezentuj tylko w przychodzącej odpowiedzi na historię
Story.IdIdentyfikator historii wewnętrznej (MetaPost) — można go używać bezpośrednio jako id / postId w Meta API
Story.MetaIdZewnętrzny identyfikator historii w Meta
Story.UrlStabilny adres URL proxy przechowywanych multimediów Story. Nieobecny, gdy nie można było zapisać multimediów — blok Story i wiadomość są nadal dostarczane

`Author` jest odwrócone w stosunku do interfejsu Chat API

W ChatMessageDTO.author, 0 oznacza operatora, a 1 oznacza klienta. W tym wywołaniu zwrotnym tak jest odwrotnie: 0 to użytkownik, 1 to operator. Nie udostępniaj mapowania.

6.3 Nowy komentarz (source: 12)

Uruchamia się, gdy użytkownik Meta komentuje post na Facebooku lub post na Instagramie/Reel.

Note

Instagram Odpowiedzi na historie nie są dostarczane przez source: 12. Przychodzą normalnie wiadomości przychodzące na source: 3 i/lub 11 z blokiem Story — patrz §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 Stan odpowiedzi na komentarz (source: 13)

Uruchamia się po próbie dostarczenia odpowiedzi, niezależnie od tego, czy się powiedzie, czy nie.

{
  "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 Pola wywołania zwrotnego komentarzy współdzielonych

Obydwa wywołania zwrotne komentarzy mają jeden kształt i różnią się jedynie type.

PoleOpis
type"new_comment" lub "comment_status"
platform"facebook" lub "instagram"
comment.idWewnętrzny identyfikator komentarza
comment.metaIdZewnętrzny identyfikator w Meta; null dla oczekującej odpowiedzi przed jej wysłaniem
comment.parentCommentIdIdentyfikator komentarza nadrzędnego. Nieobecny w związku z komentarzem na najwyższym poziomie
comment.parentMetaIdZewnętrzny identyfikator komentarza nadrzędnego. Nieobecny na najwyższym szczeblu
comment.parentCommentTextTekst komentarza rodzica. Nieobecny na najwyższym szczeblu
comment.textTekst komentarza
comment.createdAtData utworzenia
comment.updatedAtOstatnia aktualizacja. Nieobecne, jeśli komentarz nie był nigdy edytowany
comment.replyStatus"pending" / "sent" / "failure". Nieobecny w związku z przychodzącym komentarzem użytkownika
comment.author.type"meta_user" lub "owner"
comment.author.nameNazwisko autora
comment.author.metaUserIdIdentyfikator autora o określonym zakresie w Meta. Nieobecny przez "owner"
comment.mediaUrlKomentuj media. Nieobecny, gdy go nie ma
post.idWewnętrzny identyfikator postu
post.metaIdPost zewnętrzny / Reel / Identyfikator historii w Meta
post.textTekst wpisu
post.imageUrlOpublikuj adres URL obrazu lub null
post.createdAtData utworzenia wpisu
post.mediaTypeW wywołaniach zwrotnych komentarzy tylko post lub reel

6.6 Nowy czat (source: 7)

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

6.7 Zmiany statusu wiadomości i czatu (source: 6 / 5)

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

6.8 Wiadomość edytowana lub usunięta (source: 9)

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

6.9 Wskaźnik pisania (source: 8)

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

7. Odpytywanie zdarzeń

Dla środowisk, które nie mogą akceptować przychodzącego protokołu HTTP.

7.1 Pobieranie zdarzeń

GET https://chatapi.smsbat.com/api/chat/callback-events?page=1&perPage=20
Authorization: Bearer <token>
ParametrOpis
organizationIdFakultatywny. Pobrane z tokena w przypadku pominięcia
page / perPagePaginacja, wartości domyślne 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"
    }
  ]
}

Każde wydarzenie niesie ze sobą event_guid, timestamp, organization_id i callback_type — ciąg pasujący do wartości source w §8.2. Pozostałe pola pasują do odpowiednich webhook w §6.

7.2 Zatwierdź przetworzone zdarzenia

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 }

Wydarzenia już usunięte po prostu nie wliczają się do deleted. Zamawianie i ponowne próby należą do Ciebie odpowiedzialność strony.

7.3 Zalecana pętla

  1. Sonda GET /api/chat/callback-events zgodnie z harmonogramem.
  2. Przetwórz zdarzenia w swojej usłudze.
  3. Wyślij przetworzoną listę event_guid na numer /callback-events/processed.
  4. Powtórz.

8. Odniesienie do wyliczenia

8.1 ChatSource — kanał (0–9)

KodKanał
0Vibera
1ViberBota
2TelegramBot
3Whatsapp
4Widżet
5Rozetka
6Facebooka
7Instagram
8Studniówka
9Olx

8.2 SendingSourceCallback — typ zdarzenia wywołania zwrotnego (0–13)

KodWydarzenie
3Chat — nowa wiadomość na czacie, zawierająca odpowiedzi na historie
5Status czatu zmieniony
6Status wiadomości zmieniony
7Utworzono nowy czat
8Wskaźnik pisania
9Wiadomość zaktualizowana lub usunięta
11AnyChatMessage — dowolna wiadomość na czacie
12MetaNewComment — nowy komentarz na Instagramie/Facebooku
13MetaCommentStatus — status dostarczenia odpowiedzi na nasz komentarz

Wyliczenie obejmuje 0–13; pozostałe wartości nie są potrzebne do integracji z Instagramem.

8,3 ChatStatus (0–4)

0 Nowy, 1 Otwarty, 2 Oczekiwanie, 3 Pauza, 4 Zamknięty

8,4 MessageStatus (0–11)

KodImię
0NOWOŚĆ
1SUKCES
2ODRZUCONE
3CZYTAJ
4NIEZNANE
5PRZETWARZANIE
6DOSTARCZONE
7BLOCKED_BY_USER
8USER_NOT_FOUND

Wyliczenie obejmuje 0–11. Wartości 9, 10 i 11 istnieją w API, ale nie zostały jeszcze udokumentowane — traktuj je jako UNKNOWN.

8,5 MediaType (1–10)

1 Zdjęcie, 2 Plik, 3 Audio, 4 Wideo, 5 Naklejka, 6 NaklejkaAnimowana, 7 NaklejkaWideo, 8 Animacja, 9 Głos, 10 WideoNotatka

8.6 AuthorMessage — autor w Chat API (0–4)

0 Operator, 1 Klient, 2 Bot, 3 ViberAccount

Wyliczenie obejmuje 0–4; wartość 4 jest nieudokumentowana. ** Wywołania zwrotne „nowa wiadomość” korzystają z metody mapowanie przeciwne** — patrz §6.2.

8,7 ChatMessageType (0–2)

0 Tekst, 1 Zdjęcie, 2 Plik

8.8 Komentarz replyStatus

null przychodzący komentarz użytkownika, "pending" nasza odpowiedź jest oczekujona w kolejce, "sent" dostarczona, "failure" dostawa nie powiodła się.


Pytania otwarte

Trzy punkty, w których wewnętrzna specyfikacja i wygenerowany kod Swagger nie zgadzają się. Jeden żądanie z prawdziwym tokenem rozlicza je wszystkie; do tego czasu pisz do klienta defensywnie.

#PytanieSpecyfikacjaPrzechwałkaJak sprawdzić
1Nagłówek uwierzytelniania dla /api/meta/*X-Authorization-Keytylko Bearer zadeklarowanocurl -i -H "X-Authorization-Key: <token>" ".../api/meta/posts?perPage=1" — spodziewaj się 200, a nie 401
2Pole licznika w metaodpowiedziachtotalCounttotalTo samo żądanie — przeczytaj główny klucz JSON
3author.type typ i reply kod statusu"meta_user" / "owner", 202 z korpusemint [0,1], 200 bez korpusucurl -i .../api/meta/comments?perPage=1 plus odpowiedź testowa

Wytyczne tymczasowe:

  • licznik — czytaj total ?? totalCount;
  • author.type — akceptuje zarówno ciąg znaków, jak i liczbę całkowitą (0 ↔ meta_user, 1 ↔ owner, mapowanie do potwierdzenia);
  • reply — traktuj dowolne 2xx jako sukces, nie wymagaj treści, przyjmij ostateczny status z wywołania zwrotnego source: 13.

Uwagi dotyczące wdrożenia

  • Uwierzytelnianie różni się w zależności od grupy punktów końcowych — /api/meta/* używa X-Authorization-Key, czatów i operatorzy używają Bearer, restapi akceptuje oba.
  • Paginacja jest zapisywana na dwa sposoby — per_page na /api/chat/chats, perPage na /api/meta/* i /api/chat/callback-events.
  • Pola multipart/form-data to PascalCase z oznaczeniem kropkowym (Media.File, Media.Type).
  • Pola zerowe są pomijane w wywołaniach zwrotnych — brak klucza oznacza null.
  • phone to zazwyczaj null na Instagramie. Zidentyfikuj klienta poprzez instagramUser.id / metaUserId i sklep po instaAccount.id (wartość filtra entityId).
  • Story.Id z wywołania zwrotnego można bezpośrednio przekazać z powrotem jako id / postId do Meta API.
  • Sprawdź operator JWT expiresAt przed użyciem go w deeplinku lub widżecie.