Skip to main content
Material is your raw input: a recording, a screen capture, a clip. It is yours; templates never alter it, they derive from it. A run’s material field takes one of the following.

A public https URL (simplest)

Pass a public https:// URL as material and we fetch it server-side (with SSRF guards). No upload step needed:

An upload ticket (for local files)

Uploading is two calls: mint a one-time ticket, then post the file to it. The file call needs no API key, because the ticket is its own single-use credential.
Pass the returned material handle (mat_…) as the run’s material. (The uploadUrl in the ticket response is a browser path for humans to drop a file in; from a shell, ignore it and use the /file endpoint above.) Poll a ticket any time with GET /v1/uploads/{ticket}; its status goes pending → uploaded, and material is set once the file lands.

Via MCP

The connector’s upload tools drive the same ticket flow for files on the agent’s machine, including large-file handling.

What templates check

Each template declares what material it accepts (kind, duration bounds, orientation, content requirements like “one person, front-facing”). The check runs before the pipeline and before any charge: a mismatch comes back as a typed refusal, not a failed render.