Your AI Connector Docs

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/send och 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.

Båda hittar också bara kontakter som redan finns. Inget av anropen skapar en kontakt: ett ID eller en identitet som inte matchar något returneras som 404, den blir inte en ny kontakt. Så om du skickar meddelanden till någon för första gången, skapa antingen kontakten först med POST /contacts, eller använd Skicka direkt till ett WhatsApp Web-nummer nedan på WhatsApp Web, vilket skapar kontakten i samma anrop.

Skicka via kontakt-ID

POST /contacts/{contactId}/send-message

Fält Krävs Beskrivning
body Ja Meddelandetexten som ska skickas, upp till 65 536 tecken. En brödtext som är längre än vad kanalen tillåter i ett meddelande (1 500 på WhatsApp Business API och SMS, 1 000 på Instagram, 2 000 på Messenger, 4 096 på Telegram och LinkedIn, 5 000 på LINE, 6 000 på TikTok, 7 000 på Viber, 65 536 på WhatsApp Web; ingen gräns för e-post, chattwidgeten och anpassade kanaler) levereras som flera meddelanden i ordningsföljd, uppdelade vid stycke- eller meningsbrytningar. Svaret innehåller då messageIds för varje del och autoSplit: true.
mediaUrl Nej URL till en mediafil (bild, ljud, video, dokument) som ska bifogas.
mediaContentType Nej MIME-typ för bifogad media, t.ex. image/jpeg. Räknas ut från URL:ens filändelse när den utelämnas (.mp3 → audio/mpeg, .pdf → application/pdf); ange den för en URL utan filändelse.
sendAsVoiceNote Nej Endast WhatsApp Web, endast ljud: leverera ljudet som ett röstmeddelande (uppspelningsbubblan). Ljud som inte är OGG/Opus konverteras vid sändningstillfället. Standardvärdet är false.
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 kasserar ett halvfärdigt botsvar så att det inte återupptas efter ditt meddelande.
human_reply Nej true markerar meddelandet som skrivet av en person i ditt team snarare än av en integration. AI:n behandlar det då som ett svar från en teammedlem i konversationen, och ett svar som AI:n hade köat för kontaktens senaste meddelande avbryts så att kontakten inte får två svar. Det pausar inte AI:n; använd pauseBot för det. Standardvärdet är false.

På LinkedIn levereras ett meddelande som du skickar på detta sätt, eller från inkorgen, även medan en person hanterar tråden på LinkedIn-sidan. AI:ns egna svar och dess uppföljningar hålls tillbaka i en sådan tråd. Ett kvarhållet svar tas bort från chatten istället för att visas som misslyckat, eftersom ingenting skickades och ingen kredit förbrukades. AI:ns sista svar innan den lämnar över en tråd till en person levereras fortfarande.

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, upp till 65 536 tecken. En brödtext som är längre än vad kanalen tillåter i ett meddelande (1 500 på WhatsApp Business API och SMS, 1 000 på Instagram, 2 000 på Messenger, 4 096 på Telegram och LinkedIn, 5 000 på LINE, 6 000 på TikTok, 7 000 på Viber, 65 536 på WhatsApp Web; ingen gräns för e-post, chattwidgeten och anpassade kanaler) levereras som flera meddelanden i ordning, uppdelade vid stycke- eller meningsbrytningar. Svaret innehåller då messageIds för varje del och autoSplit: true.
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 den bifogade median, 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 ett 404.

Skicka via WhatsApp Web: variationer och skydd mot massutskick

Två saker gäller för body när kontakten använder WhatsApp Web.

Spintax-parenteser expanderas vid varje utskick. En body av {Hi|Hello|Hey} there, quick question skickas som en av de tre hälsningsfraserna, vald för just det utskicket — parenteserna når aldrig kontakten. Använd detta för att ge varje kontakt ett unikt öppningsmeddelande från samma integrationskod. Text utan parenteser skickas exakt som den är skriven.

