> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.v2.rasen.ai/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.v2.rasen.ai/_mcp/server.

# Read call state

GET https://api.v2.rasen.ai/v1/calls/{call_id}

Read actual executed publication and independent result readiness. Do not use state text alone to infer result readiness.

Reference: https://docs.v2.rasen.ai/api-reference/calls/get

## Authentication

- `Authorization` header (bearer token, required) — Create and manage workspace-owned keys through the existing app session routes, outside this public API. Creator and manager identities are audit actors only. Key validity follows workspace policy, expiry and explicit revocation, independently of creator membership. Do not include a workspace-selection header.

## Request

### Path parameters

- `call_id` (string, required) — Resource identity within the authenticated workspace.

## Response

### 200

Read call state.

- `id` (string, required) — Opaque call identifier. Do not parse its contents.
- `agent_id` (string, required) — Opaque agent identifier. Do not parse its contents.
- `published_version_id` (string, required, nullable)
- `state` (string, required) — Canonical call lifecycle value; clients must tolerate new values. Terminality is given separately. Known values: admitted, active, evidence_pending, complete, incomplete, aborted.
- `terminal` (boolean, required)
- `direction` (string, required) — Open response vocabulary. Preserve unknown values; never assume they mean success.
- `created_at` (datetime, required)
- `ended_at` (datetime, required, nullable)
- `end_reason` (string, required, nullable) — Safe registered call-end reason.
- `metadata` (map from string to string, required)
- `transcript_state` (string, required) — Open response vocabulary. Preserve unknown values; never assume they mean success.
- `extraction_state` (string, required) — Open response vocabulary. Preserve unknown values; never assume they mean success.
- `from_number_id` (string, required, nullable) — Number used for this call; null for non-phone calls.
- `updated_at` (datetime, required)
- `poll_after_seconds` (integer, required, nullable) — Seconds before the next useful read. Null when the call is terminal and every result state is settled.
- `effective_variables` (list of EffectiveCallVariable, required)
- `summary_state` (string, required) — Open response vocabulary. Preserve unknown values; never assume they mean success.

## Errors

### 400 Bad Request Error

Invalid input or cursor. Correct the request.

- `error` (ErrorResponseError, required) — Only code and message are required. Rasen sends details, request_id and retry on every error, but clients must parse an error that lacks them, so a typed error is never lost to a parsing failure.

### 401 Unauthorized Error

Invalid, expired or revoked API key. Creator departure or membership changes do not invalidate a workspace key.

- `error` (ErrorResponseError, required) — Only code and message are required. Rasen sends details, request_id and retry on every error, but clients must parse an error that lacks them, so a typed error is never lost to a parsing failure.

### 403 Forbidden Error

Operation not allowed by current credential or workspace access.

- `error` (ErrorResponseError, required) — Only code and message are required. Rasen sends details, request_id and retry on every error, but clients must parse an error that lacks them, so a typed error is never lost to a parsing failure.

### 404 Not Found Error

Resource absent or not visible in this workspace.

- `error` (ErrorResponseError, required) — Only code and message are required. Rasen sends details, request_id and retry on every error, but clients must parse an error that lacks them, so a typed error is never lost to a parsing failure.

### 429 Too Many Requests Error

Rate limited. Respect Retry-After and retry the same intent where permitted.

- `error` (ErrorResponseError, required) — Only code and message are required. Rasen sends details, request_id and retry on every error, but clients must parse an error that lacks them, so a typed error is never lost to a parsing failure.

### 500 Internal Server Error

Internal error. The effect may have happened. Retry the same request with the same Idempotency-Key; read the resource before creating a new intent. For an operation that takes an Idempotency-Key, a client retry with the same key is safe: the server replays the stored outcome if the first attempt took effect; if the first attempt had no effect, the retry performs the operation once. Never retry with a new key.

- `error` (ErrorResponseError, required) — Only code and message are required. Rasen sends details, request_id and retry on every error, but clients must parse an error that lacks them, so a typed error is never lost to a parsing failure.

### 503 Service Unavailable Error

