# Xide APP REST API > Generate images, videos, audio and image edits with Xide APP credits. Failed generations are refunded automatically. - Base URL: `https://xide.app/api/v1` - Authentication: `Authorization: Bearer xide_live_…` (or the `X-API-Key` header) - Get an API key: https://xide.app/dashboard/api - OpenAPI 3.1: https://xide.app/api/v1/openapi.json - MCP server for AI assistants: https://xide.app/api/mcp (see https://xide.app/docs/mcp.md) ## Quickstart 1. List models ```bash export XIDE_API_KEY="xide_live_..." curl "https://xide.app/api/v1/models?category=image" \ -H "Authorization: Bearer $XIDE_API_KEY" ``` 2. Start a generation ```bash curl -X POST "https://xide.app/api/v1/generate/text-to-image-flux-2-pro" \ -H "Authorization: Bearer $XIDE_API_KEY" \ -H "Content-Type: application/json" \ -H "Idempotency-Key: order-42" \ -d '{"inputs": {"prompt": "a red fox in fresh snow"}, "metadata": {"order": 42}}' ``` 3. Wait for the result ```bash curl "https://xide.app/api/v1/jobs/JOB_ID?wait=30" \ -H "Authorization: Bearer $XIDE_API_KEY" ``` Image, video and audio inputs accept an upload_id, a public https URL, or the url of a previous output. ## Response format Success responses look like { "ok": true, "data": … } and errors like { "ok": false, "error": { "code", "message" } }. Rate limits are returned in the X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset headers. Error messages follow the Accept-Language header: Turkish, English, Spanish, Russian or Arabic. ## Endpoints ### GET /api/v1/models List models; filter by category and search — scope: `read` | Parameter | In | Type | Required | Description | |---|---|---|---|---| | category | query | image \| edit \| video \| audio \| lipsync \| icon \| utility \| recast | no | | | q | query | string | no | Search in model id and name | Request: ```bash curl "https://xide.app/api/v1/models?category=image&q=flux" \ -H "Authorization: Bearer $XIDE_API_KEY" ``` Response: ```json { "ok": true, "data": { "models": [ { "id": "text-to-image-flux-2-pro", "name": "Flux 2 Pro", "category": "image", "description": "High quality text-to-image", "credits": { "min": 60, "max": 60 }, "variants": [] } ], "count": 1 } } ``` ### GET /api/v1/models/{model} Model details: inputs, defaults, variants — scope: `read` Resolution variants have their own ids. | Parameter | In | Type | Required | Description | |---|---|---|---|---| | model | path | string | yes | | Request: ```bash curl "https://xide.app/api/v1/models/text-to-image-flux-2-pro" \ -H "Authorization: Bearer $XIDE_API_KEY" ``` Response: ```json { "ok": true, "data": { "model": { "id": "text-to-image-flux-2-pro", "name": "Flux 2 Pro", "category": "image", "description": "High quality text-to-image", "credits": { "min": 60, "max": 60 }, "variants": [], "inputs": [ { "name": "prompt", "label": "Prompt", "type": "text", "required": true, "max_length": 4000 }, { "name": "aspect_ratio", "label": "Aspect ratio", "type": "enum", "required": false, "options": [ "1:1", "16:9", "9:16" ], "default": "1:1" } ] } } } ``` ### POST /api/v1/quote Exact credit cost for given inputs — scope: `read` The quoted amount is exactly what generate charges. | Parameter | In | Type | Required | Description | |---|---|---|---|---| | model | body (application/json) | string | yes | | | inputs | body (application/json) | object | no | | Request: ```bash curl -X POST "https://xide.app/api/v1/quote" \ -H "Authorization: Bearer $XIDE_API_KEY" \ -H "Content-Type: application/json" \ -d '{"model": "text-to-image-flux-2-pro", "inputs": {"prompt": "a red fox in fresh snow"}}' ``` Response: ```json { "ok": true, "data": { "model": "text-to-image-flux-2-pro", "cost_credits": 60, "balance": 1200 } } ``` ### POST /api/v1/generate/{model} Starts a generation and returns the job (202) — scope: `generate` Credits are reserved when the job is created and refunded if it fails. Repeats with the same Idempotency-Key within 24 hours return the original job (200, `Idempotent-Replayed: true`). | Parameter | In | Type | Required | Description | |---|---|---|---|---| | model | path | string | yes | | | Idempotency-Key | header | string | no | | | inputs | body (application/json) | object | yes | Model inputs (see GET /models/{model}) | | webhook_url | body (application/json) | string | no | Public https URL notified when the job finishes | | metadata | body (application/json) | | no | Echoed back on the job and webhook (max 4 KB) | Request: ```bash curl -X POST "https://xide.app/api/v1/generate/text-to-image-flux-2-pro" \ -H "Authorization: Bearer $XIDE_API_KEY" \ -H "Content-Type: application/json" \ -H "Idempotency-Key: order-42" \ -d '{"inputs": {"prompt": "a red fox in fresh snow"}, "metadata": {"order": 42}}' ``` Response: ```json { "ok": true, "data": { "job": { "job_id": "cmjob1a2b3c4d5e6f7g8h9i0", "status": "queued", "model": "text-to-image-flux-2-pro", "model_name": "Flux 2 Pro", "cost_credits": 60, "created_at": "2026-10-26T10:00:00.000Z", "completed_at": null, "error": null, "outputs": [], "result": null, "metadata": { "order": 42 }, "source": "api" }, "balance": 1140 } } ``` ### GET /api/v1/jobs/{job_id} Job status and outputs; wait until it finishes — scope: `read` `wait` long-polls until the job finishes. | Parameter | In | Type | Required | Description | |---|---|---|---|---| | job_id | path | string | yes | | | wait | query | integer (0–50) | no | | Request: ```bash curl "https://xide.app/api/v1/jobs/JOB_ID?wait=30" \ -H "Authorization: Bearer $XIDE_API_KEY" ``` Response: ```json { "ok": true, "data": { "job": { "job_id": "cmjob1a2b3c4d5e6f7g8h9i0", "status": "completed", "model": "text-to-image-flux-2-pro", "model_name": "Flux 2 Pro", "cost_credits": 60, "created_at": "2026-10-26T10:00:00.000Z", "completed_at": "2026-10-26T10:00:09.000Z", "error": null, "outputs": [ { "id": "cmoutput7x6w5v4u3t2s1r0q", "kind": "image", "url": "https://xide.app/api/v1/files/cmoutput7x6w5v4u3t2s1r0q", "download_url": "https://xide.app/api/v1/files/cmoutput7x6w5v4u3t2s1r0q?download=1", "content_type": "image/png", "width": 1024, "height": 1024, "duration": null, "size_bytes": 1832211, "nsfw": false } ], "result": null, "metadata": { "order": 42 }, "source": "api" } } } ``` ### GET /api/v1/jobs Your jobs, newest first — scope: `read` | Parameter | In | Type | Required | Description | |---|---|---|---|---| | limit | query | integer (1–100) | no | | | status | query | queued \| processing \| completed \| failed \| cancelled | no | | | cursor | query | string | no | next_cursor from the previous page | Request: ```bash curl "https://xide.app/api/v1/jobs?limit=20&status=completed" \ -H "Authorization: Bearer $XIDE_API_KEY" ``` Response: ```json { "ok": true, "data": { "jobs": [ { "job_id": "cmjob1a2b3c4d5e6f7g8h9i0", "status": "completed", "model": "text-to-image-flux-2-pro", "model_name": "Flux 2 Pro", "cost_credits": 60, "created_at": "2026-10-26T10:00:00.000Z", "completed_at": "2026-10-26T10:00:09.000Z", "error": null, "outputs": [ { "id": "cmoutput7x6w5v4u3t2s1r0q", "kind": "image", "url": "https://xide.app/api/v1/files/cmoutput7x6w5v4u3t2s1r0q", "download_url": "https://xide.app/api/v1/files/cmoutput7x6w5v4u3t2s1r0q?download=1", "content_type": "image/png", "width": 1024, "height": 1024, "duration": null, "size_bytes": 1832211, "nsfw": false } ], "result": null, "metadata": { "order": 42 }, "source": "api" } ], "next_cursor": null } } ``` ### POST /api/v1/jobs/{job_id}/cancel Cancels a queued job and refunds the credits — scope: `generate` Credits are refunded. | Parameter | In | Type | Required | Description | |---|---|---|---|---| | job_id | path | string | yes | | Request: ```bash curl -X POST "https://xide.app/api/v1/jobs/JOB_ID/cancel" \ -H "Authorization: Bearer $XIDE_API_KEY" ``` Response: ```json { "ok": true, "data": { "job": { "job_id": "cmjob1a2b3c4d5e6f7g8h9i0", "status": "cancelled", "model": "text-to-image-flux-2-pro", "model_name": "Flux 2 Pro", "cost_credits": 60, "created_at": "2026-10-26T10:00:00.000Z", "completed_at": "2026-10-26T10:00:09.000Z", "error": null, "outputs": [], "result": null, "metadata": { "order": 42 }, "source": "api" } } } ``` ### POST /api/v1/uploads Uploads a reference file (file or URL) — scope: `upload` Send a multipart `file` (max 1 GiB) or JSON `{ url }` (max 256 MB). Use the returned upload_id as a media input. | Parameter | In | Type | Required | Description | |---|---|---|---|---| | file | body (multipart/form-data) | string | yes | | | url | body (application/json) | string | yes | | Request: ```bash curl -X POST "https://xide.app/api/v1/uploads" \ -H "Authorization: Bearer $XIDE_API_KEY" \ -F "file=@photo.jpg" # or curl -X POST "https://xide.app/api/v1/uploads" \ -H "Authorization: Bearer $XIDE_API_KEY" \ -H "Content-Type: application/json" \ -d '{"url": "https://example.com/photo.jpg"}' ``` Response: ```json { "ok": true, "data": { "upload_id": "cmupload9z8y7x6w5v4u3t2", "content_type": "image/jpeg", "size_bytes": 482113 } } ``` ### GET /api/v1/files/{output_id} Downloads an output file (redirect) — scope: `read` Redirects to a short-lived signed URL. | Parameter | In | Type | Required | Description | |---|---|---|---|---| | output_id | path | string | yes | | | download | query | 0 \| 1 | no | | Request: ```bash curl -L "https://xide.app/api/v1/files/OUTPUT_ID?download=1" \ -H "Authorization: Bearer $XIDE_API_KEY" \ -o output.png ``` Response: ```http HTTP/1.1 302 Found Location: https://…/signed-url (short-lived) ``` ### GET /api/v1/account Balance, key info and today's usage — scope: `account` Request: ```bash curl "https://xide.app/api/v1/account" \ -H "Authorization: Bearer $XIDE_API_KEY" ``` Response: ```json { "ok": true, "data": { "credits": { "balance": 1140 }, "key": { "name": "My app", "prefix": "xide_live_Ab", "last4": "9xQz", "scopes": [ "generate", "read", "upload", "account" ], "rate_limit_per_min": 60, "daily_credit_cap": 2000, "expires_at": null }, "usage_today": { "requests": 12, "jobs": 1, "credits_spent": 60, "errors": 0 } } } ``` ### GET /api/v1/openapi.json Machine-readable API description — no API key required Request: ```bash curl "https://xide.app/api/v1/openapi.json" ``` ## Webhooks When a job finishes, a job.completed, job.failed or job.cancelled event is sent to webhook_url. Headers: X-Xide-Event, X-Xide-Timestamp and X-Xide-Signature (sha256=HMAC_SHA256(secret, timestamp + "." + body)). Failed deliveries are retried up to three times. ```json { "event": "job.completed", "job": { "job_id": "cmjob1a2b3c4d5e6f7g8h9i0", "status": "completed", "model": "text-to-image-flux-2-pro", "model_name": "Flux 2 Pro", "cost_credits": 60, "created_at": "2026-10-26T10:00:00.000Z", "completed_at": "2026-10-26T10:00:09.000Z", "error": null, "outputs": [ { "id": "cmoutput7x6w5v4u3t2s1r0q", "kind": "image", "url": "https://xide.app/api/v1/files/cmoutput7x6w5v4u3t2s1r0q", "download_url": "https://xide.app/api/v1/files/cmoutput7x6w5v4u3t2s1r0q?download=1", "content_type": "image/png", "width": 1024, "height": 1024, "duration": null, "size_bytes": 1832211, "nsfw": false } ], "result": null, "metadata": { "order": 42 }, "source": "api" }, "sent_at": "2026-10-26T10:00:10.000Z" } ``` ```js // Node.js — verify the signature with the raw request body const crypto = require("crypto"); const timestamp = req.headers["x-xide-timestamp"]; const signature = req.headers["x-xide-signature"]; const expected = "sha256=" + crypto .createHmac("sha256", process.env.XIDE_WEBHOOK_SECRET) .update(timestamp + "." + rawBody) .digest("hex"); const valid = signature.length === expected.length && crypto.timingSafeEqual(Buffer.from(signature), Buffer.from(expected)); ``` ## Idempotency Add an Idempotency-Key header to a generation request and repeats with the same key within 24 hours won't start a new job or spend credits; the original job is returned with 200 and an Idempotent-Replayed: true header. Safe to retry after network errors. ## Limits 60 requests per minute per key · JSON body up to 256 KB · file uploads up to 1 GiB (256 MB from a URL), at most 2 uploads at once · job wait up to 50 s. ## Error codes | HTTP | code | meaning | |---|---|---| | 401 | `unauthorized` | Key missing, invalid or revoked | | 403 | `forbidden` | Account suspended, email not verified or IP not allowed | | 403 | `forbidden_scope` | The key lacks permission for this action | | 402 | `insufficient_credits` | Not enough credits | | 422 | `validation_error` | Invalid inputs (missing or wrong field) | | 413 | `payload_too_large` | Body or file exceeds the size limit | | 404 | `model_not_found` | Model not found | | 404 | `not_found` | Job or file not found | | 409 | `conflict` | The job can no longer be canceled, or a request with the same Idempotency-Key is in progress | | 409 | `model_disabled` | The model is temporarily disabled | | 429 | `rate_limited` | Per-minute request or concurrent upload limit exceeded | | 429 | `daily_credit_cap_reached` | The key's daily credit cap is used up | | 429 | `too_many_active_jobs` | Too many jobs running at once | | 503 | `maintenance` | Under maintenance; retry after Retry-After | | 503 | `api_disabled` | The developer API is temporarily turned off | | 500 | `internal` | Unexpected error; try again | --- ## Models 128 models. Use the id in `POST /api/v1/generate/{model}`. Credit ranges are estimates — call `POST /api/v1/quote` (or the MCP tool `estimate_cost`) for the exact amount. Resolution variants have their own ids. Inputs per model: `GET /api/v1/models/{model}`. | id | name | category | credits | variants | |---|---|---|---|---| | `voiceover-elevenlabs-turbo-v2-5` | ElevenLabs Voiceover | audio | 1–4000 | | | `music-generation-lyria-3` | Lyria 3 | audio | 80–160 | | | `music-generation-google-lyria` | Google Lyria | audio | 80 | | | `sound-effects` | Sound Effects | audio | 5–110 | | | `audio-isolation` | Audio Isolation | audio | 60 | | | `beta-remove-background` | Remove Background | edit | 3 | | | `image-upscaler-precision-v2` | Upscaler Precision V2 | edit | 90–1440 | | | `image-upscaler-precision` | Upscaler Precision | edit | 90 | | | `image-upscaler` | Upscaler Creative | edit | 90–1440 | | | `text-to-image-gpt-image-2-5-edit` | GPT Image 2.5 (Edit) | edit | 15–10000 | | | `text-to-image-gpt-image-2-edit` | GPT Image 2 (Edit) | edit | 15–5000 | | | `text-to-image-seedream-v5-pro-edit` | Seedream 5.0 Pro (Edit) | edit | 75–150 | | | `text-to-image-seedream-v5-lite-edit` | Seedream V5 Lite (Edit) | edit | 50 | | | `text-to-image-seedream-v4-5-edit` | Seedream 4.5 (Edit) | edit | 50 | | | `text-to-image-seedream-v4-edit` | Seedream 4 (Edit) | edit | 50 | | | `image-expand-flux-pro` | Flux Pro | edit | 50 | | | `beta-text-to-image-reimagine-flux` | Flux Reimagine | edit | 50 | | | `ideogram-image-edit` | Ideogram Image Edit | edit | 30–90 | | | `image-expand-ideogram` | Ideogram | edit | 60 | | | `image-expand-seedream-v4-5` | Seedream V4.5 | edit | 50 | | | `image-relight` | Image Relight | edit | 75–150 | | | `image-style-transfer` | Style Transfer | edit | 200 | | | `image-change-camera` | Image Change Camera | edit | 50 | | | `skin-enhancer-creative` | Skin Enhancer Creative | edit | 100 | | | `skin-enhancer-faithful` | Skin Enhancer Faithful | edit | 200 | | | `skin-enhancer-flexible` | Skin Enhancer Flexible | edit | 600 | | | `classifier-image` | AI Image Detector | utility | 8 | | | `image-to-prompt` | Image to Prompt | utility | 8 | | | `text-to-image` | Classic Text-to-Image | image | 1–4 | | | `text-to-image-flux-2-klein` | Flux 2 Klein | image | 10–45 | | | `text-to-image-flux-2-turbo` | Flux 2 Turbo | image | 20 | | | `text-to-image-flux-dev` | Flux Dev | image | 10 | | | `text-to-image-flux-2-flex` | Flux 2 Flex | image | 80–280 | | | `text-to-image-flux-2-pro` | Flux 2 Pro | image | 50–175 | | | `text-to-image-flux-pro-v1-1` | Flux Pro 1.1 | image | 50 | | | `text-to-image-hyperflux` | HyperFlux | image | 10 | | | `text-to-image-flux-kontext-pro` | Flux Kontext Pro | image | 70 | | | `text-to-image-flux-kontext-max` | Flux Kontext Max | image | 150 | | | `text-to-image-gpt-image-2` | GPT Image 2 | image | 15–5000 | | | `text-to-image-gpt-image-2-5` | GPT Image 2.5 | image | 15–10000 | | | `text-to-image-seedream-v4` | Seedream 4 | image | 50 | | | `text-to-image-seedream-v4-5` | Seedream 4.5 | image | 50 | | | `text-to-image-seedream-v5-lite` | Seedream V5 Lite | image | 50 | | | `text-to-image-seedream-v5-pro` | Seedream 5.0 Pro | image | 75–150 | | | `text-to-image-nano-banana-pro-flash` | Nano Banana Pro Flash | image | 75–150 | | | `text-to-image-nano-banana-pro` | Nano Banana Pro | image | 75–150 | | | `text-to-image-z-image` | Z-Image | image | 5 | | | `mystic` | Mystic | image | 50–130 | | | `gemini-2-5-flash-image-preview` | Gemini 2.5 Flash | image | 120 | | | `text-to-image-runway` | Runway | image | 200 | | | `video-upscaler-turbo` | Video Upscaler Turbo | video | 60–300 | | | `image-to-video-wan-2-7` | WAN 2.7 (Image to Video) | video | 260–3000 | | | `reference-to-video-wan-2-7` | WAN 2.7 (Reference to Video) | video | 260–2000 | | | `text-to-video-wan-2-7` | WAN 2.7 (Text to Video) | video | 260–3000 | | | `video-edit-wan-2-7` | WAN 2.7 (Video Edit) | video | 130–2000 | | | `image-to-video-wan-2-5-i2v-1080p` | WAN 2.5 1080p (Image to Video) | video | 1500–3000 | `image-to-video-wan-2-5-i2v-1080p`, `image-to-video-wan-2-5-i2v-720p`, `image-to-video-wan-2-5-i2v-480p` | | `text-to-video-wan-2-5-t2v-1080p` | WAN 2.5 1080p (Text to Video) | video | 1500–3000 | `text-to-video-wan-2-5-t2v-1080p`, `text-to-video-wan-2-5-t2v-720p`, `text-to-video-wan-2-5-t2v-480p` | | `image-to-video-wan-v2-6-1080p` | WAN 2.6 1080p (Image to Video) | video | 1500–4500 | `image-to-video-wan-v2-6-1080p`, `image-to-video-wan-v2-6-720p` | | `text-to-video-wan-v2-6-1080p` | WAN 2.6 1080p (Text to Video) | video | 1500–4500 | `text-to-video-wan-v2-6-1080p`, `text-to-video-wan-v2-6-720p` | | `image-to-video-wan-v2-2-720p` | WAN 2.2 | video | 160–320 | `image-to-video-wan-v2-2-720p`, `image-to-video-wan-v2-2-480p` | | `image-to-video-wan-v2-2-580p` | WAN 2.2 580p | video | 80–160 | | | `video-kling-v3-motion-control-pro` | Kling 3 Pro (Motion Control) | video | 1500 | `video-kling-v3-motion-control-pro`, `video-kling-v3-motion-control-std` | | `video-kling-v3-omni-4k` | Kling 3 Omni | video | 1200–6000 | `video-kling-v3-omni-4k`, `video-kling-v3-omni-pro`, `video-kling-v3-omni-std` | | `image-to-video-kling-v3-turbo-1080p` | Kling 3.0 Turbo I2V | video | 780–3900 | `image-to-video-kling-v3-turbo-1080p`, `image-to-video-kling-v3-turbo-720p` | | `text-to-video-kling-v3-turbo-1080p` | Kling 3.0 Turbo T2V | video | 780–3900 | `text-to-video-kling-v3-turbo-1080p`, `text-to-video-kling-v3-turbo-720p` | | `reference-to-video-kling-v3-omni-pro` | Kling 3 Omni Pro (Reference to Video) | video | 285–1425 | `reference-to-video-kling-v3-omni-pro`, `reference-to-video-kling-v3-omni-std` | | `video-kling-v3-pro` | Kling 3 Pro | video | 270–1350 | `video-kling-v3-pro`, `video-kling-v3-std` | | `video-kling-4k-i2v` | Kling 4K I2V | video | 1200–6000 | | | `video-kling-4k-t2v` | Kling 4K T2V | video | 1200–6000 | | | `video-kling-v2-6-motion-control-pro` | Kling 2.6 Pro (Motion Control) | video | 1100 | `video-kling-v2-6-motion-control-pro`, `video-kling-v2-6-motion-control-std` | | `image-to-video-kling-v2-6-pro` | Kling 2.6 Pro (Image to Video) | video | 225–450 | | | `image-to-video-kling-v2-5-720p` | Kling 2.5 | video | 140–280 | `image-to-video-kling-v2-5-720p`, `image-to-video-kling-v2-5-pro` | | `image-to-video-kling-elements-pro` | Kling Elements Pro | video | 475–950 | `image-to-video-kling-elements-pro`, `image-to-video-kling-elements-std` | | `image-to-video-kling-o1-pro` | Kling O1 Pro (Image to Video) | video | 500–1000 | `image-to-video-kling-o1-pro`, `image-to-video-kling-o1-std` | | `image-to-video-kling-o1-pro-video-reference` | Kling O1 Pro (Video Reference) | video | 500–1000 | | | `image-to-video-kling-o1-std-video-reference` | Kling O1 Standard (Video Reference) | video | 375–750 | | | `reference-to-video-veo-3-1` | Veo 3.1 (Reference to Video) | video | 1600–2720 | | | `image-to-video-veo-3-1-fast` | Veo 3.1 Fast (Image to Video) | video | 400–2160 | `image-to-video-veo-3-1-fast`, `image-to-video-veo-3-1` | | `text-to-video-veo-3-1-fast` | Veo 3.1 Fast (Text to Video) | video | 400–2160 | `text-to-video-veo-3-1-fast`, `text-to-video-veo-3-1` | | `image-to-video-veo-3-1-lite` | Veo 3.1 Lite (Image to Video) | video | 160–320 | | | `text-to-video-veo-3-1-lite` | Veo 3.1 Lite (Text to Video) | video | 160–320 | | | `video-seedance-2-5-pro-1080p` | Seedance 2.5 Pro | video | 4400–33000 | `video-seedance-2-5-pro-1080p`, `video-seedance-2-5-pro-720p`, `video-seedance-2-5-pro-480p` | | `video-seedance-2-pro-4k` | Seedance 2.0 Pro | video | 5600–21000 | `video-seedance-2-pro-4k`, `video-seedance-2-pro-1080p`, `video-seedance-2-pro-720p`, `video-seedance-2-pro-480p` | | `video-seedance-2-fast-720p` | Seedance 2.0 Fast | video | 940–3525 | `video-seedance-2-fast-720p`, `video-seedance-2-fast-480p` | | `video-seedance-2-mini-720p` | Seedance 2.0 Mini | video | 560–2100 | `video-seedance-2-mini-720p`, `video-seedance-2-mini-480p` | | `image-to-video-happy-horse-1-1` | Happy Horse 1.1 (Image to Video) | video | 495–4200 | | | `reference-to-video-happy-horse-1-1` | Happy Horse 1.1 (Reference to Video) | video | 495–4200 | | | `text-to-video-happy-horse-1-1` | Happy Horse 1.1 (Text to Video) | video | 495–4200 | | | `video-edit-happy-horse-1` | Happy Horse 1.0 (Video Edit) | video | 550–950 | | | `image-to-video-happy-horse-1` | Happy Horse 1.0 (Image to Video) | video | 495–4200 | | | `reference-to-video-happy-horse-1` | Happy Horse 1.0 (Reference to Video) | video | 495–4200 | | | `text-to-video-happy-horse-1` | Happy Horse 1.0 (Text to Video) | video | 495–4200 | | | `image-to-video-minimax-hailuo-2-3-1080p-fast` | MiniMax Hailuo 2.3 1080p Fast | video | 258 | | | `image-to-video-minimax-hailuo-2-3-1080p` | MiniMax Hailuo 2.3 1080p | video | 240 | | | `image-to-video-minimax-hailuo-2-3-768p-fast` | MiniMax Hailuo 2.3 768p Fast | video | 150–250 | `image-to-video-minimax-hailuo-2-3-768p-fast`, `image-to-video-minimax-hailuo-2-3-768p` | | `image-to-video-minimax-hailuo-02-1080p` | MiniMax Hailuo 02 1080p | video | 720 | | | `image-to-video-minimax-hailuo-02-768p` | MiniMax Hailuo 02 768p | video | 210–350 | | | `image-to-video-minimax-live` | MiniMax Video 01 Live | video | 720 | | | `image-to-video-ltx-2-pro` | LTX Video 2.0 Pro (Image to Video) | video | 360–1200 | `image-to-video-ltx-2-pro`, `image-to-video-ltx-2-fast` | | `text-to-video-ltx-2-pro` | LTX Video 2.0 Pro (Text to Video) | video | 360–1200 | `text-to-video-ltx-2-pro`, `text-to-video-ltx-2-fast` | | `image-to-video-pixverse-v6-transition` | PixVerse V6 (Transition) | video | 100–3000 | | | `text-to-video-pixverse-v6` | PixVerse V6 (Text to Video) | video | 100–3000 | | | `image-to-video-pixverse-v5-5-transition` | PixVerse V5.5 (Transition) | video | 500–2000 | | | `text-to-video-pixverse-v5-5` | PixVerse V5.5 (Text to Video) | video | 500–2000 | | | `image-to-video-pixverse-v5` | PixVerse V5 (Image to Video) | video | 500–1600 | | | `image-to-video-pixverse-v5-transition` | PixVerse V5 (Transition) | video | 500–1600 | | | `text-to-video-pixverse-v5` | PixVerse V5 (Text to Video) | video | 500–1600 | | | `image-to-video-runway-4-5` | Runway Gen-4.5 (Image to Video) | video | 1100–2200 | | | `text-to-video-runway-4-5` | Runway Gen-4.5 (Text to Video) | video | 1100–2200 | | | `image-to-video-runway-gen4-turbo` | Runway Gen4 Turbo | video | 500–1000 | | | `video-runway-act-two` | Runway Act Two Character Performance | video | 1000 | | | `video-omni-human-1-5` | OmniHuman 1.5 | video | 1800 | | | `video-vfx` | VFX | video | 300 | | | `video-upscaler-topaz` | Video Upscaler Topaz | video | 150–750 | | | `video-upscaler` | Video Upscaler | video | 100–500 | | | `video-upscaler-precision` | Video Upscaler Precision | video | 100–500 | | | `lip-sync-latent-sync` | Latent Sync | lipsync | 1400 | | | `lip-sync-veed-fabric-1-0-fast` | Veed Fabric 1.0 Fast | lipsync | 1800–3500 | | | `lip-sync-veed-fabric-1-0` | Veed Fabric 1.0 | lipsync | 1400–2600 | | | `text-to-icon` | Icon Generator | icon | 150 | | | `text-to-icon-preview` | Icon Preview | icon | 150 | | | `flux-dev` | Flux Dev | image | 20 | | | `flux-schnell` | Flux Schnell | image | 10 | | | `real-esrgan` | Real-ESRGAN | edit | 8 | | | `p-video-replace` | P-Video Replace | recast | 60 | | | `wan-animate-replace` | Wan 2.2 Animate Replace | recast | 100 | | | `recast` | MiniMax H3 Max Recast | recast | 3000–27000 | | | `pixverse-swap` | Pixverse Swap | recast | 300–800 | | --- # Xide APP MCP server > Let AI assistants (Claude, ChatGPT, Cursor, VS Code, Claude Code) generate images, videos and audio with the user's Xide APP credits. - Server URL: `https://xide.app/api/mcp` (Streamable HTTP, stateless, JSON responses) - Protocol versions: 2025-11-25, 2025-06-18, 2025-03-26, 2024-11-05 - Authentication: OAuth 2.1 (dynamic client registration + PKCE S256) or `Authorization: Bearer xide_live_…` - OAuth discovery: https://xide.app/.well-known/oauth-protected-resource/api/mcp and https://xide.app/.well-known/oauth-authorization-server - Limits: one `tools/call` per HTTP request, batches of up to 10 JSON-RPC messages; the key's scopes and daily credit cap apply to every tool. ## Connect with your account In apps that support connectors, just add the server URL, then pick the permissions and daily cap on the Xide APP consent screen and approve. No key to copy. - Claude (web and desktop): Settings → Connectors → Add custom connector → paste the URL → Connect - ChatGPT: Settings → Apps & Connectors → Advanced → Developer mode → Create → paste the URL, authentication: OAuth The consent screen lets the user choose permissions (generate, read, upload, account) and an optional daily credit cap. The access token is an API key that appears in the user's dashboard and can be revoked any time. ## Configure with a key Cursor, Claude Code and VS Code also open the same consent screen when you add just the URL. To connect with a key instead, copy the configuration. ### Cursor — Add to ~/.cursor/mcp.json ```json { "mcpServers": { "xide": { "url": "https://xide.app/api/mcp", "headers": { "Authorization": "Bearer xide_live_..." } } } } ``` ### Claude Code — Run in your terminal ```bash claude mcp add --transport http xide https://xide.app/api/mcp --header "Authorization: Bearer xide_live_..." ``` ### Claude Desktop — Add to claude_desktop_config.json (requires Node.js) ```json { "mcpServers": { "xide": { "command": "npx", "args": [ "-y", "mcp-remote", "https://xide.app/api/mcp", "--header", "Authorization:${XIDE_AUTH}" ], "env": { "XIDE_AUTH": "Bearer xide_live_..." } } } } ``` ### VS Code — Add to .vscode/mcp.json ```json { "servers": { "xide": { "type": "http", "url": "https://xide.app/api/mcp", "headers": { "Authorization": "Bearer xide_live_..." } } } } ``` ## Tools ### list_models List the AI models available on Xide APP (image generation, image editing, video, audio, lip-sync, icons, utilities) with ids and estimated credit ranges. Use get_model to see a model's inputs. Scope: `read` | Argument | Type | Required | Description | |---|---|---|---| | category | image \| edit \| video \| audio \| lipsync \| icon \| utility \| recast | no | Only models of this category. | | search | string | no | Filter by id or name, e.g. "kling" or "flux". | | limit | integer (1–100) | no | Maximum number of models to return (default 40). | ### get_model Get a model's inputs (types, required fields, allowed values, defaults), estimated credit range and resolution variants. Scope: `read` | Argument | Type | Required | Description | |---|---|---|---| | model | string | yes | Model id from list_models, e.g. "text-to-image-flux-2-pro". Resolution variants have their own ids (see get_model). | ### estimate_cost Return the exact number of credits a generation with these inputs will cost, and the current balance. Does not spend credits. Scope: `read` | Argument | Type | Required | Description | |---|---|---|---| | model | string | yes | Model id from list_models, e.g. "text-to-image-flux-2-pro". Resolution variants have their own ids (see get_model). | | inputs | object | no | Model inputs as returned by get_model, e.g. { "prompt": "...", "aspect_ratio": "16:9" }. | ### generate Start a generation with a model and inputs (spends credits). Waits up to wait_seconds (default 40) and returns the outputs with links; if the job is still running it returns a job_id to check with get_job. Scope: `generate` | Argument | Type | Required | Description | |---|---|---|---| | model | string | yes | Model id from list_models, e.g. "text-to-image-flux-2-pro". Resolution variants have their own ids (see get_model). | | inputs | object | yes | Model inputs as returned by get_model, e.g. { "prompt": "...", "aspect_ratio": "16:9" }. | | wait_seconds | integer (0–45) | no | Seconds to wait for the job to finish (0-45). Default 40. | ### get_job Get a job's status and outputs. Optionally wait up to wait_seconds for it to finish. Scope: `read` | Argument | Type | Required | Description | |---|---|---|---| | job_id | string | yes | Job id returned by generate. | | wait_seconds | integer (0–45) | no | Seconds to wait for the job to finish (0-45). Default 0. | ### cancel_job Cancel a job that is still queued; its credits are refunded. Jobs that are already processing can't be canceled. Scope: `generate` | Argument | Type | Required | Description | |---|---|---|---| | job_id | string | yes | Job id returned by generate. | ### list_jobs List the user's most recent jobs (newest first), optionally filtered by status. Scope: `read` | Argument | Type | Required | Description | |---|---|---|---| | limit | integer (1–50) | no | Number of jobs (default 10). | | status | queued \| processing \| completed \| failed \| cancelled | no | Only jobs with this status. | ### get_balance Get the credit balance, this API key's scopes and daily credit cap, and today's usage. Scope: `account` ### upload_from_url Fetch an image, video or audio file from a public https URL into the user's Xide uploads and return an upload_id to use as a media input. Scope: `upload` | Argument | Type | Required | Description | |---|---|---|---| | url | string | yes | Public https URL of the file (max 256 MB). | ## Safety Your key's permissions also apply to the assistant: a key without the "Generate" permission can't spend credits. We recommend a daily credit cap on keys you give to assistants.