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 output bundles (returned as 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_bundles, aveiro_video_create_mockup, aveiro_video_get. For the camera, backdrop, and browser chrome, list styles with aveiro_media_ (same gallery as screenshots — see ).
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.
The MCP tool aveiro_video_list_bundles maps presets to bundles in its response — the REST JSON field name is unchanged.
Each render includes id, sourceUrl, status (pending, done, or error), assetId (set when done), credits, and error (when failed).
Bundles (presets in the JSON — the name this endpoint has always used) produce several cuts in one enqueue — e.g. a vertical and a square cut for social, or a 4K landscape hero.
Looks vs bundles: A bundle picks export sizes. A look — styleId, theme, framing, chrome, and capture settings — picks how the page is filmed. Pass a look or a preset bundle id, never both: each cut in a bundle already names its own theme. List looks with GET /api/v1/sites/{siteId}/media/screenshot-styles (requires content:write on that site) or MCP aveiro_media_list_screenshot_styles.
Bundle id from GET (`presets` array); omit for a single landscape cut. Do not combine with look fields.
styleId
no
Style id from `GET …/media/screenshot-styles`; camera, backdrop, and framing preset. Do not combine with `preset`.
theme
no
`light` or `dark` — which page variant to film
framing
no
Camera distance (0.4–3)
chrome
no
`none`, `light`, or `dark` — browser chrome around the page
viewportWidth
no
Browser viewport width in CSS pixels (320–3840; default 1440)
viewportHeight
no
Browser viewport height in CSS pixels (320–3840; default 900)
deviceScaleFactor
no
Pixel density 1–3 (default 2)
fullPage
no
Film the full scroll height instead of the first screen
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.