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.
/api/v1/chat/completionsStreams an OpenAI-compatible chat completion as Server-Sent Events.
curl -X POST "https://edycode.vercel.app/api/v1/chat/completions" \
-H "Authorization: Bearer $EDY_API_KEY" \
-H "Content-Type: application/json" \
-d '{ ... }'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;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)/api/v1/images/generationsGenerates 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 -X POST "https://edycode.vercel.app/api/v1/images/generations" \
-H "Authorization: Bearer $EDY_API_KEY" \
-H "Content-Type: application/json" \
-d '{ ... }'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();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()/api/v1/videos/generationsSubmits an asynchronous video job using a public catalogue slug and returns an Edy polling URL.
Complete parameters, image uploads, examples, responses, and billing →curl -X POST "https://edycode.vercel.app/api/v1/videos/generations" \
-H "Authorization: Bearer $EDY_API_KEY" \
-H "Content-Type: application/json" \
-d '{ ... }'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();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()/api/v1/videos/{id}Polls a video job. Completed OpenRouter jobs contain authenticated Edy content URLs.
curl "https://edycode.vercel.app/api/v1/videos/{id}" \
-H "Authorization: Bearer $EDY_API_KEY"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();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()/api/v1/media/models?type=imageLists active image or video model slugs, providers, defaults, capabilities, and unit pricing.
curl "https://edycode.vercel.app/api/v1/media/models?type=image" \
-H "Authorization: Bearer $EDY_API_KEY"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();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()/api/v1/modelsLists active public model slugs, capabilities, controls, defaults, and premium classification.
curl "https://edycode.vercel.app/api/v1/models" \
-H "Authorization: Bearer $EDY_API_KEY"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();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()/api/v1/account/modelsLists only the models currently usable by the authenticated account. OAuth access requires the models:read scope.
curl "https://edycode.vercel.app/api/v1/account/models" \
-H "Authorization: Bearer $EDY_API_KEY"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();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 anx-request-idheader. - 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_overloadedwith Edy's request ID.