Learn how to integrate aliapi.me API into your applications
Get started with aliapi.me API in minutes. Our API is fully compatible with OpenAI's interface.
Sign in and generate your API key from the settings page.
Install the OpenAI SDK or use our compatible endpoints.
pip install openaiStart making requests with your preferred model.
All API requests require authentication using your API key.
Include your API key in the Authorization header:
Authorization: Bearer YOUR_API_KEYKeep your API keys secure and never expose them in client-side code.
Generate conversational responses using various AI models.
POST https://api.aliapi.me/v1/chat/completionsmodelID of the model to usemessagesArray of message objectstemperatureSampling temperature (0-2)max_tokensMaximum tokens to generatestreamEnable streaming responsesimport OpenAI from 'openai';
// OpenAI 风格 Base URL
const client = new OpenAI({
baseURL: 'https://api.aliapi.me/v1',
apiKey: process.env.API_KEY,
});
// OpenRouter 风格也同样支持:
// baseURL: 'https://api.aliapi.me/api/v1'
const response = await client.chat.completions.create({
model: 'gpt-4',
messages: [
{ role: 'user', content: 'Hello!' }
],
});
console.log(response.choices[0].message.content);from openai import OpenAI
# OpenAI 风格 Base URL
client = OpenAI(
base_url="https://api.aliapi.me/v1",
api_key="YOUR_API_KEY"
)
# OpenRouter 风格也同样支持:
# base_url="https://api.aliapi.me/api/v1"
response = client.chat.completions.create(
model="gpt-4",
messages=[
{"role": "user", "content": "Hello!"}
]
)
print(response.choices[0].message.content)Access hundreds of AI models through a single API.
GET https://api.aliapi.me/v1/modelsLatest and most capable models from major providers
Optimized for code generation and technical tasks
Advanced reasoning and complex problem-solving
Support for images, audio, and video inputs
Stream responses in real-time for better user experience.
const stream = await client.chat.completions.create({
model: 'gpt-4',
messages: [{ role: 'user', content: 'Tell me a story' }],
stream: true,
});
for await (const chunk of stream) {
process.stdout.write(chunk.choices[0]?.delta?.content || '');
}Generate images from a text prompt with an OpenAI-compatible endpoint. Works with the official OpenAI SDKs — just point base_url at our API.
POST https://api.aliapi.me/v1/images/generations
POST https://api.aliapi.me/v1/images/editsmodelRequired. An image model ID, e.g. earth/grok-imagine-image-quality or earth/gpt-image-2.promptRequired. Text description of the image you want.nOptional. Number of images to generate. Defaults to 1. Some upstreams only support 1.sizeOptional. Output size such as 1024x1024. Support depends on the model; ignored when the upstream does not accept it.image_sizeOptional. Resolution tier: 1K, 2K or 4K (aliases 1024/2048/4096, case-insensitive). Gemini image models only. Any other value returns 400.response_formatOptional. url (default) or b64_json. Use b64_json when you want the bytes inline instead of a link.size controls the aspect ratio. image_size controls the resolution tier and is currently supported by Gemini image models only.
Pass a ratio directly — 1:1, 16:9, 9:16, 3:2, 2:3, 4:3, 3:4, 21:9, 5:4, 4:5. OpenAI-style pixel sizes are mapped for you: 1024x1024→1:1, 1792x1024→16:9, 1024x1792→9:16, 1536x1024→3:2, 1024x1536→2:3.
1K, 2K or 4K. Measured on gemini-3.1-flash-image-preview at 16:9 — 1K = 1376x768, 2K = 2752x1536, 4K = 5504x3072. Billing follows the actual output tokens, so 4K costs roughly twice a 1K image.
gemini_aspect_ratio and gemini_image_size are accepted as aliases of size and image_size. An explicit image_size outside 1K/2K/4K returns 400 instead of being silently ignored. These parameters apply to /v1/images/generations only — /v1/images/edits does not support them.
curl https://api.aliapi.me/v1/images/generations \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_API_KEY" \
-d '{
"model": "earth/gemini-3.1-flash-image-preview",
"prompt": "A serene mountain landscape at sunset",
"n": 1,
"size": "16:9",
"image_size": "4K"
}'
# → 5504x3072curl https://api.aliapi.me/v1/images/generations \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_API_KEY" \
-d '{
"model": "earth/grok-imagine-image-quality",
"prompt": "A red apple on a white table, product photo",
"n": 1
}'
# → {"created": 1786000000,
# "data": [{"url": "https://.../image.jpeg"}]}from openai import OpenAI
client = OpenAI(
api_key="YOUR_API_KEY",
base_url="https://api.aliapi.me/v1",
)
result = client.images.generate(
model="earth/grok-imagine-image-quality",
prompt="A red apple on a white table, product photo",
n=1,
)
print(result.data[0].url)Sending an image model to the chat endpoint returns 400 Model not found — the request is forwarded upstream and rejected there. Always use /v1/images/generations.
# ❌ Wrong: image model on the chat endpoint
curl https://api.aliapi.me/v1/chat/completions \
-d '{"model": "earth/grok-imagine-image-quality", "messages": [...]}'
# → 400 {"error": {"message": "Model not found: ..."}}
# ✅ Correct: use the images endpoint
curl https://api.aliapi.me/v1/images/generations \
-d '{"model": "earth/grok-imagine-image-quality", "prompt": "..."}'Image models bill in one of two ways. Check the Pricing tab on any model page to see which one applies.
per_imageFlat fee per generated image, independent of prompt length — e.g. $0.05 per image for earth/grok-imagine-image-quality, $0.19 for the earth/gpt-image-2 family.image_tokenBilled by tokens (per 1M): output image tokens, plus input tokens on models that accept image input (e.g. edits). Used by the Gemini, GPT-5 image and GPT Image 2 (4K-token) models. Larger or higher-detail images cost more.Generate videos from text prompts or reference images. Video models support two calling styles: a synchronous convenience endpoint that blocks until the video is ready, and an asynchronous submit + poll flow.
The request blocks until generation finishes and returns the video URL directly. Generation usually takes 1–4 minutes — set your client timeout to at least 600 seconds.
POST https://api.aliapi.me/v1/videos/generationscurl https://api.aliapi.me/v1/videos/generations \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_API_KEY" \
-d '{
"model": "earth/seedance-2.0",
"prompt": "A calico cat stretching on a sunny windowsill, cinematic close-up",
"duration": 4,
"resolution": "720p"
}'
# → {"created": 1753776000, "data": [{"url": "https://...mp4"}]}Submit a job and get a job object back immediately, then poll the job until it reaches a terminal status. Recommended for production workloads — no long-lived connection required.
POST https://api.aliapi.me/v1/videos
GET https://api.aliapi.me/v1/videos/{id}curl https://api.aliapi.me/v1/videos \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_API_KEY" \
-d '{
"model": "earth/seedance-2.0",
"prompt": "A calico cat stretching on a sunny windowsill, cinematic close-up",
"duration": 4,
"resolution": "720p"
}'
# → {"id": "<job_id>", "object": "video.generation",
# "model": "earth/seedance-2.0", "status": "queued", "created_at": 1753776000}Poll every 5–10 seconds until the status is completed or failed.
curl https://api.aliapi.me/v1/videos/<job_id> \
-H "Authorization: Bearer YOUR_API_KEY"
# in_progress → {"status": "in_progress", ...}
# completed → {"status": "completed", "url": "https://...mp4", "seconds": 4}
# failed → {"status": "failed", "error": {"code": "...", "message": "..."}}import requests, time
API = "https://api.aliapi.me"
headers = {"Authorization": "Bearer YOUR_API_KEY"}
# 1. Submit / 提交任务
job = requests.post(f"{API}/v1/videos", headers=headers, json={
"model": "earth/seedance-2.0",
"prompt": "A calico cat stretching on a sunny windowsill, cinematic close-up",
"duration": 4,
"resolution": "720p",
}, timeout=30).json()
# 2. Poll until terminal status / 轮询直到终态
while job["status"] in ("queued", "in_progress"):
time.sleep(5)
job = requests.get(f"{API}/v1/videos/{job['id']}", headers=headers, timeout=30).json()
if job["status"] == "completed":
print(job["url"]) # MP4 URL, valid 24h / 有效期 24 小时
else:
print("failed:", job.get("error"))queuedThe job has been accepted and is waiting to start.in_progressThe video is being generated.completedDone — the response contains the video url (MP4) and seconds (duration).failedGeneration failed — the response contains an error object with code and message.aliapi.me fully supports Anthropic's native /v1/messages API format. You can use the official Anthropic SDK directly, with support for streaming and Prompt Cache.
Set the Anthropic SDK's base_url to the following address, using your aliapi.me API Key:
Base URL: https://api.aliapi.meimport anthropic
client = anthropic.Anthropic(
base_url="https://api.aliapi.me",
api_key="YOUR_API_KEY",
)
message = client.messages.create(
model="claude-opus-4-6",
max_tokens=1024,
messages=[
{"role": "user", "content": "Hello, Claude!"}
]
)
print(message.content[0].text)import Anthropic from '@anthropic-ai/sdk';
const client = new Anthropic({
baseURL: 'https://api.aliapi.me',
apiKey: 'YOUR_API_KEY',
});
const message = await client.messages.create({
model: 'claude-opus-4-6',
max_tokens: 1024,
messages: [
{ role: 'user', content: 'Hello, Claude!' }
],
});
console.log(message.content[0].text);Use the Anthropic SDK's stream method for streaming output:
with client.messages.stream(
model="claude-opus-4-6",
max_tokens=1024,
messages=[{"role": "user", "content": "Tell me a story"}]
) as stream:
for text in stream.text_stream:
print(text, end="", flush=True)Enable prompt caching with the cache_control parameter to reduce repeated token costs:
message = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=1024,
system=[{
"type": "text",
"text": "You are a helpful assistant...(long system prompt)...",
"cache_control": {"type": "ephemeral"}
}],
messages=[
{"role": "user", "content": "Hello!"}
]
)
# Check cache usage
print(f"Cache read: {message.usage.cache_read_input_tokens}")
print(f"Cache creation: {message.usage.cache_creation_input_tokens}")Call the API directly using HTTP:
curl https://api.aliapi.me/v1/messages \
-H "x-api-key: YOUR_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-H "Content-Type: application/json" \
-d '{
"model": "claude-opus-4-6",
"max_tokens": 1024,
"messages": [
{"role": "user", "content": "Hello!"}
]
}'The following Claude models are currently available via the native API format:
claude-opus-4-6claude-sonnet-4-6claude-haiku-4-5Understand and handle API errors effectively.
401401 Unauthorized - Invalid API key429429 Too Many Requests - Rate limit exceeded500500 Internal Server Error - Service error503503 Service Unavailable - Temporary outageTransparent pricing based on actual usage.
| Model | Input Price | Output Price |
|---|---|---|
| GPT-4 | $5.00 | $15.00 |
| GPT-3.5 Turbo | $0.50 | $1.50 |
| Claude 3 Opus | $15.00 | $75.00 |
per 1M tokens
Pay-as-you-go pricing with no subscription required.
Track your usage and costs in real-time from the dashboard.
Query your account's usage and spend programmatically in an OpenAI Usage/Costs API compatible format: aggregate by API key × model, with hourly/daily time buckets, plus configurable spend alerts. Built for reconciliation scripts, cost dashboards, and automated monitoring.
All endpoints in this section require an Admin Key. Tick "Admin Key" when creating a key in Settings → API Keys (you can also toggle it later). Calls with a standard inference key return 403.
Admin Keys are management-only: they can query usage/costs, manage alert rules, and check credits (/v1/credits, /v1/auth/key), but cannot call model inference — use a standard key for that. Admin Keys keep working even when your balance is zero.
GET https://api.aliapi.me/v1/organization/usage/completions
GET https://api.aliapi.me/v1/organization/costs
GET https://api.aliapi.me/v1/organization/alerts
POST https://api.aliapi.me/v1/organization/alerts
PUT https://api.aliapi.me/v1/organization/alerts/{id}
DELETE https://api.aliapi.me/v1/organization/alerts/{id}
# Read-only self queries (both Admin and standard keys)
GET https://api.aliapi.me/v1/credits
GET https://api.aliapi.me/v1/auth/keystart_timeRequired. Start of the range, Unix seconds.end_timeOptional. End of the range, Unix seconds. Defaults to now.bucket_widthBucket granularity: 1h or 1d (default 1d). Bucket boundaries align to your account timezone (default UTC+8, changeable in Settings → Account).group_byGroup dimensions: api_key_id and/or model. Ungrouped dimensions are null in results.api_key_ids / modelsFilter by API key IDs / model IDs. Only keys belonging to your account match.limit / pagelimit = number of buckets (1h: default 24, max 720; 1d: default 7, max 180); page = cursor from the previous response.curl "https://api.aliapi.me/v1/organization/usage/completions?start_time=1787328000&bucket_width=1d&group_by=api_key_id&group_by=model" \
-H "Authorization: Bearer $ADMIN_KEY"{
"object": "page",
"data": [
{
"object": "bucket",
"start_time": 1787328000,
"end_time": 1787414400,
"results": [
{
"object": "organization.usage.completions.result",
"input_tokens": 15234,
"output_tokens": 8721,
"input_cached_tokens": 4096,
"num_model_requests": 37,
"api_key_id": "key_xxx",
"model": "gpt-4o-mini"
}
]
}
],
"has_more": false,
"next_page": null
}costs returns USD amounts actually charged (after discounts). Consumption refunds appear as separate line_item="adjustment" rows with negative amounts, so the API always reconciles with what you were billed.
{
"object": "bucket",
"start_time": 1787328000,
"end_time": 1787414400,
"results": [
{
"object": "organization.costs.result",
"amount": { "value": 12.3456, "currency": "usd" },
"line_item": null,
"api_key_id": "key_xxx",
"model": "gpt-4o-mini"
},
{
"object": "organization.costs.result",
"amount": { "value": -2.0, "currency": "usd" },
"line_item": "adjustment",
"api_key_id": null,
"model": null
}
]
}Reconciliation: treat costs as the source of truth. Multiplying usage tokens by list prices will drift due to cached-token pricing, tiered rates, and discounts.
Sum of rows with line_item=null = total consumption (matches total_usage in /v1/credits); sum including adjustment rows = net spend (matches your balance ledger).
Set a USD threshold on an hourly (1h) or calendar-day (1d) window. When spend in the window reaches the threshold, you get an in-app notification (including current balance) — at most once per window. Rules are evaluated every 5 minutes.
curl -X POST "https://api.aliapi.me/v1/organization/alerts" \
-H "Authorization: Bearer $ADMIN_KEY" \
-H "Content-Type: application/json" \
-d '{"windowKind": "1h", "threshold": 5.0, "enabled": true}'Current channel: in-app notifications (rules can also be managed in Settings → Usage Alerts). Email notifications are not yet available.
Official and community-maintained SDKs for popular languages.
Use the official OpenAI Python library
pip install openaiUse the official OpenAI Node.js library
npm install openaiAPI usage limits to ensure fair access and service stability.
| Tier | Requests | Tokens |
|---|---|---|
| Free | 100 req/day | 100K tokens/day |
| Pro | 10,000 req/day | 10M tokens/day |
Rate limit information is included in response headers:
X-RateLimit-Limit: 10000
X-RateLimit-Remaining: 9999
X-RateLimit-Reset: 1640995200Join our Discord community for help and discussions
Contact our team at support@openllm.dev
Check real-time API status and uptime
Stay updated with latest features and improvements