Installation
Quick start
Upload local media withclient.uploads.upload_file(...) first, then pass the returned source_url below. It picks its route by size: files up to 256 KB go inline in one request (the only route available when outbound access to storage.googleapis.com is blocked), larger ones go straight to storage in resumable chunks, each retried on its own, so a dropped connection costs one chunk rather than the file. See Uploading media.
API coverage
The project loop is the recommended path for agents:
create → apply_ops → preview
(free, non-billable) → render (the single billable step). AsyncFramelane exposes the same
resources with await.
renders.create, projects.render and projects.create return a job (or project) plus an
advisory ok / violations lint of the composition — RenderSubmitOut and
ProjectCreated. The render is already dispatched and the project already stored when you
read them, so they are a receipt, not a gate; gate on the free
previews.create(render_request=..., dry_run=True) instead. Job reads (renders.get /
list / cancel) return a plain JobOut with no lint.
Iterate every item across all pages with framelane.auto_paginate (or auto_paginate_async):

