Αναφορά API / Calls

Calls

Τα endpoints της ομάδας Calls του Voiceland AI API, με παραμέτρους, σχήματα και παραδείγματα curl.

Τελευταία ενημέρωση:

Οι περιγραφές των endpoints και των πεδίων εμφανίζονται στα αγγλικά, όπως ακριβώς τις δημοσιεύει το API. Είναι επιλογή μας, ώστε να διαβάζετε εδώ ό,τι θα δείτε και στις αποκρίσεις.

GET /v1/calls#

List calls. Returns call records (CDRs), most recent first, filterable by agent, number, time window, and outcome. A chat session a person took over also carries a takeover block (trigger, requested_at, claimed_by, claimed_at, resolved_at, resolution, human_turns); it is absent on every conversation that never asked for one.

Παράμετροι

Όνομα Θέση Τύπος Απαιτείται Περιγραφή
agent query string Filter to one agent.
from query string Filter by caller number (E.164).
to query string Filter by dialed number (E.164).
since query string Start of the time window (RFC3339).
until query string End of the time window (RFC3339).
hangup_cause query string Filter by hangup cause.
errors query boolean Set true to return only errored calls.
limit query integer Max rows (default 100).

Αποκρίσεις

Κωδικός Περιγραφή
200 Success.
401 Missing or invalid API key.
4XX Request error (validation, not-found, etc.).
5XX Server or upstream error.

Παράδειγμα αιτήματος

curl "https://api.voiceland.ai/v1/calls" \
  -H "Authorization: Bearer VL_API_KEY"

Παράδειγμα απόκρισης

{
  "items": [
    {
      "agent": "front-desk",
      "direction": "inbound",
      "id": "call_…",
      "talk_seconds": 42
    },
    {
      "agent": "front-desk",
      "direction": "inbound",
      "id": "call_…",
      "recording_purged_at": "2026-08-01T03:00:00Z",
      "talk_seconds": 31
    }
  ],
  "timezone": "Europe/Athens"
}

POST /v1/calls/dial#

Place an outbound call. Originates a call from an outbound-enabled agent to an E.164 destination. The caller-ID is the agent's own claimed number. **This call is bounded twice, and the two bounds behave differently.** A per-minute rate stops a runaway loop and clears in seconds (429 dial_rate_limit). A separate allowance for the current UTC day stops a stolen key dialling all day just under that rate (429 dial_daily_cap); waiting a few seconds does not clear it, and the message names the instant it resets. Both allowances come from your plan and ride every successful response, so a campaign can pace itself: x-ratelimit-limit is calls per minute, x-dial-cap-limit and x-dial-cap-remaining are today's total and what is left of it. A call refused by either limit is never placed and never billed.

Σώμα αιτήματος

application/json Σχήμα: CallsDialRequest

Πεδίο Τύπος Απαιτείται Περιγραφή
agent string Ναι Name of an outbound-enabled agent to place the call.
identity string Ναι A label for the callee, available to the agent during the call.
to string Ναι Destination phone number in E.164 (e.g. +30693XXXXXXX).

Αποκρίσεις

Κωδικός Περιγραφή
202 Call accepted.
401 Missing or invalid API key.
402 Refused by your plan, nothing placed or billed. concurrent_calls_cap: too many simultaneous calls, the message names how many your plan allows at once and how many are in progress, counted across your whole account; retry when a call ends. feature_not_entitled: your plan does not include outbound calling. no_subscription: the account has no subscription. minutes_exhausted / fee_past_due: the prepaid pool is empty or the plan fee is overdue.
429 Refused by one of the two outbound dial limits. dial_rate_limit is the per-minute allowance and clears in seconds. dial_daily_cap is the allowance for the current UTC day, does NOT clear by waiting a few seconds, and the message names the exact instant it resets. Both carry retry-after; both allowances ride every successful response as x-ratelimit-limit, x-dial-cap-limit and x-dial-cap-remaining. Both come from your plan.
4XX Request error (validation, not-found, etc.).
503 The outbound dial budget could not be read or written (dial_budget_unavailable). No call was placed. This is deliberate rather than a fallback: the daily counter is what bounds outbound spend, so a call that cannot be counted is not made. Retry.
5XX Server or upstream error.

