Text-to-Video v2
Overview
The Luma AI Dream Machine API allows developers to generate and extend AI-generated videos based on text prompts.
Each video generation/extend costs 500 000 AI/ML Tokens.
Setup your API Key
If you don’t have an API key for the AI/ML API yet, feel free to use our Quickstart guide.
How to Make a Call
API Schemas
Generate video
loop
parameter controls if the generated video will be looped.
false
ray-1-6
Possible values: POST /v2/generate/video/luma-ai/generation HTTP/1.1
Host: api.aimlapi.com
Authorization: Bearer <YOUR_AIMLAPI_KEY>
Content-Type: application/json
Accept: */*
Content-Length: 350
{
"generation_type": "video",
"prompt": "text",
"aspect_ratio": "1:1",
"loop": false,
"keyframes": {
"frame0": {
"type": "generation",
"id": "123e4567-e89b-12d3-a456-426614174000"
},
"frame1": {
"type": "generation",
"id": "123e4567-e89b-12d3-a456-426614174000"
}
},
"callback_url": "https://example.com",
"model": "ray-1-6",
"resolution": null,
"duration": "text",
"concepts": "text"
}
No content
Fetch generation
After sending a request for video generation, this task is added to the queue. Based on the service's load, the generation can be completed in seconds or take a bit more. Here are the API details to wait for a certain video generation state.
Each state has its own priority, described below:
queued
->dreaming
->completed
->failed
If the video state reaches any higher-priority state than you requested, then the result is immediately returned. For example, if you are waiting for the completed
state and your request fails (reaching the failed
state), then the result is immediately returned with the current error state.
If video generation takes too long, it can reach a timeout of 30 seconds. In such cases, the result returns with the current actual state. This polling allows you to request it again and wait for the needed state.
GET /v2/generate/video/luma-ai/generation HTTP/1.1
Host: api.aimlapi.com
Authorization: Bearer <YOUR_AIMLAPI_KEY>
Accept: */*
No content
Example: Fetch Single Generation
For example, if you are waiting for video dreaming (when the video is popped from the queue and generation is in processing), then you can send the following request:
import requests
def main():
response = requests.get(
"https://api.aimlapi.com/v2/generate/video/luma-ai/generation",
params={
"generation_id": "755f9bbb-d99b-4880-992b-f05244ddba61",
"status": "dreaming"
},
headers={
"Authorization": "Bearer <YOUR_AIMLAPI_KEY>",
"Content-Type": "application/json",
},
)
response.raise_for_status()
data = response.json()
print("Generation:", data)
if __name__ == "__main__":
main()
If you are waiting for a video to be fully generated, you can wait for the completed
state in the same way as described above.
Fetch Multiple Generations
Instead of using the generation_id
parameter, you will pass generation_ids
, which can be an array of IDs. This parameter can also accept IDs separated by commas.
GET /v2/generate/video/luma-ai/generations HTTP/1.1
Host: api.aimlapi.com
Authorization: Bearer <YOUR_AIMLAPI_KEY>
Accept: */*
No content
Example: Fetch Multiple Generations
import requests
def main():
response = requests.get(
"https://api.aimlapi.com/v2/generate/video/luma-ai/generations",
params={
"generation_ids[]": "755f9bbb-d99b-4880-992b-f05244ddba61",
"status": "streaming",
},
headers={
"Authorization": "Bearer <YOUR_AIMLAPI_KEY>",
"Content-Type": "application/json",
},
)
response.raise_for_status()
data = response.json()
print("Generation:", data)
if __name__ == "__main__":
main()
Example: Fetch Multiple Generations
import requests
def main():
url = "https://api.aimlapi.com/v2/generate/video/luma-ai/generation"
payload = {
"prompt": "Flying jellyfish",
"aspect_ratio": "16:9"
}
headers = {
"Authorization": "Bearer <YOUR_AIMLAPI_KEY>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print("Generation:", response.json())
if __name__ == "__main__":
main()
Extend video
You can extend a video using an existing video you generated before (using its generation ID) or by using an image (via URL). The extension can be done by appending to or prepending from the original content.
The keywords
parameter controls the following extensions. It can include parameters for defining frames:
first frame (
frame0
)last frame (
frame1
)
For example, if you want to use an image as a reference for a frame:
{
"keyframes": {
"frame0": {
"type": "image",
"url": "https://example.com/image1.png"
}
}
}
Or, in the case of using a previously generated video:
{
"keyframes": {
"frame1": {
"type": "generation",
"id": "0f3ea4aa-10e7-4dae-af0b-263ab4ac45f9"
}
}
}
false
ray-1-6
Possible values: POST /v2/generate/video/luma-ai/generation HTTP/1.1
Host: api.aimlapi.com
Authorization: Bearer <YOUR_AIMLAPI_KEY>
Content-Type: application/json
Accept: */*
Content-Length: 350
{
"generation_type": "video",
"prompt": "text",
"aspect_ratio": "1:1",
"loop": false,
"keyframes": {
"frame0": {
"type": "generation",
"id": "123e4567-e89b-12d3-a456-426614174000"
},
"frame1": {
"type": "generation",
"id": "123e4567-e89b-12d3-a456-426614174000"
}
},
"callback_url": "https://example.com",
"model": "ray-1-6",
"resolution": null,
"duration": "text",
"concepts": "text"
}
No content
Examples
Ensure you replace <YOUR_AIMLAPI_KEY>
with your actual API key before running the code.
Extension with the Image
import requests
def main()
url = "https://api.aimlapi.com/v2/generate/video/luma-ai/generation"
payload = {
"prompt": "Flying jellyfish",
"aspect_ratio": "16:9",
"keyframes": {
"frame0": {
"type": "image",
"url": "https://example.com/image1.png"
}
}
}
headers = {
"Authorization": "Bearer <YOUR_AIMLAPI_KEY>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print("Generation:", response.json())
if __name__ == "__main__":
main()
Extension with the Generation
import requests
def main()
url = "https://api.aimlapi.com/v2/generate/video/luma-ai/generation"
payload = {
"prompt": "Flying jellyfish",
"aspect_ratio": "16:9",
"keyframes": {
"frame0": {
"type": "generation",
"id": "0f3ea4aa-10e7-4dae-af0b-263ab4ac45f9"
}
}
}
headers = {
"Authorization": "Bearer <YOUR_AIMLAPI_KEY>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print("Generation:", response.json())
if __name__ == "__main__":
main()
Last updated
Was this helpful?