Viestit ja keskustelut
Messages API:n avulla voit lähettää viestin mille tahansa yhteyshenkilölle, lukea keskusteluhistorian, korjata tai poistaa jo lähettämäsi viestin, reagoida viestiin, hakea koko keskusteluketjun, viedä keskustelun tekstimuodossa ja merkitä keskusteluja luetuiksi tai lukemattomiksi – kaikki tämä ilman, että sinun tarvitsee avata postilaatikkoa.
Kaikki tämän sivun polut ovat suhteessa perus-URL-osoitteeseen https://api.youraiconnector.com/v1. Jokainen pyyntö vaatii API-avaimesi – katso todennus nähdäksesi täydellisen listan tavoista lähettää se. Alla olevissa esimerkeissä käytetään X-API-Key-otsikkoa, ja yhdessä cURL-esimerkissä näytetään myös ?apiKey=-kyselylomake.
Miten toimitus toimii: Viestin lähettäminen ei odota sen perillemenoa. API vastaanottaa viestisi, palauttaa välittömästi viestin tunnisteen ja toimittaa sen sitten taustalla yhteyshenkilön kanavalla (WhatsApp, SMS, Instagram jne.). Jos haluat seurata, onko viesti todella toimitettu tai luettu, kuuntele tilapäivityksiä Webhookien avulla – älä käytä kyselyitä (polling). Lähetysvastaus vahvistaa vain, että viesti on otettu vastaan.
Lähetä viesti
Lähettämiseen on kaksi tapaa. Valitse se, joka sopii parhaiten tapaasi tunnistaa yhteyshenkilö:
- Lähetä yhteyshenkilön tunnisteella – tiedät jo yhteyshenkilön tunnisteen (esimerkiksi loit yhteyshenkilön API:n kautta tai sait sen webhookista). Käytä
POST /contacts/{contactId}/send-message. - Lähetä yhteyshenkilön identiteetillä – tiedät yhteyshenkilön puhelinnumeron, Instagram-tunnisteen jne., mutta et heidän sisäistä tunnistettaan. Käytä
POST /contacts/sendja anna alustan etsiä oikea yhteyshenkilö.
Molemmat asettavat viestin jonoon samalla tavalla ja toimittavat sen kanavalla, jota yhteyshenkilö käyttää. Sinun ei tarvitse valita siirtotapaa – alusta reitittää WhatsApp-yhteyshenkilöt WhatsAppin kautta, SMS-yhteyshenkilöt tekstiviestillä ja niin edelleen.
Molemmat löytävät vain jo olemassa olevia yhteystietoja. Kumpikaan kutsu ei luo uutta yhteystietoa: jos ID tai identiteetti ei täsmää mihinkään, palautuu 404, eikä siitä tule uutta yhteystietoa. Jos siis lähetät viestiä jollekin ensimmäistä kertaa, luo yhteystieto ensin kohdassa POST /contacts tai käytä WhatsApp Webissä alla olevaa toimintoa Lähetä suoraan WhatsApp Web -numeroon, joka luo yhteystiedon saman kutsun yhteydessä.
Lähetä yhteyshenkilön tunnisteella
POST /contacts/{contactId}/send-message
| Kenttä | Pakollinen | Kuvaus |
|---|---|---|
body |
Kyllä | Lähetettävä viestiteksti, enintään 65 536 merkkiä. Jos runko on pidempi kuin mitä kanava sallii yhdessä viestissä (1 500 WhatsApp Business API:ssa ja SMS-viesteissä, 1 000 Instagramissa, 2 000 Messengerissä, 4 096 Telegramissa ja LinkedInissä, 5 000 LINE:ssa, 6 000 TikTokissa, 7 000 Viberissä, 65 536 WhatsApp Webissä; ei rajoitusta sähköpostissa, chat-widgetissä ja mukautetuissa kanavissa), se toimitetaan useana viestinä järjestyksessä, jaettuna kappale- tai lausejakojen kohdalta. Vastaus sisältää tällöin messageIds jokaiselle osalle ja autoSplit: true. |
mediaUrl |
Ei | Liitettävän mediatiedoston (kuva, ääni, video, asiakirja) URL-osoite. |
mediaContentType |
Ei | Liitetyn median MIME-tyyppi, esim. image/jpeg. Määritetään URL-osoitteen tiedostopäätteen perusteella, jos se jätetään pois (.mp3 → audio/mpeg, .pdf → application/pdf); aseta tämä, jos URL-osoitteessa ei ole tiedostopäätettä. |
sendAsVoiceNote |
Ei | Vain WhatsApp Web, vain ääni: toimita ääni ääniviestinä (toistokupla). Muu kuin OGG/Opus-muotoinen ääni muunnetaan lähetyshetkellä. Oletusarvo on false. |
pauseBot |
Ei | true keskeyttää tekoälyn tältä yhteyshenkilöltä viestiä lähetettäessä – kun ihminen ottaa keskustelun haltuunsa. Katso Tekoälyn keskeyttäminen tai jatkaminen. |
clearIncompleteReply |
Ei | true hylkää keskeneräisen botin vastauksen, jotta se ei jatku viestisi jälkeen. |
human_reply |
Ei | true merkitsee viestin tiimisi jäsenen kirjoittamaksi integraation sijaan. Tekoäly käsittelee sen tällöin tiimiläisen vastauksena keskustelussa, ja tekoälyn yhteyshenkilön viimeisintä viestiä varten jonottama vastaus peruutetaan, jotta yhteyshenkilö ei saa kahta vastausta. Se ei keskeytä tekoälyä; käytä siihen pauseBot. Oletusarvo on false. |
LinkedInissä tällä tavalla tai postilaatikosta lähettämäsi viesti toimitetaan perille, vaikka henkilö käsittelisi ketjua LinkedInin puolella. Tekoälyn omat vastaukset ja jatkoviestit pidetään tällaisessa ketjussa odottamassa. Odotustilassa oleva vastaus poistetaan keskustelusta sen sijaan, että se näytettäisiin epäonnistuneena, koska mitään ei lähetetty eikä krediittejä käytetty. Tekoälyn viimeinen vastaus ennen kuin se siirtää ketjun ihmiselle toimitetaan edelleen perille.
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"])
Vastaus (200 OK):
{
"success": true,
"messageId": "aB3dE5fG7hI9jK1lM2nO",
"contactId": "contact123",
"channel": "whatsapp",
"message": "Message created successfully. Delivery is being processed."
}
Lähetä yhteyshenkilön identiteetillä
POST /contacts/send
Käytä tätä, kun sinulla ei ole yhteyshenkilön sisäistä tunnistetta. Anna viestin body sekä joko contact_id tai channel yhdessä kyseistä kanavaa vastaavan identiteettikentän kanssa.
| Kenttä | Pakollinen | Kuvaus |
|---|---|---|
body |
Kyllä | Lähetettävä viestiteksti, enintään 65 536 merkkiä. Jos viestin runko on pidempi kuin kanavan sallima enimmäispituus (1 500 WhatsApp Business API:ssa ja tekstiviesteissä, 1 000 Instagramissa, 2 000 Messengerissä, 4 096 Telegramissa ja LinkedInissä, 5 000 LINE:ssa, 6 000 TikTokissa, 7 000 Viberissä, 65 536 WhatsApp Webissä; ei rajoitusta sähköpostissa, chat-widgetissä ja mukautetuissa kanavissa), se toimitetaan useana viestinä järjestyksessä, jaettuna kappale- tai lausejakojen kohdalta. Vastaus sisältää tällöin messageIds jokaiselle osalle ja autoSplit: true. |
contact_id |
Ei | Olemassa olevan yhteyshenkilön tunniste (ID). Kun tämä on asetettu, alla olevia identiteettikenttiä ei tarvita. |
channel |
Ei | Kanava, jota käytetään lähetykseen. Pakollinen, kun contact_id ei ole annettu. Yksi 14:stä lähetettävästä kanavasta: whatsapp, whatsapp_web, sms, instagram, instagram_private, messenger, telegram, chat-widget, custom, email, line, imessage, linkedin, viber. |
phone_number |
Ei | Yhteyshenkilön puhelinnumero kansainvälisessä muodossa. Käytetään yhdessä whatsapp, whatsapp_web ja sms kanssa. |
instagram_id |
Ei | Yhteyshenkilön Instagram-käyttäjätunniste. Käytetään yhdessä instagram kanssa. |
messenger_id |
Ei | Yhteyshenkilön Messenger-käyttäjätunniste. Käytetään yhdessä messenger kanssa. |
telegram_user_id |
Ei | Yhteyshenkilön Telegram-käyttäjätunniste. Käytetään yhdessä telegram kanssa. |
media_url |
Ei | Liitettävän mediatiedoston URL-osoite. |
media_content_type |
Ei | Liitetyn median MIME-tyyppi, esim. image/jpeg. |
Mitkä kanavat voidaan tunnistaa identiteetin perusteella. Vain kuusi 14 kanavasta hyväksyy identiteettikentän contact_id sijasta: whatsapp, whatsapp_web ja sms haetaan phone_number perusteella, instagram haetaan instagram_id perusteella, messenger haetaan messenger_id perusteella ja telegram haetaan telegram_user_id perusteella. Muilla kahdeksalla — instagram_private, chat-widget, custom, email, line, imessage, linkedin ja viber — ei ole julkista identiteettiä, jota voisi hakea, joten lähettäminen näillä kanavilla vaatii contact_id; pelkän channel välittäminen palauttaa 400, joka ilmoittaa, että contact_id vaaditaan.
cURL (käyttäen ?apiKey=-kyselylomaketta)
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"])
Vastaus (201 Created):
{
"success": true,
"message_id": "aB3dE5fG7hI9jK1lM2nO",
"contact_id": "contact123",
"channel": "whatsapp"
}
Miksi viesti saatetaan hylätä: Yhteyshenkilö, jolla on käytössä ”älä häiritse” -tila tai yksityinen tila, ei voi vastaanottaa lähteviä viestejä — pyyntö epäonnistuu ja palauttaa virheen
422. Jos mikään yhteyshenkilö ei vastaa antamaasi tunnusta tai identiteettiä, saat virheen404.
Lähettäminen WhatsApp Webissä: variaatiot ja purskesuojaus
Kaksi asiaa pätee kohteeseen body, kun yhteyshenkilö käyttää WhatsApp Webiä.
Spintax-aaltosulkeet laajennetaan lähetyskohtaisesti. body, joka on {Hi|Hello|Hey} there, quick question, lähetetään yhtenä kolmesta tervehdyksestä, joka valitaan kyseistä lähetystä varten — aaltosulkeet eivät koskaan päädy yhteyshenkilölle asti. Käytä tätä antaaksesi jokaiselle yhteyshenkilölle erilaisen aloitusviestin samasta integraatiokoodista. Teksti ilman aaltosulkeita lähetetään täsmälleen sellaisena kuin se on kirjoitettu.
Identtisten aloitusviestien purskeet hylätään. Jos kymmenen lähes identtistä aloitusviestiä lähetetään yhdestä WhatsApp Web -numerosta tunnin sisällä yhteyshenkilöille, jotka eivät ole koskaan kirjoittaneet sinulle, seuraavia viestejä ei toimiteta: lähetys hyväksytään tavalliseen tapaan (saat silti kohteen messageId), ja viesti jää tilaan status: "failed" ja error_code: "opener_burst", ja siinä on asiakkaan luettavissa oleva syy. Saman tekstin uudelleenyrittäminen ei auta — muuta tekstiä, odota tunti ja lähetä uudelleen. Vastaukset olemassa olevissa keskusteluissa eivät koskaan vaikuta tähän. Perustelut löytyvät kohdasta Identtiset aloitusviestit johtavat numeroiden rajoittamiseen.
Lähetä suoraan WhatsApp Web -numeroon
POST /whatsapp-web/send
Lähetä viesti puhelinnumeroon WhatsApp Webissä etsimättä ensin yhteystietoa. Jos numero ei ole vielä yhteystieto, se luodaan saman kutsun yhteydessä tekoälyn ollessa pois päältä, jolloin viesti näyttää käsin lähetetyltä eikä avustaja ota keskustelua haltuunsa sen jälkeen. Olemassa olevaa yhteystietoa käytetään sellaisenaan.
| Kenttä | Pakollinen | Kuvaus |
|---|---|---|
phoneNumber |
Kyllä | Numero, johon viesti lähetetään, kansainvälisessä muodossa (+31612345678). |
message |
Ei | Lähetettävä teksti. Joko message tai mediaUrl on oltava määritettynä. |
mediaUrl |
Ei | Julkinen URL-osoite lähetettävälle tiedostolle. Joko message tai mediaUrl on oltava määritettynä. |
mediaContentType |
Ei | Tiedoston MIME-tyyppi, esimerkiksi image/jpeg. Määritetään URL-osoitteesta, jos jätät tämän tyhjäksi. |
sendAsVoiceNote |
Ei | true lähettää äänitiedoston ääniviestinä liitetiedoston sijaan. |
fromPhoneNumber |
Ei | Mitä yhdistettyä WhatsApp Web -numeroasi käytetään lähetykseen, kansainvälisessä muodossa. Oletuksena numero, johon yhteystieto jo kuuluu. |
campaignId |
Ei | Käytä tämän agentin aktiivisia aikoja tilin oletusasetusten sijaan. On oltava saman tilin agentti. |
ignoreActiveHours |
Ei | true lähettää viestin välittömästi riippumatta aktiivisista ajoista. |
sub_account_id |
Ei | Toimistoille: lähetä asiakastilisi puolesta. |
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."
}'
Onnistunut kutsu vastaa 202:
{ "success": true, "queued": true, "contactId": "abc123" }
202 tarkoittaa, että viesti on hyväksytty, mutta ei vielä toimitettu. Aktiivisten aikojen ulkopuolella lähetys pidetään jonossa ja lähetetään seuraavassa sallitussa aikaikkunassa, ellet käyttänyt ignoreActiveHours-valintaa. Lue viestin oma tila kohdasta Listaa yhteystiedon viestit käyttämällä tästä saatua contactId-tunnistetta.
Kun lähetys ei onnistu:
| Tila | Koodi | Mitä tapahtui |
|---|---|---|
400 |
INVALID_PHONE_FORMAT |
Numero ei ole kansainvälisessä muodossa, tai phoneNumber puuttuu, tai molemmat message ja mediaUrl puuttuvat. |
400 |
CONTACT_DND |
Yhteystiedolla on Älä häiritse -tila päällä, joten mitään lähtevää ei lähetetä. |
400 |
CONTACT_PRIVATE |
Yhteystieto on merkitty yksityiseksi. |
404 |
CAMPAIGN_NOT_FOUND |
Mikään agentti ei vastaa antamaasi campaignId-tunnistetta. |
403 |
CAMPAIGN_FORBIDDEN |
Kyseinen agentti kuuluu toiselle tilille. |
402 |
Tilillä ei ole saldoa jäljellä tai WhatsApp Web -numeroa ei ole yhdistetty. |
Toinen kutsu samalle yhteystiedolle, kun yksi lähetys on vielä jonossa, vastaa 409, joten jono ei koskaan kerry yhden henkilön taakse.
Lisää muistiinpano keskusteluun
POST /contacts/notes
Lisää rivin yhteyshenkilön keskusteluun lähettämättä sitä. Käytä tätä kontekstiin, joka tiimilläsi ja tekoälyllä tulisi olla, mutta jota yhteyshenkilön ei pitäisi koskaan nähdä: yhteenveto puhelusta, jonka puheagenttisi juuri soitti, huomautus CRM-järjestelmästäsi tai kollegan jättämä viesti. Tämä toimii kaikissa kanavissa (WhatsApp, SMS, Instagram, Messenger, Telegram, chat-widget, mukautetut kanavat ja niin edelleen).
Mitä muistiinpanolle tapahtuu:
- Se näkyy keskustelussa saapuneet-kansiossa keltaisena Muistiinpano-korttina, jossa näkyy kirjoittaja, jos sellainen on määritetty.
- Tekoäly lukee sen osana keskusteluhistoriaa sisäisenä muistiinpanona, joten se ottaa sen huomioon seuraavassa vastauksessaan.
- Sitä ei koskaan lähetetä yhteyshenkilölle, se ei kuluta viestikiintiötä eikä käynnistä mitään: ei tekoälyn vastausta, ei automaatiota, ei webhookia, ei ilmoitusta eikä lukemattomien viestien merkkiä. Se ei keskeytä tekoälyä eikä lasketa tiimisi vastaukseksi.
Etsi yhteyshenkilö samalla tavalla kuin kohdassa Lähetä yhteyshenkilön tunnisteella: joko sen ID:llä tai channel-tunnisteella ja vastaavalla tunnisteella. Muistiinpano lähetetään vain yhteyshenkilölle, joka on jo olemassa; jos mitään ei löydy, tuloksena on 404.
| Kenttä | Pakollinen | Kuvaus |
|---|---|---|
contact_id |
Toinen näistä | Yhteyshenkilön ID. |
channel + identifier |
Toinen näistä | channel plus phone_number (WhatsApp, WhatsApp Web, SMS), instagram_id, messenger_id tai telegram_user_id, kuten kohdassa Lähetä yhteyshenkilön tunnisteella. |
body |
Kyllä | Muistiinpanon teksti, enintään 4 000 merkkiä. Rivinvaihdot säilytetään. |
author |
Ei | Kuka tai mikä kirjoitti sen, enintään 80 merkkiä, esimerkiksi Voice agent tai Sarah (sales). Näytetään kortissa ja tekoälylle. |
timestamp |
Ei | Milloin se tapahtui, epoch-millisekunteina. Oletusarvona on nykyhetki. Käytä puhelun päättymisaikaa, jotta muistiinpano sijoittuu oikeaan kohtaan ketjussa. Se ei voi olla yli 5 minuuttia tulevaisuudessa; myöhempi aika hylätään 400-virheellä. |
external_id |
Ei | Oma ID:si tälle muistiinpanolle, enintään 200 merkkiä, esimerkiksi puhelun ID. Saman external_id lähettäminen samalle yhteyshenkilölle uudelleen ei lisää toista muistiinpanoa; vastaus sisältää tällöin duplicate: true. Käytä tätä, jotta uudelleen lähetetty webhook ei kirjaa samaa puhelua kahdesti. |
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"
}'
Vastaus (201 tai 200, jossa on duplicate: true, kun external_id oli jo kirjattu)
{
"success": true,
"messageId": "note_4c1f0e...",
"contactId": "contact123"
}
Muistiinpano näkyy kohdassa Listaa yhteyshenkilön viestit tunnisteella type: "note".
Luo vastausluonnos tekoälyllä
POST /contacts/{contactId}/draft-reply
Pyytää keskustelua käsittelevää tekoälyagenttia kirjoittamaan seuraavan vastauksen ja palauttaa tekstin sinulle. Mitään ei lähetetä. Se on sama luonnos, jonka postilaatikon Luo vastaus -painike kirjoittaa: agentti käyttää asetuksiaan, tietokantaansa ja tähänastista keskustelua vastatakseen yhteyshenkilön kielellä. Käytä tätä asettaaksesi ihmisen (tai oman sovelluksesi) tekoälyn ja yhteyshenkilön väliin: hae luonnos, näytä se hyväksyttäväksi ja lähetä se sitten Lähetä yhteyshenkilön tunnuksella -toiminnolla, joko muutettuna tai sellaisenaan.
- Luonnoksen kirjoittaa yhteyshenkilölle määritetty agentti. Yhteyshenkilö, jolla ei vielä ole agenttia, saa sen agentin, joka vastaisi hänen seuraavaan viestiinsä.
- Luonnostelun aikana agentti ei suorita mitään työkaluja tai toimintoja, joten varauksia, tunnisteiden lisäämistä, siirtoja tai muita toimintoja ei tapahdu.
- Keskusteluun ei tallenneta mitään, eikä yhteyshenkilö näe mitään.
- Luonnos maksaa saman verran krediittejä kuin yksi kyseisen agentin tekoälyvastaus tässä keskustelussa, eikä se maksa mitään, kun oma tekoälyavaimesi on yhdistetty.
- Keskustelussa on oltava vähintään yksi viesti.
Kaikki runkokentät ovat valinnaisia; tyhjä runko (tai rungon puuttuminen) luonnostelee seuraavan vastauksen.
| Kenttä | Pakollinen | Kuvaus |
|---|---|---|
instruction |
Ei | Kertaluonteinen ohje tälle luonnokselle, enintään 2 000 merkkiä, sama kuin pitkä painallus Luo vastaus -painikkeessa postilaatikossa. Esimerkiksi Offer Tuesday at 3pm tai Ask for their email address. |
campaign_id |
Ei | Luonnostele tämän kampanjan alla yhteyshenkilön agentin sijaan. |
purpose |
Ei | chat_reply (oletus) kirjoittaa viestin yhteyshenkilölle. faq_answer kirjoittaa lyhyen vastauksen yhteyshenkilön kysymykseen, joka toimii itsenäisesti tietokannan UKK-osiota varten. |
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" }'
Vastaus (200)
{
"success": true,
"contact_id": "contact123",
"draft": "Hi Sara, Tuesday at 3pm works for the consultation. Shall I put you down for it?"
}
400 tarkoittaa, että keskustelussa ei ole vielä viestejä, krediittisi loppuivat tai yhteyshenkilöllä ei ole agenttia tai kampanjaa, josta luonnostella (error kertoo kumpi). 404 tarkoittaa, että yhteyshenkilöä ei ole olemassa tai tiimin jäsenen avain on rajoitettu yhteyshenkilöihin, joita hän ei voi nähdä. Avaimella tai tiimin jäsenellä on oltava oikeus muokata viestejä.
Käytätkö tekoälyasiakasohjelmaa MCP:n kautta? Sama toiminto on käytettävissä
generate_reply_draft-työkaluna.
Listaa yhteyshenkilön viestit
GET /contacts/{contactId}/messages
Palauttaa yhteyshenkilön viestit uusimmasta alkaen, käyttäen osoittimeen (cursor) perustuvaa sivutusta.
| Kyselyparametri | Pakollinen | Kuvaus |
|---|---|---|
limit |
Ei | Sivun koko. Oletus 50, enimmäismäärä 100. |
cursor |
Ei | next_cursor-arvo edellisestä vastauksesta. Palauttaa osoitinta vanhemmat viestit. |
filter |
Ei | Suodata sisältötyypin mukaan: all (oletus), text, media tai tool_use. |
direction |
Ei | Suodata suunnan mukaan: all (oletus), inbound (vastaanotettu yhteyshenkilöltä) tai outbound (lähetetty sinun toimestasi). |
Huomautus suodatuksesta ja sivutuksesta:
filter- jadirection-suodattimet sovelletaan jokaiselle sivulle sen lukemisen jälkeen, joten suodatettu sivu voi sisältää vähemmän kohteita kuinlimit.next_cursoretenee edelleen koko keskustelun läpi, joten jatka sivutusta, kunnesnext_cursoronnull.
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"])
Vastaus (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"
}
Viestikentät
| Kenttä | Kuvaus |
|---|---|
id |
Viestin yksilöllinen ID. |
body |
Viestin tekstisisältö. Jos viestissä on liite, body alkaa hakasulkeissa olevalla huomautuksella saapuneesta sisällöstä, jota seuraa mahdollinen kuvateksti, esimerkiksi [THE CONTACT UPLOADED AN IMAGE] Here is my CV tai [THE CONTACT UPLOADED A VOICE NOTE] - [TRANSCRIPTION: ...]. Ääniviestit ja videot sisältävät litteroinnin. |
direction |
inbound (vastaanotettu yhteyshenkilöltä) tai outbound (tilisi lähettämä). |
channel |
Kanava, jossa viesti lähetettiin tai vastaanotettiin (esim. whatsapp, sms, instagram). |
status |
Nykyinen toimitustila, esim. Created, sent, delivered, read, failed. |
type |
Viestin tyyppi. Tavallisilla tekstiviesteillä on tyyppi null; automatisoidun avustajan työkalutoiminnot on merkitty tool_use. |
timestamp |
ISO 8601 -aika, jolloin viesti luotiin. |
media_url |
Liitetyn mediatiedoston URL-osoite, jos sellainen on. Tämä linkki lakkaa toimimasta 7 päivää viestin saapumisen jälkeen kaikissa kanavissa (WhatsApp Business API, WhatsApp Web, Instagram, Messenger, Telegram, chat-widget ja muut). Hae uusi linkki kohdasta Lataa viestin liite. |
media_content_type |
Liitetyn median MIME-tyyppi, jos sellainen on. |
bot_reply |
true, kun viesti on tekoälyavustajan luoma. |
score |
Arviosi viestistä: 1 peukalo ylös, -1 peukalo alas, 0 kun sitä ei ole arvosteltu. Katso Arvostele tai tähditä viesti. |
is_important |
true, kun viesti on tähditetty. |
is_deleted |
true, kun viesti on poistettu. Poistetut viestit pysyvät listassa, mutta niiden body ja media_url ovat tyhjiä. |
reactions |
Emojireaktiot viestissä, molemmilta puolilta. Aina taulukko — tyhjä, jos reaktioita ei ole. Jokaisella merkinnällä on emoji, from_phone_number, from_me (true, kun reaktio on omasi) ja reacted_at. |
faq_ids_used |
Niiden tietokannan UKK-kysymysten ID:t, jotka tekoälyllä oli käytettävissään kirjoittaessaan tämän vastauksen: viimeisimpään viestiin valitut sekä aiemmasta keskustelusta säilytetyt. Sama lista on jokaisessa viestissä, joka lähetettiin useassa osassa. Aina taulukko, tyhjä saapuville viesteille, ihmisten lähettämille viesteille, automaattisille seurannoille ja ennen 25. syyskuuta 2026 lähetetyille tekoälyvastauksille. |
faqs_used |
Samat UKK-kysymykset kysymyksineen: jokaisella merkinnällä on id ja question. question on null, jos UKK on poistettu sen jälkeen. |
Lataa viestin liite
POST /chat-exports/media/download-url
Antaa sinulle uuden latauslinkin viestiin liitettyyn tiedostoon: kuvaan, ääniviestiin, videoon tai asiakirjaan. Linkki toimii 1 tunnin ajan. Käytä tätä, kun haluat tallentaa liitteitä muualle (esimerkiksi arkistoidaksesi ansioluetteloita tai yhteyshenkilön lähettämiä ääniviestejä) tai kun viestin media_url tai uuden viestin webhook ei enää avaudu.
Löytääksesi viestit, joissa on liitteitä, listaa yhteyshenkilön viestit käyttämällä filter=media. Kunkin viestin id ja yhteyshenkilön tunniste muodostavat messagePath:n.
| Runkokenttä | Pakollinen | Kuvaus |
|---|---|---|
messagePath |
Kyllä | Mikä viesti, muodossa 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"]
Vastaus (200 OK):
{
"success": true,
"data": {
"url": "https://storage.googleapis.com/...",
"expiresInMs": 3600000
}
}
| Kenttä | Kuvaus |
|---|---|
data.url |
Latauslinkki. Hae tiedosto suoraan sen kautta, API-avainta ei tarvita. |
data.expiresInMs |
Kuinka kauan linkki toimii millisekunteina (3600000 = 1 tunti). Kutsu päätepistettä uudelleen saadaksesi uuden linkin. |
| Tila | Milloin |
|---|---|
400 |
messagePath puuttuu tai se ei ole contacts/{contactId}/messages/{messageId}-muodossa, tai viestissä ei ole liitettä, joka voidaan ladata tällä tavalla. Jotkin vanhemmat liitteet on tallennettu kanavapalveluntarjoajalle, eikä niitä voida luoda uudelleen, ja jaettu Instagram-kela tai -julkaisu on linkki Instagramiin eikä tiedosto. |
403 |
Yhteyshenkilö ei kuulu tiliisi. |
404 |
Kyseisellä yhteyshenkilöllä ei ole kyseisellä tunnuksella varustettua viestiä. |
Käytätkö tekoälyasiakasohjelmaa MCP:n kautta? Sama toiminto on käytettävissä
get_chat_media_download_url-työkaluna.
Listaa keskusteluistunnot
Chat-istunto on yksi keskusteluikkuna yhteyshenkilön kanssa. Se avautuu ensimmäisestä saapuvasta viestistä, kun istuntoa ei ole auki, ja se sulkeutuu automaattisesti 48 tuntia yhteyshenkilön viimeisen saapuvan viestin jälkeen (jokainen uusi saapuva viesti siirtää sulkeutumista 48 tunnilla eteenpäin). Tekoälyn suorittama keskustelun päättäminen ei sulje istuntoa; se laukaisee ainoastaan Chat Concluded -verkkokoukun. Istuntojen avulla pitkä historia voidaan jakaa luettaviin keskusteluihin yhden loputtoman listan sijaan.
Viimeisimmät istunnot kaikilla yhteyshenkilöillä
GET /chat-sessions/recent
Palauttaa istunnot, jotka alkoivat viimeisen X tunnin aikana, uusimmasta alkaen, kaikilta tilin yhteyshenkilöiltä.
| Kyselyparametri | Pakollinen | Kuvaus |
|---|---|---|
hours |
Kyllä | Kuinka monta tuntia taaksepäin tarkastellaan. On oltava positiivinen kokonaisluku. |
status |
Ei | Palauta vain istunnot, joilla on tämä tila: ChatSessionOpened tai ChatSessionClosed. |
limit |
Ei | Palautettavien istuntojen enimmäismäärä. Oletus 100, enimmäismäärä 100. |
includeMessages |
Ei | true lisää messages-taulukon jokaiseen istuntoon. Pois päältä oletuksena, koska se tekee vastauksesta huomattavasti suuremman. |
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"])
Vastaus (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"
}
]
}
}
Kaikki yhden yhteyshenkilön istunnot
GET /chat-sessions/{contactId}
Palauttaa jokaisen keskusteluistunnon yhdelle yhteyshenkilölle. Samat status-, limit- ja includeMessages-parametrit kuin yllä – hours ei päde tässä.
cURL
curl "https://api.youraiconnector.com/v1/chat-sessions/contact123?limit=20" \
-H "X-API-Key: YOUR_API_KEY"
Vastaus (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"
}
]
}
}
Istunnon tunnisteen kenttien nimet eroavat näiden kahden päätepisteen välillä. Viimeisimpien istuntojen luettelossa sitä kutsutaan nimellä
session_id(se sisältää myös yhteyshenkilön tiedot, koska istunnot tulevat monilta yhteyshenkilöiltä); yhteyshenkilökohtaisessa luettelossa sitä kutsutaan nimelläid. Kumpaa tahansa arvoa käytetään, kun haet koko keskusteluketjua alla olevan{sessionId}-kohdan kautta.
Kun includeMessages=true, jokainen istunto saa messages-taulukon, jonka merkinnät sisältävät id, body, direction, timestamp, type, channel ja status.
Hae keskusteluketju
GET /contacts/{contactId}/chat-sessions/{sessionId}/messages
Chat-istunto ryhmittelee yhteyshenkilön viestit yhteen keskusteluikkunaan. Tämä päätepiste palauttaa yksittäisen istunnon koko viestiketjun vanhimmasta alkaen sekä istunnon metatiedot. Löydät yhteyshenkilön istuntotunnukset chat-istuntojen päätepisteiden kautta.
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"])
Vastaus (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-objekti raportoi status (ChatSessionOpened aktiivisena, ChatSessionClosed kun päättynyt), start_date_time, end_date_time ja ihmisluettavan tag. messages-taulukko käyttää samoja viestikenttiä kuin listauspäätepiste.
Muokkaa, poista ja reagoi viesteihin
Nämä päätepisteet muuttavat viestiä sen lähettämisen jälkeen. Kaksi niistä ottaa yhteyttä yhteyshenkilön kanavaan sekä omaan kopioosi, joten lue osion johdanto ennen niiden käyttöönottoa – se, mikä on mahdollista, riippuu täysin kanavasta, jossa keskustelu käydään.
Mitä kukin kanava sallii
| Toiminto | Kanavat, joissa yhteyshenkilön kopio voi muuttua | Aikaraja |
|---|---|---|
| Muokkaa lähetettyä viestiä | Chat-widget, WhatsApp Web (vain tekstiviestit), Telegram, LinkedIn | Ei aikarajaa chat-widgetissä, 15 minuuttia WhatsApp Webissä, 48 tuntia Telegramissa, 60 minuuttia LinkedInissä |
| Poista kaikilta | Chat-widget, WhatsApp Web, Telegram, LinkedIn | 60 minuuttia LinkedInissä; muilla ei ole julkaistua aikarajaa |
| Reagoi emojilla | WhatsApp Web, Telegram | Ei ole |
Kaikissa muissa kanavissa — WhatsApp Business API, SMS, Instagram, Messenger, sähköposti, LINE, mukautetut kanavat — poistaminen poistaa viestin edelleen postilaatikostasi, mutta yhteyshenkilö säilyttää oman kopionsa, eikä muokkaaminen tai reagoiminen ole lainkaan mahdollista.
Viestin muokkaaminen
POST /contacts/{contactId}/messages/{messageId}/edit
Kirjoittaa uudelleen jo lähettämäsi viestin sekä yhteyshenkilön laitteella että omassa kopiossasi.
| Kenttä | Pakollinen | Kuvaus |
|---|---|---|
body |
Kyllä | Uusi viestiteksti. Ei saa olla tyhjä eikä pidempi kuin kanavan sallima enimmäispituus (samat kanavakohtaiset rajoitukset kuin kohdassa Lähetä yhteyshenkilön tunnisteella; 4 096, kun viestillä ei ole kanavaa). |
Toisin kuin poistaminen, tämä epäonnistuu näkyvästi, jos kanava kieltäytyy: saat 409-ilmoituksen ja kopiosi pysyy täsmälleen sellaisena kuin yhteyshenkilöllä, koska sellaisen muokkauksen näyttäminen, jota he eivät koskaan vastaanottaneet, saisi osapuolet epätahtiin. edit_reason-kenttä kertoo syyn – kanavan muokkausaika on umpeutunut, kanava on katkaistu, viestissä on liite, jota kanava ei voi muokata (media_not_editable: WhatsApp Webissä vain tekstiviestejä voi muokata, ei kuvan, videon tai tiedoston alla olevaa tekstiä), tai jokin muu meni vikaan.
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"))
Vastaus (200 OK):
{
"success": true,
"contact_id": "contact123",
"message_id": "msg_1",
"edited": true,
"edit_reason": "edit_dispatched"
}
Jos kanava ei hyväksy muokkausta, saat sen sijaan 409-vastauksen, eikä mitään muutettu:
{
"success": false,
"error": "The message could not be edited",
"edit_reason": "channel_disconnected"
}
Jo poistettu viesti, kanava, joka ei tue muokkaamista lainkaan, ja viesti, joka on liian vanha kanavalleen, palauttavat kaikki 400-vastauksen — pyyntö ei koskaan saavuta kanavaa.
Yhden viestin poistaminen
DELETE /contacts/{contactId}/messages/{messageId}
Poistaa viestin keskustelustasi ja, jos kanava sen sallii, hakee myös yhteyshenkilön kopion takaisin. Ei pyyntörunkoa.
Tämä vastaa aina 200, kun viesti oli olemassa, vaikka yhteyshenkilön kopiota ei olisi voitu poistaa — oma kopiosi on poistettu, joten virheilmoitus olisi harhaanjohtava. Lue vastauksen kolme kenttää kertoaksesi käyttäjälle, mitä todellisuudessa tapahtui:
| Kenttä | Kuvaus |
|---|---|
revoke_supported |
Voiko tämä kanava poistaa viestejä lainkaan. |
revoked |
Poistettiinko kopio yhteyshenkilön laitteelta. |
revoke_reason |
Miksi sitä ei poistettu, kun revoked on false — esimerkiksi revoke_window_closed tai 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"])
Vastaus (200 OK):
{
"success": true,
"contact_id": "contact123",
"message_id": "msg_1",
"revoke_supported": true,
"revoked": true,
"revoke_reason": "revoke_dispatched"
}
Poistettuja viestejä ei poisteta keskusteluhistoriasta. Ne säilyvät kohdassa
GET /contacts/{contactId}/messages, jossa onis_deleted: truesekä tyhjäbodyjamedia_url.
Poista useita viestejä kerralla
POST /contacts/{contactId}/messages/bulk-delete
Tyhjentää viestierän vain omalta puoleltasi. Viestien sisältö ja liitteet tyhjennetään, mutta mitään ei peruta yhteyshenkilön laitteelta – jos haluat myös peruuttaa viestin, poista se yksitellen yllä olevan yksittäisen viestin päätepisteen kautta.
| Kenttä | Pakollinen | Kuvaus |
|---|---|---|
message_ids |
Kyllä | Tyhjästä poikkeava taulukko viestien tunnisteita, enintään 500 per pyyntö. messageIds hyväksytään aliaksena. |
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"])
Vastaus (200 OK):
{
"success": true,
"contact_id": "contact123",
"deleted": 2
}
Reagoi viestiin
POST /contacts/{contactId}/messages/{messageId}/react
Lisää oman emojireaktiosi viestiin tai poista se lähettämällä tyhjä merkkijono. Yhteyshenkilön omia reaktioita ei koskaan muuteta.
| Kenttä | Pakollinen | Kuvaus |
|---|---|---|
emoji |
Kyllä | Emojireaktio tai "" reaktion poistamiseksi. Täytyy olla yksittäinen merkkijono ilman välilyöntejä, enintään 16 merkkiä. |
Muokkaamisen tavoin tämä epäonnistuu sen sijaan, että näyttäisi reaktion, jota yhteyshenkilö ei koskaan saanut, ja virheilmoitus kertoo, kannattaako yrittää uudelleen:
422— viestiä ei voi koskaan toimittaa tässä keskustelussa: kanava ei tue reaktioita, viestillä ei ole kanavapuolen tunnistetta tai emoji ei kuulu kanavan sallimiin merkkeihin.409— kanava ei ollut hetkellisesti tavoitettavissa. Uudelleenyritys saattaa toimia.
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"])
Vastaus (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-taulukko sisältää kaikki viestin reaktiot, sekä sinun että yhteyshenkilön. 409- tai 422-tilanteessa se palautetaan muuttumattomana, joten suoraan siitä renderöivä asiakasohjelma ei koskaan näytä reaktiota, jota ei ole toimitettu.
Arvioi tai tähditä viesti
PATCH /contacts/{contactId}/messages/{messageId}
Arvioi viestin peukalolla ylös tai alas ja/tai merkitse se tähdellä tärkeäksi. Tämä on kirjanpitoa vain omalla puolellasi – mitään ei lähetetä yhteyshenkilölle.
| Kenttä | Pakollinen | Kuvaus |
|---|---|---|
score |
Ei | 1 peukku ylös, -1 peukku alas, 0 poistaa arvion. |
is_important |
Ei | true lisää tähden viestiin, false poistaa sen. On oltava totuusarvo (boolean), ei merkkijono "true". |
Lähetä vähintään toinen näistä, muuten saat 400-virheen. Vain lähetetyt tiedot kirjoitetaan, joten viestin tähdittäminen ei koskaan poista sen arviota ja päinvastoin – ja vastaus palauttaa vain lähettämäsi kentät.
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},
)
Vastaus (200 OK):
{
"success": true,
"contact_id": "contact123",
"message_id": "msg_1",
"score": 1,
"is_important": true
}
Merkitse viestit luetuiksi
Voit poistaa lukemattoman tilan joko tietyiltä viesteiltä tai koko keskustelulta.
Merkitse tietyt viestit luetuiksi
POST /contacts/{contactId}/messages/mark-read
Välitä niiden viestien tunnukset, jotka haluat merkitä luetuiksi.
| Kenttä | Pakollinen | Kuvaus |
|---|---|---|
message_ids |
Kyllä | Tyhjentämätön taulukko viestien tunnuksista (enintään 500 per pyyntö). |
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"])
Vastaus (200 OK):
{
"success": true,
"contact_id": "contact123",
"marked_read": 2
}
Merkitse koko chat luetuksi
POST /contacts/{contactId}/mark-read
Poistaa lukemattomien viestien merkin yhteyshenkilön koko keskustelusta saapuneet-kansiossa. Pyyntörunkoa ei tarvita.
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"])
Vastaus (200 OK):
{
"success": true,
"contact_id": "contact123"
}
Merkitse koko keskustelu lukemattomaksi
POST /contacts/{contactId}/mark-unread
Palauttaa lukemattoman viestin merkin keskusteluun – kätevää, kun joku tiimistäsi on avannut keskustelun, mutta siirtää sen takaisin. Pyynnön runkoa ei tarvita.
Tämä on vain postilaatikkoa koskeva lippu: se ei muuta sitä, milloin keskustelu on viimeksi luettu, joten lukukuittausta ei lähetetä yhteyshenkilölle kanavilla, jotka tukevat niitä.
cURL
curl -X POST "https://api.youraiconnector.com/v1/contacts/contact123/mark-unread" \
-H "X-API-Key: YOUR_API_KEY"
Vastaus (200 OK):
{
"success": true,
"contact_id": "contact123"
}
Vie keskustelu
Viennit tarjoavat koko keskustelun luettavana litteraattina sen sijaan, että joutuisit selaamaan viestejä sivuittain. Jokainen vientirajapinta hyväksyy filter-parametrin, jonka arvo on all (oletus), text, media tai tool_use, vastaten viestilistan suodatinta.
Vie yhden yhteyshenkilön keskustelu
GET /chat-exports/{contactId}
| Kyselyparametri | Pakollinen | Kuvaus |
|---|---|---|
format |
Ei | txt (oletus) palauttaa latauslinkin selväkieliseen litteraattiin. json palauttaa viestit jäsenneltynä tietona vastauksessa. |
filter |
Ei | all (oletus), text, media tai 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"])
Vastaus, jossa on 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
}
]
}
}
Kun käytössä on format=txt (oletus), data on sen sijaan latauslinkki luotuun litteraattitiedostoon:
{
"success": true,
"data": "https://storage.googleapis.com/.../chat-export-contact123-....txt"
}
Latauslinkki on lyhytikäinen. Hae tiedosto heti, kun saat linkin, sen sijaan että tallentaisit sen – pyydä uusi vienti, kun tarvitset litteraattia uudelleen.
Vie kaikki viimeaikaiset keskustelut
GET /chat-exports/recent
Vie kaikkien niiden yhteystietojen keskustelut, jotka ovat olleet aktiivisia viimeisen X tunnin aikana, yhdellä kutsulla.
| Kyselyparametri | Pakollinen | Kuvaus |
|---|---|---|
hours |
Kyllä | Kuinka monen tunnin ajalta aktiivisuutta tarkastellaan. On oltava positiivinen kokonaisluku. |
format |
Ei | json (oletus) palauttaa yhden merkinnän per yhteystieto. txt palauttaa yhden ladattavan tekstitiedoston, joka sisältää kaikki keskustelut. |
limit |
Ei | Vientiin sisällytettävien yhteystietojen enimmäismäärä. Oletus 50, enimmäismäärä 100. |
filter |
Ei | all (oletus), text, media tai tool_use. |
cURL
curl "https://api.youraiconnector.com/v1/chat-exports/recent?hours=24&limit=25" \
-H "X-API-Key: YOUR_API_KEY"
Vastaus (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..."
}
]
}
}
Kun käytössä on format=txt, vastaus on itse tekstitiedosto, joka lähetetään ladattavana tiedostona JSON-muodon sijaan.
Tämä yksi kutsu hakee kaikkien vastaavien yhteystietojen koko historian, joten pidä
hoursjalimitmaltillisina kiireisillä tileillä.
Lähetä keskusteluhistoria sähköpostitse yhteystiedolle
POST /chat-exports/{contactId}/email
Lähettää yhteystiedolle hänen oman keskusteluhistoriansa sähköpostitse – tämä on “lähetä tämä keskustelu minulle sähköpostilla” -toiminto, joka käynnistetään omasta järjestelmästäsi.
| Kenttä | Pakollinen | Kuvaus |
|---|---|---|
recipient_email |
Ei | Minne se lähetetään. Oletuksena yhteystiedon tallennettu sähköpostiosoite. |
via |
Ei | auto (oletus) valitsee parhaan reitin, transactional lähettää sen järjestelmäsähköpostina, email_channel lähettää sen yhdistetyn sähköpostikanavasi kautta. |
note |
Ei | Lyhyt viesti sinulta, joka näkyy keskusteluhistorian yläpuolella. Enintään 1000 merkkiä. |
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." }'
Vastaus (200 OK):
{
"success": true,
"data": {
"via": "transactional",
"recipientEmail": "jane@example.com",
"messageCount": 42,
"omittedCount": 0
}
}
omittedCount kertoo, kuinka monta vanhinta viestiä jätettiin pois, jotta sähköpostin pituus pysyisi järkevänä. 200 tarkoittaa, että keskusteluhistoria luotiin ja asetettiin lähetysjonoon, ei sitä, että se olisi jo saapunut postilaatikkoon.
Tekoälyn keskeyttäminen tai jatkaminen yhdelle yhteyshenkilölle
PUT /contacts/{contactId}
Aseta is_bot_active arvoon false, kun haluat estää tekoälyä vastaamasta yhdelle yhteyshenkilölle, ja takaisin arvoon true, kun haluat palauttaa keskustelun botille. Tämä on haltuunottokytkin, jota tarvitset, kun ihminen astuu keskusteluun: API:n kautta lähettämäsi viestit toimitetaan edelleen, vaikka botti olisi keskeytettynä.
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},
)
Vastaus
{
"success": true,
"contact_id": "contact123"
}
Keskeyttäminen vastauksen yhteydessä
Jos ihminen ottaa keskustelun haltuunsa lähettämällä vastauksen, voit keskeyttää botin samassa pyynnössä sen sijaan, että tekisit toisen kutsun. POST /contacts/{contactId}/send-message hyväksyy nämä valinnaiset liput:
| Kenttä | Kuvaus |
|---|---|
pauseBot |
true keskeyttää tekoälyn tältä yhteyshenkilöltä viestiä lähetettäessä. |
clearIncompleteReply |
true hylkää keskeneräisen botin vastauksen, jotta se ei jatku sen jälkeen. |
human_reply |
true merkitsee viestin tiimiläisen vastaukseksi ja peruuttaa tekoälyn jonottaman vastauksen. Keskeyttäminen vaatii edelleen 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
}'
Vastaus sisältää kohdan "botPaused": true, kun keskeytys on otettu käyttöön.
Yhteyshenkilön merkitseminen yksityiseksi käyttämällä kohdetta
POST /contacts/bulk-flagkeskeyttää myös botin kyseisen henkilön kohdalla. Katso täydellinen kenttäluettelo kohdasta Yhteyshenkilöt.
Oman postilaatikon rakentaminen
Kaikki postilaatikon tarvitsema tieto löytyy tältä sivulta ja kohdasta Yhteyshenkilöt:
| Mitä tarvitset | Päätepiste |
|---|---|
| Listaa keskustelut | GET /contacts |
| Lue keskustelu | GET /contacts/{contactId}/messages |
| Listaa yhteystiedon chat-istunnot | GET /chat-sessions/{contactId} |
| Katso mitä on tullut hiljattain | GET /chat-sessions/recent |
| Lue yksi chat-istunto | GET /contacts/{contactId}/chat-sessions/{sessionId}/messages |
| Lähetä manuaalinen vastaus | POST /contacts/{contactId}/send-message |
| Korjaa juuri lähettämäsi vastaus | POST /contacts/{contactId}/messages/{messageId}/edit |
| Poista viesti | DELETE /contacts/{contactId}/messages/{messageId} |
| Tyhjennä useita viestejä | POST /contacts/{contactId}/messages/bulk-delete |
| Reagoi emojilla | POST /contacts/{contactId}/messages/{messageId}/react |
| Arvioi tai tähditä viesti | PATCH /contacts/{contactId}/messages/{messageId} |
| Merkitse luetuksi | POST /contacts/{contactId}/mark-read |
| Palauta chat tiimille | POST /contacts/{contactId}/mark-unread |
| Vie keskusteluhistoria | GET /chat-exports/{contactId} |
| Keskeytä tai jatka tekoälyä | PUT /contacts/{contactId} käyttäen is_bot_active |
Reaaliaikaisia päivityksiä varten tilaa tapahtumat New Message, Replies, Human Alerted ja Chat Concluded käyttämällä Webhookeja sen sijaan, että kyselisit tätä API:a ajastetusti.
Messages API -virheet
Viestien päätepisteet palauttavat vakiomuotoisen virhekuoren:
{
"success": false,
"error": "Contact not found"
}
| Tila | Milloin se tapahtuu viestin päätepisteessä |
|---|---|
400 |
Pakollinen kenttä puuttuu tai parametri on virheellinen (väärä limit, hours, filter, direction, status, tyhjä tai yli 500 viestin message_ids-taulukko, virheellinen cursor, tyhjä tai liian pitkä muokkaus body, score -1/0/1-alueen ulkopuolella, tai emoji, jossa on välilyöntejä tai joka on yli 16 merkkiä pitkä). Palautetaan myös, kun viestiä ei voi muokata lainkaan – se on poistettu, sen kanava ei tue muokkausta tai se on kyseisen kanavan muokkausajan ulkopuolella. |
404 |
Yhteystietoa, chat-istuntoa tai yhtä annetuista viestitunnuksista ei löytynyt. |
409 |
Kanava ei hyväksy muutosta juuri nyt. Mitään ei kirjoitettu: muokkauksen yhteydessä edit_reason kertoo syyn; reaktion yhteydessä kanava oli hetkellisesti tavoittamattomissa ja uusi yritys voi toimia. |
422 |
Yhteystieto ei voi vastaanottaa lähteviä viestejä (älä häiritse -tila, yksityinen tai tukematon kanava), tai reaktiota ei voida koskaan toimittaa tässä keskustelussa (reaction_reason kertoo kumpi). |
Jaetut koodit, joita jokainen päätepiste voi palauttaa — 401, 403 (tilauksesi ei sisällä API-käyttöoikeutta), 429 (nopeusrajoitus) ja 500 — on lueteltu uudelleenyritysohjeiden kera kohdassa Virheet ja sivutus.
Seuraavat vaiheet
- Webhooks — vastaanota toimitustilan päivitykset suoraan sen sijaan, että kyselisit niitä.
- Yhteystiedot — luo ja etsi yhteystietoja, joille lähetät viestejä.
- Ajanvaraukset — varaa ja hallinnoi yhteystietojesi ajanvarauksia.