cURL
curl --request POST \
--url https://api.ttapi.io/v1/messages \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"messages": [
{
"role": "user",
"content": "Hello!"
}
],
"model": "claude-sonnet-4-5",
"max_tokens": 1024,
"stream": "false"
}
'import requests
url = "https://api.ttapi.io/v1/messages"
payload = {
"messages": [
{
"role": "user",
"content": "Hello!"
}
],
"model": "claude-sonnet-4-5",
"max_tokens": 1024,
"stream": "false"
}
headers = {
"x-api-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'x-api-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
messages: [{role: 'user', content: 'Hello!'}],
model: 'claude-sonnet-4-5',
max_tokens: 1024,
stream: 'false'
})
};
fetch('https://api.ttapi.io/v1/messages', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.ttapi.io/v1/messages",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'messages' => [
[
'role' => 'user',
'content' => 'Hello!'
]
],
'model' => 'claude-sonnet-4-5',
'max_tokens' => 1024,
'stream' => 'false'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-api-key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.ttapi.io/v1/messages"
payload := strings.NewReader("{\n \"messages\": [\n {\n \"role\": \"user\",\n \"content\": \"Hello!\"\n }\n ],\n \"model\": \"claude-sonnet-4-5\",\n \"max_tokens\": 1024,\n \"stream\": \"false\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-api-key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.ttapi.io/v1/messages")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"messages\": [\n {\n \"role\": \"user\",\n \"content\": \"Hello!\"\n }\n ],\n \"model\": \"claude-sonnet-4-5\",\n \"max_tokens\": 1024,\n \"stream\": \"false\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.ttapi.io/v1/messages")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-api-key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"messages\": [\n {\n \"role\": \"user\",\n \"content\": \"Hello!\"\n }\n ],\n \"model\": \"claude-sonnet-4-5\",\n \"max_tokens\": 1024,\n \"stream\": \"false\"\n}"
response = http.request(request)
puts response.read_body{
"id": "msg_018zZJf8ZJf8ZJf8ZJf8ZJf8ZJf8",
"type": "message",
"role": "assistant",
"content": [
{
"type": "text",
"text": " Hello! My name is Claude."
}
],
"model": "claude-2.0",
"stop_reason": "stop_sequence",
"usage": {
"input_tokens": 15,
"output_tokens": 22
}
}{
"status": "FAILED",
"message": "\"prompt\" cannot be empty.",
"data": {}
}{
"status": "FAILED",
"message": "Wrong TT-API-KEY or email is not activated."
}Claude
Claude Messages API
POST
/
v1
/
messages
cURL
curl --request POST \
--url https://api.ttapi.io/v1/messages \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"messages": [
{
"role": "user",
"content": "Hello!"
}
],
"model": "claude-sonnet-4-5",
"max_tokens": 1024,
"stream": "false"
}
'import requests
url = "https://api.ttapi.io/v1/messages"
payload = {
"messages": [
{
"role": "user",
"content": "Hello!"
}
],
"model": "claude-sonnet-4-5",
"max_tokens": 1024,
"stream": "false"
}
headers = {
"x-api-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'x-api-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
messages: [{role: 'user', content: 'Hello!'}],
model: 'claude-sonnet-4-5',
max_tokens: 1024,
stream: 'false'
})
};
fetch('https://api.ttapi.io/v1/messages', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.ttapi.io/v1/messages",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'messages' => [
[
'role' => 'user',
'content' => 'Hello!'
]
],
'model' => 'claude-sonnet-4-5',
'max_tokens' => 1024,
'stream' => 'false'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-api-key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.ttapi.io/v1/messages"
payload := strings.NewReader("{\n \"messages\": [\n {\n \"role\": \"user\",\n \"content\": \"Hello!\"\n }\n ],\n \"model\": \"claude-sonnet-4-5\",\n \"max_tokens\": 1024,\n \"stream\": \"false\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-api-key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.ttapi.io/v1/messages")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"messages\": [\n {\n \"role\": \"user\",\n \"content\": \"Hello!\"\n }\n ],\n \"model\": \"claude-sonnet-4-5\",\n \"max_tokens\": 1024,\n \"stream\": \"false\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.ttapi.io/v1/messages")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-api-key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"messages\": [\n {\n \"role\": \"user\",\n \"content\": \"Hello!\"\n }\n ],\n \"model\": \"claude-sonnet-4-5\",\n \"max_tokens\": 1024,\n \"stream\": \"false\"\n}"
response = http.request(request)
puts response.read_body{
"id": "msg_018zZJf8ZJf8ZJf8ZJf8ZJf8ZJf8",
"type": "message",
"role": "assistant",
"content": [
{
"type": "text",
"text": " Hello! My name is Claude."
}
],
"model": "claude-2.0",
"stop_reason": "stop_sequence",
"usage": {
"input_tokens": 15,
"output_tokens": 22
}
}{
"status": "FAILED",
"message": "\"prompt\" cannot be empty.",
"data": {}
}{
"status": "FAILED",
"message": "Wrong TT-API-KEY or email is not activated."
}The request and response fields follow the official Responses API format.
For details, refer to the Claude official documentation.
Authorizations
You can obtain your API key from the TTAPI Dashboard.
Body
application/json
Show child attributes
Show child attributes
Example:
[{ "role": "user", "content": "Hello!" }]
Models supported by TTAPI, see Claude Supported Models
Example:
"claude-sonnet-4-5"
Maximum tokens to generate before stopping. Minimum: 1
Whether to use server-sent events for progressive response transmission
Response
Successful response
Unique message identifier
Example:
"msg_018zZJf8ZJf8ZJf8ZJf8ZJf8ZJf8"
Response type
Example:
"message"
Role identifier
Example:
"assistant"
Message content list
Show child attributes
Show child attributes
Model version used
Example:
"claude-2.0"
Stop reason
Example:
"stop_sequence"
Token usage statistics
Show child attributes
Show child attributes
Last modified on July 15, 2026
⌘I