---
title: "Originate a call"
description: "Connect an existing extension to a destination number for CRM click-to-call workflows."
---

> **Account availability:** These examples describe the A1PBX version 7 interface. Confirm the endpoint, header authentication, response format, and record permissions for your assigned account before production use.

> **Places a real call:** This GET request changes call state and may incur calling charges. Run it only on an explicit user action. Do not prefetch it, follow it as a browser link, or retry automatically after a timeout.

## Request

Connect an existing extension to a destination number for CRM click-to-call workflows.

`GET /originate`

## Parameters

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `extension` | string | Yes | Existing extension authorized for this API account. |
| `destination` | string | Yes | Destination permitted by your account calling policy. |

## Examples

### cURL

```bash
curl --fail-with-body --get \
  "https://$A1PBX_ACCOUNT_ID.a1routes.com/app/api/7/originate" \
  --header "Authorization: Basic $A1PBX_API_KEY" \
  --data-urlencode "extension=$EXTENSION" \
  --data-urlencode "destination=$DESTINATION"
```

### Node.js

```javascript
const url = new URL(`https://${process.env.A1PBX_ACCOUNT_ID}.a1routes.com/app/api/7/originate`);
url.searchParams.set('extension', process.env.EXTENSION);
url.searchParams.set('destination', process.env.DESTINATION);
const response = await fetch(url, {
  headers: {
    Authorization: `Basic ${process.env.A1PBX_API_KEY}`,
  },
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.text());
```

### Python

```python
import os
import requests
url = f"https://{os.environ['A1PBX_ACCOUNT_ID']}.a1routes.com/app/api/7/originate"
response = requests.get(
    url,
    params={
        "extension": os.environ["EXTENSION"],
        "destination": os.environ["DESTINATION"],
    },
    headers={"Authorization": "Basic " + os.environ["A1PBX_API_KEY"]},
    timeout=30,
)
response.raise_for_status()
print(response.text)
```

### PHP

```php
<?php
$url = 'https://' . getenv('A1PBX_ACCOUNT_ID') . '.a1routes.com/app/api/7/originate';
$url .= '?' . http_build_query([
    'extension' => getenv('EXTENSION'),
    'destination' => getenv('DESTINATION'),
]);
$ch = curl_init($url);
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT => 30,
    CURLOPT_HTTPHEADER => ['Authorization: Basic ' . getenv('A1PBX_API_KEY')],
]);
$body = curl_exec($ch);
if ($body === false) throw new RuntimeException(curl_error($ch));
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($status >= 400) throw new RuntimeException('HTTP ' . $status);
echo $body;
```

## Response

Confirm the response format and call identifier behavior for your deployment. An accepted request does not establish that the destination answered. If a request times out, check the call outcome before attempting another call.

## Integration notes

Use an existing permitted extension and destination. This reference does not expose advanced dial strings, feature codes, call interception, or system commands. Caller identity and routing remain governed by your account configuration.

See [authentication](/docs/authentication), [pagination](/docs/pagination), and [error handling](/docs/errors).