Παράδειγμα αιτήματος

curl -X POST "https://api.voiceland.ai/v1/calls/dial" \
  -H "Authorization: Bearer VL_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "agent": "appointment-reminder",
  "identity": "Maria",
  "to": "+30693XXXXXXX"
}'

Η επιτυχής απόκριση επιστρέφει ένα CallsDialResponse.

Παράδειγμα απόκρισης

{
  "call_id": "call_…",
  "participant_id": "pa_…",
  "room": "room_…"
}

GET /v1/calls/{id}#

Get a call. Full call detail including recording URLs, cost, and quality (MOS). Recordings are kept for the number of days your plan states (recording_retention_days on the package). Once that window has passed the audio is deleted and the call carries recording_purged_at (RFC3339): every recording_url field is then absent for good and the recording stream answers 404 recording_purged. The call record itself, its transcript and its cost lines are not affected. Calls under a legal hold are never purged. When a representative took the conversation over, the takeover block says who and when: trigger is what asked for a person (llm the assistant's own judgement, visitor their button, console an operator), requested_at to claimed_at is how long they waited, claimed_by is the representative, and resolution is how it ended (resumed handed back to the assistant, closed finished by the person, abandoned the session ended first).

Παράμετροι

Όνομα Θέση Τύπος Απαιτείται Περιγραφή
id path string Ναι Call id.
agent query string Optional agent hint for a faster lookup.

Αποκρίσεις

Κωδικός Περιγραφή
200 Success.
401 Missing or invalid API key.
4XX Request error (validation, not-found, etc.).
5XX Server or upstream error.

Παράδειγμα αιτήματος

curl "https://api.voiceland.ai/v1/calls/{id}" \
  -H "Authorization: Bearer VL_API_KEY"

Παράδειγμα απόκρισης

{
  "agent": "front-desk",
  "id": "call_…",
  "recording_url": "https://example.com/call.wav",
  "takeover": {
    "claimed_at": "2026-08-06T09:15:02Z",
    "claimed_by": "maria@acme.example",
    "human_turns": 4,
    "requested_at": "2026-08-06T09:14:31Z",
    "resolution": "resumed",
    "trigger": "visitor"
  }
}

GET /v1/calls/{id}/attestation#

Get a call attestation. A signed chain-of-custody statement for the call (RFC 9943). Requires the chain-of-custody capability; the plan is checked before the lookup, so an unentitled caller cannot learn whether an id exists.

Παράμετροι

Όνομα Θέση Τύπος Απαιτείται Περιγραφή
id path string Ναι Call id.

Αποκρίσεις

Κωδικός Περιγραφή
200 Success.
401 Missing or invalid API key.
402 Your plan does not include chain of custody (feature_not_entitled), or the account has no subscription (no_subscription).
404 No attestation for that call id under your account (attestation_not_found). An id that belongs to another account answers the same.
4XX Request error (validation, not-found, etc.).
5XX Server or upstream error.

Παράδειγμα αιτήματος

curl "https://api.voiceland.ai/v1/calls/{id}/attestation" \
  -H "Authorization: Bearer VL_API_KEY"

POST /v1/calls/{id}/cdr-export/retry#

Retry the CDR export. Re-attempts the CDR export delivery for this call. Requires the CDR webhook capability.

Παράμετροι

Όνομα Θέση Τύπος Απαιτείται Περιγραφή
id path string Ναι Call id.

Αποκρίσεις

Κωδικός Περιγραφή
200 Success.
401 Missing or invalid API key.
402 Your plan does not include the CDR webhook (feature_not_entitled), or the account has no subscription (no_subscription).
4XX Request error (validation, not-found, etc.).
5XX Server or upstream error.

Παράδειγμα αιτήματος

curl -X POST "https://api.voiceland.ai/v1/calls/{id}/cdr-export/retry" \
  -H "Authorization: Bearer VL_API_KEY"

Παράδειγμα απόκρισης

{
  "status": "delivered"
}

GET /v1/calls/{id}/graded-turns#

List the judge's verdicts for a call. The LLM judge's per-turn verdicts for this call, the rows the hallucination and grounded-answer rates on /me/kpis are folded from, one per judged agent turn. Join them to the transcript by turn_id (t<index>, the same turn identity the feedback surface uses); the answer text is NOT on this response, it is on /calls/{id}/transcript. groundedness is grounded, hallucination, or empty when the judge issued no grounding verdict (the turn cited nothing to check against), those turns are in neither side of the rate. PAGING: an empty next_cursor is the only signal that the listing is finished. This listing filters AFTER it queries, because the call id sits in the middle of the verdict row's sort key, so a page may legitimately return ZERO items with a cursor set, keep following next_cursor until it comes back empty, or you will report an unjudged call that was judged. scanned is how many rows the page crossed. Requires the full KPI dashboard capability, 402 without it.

Παράμετροι

Όνομα Θέση Τύπος Απαιτείται Περιγραφή
id path string Ναι Call id.
limit query integer Max verdicts per page (1 to 500, default 100).
cursor query string Pagination cursor, the previous page's next_cursor. Cut against one call, it is refused on another.

Αποκρίσεις

Κωδικός Περιγραφή
200 Success.
401 Missing or invalid API key.
4XX Request error (validation, not-found, etc.).
5XX Server or upstream error.

Παράδειγμα αιτήματος

curl "https://api.voiceland.ai/v1/calls/{id}/graded-turns" \
  -H "Authorization: Bearer VL_API_KEY"

Η επιτυχής απόκριση επιστρέφει ένα GradedTurnsResponse.

Παράδειγμα απόκρισης

{
  "call_id": "call_…",
  "items": [
    {
      "agent": "front-desk",
      "graded_at": "2026-08-01T10:00:00Z",
      "groundedness": "hallucination",
      "groundedness_score": 0.12,
      "judge_model": "gpt-4o-mini",
      "policy_ok": true,
      "relevance": 0.81,
      "sampled_at": "2026-08-01T10:00:00Z",
      "source_count": 0,
      "turn_id": "t3"
    }
  ],
  "next_cursor": "",
  "scanned": 214
}

GET /v1/calls/{id}/noise_suppression_stats#

Get noise-suppression stats. Per-second input/output levels + a summary for the call's caller-side noise suppression. Enterprise feature, 402 on lower tiers.

Παράμετροι

Όνομα Θέση Τύπος Απαιτείται Περιγραφή
id path string Ναι Call id.

Αποκρίσεις

Κωδικός Περιγραφή
200 Success.
401 Missing or invalid API key.
4XX Request error (validation, not-found, etc.).
5XX Server or upstream error.

Παράδειγμα αιτήματος

curl "https://api.voiceland.ai/v1/calls/{id}/noise_suppression_stats" \
  -H "Authorization: Bearer VL_API_KEY"

Παράδειγμα απόκρισης

{
  "items": [],
  "summary": {}
}

GET /v1/calls/{id}/path#

Get the call path. The vendor-neutral routing/lifecycle timeline for the call. Enterprise feature, 402 on lower tiers.

Παράμετροι

Όνομα Θέση Τύπος Απαιτείται Περιγραφή
id path string Ναι Call id.
limit query integer Max rows (1 to 500, default 500).
cursor query string Pagination cursor.

Αποκρίσεις

Κωδικός Περιγραφή
200 Success.
401 Missing or invalid API key.
4XX Request error (validation, not-found, etc.).
5XX Server or upstream error.

Παράδειγμα αιτήματος

curl "https://api.voiceland.ai/v1/calls/{id}/path" \
  -H "Authorization: Bearer VL_API_KEY"

Παράδειγμα απόκρισης

{
  "items": []
}

GET /v1/calls/{id}/recording.wav#

Stream a call recording. Plays the call's WAV to the authenticated caller, the in-platform playback every plan keeps, with HTTP range support for <audio> scrubbing. This is not a link: it needs your API key and is never cached, so it is served whether or not your plan includes shareable recording links (recording_url on the call is the shareable form and is withheld without that capability). variant selects a mono channel or a transfer leg; the stereo mix is the default. The call must belong to your account.

Παράμετροι

Όνομα Θέση Τύπος Απαιτείται Περιγραφή
id path string Ναι Call id.
agent query string Optional agent name; skips the account-wide lookup.
variant query string agent, caller, rep (transfer consult leg) or combined (whole journey). Omit for the stereo mix.

Αποκρίσεις

Κωδικός Περιγραφή
200 The WAV (audio/wav).
401 Missing or invalid API key.
404 No call with that id under your account (call_not_found), the call has no recording (recording_not_found), or the recording was deleted because your plan's retention window has passed (recording_purged, the call's recording_purged_at says when).
4XX Request error (validation, not-found, etc.).
5XX Server or upstream error.

