Your AI Connector Docs

Campaigns API

Een campagne bundelt alles wat de AI-bot nodig heeft om met je contacten te praten: de instructies, de kanalen waarop deze actief is, de actieve uren en het follow-upgedrag. Met de Campaigns API kun je campagnes vanuit je eigen code vermelden, aanmaken, bijwerken, dupliceren, inschakelen, archiveren en verfijnen in plaats van via het dashboard.

Alle onderstaande endpoints zijn relatief ten opzichte van de basis-URL https://api.youraiconnector.com/v1. Elk verzoek moet worden geverifieerd — zie API Access en Authentication voor hoe je je API-sleutel verkrijgt en doorgeeft. API-toegang is een betaalde functie; zonder deze toegang worden verzoeken afgewezen met een 403.

Let op: Sommige voorbeelden tonen de eenvoudige ?apiKey=YOUR_API_KEY query-vorm, andere gebruiken de X-API-Key header. Beide werken overal — gebruik wat het beste bij je configuratie past.


Campagnetypen

Wanneer je een campagne aanmaakt, moet je een van deze typen kiezen:

Type Waarvoor het dient
Incoming from Unknown Contacts De bot antwoordt aan mensen die je voor het eerst een bericht sturen.
Outgoing De bot start gesprekken met contacten die je aan de campagne toevoegt.
Keywords Inactief - niet gebruiken. Een Keywords campagne is inactief: deze wordt nog geaccepteerd voor achterwaartse compatibiliteit, maar is onzichtbaar voor inkomende routering op elk kanaal en niets leest de trigger-trefwoorden ervan. Gebruik in plaats daarvan een Entry Point van het type Trefwoord op een AI Agent.
Combined Een mix van inkomend en uitgaand gedrag.

Hoofdlettergebruik maakt niet uit. type, status, booking_provider, first_response_mode, bot.anthropic_model en bot.ai_speed accepteren allemaal elk hoofdlettergebruik — "live", "Live" en "LIVE" zijn hetzelfde — en de waarde wordt opgeslagen in de canonieke vorm, wat de waarde is die je terugkrijgt wanneer je de campagne leest. De enige uitzondering is het pauzepaar: "Paused" en "paused" zijn twee wezenlijk verschillende statussen, dus een dubbelzinnige spelling zoals "PAUSED" wordt afgewezen met een 400 waarin je wordt gevraagd er een te kiezen.

De twee pauzestatussen

Status Wie schrijft het Wat het betekent
Paused De eigen veiligheidscontroles van het platform (lage betrokkenheid, herhaalde verzendfouten, een bereikte limiet) en de nieuwere Agents- en Broadcasts-interfaces De campagne wordt vastgehouden. Een geplande scan kan een veiligheidspauze automatisch opheffen zodra de reden is verholpen.
paused De pauzeknop van het dashboard, gekoppeld aan resumed bij Hervatten Een persoon heeft de campagne handmatig gepauzeerd. Geplande verzendingen worden afgebroken en opnieuw opgebouwd bij hervatting.

Beide stoppen de campagne: inkomende routering werkt alleen terwijl de status exact Live is. Gebruik vanuit de API Paused om te pauzeren en Live om te hervatten — het paar met kleine letters bestaat voor de dashboardknop en blijft daarvoor werken.

Geen van beide is wat er gebeurt wanneer de AI stopt met antwoorden binnen één gesprek. Dat is een schakelaar per contact, is_bot_active op het contact — ingesteld wanneer een mens het overneemt, wanneer het contact zich afmeldt, of wanneer de AI de chat beëindigt. De status van de campagne zelf blijft onaangeroerd en elk ander gesprek daarin blijft doorgaan. Zie de AI pauzeren of hervatten voor één contact.

Het aanmaken van een campagne bepaalt niet wie een kanaal beantwoordt. Routering wordt afgehandeld door Entry Points op een AI Agent, niet door campagnes. Elk kanaal heeft een standaard Entry Point dat de Agent benoemt die nieuwe, onbekende contacten op dat kanaal beantwoordt: stel dit in met PUT /entry-points/channel-defaults, controleer of de ladder live is voor het account met GET /entry-points/routing-status, wis het met DELETE /entry-points/channel-defaults. POST /channels/campaign schrijft nog steeds de verouderde per-kanaal campagnerouteringskaart, maar die kaart wordt niet langer geraadpleegd voor inkomende routering op enig account; deze wordt alleen bewaard voor rollback. Bouw hier niet op voort. Zie Routeer een kanaal naar een campagne voor beide oppervlakken naast elkaar.


Campagnes vermelden

GET /campaigns

Geeft je campagnes terug, de nieuwste eerst. Gearchiveerde campagnes zijn uitgesloten, tenzij je archived=true doorgeeft.

Queryparameters

Parameter Vereist Beschrijving
limit Nee Maximaal aantal campagnes om terug te geven. Standaard 50, maximaal 100.
cursor Nee Paginering-cursor. Geef de next_cursor waarde van het vorige antwoord door om de volgende pagina op te halen.
archived Nee Stel in op true om gearchiveerde campagnes op te nemen.

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"])

Antwoord

{
  "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"
}

Wanneer next_cursor gelijk is aan null, heb je de laatste pagina bereikt.


Een campagne ophalen

GET /campaigns/{campaignId}

Geeft het volledige campagnedocument terug, inclusief de live bot-configuratie (bot), follow-up instellingen, ingeschakelde kanalen en eventuele trefwoorden. Tijdstempels worden geretourneerd als epoch-milliseconden.

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"]

Antwoord

{
  "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
    }
  }
}

Let op: Een campagne die eigendom is van een ander account retourneert 404 Campaign not found (niet 403), dus je kunt niet zien of een ID bestaat in een ander account.


Een campagne aanmaken

POST /campaigns