Massutskick av identiska öppningsmeddelanden nekas. Om tio nästan identiska öppningsmeddelanden skickas från ett WhatsApp Web-nummer inom en timme till kontakter som aldrig har skrivit till dig, kommer efterföljande meddelanden inte att levereras: utskicket accepteras som vanligt (du får fortfarande en messageId), och meddelandet lämnas sedan med status: "failed" och error_code: "opener_burst", med en förklaring som är läsbar för kunden. Att försöka skicka samma text igen hjälper inte — variera texten, vänta en timme och skicka igen. Svar i befintliga konversationer påverkas aldrig. Motiveringen finns i Identiska öppningsmeddelanden leder till begränsade nummer.

Skicka direkt till ett WhatsApp Web-nummer

POST /whatsapp-web/send

Skicka till ett telefonnummer på WhatsApp Web utan att först leta upp en kontakt. Om numret inte är en kontakt ännu, skapas kontakten i samma anrop, med AI:n avstängd för den, så att meddelandet ser ut som ett du skickat manuellt och ingen assistent tar över konversationen efteråt. En befintlig kontakt återanvänds som den är.

Fält Krävs Beskrivning
phoneNumber Ja Numret att skicka meddelande till, i internationellt format (+31612345678).
message Nej Texten som ska skickas. Antingen message eller mediaUrl måste finnas.
mediaUrl Nej Offentlig URL till en fil som ska skickas. Antingen message eller mediaUrl måste finnas.
mediaContentType Nej MIME-typ för filen, till exempel image/jpeg. Räknas ut från URL:en om du utelämnar den.
sendAsVoiceNote Nej true skickar en ljudfil som ett röstmeddelande istället för som en bilaga.
fromPhoneNumber Nej Vilket av dina anslutna WhatsApp Web-nummer som ska användas för att skicka, i internationellt format. Standard är det nummer kontakten redan tillhör.
campaignId Nej Använd aktiva timmar från denna Agent istället för kontots standard. Måste vara en Agent på samma konto.
ignoreActiveHours Nej true skickar omedelbart, oavsett vad de aktiva timmarna säger.
sub_account_id Nej För byråer: skicka å en av dina klientkontons vägnar.
curl -X POST "https://api.youraiconnector.com/v1/whatsapp-web/send?apiKey=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "phoneNumber": "+31612345678",
    "message": "Hi Alex, your quote is ready."
  }'

Ett lyckat anrop svarar med 202:

{ "success": true, "queued": true, "contactId": "abc123" }

202 betyder accepterat, men ännu inte levererat. Utanför aktiva timmar hålls sändningen och skickas vid nästa tillåtna tidpunkt, såvida du inte skickade med ignoreActiveHours. Läs av meddelandets egen status med Lista en kontakts meddelanden genom att använda contactId som du fick här.

När det inte går igenom:

Status Kod Vad hände
400 INVALID_PHONE_FORMAT Numret är inte i internationellt format, eller phoneNumber saknas, eller både message och mediaUrl saknas.
400 CONTACT_DND Kontakten har Stör ej aktiverat, så inget utgående skickas till dem.
400 CONTACT_PRIVATE Kontakten är markerad som privat.
404 CAMPAIGN_NOT_FOUND Ingen Agent matchar campaignId som du angav.
403 CAMPAIGN_FORBIDDEN Den Agenten tillhör ett annat konto.
402 Kontot har inga krediter kvar, eller inget WhatsApp Web-nummer är anslutet.

Ett andra anrop för samma kontakt medan en sändning fortfarande väntar svarar med 409, så en kö byggs aldrig upp bakom en person.


Logga en anteckning i en konversation

POST /contacts/notes

Lägger till en rad i en kontakts konversation utan att skicka den. Använd den för kontext som ditt team och AI:n bör ha, men som kontakten aldrig bör se: en sammanfattning av ett telefonsamtal som din röstassistent precis genomfört, en kommentar från ditt CRM eller en anteckning från en kollega. Det fungerar i alla kanaler (WhatsApp, SMS, Instagram, Messenger, Telegram, chattwidgeten, anpassade kanaler och så vidare).

