Help Center Meta & Instagram API-integration

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

SyfteURL
Chat API + Meta APIhttps://chatapi.smsbat.com
Swagger UI / OpenAPIhttps://chatapi.smsbat.com/index.html · …/swagger/v1/swagger.json
REST API (organisationer, återuppringningsadresser)https://restapi.smsbat.com
REST API Swaggerhttps://restapi.smsbat.com/swagger/v1/swagger.json
Operatörswebbpanelhttps://chat.smsbat.com

2. Autentisering

Autentiseringsschemat beror på slutpunktsgruppen. Att blanda ihop dem är den vanligaste orsaken till 401.

GruppRubrik
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>
ParameterBeskrivning
chat_raw_idChatt-ID
phoneTelefonnummer i internationellt format
fromIdentifierare för varumärke/företagskonto (bm_id)
sourceChattkälla — 7 för Instagram, se §8.1
tokenGiltig, 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

använder båda.

Frågeparametrar, alla valfria:

ParameterSkrivBeskrivning
sourceChatSource7 begränsar resultat till Instagram
entityIdintFöretagskonto-ID. Används endast tillsammans med source
instagram_user_idintInstagram användar-ID i ChatHub
facebook_user_idintFacebook användar-ID i ChatHub
page / per_pageintPaginering, standardinställningar 1 / 20
statusChatStatus[]Chattstatus, repeterbar
searchstringFritextsökning (namn, telefon, …)
organizationIdintOrganisations-ID
operatorIdint[]Filtrera efter tilldelade operatorer
datestring[]Två gränser: ?date=…&date=…
isChainboolReturnera chattar som kedjor, med meddelanden från tidigare chattar
isUnread, starMark, isOperator, isAIAgentboolYtterligare 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ältBetydelse
instaAccountInstagram företagskonto (butiken). id är filtervärdet entityId; name är kontonamnet från Meta
instagramUserkunden. name är Instagram-handtaget, id är instagram_user_id filtervärdet
metaUserIdKundens scoped ID på Metas sida (sträng)
messSource7 för Instagram
phoneVanligtvis 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ältSkrivBeskrivning
textMessagestring?Meddelandetext. Kan vara tom när media finns
authorAuthorMessage?0 operatör, 1 klient
isInternalbool?true markerar en intern anteckning som inte levereras till kunden
replyToMessageIdint?ID för meddelandet som besvaras
appGuiduuid?Remiss GUID
mediaMediaDTO?{ 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ältSkrivBeskrivning
TextMessagestringMeddelandetext
Authorint0 operatör, 1 klient
IsInternalboolIntern anteckning
ReplyToMessageIdintMeddelande som besvaras
AppGuiduuidRemiss GUID
Media.FilebinarySjälva filen
Media.NamestringFilnamn
Media.FormatstringMIME-typ (video/mp4, image/png, application/pdf)
Media.TypeMediaTypeSe §8.5
Media.DataBase64stringAlternativ till Media.File
Media.ThumbnailstringBase64-videoförhandsgranskningsram
Media.DurationdoubleVideons 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>
ParameterSkrivKrävsBeskrivning
pageintnejSida, standard 1
perPageintnejObjekt per sida, standard 20
idintnejFiltrera efter internt post-ID
platformstringnejinstagram eller facebook
mediaTypestringnejpost, 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ältBeskrivning
idInternt post-ID
metaIdExternt inlägg / rulle / berättelse-ID i Meta
textInläggstext
imageUrlProxymedia-URL nycklad av den icke-sekventiella MetaPost.Guid, eller null
platformfacebook eller instagram
mediaTypepost, reel eller story
createdAtSkapandedatum (plattformsdatum eller databasdatum)
storyPresent endast för mediaType: "story"
story.idInternt berättelse-ID; lika med post.id
story.metaIdExternt berättelse-ID i Meta
story.urlStabil 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>
ParameterSkrivKrävsBeskrivning
pageintnejSida, standard 1
perPageintnejObjekt per sida, standard 20
postIdintnejFiltrera efter post-ID
parentCommentIdintnejUnderordnade kommentarer (svar) för en given kommentar
platformstringnejfacebook 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ältBeskrivning
idInternt kommentar-ID
metaIdExternt ID i Meta. null för ett väntande svar från oss tills det skickas
textKommentarstext
createdAtSkapandedatum
platformfacebook eller instagram
replyStatusnull 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.nameFörfattarens namn
author.metaUserIdAvgränsat användar-ID i Meta; null för "owner"
postInlägget, rullen eller berättelsen kommentaren tillhör
post.mediaTypepost, reel eller story
post.storyBerättelsereferens { id, metaId, url }, endast berättelser
mediaUrlMedia bifogas kommentaren, eller null
replyToFö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ältSkrivBeskrivning
urlstringDin slutpunkt
sourceSendingSourceCallbackHändelsetyp, se §8.2
headerName / headerValuestringGodtycklig autentiseringshuvud vi bifogar begäran (valfritt)
channelTypeChatSourceKanal. 7 för Instagram. Valfritt
channelEntityIdintEtt specifikt företagskonto. Kräver channelType

Utan channelType tar URL

emot händelser från varje kanal.

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ältBeskrivning
ChatId / MessageIdChatt- och meddelandeidentifierare
Author0 användare, 1 operatör
UsernameInstagram / Facebook visningsnamn eller handtag
UserIdInternt numeriskt användar-ID i SMSBAT
MetaUserIdScoped ID för samtalspartnern i Meta. På ett utgående operatörsmeddelande identifierar detta fortfarande meta-användaren för chatten, inte operatören
ShopIdInternt ID för Instagram/Facebook-företagskontot
ShopNameFöretagskontonamn som mottagits från Meta vid anslutningstillfället
MessageTextMeddelandetext
MessageMediaMedia URL när meddelandet är media
type_messengerKälla, 7 för Instagram
operator_nameOperatörsnamn när Author = 1
StoryPresenterar endast på ett inkommande berättelsesvar
Story.IdInternt berättelse-ID (MetaPost) — kan användas direkt som id / postId i Meta API
Story.MetaIdExternt berättelse-ID i Meta
Story.UrlStabil 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ältBeskrivning
type"new_comment" eller "comment_status"
platform"facebook" eller "instagram"
comment.idInternt kommentar-ID
comment.metaIdExternt ID i Meta; null för ett väntande svar innan det skickas
comment.parentCommentIdFörälders kommentar-ID. Frånvarande för en kommentar på toppnivå
comment.parentMetaIdKommentar-ID för extern förälder. Frånvarande på toppnivå
comment.parentCommentTextFörälders kommentarstext. Frånvarande på toppnivå
comment.textKommentarstext
comment.createdAtSkapandedatum
comment.updatedAtSenaste 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.nameFörfattarens namn
comment.author.metaUserIdAvgränsat författare-ID i Meta. Frånvarande för "owner"
comment.mediaUrlKommentar media. Frånvarande när det inte finns någon
post.idInternt post-ID
post.metaIdExternt inlägg / rulle / berättelse-ID i Meta
post.textInläggstext
post.imageUrlLägg upp bildens URL, eller null
post.createdAtPost skapande datum
post.mediaTypeI 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>
ParameterBeskrivning
organizationIdFrivillig. Taget från token när den utelämnas
page / perPagePaginering, 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

  1. Omröstning GET /api/chat/callback-events enligt ett schema.
  2. Bearbeta händelserna i din tjänst.
  3. Skicka den bearbetade event_guid-listan till /callback-events/processed.
  4. Upprepa.

8. Enum referens

8.1 ChatSource — kanal (0–9)

KodKanal
0Viber
1ViberBot
2TelegramBot
3Whatsapp
4Widget
5Rozetka
6Facebook
7Instagram
8Bal
9Olx

8.2 SendingSourceCallback — återuppringningshändelsetyp (0–13)

KodHändelse
3Chat — nytt chattmeddelande, inklusive berättelsesvar
5Chattstatus ändrad
6Meddelandestatus ändrad
7Ny chatt skapad
8Skrivningsindikator
9Meddelande uppdaterat eller raderat
11AnyChatMessage — alla chattmeddelanden
12MetaNewComment — ny Instagram/Facebook-kommentar
13MetaCommentStatus — 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)