Maakt een nieuwe campagne aan. name en type zijn vereist; al het overige is optioneel. Je kunt elk ander campagneveld in hetzelfde verzoek opnemen — bijvoorbeeld language, ai_mode of een volledig bot configuratieobject — en dit wordt opgeslagen bij de nieuwe campagne. De eigenaar en aanmaaktijd worden automatisch ingesteld.

Aanvraagvelden

Veld Verplicht Beschrijving
name Ja De campagnenaam.
type Ja Een van de vier bovenstaande campagnetypen.
language Nee Taal waarin de bot antwoordt (bijv. "en").
ai_mode Nee Of de AI-modus is ingeschakeld (true/false). Bij een campagne die door een AI-agent wordt beantwoord, lezen de resultaten de Actief-schakelaar van de agent in plaats van een opgeslagen waarde — zie de opmerking onder bijwerken hieronder.
bot Nee Het configuratieobject van de bot (zie Bot-configuratievelden).
list_id Nee ID van de contactenlijst om te koppelen.
event_id Nee ID van het gebeurtenistype dat de AI mag boeken.
event_ids Nee Meerdere gebeurtenistypen tegelijk, als een array van gebeurtenistype-ID’s — de eerste is de standaard. Stuur ofwel event_id of event_ids, niet beide.

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"]

Antwoord

{
  "success": true,
  "campaign_id": "NBCXrhqGPSFsd6MV7pRo"
}

Een campagne bijwerken

PUT /campaigns/{campaignId}

Werkt een campagne gedeeltelijk bij — stuur alleen de velden die u wilt wijzigen. Dit is het enige algemene update-werkwoord; er is geen PATCH /campaigns/{campaignId} (de twee PATCH routes zijn de specifieke inschakelen en archiveren schakelaars).

Welke velden u kunt wijzigen. Alles wat de campagne-editor schrijft, inclusief name, status, type, language, ai_mode, enabled_channels, de trigger- en drip-instellingen, de boekings- en follow-up-vlaggen, de Instagram/Facebook-monitoringsvelden en de volledige bot configuratie. Identiteit en eigendom zijn vergrendeld voor de levensduur van de campagne: user, id en created_at worden geweigerd, evenals elke veldnaam die het eindpunt niet herkent. Afwijzing is per verzoek, niet per veld — één onbekende sleutel retourneert een 400 en niets in dat verzoek wordt geschreven.

ai_mode bij een campagne ondersteund door een Agent weerspiegelt de Agent. Wanneer een campagne wordt beantwoord door een AI-agent, geeft het lezen van de campagne ai_mode terug die is afgeleid van de Actief-schakelaar van die Agent — de enige schakelaar die daadwerkelijk bepaalt of de AI antwoordt. Het schrijven van ai_mode bij een dergelijke campagne wordt geaccepteerd, maar verandert niets aan wat u terugleest; schakel in plaats daarvan de Actief-schakelaar van de Agent in of uit (in het dashboard of via de Agents API). Bij klassieke campagnes zonder Agent leest en schrijft ai_mode de opgeslagen waarde zoals voorheen.

Bot-velden worden samengevoegd, ze worden niet overschreven. Stuur bot-instellingen als punt-sleutels ("bot.instructions": "...") of als een genest object ("bot": { "instructions": "..." }) — beide schrijven blad voor blad, dus de velden die u weglaat behouden hun huidige waarden. bot.instructions, bot.goal, bot.rules en bot.personality zijn allemaal op deze manier bewerkbaar, evenals elke andere bot-instelling die wordt vermeld onder Bot-configuratievelden. Hetzelfde geldt voor test_bot, frequency en follow_up_config.

Om een bot-configuratie volledig te vervangen — waarbij elk veld dat u niet verstuurt wordt verwijderd — gebruikt u bot_replace (of test_bot_replace) met het volledige object. U kunt een vervanging en een samenvoeging voor hetzelfde object niet combineren in één verzoek; dat retourneert een 400.

Let op: Het schrijven van bot.* via de API heeft onmiddellijk effect op de live campagne. De dashboard-editor werkt anders: bewerkingen daar worden opgeslagen als concept en gaan pas live wanneer de klant op Publiceren klikt. Dus als een klant ongepubliceerde dashboardwijzigingen heeft, staan deze in test_bot en toont een API-leesactie van bot correct wat de AI op dit moment gebruikt.

Een paar velden worden ingesteld via een speciale sleutel in plaats van direct geschreven: gebruik list_id voor de contactenlijst, event_id voor het gebeurtenistype (of event_ids, een geordende array van gebeurtenistype-ID’s, om de AI er meerdere te laten boeken — de eerste is de standaard; een lege array ontkoppelt ze allemaal), en contact_ids (een array van contact-ID’s) voor de contacten van de campagne. Knowledge-base-items worden beheerd via de FAQs API, niet via dit eindpunt.

Tags vervangen, ze worden niet samengevoegd. Stuur tags als de volledige array en dit wordt de tagset van de campagne — zie Campagnetags voor de velden en voor de eindpunten die een enkele tag toevoegen of bewerken.

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()

Antwoord

{
  "success": true,
  "campaign_id": "NBCXrhqGPSFsd6MV7pRo"
}

Een campagne verwijderen

DELETE /campaigns/{campaignId}

Verwijdert een campagne definitief. Dit kan niet ongedaan worden gemaakt — als je de campagne later misschien nog nodig hebt, archiveer deze dan in plaats daarvan.

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()

Antwoord

{
  "success": true
}

Een campagne dupliceren

POST /campaigns/{campaignId}/duplicate

Maakt een kopie van de campagne waarbij alle instellingen behouden blijven. De kopie begint als uitgeschakeld en de naam krijgt een (copy) achtervoegsel, zodat er nooit berichten worden verzonden totdat je deze expliciet inschakelt.

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"]

Antwoord

{
  "success": true,
  "campaign_id": "aZ9plnewCopyId01234"
}

