curl --request POST \
--url https://api.aisa.one/v1/messages \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"max_tokens": 1024,
"messages": [
{
"content": "Hello, Claude",
"role": "user"
}
],
"model": "claude-sonnet-4-6"
}
'import requests
url = "https://api.aisa.one/v1/messages"
payload = {
"max_tokens": 1024,
"messages": [
{
"content": "Hello, Claude",
"role": "user"
}
],
"model": "claude-sonnet-4-6"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
max_tokens: 1024,
messages: [{content: 'Hello, Claude', role: 'user'}],
model: 'claude-sonnet-4-6'
})
};
fetch('https://api.aisa.one/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.aisa.one/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([
'max_tokens' => 1024,
'messages' => [
[
'content' => 'Hello, Claude',
'role' => 'user'
]
],
'model' => 'claude-sonnet-4-6'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$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.aisa.one/v1/messages"
payload := strings.NewReader("{\n \"max_tokens\": 1024,\n \"messages\": [\n {\n \"content\": \"Hello, Claude\",\n \"role\": \"user\"\n }\n ],\n \"model\": \"claude-sonnet-4-6\"\n}")
req, _ := http.NewRequest("POST", url, payload)
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(string(body))
}HttpResponse<String> response = Unirest.post("https://api.aisa.one/v1/messages")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"max_tokens\": 1024,\n \"messages\": [\n {\n \"content\": \"Hello, Claude\",\n \"role\": \"user\"\n }\n ],\n \"model\": \"claude-sonnet-4-6\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.aisa.one/v1/messages")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"max_tokens\": 1024,\n \"messages\": [\n {\n \"content\": \"Hello, Claude\",\n \"role\": \"user\"\n }\n ],\n \"model\": \"claude-sonnet-4-6\"\n}"
response = http.request(request)
puts response.read_body{
"content": [
{}
],
"id": "msg_024e7cf42f5d47cfa6982b5ff8b55642",
"model": "claude-sonnet-4-6",
"role": "assistant",
"stop_reason": "end_turn",
"stop_sequence": "<string>",
"type": "message",
"usage": {
"cache_creation_input_tokens": 123,
"cache_read_input_tokens": 123,
"input_tokens": 123,
"output_tokens": 123
}
}Claude Messages
Create a message
curl --request POST \
--url https://api.aisa.one/v1/messages \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"max_tokens": 1024,
"messages": [
{
"content": "Hello, Claude",
"role": "user"
}
],
"model": "claude-sonnet-4-6"
}
'import requests
url = "https://api.aisa.one/v1/messages"
payload = {
"max_tokens": 1024,
"messages": [
{
"content": "Hello, Claude",
"role": "user"
}
],
"model": "claude-sonnet-4-6"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
max_tokens: 1024,
messages: [{content: 'Hello, Claude', role: 'user'}],
model: 'claude-sonnet-4-6'
})
};
fetch('https://api.aisa.one/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.aisa.one/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([
'max_tokens' => 1024,
'messages' => [
[
'content' => 'Hello, Claude',
'role' => 'user'
]
],
'model' => 'claude-sonnet-4-6'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$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.aisa.one/v1/messages"
payload := strings.NewReader("{\n \"max_tokens\": 1024,\n \"messages\": [\n {\n \"content\": \"Hello, Claude\",\n \"role\": \"user\"\n }\n ],\n \"model\": \"claude-sonnet-4-6\"\n}")
req, _ := http.NewRequest("POST", url, payload)
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(string(body))
}HttpResponse<String> response = Unirest.post("https://api.aisa.one/v1/messages")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"max_tokens\": 1024,\n \"messages\": [\n {\n \"content\": \"Hello, Claude\",\n \"role\": \"user\"\n }\n ],\n \"model\": \"claude-sonnet-4-6\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.aisa.one/v1/messages")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"max_tokens\": 1024,\n \"messages\": [\n {\n \"content\": \"Hello, Claude\",\n \"role\": \"user\"\n }\n ],\n \"model\": \"claude-sonnet-4-6\"\n}"
response = http.request(request)
puts response.read_body{
"content": [
{}
],
"id": "msg_024e7cf42f5d47cfa6982b5ff8b55642",
"model": "claude-sonnet-4-6",
"role": "assistant",
"stop_reason": "end_turn",
"stop_sequence": "<string>",
"type": "message",
"usage": {
"cache_creation_input_tokens": 123,
"cache_read_input_tokens": 123,
"input_tokens": 123,
"output_tokens": 123
}
}/v1/messages specification, routed through the AIsa gateway at https://api.aisa.one/v1/messages.
Use this endpoint when you want to call Claude models (claude-opus-4-7, claude-sonnet-4-6, claude-haiku-4-5-20251001, etc.) with Anthropic’s native request format — including extended thinking, tool use, and prompt caching. If you prefer OpenAI-style chat completions, the same Claude models are also available via the OpenAI Chat endpoint.
Authentication uses your AIsa API key as a Bearer token. See the model catalog for the full list of supported Claude variants and context windows, and pricing for per-token rates.
Request contract
- Method and path: POST /messages
- Request URL template: https://api.aisa.one/v1/messages
{
"operationId": "createMessage",
"method": "POST",
"path": "/messages",
"servers": [
{
"url": "https://api.aisa.one/v1"
}
],
"parameters": [],
"security": [
{
"BearerAuth": []
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"properties": {
"max_tokens": {
"description": "Maximum number of tokens to generate before stopping.",
"example": 1024,
"type": "integer"
},
"messages": {
"description": "Conversation turns.",
"example": [
{
"content": "Hello, Claude",
"role": "user"
}
],
"items": {
"properties": {
"content": {
"description": "String or array of content blocks.",
"oneOf": [
{
"type": "string"
},
{
"items": {
"type": "object"
},
"type": "array"
}
]
},
"role": {
"enum": [
"user",
"assistant"
],
"type": "string"
}
},
"required": [
"role",
"content"
],
"type": "object"
},
"type": "array"
},
"metadata": {
"properties": {
"user_id": {
"description": "External user ID (no PII).",
"type": "string"
}
},
"type": "object"
},
"model": {
"description": "Claude model identifier. Examples: claude-opus-4-7, claude-sonnet-4-6, claude-haiku-4-5-20251001.",
"example": "claude-sonnet-4-6",
"type": "string"
},
"service_tier": {
"default": "auto",
"enum": [
"auto",
"standard_only"
],
"type": "string"
},
"stop_sequences": {
"description": "Custom sequences that stop generation.",
"items": {
"type": "string"
},
"type": "array"
},
"stream": {
"default": false,
"description": "Enable SSE streaming.",
"type": "boolean"
},
"system": {
"description": "System prompt. String or array of text blocks.",
"oneOf": [
{
"type": "string"
},
{
"items": {
"type": "object"
},
"type": "array"
}
]
},
"temperature": {
"default": 1.0,
"description": "Randomness. 0 = deterministic, 1 = creative.",
"format": "float",
"maximum": 1.0,
"minimum": 0.0,
"type": "number"
},
"thinking": {
"description": "Enable extended thinking for complex reasoning.",
"properties": {
"budget_tokens": {
"example": 10000,
"type": "integer"
},
"display": {
"enum": [
"summarized",
"omitted"
],
"type": "string"
},
"type": {
"enum": [
"enabled"
],
"type": "string"
}
},
"type": "object"
},
"tool_choice": {
"description": "How the model uses tools.",
"properties": {
"disable_parallel_tool_use": {
"default": false,
"type": "boolean"
},
"name": {
"description": "Required when type is tool.",
"type": "string"
},
"type": {
"enum": [
"auto",
"any",
"tool",
"none"
],
"type": "string"
}
},
"type": "object"
},
"tools": {
"description": "Tools the model may use.",
"items": {
"properties": {
"description": {
"type": "string"
},
"input_schema": {
"type": "object"
},
"name": {
"type": "string"
},
"type": {
"example": "custom",
"type": "string"
}
},
"required": [
"name",
"input_schema"
],
"type": "object"
},
"type": "array"
},
"top_k": {
"description": "Only sample from the top K options for each token.",
"type": "integer"
},
"top_p": {
"description": "Nucleus sampling. Use instead of temperature.",
"format": "float",
"type": "number"
}
},
"required": [
"model",
"max_tokens",
"messages"
],
"type": "object"
}
}
},
"required": true
},
"components": {
"securitySchemes": {
"BearerAuth": {
"bearerFormat": "AISA API Key",
"description": "Your AIsa API key as a Bearer token.",
"scheme": "bearer",
"type": "http"
}
}
}
}
Authorizations
Your AIsa API key as a Bearer token.
Body
Maximum number of tokens to generate before stopping.
1024
Conversation turns.
Show child attributes
Show child attributes
[
{
"content": "Hello, Claude",
"role": "user"
}
]
Claude model identifier. Examples: claude-opus-4-7, claude-sonnet-4-6, claude-haiku-4-5-20251001.
"claude-sonnet-4-6"
Show child attributes
Show child attributes
auto, standard_only Custom sequences that stop generation.
Enable SSE streaming.
System prompt. String or array of text blocks.
Randomness. 0 = deterministic, 1 = creative.
0 <= x <= 1Enable extended thinking for complex reasoning.
Show child attributes
Show child attributes
How the model uses tools.
Show child attributes
Show child attributes
Tools the model may use.
Show child attributes
Show child attributes
Only sample from the top K options for each token.
Nucleus sampling. Use instead of temperature.
Response
Successful response
Response content blocks (text, tool_use, thinking, etc.).
"msg_024e7cf42f5d47cfa6982b5ff8b55642"
"claude-sonnet-4-6"
"assistant"
end_turn, stop_sequence, max_tokens, tool_use "message"
Show child attributes
Show child attributes