Help Center Meta & Instagram API ინტეგრაცია

Meta & Instagram API ინტეგრაცია

მითითება SMSBAT ChatHub პლატფორმაზე ინსტაგრამის აპლიკაციის შესაქმნელად: ავტორიზაცია, ინსტაგრამის პირდაპირი საუბრები, კომენტარები პოსტებზე და რელსებზე, Story-ის პასუხები, ვებჰუკები და გამოკითხვა.

წყაროები

ეს გვერდი აერთიანებს შიდა Meta Comments API სპეციფიკაციას ცოცხალი OpenAPI-სთან განმარტებები https://chatapi.smsbat.com/swagger/v1/swagger.json-ზე და https://restapi.smsbat.com/swagger/v1/swagger.json. სადაც ეს ორი არ ეთანხმება, განსხვავება მოწოდებულია შიდა და ჩამოთვლილია ქვეშ ღია კითხვები.


1. საბაზისო URL-ები

დანიშნულებაURL
ჩატის API + მეტა APIhttps://chatapi.smsbat.com
Swagger UI / OpenAPIhttps://chatapi.smsbat.com/index.html · …/swagger/v1/swagger.json
REST API (ორგანიზაციები, გამოძახების URLs)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 ორგანიზაციის ჟეტონი გაიცემა პანელში პროფილში. კომპანიისა და ოპერატორის JWTs მოდის /api/company/get-token და /api/operator/get-token.

განსხვავება

chatapi OpenAPI დოკუმენტი აცხადებს უსაფრთხოების ერთ სქემას — Bearer — და იყენებს მას გლობალურად. X-Authorization-Key იქ საერთოდ არ არის გამოცხადებული, თუმცა შიდა მეტა კომენტარები 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_idჩატის ID
phoneტელეფონის ნომერი საერთაშორისო ფორმატში
fromბრენდის / ბიზნეს ანგარიშის იდენტიფიკატორი (bm_id)
sourceჩატის წყარო — 7 Instagram-ისთვის, იხილეთ §8.1
tokenმოქმედი, ვადაგასული ოპერატორი JWT ჩეთებზე წვდომით

არასწორი JWT აგზავნის ვიზიტორს ოპერატორის პანელის შესვლის ეკრანზე.


4. ინსტაგრამის პირდაპირი საუბრები

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-ზე
entityIdintბიზნეს ანგარიშის ID. გამოიყენება მხოლოდ source
instagram_user_idintInstagram-ის მომხმარებლის ID ChatHub-ში
facebook_user_idintFacebook მომხმარებლის ID ChatHub-ში
page / per_pageintპაგირება, ნაგულისხმევი 1 / 20
statusChatStatus[]ჩატის სტატუსი, განმეორებადი
searchstringთავისუფალი ტექსტის ძიება (სახელი, ტელეფონი,…)
organizationIdintორგანიზაციის ID
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": []
    }
  ]
}

ველები, რომლებიც მნიშვნელოვანია ინსტაგრამის აპისთვის:

ველიმნიშვნელობა
instaAccount** ინსტაგრამის ბიზნეს ანგარიში ** (მაღაზია). id არის entityId ფილტრის მნიშვნელობა; name არის ანგარიშის სახელი Meta
instagramUserმომხმარებელი. name არის Instagram-ის სახელური, id არის instagram_user_id ფილტრის მნიშვნელობა
metaUserIdმომხმარებლის scoped ID მეტას მხარეს (სტრიქონი)
messSource7 ინსტაგრამისთვის
phoneჩვეულებრივ null ინსტაგრამისთვის — არ გამოიყენოთ იგი გასაღებად

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 ივსება, როდესაც შეტყობინება ეხება ინსტაგრამის პოსტს ან ისტორიას — გადასცეთ პირდაპირ, როგორც id / postId მეტა 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 ფაილის ან ვიდეოს გაგზავნა (მრავალნაწილიანი, 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შეტყობინება პასუხობს
AppGuiduuidრეფერალური GUID
Media.Filebinaryთავად ფაილი
Media.Namestringფაილის სახელი
Media.FormatstringMIME ტიპი (video/mp4, image/png, application/pdf)
Media.TypeMediaTypeიხილეთ §8.5
Media.DataBase64stringალტერნატივა Media.File
Media.ThumbnailstringBase64 ვიდეო გადახედვის ჩარჩო
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 სანამ ეს არ მოგვარდება.

ველიაღწერა
idშიდა პოსტის ID
metaIdგარე პოსტი / Reel / Story ID in Meta
textპოსტის წარწერა
imageUrlპროქსი მედიის URL ჩასმულია არათანმიმდევრული MetaPost.Guid, ან null
platformfacebook ან instagram
mediaTypepost, reel ან story
createdAtშექმნის თარიღი (პლატფორმის თარიღი, ან მონაცემთა ბაზის თარიღი)
storyაჩუქე მხოლოდ mediaType: "story"
story.idInternal Story ID; უდრის post.id
story.metaIdExternal Story ID in Meta
story.urlშენახული Story მედიის სტაბილური პროქსის URL; 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..."
      }
    }
  ]
}
ველიაღწერა
idშიდა კომენტარის ID
metaIdგარე ID მეტაში. null ჩვენი მომლოდინე პასუხის გაგზავნამდე
textკომენტარის ტექსტი
createdAtშექმნის თარიღი
platformfacebook ან instagram
replyStatusnull შემომავალი მომხმარებლის კომენტარისთვის; "pending" / "sent" / "failure" ჩვენი პასუხისთვის
author.type"meta_user" გარე მომხმარებელი, "owner" გვერდის მფლობელი
author.nameავტორის სახელი
author.metaUserIdScoped მომხმარებლის ID Meta-ში; 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 როგორც მთელი რიცხვი [0, 1]-ით. A JsonStringEnumConverter ახსნიდა ხარვეზს, მაგრამ ეს არ დადასტურდა რეალური პასუხის წინააღმდეგ. დაწერეთ ა პარსერი, რომელიც ორივეს იღებს.

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. მიწოდების შედეგი მოგვიანებით მოდის, როგორც ა source: 13 გამოძახება (§6.4).

სხვაობა — პასუხის კოდი

სვაგერი აცხადებს 200 სხეულის გარეშე; შიდა სპეციფიკაცია აცხადებს 202 Accepted კომენტარით, როგორც სხეულის. კონტროლერს სავარაუდოდ აკლია ProducesResponseType ატრიბუტი, ტოვებს Swagger-ს ნაგულისხმევად. მიიღეთ ნებისმიერი 2xx და არ იყოთ დამოკიდებული სხეულზე.


6. ვებჰუკები

SMSBAT აგზავნის POST მოთხოვნას application/json-ით თქვენს URL-ზე და ელის HTTP 200 დაბრუნებას.

ნულის ველები მთლიანად გამოტოვებულია

ველი, რომლის მნიშვნელობა არის null, საერთოდ არ არის სერიული გამოძახების სხეულში. ამისთვის ა შეტყობინება, რომელიც არ მოვიდა ფეისბუქიდან ან ინსტაგრამიდან, უბრალოდ არ არის 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 ინსტაგრამისთვის. სურვილისამებრ
channelEntityIdintკონკრეტული ბიზნეს ანგარიში. მოითხოვს channelType

channelType-ის გარეშე URL იღებს მოვლენებს ყველა არხიდან.

Tip