Dubbele kopieën binnen één account.


Een campagne in- of uitschakelen

PATCH /campaigns/{campaignId}/enabled

Schakelt een campagne in of uit. Een uitgeschakelde campagne stopt met het benaderen van contactpersonen, maar behoudt al zijn configuratie.

Aanvraagvelden

Veld Vereist Beschrijving
enabled Ja true om in te schakelen, false om uit te schakelen. Moet een boolean zijn.

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()

Antwoord

{
  "success": true,
  "campaign_id": "NBCXrhqGPSFsd6MV7pRo",
  "enabled": true
}

Een campagne archiveren of herstellen

PATCH /campaigns/{campaignId}/archived

Archiveert of herstelt een campagne. Gearchiveerde campagnes worden verborgen in de standaard campagnelijst, maar behouden al hun gegevens en kunnen op elk gewenst moment worden hersteld.

Aanvraagvelden

Veld Vereist Beschrijving
archived Ja true om te archiveren, false om te herstellen. Moet een boolean zijn.

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()

Antwoord

{
  "success": true,
  "campaign_id": "NBCXrhqGPSFsd6MV7pRo",
  "archived": true
}

De botconfiguratie bijwerken

PUT /campaigns/{campaignId}/bot-config

Dit is de veilige manier om individuele botinstellingen te wijzigen. Elk veld dat u verstuurt, wordt samengevoegd met de bestaande botconfiguratie, dus alle velden die u weglaat, blijven behouden. Gebruik dit in plaats van het campaign-update-eindpunt wanneer u slechts een deel van de bot wilt aanpassen.

Veldnamen mogen alleen letters, cijfers, underscores en koppeltekens bevatten.

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()

Antwoord

{
  "success": true,
  "campaign_id": "NBCXrhqGPSFsd6MV7pRo"
}

Botconfiguratievelden

Alle botvelden zijn optioneel. Stuur alleen de velden die u wilt instellen. Eventuele extra botvelden buiten de hier vermelde velden worden geaccepteerd en ongewijzigd opgeslagen.

Veld Type Beschrijving
instructions string De primaire instructies die sturen hoe de bot met contacten praat.
rules string Harde regels die de bot altijd moet volgen.
goal string Het resultaat waar de bot in elk gesprek naartoe moet werken.
personality string Beschrijving van de toon en persoonlijkheid van de bot.
ai_speed string Hoeveel redenering de AI toepast voordat deze antwoordt. Een van fast, fast_thinker, balanced, thorough.
anthropic_model string Het AI-kwaliteitsniveau dat wordt gebruikt voor de antwoorden van deze campagne. Een van standard, economy (verouderd), max, mini. max en mini zijn alleen van kracht op accounts die in aanmerking komen voor die niveaus.
max_messages integer Maximaal aantal botberichten per gesprek.
alert_human_when string Voorwaarden waaronder de bot een menselijke teamgenoot moet waarschuwen.
availability object Het schema voor actieve uren van de bot. Je kunt dit hier instellen, of het speciale active-hours endpoint gebruiken.
follow_up_config object Configuratie voor vervolggedrag, opgeslagen zoals verstrekt.

De actieve uren van de bot instellen

PUT /campaigns/{campaignId}/active-hours

Stelt het beschikbaarheidsschema van de bot in. Buiten de geconfigureerde vensters antwoordt de bot niet automatisch. Dit schrijft naar het availability-veld van de botconfiguratie.

Aanvraagvelden

Veld Vereist Beschrijving
availability Ja Een object met weekdagen als sleutel. Toegestane sleutels zijn monday tot en met sunday; elke andere sleutel resulteert in een 400. Dagen die u weglaat, blijven ongewijzigd.

Elke weekdag bevat ofwel een enkel tijdvenster of een reeks vensters. Een venster heeft een start_time en end_time in 24-uurs HH:MM-indeling.

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()

Antwoord

{
  "success": true,
  "campaign_id": "NBCXrhqGPSFsd6MV7pRo"
}

Aangepaste functies van een campagne weergeven

GET /campaigns/{campaignId}/custom-functions

Geeft de aangepaste functies terug die aan deze campagne zijn gekoppeld, opgelost naar volledige definities. Aangepaste functies zijn externe HTTP-acties die de bot tijdens een gesprek kan aanroepen — bijvoorbeeld het controleren van de voorraad in uw winkel of het aanmaken van een record in uw 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"]

Antwoord

{
  "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
    }
  ]
}

Een aangepaste functie koppelen aan een campagne

POST /campaigns/{campaignId}/custom-functions

Koppelt een bestaande aangepaste functie aan deze campagne, zodat de bot deze tijdens een gesprek kan aanroepen. Het koppelen van een functie die al is gekoppeld, heeft geen effect.

Veld Vereist Beschrijving
custom_function_id Ja ID van de aangepaste functie om te koppelen.
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" }'

Antwoord

{
  "success": true,
  "campaign_id": "NBCXrhqGPSFsd6MV7pRo",
  "custom_function_id": "fn_abc123"
}

Een aangepaste functie ontkoppelen van een campagne

DELETE /campaigns/{campaignId}/custom-functions/{customFunctionId}

Het ontkoppelen van een functie die niet is gekoppeld, heeft geen effect.

curl -X DELETE "https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo/custom-functions/fn_abc123?apiKey=YOUR_API_KEY"

Antwoord

{
  "success": true,
  "campaign_id": "NBCXrhqGPSFsd6MV7pRo",
  "custom_function_id": "fn_abc123"
}

Een kennisbron koppelen aan een campagne

POST /campaigns/{campaignId}/kb-sources

Koppelt een kennisbron (gemaakt via de FAQ-API) aan deze campagne, zodat de bot deze kan gebruiken bij het beantwoorden van vragen. Het koppelen van een bron die al is gekoppeld, heeft geen effect.

