> This is a page from the ElevenLabs documentation. For a complete page index, fetch https://elevenlabs.io/docs/llms.txt. For the full documentation in a single file, fetch https://elevenlabs.io/docs/llms-full.txt.

# Wyślij żądanie wywołania wsadowego.

POST https://api.elevenlabs.io/v1/convai/batch-calling/submit
Content-Type: application/json

Prześlij żądanie połączeń wsadowych, aby zaplanować rozmowy dla wielu odbiorców.

Reference: https://elevenlabs.io/docs/api-reference/batch-calling/create

## Servers

- `https://api.elevenlabs.io` (Production, default)
- `https://api.us.elevenlabs.io` (Production US)
- `https://api.eu.residency.elevenlabs.io` (Production EU)
- `https://api.in.residency.elevenlabs.io` (Production India)
- `https://api.sg.residency.elevenlabs.io` (Production Singapore)

## Request

### Body (application/json)

This endpoint expects a Body_Submit_a_batch_call_request__v1_convai_batch_calling_submit_post.

- `call_name` (string, required)
- `agent_id` (string, required)
- `recipients` (list of OutboundCallRecipient, required)
- `scheduled_time_unix` (integer, optional, nullable)
- `agent_phone_number_id` (string, optional, nullable)
- `whatsapp_params` (BatchCallWhatsAppParams, optional, nullable)
- `timezone` (string, optional, nullable)
- `branch_id` (string, optional, nullable)
- `environment` (string, optional, nullable)
- `telephony_call_config` (TelephonyCallConfig-Input, optional)
- `target_concurrency_limit` (integer, optional, nullable) — Maksymalna liczba jednoczesnych połączeń dla tej partii. Gdy ustawiono, wysyłanie połączeń zależy od tego limitu zamiast od procentów pojemności obszaru roboczego/agenta.

## Response

### 200

Pomyślna odpowiedź

- `id` (string, required)
- `phone_number_id` (string, required, nullable)
- `phone_provider` (enum, required, nullable)
  - Allowed values: `twilio`, `sip_trunk`, `exotel`
- `whatsapp_params` (BatchCallWhatsAppParams, required, nullable)
- `name` (string, required)
- `agent_id` (string, required)
- `branch_id` (string, required, nullable)
- `environment` (string, required, nullable)
- `created_at_unix` (integer, required)
- `scheduled_time_unix` (integer, required)
- `timezone` (string, required, nullable)
- `total_calls_dispatched` (integer, required, default: 0)
- `total_calls_scheduled` (integer, required, default: 0)
- `total_calls_finished` (integer, required, default: 0)
- `last_updated_at_unix` (integer, required)
- `status` (enum, required)
  - Allowed values: `pending`, `in_progress`, `completed`, `failed`, `cancelled`
- `retry_count` (integer, required, default: 0)
- `telephony_call_config` (TelephonyCallConfig-Output, required)
- `target_concurrency_limit` (integer, required, nullable) — Maksymalna liczba jednoczesnych połączeń dla tej partii. Gdy ustawiono, wysyłanie połączeń zależy od tego limitu zamiast od procentów pojemności obszaru roboczego/agenta.
- `agent_name` (string, required)
- `branch_name` (string, required, nullable)

## Errors

### 422 Unprocessable Entity Error

Błąd walidacji

- `detail` (list of ValidationError, optional)

## Types

### OutboundCallRecipient

- `id` (string, optional, nullable)
- `phone_number` (string, optional, nullable)
- `whatsapp_user_id` (string, optional, nullable)
- `conversation_initiation_client_data` (ConversationInitiationClientDataRequest-Input, optional, nullable)

### BatchCallWhatsAppParams

- `whatsapp_call_permission_request_template_name` (string, required)
- `whatsapp_call_permission_request_template_language_code` (string, required)
- `whatsapp_phone_number_id` (string, optional, nullable)

### TelephonyCallConfig-Input

