---
title: Half Off Dev docs
description: Call Claude, GPT and Gemini through their native APIs at half the official list price. Swap the base URL and key; your code stays the same.
---

Half Off Dev gives you the frontier models from Anthropic, OpenAI and Google for 50% of what their official price lists charge, on every model. The catch is that there isn't one: you keep your SDK, your request bodies and your favourite CLI, and change two values, the base URL (`https://halfoff.dev`) and the API key. Billing is per token from a prepaid balance.

:::cards
- :bolt: [Quickstart](/docs/quickstart) From sign-up to a first answer in about a minute.
- :plug: [Integrations](/docs/integrations) Claude Code, Codex CLI, Gemini CLI, desktop chat apps and anything that takes an OpenAI endpoint.
:::

## Try it with the SDK you have {#first-call}

Here is a Claude request through the Anthropic SDK. Compared with calling Anthropic directly, only the base URL and the key differ.

```bash title="cURL"
curl https://halfoff.dev/v1/messages \
  -H "x-api-key: $HALFOFF_API_KEY" \
  -H "anthropic-version: 2023-06-01" \
  -H "content-type: application/json" \
  -d '{
    "model": "claude-sonnet-5.5",
    "max_tokens": 512,
    "messages": [{"role": "user", "content": "Give me three names for a code review bot."}]
  }'
```

```python title="Python"
import os
import anthropic

client = anthropic.Anthropic(
    base_url="https://halfoff.dev",
    api_key=os.environ["HALFOFF_API_KEY"],
)
reply = client.messages.create(
    model="claude-sonnet-5.5",
    max_tokens=512,
    messages=[{"role": "user", "content": "Give me three names for a code review bot."}],
)
print(reply.content[0].text)
```

```js title="Node.js"
import Anthropic from '@anthropic-ai/sdk';

const client = new Anthropic({
  baseURL: 'https://halfoff.dev',
  apiKey: process.env.HALFOFF_API_KEY,
});
const reply = await client.messages.create({
  model: 'claude-sonnet-5.5',
  max_tokens: 512,
  messages: [{ role: 'user', content: 'Give me three names for a code review bot.' }],
});
console.log(reply.content[0].text);
```

The same key also calls GPT models through the OpenAI SDK and Gemini models through the Google Gen AI SDK.

## Where to point each SDK {#endpoints}

| You use | Set the base URL to | The key goes in |
| --- | --- | --- |
| Anthropic SDK, Claude Code | `https://halfoff.dev` | `x-api-key` or `Authorization: Bearer` |
| OpenAI SDK, Codex CLI, OpenAI-compatible apps | `https://halfoff.dev/v1` | `Authorization: Bearer` |
| Google Gen AI SDK, Gemini CLI | `https://halfoff.dev` | `x-goog-api-key` |

## Why it's a drop-in swap {#why-drop-in}

- **Half the list price, every model.** Each token costs 50% of the official rate for that model. Live prices are in `GET /v1/models` and on [Pricing](/docs/models/pricing).
- **No format translation.** A Messages request is answered as a Messages request, a Chat Completions request as Chat Completions, a Gemini request as Gemini. Streaming, function calling, extended thinking and prompt caching behave as the vendor documents them. See [How the gateway works](/docs/models).
- **Three channel groups.** Claude · Value, GPT · Value and Gemini · Value run on pooled capacity. Short bursts wait a few seconds in a queue rather than erroring, and a failed call is retried on another channel before it reaches you. See [Channel groups](/docs/models/channel-groups) and [Rate limits](/docs/models/rate-limits).
- **Caches stay warm.** A conversation sticks to the channel holding its prompt cache, so repeated context keeps its cached-input price. See [Prompt caching](/docs/models/caching).
- **Prepaid, no invoices.** You top up a balance with PayPal and requests draw from it. At zero, requests stop; nothing is billed after the fact. See [Billing](/docs/account/billing).
- **A log line per call.** Tokens, charge, latency and status for each request land in your [dashboard logs](/app/logs). See [Usage](/docs/account/usage).

> [!TIP] Feed these docs to your assistant
> Append `.md` to any docs URL to get the page as plain Markdown, or hand your coding assistant [/llms.txt](/llms.txt) for the whole index.

## Need a hand? {#support}

For a question about a specific call, a charge or your account, open a ticket from [Support](/app/support) and paste the `x-halfoff-request-id` response header if you have it. Live service health is on the [status page](/status).
