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 + მეტა API | https://chatapi.smsbat.com |
| Swagger UI / OpenAPI | https://chatapi.smsbat.com/index.html · …/swagger/v1/swagger.json |
| REST API (ორგანიზაციები, გამოძახების URLs) | https://restapi.smsbat.com |
| REST API Swagger | https://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 იყენებს ორივეს.
შეკითხვის პარამეტრები, ყველა სურვილისამებრ:
| პარამეტრი | ტიპი | აღწერა |
|---|---|---|
source | ChatSource | 7 ზღუდავს შედეგებს Instagram-ზე |
entityId | int | ბიზნეს ანგარიშის ID. გამოიყენება მხოლოდ source |
instagram_user_id | int | Instagram-ის მომხმარებლის ID ChatHub-ში |
facebook_user_id | int | Facebook მომხმარებლის ID ChatHub-ში |
page / per_page | int | პაგირება, ნაგულისხმევი 1 / 20 |
status | ChatStatus[] | ჩატის სტატუსი, განმეორებადი |
search | string | თავისუფალი ტექსტის ძიება (სახელი, ტელეფონი,…) |
organizationId | int | ორგანიზაციის ID |
operatorId | int[] | გაფილტვრა მინიჭებული ოპერატორების მიხედვით |
date | string[] | ორი ზღვარი: ?date=…&date=… |
isChain | bool | დააბრუნეთ ჩეთები ჯაჭვების სახით, წინა ჩეთებიდან შეტყობინებების შემცველი |
isUnread, starMark, isOperator, isAIAgent | bool | დამატებითი ფილტრები |
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 მეტას მხარეს (სტრიქონი) |
messSource | 7 ინსტაგრამისთვის |
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
}
}
| ველი | ტიპი | აღწერა |
|---|---|---|
textMessage | string? | შეტყობინების ტექსტი. შეიძლება ცარიელი იყოს, როდესაც media არის |
author | AuthorMessage? | 0 ოპერატორი, 1 კლიენტი |
isInternal | bool? | true აღნიშნავს შიდა შენიშვნას, რომელიც არ მიეწოდება მომხმარებელს |
replyToMessageId | int? | შეტყობინების ID, რომელზეც პასუხობენ |
appGuid | uuid? | რეფერალური GUID |
media | MediaDTO? | { 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 ჩუმად იგნორირებულია. გამოიყენეთ ქვემოთ მოცემული ზუსტი სახელები.
| ფორმის ველი | ტიპი | აღწერა |
|---|---|---|
TextMessage | string | შეტყობინების ტექსტი |
Author | int | 0 ოპერატორი, 1 კლიენტი |
IsInternal | bool | შიდა შენიშვნა |
ReplyToMessageId | int | შეტყობინება პასუხობს |
AppGuid | uuid | რეფერალური GUID |
Media.File | binary | თავად ფაილი |
Media.Name | string | ფაილის სახელი |
Media.Format | string | MIME ტიპი (video/mp4, image/png, application/pdf) |
Media.Type | MediaType | იხილეთ §8.5 |
Media.DataBase64 | string | ალტერნატივა Media.File |
Media.Thumbnail | string | Base64 ვიდეო გადახედვის ჩარჩო |
Media.Duration | double | ვიდეოს ხანგრძლივობა წამებში |
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>
| პარამეტრი | ტიპი | საჭირო | აღწერა |
|---|---|---|---|
page | int | არა | გვერდი, ნაგულისხმევი 1 |
perPage | int | არა | ერთეულები თითო გვერდზე, ნაგულისხმევი 20 |
id | int | არა | გაფილტვრა შიდა პოსტის ID |
platform | string | არა | instagram ან facebook |
mediaType | string | არა | 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 |
platform | facebook ან instagram |
mediaType | post, reel ან story |
createdAt | შექმნის თარიღი (პლატფორმის თარიღი, ან მონაცემთა ბაზის თარიღი) |
story | აჩუქე მხოლოდ mediaType: "story" |
story.id | Internal Story ID; უდრის post.id |
story.metaId | External 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>
| პარამეტრი | ტიპი | საჭირო | აღწერა |
|---|---|---|---|
page | int | არა | გვერდი, ნაგულისხმევი 1 |
perPage | int | არა | ერთეულები თითო გვერდზე, ნაგულისხმევი 20 |
postId | int | არა | გაფილტვრა პოსტის ID |
parentCommentId | int | არა | ბავშვის კომენტარები (პასუხები) მოცემული კომენტარის |
platform | string | არა | 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 | შექმნის თარიღი |
platform | facebook ან instagram |
replyStatus | null შემომავალი მომხმარებლის კომენტარისთვის; "pending" / "sent" / "failure" ჩვენი პასუხისთვის |
author.type | "meta_user" გარე მომხმარებელი, "owner" გვერდის მფლობელი |
author.name | ავტორის სახელი |
author.metaUserId | Scoped მომხმარებლის ID Meta-ში; null "owner"-ისთვის |
post | პოსტი, რგოლი ან ისტორია, კომენტარი ეკუთვნის |
post.mediaType | post, 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
}'
| ველი | ტიპი | აღწერა |
|---|---|---|
url | string | თქვენი საბოლოო წერტილი |
source | SendingSourceCallback | ღონისძიების ტიპი, იხილეთ §8.2 |
headerName / headerValue | string | თვითნებური ავტორიზაციის სათაური ჩვენ ვამაგრებთ მოთხოვნას (არასავალდებულო) |
channelType | ChatSource | არხი. 7 ინსტაგრამისთვის. სურვილისამებრ |
channelEntityId | int | კონკრეტული ბიზნეს ანგარიში. მოითხოვს 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 | ჩატის და შეტყობინების იდენტიფიკატორები |
Author | 0 მომხმარებელი, 1 ოპერატორი |
Username | Instagram / Facebook საჩვენებელი სახელი ან სახელური |
UserId | მომხმარებლის შიდა რიცხვითი ID SMSBAT-ში |
MetaUserId | Meta-ში საუბრის პარტნიორის ფარგლებიანი ID. გამავალი ოპერატორის შეტყობინებაზე ეს მაინც განსაზღვრავს ჩატის მეტა მომხმარებელს და არა ოპერატორს |
ShopId | Instagram / Facebook ბიზნეს ანგარიშის შიდა ID |
ShopName | ბიზნეს ანგარიშის სახელი, როგორც მიღებული Meta-სგან კავშირის დროს |
MessageText | შეტყობინების ტექსტი |
MessageMedia | მედიის URL, როდესაც შეტყობინება არის მედია |
type_messenger | წყარო, 7 ინსტაგრამისთვის |
operator_name | ოპერატორის სახელი, როდესაც Author = 1 |
Story | წარადგინეთ მხოლოდ შემომავალი Story-ის პასუხზე |
Story.Id | Internal Story (MetaPost) ID — გამოიყენება პირდაპირ როგორც id / postId Meta API-ში |
Story.MetaId | External 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 რეკომენდებული ციკლი
- გამოკითხვა
GET /api/chat/callback-eventsგრაფიკით. - დაამუშავეთ მოვლენები თქვენს სამსახურში.
- გაგზავნეთ დამუშავებული
event_guidსია ნომერზე/callback-events/processed. - გაიმეორეთ.
8. შეყვანის მითითება
8.1 ChatSource — არხი (0–9)
| კოდი | არხი |
|---|---|
| 0 | Viber |
| 1 | ViberBot |
| 2 | TelegramBot |
| 3 | |
| 4 | ვიჯეტი |
| 5 | როზეტკა |
| 6 | |
| 7 | ინსტაგრამი |
| 8 | გამოსაშვები |
| 9 | Olx |
8.2 SendingSourceCallback — გამოძახების ღონისძიების ტიპი (0–13)
| კოდი | ღონისძიება |
|---|---|
| 3 | Chat — ახალი ჩეთის შეტყობინება, Story-ის პასუხების ჩათვლით |
| 5 | ჩატის სტატუსი შეიცვალა |
| 6 | შეტყობინების სტატუსი შეიცვალა |
| 7 | ახალი ჩატი შეიქმნა |
| 8 | აკრეფის მაჩვენებელი |
| 9 | შეტყობინება განახლდა ან წაიშალა |
| 11 | AnyChatMessage — ნებისმიერი ჩატის შეტყობინება |
| 12 | MetaNewComment — ახალი Instagram / Facebook კომენტარი |
| 13 | MetaCommentStatus — ჩვენი კომენტარის პასუხის მიწოდების სტატუსი |
რიცხვი მოიცავს 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 | მიწოდებული |
| 7 | BLOCKED_BY_USER |
| 8 | USER_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 | მრიცხველის ველი მეტა პასუხებში | totalCount | total | იგივე მოთხოვნა — წაიკითხეთ root JSON გასაღები |
| 3 | author.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ჩვეულებრივ არისnullInstagram-ზე. მომხმარებლის იდენტიფიცირებაinstagramUser.id-ით /metaUserIdდა მაღაზიაinstaAccount.id(entityIdფილტრის მნიშვნელობა).Story.Idგამოძახებიდან შეიძლება პირდაპირ გადაეცეს როგორცid/postIdMeta API-ს.- შეამოწმეთ ოპერატორი JWT-ის
expiresAt, სანამ გამოიყენებთ მას ღრმა ბმულში ან ვიჯეტში.