HTTP API

API reference

Direct API clients authenticate with an Edy API key. The VS Code extension uses a short-lived OAuth Bearer token instead. Public requests always use an Edy model slug, never an upstream provider model ID.

POST/api/v1/chat/completions

Streams an OpenAI-compatible chat completion as Server-Sent Events.

cURL
curl -X POST "https://edycode.vercel.app/api/v1/chat/completions" \
  -H "Authorization: Bearer $EDY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ ... }'
TypeScript
const response = await fetch("https://edycode.vercel.app/api/v1/chat/completions", {
  method: "POST",
  headers: {
    Authorization: "Bearer " + process.env.EDY_API_KEY,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({ /* request fields */ }),
});

if (!response.ok) throw new Error(await response.text());
if (!response.body) throw new Error("Missing response stream");
const stream = response.body;
Python
import os
import requests

response = requests.post(
    "https://edycode.vercel.app/api/v1/chat/completions",
    headers={"Authorization": f"Bearer {os.environ['EDY_API_KEY']}"},
    json={  # request fields
    },
    stream=True,
    timeout=300,
)
response.raise_for_status()
for line in response.iter_lines(decode_unicode=True):
    if line:
        print(line)
POST/api/v1/images/generations

Generates images synchronously with a public image-model slug. The configured OpenRouter default is used when model is omitted.

Complete parameters, image uploads, examples, responses, and billing →
cURL
curl -X POST "https://edycode.vercel.app/api/v1/images/generations" \
  -H "Authorization: Bearer $EDY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ ... }'
TypeScript
const response = await fetch("https://edycode.vercel.app/api/v1/images/generations", {
  method: "POST",
  headers: {
    Authorization: "Bearer " + process.env.EDY_API_KEY,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({ /* request fields */ }),
});

if (!response.ok) throw new Error(await response.text());
const result = await response.json();
Python
import os
import requests

response = requests.post(
    "https://edycode.vercel.app/api/v1/images/generations",
    headers={"Authorization": f"Bearer {os.environ['EDY_API_KEY']}"},
    json={  # request fields
    },
    timeout=300,
)
response.raise_for_status()
result = response.json()
POST/api/v1/videos/generations

Submits an asynchronous video job using a public catalogue slug and returns an Edy polling URL.

Complete parameters, image uploads, examples, responses, and billing →
cURL
curl -X POST "https://edycode.vercel.app/api/v1/videos/generations" \
  -H "Authorization: Bearer $EDY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ ... }'
TypeScript
const response = await fetch("https://edycode.vercel.app/api/v1/videos/generations", {
  method: "POST",
  headers: {
    Authorization: "Bearer " + process.env.EDY_API_KEY,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({ /* request fields */ }),
});

if (!response.ok) throw new Error(await response.text());
const result = await response.json();
Python
import os
import requests

response = requests.post(
    "https://edycode.vercel.app/api/v1/videos/generations",
    headers={"Authorization": f"Bearer {os.environ['EDY_API_KEY']}"},
    json={  # request fields
    },
    timeout=300,
)
response.raise_for_status()
result = response.json()
GET/api/v1/videos/{id}

Polls a video job. Completed OpenRouter jobs contain authenticated Edy content URLs.

cURL
curl "https://edycode.vercel.app/api/v1/videos/{id}" \
  -H "Authorization: Bearer $EDY_API_KEY"
TypeScript
const response = await fetch("https://edycode.vercel.app/api/v1/videos/{id}", {
  method: "GET",
  headers: {
    Authorization: "Bearer " + process.env.EDY_API_KEY,
  },
});

if (!response.ok) throw new Error(await response.text());
const result = await response.json();
Python
import os
import requests

response = requests.get(
    "https://edycode.vercel.app/api/v1/videos/{id}",
    headers={"Authorization": f"Bearer {os.environ['EDY_API_KEY']}"},
    timeout=60,
)
response.raise_for_status()
result = response.json()
GET/api/v1/media/models?type=image

Lists active image or video model slugs, providers, defaults, capabilities, and unit pricing.

cURL
curl "https://edycode.vercel.app/api/v1/media/models?type=image" \
  -H "Authorization: Bearer $EDY_API_KEY"
TypeScript
const response = await fetch("https://edycode.vercel.app/api/v1/media/models?type=image", {
  method: "GET",
  headers: {
    Authorization: "Bearer " + process.env.EDY_API_KEY,
  },
});

if (!response.ok) throw new Error(await response.text());
const result = await response.json();
Python
import os
import requests

response = requests.get(
    "https://edycode.vercel.app/api/v1/media/models?type=image",
    headers={"Authorization": f"Bearer {os.environ['EDY_API_KEY']}"},
    timeout=60,
)
response.raise_for_status()
result = response.json()
GET/api/v1/models

Lists active public model slugs, capabilities, controls, defaults, and premium classification.

cURL
curl "https://edycode.vercel.app/api/v1/models" \
  -H "Authorization: Bearer $EDY_API_KEY"
TypeScript
const response = await fetch("https://edycode.vercel.app/api/v1/models", {
  method: "GET",
  headers: {
    Authorization: "Bearer " + process.env.EDY_API_KEY,
  },
});

if (!response.ok) throw new Error(await response.text());
const result = await response.json();
Python
import os
import requests

response = requests.get(
    "https://edycode.vercel.app/api/v1/models",
    headers={"Authorization": f"Bearer {os.environ['EDY_API_KEY']}"},
    timeout=60,
)
response.raise_for_status()
result = response.json()
GET/api/v1/account/models

Lists only the models currently usable by the authenticated account. OAuth access requires the models:read scope.

cURL
curl "https://edycode.vercel.app/api/v1/account/models" \
  -H "Authorization: Bearer $EDY_API_KEY"
TypeScript
const response = await fetch("https://edycode.vercel.app/api/v1/account/models", {
  method: "GET",
  headers: {
    Authorization: "Bearer " + process.env.EDY_API_KEY,
  },
});

if (!response.ok) throw new Error(await response.text());
const result = await response.json();
Python
import os
import requests

response = requests.get(
    "https://edycode.vercel.app/api/v1/account/models",
    headers={"Authorization": f"Bearer {os.environ['EDY_API_KEY']}"},
    timeout=60,
)
response.raise_for_status()
result = response.json()

Errors

401
Missing, expired, invalid, or revoked credential. The VS Code extension refreshes an expired OAuth access token once before asking you to sign in again.
402
The wallet cannot reserve the catalogue price for a premium chat or media request.
403
A premium model was requested while the account is in Free mode. The error code is paid_mode_required.
429
User quota or shared upstream capacity is exhausted. Quota responses identify request or token limits, include retryAfter, and return an x-request-id header.
503
Required capacity coordination is temporarily unavailable.
503
An active model is missing complete Paid-mode pricing. The error code is model_pricing_not_configured.
stream
If an upstream 500, 502, 503, 504, or 529 persists after two safe pre-output retries, the SSE stream returns upstream_overloaded with Edy's request ID.