Quickstart

eWest gives you video, image and language models behind one OpenAI-compatible API. Requests go to https://api.ewest.ai/v1 with your key in the Authorization header.

  1. Create an account and copy the key (it is shown once).
  2. Set it as an environment variable: export EWEST_KEY=sk-…
  3. Send your first request (below). Usage appears in the console under Requests and Usage.

Chat

POST /v1/chat/completions, compatible with the OpenAI SDKs. Set "stream": true for long answers: requests without streaming are cut off after 100 seconds.

curl https://api.ewest.ai/v1/chat/completions \
  -H "Authorization: Bearer $EWEST_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model": "ewest/gemini-flash", "stream": true,
       "messages": [{"role": "user", "content": "Hello!"}]}'

Images

POST /v1/images/generations returns image URLs on cdn.ewest.ai, kept for 7 days. Ask for "response_format": "b64_json" to also get the bytes.

curl https://api.ewest.ai/v1/images/generations \
  -H "Authorization: Bearer $EWEST_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model": "ewest/flux-schnell", "prompt": "a cozy cabin in the snow"}'

# → {"data": [{"url": "https://cdn.ewest.ai/img/…"}]}

Video jobs

Video takes from seconds to minutes, so it runs as a job. POST /v1/videos/generations returns 202 with a job; then follow it in one of three ways:

  • GET /v1/jobs/{id}/events: Server-Sent Events with live progress and eta_seconds.
  • GET /v1/jobs/{id}: poll every few seconds.
  • "webhook_url" in the request: we POST the finished job to it.

eta_seconds is null when a job runs longer than usual. Finished videos are on cdn.ewest.ai for 7 days.

# 1. Create the job
curl https://api.ewest.ai/v1/videos/generations \
  -H "Authorization: Bearer $EWEST_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model": "ewest/veo-3.1-fast", "prompt": "A red fox walks through fresh snow"}'
# → 202 {"id": "job_…", "status": "queued", "progress": 0, "eta_seconds": …}

# 2. Follow live progress (Server-Sent Events), or poll GET /v1/jobs/job_…
curl -N https://api.ewest.ai/v1/jobs/job_…/events -H "Authorization: Bearer $EWEST_KEY"

Trace IDs

Every response carries an x-request-id header (for video, the job ID). Paste it into Console → Requests to see the request, response, timing and cost. Prompts and outputs are kept for 7 days; usage and cost permanently.

Errors

Errors use the OpenAI shape: {"error": {"message", "type", "code", "param"}}.

400invalid_request_errorA parameter is missing or out of range; param names it.
401auth_errorMissing, invalid, expired or blocked key.
402insufficient_budgetThe key's budget would be exceeded.
403permission_errorThe key is not allowed to use this model.
404not_found_errorUnknown job or model.
502 / 503api_errorTemporary problem upstream; retry with backoff.

Models

Use the ID in the model field. Machine-readable list: /v1/catalog.

ModelIDTypeLimits
Gemini 2.5 Flashewest/gemini-flashlanguage1M context
Claude Haiku 4.5ewest/claude-haikulanguage200K context
Claude Sonnet 5.5ewest/claude-sonnetlanguage1M context
FLUX.1 [schnell]ewest/flux-schnellimageup to 1536 px
Gemini 2.5 Flash Imageewest/gemini-flash-imageimage1024 px
Veo 3.1 Fastewest/veo-3.1-fastvideo4–8 s · up to 1080p
Seedance 2.5ewest/seedance-2.5video4–10 s · up to 1080p
MiniMax H3 Maxewest/minimax-h3-maxvideo5–10 s · up to 768p