- `ringing_timeout_secs` (integer, optional, default: 60) — Jak długo dzwonić do odbiorcy przed zakończeniem próby, w sekundach. Ograniczenia dostawcy również mają zastosowanie.
- `twilio_call_recording_enabled` (boolean, optional, default: false) — Czy nagrywać rozmowę za pomocą nagrywania połączeń Twilio. Ignorowane w przypadku dostawców innych niż Twilio. Nagrania są przechowywane na twoim koncie Twilio.
- `twilio_machine_detection` (TwilioMachineDetectionConfig, optional, nullable) — Konfiguracja wykrywania automatycznej sekretarki (AMD) Twilio na poziomie operatora. Pomiń ją lub ustaw na null, aby ją wyłączyć. Jest ignorowana dla dostawców innych niż Twilio oraz połączeń przychodzących. Wynik jest dostarczany jako osobne zdarzenie webhooka `answering_machine_detection`, które musi być włączone w ustawieniach webhooków obszaru roboczego lub agenta; nie jest częścią rozmowy ani webhooka po połączeniu. Wykrywanie działa asynchronicznie, więc nigdy nie opóźnia rozpoczęcia rozmowy, a wynik może nadejść w dowolnym momencie połączenia — przy `detect_message_end` nawet po jego zakończeniu. Twilio nalicza osobną opłatę za AMD.

### TelephonyCallConfig-Output

- `ringing_timeout_secs` (integer, optional, default: 60) — Jak długo dzwonić do odbiorcy przed zakończeniem próby, w sekundach. Ograniczenia dostawcy również mają zastosowanie.
- `twilio_call_recording_enabled` (boolean, optional, default: false) — Czy nagrywać rozmowę za pomocą nagrywania połączeń Twilio. Ignorowane w przypadku dostawców innych niż Twilio. Nagrania są przechowywane na twoim koncie Twilio.
- `twilio_machine_detection` (TwilioMachineDetectionConfig, optional, nullable) — Konfiguracja wykrywania automatycznej sekretarki (AMD) Twilio na poziomie operatora. Pomiń ją lub ustaw na null, aby ją wyłączyć. Jest ignorowana dla dostawców innych niż Twilio oraz połączeń przychodzących. Wynik jest dostarczany jako osobne zdarzenie webhooka `answering_machine_detection`, które musi być włączone w ustawieniach webhooków obszaru roboczego lub agenta; nie jest częścią rozmowy ani webhooka po połączeniu. Wykrywanie działa asynchronicznie, więc nigdy nie opóźnia rozpoczęcia rozmowy, a wynik może nadejść w dowolnym momencie połączenia — przy `detect_message_end` nawet po jego zakończeniu. Twilio nalicza osobną opłatę za AMD.

### ValidationError

- `loc` (list of ValidationErrorLocItems, required)
- `msg` (string, required)
- `type` (string, required)

### ConversationInitiationClientDataRequest-Input

- `conversation_config_override` (ConversationConfigClientOverride-Input, optional)
- `custom_llm_extra_body` (map from string to any, optional)
- `user_id` (string, optional, nullable) — ID użytkownika końcowego uczestniczącego w tej rozmowie (do identyfikacji użytkownika właściciela agenta)
- `source_info` (ConversationInitiationSourceInfo, optional) — Informacje o źródle rozpoczęcia rozmowy
- `branch_id` (string, optional, nullable) — ID gałęzi agenta do użycia w tej rozmowie
- `environment` (string, optional, nullable) — Środowisko używane do rozwiązywania zmiennych środowiskowych
- `starting_workflow_node_id` (string, optional, nullable) — Jeśli ustawione, uruchamia workflow od węzła o tym identyfikatorze zamiast od domyślnego punktu wejścia.
- `procedure_ids` (list of string, optional, nullable) — Jeśli ustawione, agentowi rozpoczynającemu rozmowę będą dostępne tylko te procedury. Każdy identyfikator musi być przypisany do tego agenta; nieznane identyfikatory uniemożliwią rozpoczęcie rozmowy. Pusta lista wyłącza wszystkie procedury tego agenta. Nie dotyczy po przekazaniu rozmowy innemu agentowi. Wymaga enable_procedure_ids_from_client.
- `dynamic_variables` (map from string to any, optional)

