Meta & Instagram API-integration
Referens för att bygga en Instagram-app på SMSBAT ChatHub-plattformen: autentisering, Instagram Direktkonversationer, kommentarer på inlägg och rullar, berättelsesvar, webhooks och omröstning.
Källor
Den här sidan slår samman den interna Meta Comments API-specifikationen med den levande OpenAPI
definitioner vid https://chatapi.smsbat.com/swagger/v1/swagger.json och
https://restapi.smsbat.com/swagger/v1/swagger.json. Där de två är oense, är det
skillnaden kallas inline och listas under Öppna frågor.
1. Baswebbadresser
| Syfte | URL |
|---|---|
| Chat API + Meta API | https://chatapi.smsbat.com |
| Swagger UI / OpenAPI | https://chatapi.smsbat.com/index.html · …/swagger/v1/swagger.json |
| REST API (organisationer, återuppringningsadresser) | https://restapi.smsbat.com |
| REST API Swagger | https://restapi.smsbat.com/swagger/v1/swagger.json |
| Operatörswebbpanel | https://chat.smsbat.com |
2. Autentisering
Autentiseringsschemat beror på slutpunktsgruppen. Att blanda ihop dem är den vanligaste orsaken till 401.
| Grupp | Rubrik |
|---|---|
chatapi.smsbat.com/api/meta/* (inlägg, kommentarer) | 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 · Basic Auth |
Organisationstoken för X-Authorization-Key utfärdas i panelen under Profil.
JWT för företag och operatörer kommer från /api/company/get-token och /api/operator/get-token.
Skillnad
chatapi OpenAPI-dokumentet deklarerar ett enda säkerhetsschema — Bearer — och tillämpar det
globalt. X-Authorization-Key deklareras inte alls där, även om den interna Meta
Kommentarer API-specifikationen namnger den för /api/meta/*. Det hanteras med största sannolikhet av
middleware som inte återspeglas i Swagger. Bekräfta empiriskt innan du skickar.
2.1 Företagstoken
POST https://chatapi.smsbat.com/api/company/get-token
Content-Type: application/json
{ "login": "company_login", "password": "company_password" }
200 OK returnerar en token-sträng.
2.2 Organisationer
GET https://chatapi.smsbat.com/api/company/organization
Authorization: Bearer <company_token>
[ { "id": 24, "name": "My Instagram Store" } ]
2.3 Operatörer i en organisation
GET https://chatapi.smsbat.com/api/operator?organizationId=24
Authorization: Bearer <company_token>
[
{
"id": 21,
"name": "Jane Doe",
"status": 0,
"organization": { "id": 24, "name": "My Instagram Store" }
}
]
Operatörsstatus: 0 Aktiv, 1 Inaktiv, 2 Borttagen.
2.4 Lägg till / synkronisera operatorer
POST https://chatapi.smsbat.com/api/operator/synchronize
Authorization: Bearer <company_token>
Content-Type: application/json
[ { "organizationId": 24, "name": "John Operator" } ]
200 OK → [ { "id": 21, "status": 0, "name": "John Operator" } ]
2.5 Operatör JWT
POST https://chatapi.smsbat.com/api/operator/get-token
Authorization: Bearer <company_token>
Content-Type: application/json
{ "id": 21, "expiresAt": "2026-12-31T23:59:59.000Z" }
200 OK returnerar JWT som en sträng.
2.6 Validera en operatörstoken
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
}
När ogiltig: { "isValid": false, "error": "Invalid token" }.
2.7 Bädda in operatörens chattpanel
<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. Djuplänkar till chattpanelen
Ett externt system (CRM, ERP, webbplats) kan öppna en specifik konversation i
https://chat.smsbat.com/. Operatören är auktoriserad av en JWT som skickas som en frågeparameter.
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>
| Parameter | Beskrivning |
|---|---|
chat_raw_id | Chatt-ID |
phone | Telefonnummer i internationellt format |
from | Identifierare för varumärke/företagskonto (bm_id) |
source | Chattkälla — 7 för Instagram, se §8.1 |
token | Giltig, ej utgången operatör JWT med tillgång till chattar |
En ogiltig JWT landar besökaren på operatörspanelens inloggningsskärm.
4. Instagram Direkta konversationer
4.1 Lista chattar
GET https://chatapi.smsbat.com/api/chat/chats?source=7&page=1&per_page=20
Authorization: Bearer <token>
Note
Paginering här är per_page (snake_case). Under /api/meta/* och omröstningen
slutpunkten är perPage (camelCase). Detta är inte ett stavfel – API
Frågeparametrar, alla valfria:
| Parameter | Skriv | Beskrivning |
|---|---|---|
source | ChatSource | 7 begränsar resultat till Instagram |
entityId | int | Företagskonto-ID. Används endast tillsammans med source |
instagram_user_id | int | Instagram användar-ID i ChatHub |
facebook_user_id | int | Facebook användar-ID i ChatHub |
page / per_page | int | Paginering, standardinställningar 1 / 20 |
status | ChatStatus[] | Chattstatus, repeterbar |
search | string | Fritextsökning (namn, telefon, …) |
organizationId | int | Organisations-ID |
operatorId | int[] | Filtrera efter tilldelade operatorer |
date | string[] | Två gränser: ?date=…&date=… |
isChain | bool | Returnera chattar som kedjor, med meddelanden från tidigare chattar |
isUnread, starMark, isOperator, isAIAgent | bool | Ytterligare filter |
phone, email, contactId, clientId, tagIds, rate, sortedBy | — | Andra filter |
200 OK returnerar 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": []
}
]
}
Fälten som är viktiga för en Instagram-app:
| Fält | Betydelse |
|---|---|
instaAccount | Instagram företagskonto (butiken). id är filtervärdet entityId; name är kontonamnet från Meta |
instagramUser | kunden. name är Instagram-handtaget, id är instagram_user_id filtervärdet |
metaUserId | Kundens scoped ID på Metas sida (sträng) |
messSource | 7 för Instagram |
phone | Vanligtvis null för Instagram — använd det inte som nyckel |
ChatDTO bär också 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 och taggedMessages.
4.2 Chattmeddelanden
GET https://chatapi.smsbat.com/api/chat/chats/1867/messages?isChain=false
Authorization: Bearer <token>
200 OK returnerar en matris med 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 fylls i när meddelandet relaterar till ett Instagram-inlägg eller en berättelse – skicka det
rakt tillbaka som id / postId till Meta API. media är en ChatMediaDTO:
{ name, format, type, uri, raw, length, isUploaded }.
4.3 Skicka ett meddelande (JSON)
POST https://chatapi.smsbat.com/api/chat/1867/message
Authorization: Bearer <token>
Content-Type: application/json
Kropp — 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
}
}
| Fält | Skriv | Beskrivning |
|---|---|---|
textMessage | string? | Meddelandetext. Kan vara tom när media finns |
author | AuthorMessage? | 0 operatör, 1 klient |
isInternal | bool? | true markerar en intern anteckning som inte levereras till kunden |
replyToMessageId | int? | ID för meddelandet som besvaras |
appGuid | uuid? | Remiss GUID |
media | MediaDTO? | { name, format, dataBase64, thumbnail, duration, type } |
200 OK → { "id": 9930, "messageStatus": 0 }
En remiss-GUID kan också skickas i sökvägen:
POST /api/chat/{chatId}/{referralGuid}/message (likaså …/message/v1, …/message/v2).
4.4 Skicka en fil eller video (flerdelar, v2)
POST https://chatapi.smsbat.com/api/chat/1867/message/v2
Authorization: Bearer <token>
Content-Type: multipart/form-data
Formulärfältsnamn är PascalCase med punktnotation
textMessage och media.file ignoreras tyst. Använd de exakta namnen nedan.
| Formulärfält | Skriv | Beskrivning |
|---|---|---|
TextMessage | string | Meddelandetext |
Author | int | 0 operatör, 1 klient |
IsInternal | bool | Intern anteckning |
ReplyToMessageId | int | Meddelande som besvaras |
AppGuid | uuid | Remiss GUID |
Media.File | binary | Själva filen |
Media.Name | string | Filnamn |
Media.Format | string | MIME-typ (video/mp4, image/png, application/pdf) |
Media.Type | MediaType | Se §8.5 |
Media.DataBase64 | string | Alternativ till Media.File |
Media.Thumbnail | string | Base64-videoförhandsgranskningsram |
Media.Duration | double | Videons längd i sekunder |
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 Ändra chattstatus
PUT https://chatapi.smsbat.com/api/chat/status
Authorization: Bearer <token>
Content-Type: application/json
{ "id": 1867, "status": 4 }
200 OK ekar det uppdaterade objektet.
4.6 Uppdatera meddelandestatus
PUT https://chatapi.smsbat.com/api/chat/messages/status
Authorization: Bearer <token>
Content-Type: application/json
{ "status": 3, "messageIds": [9928, 9929] }
4.7 Ta bort en chatt
DELETE https://chatapi.smsbat.com/api/chat/chats/1867
Authorization: Bearer <token>
5. Inlägg, rullar och berättelser
Basväg: https://chatapi.smsbat.com/api/meta
Auth: X-Authorization-Key: <organization token>
5.1 Lista inlägg, rullar och berättelser
GET https://chatapi.smsbat.com/api/meta/posts?platform=instagram&mediaType=story&page=1&perPage=20
X-Authorization-Key: <token>
| Parameter | Skriv | Krävs | Beskrivning |
|---|---|---|---|
page | int | nej | Sida, standard 1 |
perPage | int | nej | Objekt per sida, standard 20 |
id | int | nej | Filtrera efter internt post-ID |
platform | string | nej | instagram eller facebook |
mediaType | string | nej | post, reel eller story. Alla typer när de utelämnas |
# 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"
}
}
]
}
Skillnad — räknarens fältnamn
Swagger-schemat MetaCommentPostListItemDtoPaginationDTO definierar total. Den
interna specifikationsdokument totalCount. Swagger genereras från koden, så
total är den mer sannolika sanningen. Analysera total ?? totalCount tills detta är klart.
| Fält | Beskrivning |
|---|---|
id | Internt post-ID |
metaId | Externt inlägg / rulle / berättelse-ID i Meta |
text | Inläggstext |
imageUrl | Proxymedia-URL nycklad av den icke-sekventiella MetaPost.Guid, eller null |
platform | facebook eller instagram |
mediaType | post, reel eller story |
createdAt | Skapandedatum (plattformsdatum eller databasdatum) |
story | Present endast för mediaType: "story" |
story.id | Internt berättelse-ID; lika med post.id |
story.metaId | Externt berättelse-ID i Meta |
story.url | Stabil proxy-URL för det lagrade Story-mediet; null om mediet inte kunde sparas |
Postmedia betjänas av två vägar: GET /api/meta/post/media/{id:int} för bakåt
kompatibilitet och GET /api/meta/post/media/{guid:guid}. Nya API-svar och återuppringningar
generera alltid GUID-formuläret.
5.2 Lista kommentarer
GET https://chatapi.smsbat.com/api/meta/comments?platform=instagram&postId=42&page=1&perPage=20
X-Authorization-Key: <token>
| Parameter | Skriv | Krävs | Beskrivning |
|---|---|---|---|
page | int | nej | Sida, standard 1 |
perPage | int | nej | Objekt per sida, standard 20 |
postId | int | nej | Filtrera efter post-ID |
parentCommentId | int | nej | Underordnade kommentarer (svar) för en given kommentar |
platform | string | nej | facebook eller 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..."
}
}
]
}
| Fält | Beskrivning |
|---|---|
id | Internt kommentar-ID |
metaId | Externt ID i Meta. null för ett väntande svar från oss tills det skickas |
text | Kommentarstext |
createdAt | Skapandedatum |
platform | facebook eller instagram |
replyStatus | null för en inkommande användarkommentar; "pending" / "sent" / "failure" för vårt svar |
author.type | "meta_user" extern användare, "owner" sidägare |
author.name | Författarens namn |
author.metaUserId | Avgränsat användar-ID i Meta; null för "owner" |
post | Inlägget, rullen eller berättelsen kommentaren tillhör |
post.mediaType | post, reel eller story |
post.story | Berättelsereferens { id, metaId, url }, endast berättelser |
mediaUrl | Media bifogas kommentaren, eller null |
replyTo | Förälders kommentar { id, metaId, text }; null på toppnivå |
Skillnad — typ av `author.type`
Den interna specifikationen dokumenterar strängarna "meta_user" / "owner". Swagger typer
MetaCommentAuthorType som ett heltal med enum [0, 1]. A JsonStringEnumConverter
skulle förklara gapet, men det har inte bekräftats mot ett verkligt svar. Skriv a
parser som accepterar båda.
5.3 Svara på en kommentar
Köar ett svar för leverans.
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"
Begäran: { "text": "Reply text" }
202 Accepted returnerar kommentarobjektet — samma form som GET /api/meta/comments — med
replyStatus: "pending" och metaId: null. Leveransresultatet kommer senare som en
source: 13 återuppringning (§6.4).
Skillnad — svarskod
Swagger deklarerar 200 utan kropp; den interna specifikationen deklarerar 202 Accepted
med kommentaren som kropp. Styrenheten saknar sannolikt en ProducesResponseType
attribut, vilket lämnar Swagger på sin standard. Acceptera alla 2xx och var inte beroende av en kropp.
6. Webhooks
SMSBAT skickar POST-förfrågningar med application/json till din URL och förväntar sig HTTP 200 tillbaka.
Nullfält utelämnas helt
Ett fält vars värde är null serialiseras inte alls i callback-kroppen. För en
meddelande som inte kom från Facebook eller Instagram finns det helt enkelt ingen MetaUserId-nyckel.
Behandla “frånvarande” och null som samma sak.
6.1 Registrera en återuppringnings-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
}'
| Fält | Skriv | Beskrivning |
|---|---|---|
url | string | Din slutpunkt |
source | SendingSourceCallback | Händelsetyp, se §8.2 |
headerName / headerValue | string | Godtycklig autentiseringshuvud vi bifogar begäran (valfritt) |
channelType | ChatSource | Kanal. 7 för Instagram. Valfritt |
channelEntityId | int | Ett specifikt företagskonto. Kräver channelType |
Utan channelType tar URL
Tip
Fullständig kommentartäckning kräver två registreringar: source: 12 för nya kommentarer och
source: 13 för svarsstatus. För direktsvar och berättelsesvar lägg till source: 3
(och 11 om du vill ha varje chattmeddelande).
Återstående verksamhet:
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 returnerar:
[
{
"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 Nytt meddelande och Instagram Story-svar (source: 3, 11)
En användares svar på en Instagram Story kommer som ett vanligt meddelande i dessa återuppringningar,
med ett extra Story-block på toppnivå:
{
"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"
}
}
| Fält | Beskrivning |
|---|---|
ChatId / MessageId | Chatt- och meddelandeidentifierare |
Author | 0 användare, 1 operatör |
Username | Instagram / Facebook visningsnamn eller handtag |
UserId | Internt numeriskt användar-ID i SMSBAT |
MetaUserId | Scoped ID för samtalspartnern i Meta. På ett utgående operatörsmeddelande identifierar detta fortfarande meta-användaren för chatten, inte operatören |
ShopId | Internt ID för Instagram/Facebook-företagskontot |
ShopName | Företagskontonamn som mottagits från Meta vid anslutningstillfället |
MessageText | Meddelandetext |
MessageMedia | Media URL när meddelandet är media |
type_messenger | Källa, 7 för Instagram |
operator_name | Operatörsnamn när Author = 1 |
Story | Presenterar endast på ett inkommande berättelsesvar |
Story.Id | Internt berättelse-ID (MetaPost) — kan användas direkt som id / postId i Meta API |
Story.MetaId | Externt berättelse-ID i Meta |
Story.Url | Stabil proxy-URL för det lagrade Story-mediet. Frånvarande när media inte kunde sparas — blocket Story och meddelandet levereras fortfarande |
`Author` är inverterad i förhållande till Chat API
I ChatMessageDTO.author betyder 0 operatör och 1 betyder klient. I denna callback är det
tvärtom: 0 är användaren, 1 är operatören. Dela inte kartläggningen.
6.3 Ny kommentar (source: 12)
Avfyras när en Meta-användare kommenterar ett Facebook-inlägg eller ett Instagram-inlägg/rulle.
Note
Instagram Berättelsesvar levereras inte via source: 12. De kommer som vanligt
inkommande meddelanden på source: 3 och/eller 11 med ett Story-block — se §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 Kommentarssvarsstatus (source: 13)
Avfyras efter att vi försöker leverera ett svar, oavsett om det lyckas eller misslyckas.
{
"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 Delade kommentarsfält
Båda återuppringningarna av kommentarer delar en kroppsform och skiljer sig endast med type.
| Fält | Beskrivning |
|---|---|
type | "new_comment" eller "comment_status" |
platform | "facebook" eller "instagram" |
comment.id | Internt kommentar-ID |
comment.metaId | Externt ID i Meta; null för ett väntande svar innan det skickas |
comment.parentCommentId | Förälders kommentar-ID. Frånvarande för en kommentar på toppnivå |
comment.parentMetaId | Kommentar-ID för extern förälder. Frånvarande på toppnivå |
comment.parentCommentText | Förälders kommentarstext. Frånvarande på toppnivå |
comment.text | Kommentarstext |
comment.createdAt | Skapandedatum |
comment.updatedAt | Senaste uppdatering. Frånvarande om kommentaren aldrig redigerades |
comment.replyStatus | "pending" / "sent" / "failure". Frånvarande för en inkommande användarkommentar |
comment.author.type | "meta_user" eller "owner" |
comment.author.name | Författarens namn |
comment.author.metaUserId | Avgränsat författare-ID i Meta. Frånvarande för "owner" |
comment.mediaUrl | Kommentar media. Frånvarande när det inte finns någon |
post.id | Internt post-ID |
post.metaId | Externt inlägg / rulle / berättelse-ID i Meta |
post.text | Inläggstext |
post.imageUrl | Lägg upp bildens URL, eller null |
post.createdAt | Post skapande datum |
post.mediaType | I kommentarsuppringningar, endast post eller reel |
6.6 Ny chatt (source: 7)
{ "ChatId": 12345, "Phone": "+380501234567", "chat.Source": 7 }
6.7 Ändringar av meddelande- och chattstatus (source: 6 / 5)
{ "name": "changed_message_status", "id": 9928, "status": 6 }
{ "name": "changed_chat_status", "id": 1867, "status": 4 }
6.8 Meddelande redigerat eller raderat (source: 9)
{ "messageId": 9930, "text": "Updated message text" }
{ "messageId": 9931, "delete": true }
6.9 Skrivningsindikator (source: 8)
{ "chat_id": 1867, "event": "start_typing", "operator_name": "Iryna" }
{ "chat_id": 1867, "event": "end_typing" }
7. Händelseundersökning
För miljöer som inte kan acceptera inkommande HTTP.
7.1 Hämta händelser
GET https://chatapi.smsbat.com/api/chat/callback-events?page=1&perPage=20
Authorization: Bearer <token>
| Parameter | Beskrivning |
|---|---|
organizationId | Frivillig. Taget från token när den utelämnas |
page / perPage | Paginering, standardinställningar 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"
}
]
}
Varje evenemang har event_guid, timestamp, organization_id och callback_type — en
sträng som matchar source-värdena i §8.2. De återstående fälten matchar motsvarande
webhook i §6.
7.2 Bekräfta bearbetade händelser
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 }
Händelser som redan tagits bort räknas helt enkelt inte mot deleted. Beställning och omförsök är din
sidans ansvar.
7.3 Rekommenderad slinga
- Omröstning
GET /api/chat/callback-eventsenligt ett schema. - Bearbeta händelserna i din tjänst.
- Skicka den bearbetade
event_guid-listan till/callback-events/processed. - Upprepa.
8. Enum referens
8.1 ChatSource — kanal (0–9)
| Kod | Kanal |
|---|---|
| 0 | Viber |
| 1 | ViberBot |
| 2 | TelegramBot |
| 3 | |
| 4 | Widget |
| 5 | Rozetka |
| 6 | |
| 7 | |
| 8 | Bal |
| 9 | Olx |
8.2 SendingSourceCallback — återuppringningshändelsetyp (0–13)
| Kod | Händelse |
|---|---|
| 3 | Chat — nytt chattmeddelande, inklusive berättelsesvar |
| 5 | Chattstatus ändrad |
| 6 | Meddelandestatus ändrad |
| 7 | Ny chatt skapad |
| 8 | Skrivningsindikator |
| 9 | Meddelande uppdaterat eller raderat |
| 11 | AnyChatMessage — alla chattmeddelanden |
| 12 | MetaNewComment — ny Instagram/Facebook-kommentar |
| 13 | MetaCommentStatus — leveransstatus för vårt kommentarsvar |
Uppräkningen spänner över 0–13; de återstående värdena behövs inte för Instagram-integrationer.
8.3 ChatStatus (0–4)
0 Ny, 1 Öppen, 2 Väntar, 3 OnPause, 4 Stängd
8.4 MessageStatus (0–11)
| Kod | Namn |
|---|---|
| 0 | NYTT |
| 1 | FRAMGÅNG |
| 2 | AVVISAD |
| 3 | LÄS |
| 4 | OKÄND |
| 5 | BEHANDLING |
| 6 | LEVERERAS |
| 7 | BLOCKED_BY_USER |
| 8 | USER_NOT_FOUND |
Uppräkningen spänner över 0–11. Värdena 9, 10 och 11 finns i API
UNKNOWN.
8,5 MediaType (1–10)
1 Foto, 2 Fil, 3 Ljud, 4 Video, 5 Sticker, 6 StickerAnimated,
7 StickerVideo, 8 Animation, 9 Röst, 10 VideoNote
8.6 AuthorMessage — författare i Chat API (0–4)
0 Operatör, 1 klient, 2 Bot, 3 ViberAccount
Uppräkningen spänner över 0–4; värdet 4 är odokumenterat. De “nya meddelandet” återuppringningar använder
motsatt kartläggning — se §6.2.
8.7 ChatMessageType (0–2)
0 Text, 1 Foto, 2 Fil
8.8 Kommentar replyStatus
null inkommande användarkommentar, "pending" vårt svar är i kö, "sent" levererat,
"failure" leverans misslyckades.
Öppna frågor
Tre punkter där den interna specifikationen och den kodgenererade Swagger inte är överens. En begäran med en riktig token löser dem alla; tills dess, skriv klienten defensivt.
| # | Fråga | Specifikation | Swagger | Hur man kontrollerar |
|---|---|---|---|---|
| 1 | Auth header för /api/meta/* | X-Authorization-Key | endast Bearer deklareras | curl -i -H "X-Authorization-Key: <token>" ".../api/meta/posts?perPage=1" — förvänta 200, inte 401 |
| 2 | Räknarfält i metasvar | totalCount | total | Samma begäran — läs root JSON-nyckeln |
| 3 | author.type typ och reply statuskod | "meta_user" / "owner", 202 med kropp | int [0,1], 200 utan kropp | curl -i .../api/meta/comments?perPage=1 plus ett testsvar |
Interimistisk vägledning:
- räknare — läs
total ?? totalCount; author.type— acceptera både en sträng och ett heltal (0↔meta_user,1↔owner, mappning ska bekräftas);reply— behandla alla2xxsom framgång, kräver ingen kropp, ta slutstatus frånsource: 13återuppringning.
Implementeringsnoteringar
- Autentiseringen skiljer sig per slutpunktsgrupp —
/api/meta/*använderX-Authorization-Key, chattar och operatörer använderBearer,restapiaccepterar antingen. - Pginering stavas på två sätt —
per_pagepå/api/chat/chats,perPagepå/api/meta/*och/api/chat/callback-events. multipart/form-data-fälten är PascalCase med punktnotation (Media.File,Media.Type).- Nullfält utelämnas från återuppringningar — en frånvarande nyckel betyder
null. phoneär vanligtvisnullpå Instagram. Identifiera kunden medinstagramUser.id/metaUserIdoch butiken avinstaAccount.id(filtreringsvärdetentityId).Story.Idfrån en återuppringning kan skickas direkt tillbaka somid/postIdtill Meta API.- Kontrollera operatörens JWT
expiresAtinnan du använder den i en djuplänk eller widgeten.