Film a publicly reachable web page in a 3D device mockup and register the finished video in the social media library. Renders are asynchronous — POST returns pending jobs, poll GET /api/v1/social/video/{renderId} until done, then attach the asset id to a draft. Credits are charged at enqueue and refunded on failure.
How it works
Unlike every other media route, website renders take minutes. The page is loaded in a real browser, filmed in a 3D scene, and encoded by a render farm — not by a generative model. The flow is:
GET lists available presets and recent renders for the org
POST quotes (with estimateOnly) or enqueues a render — returns 202 with pending jobs
GET{renderId} polls until done (carries the library asset) or error (credits refunded)
The page must be publicly reachable — content behind a login cannot be filmed. A second cut of the same URL reuses the browser capture unless you pass recapture: true.Pricing: Frametic bills in render units (50 AI credits per unit). Full HD = 1 unit, QHD = 2, 4K = 3; clips longer than ten seconds double. A typical Full HD cut costs far less than a five-second AI video clip because this is deterministic capture, not model inference.MCP tools: aveiro_video_list_presets, aveiro_video_create_mockup, aveiro_video_get.
List presets and renders
GET /api/v1/social/video
Authorization: Bearer av_live_…
Required scope:social:write
Returns { renders, presets, available }. When Frametic is not configured on the deployment, available is false and both arrays are empty.
Each render includes id, sourceUrl, status (pending, done, or error), assetId (set when done), credits, and error (when failed).
Presets (presets) are bundle ids that produce several cuts in one enqueue — e.g. a vertical and a square cut for social, or a 4K landscape hero.
Preset id from GET; omit for a single landscape cut
durationSec
no
Length in seconds (2–60); over 10s doubles the unit cost
still
no
Render one frame instead of a video — far cheaper
recapture
no
Re-film the page even when a capture exists (site changed)
estimateOnly
no
Return the credit cost without starting or charging
When estimateOnly is true, returns 200:
Otherwise returns 202:
Credits are debited at enqueue. Failed renders refund exactly what was charged.
Poll one render
GET /api/v1/social/video/{renderId}
Authorization: Bearer av_live_…
Required scope:social:write
Returns { render: { …, asset: { id, url, aspectRatio, … } | null } }. Poll after POST until status is done or error. When done, asset carries the full library record — attach asset.id via mediaAssignments on post create/update.
Errors
HTTP
Code
When
400
VALIDATION_ERROR
Invalid URL or body
401
UNAUTHORIZED
Missing or invalid token
402
QUOTA_EXCEEDED
Insufficient AI credits
403
FORBIDDEN
Token lacks social:write
404
NOT_FOUND
Render id not in this organization
501
NOT_CONFIGURED
Frametic not configured on this deployment
502
FRAMETIC_ERROR
Upstream render service error
Stuck renders
Renders that finish on Frametic but miss the completion webhook (for example, when webhook delivery is misconfigured) used to stay pending forever. GET/api/v1/social/video and GET/api/v1/social/video/{renderId} now run a reconciliation sweep: jobs older than a few minutes are checked against Frametic directly — finished ones ingest like a webhook, failed ones refund credits and surface the error. The dashboard renders list runs the same sweep when you open it.