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

# Create Account Call

POST https://api.coperniq.io/v1/accounts/{account_id}/calls
Content-Type: application/json

Create a new phone call record associated with an account

**Note:** The `/clients` path is an alias for `/accounts` and will continue to work until users are individually notified and migrated.


Reference: https://docs.coperniq.io/api-reference/calls/create-account-call

## Authentication

- `x-api-key` header (required) — API Key authentication via header

## Request

### Path parameters

- `account_id` (integer, required) — Account identifier

### Body (application/json)

This endpoint expects a CallCreate.

- `fromNumber` (string, required) — Phone number that initiated the call
- `toNumber` (string, required) — Phone number that received the call
- `isInbound` (boolean, required, default: false) — Whether the call was inbound (true) or outbound (false)
- `startTime` (string, required) — When the call started
- `endTime` (string, required) — When the call ended
- `reason` (string, required) — Why the call happened. Company-defined: the value is the name of one of the company's call reasons (see `GET /calls/classification-options?type=REASON`), so it can be any string up to 255 characters. Default reasons are Product, Process, Service, Accounting, Revenue opportunity, Feedback and Other. Calls logged before custom reasons existed hold the legacy uppercase value (e.g. `SERVICE`). Any string is accepted; use a name from the company's list so the call groups with others in Coperniq.
- `disposition` (string, required) — How the call ended up. Company-defined: the value is the name of one of the company's call dispositions (see `GET /calls/classification-options?type=DISPOSITION`), so it can be any string up to 255 characters. Default dispositions are Info provided, Visit scheduled, Issue resolved, Follow up, Escalation, No action, Unresponsive and Other. Calls logged before custom dispositions existed hold the legacy uppercase value (e.g. `INFO_PROVIDED`). Any string is accepted; use a name from the company's list so the call groups with others in Coperniq.
- `outcome` (enum, optional) — Call outcome
  - Allowed values: `ANSWERED`, `MISSED`, `VOICEMAIL`
- `note` (string, optional) — Human-editable note about the call. May contain HTML.
- `recordingUrl` (string, optional) — URL to the call recording
- `transcriptUrl` (string, optional) — URL to an externally hosted call transcript
- `missedCount` (integer, optional) — Number of times the call was missed

## Response

### 201

Call record created successfully

- `id` (integer, required) — Call identifier
- `fromNumber` (string, required) — Phone number that initiated the call
- `toNumber` (string, required) — Phone number that received the call
- `isInbound` (boolean, required) — Whether the call was inbound (true) or outbound (false)
- `createdAt` (string, required) — Creation timestamp
- `updatedAt` (string, required) — Last update timestamp
- `outcome` (enum, optional, nullable) — Call outcome
  - Allowed values: `ANSWERED`, `MISSED`, `VOICEMAIL`
- `startTime` (string, optional, nullable) — When the call started
- `endTime` (string, optional, nullable) — When the call ended
- `reason` (string, optional, nullable) — Why the call happened. Company-defined: the value is the name of one of the company's call reasons (see `GET /calls/classification-options?type=REASON`), so it can be any string up to 255 characters. Default reasons are Product, Process, Service, Accounting, Revenue opportunity, Feedback and Other. Calls logged before custom reasons existed hold the legacy uppercase value (e.g. `SERVICE`).
- `disposition` (string, optional, nullable) — How the call ended up. Company-defined: the value is the name of one of the company's call dispositions (see `GET /calls/classification-options?type=DISPOSITION`), so it can be any string up to 255 characters. Default dispositions are Info provided, Visit scheduled, Issue resolved, Follow up, Escalation, No action, Unresponsive and Other. Calls logged before custom dispositions existed hold the legacy uppercase value (e.g. `INFO_PROVIDED`).
- `note` (string, optional, nullable) — Human-editable note about the call. May contain HTML.
- `summary` (string, optional, nullable) — AI-generated summary of the call. `null` when the call has no AI transcript.
- `transcriptText` (string, optional, nullable) — AI transcript of the call as plain text, one sentence per line in spoken order. `null` when the call has no AI transcript.
- `recordingUrl` (string, optional, nullable) — URL to the call recording
- `transcriptUrl` (string, optional, nullable) — URL to an externally hosted call transcript, if one was provided when the call was logged. For Coperniq phone calls use `transcriptText`.
- `missedCount` (integer, optional, nullable) — Number of times the call was missed
- `classificationNote` (string, optional, nullable) — For calls classified by Coperniq AI, the AI's explanation of why it chose the reason and disposition.
- `resolution` (enum, optional, nullable) — For calls handled by a Coperniq AI agent, whether the caller's issue was resolved.
  - Allowed values: `RESOLVED`, `ESCALATED`, `UNRESOLVED`

## Errors

### 400 Bad Request Error

Invalid request

- `message` (string, optional)
- `code` (enum, optional)
  - Allowed values: `UNAUTHORIZED`
- `field` (string, optional) — Field that caused the validation error (if applicable)

### 401 Unauthorized Error

Authentication failed

- `message` (string, optional)
- `code` (enum, optional)
  - Allowed values: `UNAUTHORIZED`

## Examples

**Request**

```json
{
  "fromNumber": "string",
  "toNumber": "string",
  "isInbound": false,
  "startTime": "2024-01-15T09:30:00Z",
  "endTime": "2024-01-15T09:30:00Z",
  "reason": "Service",
  "disposition": "Info provided"
}
```

**Response**

