Skip to main content
GET
/
api
/
aiphonecall
/
v1
/
results
cURL
curl --request GET \
  --url https://forecaster.cairhealth.com/api/aiphonecall/v1/results \
  --header 'Authorization: Bearer <token>'
import requests

url = "https://forecaster.cairhealth.com/api/aiphonecall/v1/results"

headers = {"Authorization": "Bearer <token>"}

response = requests.get(url, headers=headers)

print(response.text)
const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};

fetch('https://forecaster.cairhealth.com/api/aiphonecall/v1/results', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));
<?php

$curl = curl_init();

curl_setopt_array($curl, [
CURLOPT_URL => "https://forecaster.cairhealth.com/api/aiphonecall/v1/results",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}
package main

import (
"fmt"
"net/http"
"io"
)

func main() {

url := "https://forecaster.cairhealth.com/api/aiphonecall/v1/results"

req, _ := http.NewRequest("GET", url, nil)

req.Header.Add("Authorization", "Bearer <token>")

res, _ := http.DefaultClient.Do(req)

defer res.Body.Close()
body, _ := io.ReadAll(res.Body)

fmt.Println(string(body))

}
HttpResponse<String> response = Unirest.get("https://forecaster.cairhealth.com/api/aiphonecall/v1/results")
.header("Authorization", "Bearer <token>")
.asString();
require 'uri'
require 'net/http'

url = URI("https://forecaster.cairhealth.com/api/aiphonecall/v1/results")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'

response = http.request(request)
puts response.read_body
{
  "records": [
    {
      "callId": "abc123",
      "type": "vob",
      "status": "completed",
      "phoneNumber": "+18005551234",
      "dateCreated": "2026-02-20T14:30:00.000Z",
      "dateCompleted": "2026-02-20T14:35:12.000Z",
      "results": {
        "benefits_verified": {
          "question": "Are the benefits active?",
          "answer": "Yes, the benefits are active until December 31, 2026"
        },
        "copay_amount": {
          "question": "What is the copay amount for this service?",
          "answer": "The copay is $25 for office visits"
        }
      },
      "formattedResults": "Benefits are active until 12/31/2026. Copay: $25 for office visits."
    },
    {
      "callId": "def456",
      "type": "denial",
      "status": "failed",
      "phoneNumber": "+18005559876",
      "dateCreated": "2026-02-20T15:00:00.000Z",
      "dateCompleted": "2026-02-20T15:05:30.000Z",
      "error": "Call failed | Tag: call_denial_claim123 | ID: claim123",
      "errorDetails": {
        "originalError": "Call was disconnected after reaching IVR menu",
        "internalTag": "call_denial_claim123",
        "internalId": "claim123",
        "timestamp": "2026-02-20T15:05:30.000Z"
      }
    }
  ],
  "pagination": {
    "totalRecords": 142,
    "totalPages": 3,
    "currentPage": 1,
    "pageSize": 50
  }
}
{
"error": "Invalid query parameters",
"details": [
{
"code": "invalid_string",
"message": "dateFrom must be YYYY-MM-DD",
"path": [
"dateFrom"
]
}
]
}
{
"error": "Unauthorized"
}
{
"error": "Unknown error occurred"
}

Best Practices

  • Use date filters to limit result sets. Querying without dateFrom/dateTo may return very large result sets that are slower to fetch.
  • Paginate efficiently by using a pageSize of 50–100 and iterating through pages. Check pagination.totalPages to know when you’ve fetched all results.
  • Poll responsibly if you are periodically checking for new results. A polling interval of 30–60 seconds is recommended. Use dateFrom set to your last poll timestamp to avoid re-fetching old results.
  • Filter by source if you only care about calls placed through the API (source=api) versus calls placed from the Cair platform UI (source=platform).
  • Use callId for single-call lookups instead of filtering a large result set — it’s the most efficient way to check on a specific call.
  • Use claimControlNumber to look up results for a specific claim; it matches either the payer’s claim control number (ICN) or the claim control number from the call inputs. Combine with dateFrom/dateTo for faster queries.

Authorizations

Authorization
string
header
required

Bearer authentication header of the form Bearer <token>, where <token> is your auth token.

Query Parameters

dateFrom
string<date>

Only return calls completed on or after this date (inclusive, from 00:00:00 UTC). Format: YYYY-MM-DD.

dateTo
string<date>

Only return calls completed on or before this date (inclusive, through 23:59:59 UTC). Format: YYYY-MM-DD.

type
enum<string>

Filter by call type. vob = Verification of Benefits, custom_vob_aba = Custom VOB for ABA, podiatry_vob = Podiatry VOB, vob_rpm = VOB for Remote Patient Monitoring, denial = Denied Claim Follow-up, claim_status_inquiry = General Claim Status, claim_status_wc = Workers' Comp Claim Status, claim_status_auto_pip = Auto/PIP Claim Status, custom_claim_status = Custom Claim Status, prior_auth = Prior Auth (Drug-based), prior_auth_cpt = Prior Auth (CPT-based), prior_auth_status_nds = Prior Auth Status (NDS), prior_auth_status_cpt = Prior Auth Status (CPT), credentialing = Credentialing Inquiry, credentialing_im = Credentialing - IM, appeal = Appeal Call

Available options:
vob,
custom_vob_aba,
podiatry_vob,
vob_rpm,
denial,
claim_status_inquiry,
claim_status_wc,
claim_status_auto_pip,
custom_claim_status,
prior_auth,
prior_auth_cpt,
prior_auth_status_nds,
prior_auth_status_cpt,
credentialing,
credentialing_im,
appeal
status
enum<string>

Filter by outcome. Omit to return both completed and failed calls.

Available options:
completed,
failed
source
enum<string>

Filter by how the call was initiated. platform = from the Cair UI, api = via the API

Available options:
platform,
api
batchId
string

Filter by batch upload ID to retrieve results for a specific CSV batch.

callId
string

Look up a specific call by its unique call ID.

phoneNumber
string

Filter by the phone number that was called.

claimControlNumber
string

Filter to calls where this value matches (case-insensitive) either the payer claim control number (ICN extracted from the call, e.g. for iMagnum) or the claim control number from the call inputs.

page
integer
default:1

Page number for pagination.

Required range: x >= 1
pageSize
integer
default:50

Number of results per page.

Required range: 1 <= x <= 200
sortOrder
enum<string>
default:desc

Sort direction by completion date. desc = newest first, asc = oldest first

Available options:
desc,
asc

Response

Call results retrieved successfully

Paginated response containing call result records

records
object[]
required

Array of call result objects

pagination
object
required

Pagination metadata for call results