Chat
Messages
POST /v1/messages in the Anthropic Messages shape, for the Anthropic SDK.
POST https://api.pre.dev/v1/messages accepts the Anthropic Messages request body and returns the Anthropic response. Use it with the Anthropic SDK: set the client’s baseURL to https://api.pre.dev, without /v1, because the SDK appends /v1/messages itself. Pass the pre.dev key as the API key; the SDK’s x-api-key header is accepted.
Model ids are the catalog ids exactly as listed by GET /v1/models, so anthropic/claude-sonnet-5 rather than a native Anthropic model name. Any chat model in the catalog works through this shape, not only Anthropic’s.
curl --fail-with-body https://api.pre.dev/v1/messages \
-H "x-api-key: $PREDEV_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-H "Content-Type: application/json" \
-d '{
"model": "anthropic/claude-sonnet-5",
"max_tokens": 256,
"messages": [{ "role": "user", "content": "Give me a haiku about deploys." }]
}'import Anthropic from '@anthropic-ai/sdk';
const client = new Anthropic({
baseURL: 'https://api.pre.dev', // no /v1: the Anthropic SDK appends /v1/messages itself
apiKey: process.env.PREDEV_API_KEY!,
});
const message = await client.messages.create({
model: 'anthropic/claude-sonnet-5',
max_tokens: 256,
messages: [{ role: 'user', content: 'Give me a haiku about deploys.' }],
});
console.log(message.content);import os
from anthropic import Anthropic
client = Anthropic(
base_url="https://api.pre.dev",
api_key=os.environ["PREDEV_API_KEY"],
)
message = client.messages.create(
model="anthropic/claude-sonnet-5",
max_tokens=256,
messages=[{"role": "user", "content": "Give me a haiku about deploys."}],
)
print(message.content)Streaming
Set stream: true, or use client.messages.stream() in the SDKs, for Anthropic-style server-sent events. Credits settle when the stream ends; a disconnect still charges what the model generated. See streaming.
Tools, system prompts, and images
Use the Anthropic system, tools, and content-block formats, with Anthropic models or any other chat model in the catalog.
Headers and billing
The same x-predev-request-id, x-predev-credits-charged, and x-predev-credits-remaining headers are returned, and x-predev-project-id attributes usage. Calls are charged from the model’s metered usage, as on pricing.
curl --fail-with-body https://api.pre.dev/v1/messages \ -H "x-api-key: $PREDEV_API_KEY" \ -H "Content-Type: application/json" \ -d '{"model": "anthropic/claude-sonnet-5", "max_tokens": 100, "messages": [{"role": "user", "content": "Give me a haiku about deploys."}]}'import osfrom anthropic import Anthropicclient = Anthropic(base_url="https://api.pre.dev", api_key=os.environ["PREDEV_API_KEY"])message = client.messages.create( model="anthropic/claude-sonnet-5", max_tokens=100, messages=[{"role": "user", "content": "Give me a haiku about deploys."}],)print(message.content[0].text)import Anthropic from '@anthropic-ai/sdk';const client = new Anthropic({ baseURL: 'https://api.pre.dev', apiKey: process.env.PREDEV_API_KEY });const message = await client.messages.create({ model: 'anthropic/claude-sonnet-5', max_tokens: 100, messages: [{ role: 'user', content: 'Give me a haiku about deploys.' }],});console.log(message.content);package mainimport ( "fmt" "net/http" "io/ioutil" "strings")func main() { url := "https://api.pre.dev/v1/messages" body := strings.NewReader(`{ "model": "anthropic/claude-sonnet-5", "max_tokens": 100, "stream": false, "messages": [ { "role": "user", "content": "Give me a haiku about deploys." } ] }`) req, _ := http.NewRequest("POST", url, body) req.Header.Add("Content-Type", "application/json") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := ioutil.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body))}import java.net.URI;import java.net.http.HttpClient;import java.net.http.HttpRequest;import java.net.http.HttpResponse;import java.net.http.HttpResponse.BodyHandlers;import java.time.Duration;import java.net.http.HttpRequest.BodyPublishers;var body = BodyPublishers.ofString("""{ "model": "anthropic/claude-sonnet-5", "max_tokens": 100, "stream": false, "messages": [ { "role": "user", "content": "Give me a haiku about deploys." } ]}""");HttpClient client = HttpClient.newBuilder() .connectTimeout(Duration.ofSeconds(10)) .build();HttpRequest.Builder requestBuilder = HttpRequest.newBuilder() .uri(URI.create("https://api.pre.dev/v1/messages")) .header("Content-Type", "application/json") .POST(body) .build();try { HttpResponse<String> response = client.send(requestBuilder.build(), BodyHandlers.ofString()); System.out.println("Status code: " + response.statusCode()); System.out.println("Response body: " + response.body());} catch (Exception e) { e.printStackTrace();}using System;using System.Net.Http;using System.Text;var body = new StringContent("""{ "model": "anthropic/claude-sonnet-5", "max_tokens": 100, "stream": false, "messages": [ { "role": "user", "content": "Give me a haiku about deploys." } ]}""", Encoding.UTF8, "application/json");var client = new HttpClient();var response = await client.PostAsync("https://api.pre.dev/v1/messages", body);var responseBody = await response.Content.ReadAsStringAsync();use reqwest::{Result, Client};async fn main() -> Result<()> { let client = Client::new(); let url = "https://api.pre.dev/v1/messages"; let body = r#"{ "model": "anthropic/claude-sonnet-5", "max_tokens": 100, "stream": false, "messages": [ { "role": "user", "content": "Give me a haiku about deploys." } ] }"#; let res = client .post(url) .header("Content-Type", "application/json") .body(body) .send() .await? .text() .await?; println!("{}", res); Ok(())}{ "id": "pdg-043293a6-d1a8-4695-81fe-603ad4661ebb", "type": "message", "role": "assistant", "model": "anthropic/claude-sonnet-5", "content": [ { "type": "text", "text": "Green checks line up\nThe pipeline hums, then goes quiet\nProduction wakes up" } ], "stop_reason": "end_turn", "stop_sequence": null, "usage": { "input_tokens": 14, "output_tokens": 19 }}The workspace API key (pdk_…) from Integrations → Built-in in the pre.dev dashboard.
In: header
Header Parameters
Attribute this call to one of the workspace's projects. An id the workspace does not own is ignored.
Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
Response Body
application/json
The message. With stream: true, Anthropic-style server-sent events (text/event-stream) instead.
TypeScript Definitions
Use the response body type in TypeScript.
application/json
The body is not valid JSON (checked before authentication), or the model rejected the request, for example an unknown model id. Errors from the model keep their status and use the ModelError shape.
TypeScript Definitions
Use the response body type in TypeScript.
The request body is not valid JSON. Checked before authentication.
application/json
Missing or invalid API key.
TypeScript Definitions
Use the response body type in TypeScript.
An error raised by pre.dev, in the OpenAI error shape with an extra predev object (absent on catalog_unavailable from the catalog listings). Branch on error.code.
application/json
The workspace cannot pay for this request. Nothing was sent to the model and nothing was charged.
TypeScript Definitions
Use the response body type in TypeScript.
An error raised by pre.dev, in the OpenAI error shape with an extra predev object (absent on catalog_unavailable from the catalog listings). Branch on error.code.
application/json
The request refers to a file, response or video job that is not this workspace's (not_found from pre.dev; nothing ran and nothing was charged), or the model could not serve the request (its own status and message, in the ModelError shape).
TypeScript Definitions
Use the response body type in TypeScript.
An error raised by pre.dev, in the OpenAI error shape with an extra predev object (absent on catalog_unavailable from the catalog listings). Branch on error.code.
application/json
Too many requests. Wait Retry-After seconds when it is present. A rate_limit_exceeded refusal is per workspace per minute (600, or 30 on the free trial). An error from the model keeps the ModelError shape.
TypeScript Definitions
Use the response body type in TypeScript.
An error raised by pre.dev, in the OpenAI error shape with an extra predev object (absent on catalog_unavailable from the catalog listings). Branch on error.code.
application/json
Unexpected error.
TypeScript Definitions
Use the response body type in TypeScript.
An error raised by pre.dev, in the OpenAI error shape with an extra predev object (absent on catalog_unavailable from the catalog listings). Branch on error.code.
application/json
The model did not answer. Retry with backoff, or send models fallbacks.
TypeScript Definitions
Use the response body type in TypeScript.
An error raised by pre.dev, in the OpenAI error shape with an extra predev object (absent on catalog_unavailable from the catalog listings). Branch on error.code.
application/json
The credit balance could not be read, so nothing ran. Retry after Retry-After seconds.
TypeScript Definitions
Use the response body type in TypeScript.
An error raised by pre.dev, in the OpenAI error shape with an extra predev object (absent on catalog_unavailable from the catalog listings). Branch on error.code.