### TwilioMachineDetectionConfig

Jak uruchomić wykrywanie automatycznej sekretarki (AMD) Twilio na poziomie operatora podczas połączenia.

- `mode` (enum, optional, default: enable) — Jak dokładne ma być wykrywanie. `enable` zwraca wynik, gdy tylko Twilio rozpozna człowieka lub maszynę. `detect_message_end` czeka też na zakończenie powitania poczty głosowej, co pozwala uzyskać wyniki `machine_end_*`, ale zwraca rezultat później.
  - Allowed values: `enable`, `detect_message_end`
- `actions` (list of TwilioMachineDetectionRule, optional) — Działania do wykonania podczas połączenia dla każdego werdyktu AMD. Każde działanie może wystąpić najwyżej w jednej regule, dlatego wymień razem wszystkie odpowiadające mu werdykty. Werdykty bez reguły nie kończą połączenia.

### ValidationErrorLocItems

- string
- integer

### ConversationConfigClientOverride-Input

- `asr` (ASRConversationalConfigOverride, optional, nullable) — Konfiguracja transkrypcji rozmowy
- `turn` (TurnConfigOverride, optional, nullable) — Konfiguracja wykrywania tury
- `tts` (TTSConversationalConfigOverride, optional, nullable) — Konfiguracja zamiany tekstu na mowę w rozmowie
- `conversation` (ConversationConfigOverride, optional, nullable) — Konfiguracja zdarzeń rozmowy
- `agent` (AgentConfigOverride-Input, optional, nullable) — Konfiguracja agenta

### ConversationInitiationSourceInfo

Informacje o źródle rozpoczęcia rozmowy

- `source` (enum, optional, nullable, default: unknown) — Źródło rozpoczęcia rozmowy
  - Allowed values: `unknown`, `android_sdk`, `node_js_sdk`, `react_native_sdk`, `react_sdk`, `js_sdk`, `python_sdk`, `widget`, `sip_trunk`, `twilio`, `exotel`, `genesys`, `avaya`, `audiocodes`, `swift_sdk`, `whatsapp`, `twilio_sms`, `flutter_sdk`, `zendesk_integration`, `slack_integration`, `telegram_integration`, `intercom_integration`, `freshdesk_integration`, `salesforce_integration`, `template_preview`, `genesys_bot_connector`, `subagent_tool`
- `version` (string, optional, nullable) — Numer wersji SDK

### TwilioMachineDetectionRule

Działanie do wykonania podczas aktywnego połączenia dla danych werdyktów AMD.

- `action` (enum, required)
  - Allowed values: `hang_up`
- `answered_by` (list of enum, required) — Werdykty wywołujące działanie.
  - Allowed values: `human`, `fax`, `unknown`, `machine_start`, `machine_end_beep`, `machine_end_silence`, `machine_end_other`

### ASRConversationalConfigOverride

- `keywords` (list of string, optional, nullable) — Słowa kluczowe zwiększające prawdopodobieństwo predykcji

### TurnConfigOverride

- `soft_timeout_config` (SoftTimeoutConfigOverride, optional, nullable) — Konfiguracja miękkiego limitu czasu. Zapewnia natychmiastową informację zwrotną podczas dłuższych odpowiedzi LLM.

### TTSConversationalConfigOverride

- `model_id` (enum, optional, nullable, default: eleven_v4_turbo) — Model do użycia w TTS
  - Allowed values: `eleven_turbo_v2`, `eleven_turbo_v2_5`, `eleven_flash_v2`, `eleven_flash_v2_5`, `eleven_multilingual_v2`, `eleven_v3_conversational`, `eleven_v4`, `eleven_v4_turbo`
- `voice_id` (string, optional, nullable) — ID głosu do użycia w TTS
- `supported_voices` (list of SupportedVoice, optional, nullable) — Dodatkowe głosy obsługiwane przez agenta
- `stability` (double, optional, nullable) — Stabilność wygenerowanej mowy
- `speed` (double, optional, nullable) — Szybkość wygenerowanej mowy
- `similarity_boost` (double, optional, nullable) — Wzmocnienie podobieństwa dla wygenerowanej mowy
- `pronunciation_dictionary_locators` (list of PydanticPronunciationDictionaryVersionLocator, optional, nullable) — Lokalizatory słownika wymowy