Vad händer med en anteckning:

  • Den visas i chatten i inkorgen som ett gult Anteckning-kort, med författaren om du angav en.
  • AI:n läser den som en del av konversationshistoriken, markerad som en intern anteckning, så att dess nästa svar tar hänsyn till den.
  • Den skickas aldrig till kontakten, kostar inga meddelandekrediter och utlöser ingenting: inget AI-svar, ingen automatisering, ingen webhook, ingen avisering, ingen oläst-ikon. Den pausar inte AI:n och räknas inte som ett svar från ditt team.

Hitta kontakten på samma sätt som Skicka via kontaktidentitet: antingen dess ID, eller en channel plus den matchande identifieraren. En anteckning går endast till en kontakt som redan finns; om inget matchar är det ett 404.

Fält Obligatoriskt Beskrivning
contact_id Ett av två Kontaktens ID.
channel + identifier Ett av två channel plus phone_number (WhatsApp, WhatsApp Web, SMS), instagram_id, messenger_id eller telegram_user_id, enligt Skicka via kontaktidentitet.
body Ja Anteckningstexten, upp till 4 000 tecken. Radbrytningar bevaras.
author Nej Vem eller vad som skrev den, upp till 80 tecken, till exempel Voice agent eller Sarah (sales). Visas på kortet och för AI:n.
timestamp Nej När det hände, i epok-millisekunder. Standardvärdet är nu. Använd samtalets sluttid så att anteckningen hamnar på rätt plats i tråden. Den kan inte vara mer än 5 minuter i framtiden; en senare tidpunkt avvisas med en 400.
external_id Nej Ditt eget ID för denna anteckning, upp till 200 tecken, till exempel samtals-ID. Om du skickar samma external_id för samma kontakt igen läggs ingen andra anteckning till; svaret innehåller då duplicate: true. Använd det så att en återsänd webhook inte kan logga samma samtal två gånger.

cURL

curl -X POST "https://api.youraiconnector.com/v1/contacts/notes" \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "channel": "whatsapp",
    "phone_number": "+31612345678",
    "author": "Voice agent",
    "body": "Voice call, 3:12. Asked about knee surgery waiting times, prefers a call back on Tuesday morning.",
    "external_id": "call_8f2k1"
  }'

Svar (201, eller 200 med duplicate: true när external_id redan var loggad)

{
  "success": true,
  "messageId": "note_4c1f0e...",
  "contactId": "contact123"
}

En anteckning visas i Lista en kontakts meddelanden med type: "note".

Generera ett svarsutkast med AI

POST /contacts/{contactId}/draft-reply

Ber AI-agenten som hanterar en konversation att skriva nästa svar och returnerar texten till dig. Ingenting skickas. Det är samma utkast som knappen Generera svar i inkorgen skapar: agenten använder sin konfiguration, sin kunskapsdatabas och konversationen hittills, och svarar på kontaktens språk. Använd detta för att placera en människa (eller din egen app) mellan AI:n och kontakten: hämta utkastet, visa det för godkännande och skicka det sedan med Skicka via kontakt-ID, antingen ändrat eller som det är.

  • Utkastet skrivs av agenten som är tilldelad kontakten. En kontakt som ännu inte har någon agent får den agent som skulle ha besvarat nästa meddelande.
  • Under utkastprocessen kör agenten inga verktyg eller funktioner, så inga bokningar, taggar, överlämningar eller andra åtgärder utförs.
  • Ingenting sparas i konversationen och kontakten ser ingenting.
  • Ett utkast kostar lika många krediter som ett AI-svar från den agenten i denna konversation, och ingenting när din egen AI-nyckel är ansluten.
  • Konversationen måste innehålla minst ett meddelande.

Alla brödtextfält är valfria; en tom brödtext (eller ingen brödtext) skapar ett utkast för nästa svar.

