Making requests
Claude Platform on AWS uses the Anthropic Messages API (/v1/messages), the same API surface as the Claude first-party platform. The differences are the base URL, the authentication method, and a required anthropic-workspace-id header that identifies which workspace the request targets.
Shell
curl "https://aws-external-anthropic.us-west-2.api.aws/v1/messages" \ --aws-sigv4 "aws:amz:us-west-2:aws-external-anthropic" \ --user "$AWS_ACCESS_KEY_ID:$AWS_SECRET_ACCESS_KEY" \ -H "x-amz-security-token: $AWS_SESSION_TOKEN" \ -H "content-type: application/json" \ -H "anthropic-version: 2023-06-01" \ -H "anthropic-workspace-id: $ANTHROPIC_AWS_WORKSPACE_ID" \ -d '{ "model": "claude-sonnet-4-6", "max_tokens": 1024, "messages": [ {"role": "user", "content": "Hello!"} ] }'
Python
from anthropic import AnthropicAWS client = AnthropicAWS() message = client.messages.create( model="claude-sonnet-4-6", max_tokens=1024, messages=[{"role": "user", "content": "Hello!"}], ) print(message)
TypeScript
import AnthropicAws from "@anthropic-ai/aws-sdk"; const client = new AnthropicAws(); const message = await client.messages.create({ model: "claude-sonnet-4-6", max_tokens: 1024, messages: [{ role: "user", content: "Hello!" }] }); console.log(message);
C#
using Anthropic; using Anthropic.Aws; var client = new AnthropicAwsClient(); var message = await client.Messages.Create(new() { Model = "claude-sonnet-4-6", MaxTokens = 1024, Messages = [new() { Role = "user", Content = "Hello!" }] }); Console.WriteLine(message);
Go
client, err := anthropicaws.NewClient(context.Background(), anthropicaws.ClientConfig{}) if err != nil { panic(err) } message, err := client.Messages.New(context.Background(), anthropic.MessageNewParams{ Model: anthropic.ModelClaudeSonnet4_6, MaxTokens: 1024, Messages: []anthropic.MessageParam{ anthropic.NewUserMessage(anthropic.NewTextBlock("Hello!")), }, }) if err != nil { panic(err) } fmt.Println(message.Content[0].Text)
Java
import com.anthropic.aws.backends.AwsBackend; import com.anthropic.client.AnthropicClient; import com.anthropic.client.okhttp.AnthropicOkHttpClient; import com.anthropic.models.messages.Message; import com.anthropic.models.messages.MessageCreateParams; import com.anthropic.models.messages.Model; AnthropicClient client = AnthropicOkHttpClient.builder() .backend(AwsBackend.fromEnv()) .build(); Message message = client.messages().create( MessageCreateParams.builder() .model(Model.CLAUDE_SONNET_4_6) .maxTokens(1024) .addUserMessage("Hello!") .build() ); IO.println(message);
PHP
use Anthropic\Aws\Client; $client = new Client(); $message = $client->messages->create( model: 'claude-sonnet-4-6', maxTokens: 1024, messages: [['role' => 'user', 'content' => 'Hello!']], ); echo $message;
Ruby
require "anthropic" client = Anthropic::AWSClient.new message = client.messages.create( model: "claude-sonnet-4-6", max_tokens: 1024, messages: [{ role: "user", content: "Hello!" }] ) puts message
The client reads AWS_REGION (or AWS_DEFAULT_REGION) and ANTHROPIC_AWS_WORKSPACE_ID from the environment. You can override either by passing aws_region / awsRegion or workspace_id / workspaceId to the constructor. Both region and workspace ID are required; the constructor throws if either cannot be resolved from these sources.
Note
The x-amz-security-token header (curl) is only required for temporary credentials such as IAM roles, SSO, or STS. Omit it when using long-term IAM user credentials. The SDK clients handle this automatically based on the credential source.
The --aws-sigv4 value follows the format aws:amz:<region>:<service>. The SigV4 service name is aws-external-anthropic, and the region must match the region in your endpoint URL. A mismatch in either produces a generic signature-rejection error rather than a specific diagnostic.
Using the base Anthropic client
If you prefer not to add the AWS SDK dependency, you can use the base Anthropic client. This path uses the vanilla SDK environment variable names rather than the ANTHROPIC_AWS_* names the dedicated client reads:
export ANTHROPIC_API_KEY='your-api-key' export ANTHROPIC_BASE_URL='https://aws-external-anthropic.us-west-2.api.aws' export ANTHROPIC_WORKSPACE_ID='your-workspace-id'
The Python, TypeScript, and Go SDKs read ANTHROPIC_API_KEY and ANTHROPIC_BASE_URL automatically; for the other languages, pass them to the constructor. In every language, pass the workspace ID in the anthropic-workspace-id header.
Python
import os from anthropic import Anthropic client = Anthropic( # ANTHROPIC_API_KEY and ANTHROPIC_BASE_URL are read automatically default_headers={"anthropic-workspace-id": os.environ["ANTHROPIC_WORKSPACE_ID"]}, ) message = client.messages.create( model="claude-sonnet-4-6", max_tokens=1024, messages=[{"role": "user", "content": "Hello!"}], ) print(message.content[0].text)
TypeScript
import Anthropic from "@anthropic-ai/sdk"; const client = new Anthropic({ // ANTHROPIC_API_KEY and ANTHROPIC_BASE_URL are read automatically defaultHeaders: { "anthropic-workspace-id": process.env.ANTHROPIC_WORKSPACE_ID } }); const message = await client.messages.create({ model: "claude-sonnet-4-6", max_tokens: 1024, messages: [{ role: "user", content: "Hello!" }] }); console.log(message.content);