Veld Vereist Beschrijving
kb_source_id Ja ID van de kennisbron om te koppelen.
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" }'

Antwoord

{
  "success": true,
  "campaign_id": "NBCXrhqGPSFsd6MV7pRo",
  "kb_source_id": "kb_abc123"
}

Een kennisbron ontkoppelen van een campagne

DELETE /campaigns/{campaignId}/kb-sources/{kbSourceId}

Het ontkoppelen van een bron die niet is gekoppeld, heeft geen effect.

curl -X DELETE "https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo/kb-sources/kb_abc123?apiKey=YOUR_API_KEY"

Antwoord

{
  "success": true,
  "campaign_id": "NBCXrhqGPSFsd6MV7pRo",
  "kb_source_id": "kb_abc123"
}

Een MCP-server koppelen aan een campagne

POST /campaigns/{campaignId}/mcp-servers

Koppelt een MCP-server aan deze campagne, waardoor de bot tijdens een gesprek toegang krijgt tot de tools van die server. Het koppelen van een server die al gekoppeld is, heeft geen effect.

Veld Vereist Beschrijving
mcp_server_id Ja ID van de te koppelen MCP-server.
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" }'

Antwoord

{
  "success": true,
  "campaign_id": "NBCXrhqGPSFsd6MV7pRo",
  "mcp_server_id": "mcp_abc123"
}

Een MCP-server ontkoppelen van een campagne

DELETE /campaigns/{campaignId}/mcp-servers/{mcpServerId}

Het ontkoppelen van een server die niet gekoppeld is, heeft geen effect.

curl -X DELETE "https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo/mcp-servers/mcp_abc123?apiKey=YOUR_API_KEY"

Antwoord

{
  "success": true,
  "campaign_id": "NBCXrhqGPSFsd6MV7pRo",
  "mcp_server_id": "mcp_abc123"
}

Mediatheek van de campagne

De mediatheek bevat afbeeldingen, video’s, documenten en spraakberichten die de bot tijdens een gesprek kan versturen.

De mediatheek van een campagne weergeven

GET /campaigns/{campaignId}/media-library

curl "https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo/media-library?apiKey=YOUR_API_KEY"

Antwoord

{
  "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 is een ondertekende URL die is vastgelegd op het moment van uploaden — deze kan al verlopen zijn tegen de tijd dat u deze terugleest; het dashboard ondertekent deze opnieuw op aanvraag.

Een mediabestand uploaden

POST /campaigns/{campaignId}/media-library

Veld Vereist Beschrijving
base64Data Ja Het bestand, base64-gecodeerd (zonder data-URL-voorvoegsel).
mimeType Ja MIME-type van het bestand (bijv. image/png).
title Ja Kort label dat wordt getoond in de bibliotheek en in de AI-prompt.
description Ja Instructie die de bot vertelt wanneer dit item moet worden verzonden.
fileName Nee Oorspronkelijke bestandsnaam, gebruikt om de naam van het opslagobject op te bouwen.
sendMessage Nee Voorkeursformulering die de bot moet gebruiken bij het verzenden van dit item.
maxSendsPerConversation Nee Maximaal aantal keren dat de bot dit item naar één contactpersoon mag sturen in een gesprek. Standaard is 1.
sendAsVoiceNote Nee Voor een audio-upload: transcodeer deze naar een WhatsApp-spraakbericht. Standaard is false (opgeslagen als een gewoon audiobestand).
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."
  }'

Antwoord

{
  "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
}

Een media-item bijwerken

PATCH /campaigns/{campaignId}/media-library/{itemId}

Wijzigt alleen de metadata van het item — om het bestand zelf te vervangen, verwijdert u het item en uploadt u een nieuwe.

Veld Beschrijving
title Kort label.
description Instructie voor wanneer te verzenden.
send_message Voorkeursformulering voor de bot.
max_sends_per_conversation Niet-negatief geheel getal, of null om de limiet te wissen.
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" }'

Antwoord

{
  "success": true,
  "campaign_id": "NBCXrhqGPSFsd6MV7pRo",
  "item_id": "media_abc123"
}

Een media-item verwijderen

DELETE /campaigns/{campaignId}/media-library/{itemId}

Het verwijderen van een item dat al weg is, heeft geen effect.

curl -X DELETE "https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo/media-library/media_abc123?apiKey=YOUR_API_KEY"

Antwoord

{ "success": true, "deleted": true }

Campagnetags

Een campagnetag is een label dat je de bot leert toe te passen op een contactpersoon tijdens een gesprek — hot-lead, not-interested, booked-a-call. Elke tag bestaat uit drie delen:

Veld Type Beschrijving
name string, vereist Het label zelf. Dit is wat de bot toepast op de contactpersoon en waarop je later matcht, dus houd het kort en stabiel.
description string De instructie die de bot vertelt wanneer deze tag moet worden toegepast. Dit is het deel dat het werk doet — “de persoon bevestigt dat ze lid zijn geworden van de community” wordt gebruikt, “hot lead” niet.
webhook string Een URL die een POST ontvangt op het moment dat de tag aan een contactpersoon wordt toegewezen. Laat dit leeg als je er geen nodig hebt.
tag_id string Optioneel. Koppelt dit item aan een bestaande tag in je account in plaats van een nieuwe. Geef dit op als je deze specifieke tag later wilt adresseren met de onderstaande eindpunten voor enkele tags.

Tagnamen moeten uniek zijn binnen een campagne. De bot past tags op naam toe, dus twee items die dezelfde naam delen, hebben geen gedefinieerde winnaar.

Alle tags van een campagne instellen

PUT /campaigns/{campaignId} met een tags array.

Dit vervangt de tags van de campagne door precies wat je verstuurt, wat hetzelfde is als wat het tabblad Tags in het dashboard doet wanneer je het opslaat. Verstuur elke keer de volledige array — een tag die je weglaat, is een tag die je hebt verwijderd. Het versturen van [] wist ze allemaal.

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()