```json
{
  "id": 1,
  "fromNumber": "string",
  "toNumber": "string",
  "isInbound": true,
  "createdAt": "2024-01-15T09:30:00Z",
  "updatedAt": "2024-01-15T09:30:00Z",
  "outcome": "ANSWERED",
  "startTime": "2024-01-15T09:30:00Z",
  "endTime": "2024-01-15T09:30:00Z",
  "reason": "Service",
  "disposition": "Info provided",
  "note": "string",
  "summary": "string",
  "transcriptText": "string",
  "recordingUrl": "string",
  "transcriptUrl": "string",
  "missedCount": 1,
  "classificationNote": "string",
  "resolution": "RESOLVED"
}
```

**SDK Code**

```python
import requests

url = "https://api.coperniq.io/v1/accounts/1/calls"

payload = {
    "fromNumber": "string",
    "toNumber": "string",
    "isInbound": False,
    "startTime": "2024-01-15T09:30:00Z",
    "endTime": "2024-01-15T09:30:00Z",
    "reason": "Service",
    "disposition": "Info provided"
}
headers = {
    "x-api-key": "<apiKey>",
    "Content-Type": "application/json"
}

response = requests.post(url, json=payload, headers=headers)

print(response.json())
```

```javascript
const url = 'https://api.coperniq.io/v1/accounts/1/calls';
const options = {
  method: 'POST',
  headers: {'x-api-key': '<apiKey>', 'Content-Type': 'application/json'},
  body: '{"fromNumber":"string","toNumber":"string","isInbound":false,"startTime":"2024-01-15T09:30:00Z","endTime":"2024-01-15T09:30:00Z","reason":"Service","disposition":"Info provided"}'
};

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

```go
package main

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

func main() {

	url := "https://api.coperniq.io/v1/accounts/1/calls"

	payload := strings.NewReader("{\n  \"fromNumber\": \"string\",\n  \"toNumber\": \"string\",\n  \"isInbound\": false,\n  \"startTime\": \"2024-01-15T09:30:00Z\",\n  \"endTime\": \"2024-01-15T09:30:00Z\",\n  \"reason\": \"Service\",\n  \"disposition\": \"Info provided\"\n}")

	req, _ := http.NewRequest("POST", url, payload)

	req.Header.Add("x-api-key", "<apiKey>")
	req.Header.Add("Content-Type", "application/json")

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

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

	fmt.Println(res)
	fmt.Println(string(body))

}
```

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

url = URI("https://api.coperniq.io/v1/accounts/1/calls")

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

request = Net::HTTP::Post.new(url)
request["x-api-key"] = '<apiKey>'
request["Content-Type"] = 'application/json'
request.body = "{\n  \"fromNumber\": \"string\",\n  \"toNumber\": \"string\",\n  \"isInbound\": false,\n  \"startTime\": \"2024-01-15T09:30:00Z\",\n  \"endTime\": \"2024-01-15T09:30:00Z\",\n  \"reason\": \"Service\",\n  \"disposition\": \"Info provided\"\n}"

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

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

HttpResponse<String> response = Unirest.post("https://api.coperniq.io/v1/accounts/1/calls")
  .header("x-api-key", "<apiKey>")
  .header("Content-Type", "application/json")
  .body("{\n  \"fromNumber\": \"string\",\n  \"toNumber\": \"string\",\n  \"isInbound\": false,\n  \"startTime\": \"2024-01-15T09:30:00Z\",\n  \"endTime\": \"2024-01-15T09:30:00Z\",\n  \"reason\": \"Service\",\n  \"disposition\": \"Info provided\"\n}")
  .asString();
```

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

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.coperniq.io/v1/accounts/1/calls', [
  'body' => '{
  "fromNumber": "string",
  "toNumber": "string",
  "isInbound": false,
  "startTime": "2024-01-15T09:30:00Z",
  "endTime": "2024-01-15T09:30:00Z",
  "reason": "Service",
  "disposition": "Info provided"
}',
  'headers' => [
    'Content-Type' => 'application/json',
    'x-api-key' => '<apiKey>',
  ],
]);

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

```csharp
using RestSharp;

var client = new RestClient("https://api.coperniq.io/v1/accounts/1/calls");
var request = new RestRequest(Method.POST);
request.AddHeader("x-api-key", "<apiKey>");
request.AddHeader("Content-Type", "application/json");
request.AddParameter("application/json", "{\n  \"fromNumber\": \"string\",\n  \"toNumber\": \"string\",\n  \"isInbound\": false,\n  \"startTime\": \"2024-01-15T09:30:00Z\",\n  \"endTime\": \"2024-01-15T09:30:00Z\",\n  \"reason\": \"Service\",\n  \"disposition\": \"Info provided\"\n}", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
```

```swift
import Foundation

let headers = [
  "x-api-key": "<apiKey>",
  "Content-Type": "application/json"
]
let parameters = [
  "fromNumber": "string",
  "toNumber": "string",
  "isInbound": false,
  "startTime": "2024-01-15T09:30:00Z",
  "endTime": "2024-01-15T09:30:00Z",
  "reason": "Service",
  "disposition": "Info provided"
] as [String : Any]

let postData = JSONSerialization.data(withJSONObject: parameters, options: [])

let request = NSMutableURLRequest(url: NSURL(string: "https://api.coperniq.io/v1/accounts/1/calls")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "POST"
request.allHTTPHeaderFields = headers
request.httpBody = postData as Data

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()
```