KodNamn
0NYTT
1FRAMGÅNG
2AVVISAD
3LÄS
4OKÄND
5BEHANDLING
6LEVERERAS
7BLOCKED_BY_USER
8USER_NOT_FOUND

Uppräkningen spänner över 0–11. Värdena 9, 10 och 11 finns i API

men är ännu inte dokumenterade — behandla dem som 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ågaSpecifikationSwaggerHur man kontrollerar
1Auth header för /api/meta/*X-Authorization-Keyendast Bearer deklarerascurl -i -H "X-Authorization-Key: <token>" ".../api/meta/posts?perPage=1" — förvänta 200, inte 401
2Räknarfält i metasvartotalCounttotalSamma begäran — läs root JSON-nyckeln
3author.type typ och reply statuskod"meta_user" / "owner", 202 med kroppint [0,1], 200 utan kroppcurl -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 alla 2xx som framgång, kräver ingen kropp, ta slutstatus från source: 13 återuppringning.

Implementeringsnoteringar

  • Autentiseringen skiljer sig per slutpunktsgrupp — /api/meta/* använder X-Authorization-Key, chattar och operatörer använder Bearer, restapi accepterar antingen.
  • Pginering stavas på två sätt — per_page på /api/chat/chats, perPage på /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 vanligtvis null på Instagram. Identifiera kunden med instagramUser.id / metaUserId och butiken av instaAccount.id (filtreringsvärdet entityId).
  • Story.Id från en återuppringning kan skickas direkt tillbaka som id / postId till Meta API.
  • Kontrollera operatörens JWT
    expiresAt innan du använder den i en djuplänk eller widgeten.