Skip to content

Get a generation

generations.get(generation_id) -> Generation
GET/generations/{generation_id}

Poll for generation status and output. On completion, the response includes presigned URLs to download the generated images. When usage reporting is enabled, usage.credits_charged carries the credits actually charged once billing settles, which can be after the generation reaches a terminal state. Poll with backoff up to a cutoff you choose; some generations keep a null charge permanently.

Parameters
generation_id: str
format: uuid
Returns
class Generation: …

Generation status and output

id: str

Generation identifier

format: uuid
created_at: str

Creation timestamp

model: Model

Model used

One of the following:
"uni-1"
"uni-1-max"
"ray-3.2"
state: Literal["queued", "processing", "completed", "failed"]

Current state of the generation

One of the following:
"queued"
"processing"
"completed"
"failed"
type: Literal["image", "image_edit", "video", 3 more]

The kind of generation to perform

One of the following:
"image"
"image_edit"
"video"
"video_edit"
"video_reframe"
"layering"
failure_code: Optional[GenerationFailureCode]

Machine-readable failure code for programmatic handling

One of the following:
"content_moderated"
"generation_failed"
"budget_exhausted"
"output_not_found"
"image_too_large"
"unsupported_format"
"corrupt_input"
"invalid_request"
"rate_limited"
failure_reason: Optional[str]

Human-readable failure description

output: Optional[List[GenerationOutput]]

Generated outputs (populated on completion)

type: str

Media type (e.g. image, video)

url: str

Presigned URL (1hr expiry)

format: uri
layer: Optional[Layer]

Per-layer semantics for a type=layering output

alpha_hint: str

Edge treatment of the layer's transparency — soft (hair/fur/glass), hard (solid edges), or none (the opaque background)

description: str

Complete-element caption for the layer's content

index: int

Layer position, front-to-back; the last layer is the background

label: str

Short (1-2 word) layer name

bounds: Optional[LayerBounds]

Where a layer's returned pixels sit inside the full composite frame. Layer images are cropped to their visible-alpha bounding box, so layers of one stack have differing pixel dimensions. Composite onto a transparent canvas_width x canvas_height image by pasting each layer at (x, y), iterating the output list in reverse (back-to-front), to reconstruct the source frame.

canvas_height: int

Height of the full composite canvas the layers reassemble into

canvas_width: int

Width of the full composite canvas the layers reassemble into

height: int

Pixel height of the returned layer image

width: int

Pixel width of the returned layer image

x: int

Left offset of this layer's pixels within the composite canvas

y: int

Top offset of this layer's pixels within the composite canvas

contains_text: Optional[bool]

Whether the layer was planned as typeset text (a headline, caption, or label) rather than an image element. Null when not reported for this generation.

text: Optional[LayerText]

The text on one live-text layer, as a string plus how it is styled. Placement is the owning layer's bounds — the text fills that box.

content: str

The text as shown, preserving capitalization; one line per line (newline-separated)

decorated: Optional[bool]

True when the lettering is ornamental (outlines, patterned fills, bevels, drop shadows), so plain typeset text will not reproduce its look.

font: Optional[LayerTextFont]

Described letterform traits of a text layer — enough to pick a matching font.

category: Literal["sans serif", "serif", "slab serif", 6 more]

Letterform style

One of the following:
"sans serif"
"serif"
"slab serif"
"display sans"
"display serif"
"display slab"
"display decorative"
"handwriting"
"monospace"
families: List[str]

Up to three Google Fonts family names that resemble the lettering, closest first. Empty when none of the offered families fit.

italic: bool

Whether the letters are slanted or cursive

weight: Literal["thin", "light", "regular", 3 more]

Stroke weight

One of the following:
"thin"
"light"
"regular"
"medium"
"bold"
"black"
width: Literal["condensed", "normal", "wide"]

Letter width for its height

One of the following:
"condensed"
"normal"
"wide"
match: Optional[LayerTextFontMatch]

The font in your font catalog that the lettering matches, so you can re-set the text in it. Absent when no catalog font matches closely enough, or matching is not enabled. The image itself is not rendered in this font.

face_id: str

Typed ref of the matched face (one weight and style), font_face:

family_id: str

Typed ref of the matched font family, font_family:

family_name: str

Name of the matched font family

style: Literal["normal", "italic"]

Style of the matched face

One of the following:
"normal"
"italic"
weight: int

CSS font weight of the matched face, e.g. 400 or 700

usage: Optional[GenerationUsage]

What one generation actually cost, as billing settled it

credits_charged: int

Credits actually charged for this generation. Null until billing has settled it; a confirmed no-charge outcome is 0. Stays null for a generation whose charge could not be confirmed, including ones settled before this field existed. Never an estimate or the reserved amount.

minimum: 0

Get a generation

import os
from luma_agents import Luma
client = Luma(
auth_token=os.environ.get("LUMA_AGENTS_API_KEY"), # This is the default and can be omitted
)
generation = client.generations.get(
"182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
)
print(generation.id)
200 example
{
"id": "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
"created_at": "created_at",
"model": "uni-1",
"state": "queued",
"type": "image",
"failure_code": "content_moderated",
"failure_reason": "failure_reason",
"output": [
{
"type": "type",
"url": "https://example.com",
"layer": {
"alpha_hint": "alpha_hint",
"description": "description",
"index": 0,
"label": "label",
"bounds": {
"canvas_height": 0,
"canvas_width": 0,
"height": 0,
"width": 0,
"x": 0,
"y": 0
},
"contains_text": true,
"text": {
"content": "content",
"decorated": true,
"font": {
"category": "sans serif",
"families": [
"string"
],
"italic": true,
"weight": "thin",
"width": "condensed",
"match": {
"face_id": "face_id",
"family_id": "family_id",
"family_name": "family_name",
"style": "normal",
"weight": 0
}
}
}
}
}
],
"usage": {
"credits_charged": 0
}
}
Returns Examples
200 example
{
"id": "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
"created_at": "created_at",
"model": "uni-1",
"state": "queued",
"type": "image",
"failure_code": "content_moderated",
"failure_reason": "failure_reason",
"output": [
{
"type": "type",
"url": "https://example.com",
"layer": {
"alpha_hint": "alpha_hint",
"description": "description",
"index": 0,
"label": "label",
"bounds": {
"canvas_height": 0,
"canvas_width": 0,
"height": 0,
"width": 0,
"x": 0,
"y": 0
},
"contains_text": true,
"text": {
"content": "content",
"decorated": true,
"font": {
"category": "sans serif",
"families": [
"string"
],
"italic": true,
"weight": "thin",
"width": "condensed",
"match": {
"face_id": "face_id",
"family_id": "family_id",
"family_name": "family_name",
"style": "normal",
"weight": 0
}
}
}
}
}
],
"usage": {
"credits_charged": 0
}
}