curl --request POST \
--url https://api.mage.space/v1/grok_video/generate \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"prompt": "A slow push-in on a lighthouse at dusk, waves breaking below",
"grok_video_aspect_ratio": "16:9",
"duration": "5"
}
'import requests
url = "https://api.mage.space/v1/grok_video/generate"
payload = {
"prompt": "A slow push-in on a lighthouse at dusk, waves breaking below",
"grok_video_aspect_ratio": "16:9",
"duration": "5"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
prompt: 'A slow push-in on a lighthouse at dusk, waves breaking below',
grok_video_aspect_ratio: '16:9',
duration: '5'
})
};
fetch('https://api.mage.space/v1/grok_video/generate', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"request_id": "d7e6c0f3-6699-4f6c-bb45-2ad7fd9158ff",
"status": "in_progress",
"architecture": "grok_video",
"model_id": "grok-imagine-video",
"created_at": "2026-09-17T14:52:48.000Z",
"updated_at": "2026-09-17T14:52:49.000Z",
"billing": {
"mode": "gems",
"gems_charged": 375
},
"result": null,
"error": null,
"status_url": "https://api.mage.space/v1/requests/d7e6c0f3-6699-4f6c-bb45-2ad7fd9158ff/status",
"cancel_url": "https://api.mage.space/v1/requests/d7e6c0f3-6699-4f6c-bb45-2ad7fd9158ff/cancel"
}{
"error": {
"code": "invalid_config",
"message": "`resolution` must be one of: 768P, 2K."
}
}{
"error": {
"code": "unauthorized",
"message": "The API key is invalid or has been revoked."
}
}{
"error": {
"code": "insufficient_gems",
"message": "This generation costs 40 gems and the account balance is too low.",
"request_id": "d7e6c0f3-6699-4f6c-bb45-2ad7fd9158ff",
"gems_required": 40
}
}{
"error": {
"code": "content_blocked",
"message": "The request was blocked by Mage's content policy.",
"request_id": "d7e6c0f3-6699-4f6c-bb45-2ad7fd9158ff"
}
}{
"error": {
"code": "architecture_retired",
"message": "This architecture has been retired.",
"request_id": "d7e6c0f3-6699-4f6c-bb45-2ad7fd9158ff"
}
}{
"error": {
"code": "too_many_requests",
"message": "At most 20 generations may be in flight at once for this account; 20 are running now."
}
}{
"error": {
"code": "content_blocked",
"message": "The request was blocked by an external content restriction.",
"request_id": "d7e6c0f3-6699-4f6c-bb45-2ad7fd9158ff"
}
}{
"error": {
"code": "internal_error",
"message": "Something went wrong on our side. Retry, and contact support if it persists."
}
}Grok Video
Generate video with Grok Video through the Mage API: the fields of POST /v1/grok_video/generate, its options by model, the rules it enforces, and its gem price.
curl --request POST \
--url https://api.mage.space/v1/grok_video/generate \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"prompt": "A slow push-in on a lighthouse at dusk, waves breaking below",
"grok_video_aspect_ratio": "16:9",
"duration": "5"
}
'import requests
url = "https://api.mage.space/v1/grok_video/generate"
payload = {
"prompt": "A slow push-in on a lighthouse at dusk, waves breaking below",
"grok_video_aspect_ratio": "16:9",
"duration": "5"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
prompt: 'A slow push-in on a lighthouse at dusk, waves breaking below',
grok_video_aspect_ratio: '16:9',
duration: '5'
})
};
fetch('https://api.mage.space/v1/grok_video/generate', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"request_id": "d7e6c0f3-6699-4f6c-bb45-2ad7fd9158ff",
"status": "in_progress",
"architecture": "grok_video",
"model_id": "grok-imagine-video",
"created_at": "2026-09-17T14:52:48.000Z",
"updated_at": "2026-09-17T14:52:49.000Z",
"billing": {
"mode": "gems",
"gems_charged": 375
},
"result": null,
"error": null,
"status_url": "https://api.mage.space/v1/requests/d7e6c0f3-6699-4f6c-bb45-2ad7fd9158ff/status",
"cancel_url": "https://api.mage.space/v1/requests/d7e6c0f3-6699-4f6c-bb45-2ad7fd9158ff/cancel"
}{
"error": {
"code": "invalid_config",
"message": "`resolution` must be one of: 768P, 2K."
}
}{
"error": {
"code": "unauthorized",
"message": "The API key is invalid or has been revoked."
}
}{
"error": {
"code": "insufficient_gems",
"message": "This generation costs 40 gems and the account balance is too low.",
"request_id": "d7e6c0f3-6699-4f6c-bb45-2ad7fd9158ff",
"gems_required": 40
}
}{
"error": {
"code": "content_blocked",
"message": "The request was blocked by Mage's content policy.",
"request_id": "d7e6c0f3-6699-4f6c-bb45-2ad7fd9158ff"
}
}{
"error": {
"code": "architecture_retired",
"message": "This architecture has been retired.",
"request_id": "d7e6c0f3-6699-4f6c-bb45-2ad7fd9158ff"
}
}{
"error": {
"code": "too_many_requests",
"message": "At most 20 generations may be in flight at once for this account; 20 are running now."
}
}{
"error": {
"code": "content_blocked",
"message": "The request was blocked by an external content restriction.",
"request_id": "d7e6c0f3-6699-4f6c-bb45-2ad7fd9158ff"
}
}{
"error": {
"code": "internal_error",
"message": "Something went wrong on our side. Retry, and contact support if it persists."
}
}| Detail | |
|---|---|
| Type | Video |
| Models | grok-imagine-video (Grok Video, default) |
| Image inputs | image (reference image), additional_images (additional reference images) |
| Video inputs | video (source video) |
| Gems | 375 at the default settings |
| Model page | Grok Image and Grok Video |
Rules
A request that breaks one of these is refused with400 invalid_config before any gems are charged.
- A source video must be at most 8.7 seconds and cannot be combined with reference images.
- Up to 5 reference images, which cap the clip at 10 seconds.
billing.gems_charged, and the balance at GET /v1/account.Authorizations
An API key from Settings → API, sent as Authorization: Bearer mage_sk_…. Keys are for server-side code only.
Headers
A key of your choosing, 1 to 255 characters, scoped to your API key. A retried submit with the same key returns the original request with 200 instead of charging again. The key identifies the first submission made with it; later bodies are not compared. A refusal recorded under the key (its envelope carries request_id) replays the same way, so a new attempt needs a new key.
1 - 255Body
A partial config for Grok Video.
The text prompt.
1Integer seed for reproducible output; omit or send null for a random seed.
The model variant to generate with.
grok-imagine-video Aspect ratio token.
1:1, 16:9, 9:16, 4:3, 3:4, 3:2, 2:3 Output resolution token.
480p, 720p Clip length in seconds, as a token.
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 The reference image. An https URL or a data URL.
Additional reference images. Each an https URL or a data URL.
The source video. An https URL or a data URL.
Response
The request was accepted; poll status_url for the result. A retried submit whose Idempotency-Key was used before answers 200 with the same shape, the original request, and charges nothing.
The request id, also the id in status_url and cancel_url.
queued and in_progress are live; completed, failed, and cancelled are final.
queued, in_progress, completed, failed, cancelled The architecture the request generates with.
The model variant, when the architecture has variants.
When the request was accepted.
When the request last changed.
Show child attributes
Show child attributes
The output once status is completed, else null.
Show child attributes
Show child attributes
Why the request failed once status is failed, else null.
Show child attributes
Show child attributes
Poll this URL for the request.
POST to this URL to stop the request.

