Your AI Connector Docs

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änder X-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 med GET /entry-points/routing-status, rensa den med DELETE /entry-points/channel-defaults. POST /channels/campaign skriver 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 vars status är Live (valfritt skiftläge – se Kampanjtyper). Alla andra statusar inaktiverar den tyst, och en påhittad status som "Active" avvisas nu med ett 400 istället för att lagras. Giltiga statusar inkluderar Draft, Pending Approval, Scheduled, Live, Paused, Completed, Sent och Failed.

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 returnerar 400 fö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