Echo developer platform
Build with Echo
A focused, OpenAI-compatible API with one Chat Completions endpoint and three clear lanes: Frontier, coding and tools, or efficient text chat.
- Base URL
https://echo.tracerml.ai- API base
https://echo.tracerml.ai/v1- Model
echo- Format
- JSON or SSE
Echo supports text Chat Completions with one choice and optional streaming. Tool calls, function calls, multimodal content, and other OpenAI API surfaces are not part of this contract.
Access
Authentication
Send an Echo API key as a bearer token on every request. Create a key from the API keys page; the complete secret is shown only once.
Authorization: Bearer ECHO_API_KEY
Keep it server-side
Load keys from a secret manager or environment variable. Never ship them in browser or mobile client code.
Rotate deliberately
Create a replacement, deploy it, verify a request, then revoke the old key from your account.
First request
Chat completions quickstart
These examples call the same text completion endpoint. SDK examples disable automatic retries so your application can handle failures and idempotency intentionally.
curl --fail-with-body --silent --show-error \
https://echo.tracerml.ai/v1/chat/completions \
-H "Authorization: Bearer ${ECHO_API_KEY}" \
-H "Content-Type: application/json" \
-d '{
"model": "echo",
"messages": [
{"role": "user", "content": "Explain recursion in one sentence."}
],
"max_tokens": 128
}'
import os
from openai import OpenAI
client = OpenAI(
api_key=os.environ["ECHO_API_KEY"],
base_url="https://echo.tracerml.ai/v1",
timeout=600.0,
max_retries=0,
)
completion = client.chat.completions.create(
model="echo",
messages=[
{"role": "user", "content": "Explain recursion in one sentence."}
],
max_tokens=128,
)
print(completion.choices[0].message.content)
import OpenAI from "openai";
const client = new OpenAI({
apiKey: process.env.ECHO_API_KEY,
baseURL: "https://echo.tracerml.ai/v1",
timeout: 600_000,
maxRetries: 0,
});
const completion = await client.chat.completions.create({
model: "echo",
messages: [
{ role: "user", content: "Explain recursion in one sentence." },
],
max_tokens: 128,
});
console.log(completion.choices[0].message.content);
One Echo balance
Pricing and consumption
Personal subscription credit and one-time top-ups fund the same USD balance. Use that balance in first-party Chat or through an API key, and select the model lane for each request.
echo
Frontier coordination for demanding work. It generally consumes more of the shared balance.
- Best for
- Frontier Chat and hard problems
- Balance
- Shared Echo credit
echo-lite
The efficient coding and tool lane for OpenCode and OpenAI-compatible agents.
- Best for
- Code and native tools
- Balance
- Shared Echo credit
echo-chat-lite
Efficient text chat with Echo's conversational personality. It does not accept tools.
- Best for
- Lite Chat and text API calls
- Balance
- Shared Echo credit
completed attributable compute under the current rate cardMonthly subscription credit is spent first. Purchased top-up credit is spent afterward and does not expire. Failed requests and internal provider retries are not separate charges. Review the balance or add credit from Pricing.
The dashboard balance is authoritative. Token counts remain visible for usage analysis, but they are not a separate wallet or invoice calculation.
Contract
Request format
Send a JSON object with a non-empty message history containing at least one user message. Conversations are stateless; include the history needed for each request.
| Field | Type | Behavior |
|---|---|---|
model | string | Use echo for Frontier, echo-lite for coding and tools, or echo-chat-lite for efficient text chat. The HTTP default is echo; SDK clients should set one explicitly. |
messages | array | Required. Roles: system, developer, user, and assistant. Content must be text. |
temperature | number | Optional, from 0 through 2. Defaults to 0. |
max_tokens | integer | Optional output ceiling. Defaults to 2048. max_completion_tokens is accepted as an alias. |
stream | boolean | Optional. Defaults to false; use true for SSE. |
n | integer | Only 1 is supported. |
reasoning_effort | string | Optional: auto, none, low, medium, high, default, or full. |
echo-lite accepts native function tools. echo-chat-lite is text-only and returns 400 tools_not_supported for non-empty tools. Images and audio are not supported by the bearer API.
Output
Response and usage
A successful non-streaming request returns one assistant message. Read the answer from choices[0].message.content and retain the X-Tracer-Request-ID response header for support.
{
"id": "chatcmpl-...",
"object": "chat.completion",
"created": 1780000000,
"model": "echo",
"choices": [{
"index": 0,
"message": {
"role": "assistant",
"content": "Recursion solves a problem by reducing it to smaller instances of itself."
},
"finish_reason": "stop"
}],
"usage": {
"prompt_tokens": 18,
"completion_tokens": 14,
"total_tokens": 32
}
}
Usage and cost fields
The standard usage object reports prompt, completion, and total tokens. It does not include a cost field, and token counts should not be treated as an invoice calculation.
For raw streaming clients, the optional X-Tracer-Progress: 1 header can add a tracer.usage event after a successful completion. Its usage payload may include:
echo_estimated_cost_usdEstimated Echo request cost in USD.echo_cost_statusInformational estimation or metering status.frontier_estimated_cost_low_usdGPT-5.6 Sol standard-list estimate for the same visible input and output.frontier_estimated_cost_high_usdClaude Fable 5 standard-list estimate for the same visible input and output.fable_estimated_cost_usdLegacy-compatible high end of the frontier comparison range.fable_to_echo_ratioLegacy-compatible high-end comparison divided by the Echo estimate, or null.comparison_basisThe visible input history and output used for comparison.invoice_reconciledfalse; the event is not an invoice.Cost events are optional. Use the account dashboard as the source for usage and billing records.
Incremental output
Streaming SSE
Set stream: true. Echo responds with text/event-stream; append each choices[0].delta.content value in order and stop when you receive data: [DONE].
data: {"id":"chatcmpl-...","object":"chat.completion.chunk","model":"echo","choices":[{"index":0,"delta":{"role":"assistant","content":"One"},"finish_reason":null}]}
data: {"id":"chatcmpl-...","object":"chat.completion.chunk","model":"echo","choices":[{"index":0,"delta":{},"finish_reason":"stop"}]}
data: [DONE]
Network chunks do not map one-to-one to SSE events. Buffer until a blank-line delimiter.
Join data: lines and ignore comment lines beginning with :.
An error may arrive after HTTP 200. Treat an event with an error member as failure.
X-Tracer-Progress: 1 opts raw SSE clients into coarse tracer.progress, keep-alive comments, and an optional tracer.usage event. Do not enable it with an OpenAI SDK stream parser.
Failures
Errors
Application errors normally use an OpenAI-shaped error envelope. Framework validation failures, including malformed JSON or a missing body, may use a different 422 response shape.
{
"error": {
"message": "messages must be a non-empty array",
"type": "invalid_request_error",
"param": "messages",
"code": "invalid_request"
}
}
400Invalid requestFix the request; do not retry it unchanged.
401Authentication failedThe API key is missing, malformed, or unknown.
402Echo credit requiredTop up the shared balance or upgrade the Personal subscription before retrying.
403Access forbiddenThe key, model, scope, API access, or tenant policy forbids the request.
404Model not foundSet the model to echo, echo-lite, or echo-chat-lite.
409Idempotency conflictInspect the error code before deciding whether to issue a new request.
413Payload too largeThe request body exceeded the deployment limit.
422Body validation failedThe HTTP body could not be validated as a JSON object.
428Terms requiredAccept the current legal terms in your Echo account.
429Limit reachedHonor Retry-After when present, then retry with backoff and jitter.
503Temporarily unavailableRetry cautiously with exponential backoff and a small attempt cap.
Admission
Rate limits
Echo enforces request-rate limits and may apply account-specific concurrency and daily request limits. Limits are attributed to the tenant associated with the API key and can vary by deployment or account.
- On
429, honor theRetry-Afterresponse header when present. - Otherwise use exponential backoff with jitter and a bounded retry count.
- Do not retry validation, authentication, billing, or policy failures unchanged.
- Monitor status, latency, interrupted streams, and
X-Tracer-Request-ID.
Production
Security
Protect credentials
Store keys in a server-side secret manager. Redact authorization headers from logs and rotate after suspected exposure.
Proxy browser traffic
Echo does not expose a direct-browser CORS contract. Authenticate your own server proxy and have it add the key.
Minimize sensitive data
Do not place secrets or personal data in prompts, idempotency keys, or correlation headers unless required.
Render output safely
Apply encoding, validation, and content controls appropriate to the destination where model text is rendered.
Production checklist
Use the expected HTTPS origin
Validate configured base URLs against https://echo.tracerml.ai, cap user-supplied message sizes before forwarding, and retain request IDs without storing credentials or prompt text in operational logs.