### ConversationConfigOverride

- `text_only` (boolean, optional, nullable) — Jeśli włączone, audio nie będzie przetwarzane i użyty zostanie tylko tekst. Użyj, aby uniknąć opłat za audio.
- `max_duration_seconds` (integer, optional, nullable) — Maksymalny czas trwania rozmowy w sekundach

### AgentConfigOverride-Input

- `first_message` (string, optional, nullable) — Jeśli nie jest puste, pierwsza wiadomość, którą wypowie agent. Jeśli jest puste, agent czeka, aż użytkownik rozpocznie rozmowę.
- `language` (string, optional, nullable) — Język agenta — używany przez ASR i TTS
- `max_conversation_duration_message` (string, optional, nullable) — Jeśli nie jest puste, wiadomość, którą agent wyśle po osiągnięciu maksymalnego czasu trwania rozmowy.
- `prompt` (PromptAgentAPIModelOverride-Input, optional, nullable) — Prompt dla agenta

### SoftTimeoutConfigOverride

- `message` (string, optional, nullable) — Wiadomość wyświetlana po osiągnięciu pierwszego miękkiego limitu czasu podczas oczekiwania na odpowiedź LLM. Obsługuje zmienne dynamiczne (np. \{\{system\_\_time}}, \{\{custom\_variable}}).
- `additional_soft_timeout_messages` (list of string, optional, nullable) — Dodatkowe statyczne komunikaty wypełniające dla kolejnych miękkich limitów czasu w tej samej generacji LLM. Pierwszy limit czasu używa `message`. Jeśli skonfigurowano mniej komunikatów niż `max_soft_timeouts_per_generation`, ostatni skonfigurowany komunikat jest powtarzany; w przeciwnym razie używany jest wbudowany komunikat wypełniający.

### SupportedVoice

- `label` (string, required)
- `voice_id` (string, required)
- `description` (string, optional, nullable)
- `language` (string, optional, nullable)
- `model_family` (enum, optional, nullable)
  - Allowed values: `turbo`, `flash`, `multilingual`, `v3_conversational`, `v4`, `v4_turbo`
- `optimize_streaming_latency` (enum, optional, nullable)
  - Allowed values: `0`, `1`, `2`, `3`, `4`
- `stability` (double, optional, nullable)
- `speed` (double, optional, nullable)
- `similarity_boost` (double, optional, nullable)

### PydanticPronunciationDictionaryVersionLocator

Lokalizator umożliwiający innym dokumentom odwoływanie się do konkretnego słownika i jego wersji. To wersja pydantic modelu PronunciationDictionaryVersionLocatorDBModel. Wymagany do zachowania zgodności z pozostałymi modelami danych agenta.

- `pronunciation_dictionary_id` (string, required) — ID słownika wymowy
- `version_id` (string, required, nullable) — ID wersji słownika wymowy

### PromptAgentAPIModelOverride-Input

