Models & limits
Machine-readable catalog of every model available to you, with the constraints each one enforces. Read it instead of hard-coding limits: the values come from the same place the request path validates against, so they cannot drift from what a call will actually accept.
This matters because the limits are **not uniform**. Models differ in which `size` presets they take and which one is the default, in the window for an explicit `WxH`, in how many reference and output images a request may carry, and in whether they can produce a connected series at all. Before this endpoint the only ways to find out were reading this page or triggering a `400`.
GET /v1/models
Every model you can call, and the limits it enforces.
Each image entry tells you: `sizePresets` — exactly the presets accepted in `size` (anything else is a `400 validation_error` before any debit), with `defaultSize` the one applied when you omit `size`; `explicitSize` — the bounds for an explicit `WxH`, where the pixel budget (on width × height) and the aspect ratio must BOTH hold, and where `minSide`/`maxSide` are present each side must also fall inside them; `capabilities.sequential` — whether `sequential: "auto"` is accepted, and when it is false you ask for several independent images with `n` or with several requests; `maxReferences` — the reference cap, where `0` means the model is text-to-image only and refuses `references`; and `maxImagesPerRequest` — the ceiling on `n` (references do not count against it), and on a model that supports `sequential` also the ceiling on `references + sequentialOptions.maxImages`, because one call carries both.
Video entries carry `resolutions` with the `defaultResolution` applied when you omit it (it affects the per-second rate), the accepted `durationSec` range with its default, and `requiresImage` for image-to-video models.
**Pricing is deliberately absent.** Every entry states its billing *shape* — `per_image` or `per_second` — but never a rate. Rates change without an API release, so a cached catalog could quote a stale number; live rates are in the dashboard.
Only models this deployment can actually dispatch to are listed, so an entry appearing here is usable right now. The list is short and changes rarely — fetch it once at startup and cache it for the process lifetime rather than on every request.
# Request
curl https://api.xmode.ai/v1/models \
-H "Authorization: Bearer xm_live_<your-key>"
# 200 OK
{
"data": [
{
"id": "xSD4.5",
"type": "image",
"endpoint": "POST /v1/generations",
"sizePresets": [
"2K",
"4K"
],
"defaultSize": "2K",
"explicitSize": {
"minTotalPixels": 3686400,
"maxTotalPixels": 16777216,
"minAspectRatio": 0.0625,
"maxAspectRatio": 16
},
"aspectRatios": [
"auto",
"square",
"landscape",
"portrait"
],
"maxReferences": 10,
"maxImagesPerRequest": 15,
"capabilities": {
"sequential": true
},
"billing": "per_image"
},
{
"id": "xSD5Pro",
"type": "image",
"endpoint": "POST /v1/generations",
"sizePresets": [
"1K",
"1.5K",
"2K"
],
"defaultSize": "2K",
"explicitSize": {
"minTotalPixels": 921600,
"maxTotalPixels": 4624220,
"minAspectRatio": 0.0625,
"maxAspectRatio": 16
},
"aspectRatios": [
"auto",
"square",
"landscape",
"portrait"
],
"maxReferences": 10,
"maxImagesPerRequest": 15,
"capabilities": {
"sequential": false
},
"billing": "per_image"
},
{
"id": "xQI3Pro",
"type": "image",
"endpoint": "POST /v1/generations",
"sizePresets": [
"1K",
"1.5K",
"2K"
],
"defaultSize": "2K",
"explicitSize": {
"minTotalPixels": 262144,
"maxTotalPixels": 4194304,
"minAspectRatio": 0.125,
"maxAspectRatio": 8
},
"aspectRatios": [
"auto",
"square",
"landscape",
"portrait"
],
"maxReferences": 3,
"maxImagesPerRequest": 6,
"capabilities": {
"sequential": false
},
"billing": "per_image"
},
{
"id": "xZI1.0Pro",
"type": "image",
"endpoint": "POST /v1/generations",
"sizePresets": [
"1K",
"2K"
],
"defaultSize": "1K",
"explicitSize": {
"minTotalPixels": 65536,
"maxTotalPixels": 6553600,
"minAspectRatio": 0.1,
"maxAspectRatio": 10,
"minSide": 256,
"maxSide": 2560
},
"aspectRatios": [
"auto",
"square",
"landscape",
"portrait"
],
"maxReferences": 0,
"maxImagesPerRequest": 1,
"capabilities": {
"sequential": false
},
"billing": "per_image"
},
{
"id": "xW2.7S",
"type": "video",
"endpoint": "POST /v1/videos",
"resolutions": [
"720p",
"1080p"
],
"defaultResolution": "1080p",
"durationSec": {
"min": 2,
"max": 15,
"default": 5
},
"requiresImage": true,
"billing": "per_second"
},
{
"id": "xW3.0s",
"type": "video",
"endpoint": "POST /v1/videos",
"resolutions": [
"480p",
"720p",
"1080p"
],
"defaultResolution": "1080p",
"durationSec": {
"min": 2,
"max": 30,
"default": 5
},
"requiresImage": false,
"inputModes": [
"first_frame",
"last_frame",
"reference_images",
"reference_videos",
"reference_audios"
],
"maxReferenceImages": 10,
"maxReferenceVideos": 5,
"maxReferenceAudios": 5,
"ratios": [
"adaptive",
"16:9",
"4:3",
"1:1",
"3:4",
"9:16"
],
"defaultRatio": "adaptive",
"referenceVideoMaxSeconds": 15,
"maxCombinedSeconds": 30,
"billing": "per_second"
},
{
"id": "xW3.0sPro",
"type": "video",
"endpoint": "POST /v1/videos",
"resolutions": [
"1080p",
"2k",
"4k"
],
"defaultResolution": "1080p",
"durationSec": {
"min": 2,
"max": 30,
"default": 5
},
"requiresImage": false,
"inputModes": [
"first_frame",
"last_frame",
"reference_images",
"reference_videos",
"reference_audios"
],
"maxReferenceImages": 10,
"maxReferenceVideos": 5,
"maxReferenceAudios": 5,
"ratios": [
"adaptive",
"16:9",
"4:3",
"1:1",
"3:4",
"9:16"
],
"defaultRatio": "adaptive",
"referenceVideoMaxSeconds": 15,
"maxCombinedSeconds": 30,
"billing": "per_second"
}
]
}