Antwoord

{
  "success": true,
  "campaign_id": "NBCXrhqGPSFsd6MV7pRo"
}

Lees de tags terug met GET /campaigns/{campaignId}.

Eén tag toevoegen

POST /campaigns/{campaignId}/tags

Voegt een enkele tag toe zonder de rest opnieuw te versturen. Gebruik dit wanneer je toevoegt aan een set die je niet in dit verzoek hebt opgebouwd.

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." } }'

Het twee keer plaatsen van exact dezelfde tag doet niets de tweede keer. Het plaatsen van dezelfde tag_id met een andere naam of beschrijving voegt een tweede item toe in plaats van de eerste te bewerken — gebruik het onderstaande eindpunt om op de huidige plek te bewerken.

Eén tag bijwerken of verwijderen

PUT /campaigns/{campaignId}/tags/{tagId} DELETE /campaigns/{campaignId}/tags/{tagId}

Deze adresseren één item via zijn tag_id, dus ze werken alleen op tags die er een hebben. Als een tag geen tag_id heeft, wijzig deze dan met de volledige-array PUT /campaigns/{campaignId} hierboven.

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." } }'

Een tagId die niet in de campagne staat, retourneert 404 met "Tag not found in campaign tags".


Kanalen van een campagne in- of uitschakelen

POST /campaigns/{campaignId}/channels

Voegt kanalen toe aan of verwijdert ze uit de enabled_channels-array van de campagne zonder de hele array opnieuw te verzenden — veiliger dan PUT /campaigns/{campaignId} wanneer iets anders de campagne mogelijk tegelijkertijd bewerkt.

Verzend ofwel een enkele schakelactie of een batch — niet beide in hetzelfde verzoek:

{ "channel": "whatsapp", "action": "add" }
{ "add": ["whatsapp", "instagram"], "remove": ["sms"] }
Veld Beschrijving
channel Eén kanaal om in/uit te schakelen. Combineer met action.
action "add" of "remove". Combineer met channel.
add Array van kanalen om toe te voegen. Batch-vorm — gebruik in plaats van channel/action.
remove Array van kanalen om te verwijderen. Batch-vorm.

Geldige kanalen: 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" }'

Antwoord

{
  "success": true,
  "campaign_id": "NBCXrhqGPSFsd6MV7pRo",
  "added": ["whatsapp"],
  "removed": []
}

Dit wijzigt alleen op welke kanalen de campagne adverteert — het bepaalt niet wie een kanaal beantwoordt. Zie Campagnetypen hierboven en Een campagne routeren naar inkomende kanalen hieronder voor meer informatie.


Comment-to-DM (Instagram en Facebook)

Comment-to-DM verandert een reactie op een van je berichten in een privégesprek: iemand reageert, de bot stuurt een DM en de campagne neemt het gesprek vanaf daar over. Het wordt volledig geconfigureerd via het campagne-object, dus er is niets dat alleen via de UI verloopt.

Verbind eerst de Facebook-pagina — zie Kanaalverbinding. Stel vervolgens de onderstaande velden in met PUT /campaigns/{campaignId}.

De campagne moet Live zijn. Comment-monitoring pikt alleen campagnes op waarvan de status Live is (elk hoofdlettergebruik — zie Campagnetypen). Elke andere status schakelt dit stilletjes uit, en een verzonnen status zoals "Active" wordt nu afgewezen met een 400 in plaats van opgeslagen. Geldige statussen zijn onder andere Draft, Pending Approval, Scheduled, Live, Paused, Completed, Sent en Failed.

Velden

Veld Type Beschrijving
monitor_instagram_posts boolean Volg elk Instagram-bericht op de gekoppelde pagina.
instagram_post_ids string[] Volg alleen deze Instagram-berichten. Laat leeg wanneer monitor_instagram_posts is ingeschakeld.
instagram_comment_delay_minutes number Wacht dit aantal minuten na een reactie voordat het DM-bericht wordt verzonden.
monitor_facebook_posts boolean Volg elk Facebook-bericht op de gekoppelde pagina.
facebook_post_ids string[] Volg alleen deze Facebook-berichten.
facebook_comment_delay_minutes number Vertraging vóór het DM-bericht, in minuten.
public_comment_reply_instructions string Richtlijnen voor het zichtbare antwoord dat bij de reactie zelf wordt achtergelaten. Overschrijft de standaard “check je DM’s”-tekst.
first_response_mode string "ai" (standaard) genereert het eerste DM-bericht en het openbare antwoord. "exact_text" verzendt je eigen tekst letterlijk, zonder AI-generatie en zonder verbruik van credits.
first_response_exact_text string Het letterlijke eerste DM-bericht, gebruikt wanneer first_response_mode gelijk is aan "exact_text". Vereist om die modus te activeren.
first_response_exact_text_variants string[] Extra teksten voor het eerste DM-bericht. Er wordt er willekeurig één gekozen per verzending, zodat herhaalde DM’s niet byte-identiek zijn.
public_comment_reply_exact_text string Het letterlijke openbare antwoord in "exact_text"-modus. Laat leeg om het openbare antwoord over te slaan en alleen het DM-bericht te verzenden.
public_comment_reply_exact_text_variants string[] Extra teksten voor het openbare antwoord.
monitor_instagram_followers boolean Behandel een nieuwe volger als een trigger en stuur een openings-DM (Instagram persoonlijke accounts).
follower_outreach_instructions string Richtlijnen voor die openings-DM voor nieuwe volgers.
respond_to_instagram_story_replies boolean Of de AI antwoordt op reacties op je Instagram Stories. Standaard true. Stel false in om Story-reacties in de chat te laten verschijnen (met de Story bijgevoegd) zonder AI-antwoord. Live-instelling — geen onderdeel van het concept, dus hoeft niet gepubliceerd te worden.

Een veld wissen

