Beskeder & samtaler
Messages API’et lader dig sende en besked til enhver kontakt, læse en samtale igennem, rette eller fjerne en besked, du allerede har sendt, reagere på en besked, hente en fuld chat-sessionstråd, eksportere en transskription og markere chats som læste eller ulæste — alt sammen uden at åbne indbakken.
Alle stier på denne side er relative til basis-URL’en https://api.youraiconnector.com/v1. Hver anmodning kræver din API-nøgle — se Godkendelse for den fulde liste over måder at sende den på. Eksemplerne nedenfor bruger X-API-Key-headeren, hvor et cURL-eksempel også viser ?apiKey=-forespørgselsformen.
Sådan fungerer levering: Afsendelse af en besked venter ikke på, at den når frem. API’et accepterer din besked, returnerer med det samme et besked-ID og leverer den derefter i baggrunden på kontaktens kanal (WhatsApp, SMS, Instagram osv.). For at spore, om en besked rent faktisk blev leveret eller læst, skal du lytte efter statusopdateringer med Webhooks — lad være med at polle. Svaret ved afsendelse bekræfter kun, at beskeden blev accepteret.
Send en besked
Der er to måder at sende på. Vælg den, der passer til, hvordan du allerede identificerer kontakten:
- Send via kontakt-ID — du kender allerede kontaktens ID (f.eks. har du oprettet kontakten via API’et eller fået det fra en webhook). Brug
POST /contacts/{contactId}/send-message. - Send via kontaktidentitet — du kender kontaktens telefonnummer, Instagram-ID osv., men ikke deres interne ID. Brug
POST /contacts/sendog lad platformen finde den rigtige kontakt.
Begge køer beskeden på samme måde og leverer den på den kanal, kontakten befinder sig på. Du vælger ikke transport — platformen ruter WhatsApp-kontakter via WhatsApp, SMS-kontakter via SMS og så videre.
Begge finder også kun kontakter, der allerede eksisterer. Ingen af kaldene opretter en: et ID eller en identitet, som intet matcher, returneres som 404, den bliver ikke til en ny kontakt. Så hvis du sender en besked til nogen for første gang, skal du enten oprette kontakten først med POST /contacts, eller på WhatsApp Web bruge Send direkte til et WhatsApp Web-nummer herunder, hvilket opretter kontakten i samme kald.
Send via kontakt-ID
POST /contacts/{contactId}/send-message
| Felt | Påkrævet | Beskrivelse |
|---|---|---|
body |
Ja | Beskedteksten, der skal sendes, op til 65.536 tegn. En brødtekst, der er længere end hvad kanalen tillader i én besked (1.500 på WhatsApp Business API og SMS, 1.000 på Instagram, 2.000 på Messenger, 4.096 på Telegram og LinkedIn, 5.000 på LINE, 6.000 på TikTok, 7.000 på Viber, 65.536 på WhatsApp Web; ingen grænse for e-mail, chat-widget og brugerdefinerede kanaler), leveres som flere beskeder i rækkefølge, opdelt ved afsnits- eller sætningsskift. Svaret indeholder derefter messageIds for hver del og autoSplit: true. |
mediaUrl |
Nej | URL til en mediefil (billede, lyd, video, dokument), der skal vedhæftes. |
mediaContentType |
Nej | MIME-type for det vedhæftede medie, f.eks. image/jpeg. Udledes fra URL’ens filendelse, når den udelades (.mp3 → audio/mpeg, .pdf → application/pdf); angiv den for en URL uden en endelse. |
sendAsVoiceNote |
Nej | Kun WhatsApp Web, kun lyd: lever lyden som en stemmenote (afspilningsboblen). Lyd, der ikke er OGG/Opus, konverteres ved afsendelse. Standard er false. |
pauseBot |
Nej | true sætter AI’en på pause for denne kontakt, når beskeden sendes — til brug for når et menneske overtager. Se Sæt AI på pause eller genoptag den. |
clearIncompleteReply |
Nej | true kasserer et halvfærdigt botsvar, så det ikke genoptages efter din besked. |
human_reply |
Nej | true markerer beskeden som skrevet af en person på dit team frem for af en integration. AI’en behandler den derefter som et teamsvarsvar i samtalen, og et svar, som AI’en havde sat i kø til kontaktens sidste besked, annulleres, så kontakten ikke får to svar. Det sætter ikke AI’en på pause; brug pauseBot til det. Standard er false. |
På LinkedIn leveres en besked, du sender på denne måde eller fra indbakken, selv mens en person håndterer tråden på LinkedIn-siden. AI’ens egne svar og dens opfølgninger tilbageholdes i en sådan tråd. Et tilbageholdt svar fjernes fra chatten i stedet for at blive vist som mislykket, fordi intet blev sendt, og der ikke bruges nogen kredit. AI’ens sidste svar, før den overdrager en tråd til en person, leveres stadig.
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."
}
Send via kontaktidentitet
POST /contacts/send
Brug denne, når du ikke har kontaktens interne ID. Angiv beskedens body plus enten en contact_id, eller en channel sammen med identitetsfeltet, der matcher den kanal.
| Felt | Påkrævet | Beskrivelse |
|---|---|---|
body |
Ja | Beskedteksten, der skal sendes, op til 65.536 tegn. En brødtekst, der er længere end hvad kanalen tillader i én besked (1.500 på WhatsApp Business API og SMS, 1.000 på Instagram, 2.000 på Messenger, 4.096 på Telegram og LinkedIn, 5.000 på LINE, 6.000 på TikTok, 7.000 på Viber, 65.536 på WhatsApp Web; ingen grænse for e-mail, chat-widget og brugerdefinerede kanaler), leveres som flere beskeder i rækkefølge, opdelt ved afsnits- eller sætningsskift. Svaret indeholder derefter messageIds for hver del og autoSplit: true. |
contact_id |
Nej | ID på en eksisterende kontakt. Når dette er angivet, er identitetsfelterne nedenfor ikke nødvendige. |
channel |
Nej | Kanal der skal sendes på. Påkrævet når contact_id ikke er angivet. En af de 14 kanaler, der kan sende udgående beskeder: whatsapp, whatsapp_web, sms, instagram, instagram_private, messenger, telegram, chat-widget, custom, email, line, imessage, linkedin, viber. |
phone_number |
Nej | Kontaktens telefonnummer i internationalt format. Bruges sammen med whatsapp, whatsapp_web og sms. |
instagram_id |
Nej | Kontaktens Instagram-bruger-ID. Bruges sammen med instagram. |
messenger_id |
Nej | Kontaktens Messenger-bruger-ID. Bruges sammen med messenger. |
telegram_user_id |
Nej | Kontaktens Telegram-bruger-ID. Bruges sammen med telegram. |
media_url |
Nej | URL til en mediefil, der skal vedhæftes. |
media_content_type |
Nej | MIME-type for det vedhæftede medie, f.eks. image/jpeg. |
Hvilke kanaler kan løses via identitet. Kun seks af de 14 accepterer et identitetsfelt i stedet for et contact_id: whatsapp, whatsapp_web og sms opslås via phone_number, instagram via instagram_id, messenger via messenger_id, og telegram via telegram_user_id. De andre otte — instagram_private, chat-widget, custom, email, line, imessage, linkedin og viber — har ingen offentlig identitet, der kan opslås, så afsendelse på disse kanaler kræver contact_id; hvis du kun sender channel, returneres en 400, der fortæller dig, at contact_id er påkrævet.
cURL (ved brug af ?apiKey= forespørgselsformen)
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"
}
Hvorfor en besked kan blive afvist: En kontakt med forstyr-ikke eller privat tilstand aktiveret kan ikke modtage udgående beskeder — anmodningen fejler med en
422. Hvis ingen kontakt matcher det ID eller den identitet, du har angivet, får du en404.
Afsendelse via WhatsApp Web: variationer og beskyttelse mod burst-afsendelse
To ting gør sig gældende for body, når kontakten er på WhatsApp Web.
Spintax-parenteser udvides ved hver afsendelse. En body af {Hi|Hello|Hey} there, quick question sendes som en af de tre hilsner, valgt til den pågældende afsendelse — parenteserne når aldrig frem til kontakten. Brug det til at give hver kontakt en forskellig åbningsbesked fra den samme integrationskode. Tekst uden parenteser sendes præcis som skrevet.
Burst-afsendelser af identiske åbningsbeskeder afvises. Hvis ti næsten identiske åbningsbeskeder sendes fra ét WhatsApp Web-nummer inden for en time til kontakter, der aldrig har skrevet til dig, bliver efterfølgende beskeder ikke leveret: afsendelsen accepteres som normalt (du modtager stadig en messageId), og beskeden efterlades derefter med status: "failed" og error_code: "opener_burst", med en årsag, som kunden kan læse. Det hjælper ikke at forsøge igen med den samme tekst — varier teksten, vent en time, og send igen. Svar i eksisterende samtaler påvirkes aldrig. Begrundelsen findes i Identiske åbningsbeskeder fører til begrænsning af numre.
Send direkte til et WhatsApp Web-nummer
POST /whatsapp-web/send
Send til et telefonnummer på WhatsApp Web uden først at slå en kontakt op. Hvis nummeret endnu ikke er en kontakt, oprettes kontakten i samme kald, med AI’en slået fra for den, så beskeden fremstår som en, du selv har sendt, og ingen assistent overtager samtalen bagefter. En eksisterende kontakt genbruges, som den er.
| Felt | Påkrævet | Beskrivelse |
|---|---|---|
phoneNumber |
Ja | Nummeret, der skal sendes besked til, i internationalt format (+31612345678). |
message |
Nej | Teksten, der skal sendes. Enten message eller mediaUrl skal være til stede. |
mediaUrl |
Nej | Offentlig URL til en fil, der skal sendes. Enten message eller mediaUrl skal være til stede. |
mediaContentType |
Nej | MIME-type for den fil, for eksempel image/jpeg. Findes ud fra URL’en, hvis du udelader den. |
sendAsVoiceNote |
Nej | true sender en lydfil som en talebesked i stedet for som en vedhæftet fil. |
fromPhoneNumber |
Nej | Hvilket af dine forbundne WhatsApp Web-numre der skal sendes fra, i internationalt format. Som standard bruges det nummer, kontakten allerede tilhører. |
campaignId |
Nej | Brug de aktive timer fra denne Agent i stedet for kontoens standard. Skal være en Agent på den samme konto. |
ignoreActiveHours |
Nej | true sender med det samme, uanset hvad de aktive timer siger. |
sub_account_id |
Nej | Til bureauer: send på vegne af en af dine klientkonti. |
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."
}'
Et vellykket kald svarer med 202:
{ "success": true, "queued": true, "contactId": "abc123" }
202 betyder accepteret, ikke leveret endnu. Uden for aktive timer holdes afsendelsen tilbage og sendes i det næste tilladte tidsrum, medmindre du angav ignoreActiveHours. Læs beskedens egen status tilbage med List en kontakts beskeder ved hjælp af det contactId, du fik her.
Når det ikke går igennem:
| Status | Kode | Hvad skete der |
|---|---|---|
400 |
INVALID_PHONE_FORMAT |
Nummeret er ikke i internationalt format, eller phoneNumber mangler, eller både message og mediaUrl mangler. |
400 |
CONTACT_DND |
Den kontakt er på Forstyr ikke, så intet udgående sendes til dem. |
400 |
CONTACT_PRIVATE |
Den kontakt er markeret som privat. |
404 |
CAMPAIGN_NOT_FOUND |
Ingen Agent matcher den campaignId, du angav. |
403 |
CAMPAIGN_FORBIDDEN |
Den Agent tilhører en anden konto. |
402 |
Kontoen har ikke flere kreditter tilbage, eller intet WhatsApp Web-nummer er forbundet. |
Et andet kald til den samme kontakt, mens en afsendelse stadig venter, svarer med 409, så der aldrig opbygges en kø bag én person.
Log en note i en samtale
POST /contacts/notes
Tilføjer en linje til en kontakts samtale uden at sende den. Brug den til kontekst, som dit team og AI’en skal have, men som kontakten aldrig må modtage: et resumé af et telefonopkald, din stemmeassistent lige har foretaget, en bemærkning fra dit CRM eller en note fra en kollega. Det fungerer på alle kanaler (WhatsApp, SMS, Instagram, Messenger, Telegram, chat-widgetten, brugerdefinerede kanaler og så videre).
Hvad sker der med en note:
- Den vises i chatten i indbakken som et gult Note-kort med forfatteren, hvis du har angivet en.
- AI’en læser den som en del af samtaleloggen, markeret som en intern note, så dens næste svar tager højde for den.
- Den sendes aldrig til kontakten, koster ingen beskedkreditter og udløser intet: intet AI-svar, ingen automatisering, ingen webhook, ingen notifikation, intet ulæst-badge. Den sætter ikke AI’en på pause og tæller ikke som et svar fra dit team.
Find kontakten på samme måde som Send via kontaktidentitet: enten dens ID eller en channel plus den matchende identifikator. En note sendes kun til en kontakt, der allerede eksisterer; intet match er en 404.
| Felt | Påkrævet | Beskrivelse |
|---|---|---|
contact_id |
En af de to | Kontaktens ID. |
channel + identifier |
En af de to | channel plus phone_number (WhatsApp, WhatsApp Web, SMS), instagram_id, messenger_id eller telegram_user_id, som i Send via kontaktidentitet. |
body |
Ja | Noteteksten, op til 4.000 tegn. Linjeskift bevares. |
author |
Nej | Hvem eller hvad der skrev den, op til 80 tegn, for eksempel Voice agent eller Sarah (sales). Vises på kortet og for AI’en. |
timestamp |
Nej | Hvornår det skete, i epoch-millisekunder. Standard er nu. Brug opkaldets sluttidspunkt, så noten placeres korrekt i tråden. Den kan ikke være mere end 5 minutter ude i fremtiden; et senere tidspunkt afvises med en 400-fejl. |
external_id |
Nej | Dit eget ID for denne note, op til 200 tegn, for eksempel opkalds-ID’et. Hvis du sender det samme external_id for den samme kontakt igen, tilføjes der ikke en ekstra note; svaret indeholder derefter duplicate: true. Brug det, så en genforsøgt webhook ikke kan logge det samme opkald to gange. |
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 allerede var logget)
{
"success": true,
"messageId": "note_4c1f0e...",
"contactId": "contact123"
}
En note vises i List en kontakts beskeder med type: "note".
Generer et svarkladde med AI’en
POST /contacts/{contactId}/draft-reply
Beder den AI-agent, der håndterer en samtale, om at skrive det næste svar og returnerer teksten til dig. Intet sendes. Det er den samme kladde, som knappen Generer svar i indbakken skriver: agenten bruger sin opsætning, sin vidensbase og samtalen indtil videre, og svarer på kontaktens sprog. Brug den til at placere et menneske (eller din egen app) mellem AI’en og kontakten: hent kladden, vis den til godkendelse, og send den derefter med Send via kontakt-id, enten ændret eller som den er.
- Kladden skrives af den agent, der er tildelt kontakten. En kontakt, der endnu ikke har en agent, får den agent, der ville besvare dens næste besked.
- Under udarbejdelsen af kladden kører agenten ingen værktøjer eller funktioner, så ingen booking, tagging, overdragelse eller andre handlinger finder sted.
- Intet gemmes i samtalen, og kontakten ser intet.
- En kladde koster det samme antal kreditter som ét AI-svar fra den pågældende agent i denne samtale, og intet når din egen AI-nøgle er tilsluttet.
- Samtalen skal indeholde mindst én besked.
Alle brødtekstfelter er valgfrie; en tom brødtekst (eller ingen brødtekst) genererer et udkast til det næste svar.
| Felt | Påkrævet | Beskrivelse |
|---|---|---|
instruction |
Nej | En engangsinstruks til denne kladde, op til 2.000 tegn, det samme som at holde knappen Generer svar nede i indbakken. For eksempel Offer Tuesday at 3pm eller Ask for their email address. |
campaign_id |
Nej | Lav kladden under denne kampagne i stedet for kontaktens agent. |
purpose |
Nej | chat_reply (standard) skriver en besked til kontakten. faq_answer skriver et kort svar på kontaktens spørgsmål, der fungerer selvstændigt, til en vidensbase-FAQ. |
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?"
}
En 400 betyder, at samtalen endnu ikke har nogen beskeder, dine kreditter er opbrugt, eller kontakten ikke har nogen agent eller kampagne at generere fra (error angiver hvilken). En 404 betyder, at kontakten ikke eksisterer, eller at et teammedlems nøgle er begrænset til kontakter, som vedkommende ikke kan se. Nøglen eller teammedlemmet skal have tilladelse til at redigere beskeder.
Bruger du en AI-klient via MCP? Den samme handling er tilgængelig som
generate_reply_draft-værktøjet.
Vis en kontakts beskeder
GET /contacts/{contactId}/messages
Returnerer en kontakts beskeder, nyeste først, med markør-baseret paginering.
| Forespørgselsparameter | Påkrævet | Beskrivelse |
|---|---|---|
limit |
Nej | Sidestørrelse. Standard 50, maksimum 100. |
cursor |
Nej | next_cursor-værdien fra et tidligere svar. Returnerer beskeder ældre end markøren. |
filter |
Nej | Filtrer efter indholdstype: all (standard), text, media eller tool_use. |
direction |
Nej | Filtrer efter retning: all (standard), inbound (modtaget fra kontakten) eller outbound (sendt af dig). |
Bemærkning om filtrering og paginering:
filter- ogdirection-filtrene anvendes på hver side, efter den er læst, så en filtreret side kan indeholde færre elementer endlimit.next_cursorbevæger sig stadig gennem hele samtalen, så fortsæt med at paginere, indtilnext_cursorernull.
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"
}
Beskedfelter
| Felt | Beskrivelse |
|---|---|
id |
Unikt ID for beskeden. |
body |
Tekstindhold i beskeden. For en besked med en vedhæftet fil starter body med en note i parentes om, hvad der ankom, efterfulgt af eventuel billedtekst, for eksempel [THE CONTACT UPLOADED AN IMAGE] Here is my CV eller [THE CONTACT UPLOADED A VOICE NOTE] - [TRANSCRIPTION: ...]. Stemmenoter og videoer inkluderer transskriptionen. |
direction |
inbound (modtaget fra kontakten) eller outbound (sendt af din konto). |
channel |
Kanal, som beskeden blev sendt eller modtaget på (f.eks. whatsapp, sms, instagram). |
status |
Nuværende leveringsstatus, f.eks. Created, sent, delivered, read, failed. |
type |
Beskedtype. Almindelige tekstbeskeder har en null-type; automatiseret assistent-værktøjsaktivitet er markeret som tool_use. |
timestamp |
ISO 8601-tidspunkt for, hvornår beskeden blev oprettet. |
media_url |
URL til en vedhæftet mediefil, hvis der er en. Dette link holder op med at virke 7 dage efter, at beskeden ankom, på alle kanaler (WhatsApp Business API, WhatsApp Web, Instagram, Messenger, Telegram, chat-widget og resten). Hent et nyt med Download en beskeds vedhæftede fil. |
media_content_type |
MIME-type for det vedhæftede medie, hvis der er et. |
bot_reply |
true når beskeden blev genereret af AI-assistenten. |
score |
Din vurdering af beskeden: 1 tommelfinger op, -1 tommelfinger ned, 0 når den ikke er blevet vurderet. Se Vurder eller stjernemarkér en besked. |
is_important |
true når beskeden er blevet stjernemarkeret. |
is_deleted |
true når beskeden blev slettet. Slettede beskeder bliver i listen, men deres body og media_url er tomme. |
reactions |
Emoji-reaktioner på beskeden fra begge sider. Altid et array — tomt når der ikke er nogen. Hver post har emoji, from_phone_number, from_me (true når reaktionen er din) og reacted_at. |
faq_ids_used |
ID’er på de vidensbase-FAQ’er, som AI’en havde foran sig, da den skrev dette svar: dem, der blev valgt til den seneste besked, plus dem, der blev beholdt fra tidligere i samtalen. Den samme liste findes på hver besked i et svar, der blev sendt i flere dele. Altid et array, tomt for indgående beskeder, beskeder sendt af personer, automatiske opfølgninger og AI-svar sendt før 25. september 2026. |
faqs_used |
De samme FAQ’er med deres spørgsmål: hver post har id og question. question er null, når FAQ’en er blevet slettet siden da. |
Download en beskedvedhæftning
POST /chat-exports/media/download-url
Giver dig et nyt downloadlink til filen, der er vedhæftet en besked: et billede, en talebesked, en video eller et dokument. Linket virker i 1 time. Brug det, når du vil gemme vedhæftede filer et andet sted (f.eks. arkivering af CV’er eller talebeskeder, som en kontakt har sendt), eller når media_url på en besked eller en New Message webhook ikke længere åbner.
For at finde beskeder med vedhæftede filer skal du liste en kontakts beskeder med filter=media. Hver beskeds id og kontaktens ID udgør messagePath.
| Body-felt | Påkrævet | Beskrivelse |
|---|---|---|
messagePath |
Ja | Hvilken besked, i formen 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
}
}
| Felt | Beskrivelse |
|---|---|
data.url |
Downloadlinket. Hent filen direkte fra det, ingen API-nøgle påkrævet. |
data.expiresInMs |
Hvor længe linket virker, i millisekunder (3600000 = 1 time). Kald endepunktet igen for at få et nyt link. |
| Status | Hvornår |
|---|---|
400 |
messagePath mangler eller er ikke i contacts/{contactId}/messages/{messageId}-formatet, eller beskeden har ingen vedhæftet fil, der kan downloades på denne måde. Nogle ældre vedhæftede filer er gemt hos kanaludbyderen og kan ikke genudstedes, og en delt Instagram-reel eller et opslag er et link til Instagram frem for en fil. |
403 |
Kontakten tilhører ikke din konto. |
404 |
Der findes ingen besked med det ID hos den kontakt. |
Bruger du en AI-klient via MCP? Den samme handling er tilgængelig som
get_chat_media_download_url-værktøjet.
List chat-sessioner
En chatsession er ét samtalevindue med en kontaktperson. Det åbnes ved den første indgående besked, når ingen session er åben, og det lukkes automatisk 48 timer efter kontaktpersonens sidste indgående besked (hver ny indgående besked forlænger lukketidspunktet med yderligere 48 timer). Når AI’en afslutter en chat, lukkes sessionen ikke; den udløser kun webhooken Chat Concluded. Sessioner er måden, hvorpå du opdeler en lang historik i læsbare samtaler i stedet for én endeløs liste.
Seneste sessioner på tværs af alle kontakter
GET /chat-sessions/recent
Returnerer de sessioner, der startede inden for de sidste X timer, nyeste først, på tværs af alle kontakter på kontoen.
| Forespørgselsparameter | Påkrævet | Beskrivelse |
|---|---|---|
hours |
Ja | Hvor mange timer der skal ses tilbage. Skal være et positivt heltal. |
status |
Nej | Returner kun sessioner med denne status: ChatSessionOpened eller ChatSessionClosed. |
limit |
Nej | Maksimalt antal sessioner, der skal returneres. Standard 100, maksimum 100. |
includeMessages |
Nej | true tilføjer et messages-array til hver session. Deaktiveret som standard, da det gør svaret meget 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"
}
]
}
}
Alle sessioner for én kontakt
GET /chat-sessions/{contactId}
Returnerer hver chat-session for en enkelt kontakt. Samme status, limit og includeMessages parametre som ovenfor — hours gælder ikke her.
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"
}
]
}
}
Feltnavne for session-ID er forskellige mellem de to slutpunkter. Listen over seneste sessioner kalder det
session_id(det indeholder også kontaktens detaljer, da sessioner kommer fra mange kontakter); listen pr. kontakt kalder detid. Begge værdier er det, du sender som{sessionId}, når du henter den fulde tråd nedenfor.
Når includeMessages=true, får hver session et messages-array, hvis poster indeholder id, body, direction, timestamp, type, channel og status.
Hent en chat-sessionstråd
GET /contacts/{contactId}/chat-sessions/{sessionId}/messages
En chatsession grupperer en kontakts beskeder i ét samtalevindue. Dette slutpunkt returnerer hele tråden for en enkelt session, ældste først, sammen med sessionens metadata. Du kan finde sessions-id’er for en kontakt via slutpunkterne for chatsessioner.
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
}
]
}
session-objektet rapporterer status (ChatSessionOpened mens aktiv, ChatSessionClosed når afsluttet), start_date_time, end_date_time og et læsbart tag. messages-arrayet bruger de samme beskedfelter som listeslutpunktet.
Rediger, slet og reager på beskeder
Disse slutpunkter ændrer en besked, efter den er blevet sendt. To af dem kontakter både modtagerens kanal og din egen kopi, så læs sektionsintroduktionen, før du implementerer dem — hvad der er muligt, afhænger udelukkende af den kanal, samtalen foregår på.
Hvad hver kanal tillader
| Handling | Kanaler, der kan ændre kontaktens kopi | Tidsgrænse |
|---|---|---|
| Rediger en sendt besked | Chat-widget, WhatsApp Web (kun tekstbeskeder), Telegram, LinkedIn | Ingen på chat-widget, 15 minutter på WhatsApp Web, 48 timer på Telegram, 60 minutter på LinkedIn |
| Slet for alle | Chat-widget, WhatsApp Web, Telegram, LinkedIn | 60 minutter på LinkedIn; de andre har ingen offentliggjort grænse |
| Reager med en emoji | WhatsApp Web, Telegram | Ingen |
På alle andre kanaler — WhatsApp Business API, SMS, Instagram, Messenger, e-mail, LINE, tilpassede kanaler — fjerner en sletning stadig beskeden fra din indbakke, men kontakten beholder sin kopi, og redigering eller reaktion er slet ikke muligt.
Rediger en besked
POST /contacts/{contactId}/messages/{messageId}/edit
Omskriver en besked, du allerede har sendt, på kontaktens enhed og i din kopi.
| Felt | Påkrævet | Beskrivelse |
|---|---|---|
body |
Ja | Den nye beskedtekst. Må ikke være tom og ikke længere end hvad kanalen tillader i én besked (de samme grænser pr. kanal som Send via kontakt-ID; 4.096 når beskeden ikke har nogen kanal). |
I modsætning til sletning fejler dette tydeligt, når kanalen afviser det: Du får en 409, og din kopi forbliver præcis, som kontakten har den, da det at vise en redigering, de aldrig har modtaget, ville bringe de to parter ud af takt. Feltet edit_reason fortæller dig hvorfor — kanalens redigeringsvindue er lukket, kanalen er afbrudt, beskeden har en vedhæftet fil, som kanalen ikke kan redigere (media_not_editable: på WhatsApp Web kan kun tekstbeskeder redigeres, ikke teksten under et billede, en video eller en fil), eller noget andet gik galt.
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"
}
Hvis kanalen ikke vil acceptere redigeringen, får du en 409 i stedet, og intet blev ændret:
{
"success": false,
"error": "The message could not be edited",
"edit_reason": "channel_disconnected"
}
En besked, der allerede er slettet, en kanal, der slet ikke kan redigere, og en besked, der er for gammel til sin kanal, returnerer alle 400 — anmodningen når aldrig frem til kanalen.
Slet én besked
DELETE /contacts/{contactId}/messages/{messageId}
Fjerner beskeden fra din samtale og trækker, hvor kanalen tillader det, også kontaktens kopi tilbage. Ingen anmodningstekst.
Dette svarer altid 200, når beskeden eksisterede, selvom kontaktens kopi ikke kunne trækkes tilbage — din kopi er væk, så en fejl ville være vildledende. Læs de tre felter i svaret for at fortælle brugeren, hvad der faktisk skete:
| Felt | Beskrivelse |
|---|---|
revoke_supported |
Om denne kanal overhovedet kan trække beskeder tilbage. |
revoked |
Om kopien på kontaktens enhed blev fjernet. |
revoke_reason |
Hvorfor den ikke blev fjernet, når revoked er false — for eksempel 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"
}
Slettede beskeder fjernes ikke fra samtaleloggen. De forbliver i
GET /contacts/{contactId}/messagesmedis_deleted: trueog en tombodyogmedia_url.
Slet flere beskeder på én gang
POST /contacts/{contactId}/messages/bulk-delete
Rydder en gruppe beskeder kun fra din side. Indholdet og vedhæftede filer tømmes, men intet trækkes tilbage på kontaktens enhed — for også at trække en besked tilbage, skal du slette den én efter én med slutpunktet for enkelte beskeder ovenfor.
| Felt | Påkrævet | Beskrivelse |
|---|---|---|
message_ids |
Ja | Et ikke-tomt array af besked-id’er, op til 500 pr. anmodning. messageIds accepteres som et 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
}
Reager på en besked
POST /contacts/{contactId}/messages/{messageId}/react
Tilføjer din egen emoji-reaktion på en besked, eller fjerner den ved at sende en tom streng. Kontaktens egne reaktioner bliver aldrig berørt.
| Felt | Påkrævet | Beskrivelse |
|---|---|---|
emoji |
Ja | Den emoji, der skal reageres med, eller "" for at fjerne din reaktion. Skal være en enkelt streng uden mellemrum, på højst 16 tegn. |
Ligesom ved redigering fejler dette frem for at vise en reaktion, som kontakten aldrig har modtaget, og fejlen fortæller dig, om det kan betale sig at prøve igen:
422— den kan aldrig leveres i denne samtale: kanalen understøtter ikke reaktioner, beskeden har intet kanal-id, eller emojien er uden for det sæt, som kanalen tillader.409— kanalen var midlertidigt utilgængelig. Et nyt forsøg kan virke.
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"
}
]
}
reactions-arrayet er det fulde sæt af reaktioner, der nu er på beskeden, både dine og kontaktens. Ved en 409 eller 422 returneres det uændret, så en klient, der renderer direkte ud fra det, aldrig viser en reaktion, der ikke blev leveret.
Bedøm eller stjernemarkér en besked
PATCH /contacts/{contactId}/messages/{messageId}
Giver en besked en tommelfinger op eller ned og/eller markerer den som vigtig. Dette er kun bogføring på din side — intet sendes til kontakten.
| Felt | Påkrævet | Beskrivelse |
|---|---|---|
score |
Nej | 1 tommelfinger op, -1 tommelfinger ned, 0 rydder bedømmelsen. |
is_important |
Nej | true markerer beskeden med stjerne, false fjerner stjernen. Skal være en reel boolsk værdi, ikke strengen "true". |
Send mindst én af de to, ellers får du en 400. Kun det, du sender, bliver skrevet, så at markere en besked med stjerne rydder aldrig dens bedømmelse og omvendt — og svaret sender kun de felter tilbage, som du sendte.
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
}
Markér beskeder som læst
Du kan fjerne ulæst-status enten for specifikke beskeder eller for hele samtalen.
Markér specifikke beskeder som læst
POST /contacts/{contactId}/messages/mark-read
Angiv id’erne for de beskeder, der skal markeres som læst.
| Felt | Påkrævet | Beskrivelse |
|---|---|---|
message_ids |
Ja | Et ikke-tomt array af besked-id’er (op til 500 pr. anmodning). |
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
}
Markér hele chatten som læst
POST /contacts/{contactId}/mark-read
Fjerner ulæst-ikonet for kontaktens samlede samtale i indbakken. Der kræves ingen anmodningstekst.
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"
}
Marker hele chatten som ulæst
POST /contacts/{contactId}/mark-unread
Sætter det ulæste-badge tilbage på samtalen — praktisk når en person på dit team har åbnet en chat, men giver den videre. Der kræves ingen anmodningstekst.
Dette er et flag, der kun gælder indbakken: det ændrer ikke, hvornår samtalen sidst blev læst, så der sendes ingen læsekvittering til kontakten på kanaler, der understøtter 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"
}
Eksporter en samtale
Eksport giver dig en hel samtale som en læsbar udskrift i stedet for at skulle bladre gennem beskeder. Hvert eksport-endepunkt accepterer en filter af all (standard), text, media eller tool_use, svarende til filteret på beskedlisten.
Eksporter én kontakts chat
GET /chat-exports/{contactId}
| Forespørgselsparameter | Påkrævet | Beskrivelse |
|---|---|---|
format |
Nej | txt (standard) returnerer et downloadlink til en udskrift i almindelig tekst. json returnerer beskederne som strukturerede 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), er data i stedet et downloadlink til den genererede udskriftsfil:
{
"success": true,
"data": "https://storage.googleapis.com/.../chat-export-contact123-....txt"
}
Downloadlinket er kortvarigt. Hent filen så snart du får linket i stedet for at gemme det — anmod om en ny eksport, når du har brug for udskriften igen.
Eksporter alle nylige samtaler
GET /chat-exports/recent
Eksporterer samtalerne for alle kontakter, der har været aktive inden for de sidste X timer, i ét kald.
| Forespørgselsparameter | Påkrævet | Beskrivelse |
|---|---|---|
hours |
Ja | Hvor mange timers aktivitet der skal ses tilbage på. Skal være et positivt heltal. |
format |
Nej | json (standard) returnerer én post pr. kontakt. txt returnerer en enkelt downloadbar tekstfil med alle samtaler i. |
limit |
Nej | Maksimalt antal kontakter, der skal eksporteres. Standard 50, maksimum 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 er svaret selve tekstfilen, der sendes som en download i stedet for JSON.
Dette ene kald henter hele historikken for hver matchende kontakt, så hold
hoursoglimitpå et moderat niveau på travle konti.
Send en transskription til kontakten via e-mail
POST /chat-exports/{contactId}/email
Sender kontakten deres egen samtaletransskription via e-mail — “send mig denne chat”-flowet, drevet fra dit eget system.
| Felt | Påkrævet | Beskrivelse |
|---|---|---|
recipient_email |
Nej | Hvor den skal sendes hen. Som standard bruges kontaktens gemte e-mailadresse. |
via |
Nej | auto (standard) vælger den bedste rute, transactional sender den som en system-e-mail, email_channel sender den fra din tilsluttede e-mailkanal. |
note |
Nej | En kort linje fra dig, der vises over transskriptionen. Op til 1000 tegn. |
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 fortæller dig, hvor mange af de ældste beskeder der blev udeladt for at holde e-mailen i en fornuftig længde. En 200 betyder, at transskriptionen blev oprettet og sat i kø til afsendelse, ikke at den er landet i indbakken endnu.
Sæt AI på pause eller genoptag for én kontakt
PUT /contacts/{contactId}
Sæt is_bot_active til false for at stoppe AI’en i at svare en kontakt, og tilbage til true for at give samtalen tilbage. Dette er den overtagelseskontakt, du skal bruge, når et menneske træder ind i en samtale: udgående beskeder, du sender med API’en, leveres stadig, mens botten er sat på pause.
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"
}
Pause som en del af svaret
Hvis et menneske overtager ved at sende et svar, kan du sætte botten på pause i den samme anmodning i stedet for at foretage et andet kald. POST /contacts/{contactId}/send-message accepterer disse valgfrie flag:
| Felt | Beskrivelse |
|---|---|
pauseBot |
true sætter AI’en på pause for denne kontakt, når beskeden sendes. |
clearIncompleteReply |
true kasserer et halvfærdigt botsvar, så det ikke genoptages bagefter. |
human_reply |
true markerer beskeden som et teamsvarsvar og annullerer et svar, som AI’en havde sat i kø. Pausering kræver stadig 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 inkluderer "botPaused": true, når pausen blev anvendt.
Markering af en kontakt som privat med
POST /contacts/bulk-flagsætter også botten på pause for dem. Se Kontakter for den fulde liste over felter.
Byg din egen indbakke
Alt, hvad en indbakke har brug for, findes på denne side og i Kontakter:
| Hvad du har brug for | Endpoint |
|---|---|
| List samtaler | GET /contacts |
| Læs en samtale | GET /contacts/{contactId}/messages |
| List en kontakts chatsessioner | GET /chat-sessions/{contactId} |
| Se hvad der for nylig er kommet ind | GET /chat-sessions/recent |
| Læs én chatsession | GET /contacts/{contactId}/chat-sessions/{sessionId}/messages |
| Send et manuelt svar | POST /contacts/{contactId}/send-message |
| Ret et svar, du lige har sendt | POST /contacts/{contactId}/messages/{messageId}/edit |
| Fjern en besked | DELETE /contacts/{contactId}/messages/{messageId} |
| Ryd flere beskeder | POST /contacts/{contactId}/messages/bulk-delete |
| Reager med en emoji | POST /contacts/{contactId}/messages/{messageId}/react |
| Vurder eller marker en besked med stjerne | PATCH /contacts/{contactId}/messages/{messageId} |
| Marker som læst | POST /contacts/{contactId}/mark-read |
| Giv en chat tilbage til teamet | POST /contacts/{contactId}/mark-unread |
| Eksporter en transskription | GET /chat-exports/{contactId} |
| Sæt AI på pause eller genoptag den | PUT /contacts/{contactId} med is_bot_active |
For live-opdateringer, abonner på New Message, Replies, Human Alerted og Chat Concluded begivenhederne med Webhooks i stedet for at polle denne API på en timer.
Fejl i Messages API
Besked-endpoints returnerer standardfejl-konvolutten:
{
"success": false,
"error": "Contact not found"
}
| Status | Hvornår det sker på et besked-endpoint |
|---|---|
400 |
Et påkrævet felt mangler, eller en parameter er ugyldig (forkert limit, hours, filter, direction, status, et tomt eller over-500 message_ids array, en ugyldig cursor, et tomt eller for langt redigerings-body, en score uden for -1/0/1, eller en emoji med mellemrum eller over 16 tegn). Returneres også, når en besked slet ikke kan redigeres — den blev slettet, dens kanal har ingen redigering, eller den er uden for kanalens redigeringsvindue. |
404 |
Kontakten, chatsessionen eller et af de angivne besked-ID’er blev ikke fundet. |
409 |
Kanalen ville ikke acceptere ændringen lige nu. Intet blev skrevet: ved en redigering fortæller edit_reason hvorfor; ved en reaktion var kanalen midlertidigt utilgængelig, og et nyt forsøg kan virke. |
422 |
Kontakten kan ikke modtage udgående beskeder (forstyr ikke, privat eller en ikke-understøttet kanal), eller en reaktion kan aldrig leveres i denne samtale (reaction_reason fortæller hvilken). |
De delte koder, som ethvert endpoint kan returnere — 401, 403 (din plan inkluderer ikke API-adgang), 429 (rate limit) og 500 — er angivet med vejledning om genforsøg i Errors & Pagination.