Developer Center
Generate Amazon-style A+ Content, run AI image tools, and land device-captured photos into a user's account — all from a single REST API and MCP server.
Get from zero to your first API call in three steps.
export KEY=glk_live_...bashcurl https://lite.gency.ai/api/v1/me \
-H "Authorization: Bearer $KEY"A successful response returns your workspace, plan, and credit balance:
json{
"orgId": "…",
"plan": "growth",
"planStatus": "active",
"credits": { "used": 1200, "limit": 21000, "remaining": 19800, "unlimited": false }
}403.Every request is authenticated with a Bearer token. Keys are created under Settings → API Keys (workspace owner only) and only a hash is stored — if a key leaks, revoke it and issue a new one.
Authorization: Bearer glk_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxThe same key works for both the REST API (/api/v1) and the MCP server (/api/mcp).
Calls deduct workspace credits exactly like the UI (billed to the owner's subscription). Credits are automatically refunded if processing fails.
| Operation | Credits |
|---|---|
| A+ Content generation | 100–2,260 |
| Image edit (i2i) | 360 |
| Background removal | 50 |
| Upload / read | 0 |
imagePolicy: "allow_generate") the pipeline may auto-generate supplemental images to fill sections, each billed 360 credits (max 6 → up to +2,160), for a 100–2,260 total. Pass imagePolicy: "reuse_only" to use only the images you provide (base 100, no supplemental image charges).Errors use a consistent JSON shape:
json{ "error": "description", "code": "insufficient_credits", "required": 100, "available": 40 }| Status | Meaning |
|---|---|
| 401 | Missing / invalid / revoked key |
| 402 | Insufficient credits (includes required / available) |
| 403 | Not allowed (e.g. Free plan) |
| 400 | Invalid input · SSRF blocked |
| 429 | Rate limit exceeded |
| 500 | Internal error |
Idempotency. Send an Idempotency-Key header (any unique string) on POST requests to retry safely — a completed request replays its stored response without charging credits again. Same key with a different body returns 422; a still-processing one returns 409. Keys are remembered for 24 hours.
Base URL https://lite.gency.ai/api/v1. Images accept a public https:// URL or base64 (max 20 MB).
/meWorkspace, plan, and credit balance. (See Quickstart.)
/uploadsUpload a base64 image and get a 1-hour signed URL back.
bashcurl -X POST https://lite.gency.ai/api/v1/uploads \
-H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
-d '{"image":"data:image/png;base64,iVBOR..."}'/images/remove-backgroundBackground removal → transparent PNG. (50 credits)
bashcurl -X POST https://lite.gency.ai/api/v1/images/remove-background \
-H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
-d '{"image":"https://example.com/shoe.jpg"}'/images/editPrompt-based image editing (i2i) — background swap, product staging, compositing. (360 credits)
bashcurl -X POST https://lite.gency.ai/api/v1/images/edit \
-H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
-d '{
"prompt": "place the product on a marble kitchen counter, soft daylight",
"images": ["https://example.com/cutout.png"],
"aspectRatio": "1:1"
}'/aplus/generateProduct images → Amazon-style A+ Content PNG (multi-stage pipeline, can take a few minutes). (100–2,260 credits — base 100 + auto supplemental images 360 each, max 6)
bashcurl -X POST https://lite.gency.ai/api/v1/aplus/generate \
-H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
-d '{
"images": ["https://…/1.jpg", "https://…/2.jpg"],
"categoryId": "fashion",
"lang": "en"
}'categoryId accepts any product category (fashion, beauty, food, electronics, home, pet, and more) and is optional — omit it to auto-detect from the images. An invalid value returns 400 with the list of valid values. Optional version: standard (default), premium (wider, more sections), or pdp (Korean-style vertical detail page). Optional moodId pins the visual mood (design look); omit it to let the pipeline pick a recommended mood. Optional imagePolicy: allow_generate (default — may auto-generate supplemental images, each 360 credits, max 6) or reuse_only (use only the images you provide, no supplemental image charges). Optional format: png (default) or html (also returns a self-contained HTML file)./listing/generateAmazon listing copy (title, bullets, description, backend search terms) from a generated creative. Pass the creativeId returned by A+ generation. (usage-based, typically ~100 credits)
bashcurl -X POST https://lite.gency.ai/api/v1/listing/generate \
-H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
-d '{"creativeId":"<uuid from /aplus/generate>","lang":"en"}'lang is optional — omit it to use the creative's own content language. Response: { listing: { title, bullets[], description, search_terms[] }, credits }./aplus/translateTranslate a creative into another language and get the full A+ PNG back. The translation is saved as a separate creative linked to the original (visible in the workspace). (usage-based, typically a few hundred credits)
bashcurl -X POST https://lite.gency.ai/api/v1/aplus/translate \
-H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
-d '{"creativeId":"<uuid from /aplus/generate>","lang":"ja"}'{ png: { url }, creativeId, lang, credits } — creativeId is the translated creative's id (a new record linked to the source), not the original one. Returns 409 if a translation job for the same language is already running.A remote MCP (Model Context Protocol) server lets AI agents such as Claude call GENCY lite tools directly. Endpoint https://lite.gency.ai/api/mcp — stateless Streamable HTTP, JSON-RPC 2.0, same API key.
Auth: a static API key (glk_live_…), not OAuth — attach it as an Authorization: Bearer header. Once connected, the agent auto-discovers the tools; nothing else to configure.
Claude Code
bashclaude mcp add --transport http gency-lite https://lite.gency.ai/api/mcp \
--header "Authorization: Bearer $GENCY_API_KEY"Codex CLI — ~/.codex/config.toml (bridge via mcp-remote):
toml[mcp_servers.gency-lite]
command = "npx"
args = ["-y", "mcp-remote", "https://lite.gency.ai/api/mcp", "--header", "Authorization: Bearer ${GENCY_API_KEY}"]Claude Desktop · Cursor · Windsurf · any mcpServers client
json{
"mcpServers": {
"gency-lite": {
"command": "npx",
"args": ["-y", "mcp-remote", "https://lite.gency.ai/api/mcp",
"--header", "Authorization: Bearer ${GENCY_API_KEY}"]
}
}
}| Tool | Credits |
|---|---|
gency_list_capabilities | 0 |
gency_get_account | 0 |
gency_upload_image | 0 |
gency_remove_background | 50 |
gency_edit_image | 360 |
gency_generate_aplus | 100 |
gency_start_aplus | 100 |
gency_aplus_status | 0 |
Call gency_list_capabilities first (free) to learn valid categoryId values, aspect ratios, and limits — it avoids guessing and hitting 400s. Results also include a machine-readable structuredContent object (e.g. { url, credits }) alongside the text, so you don't have to parse URLs out of prose.
Ready-made workflow prompts are exposed via prompts/list: stage_product (cut out + place in a scene) and make_aplus (full A+ page).
gency_device_*) are also exposed when the key has the device scope. Tool errors return as result content with isError: true (MCP convention).Land photos from a capture device directly into a walk-in user's "My Files" in real time. The device never holds user credentials — the user logs in and consents ("Connect") from their own phone via a QR code.
We host the QR and status screen for you. The device only needs to:
POST /api/v1/device/sessions → open the returned displayUrl in the device's browser (we render the QR, "Connected", "Capturing N photos", "Done").status is active, then upload each photo.POST /sessions/:id/end when finished.jsconst BASE = "https://lite.gency.ai/api/v1/device";
const h = { Authorization: `Bearer ${DEVICE_KEY}`, "Content-Type": "application/json" };
const s = await (await fetch(`${BASE}/sessions`, {
method: "POST", headers: h, body: JSON.stringify({ label: "Booth 1" })
})).json();
showQR(s.pairUrl); // or open s.displayUrl on the device screen
// poll until the user connects
let st;
do { await sleep(2500);
st = await (await fetch(`${BASE}/sessions/${s.sessionId}`, { headers: h })).json();
} while (st.status === "pending");
if (st.status !== "active") return; // expired, etc.
for (const photo of takePhotos()) {
await fetch(`${BASE}/sessions/${s.sessionId}/photos`, {
method: "POST", headers: h, body: JSON.stringify({ image: photo.base64 })
});
}
await fetch(`${BASE}/sessions/${s.sessionId}/end`, { method: "POST", headers: h });device scope (contact the operations team). Sessions expire after 15 min pending / 20 min idle, and uploads to a non-active session return 409.