Deze velden worden verwijderd in plaats van ingesteld op null wanneer je null verstuurt, zodat de bot terugvalt op zijn standaardwaarden: 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.

Eén onbekende sleutel wijst het hele verzoek af. PUT /campaigns/{campaignId} valideert de volledige body tegen een toegestane lijst. Een sleutel die niet wordt herkend, retourneert 400 voor het hele verzoek — het wordt niet geruisloos genegeerd en geen van de andere velden in die body wordt geschreven.

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()

Antwoord

{
  "success": true,
  "campaign_id": "NBCXrhqGPSFsd6MV7pRo"
}

Het zichtbare antwoord dat bij de reactie wordt achtergelaten, vereist de functie voor reactie-antwoorden in je abonnement. Zonder dit wordt de DM nog steeds verzonden en wordt het openbare antwoord overgeslagen.


Een campagne optimaliseren met AI

POST /campaigns/{campaignId}/optimize

Voert dezelfde AI-herschrijving uit als de ‘Optimaliseren’- en ‘duim omlaag’-feedbackstromen in het dashboard: verwerkt je feedback, herschrijft de instructies van de bot en zet het resultaat klaar als een nieuwe conceptrevisie die je kunt beoordelen.

Veld Verplicht Beschrijving
user_feedback Eén van deze twee is verplicht Vrije feedback waarin wordt beschreven wat er verbeterd moet worden.
thumbs_down_feedback Eén van deze twee is verplicht Feedback die is vastgelegd via een duim omlaag bij een specifiek bot-antwoord.
thumbs_down_message Nee Het bot-bericht waar de duim omlaag-feedback naar verwijst.
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." }'

Antwoord (202 — de herschrijving wordt op de achtergrond uitgevoerd)

{ "success": true, "campaign_id": "NBCXrhqGPSFsd6MV7pRo" }

Poll GET /campaigns/{campaignId} en bekijk test_bot.status: deze verspringt direct naar "Optimizing" en vervolgens terug naar "Draft" zodra de herschrijving in test_bot is geplaatst. Vanaf dat punt gedraagt het zich als elk ander dashboard-concept — beoordeel het en publiceer het vervolgens in het dashboard om het live te zetten. Een 409 betekent dat er al een optimalisatie voor deze campagne wordt uitgevoerd.

Optimaliseren kost credits, net als elke andere AI-bewerking op je account.


Een contactpersoon toewijzen aan een campagne

POST /campaigns/{campaignId}/contacts/{contactId}/assign

Plaatst een bestaande contactpersoon in een campagne en verstuurt, indien gewenst, direct het openingsbericht van de campagne. Dit is de manier om het goedgekeurde WhatsApp-sjabloon van een campagne naar één contactpersoon te sturen: het sjabloon waarmee een campagne is goedgekeurd, hoort bij die campagne, dus het verschijnt niet in de Templates API bibliotheek en kan niet worden verzonden via /whatsapp-templates/send.

Veld Verplicht Beschrijving
sendOpeningMessage Nee true verstuurt het openingsbericht van de campagne (het goedgekeurde WhatsApp-sjabloon bij een WhatsApp-campagne) zodra de contactpersoon is toegewezen. Standaard ingesteld op false.
triggerAIResponse Nee true laat de AI in plaats daarvan zijn eigen eerste bericht schrijven. Standaard ingesteld op 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 }'

Antwoord

{
  "success": true,
  "data": { "contactId": "contact_abc123", "campaignId": "NBCXrhqGPSFsd6MV7pRo" }
}

Credits: Het versturen van het openingsbericht bij een WhatsApp-campagne wordt in rekening gebracht als een reguliere sjabloonverzending, geprijsd op basis van het land van de ontvanger en de categorie van het sjabloon. Bij andere kanalen is het openingsbericht een normaal uitgaand bericht.


Een campagne toewijzen aan inkomende kanalen

Deze eindpunten beheren welke campagne nieuwe, onbekende contacten op een kanaal beantwoordt. Geef de voorkeur aan Entry Points voor nieuwe integraties (zie de opmerking onder Campagnetypen) — deze blijven nuttig voor het werken met campagnes die op de oudere manier routeren, en voor het oplossen van een conflict over kanaaleigendom tussen twee inkomende campagnes.

Een campagne toewijzen aan inkomende kanalen

POST /campaigns/{campaignId}/incoming-routing

Veld Verplicht Beschrijving
channels Ja Array van kanalen waarvoor deze campagne nieuwe, onbekende contacten moet beantwoorden.
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"] }'

Antwoord

{
  "success": true,
  "uid": "abc123",
  "campaignId": "NBCXrhqGPSFsd6MV7pRo",
  "channels": ["whatsapp", "instagram"],
  "failed": []
}

channels bevat alleen de kanalen die daadwerkelijk naar deze campagne zijn gerouteerd; failed bevat alle kanalen die dat niet zijn. Als elk opgevraagd kanaal mislukt, mislukt het verzoek zelf ook.

Inkomende routering van een campagne wissen

DELETE /campaigns/{campaignId}/incoming-routing

Veld Verplicht Beschrijving
channelToUnassign Nee Wis de routering voor alleen dit ene kanaal. Laat weg om elk kanaal dat deze campagne momenteel beantwoordt te wissen.
curl -X DELETE "https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo/incoming-routing?apiKey=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "channelToUnassign": "instagram" }'

Antwoord

{
  "success": true,
  "uid": "abc123",
  "campaignId": "NBCXrhqGPSFsd6MV7pRo",
  "channelsRemoved": ["instagram"]
}

Een inactieve campagne opnieuw activeren

POST /campaigns/{campaignId}/reactivate

Brengt een campagne terug uit Ended, Completed, Paused of Draft en claimt de kanalen opnieuw. Werkt alleen bij Incoming from Unknown Contacts of Combined campagnes — een campagne die al Live is, wordt behandeld als een succes waarbij niets hoeft te gebeuren.

