Campaigns API
En kampanj samlar allt som AI-boten behöver för att prata med dina kontakter: dess instruktioner, kanalerna den körs på, dess aktiva tider och dess uppföljningsbeteende. Campaigns API låter dig lista, skapa, uppdatera, duplicera, aktivera, arkivera och finjustera kampanjer från din egen kod istället för från instrumentpanelen.
Alla slutpunkter nedan är relativa till bas-URL:en https://api.youraiconnector.com/v1. Varje anrop måste autentiseras — se API-åtkomst och Autentisering för hur du hämtar och skickar med din API-nyckel. API-åtkomst är en betalfunktion; utan den avvisas anrop med ett 403.
Observera: Vissa exempel visar den enkla
?apiKey=YOUR_API_KEY-frågeformen, andra använderX-API-Key-huvudet. Båda fungerar överallt — använd det som passar din konfiguration bäst.
Kampanjtyper
När du skapar en kampanj måste du välja en av dessa typer:
| Typ | Vad den är till för |
|---|---|
Incoming from Unknown Contacts |
Boten svarar personer som skickar meddelanden till dig för första gången. |
Outgoing |
Boten startar konversationer med kontakter som du lägger till i kampanjen. |
Keywords |
Inaktiv - använd ej. En Keywords-kampanj är inaktiv: den accepteras fortfarande för bakåtkompatibilitet, men den är osynlig för inkommande routning på alla kanaler och ingenting läser dess trigger-nyckelord. Använd en ingångspunkt av typen Nyckelord på en AI-agent istället. |
Combined |
En blandning av inkommande och utgående beteende. |
Skiftläge spelar ingen roll. type, status, booking_provider, first_response_mode, bot.anthropic_model och bot.ai_speed accepterar alla skiftlägen – "live", "Live" och "LIVE" är samma sak – och värdet lagras i sin kanoniska form, vilket är det som returneras när du läser kampanjen. Det enda undantaget är paus-paret: "Paused" och "paused" är två genuint olika tillstånd, så en tvetydig stavning som "PAUSED" avvisas med ett 400 som ber dig välja ett.
De två pauslägena
| Status | Vem skriver det | Vad det betyder |
|---|---|---|
Paused |
Plattformens egna säkerhetskontroller (lågt engagemang, upprepade sändningsfel, en gräns har nåtts) och de nyare Agent- och Broadcast-ytorna | Kampanjen hålls pausad. En schemalagd körning kan automatiskt häva en säkerhetspaus när orsaken har åtgärdats. |
paused |
Instrumentpanelens pausknapp, i kombination med resumed vid återupptagning |
En person pausade den manuellt. Schemalagda sändningar tas bort och byggs om vid återupptagning. |
Båda stoppar kampanjen: inkommande routning körs endast medan statusen är exakt Live. Från API:et, använd Paused för att pausa och Live för att återuppta — paret med gemener finns för instrumentpanelens knapp och bibehålls för att den ska fungera.
Inget av detta är vad som händer när AI:n slutar svara i en enskild konversation. Det är en inställning per kontakt, is_bot_active på kontakten — sätts när en människa tar över, när kontakten väljer att avregistrera sig eller när AI:n avslutar chatten. Kampanjens egen status förblir orörd, och alla andra konversationer i den fortsätter att köras. Se pausa eller återuppta AI:n för en kontakt.
Att skapa en kampanj avgör inte vem som svarar på en kanal. Routning hanteras av ingångspunkter på en AI-agent, inte av kampanjer. Varje kanal har en kanal-standardingångspunkt som anger den agent som svarar på nya, okända kontakter på den: ställ in den med
PUT /entry-points/channel-defaults, kontrollera om stegen är aktiv för kontot medGET /entry-points/routing-status, rensa den medDELETE /entry-points/channel-defaults.POST /channels/campaignskriver fortfarande den äldre routningskartan för kampanjer per kanal, men den kartan konsulteras inte längre för inkommande routning på något konto; den behålls endast för återställning. Bygg inte mot den. Se Routa en kanal till en kampanj för båda ytorna sida vid sida.
Lista kampanjer
GET /campaigns
Returnerar dina kampanjer, med de nyaste först. Arkiverade kampanjer exkluderas om du inte skickar med archived=true.
Frågeparametrar
| Parameter | Krävs | Beskrivning |
|---|---|---|
limit |
Nej | Maximalt antal kampanjer att returnera. Standard 50, maximalt 100. |
cursor |
Nej | Sidnumreringspekare. Skicka med next_cursor-värdet från föregående svar för att hämta nästa sida. |
archived |
Nej | Sätt till true för att inkludera arkiverade kampanjer. |
cURL
curl "https://api.youraiconnector.com/v1/campaigns?limit=20&apiKey=YOUR_API_KEY"
JavaScript
const res = await fetch("https://api.youraiconnector.com/v1/campaigns?limit=20", {
headers: { "X-API-Key": "YOUR_API_KEY" },
});
const data = await res.json();
console.log(data.campaigns, data.next_cursor);
Python
import requests
res = requests.get(
"https://api.youraiconnector.com/v1/campaigns",
params={"limit": 20},
headers={"X-API-Key": "YOUR_API_KEY"},
)
data = res.json()
print(data["campaigns"], data["next_cursor"])
Svar
{
"success": true,
"campaigns": [
{
"id": "NBCXrhqGPSFsd6MV7pRo",
"name": "Inbound WhatsApp Leads",
"type": "Incoming from Unknown Contacts",
"status": "Live",
"enabled": true,
"archived": false,
"created_at": 1700000000000,
"ai_mode": true,
"language": "en",
"enabled_channels": ["whatsapp", "instagram"]
}
],
"next_cursor": "NBCXrhqGPSFsd6MV7pRo"
}
När next_cursor är null har du nått den sista sidan.
Hämta en kampanj
GET /campaigns/{campaignId}
Returnerar det fullständiga kampanjdokumentet, inklusive konfigurationen för live-bot (bot), uppföljningsinställningar, aktiverade kanaler och eventuella nyckelord. Tidsstämplar returneras som epok-millisekunder.
cURL
curl "https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo?apiKey=YOUR_API_KEY"
JavaScript
const res = await fetch(
"https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo",
{ headers: { "X-API-Key": "YOUR_API_KEY" } }
);
const { campaign } = await res.json();
Python
import requests
res = requests.get(
"https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo",
headers={"X-API-Key": "YOUR_API_KEY"},
)
campaign = res.json()["campaign"]
Svar
{
"success": true,
"campaign": {
"id": "NBCXrhqGPSFsd6MV7pRo",
"name": "Inbound WhatsApp Leads",
"type": "Incoming from Unknown Contacts",
"status": "Live",
"language": "en",
"ai_mode": true,
"enabled": true,
"archived": false,
"created_at": 1700000000000,
"enabled_channels": ["whatsapp", "instagram"],
"bot": {
"instructions": "Greet warmly and ask about their goals.",
"goal": "Book a discovery call.",
"ai_speed": "balanced",
"anthropic_model": "standard",
"max_messages": 20
}
}
}
Obs: En kampanj som ägs av ett annat konto returnerar 404 Campaign not found (inte 403), så du kan inte avgöra om ett ID existerar på ett annat konto.
Skapa en kampanj
POST /campaigns
Skapar en ny kampanj. name och type krävs; allt annat är valfritt. Du kan inkludera vilket annat kampanjfält som helst i samma begäran — till exempel language, ai_mode eller ett fullständigt bot-konfigurationsobjekt — och det kommer att lagras med den nya kampanjen. Ägare och skapandetid ställs in automatiskt.
Begäransfält
| Fält | Krävs | Beskrivning |
|---|---|---|
name |
Ja | Kampanjens namn. |
type |
Ja | En av de fyra kampanjtyperna ovan. |
language |
Nej | Språket som boten svarar på (t.ex. "en"). |
ai_mode |
Nej | Huruvida AI-läge är aktiverat (true/false). För en kampanj som besvaras av en AI-agent returnerar läsningar agentens Aktiva-växling snarare än ett lagrat värde — se noteringen under uppdatering nedan. |
bot |
Nej | Botkonfigurationsobjektet (se Botkonfigurationsfält). |
list_id |
Nej | ID för kontaktlistan som ska bifogas. |
event_id |
Nej | ID för händelsetypen som AI:n kan boka. |
event_ids |
Nej | Flera händelsetyper samtidigt, som en array av händelsetyp-ID:n — den första är standard. Skicka antingen event_id eller event_ids, inte båda. |
cURL
curl -X POST "https://api.youraiconnector.com/v1/campaigns?apiKey=YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Spring Promo",
"type": "Outgoing",
"language": "en",
"ai_mode": true,
"bot": {
"instructions": "Greet warmly and ask about their goals.",
"goal": "Book a discovery call."
}
}'
JavaScript
const res = await fetch("https://api.youraiconnector.com/v1/campaigns", {
method: "POST",
headers: {
"X-API-Key": "YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
name: "Spring Promo",
type: "Outgoing",
language: "en",
ai_mode: true,
bot: {
instructions: "Greet warmly and ask about their goals.",
goal: "Book a discovery call.",
},
}),
});
const { campaign_id } = await res.json();
Python
import requests
res = requests.post(
"https://api.youraiconnector.com/v1/campaigns",
headers={"X-API-Key": "YOUR_API_KEY"},
json={
"name": "Spring Promo",
"type": "Outgoing",
"language": "en",
"ai_mode": True,
"bot": {
"instructions": "Greet warmly and ask about their goals.",
"goal": "Book a discovery call.",
},
},
)
campaign_id = res.json()["campaign_id"]
Svar
{
"success": true,
"campaign_id": "NBCXrhqGPSFsd6MV7pRo"
}
Uppdatera en kampanj
PUT /campaigns/{campaignId}
Uppdaterar en kampanj delvis — skicka endast de fält du vill ändra. Detta är det enda generella uppdateringskommandot; det finns inget PATCH /campaigns/{campaignId} (de två PATCH-rutterna är de specifika aktivera- och arkivera-växlarna).
Vilka fält du kan ändra. Allt som kampanjredigeraren skriver, inklusive name, status, type, language, ai_mode, enabled_channels, inställningar för utlösare och dropp-kampanjer, flaggor för bokning och uppföljning, fält för Instagram/Facebook-övervakning och hela bot-konfigurationen. Identitet och ägarskap är låsta under kampanjens livstid: user, id och created_at avvisas, liksom alla fältnamn som slutpunkten inte känner igen. Avvisning sker per förfrågan, inte per fält — en okänd nyckel returnerar ett 400 och ingenting i den förfrågan skrivs.
ai_mode för en kampanj som stöds av en agent återspeglar agenten. När en kampanj besvaras av en AI-agent returnerar läsning av kampanjen ai_mode härlett från agentens Aktiv-växel – den enda inställningen som faktiskt avgör om AI:n svarar. Att skriva ai_mode på en sådan kampanj accepteras men ändrar inte det du läser tillbaka; slå istället på eller av agentens Aktiv-växel (i instrumentpanelen eller via Agents API). För klassiska kampanjer utan agent läser och skriver ai_mode det lagrade värdet som tidigare.
Bot-fält slås samman, de skrivs inte över. Skicka bot-inställningar antingen som punktnoterade nycklar ("bot.instructions": "...") eller som ett nästlat objekt ("bot": { "instructions": "..." }) — båda skriver blad för blad, så de fält du utelämnar behåller sina nuvarande värden. bot.instructions, bot.goal, bot.rules och bot.personality är alla redigerbara på detta sätt, liksom alla andra bot-inställningar som listas under Bot-konfigurationsfält. Detsamma gäller för test_bot, frequency och follow_up_config.
För att ersätta en bot-konfiguration helt och hållet — och radera alla fält du inte skickar med — använd bot_replace (eller test_bot_replace) med det fullständiga objektet. Du kan inte kombinera en ersättning och en sammanslagning för samma objekt i en och samma förfrågan; det returnerar ett 400.
Notera: Att skriva bot.* via API:et får effekt omedelbart på den aktiva kampanjen. Instrumentpanelens redigerare fungerar annorlunda: ändringar där sparas som ett utkast och blir först aktiva när klienten klickar på Publicera. Så om en klient har opublicerade ändringar i instrumentpanelen ligger de kvar i test_bot, och en API-läsning av bot visar korrekt vad AI:n använder just nu.
Ett fåtal fält ställs in via en dedikerad nyckel istället för att skrivas direkt: använd list_id för kontaktlistan, event_id för händelsetypen (eller event_ids, en sorterad array av händelsetyp-ID:n, för att låta AI:n boka flera — den första är standard; en tom array kopplar bort dem alla), och contact_ids (en array av kontakt-ID:n) för kampanjens kontakter. Kunskapsbasposter hanteras via FAQ-API:et, inte denna slutpunkt.
Taggar ersätter, de slås inte samman. Skicka tags som den fullständiga arrayen så blir den kampanjens tagguppsättning — se Kampanjtaggar för fälten och för slutpunkterna som lägger till eller redigerar en enskild tagg.
cURL
curl -X PUT "https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo?apiKey=YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "name": "Spring Promo v2", "enabled_channels": ["whatsapp"] }'
JavaScript
const res = await fetch(
"https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo",
{
method: "PUT",
headers: {
"X-API-Key": "YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
name: "Spring Promo v2",
enabled_channels: ["whatsapp"],
}),
}
);
const data = await res.json();
Python
import requests
res = requests.put(
"https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo",
headers={"X-API-Key": "YOUR_API_KEY"},
json={"name": "Spring Promo v2", "enabled_channels": ["whatsapp"]},
)
data = res.json()
Svar
{
"success": true,
"campaign_id": "NBCXrhqGPSFsd6MV7pRo"
}
Ta bort en kampanj
DELETE /campaigns/{campaignId}
Tar bort en kampanj permanent. Detta kan inte ångras — om du kan tänkas behöva kampanjen igen, arkivera den istället.
cURL
curl -X DELETE "https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo?apiKey=YOUR_API_KEY"
JavaScript
const res = await fetch(
"https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo",
{ method: "DELETE", headers: { "X-API-Key": "YOUR_API_KEY" } }
);
const data = await res.json();
Python
import requests
res = requests.delete(
"https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo",
headers={"X-API-Key": "YOUR_API_KEY"},
)
data = res.json()
Svar
{
"success": true
}
Duplicera en kampanj
POST /campaigns/{campaignId}/duplicate
Skapar en kopia av kampanjen där alla inställningar bevaras. Kopian startar som inaktiverad och dess namn får suffixet (copy), så att den aldrig skickar meddelanden förrän du uttryckligen aktiverar den.
cURL
curl -X POST "https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo/duplicate?apiKey=YOUR_API_KEY"
JavaScript
const res = await fetch(
"https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo/duplicate",
{ method: "POST", headers: { "X-API-Key": "YOUR_API_KEY" } }
);
const { campaign_id } = await res.json();
Python
import requests
res = requests.post(
"https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo/duplicate",
headers={"X-API-Key": "YOUR_API_KEY"},
)
new_campaign_id = res.json()["campaign_id"]
Svar
{
"success": true,
"campaign_id": "aZ9plnewCopyId01234"
}
Duplicerade kopior inom ett konto.
Aktivera eller inaktivera en kampanj
PATCH /campaigns/{campaignId}/enabled
Slår på eller av en kampanj. En inaktiverad kampanj slutar interagera med kontakter men behåller all sin konfiguration.
Begäransfält
| Fält | Krävs | Beskrivning |
|---|---|---|
enabled |
Ja | true för att aktivera, false för att inaktivera. Måste vara ett booleskt värde. |
cURL
curl -X PATCH "https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo/enabled?apiKey=YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "enabled": true }'
JavaScript
const res = await fetch(
"https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo/enabled",
{
method: "PATCH",
headers: {
"X-API-Key": "YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({ enabled: true }),
}
);
const data = await res.json();
Python
import requests
res = requests.patch(
"https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo/enabled",
headers={"X-API-Key": "YOUR_API_KEY"},
json={"enabled": True},
)
data = res.json()
Svar
{
"success": true,
"campaign_id": "NBCXrhqGPSFsd6MV7pRo",
"enabled": true
}
Arkivera eller återställ en kampanj
PATCH /campaigns/{campaignId}/archived
Arkiverar eller återställer en kampanj. Arkiverade kampanjer döljs från standardlistan över kampanjer men behåller all sin data och kan återställas när som helst.
Begäransfält
| Fält | Krävs | Beskrivning |
|---|---|---|
archived |
Ja | true för att arkivera, false för att återställa. Måste vara ett booleskt värde. |
cURL
curl -X PATCH "https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo/archived?apiKey=YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "archived": true }'
JavaScript
const res = await fetch(
"https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo/archived",
{
method: "PATCH",
headers: {
"X-API-Key": "YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({ archived: true }),
}
);
const data = await res.json();
Python
import requests
res = requests.patch(
"https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo/archived",
headers={"X-API-Key": "YOUR_API_KEY"},
json={"archived": True},
)
data = res.json()
Svar
{
"success": true,
"campaign_id": "NBCXrhqGPSFsd6MV7pRo",
"archived": true
}
Uppdatera botkonfigurationen
PUT /campaigns/{campaignId}/bot-config
Detta är det säkra sättet att ändra enskilda botinställningar. Varje fält du skickar slås samman med den befintliga botkonfigurationen, så alla fält du utelämnar bevaras. Använd detta istället för slutpunkten för kampanjuppdatering när du bara vill justera en del av boten.
Fältnycklar får endast innehålla bokstäver, siffror, understreck och bindestreck.
cURL
curl -X PUT "https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo/bot-config?apiKey=YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"instructions": "Always answer in a friendly, concise tone.",
"ai_speed": "balanced"
}'
JavaScript
const res = await fetch(
"https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo/bot-config",
{
method: "PUT",
headers: {
"X-API-Key": "YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
instructions: "Always answer in a friendly, concise tone.",
ai_speed: "balanced",
}),
}
);
const data = await res.json();
Python
import requests
res = requests.put(
"https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo/bot-config",
headers={"X-API-Key": "YOUR_API_KEY"},
json={
"instructions": "Always answer in a friendly, concise tone.",
"ai_speed": "balanced",
},
)
data = res.json()
Svar
{
"success": true,
"campaign_id": "NBCXrhqGPSFsd6MV7pRo"
}
Fält för botkonfiguration
Alla botfält är valfria. Skicka endast de du vill ställa in. Alla ytterligare botfält utöver de som listas här accepteras och lagras som de är.
| Fält | Typ | Beskrivning |
|---|---|---|
instructions |
string | De primära instruktionerna som styr hur boten pratar med kontakter. |
rules |
string | Hårda regler som boten alltid måste följa. |
goal |
string | Resultatet som boten bör arbeta mot i varje konversation. |
personality |
string | Beskrivning av botens tonläge och personlighet. |
ai_speed |
string | Hur mycket resonemang AI:n tillämpar innan den svarar. En av fast, fast_thinker, balanced, thorough. |
anthropic_model |
string | AI-kvalitetsnivån som används för denna kampanjs svar. En av standard, economy (inaktuell), max, mini. max och mini träder endast i kraft på konton som är berättigade till dessa nivåer. |
max_messages |
integer | Maximalt antal botmeddelanden per konversation. |
alert_human_when |
string | Villkor under vilka boten bör varna en mänsklig teammedlem. |
availability |
object | Botens schema för aktiva timmar. Du kan ställa in detta här, eller använda den dedikerade slutpunkten för aktiva timmar. |
follow_up_config |
object | Konfiguration för uppföljningsbeteende, lagrad som angivet. |
Ställ in botens aktiva timmar
PUT /campaigns/{campaignId}/active-hours
Ställer in botens tillgänglighetsschema. Utanför de konfigurerade tidsfönstren svarar boten inte automatiskt. Detta skriver till fältet availability i botkonfigurationen.
Begäransfält
| Fält | Krävs | Beskrivning |
|---|---|---|
availability |
Ja | Ett objekt med veckodagar som nycklar. Tillåtna nycklar är monday till sunday; alla andra nycklar returnerar ett 400. Dagar som du utelämnar förblir oförändrade. |
Varje veckodag innehåller antingen ett enskilt tidsfönster eller en matris med fönster. Ett fönster har en start_time och end_time i 24-timmars HH:MM-format.
cURL
curl -X PUT "https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo/active-hours?apiKey=YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"availability": {
"monday": { "start_time": "09:00", "end_time": "17:00" },
"tuesday": [
{ "start_time": "09:00", "end_time": "12:00" },
{ "start_time": "13:00", "end_time": "17:00" }
]
}
}'
JavaScript
const res = await fetch(
"https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo/active-hours",
{
method: "PUT",
headers: {
"X-API-Key": "YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
availability: {
monday: { start_time: "09:00", end_time: "17:00" },
tuesday: [
{ start_time: "09:00", end_time: "12:00" },
{ start_time: "13:00", end_time: "17:00" },
],
},
}),
}
);
const data = await res.json();
Python
import requests
res = requests.put(
"https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo/active-hours",
headers={"X-API-Key": "YOUR_API_KEY"},
json={
"availability": {
"monday": {"start_time": "09:00", "end_time": "17:00"},
"tuesday": [
{"start_time": "09:00", "end_time": "12:00"},
{"start_time": "13:00", "end_time": "17:00"},
],
}
},
)
data = res.json()
Svar
{
"success": true,
"campaign_id": "NBCXrhqGPSFsd6MV7pRo"
}
Lista en kampanjs anpassade funktioner
GET /campaigns/{campaignId}/custom-functions
Returnerar de anpassade funktioner som är kopplade till denna kampanj, upplösta till fullständiga definitioner. Anpassade funktioner är externa HTTP-åtgärder som boten kan anropa under en konversation — till exempel för att kontrollera lagerstatus i din butik eller skapa en post i ditt CRM.
cURL
curl "https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo/custom-functions?apiKey=YOUR_API_KEY"
JavaScript
const res = await fetch(
"https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo/custom-functions",
{ headers: { "X-API-Key": "YOUR_API_KEY" } }
);
const { custom_functions } = await res.json();
Python
import requests
res = requests.get(
"https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo/custom-functions",
headers={"X-API-Key": "YOUR_API_KEY"},
)
custom_functions = res.json()["custom_functions"]
Svar
{
"success": true,
"custom_functions": [
{
"id": "fn_abc123",
"name": "check_stock",
"description": "Looks up whether a product is in stock.",
"url": "https://example.com/api/stock",
"method": "POST",
"input": [
{ "name": "sku", "type": "string" }
],
"ai_action": "Tell the customer whether the item is available.",
"created_at": 1700000000000,
"updated_at": 1700000500000
}
]
}
Koppla en anpassad funktion till en kampanj
POST /campaigns/{campaignId}/custom-functions
Kopplar en befintlig anpassad funktion till denna kampanj så att boten kan anropa den under en konversation. Att koppla en funktion som redan är kopplad har ingen effekt.
| Fält | Krävs | Beskrivning |
|---|---|---|
custom_function_id |
Ja | ID för den anpassade funktionen som ska kopplas. |
curl -X POST "https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo/custom-functions?apiKey=YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "custom_function_id": "fn_abc123" }'
Svar
{
"success": true,
"campaign_id": "NBCXrhqGPSFsd6MV7pRo",
"custom_function_id": "fn_abc123"
}
Koppla bort en anpassad funktion från en kampanj
DELETE /campaigns/{campaignId}/custom-functions/{customFunctionId}
Att koppla bort en funktion som inte är kopplad har ingen effekt.
curl -X DELETE "https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo/custom-functions/fn_abc123?apiKey=YOUR_API_KEY"
Svar
{
"success": true,
"campaign_id": "NBCXrhqGPSFsd6MV7pRo",
"custom_function_id": "fn_abc123"
}
Koppla en kunskapsdatakälla till en kampanj
POST /campaigns/{campaignId}/kb-sources
Kopplar en kunskapsdatakälla (skapad via FAQ-API:et) till denna kampanj så att boten kan använda den vid svar. Att koppla en källa som redan är kopplad har ingen effekt.
| Fält | Krävs | Beskrivning |
|---|---|---|
kb_source_id |
Ja | ID för kunskapsdatakällan som ska kopplas. |
curl -X POST "https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo/kb-sources?apiKey=YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "kb_source_id": "kb_abc123" }'
Svar
{
"success": true,
"campaign_id": "NBCXrhqGPSFsd6MV7pRo",
"kb_source_id": "kb_abc123"
}
Koppla bort en kunskapsdatakälla från en kampanj
DELETE /campaigns/{campaignId}/kb-sources/{kbSourceId}
Att koppla bort en källa som inte är kopplad har ingen effekt.
curl -X DELETE "https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo/kb-sources/kb_abc123?apiKey=YOUR_API_KEY"
Svar
{
"success": true,
"campaign_id": "NBCXrhqGPSFsd6MV7pRo",
"kb_source_id": "kb_abc123"
}
Koppla en MCP-server till en kampanj
POST /campaigns/{campaignId}/mcp-servers
Länkar en MCP-server till den här kampanjen, vilket ger boten åtkomst till serverns verktyg under en konversation. Att länka en server som redan är länkad gör ingenting.
| Fält | Krävs | Beskrivning |
|---|---|---|
mcp_server_id |
Ja | ID för MCP-servern som ska länkas. |
curl -X POST "https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo/mcp-servers?apiKey=YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "mcp_server_id": "mcp_abc123" }'
Svar
{
"success": true,
"campaign_id": "NBCXrhqGPSFsd6MV7pRo",
"mcp_server_id": "mcp_abc123"
}
Koppla bort en MCP-server från en kampanj
DELETE /campaigns/{campaignId}/mcp-servers/{mcpServerId}
Att koppla bort en server som inte är länkad gör ingenting.
curl -X DELETE "https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo/mcp-servers/mcp_abc123?apiKey=YOUR_API_KEY"
Svar
{
"success": true,
"campaign_id": "NBCXrhqGPSFsd6MV7pRo",
"mcp_server_id": "mcp_abc123"
}
Kampanjens mediebibliotek
Mediebiblioteket innehåller bilder, videor, dokument och röstmeddelanden som boten kan skicka under en konversation.
Lista en kampanjs mediebibliotek
GET /campaigns/{campaignId}/media-library
curl "https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo/media-library?apiKey=YOUR_API_KEY"
Svar
{
"success": true,
"campaign_id": "NBCXrhqGPSFsd6MV7pRo",
"media_items": [
{
"id": "media_abc123",
"item_id": "media_abc123",
"title": "Pricing sheet",
"description": "Send when the contact asks about pricing.",
"media_url": "https://example.com/pricing.pdf",
"media_content_type": "application/pdf",
"type": "document",
"agent_id": "",
"campaign_id": "NBCXrhqGPSFsd6MV7pRo",
"media_home": "campaign"
}
]
}
media_url är en signerad URL som skapades vid uppladdningstillfället — den kan redan ha löpt ut när du läser tillbaka den; instrumentpanelen signerar om den vid behov.
Ladda upp ett medieobjekt
POST /campaigns/{campaignId}/media-library
| Fält | Krävs | Beskrivning |
|---|---|---|
base64Data |
Ja | Filen, base64-kodad (inget data-URL-prefix). |
mimeType |
Ja | MIME-typ för filen (t.ex. image/png). |
title |
Ja | Kort etikett som visas i biblioteket och i AI-prompten. |
description |
Ja | Instruktion som talar om för boten när den ska skicka detta objekt. |
fileName |
Nej | Ursprungligt filnamn, används för att skapa lagringsobjektets namn. |
sendMessage |
Nej | Föredragen formulering som boten bör använda när den skickar detta objekt. |
maxSendsPerConversation |
Nej | Maximalt antal gånger boten får skicka detta objekt till en kontakt i en konversation. Standard är 1. |
sendAsVoiceNote |
Nej | För en ljuduppladdning, transkoda den till ett WhatsApp-röstmeddelande. Standard är false (lagras som en vanlig ljudfil). |
curl -X POST "https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo/media-library?apiKey=YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"base64Data": "iVBORw0KGgoAAAANSUhEUgAA...",
"mimeType": "image/png",
"title": "Product photo",
"description": "Send when the contact asks what the product looks like."
}'
Svar
{
"success": true,
"itemId": "media_abc123",
"mediaUrl": "https://example.com/product.png",
"storagePath": "ai_media/campaigns/NBCXrhqGPSFsd6MV7pRo/media_abc123.png",
"mediaContentType": "image/png",
"type": "image",
"isVoiceNote": false
}
Uppdatera ett medieobjekt
PATCH /campaigns/{campaignId}/media-library/{itemId}
Redigerar endast objektets metadata — för att ersätta själva filen, ta bort objektet och ladda upp ett nytt.
| Fält | Beskrivning |
|---|---|
title |
Kort etikett. |
description |
Instruktion för när det ska skickas. |
send_message |
Föredragen formulering som boten ska använda. |
max_sends_per_conversation |
Icke-negativt heltal, eller null för att rensa gränsen. |
curl -X PATCH "https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo/media-library/media_abc123?apiKey=YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "title": "Updated pricing sheet" }'
Svar
{
"success": true,
"campaign_id": "NBCXrhqGPSFsd6MV7pRo",
"item_id": "media_abc123"
}
Ta bort ett medieobjekt
DELETE /campaigns/{campaignId}/media-library/{itemId}
Att ta bort ett objekt som redan är borta är en no-op.
curl -X DELETE "https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo/media-library/media_abc123?apiKey=YOUR_API_KEY"
Svar
{ "success": true, "deleted": true }
Kampanjtaggar
En kampanjtagg är en etikett som du lär boten att applicera på en kontakt under en konversation — hot-lead, not-interested, booked-a-call. Varje tagg består av tre delar:
| Fält | Typ | Beskrivning |
|---|---|---|
name |
sträng, krävs | Själva etiketten. Det är detta som boten applicerar på kontakten och som du matchar mot senare, så håll den kort och stabil. |
description |
sträng | Instruktionen som talar om för boten när den ska applicera denna tagg. Det är den här delen som utför arbetet — “personen bekräftar att de gått med i communityn” används, “het lead” gör det inte. |
webhook |
sträng | En URL som tar emot en POST i samma ögonblick som taggen hamnar på en kontakt. Lämna tomt om du inte behöver en. |
tag_id |
sträng | Valfritt. Kopplar denna post till en befintlig tagg i ditt konto istället för en ny. Ange detta om du vill adressera denna specifika tagg senare med slutpunkterna för enskilda taggar nedan. |
Taggnamn måste vara unika inom en kampanj. Boten applicerar taggar efter namn, så två poster som delar samma namn har ingen definierad vinnare.
Ange alla taggar för en kampanj
PUT /campaigns/{campaignId} med en tags array.
Detta ersätter kampanjens taggar med exakt det du skickar, vilket är samma sak som instrumentpanelens flik Taggar gör när du sparar. Skicka hela arrayen varje gång — en tagg du utelämnar är en tagg du raderat. Att skicka [] rensar alla.
cURL
curl -X PUT "https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo?apiKey=YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"tags": [
{
"name": "hot-lead",
"description": "The person confirms they want to buy, or asks how to get started right away.",
"webhook": "https://example.com/hooks/campaign-events"
},
{
"name": "not-interested",
"description": "The person declines the offer or says they are not a fit."
}
]
}'
JavaScript
const res = await fetch(
"https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo",
{
method: "PUT",
headers: {
"X-API-Key": "YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
tags: [
{
name: "hot-lead",
description:
"The person confirms they want to buy, or asks how to get started right away.",
webhook: "https://example.com/hooks/campaign-events",
},
{
name: "not-interested",
description: "The person declines the offer or says they are not a fit.",
},
],
}),
}
);
const data = await res.json();
Python
import requests
res = requests.put(
"https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo",
headers={"X-API-Key": "YOUR_API_KEY"},
json={
"tags": [
{
"name": "hot-lead",
"description": "The person confirms they want to buy, or asks how to get started right away.",
"webhook": "https://example.com/hooks/campaign-events",
},
{
"name": "not-interested",
"description": "The person declines the offer or says they are not a fit.",
},
]
},
)
data = res.json()
Svar
{
"success": true,
"campaign_id": "NBCXrhqGPSFsd6MV7pRo"
}
Läs tillbaka taggarna med GET /campaigns/{campaignId}.
Lägg till en tagg
POST /campaigns/{campaignId}/tags
Lägger till en enskild tagg utan att skicka om resten. Använd detta när du lägger till i en uppsättning som du inte byggde i denna begäran.
curl -X POST "https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo/tags?apiKey=YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "tag": { "name": "booked-a-call", "description": "The person confirms a booked time." } }'
Att posta exakt samma tagg två gånger gör ingenting den andra gången. Att posta samma tag_id med ett annat namn eller beskrivning lägger till en andra post istället för att redigera den första — använd slutpunkten nedan för att redigera på plats.
Uppdatera eller ta bort en tagg
PUT /campaigns/{campaignId}/tags/{tagId}
DELETE /campaigns/{campaignId}/tags/{tagId}
Dessa adresserar en post via dess tag_id, så de fungerar endast på taggar som skapats med en sådan. Om en tagg saknar tag_id, ändra den med hjälp av hela-array-metoden PUT /campaigns/{campaignId} ovan.
curl -X PUT "https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo/tags/tag_abc123?apiKey=YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "tag": { "name": "hot-lead", "description": "Updated instruction." } }'
En tagId som inte finns i kampanjen returnerar 404 med "Tag not found in campaign tags".
Växla en kampanjs kanaler
POST /campaigns/{campaignId}/channels
Lägger till eller tar bort kanaler från kampanjens enabled_channels-array utan att skicka om hela arrayen — säkrare än PUT /campaigns/{campaignId} när något annat kan redigera kampanjen samtidigt.
Skicka antingen en enskild växling eller en batch — inte båda i samma begäran:
{ "channel": "whatsapp", "action": "add" }
{ "add": ["whatsapp", "instagram"], "remove": ["sms"] }
| Fält | Beskrivning |
|---|---|
channel |
En kanal att växla. Para ihop med action. |
action |
"add" eller "remove". Para ihop med channel. |
add |
Array med kanaler att lägga till. Batch-format — använd istället för channel/action. |
remove |
Array med kanaler att ta bort. Batch-format. |
Giltiga kanaler: whatsapp, whatsapp_web, sms, instagram, messenger, facebook, chat_widget, custom_channel, imessage, telegram, instagram_private, line, viber, tiktok, email, linkedin, skool.
curl -X POST "https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo/channels?apiKey=YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "channel": "whatsapp", "action": "add" }'
Svar
{
"success": true,
"campaign_id": "NBCXrhqGPSFsd6MV7pRo",
"added": ["whatsapp"],
"removed": []
}
Detta ändrar endast vilka kanaler kampanjen annonserar på — det avgör inte vem som svarar på en kanal. Se Kampanjtyper ovan och Dirigera en kampanj till inkommande kanaler nedan för det.
Kommentar-till-DM (Instagram och Facebook)
Kommentar-till-DM förvandlar en kommentar på ett av dina inlägg till en privat konversation: någon kommenterar, boten skickar ett DM till dem, och kampanjen tar över konversationen därifrån. Den konfigureras helt genom kampanjobjektet, så det finns inget som är begränsat till enbart användargränssnittet.
Anslut Facebook-sidan först — se Kanalanslutning. Ställ sedan in fälten nedan med PUT /campaigns/{campaignId}.
Kampanjen måste vara
Live. Kommentarövervakning plockar endast upp kampanjer varsstatusärLive(valfritt skiftläge – se Kampanjtyper). Alla andra statusar inaktiverar den tyst, och en påhittad status som"Active"avvisas nu med ett400istället för att lagras. Giltiga statusar inkluderarDraft,Pending Approval,Scheduled,Live,Paused,Completed,SentochFailed.
Fält
| Fält | Typ | Beskrivning |
|---|---|---|
monitor_instagram_posts |
boolean | Bevaka varje Instagram-inlägg på den anslutna sidan. |
instagram_post_ids |
string[] | Bevaka endast dessa Instagram-inlägg. Lämna oinställd när monitor_instagram_posts är på. |
instagram_comment_delay_minutes |
number | Vänta så här många minuter efter en kommentar innan direktmeddelandet skickas. |
monitor_facebook_posts |
boolean | Bevaka varje Facebook-inlägg på den anslutna sidan. |
facebook_post_ids |
string[] | Bevaka endast dessa Facebook-inlägg. |
facebook_comment_delay_minutes |
number | Fördröjning före direktmeddelandet, i minuter. |
public_comment_reply_instructions |
string | Vägledning för det synliga svaret som lämnas på själva kommentaren. Åsidosätter standardformuleringen “kolla dina direktmeddelanden”. |
first_response_mode |
string | "ai" (standard) genererar det första direktmeddelandet och det offentliga svaret. "exact_text" skickar din formulering ordagrant, utan AI-generering och utan kreditkostnad. |
first_response_exact_text |
string | Det ordagranna första direktmeddelandet, används när first_response_mode är "exact_text". Krävs för att det läget ska träda i kraft. |
first_response_exact_text_variants |
string[] | Extra formuleringar för det första direktmeddelandet. En väljs slumpmässigt per utskick, så upprepade direktmeddelanden är inte byte-identiska. |
public_comment_reply_exact_text |
string | Det ordagranna offentliga svaret i "exact_text"-läge. Lämna tomt för att hoppa över det offentliga svaret och endast skicka direktmeddelandet. |
public_comment_reply_exact_text_variants |
string[] | Extra formuleringar för det offentliga svaret. |
monitor_instagram_followers |
boolean | Behandla en ny följare som en utlösare och skicka ett inledande direktmeddelande (Instagram-privatkonton). |
follower_outreach_instructions |
string | Vägledning för det inledande direktmeddelandet till nya följare. |
respond_to_instagram_story_replies |
boolean | Huruvida AI:n svarar på svar på dina Instagram Stories. Standard true. Ställ in false för att låta Story-svar hamna i chatten (med Storyn bifogad) utan ett AI-svar. Live-inställning — inte en del av utkastet, så den behöver inte publiceras. |
Rensa ett fält
Dessa fält tas bort snarare än att sättas till null när du skickar null, så att boten återgår till sina standardvärden: instagram_post_ids, facebook_post_ids, instagram_comment_delay_minutes, facebook_comment_delay_minutes, public_comment_reply_instructions, follower_outreach_instructions, first_response_exact_text, first_response_exact_text_variants, public_comment_reply_exact_text, public_comment_reply_exact_text_variants.
En okänd nyckel avvisar hela förfrågan.
PUT /campaigns/{campaignId}validerar hela brödtexten mot en tillåten lista. En nyckel som inte känns igen returnerar400för hela förfrågan — den ignoreras inte tyst, och inget av de andra fälten i den brödtexten skrivs.
cURL
curl -X PUT "https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo?apiKey=YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"status": "Live",
"monitor_instagram_posts": true,
"instagram_comment_delay_minutes": 2,
"first_response_mode": "exact_text",
"first_response_exact_text": "Hey! Sending the details over now.",
"first_response_exact_text_variants": [
"Hi there, here are the details you asked for.",
"Thanks for commenting, here is what you need."
],
"public_comment_reply_exact_text": "Just sent you a DM."
}'
JavaScript
const res = await fetch(
"https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo",
{
method: "PUT",
headers: {
"X-API-Key": "YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
status: "Live",
monitor_instagram_posts: true,
instagram_comment_delay_minutes: 2,
first_response_mode: "ai",
public_comment_reply_instructions:
"Tell them to check their message requests folder too.",
}),
}
);
const data = await res.json();
Python
import requests
res = requests.put(
"https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo",
headers={"X-API-Key": "YOUR_API_KEY"},
json={
"status": "Live",
"monitor_facebook_posts": True,
"facebook_post_ids": None,
"facebook_comment_delay_minutes": 5,
},
)
data = res.json()
Svar
{
"success": true,
"campaign_id": "NBCXrhqGPSFsd6MV7pRo"
}
Det synliga svaret som lämnas på kommentaren kräver funktionen för kommentarsvar i din plan. Utan den skickas DM-meddelandet fortfarande, men det offentliga svaret hoppas över.
Optimera en kampanj med AI
POST /campaigns/{campaignId}/optimize
Kör samma AI-omskrivning som instrumentpanelens flöden för Optimera och feedback via tumme ned: tar din feedback, skriver om botens instruktioner och förbereder resultatet som en ny utkastversion som du kan granska.
| Fält | Krävs | Beskrivning |
|---|---|---|
user_feedback |
Ett av dessa två krävs | Friformsfeedback som beskriver vad som behöver förbättras. |
thumbs_down_feedback |
Ett av dessa två krävs | Feedback som fångats upp från en tumme ned på ett specifikt botsvar. |
thumbs_down_message |
Nej | Botmeddelandet som feedbacken med tumme ned refererar till. |
curl -X POST "https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo/optimize?apiKey=YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "user_feedback": "Make the tone more casual and mention the free trial earlier." }'
Svar (202 — omskrivningen körs i bakgrunden)
{ "success": true, "campaign_id": "NBCXrhqGPSFsd6MV7pRo" }
Avläs GET /campaigns/{campaignId} och bevaka test_bot.status: den växlar till "Optimizing" omedelbart, och sedan tillbaka till "Draft" när omskrivningen landar i test_bot. Därifrån fungerar den som alla andra utkast på instrumentpanelen — granska det och publicera det sedan på instrumentpanelen för att göra det live. En 409 innebär att en optimering redan körs för den här kampanjen.
Optimering kostar krediter, precis som alla andra AI-åtgärder på ditt konto.
Tilldela en kontakt till en kampanj
POST /campaigns/{campaignId}/contacts/{contactId}/assign
Placerar en befintlig kontakt i en kampanj och skickar, om du begär det, kampanjens öppningsmeddelande direkt. Detta är sättet att skicka en kampanjs godkända WhatsApp-mall till en kontakt: mallen som en kampanj godkändes med tillhör den kampanjen, så den visas inte i Templates API-biblioteket och kan inte skickas via /whatsapp-templates/send.
| Fält | Krävs | Beskrivning |
|---|---|---|
sendOpeningMessage |
Nej | true skickar kampanjens öppningsmeddelande (den godkända WhatsApp-mallen i en WhatsApp-kampanj) så snart kontakten har tilldelats. Standardvärde är false. |
triggerAIResponse |
Nej | true låter AI:n skriva sitt eget första meddelande istället. Standardvärde är false. |
curl -X POST "https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo/contacts/contact_abc123/assign?apiKey=YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "sendOpeningMessage": true }'
Svar
{
"success": true,
"data": { "contactId": "contact_abc123", "campaignId": "NBCXrhqGPSFsd6MV7pRo" }
}
Krediter: Att skicka öppningsmeddelandet i en WhatsApp-kampanj debiteras som vilken mallutskick som helst, prissatt efter mottagarens land och mallens kategori. I andra kanaler är öppningsmeddelandet ett vanligt utgående meddelande.
Dirigera en kampanj till inkommande kanaler
Dessa slutpunkter hanterar vilken kampanj som svarar på nya, okända kontakter i en kanal. Föredra Entry Points för nya integrationer (se noteringen under Kampanjtyper) — dessa förblir användbara för att arbeta med kampanjer som dirigeras på det äldre sättet, och för att lösa en konflikt om kanalägarskap mellan två inkommande kampanjer.
Tilldela en kampanj till inkommande kanaler
POST /campaigns/{campaignId}/incoming-routing
| Fält | Krävs | Beskrivning |
|---|---|---|
channels |
Ja | Lista med kanaler som den här kampanjen ska svara för vid nya, okända kontakter. |
curl -X POST "https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo/incoming-routing?apiKey=YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "channels": ["whatsapp", "instagram"] }'
Svar
{
"success": true,
"uid": "abc123",
"campaignId": "NBCXrhqGPSFsd6MV7pRo",
"channels": ["whatsapp", "instagram"],
"failed": []
}
channels listar endast de kanaler som faktiskt dirigerades till den här kampanjen; failed listar alla som inte gjorde det. Om varje begärd kanal misslyckas, misslyckas själva begäran.
Rensa en kampanjs inkommande dirigering
DELETE /campaigns/{campaignId}/incoming-routing
| Fält | Krävs | Beskrivning |
|---|---|---|
channelToUnassign |
Nej | Rensa dirigering för endast denna kanal. Utelämna för att rensa varje kanal som denna kampanj för närvarande svarar för. |
curl -X DELETE "https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo/incoming-routing?apiKey=YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "channelToUnassign": "instagram" }'
Svar
{
"success": true,
"uid": "abc123",
"campaignId": "NBCXrhqGPSFsd6MV7pRo",
"channelsRemoved": ["instagram"]
}
Återaktivera en vilande kampanj
POST /campaigns/{campaignId}/reactivate
Återställer en kampanj från Ended, Completed, Paused eller Draft och återtar dess kanaler. Fungerar endast på Incoming from Unknown Contacts- eller Combined-kampanjer — en kampanj som redan är Live behandlas som en framgång utan att något behöver göras.
curl -X POST "https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo/reactivate?apiKey=YOUR_API_KEY"
Svar
{
"success": true,
"data": {
"success": true,
"channelsReactivated": ["whatsapp"],
"channelsBlockedByConflict": [],
"campaignType": "Incoming from Unknown Contacts"
}
}
En kanal som redan har tagits i anspråk av en annan kampanjs agent visas i channelsBlockedByConflict istället för att hela anropet misslyckas — använd stoppa en motstridig inkommande kampanj nedan för att frigöra den först om du vill att den här kampanjen ska ta över den. Ett 400 returneras för en kampanjtyp som inte stöder återaktivering, eller en status som inte är en av de vilolägesstatusar som nämns ovan.
Stoppa en motstridig inkommande kampanj
POST /campaigns/{campaignId}/stop-incoming
Frigör den här kampanjens kanaler från vilken ANNAN kampanj som än håller dem för närvarande, så att den här kampanjen kan ta över dem härnäst. Detta är REST-versionen av vad instrumentpanelen gör automatiskt när du startar en inkommande kampanj i en kanal som någon annan redan svarar i.
curl -X POST "https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo/stop-incoming?apiKey=YOUR_API_KEY"
Svar
{
"success": true,
"campaign_id": "NBCXrhqGPSFsd6MV7pRo",
"ended_campaign_ids": [],
"released_channels": ["whatsapp"],
"cleared_entire_field": false
}
released_channels returneras tom när den här kampanjen redan äger varje kanal den annonserar för — det finns inget att ta över.
Kostnadsuppskattningar
Uppskatta vad det kommer att kosta att starta en kampanj innan du skickar den.
Kostnadsuppskattning för WhatsApp-mall
GET /campaigns/{campaignId}/template-cost-estimate
curl "https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo/template-cost-estimate?apiKey=YOUR_API_KEY"
Svar
{
"success": true,
"billing_mode": "credits",
"data": {
"countries": [
{
"countryCode": "1",
"name": "United States",
"iso": "US",
"flag": "🇺🇸",
"contactCount": 120,
"costPerContact": 2,
"subtotal": 240
}
],
"totalContacts": 120,
"totalTemplateCost": 240,
"templateCategory": "marketing",
"billing_mode": "credits",
"service_messages_billable_soon": false
}
}
billing_mode är "credits" på den hanterade WhatsApp-kanalen. På en kanal där Meta fakturerar ditt eget WhatsApp Business-konto direkt, returneras costPerContact, subtotal och totalTemplateCost som null — aldrig 0, vilket skulle tolkas som gratis — eftersom det inte finns någon kreditsiffra att rapportera.
Kostnadsuppskattning för SMS
GET /campaigns/{campaignId}/sms-cost-estimate
curl "https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo/sms-cost-estimate?apiKey=YOUR_API_KEY"
Svar
{
"success": true,
"billing_mode": "twilio_direct",
"data": {
"totalContacts": 120,
"messageLength": 87,
"segmentsPerMessage": 1,
"totalSegments": 120,
"estimatedCostUsd": 0.96,
"priceUnit": "USD per segment",
"billedByTwilio": true
}
}
SMS skickas alltid via ditt eget Twilio-konto (se SMS-leverantör), så detta faktureras alltid direkt av Twilio — estimatedCostUsd är en uppskattning av den Twilio-fakturan, inte en kreditavgift.
Gränskontroller
Kontrollera en gräns innan du startar, istället för att upptäcka det genom en misslyckad sändning.
Kampanjomfattande kontroller
GET /campaigns/{campaignId}/limits/ai-credit-messaging — huruvida start eller schemaläggning av denna kampanj skulle överskrida ditt kontos gräns för AI-kreditmeddelanden.
GET /campaigns/{campaignId}/limits/messaging — huruvida det skulle överskrida ditt kontos dagliga meddelandegräns.
curl "https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo/limits/messaging?apiKey=YOUR_API_KEY"
Svar (gränsen överskrids ej)
{
"success": true,
"data": "Campaign is within the daily messaging limit."
}
Ett 400 returneras istället när gränsen skulle överskridas, med orsaken i error.
Kontoomfattande kontroller
GET /campaigns/limits/campaigns — huruvida du har nått din prenumerations gräns för månatligt kampanjskapande.
GET /campaigns/limits/contacts — huruvida du har nått din prenumerations kontaktgräns.
curl "https://api.youraiconnector.com/v1/campaigns/limits/campaigns?apiKey=YOUR_API_KEY"
Svar
{
"success": true,
"data": "You can create 3 more campaigns this month."
}
Kampanjstatistik totalt
GET /campaigns/stats/totals
Totala antal skickade och besvarade meddelanden för varje kampanj OCH varje AI-agent på ditt konto, över ett rullande fönster — samma siffror som kampanjlistan visar bredvid varje rad, i ett anrop istället för en begäran per kampanj.
| Frågeparameter | Beskrivning |
|---|---|
days |
Storlek på det rullande fönstret, 1-365. Standard är 90. |
curl "https://api.youraiconnector.com/v1/campaigns/stats/totals?days=30&apiKey=YOUR_API_KEY"
Svar
{
"success": true,
"byCampaign": {
"NBCXrhqGPSFsd6MV7pRo": { "sent": 1204, "replied": 318 }
},
"byAgent": {
"agent_abc123": { "sent": 1204, "replied": 318 }
},
"windowDays": 30
}
byAgent är sin egen sammanställning, inte en summa av byCampaign — trafiken för ett konto med AI-agent kan sakna kampanj helt, så den skulle annars vara osynlig här.
Testa en kampanj i lekplatsen
Lekplatsen låter dig föra en konversation med en kampanjs bot utan att röra en riktig kanal eller en riktig kontakt. Det är samma sandlåda som instrumentpanelens testpanel, och den är fullt tillgänglig via API:et.
Flödet är: skapa en dold testkontakt, skicka ett meddelande, och fråga sedan kampanjen efter botens svar. Svar genereras asynkront, så de anländer i test_messages på kampanjen snarare än i svarskroppen.
Playground körs via API-kostnadskrediter. En testkonversation som startas med en API-nyckel debiteras enligt den normala AI-meddelandetaxan, på samma sätt som ett riktigt svar, och visas i din användningshistorik som en vanlig post. Att testa från instrumentpanelen är fortfarande gratis. Skillnaden är avsiktlig: en testkörning utför samma AI-arbete som en live-körning, så en obegränsad API-playground skulle vara ett sätt att köra obegränsad AI på någon annans bekostnad.
Steg 1 - Skapa testkontakten
POST /campaigns/{campaignId}/try-out/contact
Skapar den dolda testkontakten och länkar den till kampanjen. Alla brödtextfält är valfria; allt du utelämnar ersätts av en inbyggd exempelidentitet (John Doe).
| Fält | Krävs | Beskrivning |
|---|---|---|
first_name |
Nej | Testkontaktens förnamn. |
last_name |
Nej | Testkontaktens efternamn. |
email |
Nej | Testkontaktens e-postadress. |
phone |
Nej | Testkontaktens telefonnummer. |
curl -X POST "https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo/try-out/contact?apiKey=YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "first_name": "Maria", "last_name": "Lopez" }'
Svar
{
"success": true,
"contactId": "8kQx1vNbA2fLpR7d"
}
Steg 2 - Registrera det inkommande meddelandet
POST /campaigns/{campaignId}/try-out/messages
Lägger till meddelanden i testtråden. Skicka besökarens meddelande hit först, så att det visas i konversationshistoriken som boten läser.
| Fält | Krävs | Beskrivning |
|---|---|---|
messages |
Ja | Array med meddelandeobjekt, max 200 per anrop. |
messages[].body |
Ja | Meddelandetexten. |
messages[].direction |
Ja | "inbound" för besökaren, "outbound" för boten. |
messages[].timestamp |
Nej | ISO-8601-sträng eller epok-millisekunder. |
messages[].role |
Nej | Valfri roll-etikett. |
messages[].name |
Nej | Valfritt visningsnamn. |
ignoreCounter |
Nej | Heltal. Återställer kampanjens ignoreringsräknare vid samma skrivning. |
curl -X POST "https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo/try-out/messages?apiKey=YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"messages": [
{
"body": "Do you ship to Belgium?",
"direction": "inbound",
"timestamp": "2026-07-22T09:30:00Z"
}
]
}'
Svar
{
"success": true,
"campaign_id": "NBCXrhqGPSFsd6MV7pRo",
"appended": 1
}
Steg 3 - Be boten svara
POST /campaigns/{campaignId}/try-out/test-message
Skickar meddelandet till AI-pipelinen. Detta är anropet som faktiskt genererar ett botsvar.
| Fält | Krävs | Beskrivning |
|---|---|---|
message |
Ja | Besökarens senaste meddelandetext. |
curl -X POST "https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo/try-out/test-message?apiKey=YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "message": "Do you ship to Belgium?" }'
Svar
{
"success": true,
"data": "Published"
}
"Published" betyder att meddelandet skickades till AI-pipelinen. "Ignored" betyder att ett nyare testmeddelande ersatte detta — testmiljön slår ihop en snabb serie meddelanden till ett enda svar, ungefär fyra sekunder efter det sista meddelandet, på samma sätt som en riktig konversation väntar på att någon ska skriva klart. På grund av detta tidsfönster tar anropet några sekunder att returnera.
Steg 4 - Läs svaret
GET /campaigns/{campaignId}
Botens svar läggs till i kampanjens test_messages-array. Polla kampanjen tills en ny outbound-post visas.
{
"success": true,
"campaign": {
"id": "NBCXrhqGPSFsd6MV7pRo",
"test_messages": [
{ "body": "Do you ship to Belgium?", "direction": "inbound" },
{ "body": "Yes, we ship across the EU.", "direction": "outbound" }
]
}
}
Återställ testmiljön
POST /campaigns/{campaignId}/try-out/reset
Rensar hela sandlådan: tar bort testkontakten, tömmer test_messages och frigör botens svarslås. Använd detta mellan testkörningar.
curl -X POST "https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo/try-out/reset?apiKey=YOUR_API_KEY"
Svar
{
"success": true,
"campaign_id": "NBCXrhqGPSFsd6MV7pRo"
}
Andra slutpunkter för lekplatsen
| Slutpunkt | Vad den gör |
|---|---|
DELETE /campaigns/{campaignId}/try-out/contact |
Tar endast bort den aktuella testkontakten och avlänkar den, vilket lämnar test_messages intakt. Lyckas även när ingen kontakt är länkad. |
POST /campaigns/{campaignId}/try-out/transfer |
Startar en ny lekplats förifylld med en befintlig konversation, i en begäran: ersätter testkontakten och skriver över test_messages. Brödtexten tar first_name, last_name, messages (kan vara tom) och ignoreCounter. Föredra detta framför att ta bort-sedan-skapa-sedan-lägga till, vilket tredubblar din förbrukning av hastighetsbegränsningen. |
POST /campaigns/{campaignId}/try-out/messages/replace |
Skriver över test_messages helt istället för att lägga till. Använd för att trunkera eller spola tillbaka en tråd. |
POST /campaigns/{campaignId}/try-out/contact/reset-ignore-counter |
Återställer endast testkontaktens ignoreringsräknare, för att göra om och upprepa flöden efter en sändning. |
API-fel för kampanjer
Kampanjslutpunkter returnerar standardfelkuvertet:
{
"success": false,
"error": "Campaign not found"
}
| Status | När det inträffar på en kampanj-endpoint |
|---|---|
400 |
Ett obligatoriskt fält saknas eller är ogiltigt (till exempel en felaktig type, ett icke-booleskt enabled eller en okänd veckodagsnyckel). Returneras även av en gränskontroll-endpoint när gränsen skulle överskridas, samt av återaktivera för en kampanjtyp eller status som inte stöder det. |
404 |
Kampanjen hittades inte — antingen existerar den inte eller så tillhör den ett annat konto. |
409 |
En optimering körs redan för denna kampanj. |
De delade koderna som alla slutpunkter kan returnera — 401, 403 (din plan inkluderar inte API-åtkomst), 429 (hastighetsbegränsning) och 500 — listas med vägledning för återförsök i Fel & Paginering.
Relaterat
- Dirigera en kanal till en kampanj — peka Instagram, WhatsApp eller någon annan kanal mot den AI-agent som ska besvara den, med hjälp av ingångspunkter (Entry Points).
- Generera uppföljningsmallar med AI — starta ett bakgrundsjobb som skriver en kampanjs WhatsApp-uppföljningsmallar.
- FAQ-API — hantera de frågor och svar-poster som dina kampanjer använder.
- API-åtkomst — generera din API-nyckel.
- Autentisering — alla sätt att ange din nyckel.