Παράδειγμα αιτήματος

curl "https://api.voiceland.ai/v1/calls/{id}/recording.wav" \
  -H "Authorization: Bearer VL_API_KEY"

GET /v1/calls/{id}/traces#

Get call traces. Per-call broker-level event timeline for debugging. Rows of kind: path (the vendor-neutral call path) are included only when your plan carries per_call_trace_export; the rest of the timeline is always served.

Παράμετροι

Όνομα Θέση Τύπος Απαιτείται Περιγραφή
id path string Ναι Call id.
limit query integer Max rows (1 to 500, default 100).
cursor query string Pagination cursor.

Αποκρίσεις

Κωδικός Περιγραφή
200 Success.
401 Missing or invalid API key.
4XX Request error (validation, not-found, etc.).
5XX Server or upstream error.

Παράδειγμα αιτήματος

curl "https://api.voiceland.ai/v1/calls/{id}/traces" \
  -H "Authorization: Bearer VL_API_KEY"

Παράδειγμα απόκρισης

{
  "items": []
}

GET /v1/calls/{id}/transcript#

Get a call transcript. Role-tagged utterances ordered by offset.

Παράμετροι

Όνομα Θέση Τύπος Απαιτείται Περιγραφή
id path string Ναι Call id.
agent query string Optional agent hint.