- `prompt` (string, optional, nullable) — Prompt dla agenta
- `llm` (enum, optional, nullable) — LLM, który otrzyma prompt i historię czatu. Jeśli używasz rezydencji danych, LLM musi być obsługiwany w tym środowisku.
  - Allowed values: `gpt-4o-mini`, `gpt-4o`, `gpt-4`, `gpt-4-turbo`, `gpt-4.1`, `gpt-4.1-mini`, `gpt-4.1-nano`, `gpt-5`, `gpt-5.1`, `gpt-5.2`, `gpt-5.2-chat-latest`, `gpt-5.4`, `gpt-5.4-mini`, `gpt-5.4-nano`, `gpt-5.5`, `gpt-5.6-sol`, `gpt-5.6-terra`, `gpt-5.6-luna`, `gpt-6-astra`, `gpt-6-sol`, `gpt-6-luna`, `gpt-6.1-sol`, `gpt-5-mini`, `gpt-5-nano`, `gpt-3.5-turbo`, `gemini-1.5-pro`, `gemini-1.5-flash`, `gemini-2.0-flash`, `gemini-2.0-flash-lite`, `gemini-2.5-flash-lite`, `gemini-2.5-flash`, `gemini-3-pro-preview`, `gemini-3-flash-preview`, `gemini-3.1-pro-preview`, `gemini-3.1-flash-lite-preview`, `gemini-3.1-flash-lite`, `gemini-3.5-flash`, `gemini-3.5-flash-lite`, `gemini-3.6-flash`, `gemini-3.7-flash`, `gemini-3.8-flash`, `gemini-4-argon`, `claude-sonnet-4-5`, `claude-opus-4-6`, `claude-opus-4-7`, `claude-opus-4-8`, `claude-opus-5`, `claude-opus-5-5`, `claude-sonnet-4-6`, `claude-sonnet-5`, `claude-sonnet-5-5`, `claude-sonnet-4`, `claude-haiku-4-5`, `claude-haiku-5-5`, `claude-3-7-sonnet`, `claude-3-5-sonnet`, `claude-3-5-sonnet-v1`, `claude-3-haiku`, `grok-beta`, `custom-llm`, `qwen3-4b`, `qwen3-30b-a3b`, `qwen36-35b-a3b`, `qwen35-397b-a17b`, `gpt-oss-20b`, `gpt-oss-120b`, `glm-45-air-fp8`, `glm-52`, `deepseek-v41-flash`, `nemotron-35-super-vl-nvfp4`, `gemini-2.5-flash-preview-09-2025`, `gemini-2.5-flash-lite-preview-09-2025`, `gemini-2.5-flash-preview-05-20`, `gemini-2.5-flash-preview-04-17`, `gemini-2.5-flash-lite-preview-06-17`, `gemini-2.0-flash-lite-001`, `gemini-2.0-flash-001`, `gemini-1.5-flash-002`, `gemini-1.5-flash-001`, `gemini-1.5-pro-002`, `gemini-1.5-pro-001`, `claude-sonnet-4@20250514`, `claude-sonnet-4-5@20250929`, `claude-haiku-4-5@20251001`, `claude-3-7-sonnet@20250219`, `claude-3-5-sonnet@20240620`, `claude-3-5-sonnet-v2@20241022`, `claude-3-haiku@20240307`, `gpt-5-2025-08-07`, `gpt-5.1-2025-11-13`, `gpt-5.2-2025-12-11`, `gpt-5.4-2026-03-05`, `gpt-5.4-mini-2026-03-17`, `gpt-5.4-nano-2026-03-17`, `gpt-5.5-2026-04-23`, `gpt-5-mini-2025-08-07`, `gpt-5-nano-2025-08-07`, `gpt-4.1-2025-04-14`, `gpt-4.1-mini-2025-04-14`, `gpt-4.1-nano-2025-04-14`, `gpt-4o-mini-2024-07-18`, `gpt-4o-2024-11-20`, `gpt-4o-2024-08-06`, `gpt-4o-2024-05-13`, `gpt-4-0613`, `gpt-4-0314`, `gpt-4-turbo-2024-04-09`, `gpt-3.5-turbo-0125`, `gpt-3.5-turbo-1106`, `watt-tool-8b`, `watt-tool-70b`
- `tool_ids` (list of string, optional, nullable) — Lista identyfikatorów narzędzi używanych przez agenta.
- `tool_ids_strict` (boolean, optional, nullable) — Dotyczy tylko nadpisania w rozmowie i jest dozwolone wszędzie tam, gdzie można nadpisać tool_ids. Gdy ma wartość true, nadpisane tool_ids to pełna lista narzędzi dozwolonych w rozmowie, w tym narzędzi w węzłach workflow. Ignorowane, gdy ustawione na agencie.
- `native_mcp_server_ids` (list of string, optional, nullable) — Lista identyfikatorów natywnych serwerów MCP, z których ma korzystać agent
- `knowledge_base` (list of KnowledgeBaseLocator, optional, nullable) — Lista baz wiedzy, z których ma korzystać agent