curl -X POST "https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo/reactivate?apiKey=YOUR_API_KEY"

Antwoord

{
  "success": true,
  "data": {
    "success": true,
    "channelsReactivated": ["whatsapp"],
    "channelsBlockedByConflict": [],
    "campaignType": "Incoming from Unknown Contacts"
  }
}

Een kanaal dat al door de agent van een andere campagne is geclaimd, verschijnt in channelsBlockedByConflict in plaats van dat de hele aanroep mislukt — gebruik stop een conflicterende inkomende campagne hieronder om het eerst vrij te maken als je wilt dat deze campagne het overneemt. Er wordt een 400 geretourneerd voor een campagnetype dat reactivering niet ondersteunt, of een status die niet een van de bovenstaande inactieve statussen is.

Stop een conflicterende inkomende campagne

POST /campaigns/{campaignId}/stop-incoming

Maakt de kanalen van deze campagne vrij van welke ANDERE campagne ze momenteel ook bezet houdt, zodat deze campagne ze als volgende kan claimen. Dit is de REST-versie van wat het dashboard automatisch doet wanneer je een inkomende campagne start in een kanaal dat iemand anders al beantwoordt.

curl -X POST "https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo/stop-incoming?apiKey=YOUR_API_KEY"

Antwoord

{
  "success": true,
  "campaign_id": "NBCXrhqGPSFsd6MV7pRo",
  "ended_campaign_ids": [],
  "released_channels": ["whatsapp"],
  "cleared_entire_field": false
}

released_channels komt leeg terug wanneer deze campagne al elk kanaal bezit waarvoor geadverteerd wordt — er is niets om over te nemen.


Kostenramingen

Schat wat het starten van een campagne kost voordat je deze verstuurt.

Kostenraming WhatsApp-sjabloon

GET /campaigns/{campaignId}/template-cost-estimate

curl "https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo/template-cost-estimate?apiKey=YOUR_API_KEY"

Antwoord

{
  "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 is "credits" op de beheerde WhatsApp-baan. Op een baan waar Meta je eigen WhatsApp Business-account rechtstreeks factureert, komen costPerContact, subtotal en totalTemplateCost terug als null — nooit 0, wat als gratis zou worden gelezen — aangezien er geen tegoedbedrag is om te rapporteren.

Kostenraming SMS

GET /campaigns/{campaignId}/sms-cost-estimate

curl "https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo/sms-cost-estimate?apiKey=YOUR_API_KEY"

Antwoord

{
  "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 wordt altijd verzonden via je eigen Twilio-account (zie SMS-provider), dus dit wordt altijd rechtstreeks door Twilio gefactureerd — estimatedCostUsd is een schatting van die Twilio-factuur, geen tegoedafschrijving.


Limietcontroles

Controleer een limiet voordat u start, in plaats van erachter te komen door een mislukte verzending.

Controles op campagneniveau

GET /campaigns/{campaignId}/limits/ai-credit-messaging — of het starten of inplannen van deze campagne de AI-credit-berichtlimiet van uw account zou overschrijden.

GET /campaigns/{campaignId}/limits/messaging — of het de dagelijkse berichtlimiet van uw account zou overschrijden.

curl "https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo/limits/messaging?apiKey=YOUR_API_KEY"

Antwoord (limiet niet overschreden)

{
  "success": true,
  "data": "Campaign is within the daily messaging limit."
}

Een 400 wordt in plaats daarvan geretourneerd wanneer de limiet zou worden overschreden, met de reden in error.

Controles op accountniveau

GET /campaigns/limits/campaigns — of u de maandelijkse limiet voor het aanmaken van campagnes van uw abonnement heeft bereikt.

GET /campaigns/limits/contacts — of u de contactlimiet van uw abonnement heeft bereikt.

curl "https://api.youraiconnector.com/v1/campaigns/limits/campaigns?apiKey=YOUR_API_KEY"

Antwoord

{
  "success": true,
  "data": "You can create 3 more campaigns this month."
}

Campagnestatistieken totalen

GET /campaigns/stats/totals

Totalen voor verzonden en beantwoorde berichten voor elke campagne EN elke AI-agent in uw account, over een voortschrijdend venster — dezelfde cijfers die de campagnelijstpagina naast elke rij toont, in één aanroep in plaats van één verzoek per campagne.

Queryparameter Beschrijving
days Grootte van het voortschrijdende venster, 1-365. Standaard is 90.
curl "https://api.youraiconnector.com/v1/campaigns/stats/totals?days=30&apiKey=YOUR_API_KEY"

Antwoord

{
  "success": true,
  "byCampaign": {
    "NBCXrhqGPSFsd6MV7pRo": { "sent": 1204, "replied": 318 }
  },
  "byAgent": {
    "agent_abc123": { "sent": 1204, "replied": 318 }
  },
  "windowDays": 30
}

byAgent is een eigen totaaloverzicht, geen som van byCampaign — het verkeer van een account dat inherent is aan AI-agents kan helemaal geen campagne bevatten, dus zou het hier anders onzichtbaar zijn.


Een campagne testen in de playground

In de playground kun je een gesprek voeren met de bot van een campagne zonder een echt kanaal of een echt contact aan te raken. Het is dezelfde sandbox als het testpaneel van het dashboard en is volledig beschikbaar via de API.

De flow is: maak een verborgen testcontact aan, stuur een bericht en pols vervolgens de campagne voor het antwoord van de bot. Antwoorden worden asynchroon gegenereerd, dus ze komen aan in test_messages op de campagne in plaats van in de response body.

De Playground verbruikt API-tegoed. Een testgesprek dat wordt gestart met een API-sleutel wordt in rekening gebracht tegen het normale tarief voor AI-berichten, hetzelfde als een echt antwoord, en verschijnt in je gebruiksgeschiedenis als een reguliere vermelding. Testen vanuit het dashboard blijft gratis. Het verschil is bewust: een testrun voert hetzelfde AI-werk uit als een live run, dus een onbeperkte API-playground zou een manier zijn om onbeperkt AI te gebruiken op kosten van iemand anders.

Stap 1 - Maak het testcontact aan

POST /campaigns/{campaignId}/try-out/contact

Maakt het verborgen testcontact aan en koppelt dit aan de campagne. Alle hoofdtekstvelden zijn optioneel; alles wat u weglaat, valt terug op een ingebouwde voorbeeldidentiteit (John Doe).

Veld Verplicht Beschrijving
first_name Nee Voornaam van het testcontact.
last_name Nee Achternaam van het testcontact.
email Nee E-mailadres van het testcontact.
phone Nee Telefoonnummer van het testcontact.
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" }'

Antwoord

{
  "success": true,
  "contactId": "8kQx1vNbA2fLpR7d"
}

Stap 2 - Het inkomende bericht vastleggen

POST /campaigns/{campaignId}/try-out/messages

Voegt berichten toe aan de testthread. Verstuur het bericht van de bezoeker hier eerst, zodat het verschijnt in de gespreksgeschiedenis die de bot leest.

Veld Verplicht Beschrijving
messages Ja Array van berichtobjecten, maximaal 200 per verzoek.
messages[].body Ja De berichttekst.
messages[].direction Ja "inbound" voor de bezoeker, "outbound" voor de bot.
messages[].timestamp Nee ISO-8601-tekenreeks of epoch-milliseconden.
messages[].role Nee Optioneel rollabel.
messages[].name Nee Optionele weergavenaam.
ignoreCounter Nee Geheel getal. Reset de negeerteller van de campagne in dezelfde schrijfactie.
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"
      }
    ]
  }'