Fält Krävs Beskrivning
instruction Nej En engångsinstruktion för detta utkast, upp till 2 000 tecken, samma som att långtrycka på Generera svar i inkorgen. Till exempel Offer Tuesday at 3pm eller Ask for their email address.
campaign_id Nej Skapa utkast under denna kampanj istället för kontaktens agent.
purpose Nej chat_reply (standard) skriver ett meddelande till kontakten. faq_answer skriver ett kort svar på kontaktens fråga som fungerar fristående, för en FAQ i kunskapsdatabasen.

cURL

curl -X POST "https://api.youraiconnector.com/v1/contacts/contact123/draft-reply" \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "instruction": "Offer Tuesday at 3pm for the consultation" }'

Svar (200)

{
  "success": true,
  "contact_id": "contact123",
  "draft": "Hi Sara, Tuesday at 3pm works for the consultation. Shall I put you down for it?"
}

Ett 400 innebär att konversationen ännu inte har några meddelanden, att dina krediter har tagit slut, eller att kontakten inte har någon agent eller kampanj att skapa utkast från (error anger vilken). Ett 404 innebär att kontakten inte finns, eller att en teammedlems nyckel är begränsad till kontakter som den inte kan se. Nyckeln eller teammedlemmen behöver behörighet att redigera meddelanden.

Använder du en AI-klient via MCP? Samma åtgärd finns tillgänglig som generate_reply_draft-verktyget.

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- och direction-filtren tillämpas på varje sida efter att den lästs, så en filtrerad sida kan innehålla färre objekt än limit. next_cursor fortsätter fortfarande genom hela konversationen, så fortsätt paginera tills next_cursor är null.

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 Meddelandets unika ID.
body Meddelandets textinnehåll. För ett meddelande med en bilaga börjar body med en anteckning inom parentes om vad som anlände, följt av eventuell bildtext, till exempel [THE CONTACT UPLOADED AN IMAGE] Here is my CV eller [THE CONTACT UPLOADED A VOICE NOTE] - [TRANSCRIPTION: ...]. Röstanteckningar och videor inkluderar transkriberingen.
direction inbound (mottaget från kontakten) eller outbound (skickat av ditt konto).
channel Kanalen 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 assistentaktivitet markeras tool_use.
timestamp ISO 8601-tid då meddelandet skapades.
media_url URL till en bifogad mediefil, om någon. Denna länk slutar fungera 7 dagar efter att meddelandet anlände, i alla kanaler (WhatsApp Business API, WhatsApp Web, Instagram, Messenger, Telegram, chattwidget och övriga). Hämta en ny med Ladda ner ett meddelandes bilaga.
media_content_type MIME-typ för den bifogade median, om någon.
bot_reply true när meddelandet genererades av AI-assistenten.
score Ditt betyg av meddelandet: 1 tumme upp, -1 tumme ner, 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 raderats. Raderade meddelanden finns 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.
faq_ids_used ID:n för de FAQ:er i kunskapsbasen som AI:n hade framför sig när den skrev detta svar: de som valdes för det senaste meddelandet plus de som sparats från tidigare i konversationen. Samma lista finns på varje meddelande i ett svar som skickades i flera delar. Alltid en array, tom för inkommande meddelanden, meddelanden skickade av personer, automatiska uppföljningar och AI-svar skickade före 25 september 2026.
faqs_used Samma FAQ:er med deras fråga: varje post har id och question. question är null när FAQ:n har raderats sedan dess.

Ladda ner en bilaga till ett meddelande

POST /chat-exports/media/download-url

Ger dig en ny nedladdningslänk för filen som bifogats ett meddelande: en bild, röstanteckning, video eller ett dokument. Länken fungerar i 1 timme. Använd den när du vill spara bilagor någon annanstans (till exempel för att arkivera CV:n eller röstanteckningar som en kontakt skickat), eller när media_url på ett meddelande eller en New Message webhook inte längre öppnas.

För att hitta meddelanden med bilagor, lista en kontakts meddelanden med filter=media. Varje meddelandes id och kontaktens ID utgör messagePath.

Body-fält Krävs Beskrivning
messagePath Ja Vilket meddelande, i formatet contacts/{contactId}/messages/{messageId}.

cURL

