Upload and save media
Saving new media is a three-step process:- Create a source with
POST /v1/sources. - Upload the file bytes to the returned
uploadUrlbefore it expires. - Save the returned
sourceIdwithPOST /v1/library.
Create a source
Includewidth and height for an image or video. Include duration in seconds for a video or audio file.
sourceId, an uploadUrl, and the time when that upload URL expires.
Upload the file
Upload the original file as a singlePUT request. Common image, video, and audio formats are accepted.
Check processing
Video and audio sources start converting as soon as the upload finishes. PollGET /v1/sources/{sourceId} every few seconds until its status is ready. While conversion is in progress, previews may answer not-ready.
Add the source to the library
Useprivate for media only you can access, or workspace to share it with everyone in your workspace. If you omit scope, the item is saved to your private library.
type to verify the expected type; the request fails if it does not match the source.
Adding items to a workspace library requires an owner or member role. Workspace viewers can list shared items but cannot add or remove them.
Capture a page or social post
UsePOST /v1/library/screenshots to capture a public web page or a single post on X, Instagram, LinkedIn or TikTok:
{item: ...}. The private library item includes a sourceId for overlays or layout media; there is nothing to upload or poll. Stills have type image. Set scroll to true to record a web page as video instead; social posts always produce stills. Private pages and social profiles or feeds are not supported.
Reuse the same Idempotency-Key when retrying the same request, and use a new key when you want a new capture.
List saved media
List the private and workspace libraries separately by setting the requiredscope query parameter:
image, video, screenshot, sound-effect, music, or lut. Editor-created screenshot items expose a hosted url but no sourceId; use the capture endpoint below to create placeable media from the original URL. When the response includes a cursor, pass it in the next request and continue until no cursor is returned.
limit is a target page size. A response can contain slightly more items because Tella reads a storage page before filtering unavailable items. Follow cursor rather than relying on the item count.Browse curated sound effects
Setscope to default to list the same curated sound effects available in the editor:
presetId, category, durationMs, and a public url you can use to preview the audio. The catalog is returned as one page without a cursor.
Use the presetId to add an effect to a clip without creating or uploading a source:
presetId or sourceId. Use the item’s durationMs to play the full effect.
Browse curated background music
Setscope to default and type to music to list the same curated tracks available in the editor’s background music panel:
presetId, category (Calm, Energetic, Focused or Playful), durationMs, and a public url you can use to preview the track. Omitting type returns sound effects and music together.
Use the presetId to set the video’s background music without creating or uploading a source:
presetId or sourceId. The track’s name defaults to the preset’s name.
The default catalog contains sound effects and music only and is read-only. Use
private or workspace when adding or removing your own library items.Bring in images from Pinterest, Are.na and mymind
Once you connect Pinterest, Are.na or mymind under Settings → Connections (see Add saved images from Pinterest, Are.na and mymind), you can list the images you saved there and copy one into Tella. Setscope to pinterest, arena or mymind. Add query to search your saves, or omit it for your newest ones:
cursor. Each item’s id is the service’s own ID, and items include the link the save points to. mymind items also include its summary and tags, and a saved web page or article comes back as a screenshot.
To use one, bring it into Tella with from and the item’s id as sourceId:
sourceId to an overlay or a layout’s media like any other image. scope defaults to private; video saves the image to the library of the video named by videoId, which needs edit access to that video.
Only images can be brought in: Pinterest image pins, Are.na image blocks, and mymind images or the screenshot mymind took of a saved page. A service you haven’t connected returns 503 unavailable.
Reuse a library item
Items added through the API include asourceId. Pass it to any compatible endpoint, including clips, layouts, overlays, backgrounds, and sound effects. API-added images also include a hosted url, but use their sourceId when placing them in a video.
Images uploaded in the editor may return only a hosted url. Without a sourceId, those images can be used in the editor but cannot be placed through the public API. Saved videos, sound effects and AI-generated items include a sourceId; curated sound effects and music tracks use presetId instead. Music and LUT items saved from the editor return a hosted URL instead of a source ID.
Generate media with AI
When there is nothing to upload, generate it.POST /v1/library/generations starts the same AI image or sound effect generator the editor’s media panels use, and saves the result as a private library item.
202 Accepted with a generation whose id is the library item being filled in, plus your weekly allowance (limit, remaining, resetAt). Pass "type": "sound-effect" for a sound effect. For an image, an optional referenceSourceId — the sourceId of an image source you uploaded, or of an image library item — guides the generation, and model picks sunburst (the default, most capable) or flare (faster).
Generation is asynchronous. Poll GET /v1/library/generations/{id} every few seconds (images usually take 30-90 seconds, sound effects 10-30) until status is completed:
completed, generation.item is the finished library item. Pass its sourceId anywhere a source is accepted — an image overlay, a layout’s b-roll media, or a clip’s sound effects — and it also appears in GET /v1/library?scope=private.
On failed, generation.error provides a sanitized, human-readable reason. It may identify a content-safety rejection or timeout, or report a generic failure. Do not parse this text for machine handling. A failed generation cannot be resumed, so start a new one.
Each generation counts against your plan’s weekly AI generation allowance, the same one the editor uses. Once it is exhausted the endpoint answers
403 with the reset time in the message.Remove a library item
Pass both the library item ID and its scope:Library API reference
Review all request parameters and response fields for the library endpoints.