---
title: "Campaign results: KPIs, groups and per-contact outcomes"
method: POST
path: "/api/v1/agentic/campaign-results/query"
tags: ["Agentic - Campaign Results"]
---

# Campaign results: KPIs, groups and per-contact outcomes

`POST /api/v1/agentic/campaign-results/query`

## Request

- Base URL: `https://api.voicelogica.ai`
- URL: `https://api.voicelogica.ai/api/v1/agentic/campaign-results/query`
- Auth: API key in header `x-api-key`

Computes the campaign results from existing calls and leads at request time. Every contact is in exactly one group; `reconciled` is true when the group counts add up to the number of contacts. Rows are paginated.

## Headers

- `x-api-key` string, required
- `x-company-id` string

## Request body

- object
  - `campaignId` string, required: ID of the campaign
  - `language` 'el' | 'en': Language of every label, sheet name and text: "el" (Greek, default) or "en" (English).
  - `page` integer: 1-based page of contact rows (default 1)
  - `pageSize` integer: Contact rows per page, 1–500 (default 100)

## Response `200`

Campaign results

- object
  - `companyId` string, required: The company the results were computed for
  - `campaignId` string, required
  - `campaignName` string, required
  - `generatedAt` string, required
  - `kpis` object, required
    - `contacts` number, required
    - `calls` number, required
    - `outboundCalls` number, required
    - `attempts` number, required: Outbound dial attempts, excluding technical failures
    - `callsRang` number, required
    - `spoke` number, required: Contacts who gave a real answer on at least one call
    - `positive` number, required
    - `conversionRate` number, required: positive ÷ spoke (0–1)
    - `reachRate` number, required: spoke ÷ contacts (0–1)
    - `inboundCalls` number, required
    - `inboundContacts` number, required
    - `callbacksDue` number, required
    - `callbacksOverdue` number, required
    - `doNotCall` number, required
    - `wrongNumbers` number, required
    - `invalidNumbers` number, required
    - `complaints` number, required
    - `introHangUpRate` number, required: Share of answered outbound calls that hung up within 20 s without answering (0–1)
    - `reclassifiedCalls` number, required: Calls whose final outcome differs from the AI verdict
  - `groupCounts` object, required
  - `outcomeCounts` object, required
  - `reconciled` boolean, required: true when the group counts add up to the number of contacts
  - `total` number, required: Total contact rows
  - `page` number, required
  - `pageSize` number, required
  - `rows` object[], required
    - `campaignLeadId` string, required
    - `phoneNumber` string, required
    - `name` string
    - `columns` object, required
    - `group` string, required: call_now | callback_calendar | called_back | no_answer | not_now | exclusions | pending
    - `finalOutcome` string, required
    - `outcomeLabel` string, required
    - `priority` string
    - `priorityReasons` string[], required
    - `nextAction` string, required
    - `ruleApplied` string, required
    - `attempts` number, required
    - `inboundCount` number, required
    - `positiveCount` number, required
    - `spoke` boolean, required
    - `firstContactAt` string
    - `firstPositiveAt` string
    - `lastContactAt` string
    - `suggestedCallAt` string
    - `overdue` boolean, required
    - `humanOnly` boolean, required
    - `complaint` boolean, required
    - `reasonTags` string[], required
    - `keyQuote` string
    - `callbackRequestText` string
    - `historyLine` string, required
    - `notes` string

## Other responses

- `401`: Unauthorized
- `403`: Invalid CSRF
- `404`: Campaign not found in your company
- `429`: Rate limit exceeded
- `500`: Internal Server Error

---

[API](https://skmtc.dev/voicelogica/apis/voice-logica-api.md) · [All operations](https://skmtc.dev/voicelogica/apis/voice-logica-api/llms.txt) · [OpenAPI document](https://skmtc.dev/voicelogica/apis/voice-logica-api/revisions/30f76840084e?raw)
