Overzicht
Een campagne stuurt de prompts van een thema naar een of meer LLM-modellen en haalt de merkvermeldingen uit de antwoorden. Credits worden verbruikt bij het starten, op basis van het aantal prompts en de slotkosten van de modellen — uitvoeringen per model worden NIET apart in credits gefactureerd.
Endpoints
| Methode | Pad | Beschrijving |
|---|
GET | /brands/{brandId}/campaigns | Campagnes weergeven |
POST | /brands/{brandId}/campaigns | Een campagne starten |
GET | /brands/{brandId}/campaigns/{campaignId} | Status van een campagne opvragen |
GET /brands//campaigns
Geeft alle campagnes van een merk weer, gesorteerd op aanmaakdatum (nieuwste eerst).
Queryparameters
| Parameter | Type | Standaard | Beschrijving |
|---|
limit | integer | 50 | Maximumaantal resultaten (max. 200) |
offset | integer | 0 | Offset voor paginering |
curl "https://mentova.ai/api/v1/brands/clxabc123/campaigns?limit=10" \
-H "X-API-Key: mtv_live_votre_cle"
Antwoord 200
{
"data": [
{
"id": "clxcampaign1",
"status": "COMPLETED",
"createdAt": "2026-06-01T09:00:00.000Z",
"completedAt": "2026-06-01T09:08:00.000Z",
"models": ["GPT4O_MINI", "CLAUDE_HAIKU"],
"runsPerModel": 3,
"topic": {
"id": "clxtopic1",
"seed": "Quel est le meilleur outil de gestion de projet pour les équipes à distance ?"
},
"_count": { "runs": 6 }
}
],
"total": 12,
"limit": 10,
"offset": 0
}
POST /brands//campaigns
Start een nieuwe campagne voor een thema. De campagne wordt asynchroon verwerkt.
Aanvraagbody
| Veld | Type | Verplicht | Beschrijving |
|---|
topicId | string | Ja | ID van het thema waarvoor de campagne wordt gestart |
models | string[] | Nee | Enum-waarden van de te gebruiken LLM-modellen. Standaard: de voor het merk geselecteerde modellen |
runsPerModel | integer | Nee | Aantal uitvoeringen per model (1-20). Standaard: abonnementsinstelling (3 op alle abonnementen) |
maxPrompts | integer | Nee | Maximumaantal op te nemen prompts. Standaard: alle prompts van het thema |
curl -X POST https://mentova.ai/api/v1/brands/clxabc123/campaigns \
-H "X-API-Key: mtv_live_votre_cle" \
-H "Content-Type: application/json" \
-d '{
"topicId": "clxtopic1",
"models": ["GPT4O_MINI", "CLAUDE_HAIKU"],
"runsPerModel": 3
}'
Antwoord 201
{
"data": {
"id": "clxcampaign2",
"status": "PENDING",
"createdAt": "2026-06-01T10:00:00.000Z",
"completedAt": null,
"models": ["GPT4O_MINI", "CLAUDE_HAIKU"],
"runsPerModel": 3,
"topic": {
"id": "clxtopic1",
"seed": "Quel est le meilleur outil de gestion de projet pour les équipes à distance ?"
},
"_count": { "runs": 0 }
}
}
Fouten
| HTTP | code | Oorzaak |
|---|
404 | NOT_FOUND | Thema niet gevonden of behoort niet tot dit merk |
422 | QUOTA_EXCEEDED | Onvoldoende credits om de campagne te starten |
422 | VALIDATION_ERROR | Ongeldige aanvraagbody |
GET /brands//campaigns/
Haalt de huidige status en details van een campagne op. Raadpleeg dit endpoint om de voortgang te volgen.
curl https://mentova.ai/api/v1/brands/clxabc123/campaigns/clxcampaign2 \
-H "X-API-Key: mtv_live_votre_cle"
Antwoord 200
{
"data": {
"id": "clxcampaign2",
"status": "RUNNING",
"createdAt": "2026-06-01T10:00:00.000Z",
"completedAt": null,
"models": ["GPT4O_MINI", "CLAUDE_HAIKU"],
"runsPerModel": 3,
"topic": {
"id": "clxtopic1",
"seed": "Quel est le meilleur outil de gestion de projet pour les équipes à distance ?"
},
"_count": { "runs": 4 }
}
}
Statuswaarden
| Status | Beschrijving |
|---|
PENDING | Geaccepteerd, wacht om de verwerkingswachtrij in te gaan |
QUEUED | Opgepikt door de worker, wacht op een uitvoeringsslot |
RUNNING | LLM-aanroepen worden uitgevoerd |
COMPLETED | Alle uitvoeringen voltooid, vermeldingen geëxtraheerd |
FAILED | Verwerkingsfout - credits worden terugbetaald |
TIMEOUT | De worker is verlopen (timeout) - credits worden terugbetaald |
Pollingpatroon
const API_KEY = "mtv_live_votre_cle";
const BASE = "https://mentova.ai/api/v1";
// Lancer
const { data: campaign } = await fetch(`${BASE}/brands/${brandId}/campaigns`, {
method: "POST",
headers: { "X-API-Key": API_KEY, "Content-Type": "application/json" },
body: JSON.stringify({ topicId }),
}).then(r => r.json());
// Interroger jusqu'à la fin
let status = campaign.status;
while (status === "PENDING" || status === "QUEUED" || status === "RUNNING") {
await new Promise(r => setTimeout(r, 5000));
const { data } = await fetch(
`${BASE}/brands/${brandId}/campaigns/${campaign.id}`,
{ headers: { "X-API-Key": API_KEY } }
).then(r => r.json());
status = data.status;
}