> For complete lifecycle-event payload schemas and examples, use the canonical overview: Session /api/sessions; Room lifecycle, members, and room playback /api/rooms; Session playback /api/playback; Recording /api/recording; DTMF /api/keypad-input; Messages /api/messages; WebSocket Session /api/web-socket. Use /api/event-delivery for transport behavior. Endpoint pages name relevant events, but these overviews are the canonical references.

# Create a charge

POST https://api.telekesher.dev/v1/sessions/{uuid}/payment/charges
Content-Type: application/json

Create a durable charge attempt from opaque card and security-code references. `Idempotency-Key` is required so charge admission can be replayed safely. The requested Nedarim terminal must be present in the authenticated application's operator-managed terminal allowlist; an unbound terminal is rejected before charge admission. The idempotency record stores a fingerprint of validated non-sensitive charge fields and the sanitized HTTP result, not the request body, card digits, or security code. A charge can be attempted only while the Session remains connected. After disconnect, the call-scoped card and security-code references are no longer usable. The Gateway stores only safe metadata and never receives card digits, a security code, provider credentials, or raw provider details. A provider timeout or uncertain submission is terminally reported as `indeterminate` and is never automatically submitted again.

See [Payment lifecycle events](/api/payments#lifecycle-events) for complete payload schemas and examples.

Reference: https://docs.vorbal.dev/api/payments/create-secure-payment-charge

## Authentication

- `Authorization` header (bearer token, required) — Application auth. Send `Authorization: Bearer <app_uuid>:<api_key>` using any active key in the app's collection. See [Authentication](https://voice-platform.docs.buildwithfern.com/api/authentication) for details.

## Request

### Path parameters

- `uuid` (string, required) — [Session](/api/sessions) identifier.

### Headers

- `Idempotency-Key` (string, required) — Required key used to make charge admission safely replayable.
- `Operation-Id` (string, optional) — optional client-supplied lowercase RFC-4122 v4 UUID returned as operation_uuid; platform generates one when omitted; correlation metadata distinct from Idempotency-Key.

### Body (application/json)

- `amount` (integer, required) — Charge amount in the currency's smallest unit.
- `card_uuid` (string, required) — Opaque card reference returned by `payment.card.collected`.
- `currency` (enum, required)
  - Allowed values: `ils`
- `cvv_uuid` (string, required) — Opaque CVV reference returned by `payment.cvv.collected`.
- `exp_month` (integer, required)
- `exp_year` (integer, required)
- `provider` (enum, required)
  - Allowed values: `nedarim`
- `terminal_number` (string, required) — Seven-digit Nedarim Mosad terminal number for this charge. Operators must bind the terminal to the authenticated application before it can be used.

## Response

### 202

Command accepted for async execution

- `operation_uuid` (string, required)
- `status` (enum, required)
  - Allowed values: `in_progress`, `completed`
- `already_ended` (true, optional) — Optional. Set to `true` on idempotent terminal commands when the session was already in a terminal state at the time the request was received. Absent otherwise.

## Examples

**Request**

```json
{
  "amount": 1800,
  "card_uuid": "card_550e8400-e29b-41d4-a716-446655440001",
  "currency": "ils",
  "cvv_uuid": "cvv_550e8400-e29b-41d4-a716-446655440002",
  "exp_month": 12,
  "exp_year": 2030,
  "provider": "nedarim",
  "terminal_number": "7005838"
}
```

**Response**

```json
{
  "operation_uuid": "550e8400-e29b-41d4-a716-446655440000",
  "status": "in_progress"
}
```

**SDK Code**

```python Payments_createSecurePaymentCharge_example
import requests

url = "https://api.telekesher.dev/v1/sessions/uuid/payment/charges"

payload = {
    "amount": 1800,
    "card_uuid": "card_550e8400-e29b-41d4-a716-446655440001",
    "currency": "ils",
    "cvv_uuid": "cvv_550e8400-e29b-41d4-a716-446655440002",
    "exp_month": 12,
    "exp_year": 2030,
    "provider": "nedarim",
    "terminal_number": "7005838"
}
headers = {
    "Idempotency-Key": "Idempotency-Key",
    "Authorization": "Bearer <token>",
    "Content-Type": "application/json"
}

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

print(response.json())
```

```javascript Payments_createSecurePaymentCharge_example
const url = 'https://api.telekesher.dev/v1/sessions/uuid/payment/charges';
const options = {
  method: 'POST',
  headers: {
    'Idempotency-Key': 'Idempotency-Key',
    Authorization: 'Bearer <token>',
    'Content-Type': 'application/json'
  },
  body: '{"amount":1800,"card_uuid":"card_550e8400-e29b-41d4-a716-446655440001","currency":"ils","cvv_uuid":"cvv_550e8400-e29b-41d4-a716-446655440002","exp_month":12,"exp_year":2030,"provider":"nedarim","terminal_number":"7005838"}'
};

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

```go Payments_createSecurePaymentCharge_example
package main

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

func main() {

	url := "https://api.telekesher.dev/v1/sessions/uuid/payment/charges"

	payload := strings.NewReader("{\n  \"amount\": 1800,\n  \"card_uuid\": \"card_550e8400-e29b-41d4-a716-446655440001\",\n  \"currency\": \"ils\",\n  \"cvv_uuid\": \"cvv_550e8400-e29b-41d4-a716-446655440002\",\n  \"exp_month\": 12,\n  \"exp_year\": 2030,\n  \"provider\": \"nedarim\",\n  \"terminal_number\": \"7005838\"\n}")

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

	req.Header.Add("Idempotency-Key", "Idempotency-Key")
	req.Header.Add("Authorization", "Bearer <token>")
	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 Payments_createSecurePaymentCharge_example
require 'uri'
require 'net/http'

url = URI("https://api.telekesher.dev/v1/sessions/uuid/payment/charges")

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

request = Net::HTTP::Post.new(url)
request["Idempotency-Key"] = 'Idempotency-Key'
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n  \"amount\": 1800,\n  \"card_uuid\": \"card_550e8400-e29b-41d4-a716-446655440001\",\n  \"currency\": \"ils\",\n  \"cvv_uuid\": \"cvv_550e8400-e29b-41d4-a716-446655440002\",\n  \"exp_month\": 12,\n  \"exp_year\": 2030,\n  \"provider\": \"nedarim\",\n  \"terminal_number\": \"7005838\"\n}"

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

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

HttpResponse<String> response = Unirest.post("https://api.telekesher.dev/v1/sessions/uuid/payment/charges")
  .header("Idempotency-Key", "Idempotency-Key")
  .header("Authorization", "Bearer <token>")
  .header("Content-Type", "application/json")
  .body("{\n  \"amount\": 1800,\n  \"card_uuid\": \"card_550e8400-e29b-41d4-a716-446655440001\",\n  \"currency\": \"ils\",\n  \"cvv_uuid\": \"cvv_550e8400-e29b-41d4-a716-446655440002\",\n  \"exp_month\": 12,\n  \"exp_year\": 2030,\n  \"provider\": \"nedarim\",\n  \"terminal_number\": \"7005838\"\n}")
  .asString();
```

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

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.telekesher.dev/v1/sessions/uuid/payment/charges', [
  'body' => '{
  "amount": 1800,
  "card_uuid": "card_550e8400-e29b-41d4-a716-446655440001",
  "currency": "ils",
  "cvv_uuid": "cvv_550e8400-e29b-41d4-a716-446655440002",
  "exp_month": 12,
  "exp_year": 2030,
  "provider": "nedarim",
  "terminal_number": "7005838"
}',
  'headers' => [
    'Authorization' => 'Bearer <token>',
    'Content-Type' => 'application/json',
    'Idempotency-Key' => 'Idempotency-Key',
  ],
]);

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

```csharp Payments_createSecurePaymentCharge_example
using RestSharp;

var client = new RestClient("https://api.telekesher.dev/v1/sessions/uuid/payment/charges");
var request = new RestRequest(Method.POST);
request.AddHeader("Idempotency-Key", "Idempotency-Key");
request.AddHeader("Authorization", "Bearer <token>");
request.AddHeader("Content-Type", "application/json");
request.AddParameter("application/json", "{\n  \"amount\": 1800,\n  \"card_uuid\": \"card_550e8400-e29b-41d4-a716-446655440001\",\n  \"currency\": \"ils\",\n  \"cvv_uuid\": \"cvv_550e8400-e29b-41d4-a716-446655440002\",\n  \"exp_month\": 12,\n  \"exp_year\": 2030,\n  \"provider\": \"nedarim\",\n  \"terminal_number\": \"7005838\"\n}", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
```

```swift Payments_createSecurePaymentCharge_example
import Foundation

let headers = [
  "Idempotency-Key": "Idempotency-Key",
  "Authorization": "Bearer <token>",
  "Content-Type": "application/json"
]
let parameters = [
  "amount": 1800,
  "card_uuid": "card_550e8400-e29b-41d4-a716-446655440001",
  "currency": "ils",
  "cvv_uuid": "cvv_550e8400-e29b-41d4-a716-446655440002",
  "exp_month": 12,
  "exp_year": 2030,
  "provider": "nedarim",
  "terminal_number": "7005838"
] as [String : Any]

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

let request = NSMutableURLRequest(url: NSURL(string: "https://api.telekesher.dev/v1/sessions/uuid/payment/charges")! 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()
```