---
title: "Read one bounded factual post-call result group"
method: GET
path: "/v1/call-results"
---

# Read one bounded factual post-call result group

`GET /v1/call-results`

## Request

- Base URL: `https://api.skysay.ai`
- URL: `https://api.skysay.ai/v1/call-results`
- Auth: HTTP bearer

Reads a customer-owned external_group_reference inside the authenticated organization/project. This is a pure, provider-free reconciliation read: it does not create calls, retry recipients, classify a business outcome, or copy recordings/transcripts. It returns authoritative technical call facts and a versioned, allowlisted technical_failure envelope separately from optional advisory extraction, plus authenticated evidence anchors (turn identifiers and offsets only). Historical failures without versioned evidence remain unknown and are never inferred from duration. The answered_or_voicemail metric deliberately includes only observable SIP/media answer evidence and may include voicemail; human_answered remains not_provable until a separately validated signal exists. Treat pagination as mandatory: a page is not the whole group while pagination.has_more is true.

## Query parameters

- `organization_id` string, required
- `project_id` string, required
- `external_group_reference` string, required
- `terminal_status` 'all' | 'terminal' | 'non_terminal'
- `artifact_readiness` 'all' | 'ready' | 'not_ready'
- `extraction_state` 'all' | 'not_configured' | 'pending' | 'ready' | 'failed'
- `platform_exception` 'all' | 'only' | 'none'
- `before` string
- `limit` integer

## Response `200`

Bounded factual call result page. Server-Timing and X-Skysay-Query-Count describe the fixed read budget; Cache-Control is no-store.

- CallGroupResults
  - `calls` CallGroupResultItem[], required
    - `analysis` PostCallAnalysis, required: Bounded generic asynchronous analysis; customer policy must not treat it as an authoritative business outcome without its own validation.
      - `advisory` true, required
      - `analysis_version` integer, required: Immutable platform analysis implementation version snapshotted when this extraction is enqueued; distinct from schema_version and never relabeled by a later platform release.
      - `completed_at` string, date-time, nullable
      - `evidence` PostCallAnalysisEvidence, required
        - `anchors` PostCallEvidenceAnchor[], required
          - `end_ms` integer, required
          - `sequence` integer, required
          - `speaker` string, required
          - `start_ms` integer, required
          - `turn_id` string, required
        - `availability` 'available' | 'unavailable', required: Whether this response could assemble the bounded evidence projection. unavailable makes no claim that the underlying recording or transcript is absent.
        - `recording` object, required
          - `available` boolean
          - `duration_seconds` number
          - `kind` string
          - `recording_id` string
          - `url` string: Authenticated relative Skysay recording route when available.
        - `transcript` object, required
          - `available` boolean
          - `transcript_status` string
          - `turn_count` integer
          - `url` string: Authenticated relative Skysay transcript route when available.
      - `failure_reason` string
      - `quality_flags` string[], required
      - `result` object: Bounded schema-validated scalar output; strings may be truncated on group reads.
      - `result_truncated` boolean
      - `schema_version` integer, required
      - `status` 'not_configured' | 'pending' | 'ready' | 'failed', required
    - `answered_or_voicemail` boolean, required: Observed call.answered/media.started evidence: the transport answered. It is not a human answer classification and can be voicemail, a caller tune or hold music. Read `call.answer_classification` for what was actually heard on the line.
    - `call` CallResultCallReference, required: Authoritative technical call facts, intentionally separate from advisory extraction.
      - `answer_classification` '' | 'human' | 'non_human_audio' | 'silent' | 'unknown', required: What was heard after the answer, with the same meanings as on the Call resource. It sits here rather than with the analysis because it is an observation of the line, not a reading of the conversation.
      - `call_id` string, required
      - `direction` string, required
      - `external_group_reference` string
      - `external_reference` string
      - `reason_detail` '' | 'caller_tune' | 'data_not_authorised' | 'deadline' | 'during_hold' | 'hold_limit' | 'hold_music' | 'insufficient_balance' | 'looping_recording' | 'menu_no_path' | 'model_unresponsive' | 'navigation_detector_lost' | 'navigation_limit' | 'no_audio' | 'recorded_message_only' | 'renewal_unavailable', required: Qualifies answer_classification or ended_reason, with the same meanings as on the Call resource.
      - `status` string, required
    - `created_at` string, date-time, required
    - `page_cursor` string, required
    - `technical_failure` TechnicalCallFailureEvidence, required: Versioned, allowlisted technical failure evidence for future calls. It never contains exception text, provider payloads, SIP headers, phone numbers, transcripts, or secrets. Historical or unclassified failures remain unknown; no_answer requires the durable outbound_ringing_timeout reason and is never inferred from duration.
      - `availability` 'available' | 'unknown' | 'not_applicable', required
      - `evidence_version` 1, required
      - `failure_reason_code` 'carrier_rate_missing' | 'inbound_admission_rejected' | 'inbound_capacity_reached' | 'unknown' | 'outbound_ringing_timeout' | 'outbound_authorization_rejected' | 'outbound_authorization_held_for_review' | 'outbound_media_admission_rejected' | 'outbound_trunk_rejected' | 'outbound_room_rejected' | 'outbound_dispatch_rejected' | 'outbound_sip_participant_rejected' | 'outbound_pre_media_rejected' | 'originate_worker_job_failed' | 'outbound_capacity_unavailable' | 'local_origination_not_started' | 'policy_blocked' | 'canceled_before_origination' | 'originate_worker_job_stale' | 'worker_entry_failed' | 'component_configuration_rejected' | 'voice_id_missing' | 'tts_model_missing' | 'llm_model_missing' | 'system_prompt_missing', required
      - `failure_stage` 'inbound_admission' | 'unknown' | 'outbound_authorization' | 'outbound_media_admission' | 'outbound_trunk' | 'outbound_room' | 'outbound_dispatch' | 'outbound_sip_participant' | 'outbound_pre_media' | 'outbound_worker' | 'outbound_local' | 'outbound_policy' | 'outbound_queue' | 'worker_entry' | 'component_configuration', required
      - `sip_status_code` integer, nullable, required
      - `terminal_status` 'completed' | 'failed' | 'busy' | 'no_answer' | 'canceled' | 'unknown', required
    - `updated_at` string, date-time, required
  - `external_group_reference` string, required
  - `filters` object, required
  - `pagination` object, required
    - `has_more` boolean, required
    - `limit` integer, required
    - `next_cursor` string, required
    - `returned` integer, required
  - `summary` object, required: Factual counters only. answered_or_voicemail publishes numerator and denominator; human_answered/voicemail remain unavailable unless independently observable. Per-call answer classification is published on each item rather than summarised here, because a summary counter would imply a coverage this summary cannot promise for calls placed before the classification existed.
    - `artifacts` object
    - `calls` object
    - `extraction` object
    - `metrics` object
  - `version` integer, required

## Other responses

- `400`: Missing/malformed group key, filter, limit, or page cursor.
- `404`: Project not found in the authenticated organization.

---

[API](https://skmtc.dev/skysay/apis/skysay-api.md) · [All operations](https://skmtc.dev/skysay/apis/skysay-api/llms.txt) · [OpenAPI document](https://skmtc.dev/skysay/apis/skysay-api/revisions/95b8c66f99aa?raw)