Αποκρίσεις

Κωδικός Περιγραφή
200 Success.
401 Missing or invalid API key.
4XX Request error (validation, not-found, etc.).
5XX Server or upstream error.

Παράδειγμα αιτήματος

curl "https://api.voiceland.ai/v1/calls/{id}/transcript" \
  -H "Authorization: Bearer VL_API_KEY"

Παράδειγμα απόκρισης

{
  "call_id": "call_…",
  "items": [
    {
      "offset_ms": 1200,
      "role": "caller",
      "text": "Hi"
    }
  ]
}

POST /v1/calls/{id}/webhook/retry#

Retry the call webhook. Re-attempts the post-call webhook delivery for this call.

Παράμετροι

Όνομα Θέση Τύπος Απαιτείται Περιγραφή
id path string Ναι Call id.

Αποκρίσεις

Κωδικός Περιγραφή
200 Success.
401 Missing or invalid API key.
4XX Request error (validation, not-found, etc.).
5XX Server or upstream error.

Παράδειγμα αιτήματος

curl -X POST "https://api.voiceland.ai/v1/calls/{id}/webhook/retry" \
  -H "Authorization: Bearer VL_API_KEY"

Παράδειγμα απόκρισης

{
  "attempts": 2,
  "status": "delivered"
}

GET /v1/calls/{id}/webhooks#

List webhook deliveries. The webhook/event delivery attempts recorded for this call, with the bodies as delivered. Recording links inside those bodies (audio_url*) are withheld unless your plan includes shareable recording links, and a delivery whose body is not JSON is omitted in that case rather than searched.

Παράμετροι

Όνομα Θέση Τύπος Απαιτείται Περιγραφή
id path string Ναι Call id.

Αποκρίσεις

Κωδικός Περιγραφή
200 Success.
401 Missing or invalid API key.
4XX Request error (validation, not-found, etc.).
5XX Server or upstream error.

Παράδειγμα αιτήματος

curl "https://api.voiceland.ai/v1/calls/{id}/webhooks" \
  -H "Authorization: Bearer VL_API_KEY"

Παράδειγμα απόκρισης

{
  "items": []
}

POST /v1/calls/{id}/webhooks/retry#

Retry a delivery. Re-attempts one specific delivery, identified by delivery_id from the deliveries list. A post-call webhook row replays on every plan; a CDR export row needs the CDR webhook capability and an event row needs real-time event webhooks.

Παράμετροι

Όνομα Θέση Τύπος Απαιτείται Περιγραφή
id path string Ναι Call id.
delivery_id query string Ναι Opaque delivery id from the deliveries list.

