Meddelanden & konversationer
Messages API låter dig skicka ett meddelande till vilken kontakt som helst, läsa en konversation, korrigera eller ta bort ett meddelande du redan skickat, reagera på ett, hämta en fullständig chatt-tråd, exportera en transkription och markera chattar som lästa eller olästa — allt utan att öppna inkorgen.
Alla sökvägar på denna sida är relativa till bas-URL:en https://api.youraiconnector.com/v1. Varje anrop kräver din API-nyckel — se Autentisering för en fullständig lista över hur den kan skickas. Exemplen nedan använder headern X-API-Key, där ett cURL-exempel även visar frågeformuläret ?apiKey=.
Hur leverans fungerar: Att skicka ett meddelande innebär inte att du väntar på att det ska komma fram. API:et tar emot ditt meddelande, svarar omedelbart med ett meddelande-ID och levererar det sedan i bakgrunden via kontaktens kanal (WhatsApp, SMS, Instagram, och så vidare). För att spåra om ett meddelande faktiskt har levererats eller lästs, lyssna efter statusuppdateringar med Webhooks — polla inte. Svaret vid sändning bekräftar endast att meddelandet har tagits emot.
Skicka ett meddelande
Det finns två sätt att skicka. Välj det som passar hur du redan identifierar kontakten:
- Skicka via kontakt-ID — du känner redan till kontaktens ID (till exempel om du skapade kontakten via API:et eller fick det från en webhook). Använd
POST /contacts/{contactId}/send-message. - Skicka via kontaktidentitet — du känner till kontaktens telefonnummer, Instagram-ID, etc., men inte deras interna ID. Använd
POST /contacts/sendoch låt plattformen hitta rätt kontakt.
Båda köar meddelandet på samma sätt och levererar det via den kanal kontakten använder. Du väljer inte transport — plattformen dirigerar WhatsApp-kontakter via WhatsApp, SMS-kontakter via SMS, och så vidare.
Skicka via kontakt-ID
POST /contacts/{contactId}/send-message
| Fält | Krävs | Beskrivning |
|---|---|---|
body |
Ja | Meddelandetexten som ska skickas. |
mediaUrl |
Nej | URL till en mediefil (bild, dokument, etc.) som ska bifogas. |
mediaContentType |
Nej | MIME-typ för den bifogade filen, t.ex. image/jpeg. |
pauseBot |
Nej | true pausar AI:n för denna kontakt när meddelandet skickas — för när en människa tar över. Se Pausa eller återuppta AI:n. |
clearIncompleteReply |
Nej | true kastar ett halvfärdigt botsvar så att det inte återupptas efter ditt meddelande. |
cURL
curl -X POST "https://api.youraiconnector.com/v1/contacts/contact123/send-message" \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"body": "Hi! Your appointment is confirmed for tomorrow at 10:00."
}'
JavaScript
const res = await fetch(
"https://api.youraiconnector.com/v1/contacts/contact123/send-message",
{
method: "POST",
headers: {
"X-API-Key": "YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
body: "Hi! Your appointment is confirmed for tomorrow at 10:00.",
}),
}
);
const data = await res.json();
console.log(data.messageId);
Python
import requests
res = requests.post(
"https://api.youraiconnector.com/v1/contacts/contact123/send-message",
headers={
"X-API-Key": "YOUR_API_KEY",
"Content-Type": "application/json",
},
json={"body": "Hi! Your appointment is confirmed for tomorrow at 10:00."},
)
print(res.json()["messageId"])
Svar (200 OK):
{
"success": true,
"messageId": "aB3dE5fG7hI9jK1lM2nO",
"contactId": "contact123",
"channel": "whatsapp",
"message": "Message created successfully. Delivery is being processed."
}
Skicka via kontaktidentitet
POST /contacts/send
Använd detta när du inte har kontaktens interna ID. Ange meddelandet body plus antingen ett contact_id, eller ett channel tillsammans med identitetsfältet som matchar den kanalen.
| Fält | Krävs | Beskrivning |
|---|---|---|
body |
Ja | Meddelandetexten som ska skickas. |
contact_id |
Nej | ID för en befintlig kontakt. När detta är inställt behövs inte identitetsfälten nedan. |
channel |
Nej | Kanal att skicka via. Krävs när contact_id inte anges. En av de 14 utgående kanalerna: whatsapp, whatsapp_web, sms, instagram, instagram_private, messenger, telegram, chat-widget, custom, email, line, imessage, linkedin, viber. |
phone_number |
Nej | Kontaktens telefonnummer i internationellt format. Används med whatsapp, whatsapp_web och sms. |
instagram_id |
Nej | Kontaktens Instagram-användar-ID. Används med instagram. |
messenger_id |
Nej | Kontaktens Messenger-användar-ID. Används med messenger. |
telegram_user_id |
Nej | Kontaktens Telegram-användar-ID. Används med telegram. |
media_url |
Nej | URL till en mediefil som ska bifogas. |
media_content_type |
Nej | MIME-typ för bifogad media, t.ex. image/jpeg. |
Vilka kanaler som kan identifieras via identitet. Endast sex av de 14 accepterar ett identitetsfält istället för ett contact_id: whatsapp, whatsapp_web och sms slås upp via phone_number, instagram via instagram_id, messenger via messenger_id, och telegram via telegram_user_id. De övriga åtta — instagram_private, chat-widget, custom, email, line, imessage, linkedin och viber — har ingen publik identitet att slå upp, så att skicka via dessa kanaler kräver contact_id; om du bara skickar channel returneras ett 400 som meddelar att contact_id krävs.
cURL (använder frågeformuläret ?apiKey=)
curl -X POST "https://api.youraiconnector.com/v1/contacts/send?apiKey=YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"channel": "whatsapp",
"phone_number": "+31612345678",
"body": "Hi! Your appointment is confirmed."
}'
JavaScript
const res = await fetch("https://api.youraiconnector.com/v1/contacts/send", {
method: "POST",
headers: {
"X-API-Key": "YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
channel: "whatsapp",
phone_number: "+31612345678",
body: "Hi! Your appointment is confirmed.",
}),
});
const data = await res.json();
console.log(data.message_id, data.channel);
Python
import requests
res = requests.post(
"https://api.youraiconnector.com/v1/contacts/send",
headers={
"X-API-Key": "YOUR_API_KEY",
"Content-Type": "application/json",
},
json={
"channel": "whatsapp",
"phone_number": "+31612345678",
"body": "Hi! Your appointment is confirmed.",
},
)
data = res.json()
print(data["message_id"], data["channel"])
Svar (201 Created):
{
"success": true,
"message_id": "aB3dE5fG7hI9jK1lM2nO",
"contact_id": "contact123",
"channel": "whatsapp"
}
Varför ett meddelande kan avvisas: En kontakt med stör ej-läge eller privat läge aktiverat kan inte ta emot utgående meddelanden — begäran misslyckas med ett
422. Om ingen kontakt matchar ID:t eller identiteten du angav får du ett404.
Lista en kontakts meddelanden
GET /contacts/{contactId}/messages
Returnerar en kontakts meddelanden, nyast först, med markörbaserad paginering.
| Frågeparameter | Krävs | Beskrivning |
|---|---|---|
limit |
Nej | Sidstorlek. Standard 50, max 100. |
cursor |
Nej | next_cursor-värdet från ett tidigare svar. Returnerar meddelanden äldre än markören. |
filter |
Nej | Filtrera efter innehållstyp: all (standard), text, media eller tool_use. |
direction |
Nej | Filtrera efter riktning: all (standard), inbound (mottaget från kontakten) eller outbound (skickat av dig). |
Notering om filtrering och paginering:
filter- ochdirection-filtren tillämpas på varje sida efter att den lästs, så en filtrerad sida kan innehålla färre objekt änlimit.next_cursorfortsätter fortfarande genom hela konversationen, så fortsätt paginera tillsnext_cursorärnull.
cURL
curl "https://api.youraiconnector.com/v1/contacts/contact123/messages?limit=50&direction=inbound" \
-H "X-API-Key: YOUR_API_KEY"
JavaScript
const params = new URLSearchParams({ limit: "50", direction: "inbound" });
const res = await fetch(
`https://api.youraiconnector.com/v1/contacts/contact123/messages?${params}`,
{ headers: { "X-API-Key": "YOUR_API_KEY" } }
);
const data = await res.json();
console.log(data.messages, data.next_cursor);
Python
import requests
res = requests.get(
"https://api.youraiconnector.com/v1/contacts/contact123/messages",
headers={"X-API-Key": "YOUR_API_KEY"},
params={"limit": 50, "direction": "inbound"},
)
data = res.json()
print(data["messages"], data["next_cursor"])
Svar (200 OK):
{
"success": true,
"contact_id": "contact123",
"messages": [
{
"id": "aB3dE5fG7hI9jK1lM2nO",
"body": "Hi! Thanks for reaching out.",
"direction": "inbound",
"channel": "whatsapp",
"status": "delivered",
"type": null,
"timestamp": "2026-06-01T10:00:00.000Z",
"media_url": null,
"media_content_type": null,
"bot_reply": false
}
],
"next_cursor": "cD4eF6gH8iJ0kL2mN3oP"
}
Meddelandefält
| Fält | Beskrivning |
|---|---|
id |
Unikt ID för meddelandet. |
body |
Textinnehåll i meddelandet. |
direction |
inbound (mottaget från kontakten) eller outbound (skickat av ditt konto). |
channel |
Kanal som meddelandet skickades eller mottogs på (t.ex. whatsapp, sms, instagram). |
status |
Aktuell leveransstatus, t.ex. Created, sent, delivered, read, failed. |
type |
Meddelandetyp. Vanliga textmeddelanden har typen null; automatiserad assistentverktygsaktivitet markeras som tool_use. |
timestamp |
ISO 8601-tid då meddelandet skapades. |
media_url |
URL till en bifogad mediefil, om någon. |
media_content_type |
MIME-typ för bifogad media, om någon. |
bot_reply |
true när meddelandet genererades av AI-assistenten. |
score |
Ditt betyg av meddelandet: 1 tumme upp, -1 tumme ned, 0 när det inte har betygsatts. Se Betygsätt eller stjärnmarkera ett meddelande. |
is_important |
true när meddelandet har stjärnmarkerats. |
is_deleted |
true när meddelandet har tagits bort. Borttagna meddelanden stannar kvar i listan men deras body och media_url är tomma. |
reactions |
Emoji-reaktioner på meddelandet, från båda sidor. Alltid en array — tom när det inte finns några. Varje post har emoji, from_phone_number, from_me (true när reaktionen är din) och reacted_at. |
Lista chattsessioner
En chattsession är ett konversationsfönster med en kontakt: det öppnas när de börjar prata och stängs när konversationen är avslutad. Sessioner är hur du delar upp en lång historik i läsbara konversationer istället för en oändlig lista.
Senaste sessioner för alla kontakter
GET /chat-sessions/recent
Returnerar de sessioner som startade under de senaste X timmarna, nyast först, för varje kontakt på kontot.
| Frågeparameter | Krävs | Beskrivning |
|---|---|---|
hours |
Ja | Hur många timmar att se tillbaka. Måste vara ett positivt heltal. |
status |
Nej | Returnera endast sessioner med denna status: ChatSessionOpened eller ChatSessionClosed. |
limit |
Nej | Maximalt antal sessioner att returnera. Standard 100, maximalt 100. |
includeMessages |
Nej | true lägger till en messages-array till varje session. Avstängd som standard eftersom det gör svaret mycket större. |
cURL
curl "https://api.youraiconnector.com/v1/chat-sessions/recent?hours=24&status=ChatSessionClosed" \
-H "X-API-Key: YOUR_API_KEY"
JavaScript
const params = new URLSearchParams({ hours: "24", status: "ChatSessionClosed" });
const res = await fetch(`https://api.youraiconnector.com/v1/chat-sessions/recent?${params}`, {
headers: { "X-API-Key": "YOUR_API_KEY" },
});
const data = await res.json();
console.log(data.data.total_sessions, data.data.sessions);
Python
import requests
res = requests.get(
"https://api.youraiconnector.com/v1/chat-sessions/recent",
headers={"X-API-Key": "YOUR_API_KEY"},
params={"hours": 24, "status": "ChatSessionClosed"},
)
data = res.json()["data"]
print(data["total_sessions"], data["sessions"])
Svar (200 OK):
{
"success": true,
"data": {
"hours_ago": 24,
"total_sessions": 2,
"sessions": [
{
"session_id": "session456",
"contact_id": "contact123",
"contact_name": "Jane Doe",
"contact_phone": "+31612345678",
"contact_email": "jane@example.com",
"start_date_time": "2026-06-01T09:55:00.000Z",
"end_date_time": "2026-06-01T10:20:00.000Z",
"status": "ChatSessionClosed",
"tag": "Booking enquiry"
}
]
}
}
Alla sessioner för en kontakt
GET /chat-sessions/{contactId}
Returnerar varje chattsession för en enskild kontakt. Samma parametrar status, limit och includeMessages som ovan — hours gäller inte här.
cURL
curl "https://api.youraiconnector.com/v1/chat-sessions/contact123?limit=20" \
-H "X-API-Key: YOUR_API_KEY"
Svar (200 OK):
{
"success": true,
"data": {
"contact_id": "contact123",
"contact_name": "Jane Doe",
"total_sessions": 2,
"sessions": [
{
"id": "session456",
"start_date_time": "2026-06-01T09:55:00.000Z",
"end_date_time": "2026-06-01T10:20:00.000Z",
"status": "ChatSessionClosed",
"tag": "Booking enquiry"
}
]
}
}
Fältnamn för sessions-ID skiljer sig mellan de två slutpunkterna. Listan över senaste sessioner kallar det
session_id(det innehåller även kontaktens detaljer, eftersom sessioner kommer från många kontakter); listan per kontakt kallar detid. Vilket värde som helst är det du skickar som{sessionId}när du hämtar hela tråden nedan.
När includeMessages=true, får varje session en messages-array vars poster innehåller id, body, direction, timestamp, type, channel och status.
Hämta en chatt-sessionstråd
GET /contacts/{contactId}/chat-sessions/{sessionId}/messages
En chattsession grupperar en kontakts meddelanden i ett konversationsfönster. Denna slutpunkt returnerar hela tråden för en enskild session, äldst först, tillsammans med sessionens metadata. Du kan hitta sessions-ID:n för en kontakt via slutpunkterna för chattsessioner.
cURL
curl "https://api.youraiconnector.com/v1/contacts/contact123/chat-sessions/session456/messages" \
-H "X-API-Key: YOUR_API_KEY"
JavaScript
const res = await fetch(
"https://api.youraiconnector.com/v1/contacts/contact123/chat-sessions/session456/messages",
{ headers: { "X-API-Key": "YOUR_API_KEY" } }
);
const data = await res.json();
console.log(data.session, data.messages);
Python
import requests
res = requests.get(
"https://api.youraiconnector.com/v1/contacts/contact123/chat-sessions/session456/messages",
headers={"X-API-Key": "YOUR_API_KEY"},
)
data = res.json()
print(data["session"], data["messages"])
Svar (200 OK):
{
"success": true,
"contact_id": "contact123",
"session": {
"id": "session456",
"status": "ChatSessionClosed",
"start_date_time": "2026-06-01T09:55:00.000Z",
"end_date_time": "2026-06-01T10:20:00.000Z",
"tag": "Booking enquiry"
},
"messages": [
{
"id": "aB3dE5fG7hI9jK1lM2nO",
"body": "Hi! Thanks for reaching out.",
"direction": "inbound",
"channel": "whatsapp",
"status": "delivered",
"type": null,
"timestamp": "2026-06-01T09:55:00.000Z",
"media_url": null,
"media_content_type": null,
"bot_reply": false
}
]
}
Objektet session rapporterar status (ChatSessionOpened medan aktiv, ChatSessionClosed när den avslutats), start_date_time, end_date_time och en läsbar tag. Matrisen messages använder samma meddelandefält som listslutpunkten.
Redigera, ta bort och reagera på meddelanden
Dessa slutpunkter ändrar ett meddelande efter att det har skickats. Två av dem når ut till kontaktens kanal såväl som din egen kopia, så läs sektionsintroduktionen innan du kopplar ihop dem — vad som är möjligt beror helt på vilken kanal konversationen sker på.
Vad varje kanal tillåter
| Åtgärd | Kanaler som kan ändra kontaktens kopia | Tidsgräns |
|---|---|---|
| Redigera ett skickat meddelande | Chattwidget, WhatsApp Web, Telegram, LinkedIn | Ingen för chattwidget, 15 minuter på WhatsApp Web, 48 timmar på Telegram, 60 minuter på LinkedIn |
| Ta bort för alla | Chattwidget, WhatsApp Web, Telegram, LinkedIn | 60 minuter på LinkedIn; de andra har ingen publicerad gräns |
| Reagera med en emoji | WhatsApp Web, Telegram | Ingen |
På alla andra kanaler — WhatsApp Business API, SMS, Instagram, Messenger, e-post, LINE, anpassade kanaler — tar en borttagning fortfarande bort meddelandet från din inkorg, men kontakten behåller sin kopia, och det är inte möjligt att redigera eller reagera alls.
Redigera ett meddelande
POST /contacts/{contactId}/messages/{messageId}/edit
Skriver om ett meddelande du redan har skickat, på kontaktens enhet och i din kopia.
| Fält | Krävs | Beskrivning |
|---|---|---|
body |
Ja | Den nya meddelandetexten. Får inte vara tom och kan vara högst 4096 tecken. |
Till skillnad från borttagning misslyckas detta tydligt när kanalen nekar: du får ett 409 och din kopia lämnas exakt som kontakten har den, eftersom att visa en redigering de aldrig tog emot skulle göra att de två sidorna inte stämmer överens. Fältet edit_reason talar om varför — kanalens redigeringsfönster har stängts, kanalen är frånkopplad eller något annat gick fel.
cURL
curl -X POST "https://api.youraiconnector.com/v1/contacts/contact123/messages/msg_1/edit" \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "body": "Sorry - I meant Thursday at 3pm." }'
JavaScript
const res = await fetch(
"https://api.youraiconnector.com/v1/contacts/contact123/messages/msg_1/edit",
{
method: "POST",
headers: {
"X-API-Key": "YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({ body: "Sorry - I meant Thursday at 3pm." }),
}
);
const data = await res.json();
console.log(data.edited, data.edit_reason);
Python
import requests
res = requests.post(
"https://api.youraiconnector.com/v1/contacts/contact123/messages/msg_1/edit",
headers={
"X-API-Key": "YOUR_API_KEY",
"Content-Type": "application/json",
},
json={"body": "Sorry - I meant Thursday at 3pm."},
)
data = res.json()
print(data.get("edited"), data.get("edit_reason"))
Svar (200 OK):
{
"success": true,
"contact_id": "contact123",
"message_id": "msg_1",
"edited": true,
"edit_reason": "edit_dispatched"
}
Om kanalen inte accepterar redigeringen får du ett 409 istället, och ingenting ändrades:
{
"success": false,
"error": "The message could not be edited",
"edit_reason": "channel_disconnected"
}
Ett meddelande som redan har tagits bort, en kanal som inte kan redigera alls, och ett meddelande som är för gammalt för sin kanal returnerar alla 400 — förfrågan når aldrig kanalen.
Ta bort ett meddelande
DELETE /contacts/{contactId}/messages/{messageId}
Tar bort meddelandet från din konversation och, där kanalen tillåter det, drar även tillbaka kontaktens kopia. Ingen förfrågningskropp.
Detta svarar alltid 200 när meddelandet existerade, även om kontaktens kopia inte kunde dras tillbaka — din kopia är borta, så ett felmeddelande skulle vara missvisande. Läs de tre fälten i svaret för att berätta för användaren vad som faktiskt hände:
| Fält | Beskrivning |
|---|---|
revoke_supported |
Huruvida denna kanal överhuvudtaget kan dra tillbaka meddelanden. |
revoked |
Huruvida kopian på kontaktens enhet togs bort. |
revoke_reason |
Varför den inte togs bort, när revoked är false — till exempel revoke_window_closed eller already_deleted. |
cURL
curl -X DELETE "https://api.youraiconnector.com/v1/contacts/contact123/messages/msg_1" \
-H "X-API-Key: YOUR_API_KEY"
JavaScript
const res = await fetch(
"https://api.youraiconnector.com/v1/contacts/contact123/messages/msg_1",
{ method: "DELETE", headers: { "X-API-Key": "YOUR_API_KEY" } }
);
const data = await res.json();
console.log(data.revoked, data.revoke_reason);
Python
import requests
res = requests.delete(
"https://api.youraiconnector.com/v1/contacts/contact123/messages/msg_1",
headers={"X-API-Key": "YOUR_API_KEY"},
)
data = res.json()
print(data["revoked"], data["revoke_reason"])
Svar (200 OK):
{
"success": true,
"contact_id": "contact123",
"message_id": "msg_1",
"revoke_supported": true,
"revoked": true,
"revoke_reason": "revoke_dispatched"
}
Borttagna meddelanden tas inte bort från konversationshistoriken. De stannar kvar i
GET /contacts/{contactId}/messagesmedis_deleted: trueoch ett tomtbodyochmedia_url.
Ta bort flera meddelanden samtidigt
POST /contacts/{contactId}/messages/bulk-delete
Rensar en grupp meddelanden endast från din sida. Innehållet och bilagorna töms, men ingenting dras tillbaka på kontaktens enhet – för att även dra tillbaka ett meddelande, ta bort det ett i taget med slutpunkten för enstaka meddelanden ovan.
| Fält | Krävs | Beskrivning |
|---|---|---|
message_ids |
Ja | En icke-tom matris med meddelande-ID:n, upp till 500 per begäran. messageIds accepteras som ett alias. |
cURL
curl -X POST "https://api.youraiconnector.com/v1/contacts/contact123/messages/bulk-delete" \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "message_ids": ["msg_1", "msg_2"] }'
JavaScript
const res = await fetch(
"https://api.youraiconnector.com/v1/contacts/contact123/messages/bulk-delete",
{
method: "POST",
headers: {
"X-API-Key": "YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({ message_ids: ["msg_1", "msg_2"] }),
}
);
console.log((await res.json()).deleted);
Python
import requests
res = requests.post(
"https://api.youraiconnector.com/v1/contacts/contact123/messages/bulk-delete",
headers={
"X-API-Key": "YOUR_API_KEY",
"Content-Type": "application/json",
},
json={"message_ids": ["msg_1", "msg_2"]},
)
print(res.json()["deleted"])
Svar (200 OK):
{
"success": true,
"contact_id": "contact123",
"deleted": 2
}
Reagera på ett meddelande
POST /contacts/{contactId}/messages/{messageId}/react
Placerar din egen emoji-reaktion på ett meddelande, eller tar tillbaka den genom att skicka en tom sträng. Kontaktens egna reaktioner rörs aldrig.
| Fält | Krävs | Beskrivning |
|---|---|---|
emoji |
Ja | Emojin att reagera med, eller "" för att ta bort din reaktion. Måste vara en enstaka sträng utan mellanslag, högst 16 tecken lång. |
Precis som vid redigering misslyckas detta hellre än att visa en reaktion som kontakten aldrig fick, och felet talar om för dig om det är värt att försöka igen:
422— det kan aldrig levereras i denna konversation: kanalen stöder inte reaktioner, meddelandet har inget kanal-ID, eller emojin ligger utanför den uppsättning som kanalen tillåter.409— kanalen var tillfälligt oåtkomlig. Ett nytt försök kan fungera.
cURL
curl -X POST "https://api.youraiconnector.com/v1/contacts/contact123/messages/msg_1/react" \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "emoji": "👍" }'
JavaScript
const res = await fetch(
"https://api.youraiconnector.com/v1/contacts/contact123/messages/msg_1/react",
{
method: "POST",
headers: {
"X-API-Key": "YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({ emoji: "👍" }),
}
);
const data = await res.json();
console.log(data.reactions);
Python
import requests
res = requests.post(
"https://api.youraiconnector.com/v1/contacts/contact123/messages/msg_1/react",
headers={
"X-API-Key": "YOUR_API_KEY",
"Content-Type": "application/json",
},
json={"emoji": "👍"},
)
print(res.json()["reactions"])
Svar (200 OK):
{
"success": true,
"contact_id": "contact123",
"message_id": "msg_1",
"reaction_supported": true,
"reaction_reason": "reaction_dispatched",
"reactions": [
{
"emoji": "👍",
"from_phone_number": "+31612345678",
"from_me": true,
"reacted_at": "2026-06-01T10:05:00.000Z"
}
]
}
Matrisen reactions är den fullständiga uppsättningen reaktioner som nu finns på meddelandet, både dina och kontaktens. Vid ett 409 eller 422 returneras den oförändrad, så en klient som renderar direkt från den visar aldrig en reaktion som inte levererades.
Betygsätt eller stjärnmarkera ett meddelande
PATCH /contacts/{contactId}/messages/{messageId}
Betygsätter ett meddelande med tumme upp eller tumme ner och/eller stjärnmarkerar det som viktigt. Detta är endast bokföring på din sida – ingenting skickas till kontakten.
| Fält | Krävs | Beskrivning |
|---|---|---|
score |
Nej | 1 tumme upp, -1 tumme ner, 0 rensar betyget. |
is_important |
Nej | true stjärnmarkerar meddelandet, false tar bort stjärnan. Måste vara ett faktiskt booleskt värde, inte strängen "true". |
Skicka minst ett av de två, annars får du ett 400. Endast det du skickar skrivs, så att stjärnmarkera ett meddelande rensar aldrig dess betyg och vice versa — och svaret återspeglar endast de fält du skickade.
cURL
curl -X PATCH "https://api.youraiconnector.com/v1/contacts/contact123/messages/msg_1" \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "score": 1, "is_important": true }'
JavaScript
await fetch("https://api.youraiconnector.com/v1/contacts/contact123/messages/msg_1", {
method: "PATCH",
headers: {
"X-API-Key": "YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({ score: 1, is_important: true }),
});
Python
import requests
requests.patch(
"https://api.youraiconnector.com/v1/contacts/contact123/messages/msg_1",
headers={"X-API-Key": "YOUR_API_KEY"},
json={"score": 1, "is_important": True},
)
Svar (200 OK):
{
"success": true,
"contact_id": "contact123",
"message_id": "msg_1",
"score": 1,
"is_important": true
}
Markera meddelanden som lästa
Du kan rensa oläst-statusen antingen för specifika meddelanden eller för hela konversationen.
Markera specifika meddelanden som lästa
POST /contacts/{contactId}/messages/mark-read
Skicka med ID:n för de meddelanden som ska markeras som lästa.
| Fält | Krävs | Beskrivning |
|---|---|---|
message_ids |
Ja | En icke-tom matris med meddelande-ID:n (upp till 500 per förfrågan). |
cURL
curl -X POST "https://api.youraiconnector.com/v1/contacts/contact123/messages/mark-read" \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"message_ids": ["aB3dE5fG7hI9jK1lM2nO", "cD4eF6gH8iJ0kL2mN3oP"]
}'
JavaScript
const res = await fetch(
"https://api.youraiconnector.com/v1/contacts/contact123/messages/mark-read",
{
method: "POST",
headers: {
"X-API-Key": "YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
message_ids: ["aB3dE5fG7hI9jK1lM2nO", "cD4eF6gH8iJ0kL2mN3oP"],
}),
}
);
const data = await res.json();
console.log(data.marked_read);
Python
import requests
res = requests.post(
"https://api.youraiconnector.com/v1/contacts/contact123/messages/mark-read",
headers={
"X-API-Key": "YOUR_API_KEY",
"Content-Type": "application/json",
},
json={"message_ids": ["aB3dE5fG7hI9jK1lM2nO", "cD4eF6gH8iJ0kL2mN3oP"]},
)
print(res.json()["marked_read"])
Svar (200 OK):
{
"success": true,
"contact_id": "contact123",
"marked_read": 2
}
Markera hela chatten som läst
POST /contacts/{contactId}/mark-read
Rensar oläst-markeringen för kontaktens hela konversation i inkorgen. Ingen förfrågningskropp krävs.
cURL
curl -X POST "https://api.youraiconnector.com/v1/contacts/contact123/mark-read" \
-H "X-API-Key: YOUR_API_KEY"
JavaScript
const res = await fetch(
"https://api.youraiconnector.com/v1/contacts/contact123/mark-read",
{ method: "POST", headers: { "X-API-Key": "YOUR_API_KEY" } }
);
const data = await res.json();
console.log(data.success);
Python
import requests
res = requests.post(
"https://api.youraiconnector.com/v1/contacts/contact123/mark-read",
headers={"X-API-Key": "YOUR_API_KEY"},
)
print(res.json()["success"])
Svar (200 OK):
{
"success": true,
"contact_id": "contact123"
}
Markera hela chatten som oläst
POST /contacts/{contactId}/mark-unread
Sätter tillbaka oläst-markeringen på konversationen — praktiskt när någon i ditt team har öppnat en chatt men lämnar över den igen. Ingen förfrågningskropp krävs.
Detta är en flagga som endast gäller inkorgen: den ändrar inte när konversationen senast lästes, så inget läskvitto skickas till kontakten på kanaler som stöder dem.
cURL
curl -X POST "https://api.youraiconnector.com/v1/contacts/contact123/mark-unread" \
-H "X-API-Key: YOUR_API_KEY"
Svar (200 OK):
{
"success": true,
"contact_id": "contact123"
}
Exportera en konversation
Exporter ger dig en hel konversation som en läsbar transkription, istället för att bläddra igenom meddelanden. Varje export-endpoint accepterar en filter av all (standard), text, media eller tool_use, som matchar filtret i meddelandelistan.
Exportera en kontakts chatt
GET /chat-exports/{contactId}
| Frågeparameter | Krävs | Beskrivning |
|---|---|---|
format |
Nej | txt (standard) returnerar en nedladdningslänk till en transkription i klartext. json returnerar meddelandena som strukturerad data i svaret. |
filter |
Nej | all (standard), text, media eller tool_use. |
cURL
curl "https://api.youraiconnector.com/v1/chat-exports/contact123?format=json" \
-H "X-API-Key: YOUR_API_KEY"
Python
import requests
res = requests.get(
"https://api.youraiconnector.com/v1/chat-exports/contact123",
headers={"X-API-Key": "YOUR_API_KEY"},
params={"format": "json"},
)
print(res.json()["data"]["messages"])
Svar med format=json (200 OK):
{
"success": true,
"data": {
"contact": {
"id": "contact123",
"name": "Jane Doe",
"phone": "+31612345678",
"email": "jane@example.com"
},
"messages": [
{
"body": "Hi! I have a question about my order.",
"direction": "inbound",
"timestamp": "2026-06-01T09:55:00.000Z",
"type": "text",
"media_url": null,
"media_content_type": null,
"name": null,
"args": null
}
]
}
}
Med format=txt (standard), är data istället en nedladdningslänk till den genererade transkriptionsfilen:
{
"success": true,
"data": "https://storage.googleapis.com/.../chat-export-contact123-....txt"
}
Nedladdningslänken är kortlivad. Hämta filen så snart du får länken istället för att lagra den — begär en ny export när du behöver transkriptionen igen.
Exportera alla senaste konversationer
GET /chat-exports/recent
Exporterar konversationer för alla kontakter som varit aktiva under de senaste X timmarna, i ett anrop.
| Frågeparameter | Krävs | Beskrivning |
|---|---|---|
hours |
Ja | Hur många timmars aktivitet som ska sökas igenom. Måste vara ett positivt heltal. |
format |
Nej | json (standard) returnerar en post per kontakt. txt returnerar en enda nedladdningsbar textfil med varje konversation i. |
limit |
Nej | Maximalt antal kontakter att exportera. Standard 50, maximalt 100. |
filter |
Nej | all (standard), text, media eller tool_use. |
cURL
curl "https://api.youraiconnector.com/v1/chat-exports/recent?hours=24&limit=25" \
-H "X-API-Key: YOUR_API_KEY"
Svar (200 OK):
{
"success": true,
"data": {
"hours_ago": 24,
"total_contacts": 2,
"exports": [
{
"contactId": "contact123",
"contactName": "Jane Doe",
"phoneNumber": "+31612345678",
"email": "jane@example.com",
"messageCount": 12,
"chatExport": "Acme Export - Jane Doe\nPhone: +31612345678\n..."
}
]
}
}
Med format=txt är svaret själva textfilen, som skickas som en nedladdning istället för JSON.
Detta anrop hämtar hela historiken för varje matchande kontakt, så håll
hoursochlimitmåttliga på konton med hög aktivitet.
E-posta en transkription till kontakten
POST /chat-exports/{contactId}/email
Skickar kontaktens egen konversationstranskription via e-post — “e-posta mig denna chatt”-flödet, drivet från ditt eget system.
| Fält | Krävs | Beskrivning |
|---|---|---|
recipient_email |
Nej | Vart den ska skickas. Som standard används kontaktens lagrade e-postadress. |
via |
Nej | auto (standard) väljer den bästa vägen, transactional skickar det som ett system-e-postmeddelande, email_channel skickar det från din anslutna e-postkanal. |
note |
Nej | En kort rad från dig som visas ovanför transkriptionen. Upp till 1000 tecken. |
cURL
curl -X POST "https://api.youraiconnector.com/v1/chat-exports/contact123/email" \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "note": "Here is a copy of our chat, as promised." }'
Svar (200 OK):
{
"success": true,
"data": {
"via": "transactional",
"recipientEmail": "jane@example.com",
"messageCount": 42,
"omittedCount": 0
}
}
omittedCount anger hur många av de äldsta meddelandena som utelämnades för att hålla e-postmeddelandet i en rimlig längd. Ett 200 innebär att transkriptionen skapades och köades för sändning, inte att den har landat i inkorgen än.
Pausa eller återuppta AI:n för en kontakt
PUT /contacts/{contactId}
Sätt is_bot_active till false för att stoppa AI:n från att svara en kontakt, och tillbaka till true för att lämna tillbaka konversationen. Detta är växeln du vill använda när en människa kliver in i en konversation: utgående meddelanden som du skickar via API:et levereras fortfarande medan boten är pausad.
cURL
curl -X PUT "https://api.youraiconnector.com/v1/contacts/contact123" \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "is_bot_active": false }'
JavaScript
await fetch("https://api.youraiconnector.com/v1/contacts/contact123", {
method: "PUT",
headers: {
"X-API-Key": "YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({ is_bot_active: false }),
});
Python
import requests
requests.put(
"https://api.youraiconnector.com/v1/contacts/contact123",
headers={"X-API-Key": "YOUR_API_KEY"},
json={"is_bot_active": False},
)
Svar
{
"success": true,
"contact_id": "contact123"
}
Pausa som en del av svaret
Om en människa tar över genom att skicka ett svar kan du pausa boten i samma anrop istället för att göra ett andra anrop. POST /contacts/{contactId}/send-message accepterar två valfria flaggor:
| Fält | Beskrivning |
|---|---|
pauseBot |
true pausar AI:n för denna kontakt när meddelandet skickas. |
clearIncompleteReply |
true kastar ett halvfärdigt botsvar så att det inte återupptas efteråt. |
curl -X POST "https://api.youraiconnector.com/v1/contacts/contact123/send-message" \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"body": "Hi, Sarah here - taking over from the assistant.",
"pauseBot": true,
"clearIncompleteReply": true
}'
Svaret inkluderar "botPaused": true när pausen har tillämpats.
Att markera en kontakt som privat med
POST /contacts/bulk-flagpausar även boten för dem. Se Kontakter för hela listan över fält.
Bygga din egen inkorg
Allt en inkorg behöver finns på denna sida och i Kontakter:
| Vad du behöver | Slutpunkt |
|---|---|
| Lista konversationer | GET /contacts |
| Läs en konversation | GET /contacts/{contactId}/messages |
| Lista en kontakts chattsessioner | GET /chat-sessions/{contactId} |
| Se vad som kom in nyligen | GET /chat-sessions/recent |
| Läs en chattsession | GET /contacts/{contactId}/chat-sessions/{sessionId}/messages |
| Skicka ett manuellt svar | POST /contacts/{contactId}/send-message |
| Korrigera ett svar du precis skickat | POST /contacts/{contactId}/messages/{messageId}/edit |
| Ta bort ett meddelande | DELETE /contacts/{contactId}/messages/{messageId} |
| Rensa flera meddelanden | POST /contacts/{contactId}/messages/bulk-delete |
| Reagera med en emoji | POST /contacts/{contactId}/messages/{messageId}/react |
| Betygsätt eller stjärnmärk ett meddelande | PATCH /contacts/{contactId}/messages/{messageId} |
| Markera som läst | POST /contacts/{contactId}/mark-read |
| Lämna tillbaka en chatt till teamet | POST /contacts/{contactId}/mark-unread |
| Exportera en transkription | GET /chat-exports/{contactId} |
| Pausa eller återuppta AI:n | PUT /contacts/{contactId} med is_bot_active |
För live-uppdateringar, prenumerera på händelserna New Message, Replies, Human Alerted och Chat Concluded med Webhooks istället för att polla detta API med en timer.
Fel i Messages API
Meddelandeslutpunkter returnerar standardfel-kuvertet:
{
"success": false,
"error": "Contact not found"
}
| Status | När det händer på en meddelandeslutpunkt |
|---|---|
400 |
Ett obligatoriskt fält saknas eller en parameter är ogiltig (felaktig limit, hours, filter, direction, status, en tom eller över 500 message_ids-array, en ogiltig cursor, en tom eller för lång redigerings-body, en score utanför -1/0/1, eller en emoji med mellanslag eller över 16 tecken). Returneras även när ett meddelande inte kan redigeras alls — det raderades, dess kanal har ingen redigering, eller det är förbi kanalens redigeringsfönster. |
404 |
Kontakten, chattsessionen eller ett av de angivna meddelande-ID:na hittades inte. |
409 |
Kanalen kunde inte ta emot ändringen just nu. Inget skrevs: vid en redigering anger edit_reason varför; vid en reaktion var kanalen tillfälligt oåtkomlig och ett nytt försök kan fungera. |
422 |
Kontakten kan inte ta emot utgående meddelanden (stör ej, privat eller en kanal som inte stöds), eller en reaktion kan aldrig levereras i denna konversation (reaction_reason anger vilken). |
De delade koderna som alla slutpunkter kan returnera — 401, 403 (din plan inkluderar inte API-åtkomst), 429 (hastighetsbegränsning) och 500 — listas med vägledning för återförsök i Fel & Paginering.