Antwoord

{
  "success": true,
  "campaign_id": "NBCXrhqGPSFsd6MV7pRo",
  "appended": 1
}

Stap 3 - De bot vragen om te antwoorden

POST /campaigns/{campaignId}/try-out/test-message

Verstuurt het bericht naar de AI-pipeline. Dit is de aanroep die daadwerkelijk een bot-antwoord genereert.

Veld Verplicht Beschrijving
message Ja De nieuwste berichttekst van de bezoeker.
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?" }'

Antwoord

{
  "success": true,
  "data": "Published"
}

"Published" betekent dat het bericht naar de AI-pipeline is verzonden. "Ignored" betekent dat een nieuwer testbericht dit bericht heeft vervangen — de playground voegt een snelle reeks berichten samen tot één antwoord, ongeveer vier seconden na het laatste bericht, op dezelfde manier als een echt gesprek wacht tot iemand klaar is met typen. Vanwege dit samenvoegvenster duurt het enkele seconden voordat deze aanroep resultaat geeft.

Stap 4 - Het antwoord lezen

GET /campaigns/{campaignId}

Het antwoord van de bot wordt toegevoegd aan de test_messages-array van de campagne. Pols de campagne totdat er een nieuw outbound-item verschijnt.

{
  "success": true,
  "campaign": {
    "id": "NBCXrhqGPSFsd6MV7pRo",
    "test_messages": [
      { "body": "Do you ship to Belgium?", "direction": "inbound" },
      { "body": "Yes, we ship across the EU.", "direction": "outbound" }
    ]
  }
}

De playground resetten

POST /campaigns/{campaignId}/try-out/reset

Wist de volledige sandbox: verwijdert het testcontact, wist test_messages en geeft de antwoordvergrendelingen van de bot vrij. Gebruik dit tussen testruns door.

curl -X POST "https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo/try-out/reset?apiKey=YOUR_API_KEY"

Antwoord

{
  "success": true,
  "campaign_id": "NBCXrhqGPSFsd6MV7pRo"
}

Andere playground-endpoints

Endpoint Wat het doet
DELETE /campaigns/{campaignId}/try-out/contact Verwijdert alleen het huidige testcontact en ontkoppelt het, waarbij test_messages intact blijft. Slaagt zelfs als er geen contact is gekoppeld.
POST /campaigns/{campaignId}/try-out/transfer Start een nieuwe playground die is gevuld met een bestaand gesprek, in één verzoek: vervangt het testcontact en overschrijft test_messages. De body accepteert first_name, last_name, messages (mag leeg zijn) en ignoreCounter. Geef de voorkeur aan deze methode boven verwijderen-dan-aanmaken-dan-toevoegen, wat je rate-limit verbruik verdrievoudigt.
POST /campaigns/{campaignId}/try-out/messages/replace Overschrijft test_messages volledig in plaats van toe te voegen. Gebruik dit voor het inkorten of terugspoelen van een thread.
POST /campaigns/{campaignId}/try-out/contact/reset-ignore-counter Reset alleen de negeerteller van het testcontact, voor redo- en herhaalstromen na een verzending.

Fouten in de Campaigns API

Campagne-endpoints retourneren de standaard fouten-envelop:

{
  "success": false,
  "error": "Campaign not found"
}
Status Wanneer dit gebeurt op een campagne-endpoint
400 Een verplicht veld ontbreekt of is ongeldig (bijvoorbeeld een onjuiste type, een niet-booleaanse enabled of een onbekende weekdag-sleutel). Wordt ook geretourneerd door een limietcontrole-endpoint wanneer de limiet zou worden overschreden, en door reactiveren voor een campagnetype of status die dit niet ondersteunt.
404 De campagne is niet gevonden — deze bestaat niet of behoort tot een ander account.
409 Er is al een optimalisatie actief voor deze campagne.

De gedeelde codes die elk endpoint kan retourneren — 401, 403 (uw abonnement bevat geen API-toegang), 429 (snelheidslimiet) en 500 — worden vermeld met richtlijnen voor opnieuw proberen in Fouten & Paginering.


Gerelateerd