Skip to content

Start here

Quickstart

Send your first request in a few minutes.

Three things stand between you and a response: a key, a base URL and a model id. This page covers all three.

Send your first request

  1. Create an API key

    Open API keys and create one. The full key is shown once, so put it straight into your secret manager or environment as ODYSSEY_API_KEY.

  2. Point your client at Odyssey

    The API follows the OpenAI chat completions schema, so the official SDKs work with a changed base URL: https://odysseyapi.tech/v1.

  3. Call a model

    import OpenAI from "openai"; const client = new OpenAI({  baseURL: "https://odysseyapi.tech/v1",  apiKey: process.env.ODYSSEY_API_KEY,}); const completion = await client.chat.completions.create({  model: "anthropic/claude-sonnet-5",  messages: [{ role: "user", content: "Explain HTTP caching in two sentences." }],}); console.log(completion.choices[0].message.content);

The response

The body is exactly what an OpenAI client expects, and model names the model that ran.

{  "id": "chatcmpl-8fa21c0b4e9d7a35f16c2be4",  "object": "chat.completion",  "created": 1789134720,  "model": "anthropic/claude-sonnet-5",  "choices": [    {      "index": 0,      "message": { "role": "assistant", "content": "HTTP caching stores..." },      "finish_reason": "stop"    }  ],  "usage": { "prompt_tokens": 18, "completion_tokens": 64, "total_tokens": 82 }}

Every response carries an x-request-id header. It appears in Activity, so keep it in your logs when you need to trace a specific call.

Stream the answer

Set stream: true to receive server-sent events as tokens are generated. Nothing else changes.

const stream = await client.chat.completions.create({  model: "anthropic/claude-sonnet-5",  messages: [{ role: "user", content: "Explain HTTP caching in two sentences." }],  stream: true,}); for await (const chunk of stream) {  process.stdout.write(chunk.choices[0]?.delta?.content ?? "");}

Try it without writing code

The playground runs the same request shape, shows its timing and cost, and generates the equivalent cURL, TypeScript and Python.

Next steps

  • Models lists every model id, its context window and its price.
  • Errors explains which failures are worth retrying.