კომენტარების სრულ გაშუქებას **ორი ** რეგისტრაცია სჭირდება: source: 12 ახალი კომენტარებისთვის და source: 13 პასუხის სტატუსებისთვის. პირდაპირი და Story პასუხებისთვის დაამატეთ 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 ოპერატორი
UsernameInstagram / Facebook საჩვენებელი სახელი ან სახელური
UserIdმომხმარებლის შიდა რიცხვითი ID SMSBAT-ში
MetaUserIdMeta-ში საუბრის პარტნიორის ფარგლებიანი ID. გამავალი ოპერატორის შეტყობინებაზე ეს მაინც განსაზღვრავს ჩატის მეტა მომხმარებელს და არა ოპერატორს
ShopIdInstagram / Facebook ბიზნეს ანგარიშის შიდა ID
ShopNameბიზნეს ანგარიშის სახელი, როგორც მიღებული Meta-სგან კავშირის დროს
MessageTextშეტყობინების ტექსტი
MessageMediaმედიის URL, როდესაც შეტყობინება არის მედია
type_messengerწყარო, 7 ინსტაგრამისთვის
operator_nameოპერატორის სახელი, როდესაც Author = 1
Storyწარადგინეთ მხოლოდ შემომავალი Story-ის პასუხზე
Story.IdInternal Story (MetaPost) ID — გამოიყენება პირდაპირ როგორც id / postId Meta API-ში
Story.MetaIdExternal Story ID in Meta
Story.Urlშენახული Story მედიის სტაბილური პროქსის URL. არ არის, როდესაც მედიის შენახვა ვერ მოხერხდა — 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.idშიდა კომენტარის ID
comment.metaIdგარე ID Meta-ში; null მომლოდინე პასუხისთვის გაგზავნამდე
comment.parentCommentIdმშობლის კომენტარის ID. არ არის უმაღლესი დონის კომენტარისთვის
comment.parentMetaIdგარე მშობლის კომენტარის ID. არყოფნის უმაღლეს დონეზე
comment.parentCommentTextმშობლის კომენტარის ტექსტი. არყოფნის უმაღლეს დონეზე
comment.textკომენტარის ტექსტი
comment.createdAtშექმნის თარიღი
comment.updatedAtბოლო განახლება. არ არსებობს, თუ კომენტარი არასოდეს ყოფილა რედაქტირებული
comment.replyStatus"pending" / "sent" / "failure". არ არის შემომავალი მომხმარებლის კომენტარისთვის
comment.author.type"meta_user" ან "owner"
comment.author.nameავტორის სახელი
comment.author.metaUserIdფარული ავტორის ID Meta-ში. არ არის "owner"
comment.mediaUrlკომენტარის მედია. არ არსებობს, როცა არ არის
post.idშიდა პოსტის ID
post.metaIdგარე პოსტი / Reel / Story ID in Meta
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-ში. დარჩენილი ველები შეესაბამება შესაბამისს ვებჰუკი §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
7ინსტაგრამი
8გამოსაშვები
9Olx

8.2 SendingSourceCallback — გამოძახების ღონისძიების ტიპი (0–13)

კოდიღონისძიება
3Chat — ახალი ჩეთის შეტყობინება, Story-ის პასუხების ჩათვლით
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 StickerAnimated, 7 StickerVideo, 8 ანიმაცია, 9 ხმა, 10 VideoNote

8.6 AuthorMessage — ავტორი ჩატის API-ში (0–4)

0 ოპერატორი, 1 კლიენტი, 2 ბოტი, 3 ViberAccount

რიცხვი მოიცავს 0–4; ღირებულება 4 დაუსაბუთებელია. ** “ახალი შეტყობინების” გამოძახება იყენებს საპირისპირო რუქა** — იხილეთ §6.2.

8.7 ChatMessageType (0–2)

0 ტექსტი, 1 ფოტო, 2 ფაილი

8.8 კომენტარი replyStatus

null შემომავალი მომხმარებლის კომენტარი, "pending" ჩვენი პასუხი არის რიგში, "sent" მიწოდებული, "failure" მიწოდება ვერ მოხერხდა.


ღია კითხვები

სამი წერტილი, სადაც შიდა სპეციფიკაცია და კოდით გენერირებული Swagger არ ეთანხმება. ერთი მოთხოვნა რეალური ნიშნით აგვარებს ყველა მათგანს; მანამდე დაწერე კლიენტი დაცვით.

#კითხვასპეციფიკაციაSwaggerროგორ შევამოწმოთ
1ავტორიზაციის სათაური /api/meta/*-ისთვისX-Authorization-Keyმხოლოდ Bearer გამოცხადდაcurl -i -H "X-Authorization-Key: <token>" ".../api/meta/posts?perPage=1" — ველით 200, არა 401
2მრიცხველის ველი მეტა პასუხებშიtotalCounttotalიგივე მოთხოვნა — წაიკითხეთ root 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 გამოძახებიდან.

განხორციელების შენიშვნები

  • Auth განსხვავდება საბოლოო წერტილის ჯგუფის მიხედვით — /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-ს.
  • შეამოწმეთ ოპერატორი JWT-ის expiresAt, სანამ გამოიყენებთ მას ღრმა ბმულში ან ვიჯეტში.