### KnowledgeBaseLocator

- `type` (enum, required) — Typ bazy wiedzy
  - Allowed values: `file`, `url`, `text`, `folder`
- `name` (string, required) — Nazwa bazy wiedzy
- `id` (string, required) — ID bazy wiedzy
- `usage_mode` (enum, optional, default: auto) — Tryb użycia bazy wiedzy
  - Allowed values: `prompt`, `auto`

## Examples

**Request**

```json
{
  "call_name": "string",
  "agent_id": "string",
  "recipients": [
    {}
  ]
}
```

**Response**

```json
{
  "id": "string",
  "phone_number_id": "string",
  "phone_provider": "twilio",
  "whatsapp_params": {
    "whatsapp_call_permission_request_template_name": "string",
    "whatsapp_call_permission_request_template_language_code": "string",
    "whatsapp_phone_number_id": "string"
  },
  "name": "string",
  "agent_id": "string",
  "branch_id": "string",
  "environment": "string",
  "created_at_unix": 1,
  "scheduled_time_unix": 1,
  "timezone": "string",
  "total_calls_dispatched": 0,
  "total_calls_scheduled": 0,
  "total_calls_finished": 0,
  "last_updated_at_unix": 1,
  "status": "pending",
  "retry_count": 0,
  "telephony_call_config": {
    "ringing_timeout_secs": 60,
    "twilio_call_recording_enabled": false,
    "twilio_machine_detection": {
      "mode": "enable",
      "actions": [
        {
          "action": "hang_up",
          "answered_by": [
            "human"
          ]
        }
      ]
    }
  },
  "target_concurrency_limit": 1,
  "agent_name": "string",
  "branch_name": "string"
}
```

**SDK Code**

```python
import requests

url = "https://api.elevenlabs.io/v1/convai/batch-calling/submit"

payload = {
    "call_name": "string",
    "agent_id": "string",
    "recipients": [{}]
}
headers = {"Content-Type": "application/json"}

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

print(response.json())
```

```javascript
const url = 'https://api.elevenlabs.io/v1/convai/batch-calling/submit';
const options = {
  method: 'POST',
  headers: {'Content-Type': 'application/json'},
  body: '{"call_name":"string","agent_id":"string","recipients":[{}]}'
};

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.elevenlabs.io/v1/convai/batch-calling/submit"

	payload := strings.NewReader("{\n  \"call_name\": \"string\",\n  \"agent_id\": \"string\",\n  \"recipients\": [\n    {}\n  ]\n}")

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

	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.elevenlabs.io/v1/convai/batch-calling/submit")

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

request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n  \"call_name\": \"string\",\n  \"agent_id\": \"string\",\n  \"recipients\": [\n    {}\n  ]\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.elevenlabs.io/v1/convai/batch-calling/submit")
  .header("Content-Type", "application/json")
  .body("{\n  \"call_name\": \"string\",\n  \"agent_id\": \"string\",\n  \"recipients\": [\n    {}\n  ]\n}")
  .asString();
```

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

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.elevenlabs.io/v1/convai/batch-calling/submit', [
  'body' => '{
  "call_name": "string",
  "agent_id": "string",
  "recipients": [
    {}
  ]
}',
  'headers' => [
    'Content-Type' => 'application/json',
  ],
]);

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

```csharp
using RestSharp;

var client = new RestClient("https://api.elevenlabs.io/v1/convai/batch-calling/submit");
var request = new RestRequest(Method.POST);
request.AddHeader("Content-Type", "application/json");
request.AddParameter("application/json", "{\n  \"call_name\": \"string\",\n  \"agent_id\": \"string\",\n  \"recipients\": [\n    {}\n  ]\n}", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
```

```swift
import Foundation

let headers = ["Content-Type": "application/json"]
let parameters = [
  "call_name": "string",
  "agent_id": "string",
  "recipients": [[]]
] as [String : Any]

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

let request = NSMutableURLRequest(url: NSURL(string: "https://api.elevenlabs.io/v1/convai/batch-calling/submit")! 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()
```