Service unavailable. Respect Retry-After where present. For an operation that takes an Idempotency-Key, a client retry with the same key is safe: the server replays the stored outcome if the first attempt took effect; if the first attempt had no effect, the retry performs the operation once. Never retry with a new key.

- `error` (ErrorResponseError, required) — Only code and message are required. Rasen sends details, request_id and retry on every error, but clients must parse an error that lacks them, so a typed error is never lost to a parsing failure.

## Types

### EffectiveCallVariable

Admission-time defaults plus overrides. visible preserves actual value, including actual null. redacted and withheld_unclassified have null value. Secret-declared variables are omitted entirely. Declare and classify variables before publication: public/internal values can be visible; confidential/pii are redacted. Undeclared or unclassified input stays withheld. No read of current mutable defaults.

- `key` (string, required)
- `value` (string, required, nullable)
- `visibility` (string, required) — Open response vocabulary. Preserve unknown values; never assume they mean success.

### ErrorResponseError

Only code and message are required. Rasen sends details, request_id and retry on every error, but clients must parse an error that lacks them, so a typed error is never lost to a parsing failure.

- `code` (string, required) — Stable code. Branch on code (and details.reason for conflict), never on message. Each code has one HTTP status; see components.x-error-catalog.
- `message` (string, required) — Safe description; no provider payload or submitted secrets.
- `details` (map from string to any, optional) — Safe code-specific details. The public fields for each code are listed in components.x-error-catalog. Details never contain a request fingerprint, a hash of a request, secret material or another tenant's data. forbidden may include required_capabilities (a list).
- `request_id` (string, optional) — Same value as the X-Request-Id header. Quote it to support.
- `retry` (string, optional) — Retry class of this code: no (fix the request or state first), yes (retry the same request and the same Idempotency-Key), retry_after (wait for Retry-After, then retry the same request). Open response vocabulary. Preserve unknown values; never assume they mean success.

## Examples

**Response**

```json
{
  "id": "call_01j00000000000000000000000",
  "agent_id": "agent_01j00000000000000000000000",
  "published_version_id": "published_version_01j00000000000000000000000",
  "state": "complete",
  "terminal": true,
  "direction": "inbound",
  "created_at": "2026-09-25T10:00:00Z",
  "ended_at": "2026-09-25T10:05:00Z",
  "end_reason": "hangup_requested",
  "metadata": {},
  "transcript_state": "pending",
  "extraction_state": "not_requested",
  "from_number_id": "from_number_01j00000000000000000000000",
  "updated_at": "2026-09-25T10:06:00Z",
  "poll_after_seconds": 30,
  "effective_variables": [
    {
      "key": "example",
      "value": "example",
      "visibility": "visible"
    }
  ],
  "summary_state": "not_requested"
}
```

**SDK Code**

```python calls_get_example
import requests

url = "https://api.v2.rasen.ai/v1/calls/call_id"

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

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

print(response.json())
```

```javascript calls_get_example
const url = 'https://api.v2.rasen.ai/v1/calls/call_id';
const options = {method: 'GET', headers: {Authorization: 'Bearer <api_key>'}};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

```ruby calls_get_example
require 'uri'
require 'net/http'

url = URI("https://api.v2.rasen.ai/v1/calls/call_id")

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

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

response = http.request(request)
puts response.read_body
```

```java calls_get_example
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.get("https://api.v2.rasen.ai/v1/calls/call_id")
  .header("Authorization", "Bearer <api_key>")
  .asString();
```

```php calls_get_example
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.v2.rasen.ai/v1/calls/call_id', [
  'headers' => [
    'Authorization' => 'Bearer <api_key>',
  ],
]);

echo $response->getBody();
```

```csharp calls_get_example
using RestSharp;

var client = new RestClient("https://api.v2.rasen.ai/v1/calls/call_id");
var request = new RestRequest(Method.GET);
request.AddHeader("Authorization", "Bearer <api_key>");
IRestResponse response = client.Execute(request);
```

```swift calls_get_example
import Foundation

let headers = ["Authorization": "Bearer <api_key>"]

let request = NSMutableURLRequest(url: NSURL(string: "https://api.v2.rasen.ai/v1/calls/call_id")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "GET"
request.allHTTPHeaderFields = headers

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```