curl -X POST "https://api.youraiconnector.com/v1/chat-exports/media/download-url" \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"messagePath": "contacts/contact123/messages/aB3dE5fG7hI9jK1lM2nO"}'

JavaScript

const res = await fetch("https://api.youraiconnector.com/v1/chat-exports/media/download-url", {
  method: "POST",
  headers: { "X-API-Key": "YOUR_API_KEY", "Content-Type": "application/json" },
  body: JSON.stringify({ messagePath: "contacts/contact123/messages/aB3dE5fG7hI9jK1lM2nO" }),
});
const { data } = await res.json();
console.log(data.url); // download the file within the hour

Python

import requests

res = requests.post(
    "https://api.youraiconnector.com/v1/chat-exports/media/download-url",
    headers={"X-API-Key": "YOUR_API_KEY"},
    json={"messagePath": "contacts/contact123/messages/aB3dE5fG7hI9jK1lM2nO"},
)
file_url = res.json()["data"]["url"]

Svar (200 OK):

{
  "success": true,
  "data": {
    "url": "https://storage.googleapis.com/...",
    "expiresInMs": 3600000
  }
}
Fält Beskrivning
data.url Nedladdningslänken. Hämta filen direkt från den, ingen API-nyckel behövs.
data.expiresInMs Hur länge länken fungerar, i millisekunder (3600000 = 1 timme). Anropa endpointen igen för en ny länk.
Status När
400 messagePath saknas eller inte är i contacts/{contactId}/messages/{messageId}-format, eller om meddelandet inte har någon bilaga som kan laddas ner på detta sätt. Vissa äldre bilagor lagras hos kanalens leverantör och kan inte utfärdas på nytt, och en delad Instagram-reel eller ett inlägg är en länk till Instagram snarare än en fil.
403 Kontakten tillhör inte ditt konto.
404 Inget meddelande med det ID:t finns för den kontakten.

Använder du en AI-klient via MCP? Samma åtgärd finns tillgänglig som get_chat_media_download_url-verktyget.


Lista chattsessioner

En chattsession är ett konversationsfönster med en kontakt. Det öppnas vid det första inkommande meddelandet när ingen session är öppen, och det stängs automatiskt 48 timmar efter kontaktens senaste inkommande meddelande (varje nytt inkommande meddelande skjuter upp stängningen med ytterligare 48 timmar). Att AI:n avslutar en chatt stänger inte sessionen; den utlöser endast webbhooken Chat Concluded. Sessioner är sättet 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 det id. 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 (endast textmeddelanden), Telegram, LinkedIn Ingen på chattwidgeten, 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 inte längre än vad kanalen tillåter i ett meddelande (samma gränser per kanal som Skicka via kontakt-ID; 4 096 när meddelandet inte har någon kanal).

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 tagit emot skulle göra att de två parterna inte är synkroniserade. Fältet edit_reason talar om varför — kanalens redigeringsfönster har stängts, kanalen är frånkopplad, meddelandet har en bilaga som kanalen inte kan redigera (media_not_editable: på WhatsApp Web kan endast textmeddelanden redigeras, inte texten under ett foto, en video eller en fil), eller så har något annat gått 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}/messages med is_deleted: true och ett tomt body och media_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 hours och limit må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 dessa valfria flaggor:

Fält Beskrivning
pauseBot true pausar AI:n för denna kontakt när meddelandet skickas.
clearIncompleteReply true kasserar ett halvfärdigt botsvar så att det inte återupptas efteråt.
human_reply true markerar meddelandet som ett svar från en teammedlem och avbryter ett svar som AI:n hade köat. Pausning kräver fortfarande pauseBot.
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,
    "human_reply": true
  }'

Svaret inkluderar "botPaused": true när pausen har tillämpats.

Att markera en kontakt som privat med POST /contacts/bulk-flag pausar ä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.


Nästa steg

  • Webhooks — få uppdateringar om leveransstatus skickade till dig istället för att polla.
  • Kontakter — skapa och slå upp kontakterna du skickar meddelanden till.
  • Bokningar — boka och hantera bokningar för dina kontakter.