Αποκρίσεις

Κωδικός Περιγραφή
200 Success.
401 Missing or invalid API key.
402 The row's kind is a capability your plan does not include, the CDR webhook for a cdr_export row, real-time event webhooks for an event row (feature_not_entitled), or the account has no subscription (no_subscription).
4XX Request error (validation, not-found, etc.).
5XX Server or upstream error.

Παράδειγμα αιτήματος

curl -X POST "https://api.voiceland.ai/v1/calls/{id}/webhooks/retry" \
  -H "Authorization: Bearer VL_API_KEY"

Παράδειγμα απόκρισης

{
  "status": "delivered"
}

GET /v1/me/dial-budget#

How much outbound calling is left today. What remains of your outbound allowance for the current UTC day, **without spending a call to find out**. The two dial bounds already publish themselves on every dial response, which helps a program that is already dialling and nobody else. This is the same numbers, readable at any time: it is strictly read-only, so polling it costs nothing and cannot move the figure it reports. Point a dashboard at it, or check it before starting a campaign. remaining_today is clamped at zero and resets_at is the exact instant it goes back to per_day, always UTC, so "today" does not depend on who is asking. warn_at is the number of dials that raises the approaching-cap alert, published so your own gauge turns amber where the alert actually fires rather than at a threshold you guessed. It reports the allowance, not permission: suspension, an exhausted minutes pool and the per-minute rate all sit beside this cap and none of them are visible here, so a dial can still be refused with budget left.

Αποκρίσεις

Κωδικός Περιγραφή
200 Success.
401 Missing or invalid API key.
4XX Request error (validation, not-found, etc.).
503 The outbound dial budget could not be read (dial_budget_unavailable). It answers 503 rather than reporting zero dials used: saying the whole allowance is free at the moment the system cannot tell is the one wrong answer.
5XX Server or upstream error.

Παράδειγμα αιτήματος

curl "https://api.voiceland.ai/v1/me/dial-budget" \
  -H "Authorization: Bearer VL_API_KEY"

Η επιτυχής απόκριση επιστρέφει ένα DialBudgetResponse.

Παράδειγμα απόκρισης

{
  "day": "2026-08-08",
  "dials_today": 37,
  "per_day": 200,
  "per_minute": 12,
  "remaining_today": 163,
  "resets_at": "2026-08-09T00:00:00Z",
  "tenant_slug": "acme",
  "warn_at": 160
}

Σχήματα#

CallsDialRequest#

Originate an outbound call from one of your agents.

Πεδίο Τύπος Απαιτείται Περιγραφή
agent string Ναι Name of an outbound-enabled agent to place the call.
identity string Ναι A label for the callee, available to the agent during the call.
to string Ναι Destination phone number in E.164 (e.g. +30693XXXXXXX).

CallsDialResponse#

Πεδίο Τύπος Απαιτείται Περιγραφή
call_id string Ναι
participant_id string Ναι
room string Ναι

DialBudgetResponse#

Πεδίο Τύπος Απαιτείται Περιγραφή
day string Ναι
dials_today integer Ναι
per_day integer Ναι
per_minute integer Ναι
remaining_today integer Ναι
resets_at string Ναι
tenant_slug string Ναι
warn_at integer Ναι

Error#

Error envelope returned for non-2xx responses.

Πεδίο Τύπος Απαιτείται Περιγραφή
error object Ναι

GradedTurnItem#

Πεδίο Τύπος Απαιτείται Περιγραφή
agent string
graded_at string (date-time) Ναι
groundedness string Ναι
groundedness_score number
judge_model string
policy_ok boolean
relevance number
sampled_at string (date-time)
source_count integer Ναι
turn_id string Ναι

GradedTurnsResponse#

Πεδίο Τύπος Απαιτείται Περιγραφή
call_id string Ναι
items array of GradedTurnItem Ναι
next_cursor string Ναι
scanned integer Ναι

Η κονσόλα

Οι σελίδες αυτές είναι μόνο για ανάγνωση. Η δοκιμαστική κλήση, τα κλειδιά API και η ζωντανή αναφορά API βρίσκονται στην κονσόλα, όπου ο λογαριασμός σας είναι συνδεδεμένος.

Άνοιγμα κονσόλας