Quickstart
Create an API key, pick an endpoint family, and send your first request in minutes. apixly gives you one key and one gateway for the world's leading AI models — chat, images and video.
1. Create an API key
Open the developer console (https://platform.apixly.ai) and go to the API Keys page. Create a key and bind it to a group — the group decides which platform (OpenAI / Claude / Gemini) and which models the key can access.
Copy the key right after creating it: it is shown only once. A key without a group cannot be used; you can assign one at any time from the Group column in the key list.
The platform label shown next to each group (Claude / OpenAI / Gemini) is the API family your key will work with.
2. Know your base URLs
All endpoint families use the same API key; only the base URL and auth header differ:
| Endpoint family | Base URL | Auth header |
|---|---|---|
| OpenAI-compatible | https://apixly.ai | Authorization: Bearer YOUR_API_KEY |
| Anthropic Messages | https://apixly.ai | x-api-key + anthropic-version |
| Gemini generateContent | https://apixly.ai | x-goog-api-key: YOUR_API_KEY |
Every family shares the same origin — the version prefix lives in the request path: POST /v1/chat/completions, POST /v1/messages, POST /v1beta/models/{model}:generateContent. SDKs are the exception: an OpenAI or Gemini client's base_url still ends in /v1 (or /v1beta) and appends the endpoint itself. Exception: the Gemini CLI's GOOGLE_GEMINI_BASE_URL must be the BARE domain (no /v1beta) — the CLI appends /v1beta itself.
3. Confirm a live model ID
Copy a currently published model ID from the live catalog instead of guessing from memory:
Each entry in data[] is one available model — use its id directly as the model field in your requests.
curl https://apixly.ai/v1/models \
-H "Authorization: Bearer YOUR_API_KEY"{
"object": "list",
"data": [
{ "id": "gpt-5.5", "type": "model", "display_name": "gpt-5.5", "created_at": "2024-01-01T00:00:00Z" },
{ "id": "claude-sonnet-4-6", "type": "model", "display_name": "claude-sonnet-4-6", "created_at": "2024-01-01T00:00:00Z" }
]
}
// Entry fields vary by deployment/platform — rely only on data[].id as the model name.4. Send your first request
Keep the first request minimal — no streaming, tools or multimodal input yet:
curl https://apixly.ai/v1/chat/completions \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-5.5",
"messages": [{"role": "user", "content": "Hello"}]
}'A successful response
If you can read choices[0].message.content, your integration works:
{
"choices": [
{
"message": { "role": "assistant", "content": "Hello! How can I help?" },
"finish_reason": "stop"
}
],
"usage": {
"prompt_tokens": 9,
"completion_tokens": 12,
"total_tokens": 21
}
}If it fails, check these first
| Check | What should match |
|---|---|
| Path | POST /v1/chat/completions |
| Headers | Authorization + Content-Type: application/json |
| Body | model + messages only for the first test |
| Model ID | Copy one from GET /v1/models |
| Key group | The key's group platform must match the endpoint family |
Next steps
- Read “API keys & base URL” for group binding details.
- Pick your endpoint guide: OpenAI-compatible, Anthropic or Gemini.
- Generate images and video with the same key.
- Plug the key into Claude Code, Codex and other coding tools.
- See “Credits & billing” for pricing.
Errors, status codes & limits
Error bodies use the envelope of the protocol family you called: OpenAI-compatible endpoints return {"error":{"type","message"}}; Anthropic returns {"type":"error","error":{"type","message"}}; Gemini returns {"error":{"code","message","status"}}; the video API returns {"error":{"type","message"}} where type is a stable code; the Responses API returns {"error":{"code","message"}}. Parse per family — there is no single global envelope.
Do not confuse two different layers on the video API: synchronous HTTP errors use error.type as shown above, while a FAILED TASK's terminal error (in polling responses and webhooks) uses error.code — the stable enum documented on the Video page. Values like insufficient_balance exist in both layers with different delivery paths.
| Situation | Typical response |
|---|---|
| Invalid or missing API key | 401 authentication_error |
| Key not bound to any group | 403 |
| Insufficient balance | 403 billing_error ("insufficient balance") |
| Rate limit / platform quota exhausted | 429 rate_limit_exceeded, with a Retry-After header |
| Concurrency queue full | 429 rate_limit_error |
| No available upstream account / wait timeout | 503 api_error |
| Request body too large | 413 (limit 256 MiB) |
| Client disconnected mid-request | 499 (logged server-side) |
Rate limiting is per user and per group (requests per minute) plus per-user concurrency — there is no per-key RPM. Per-key limits are USD quota windows (5h / 1d / 7d) configured in the console.