Aveiro API
Authentication
Sites
List Sites
List Templates
Create Site
Update Site Layout
Chrome Strings
Update Collection
Pages
Create a Page
Delete a Page
List Pages
Reorder Pages
Update a Page
Site Media
Publish Site
Link Translation
Import Media from URL
Audience
Newsletter API Overview
Newsletter Campaigns
Social
Social API Overview
Social Accounts
Social Media
Social Posts
Social Performance
Website Mockup Video
TrademarkTrademark
Ctrl k
Search…
Sign up
Aveiro API
Authentication
Sites
List Sites
List Templates
Create Site
Update Site Layout
Chrome Strings
Update Collection
Pages
Create a Page
Delete a Page
List Pages
Reorder Pages
Update a Page
Site Media
Publish Site
Link Translation
Import Media from URL
Audience
Newsletter API Overview
Newsletter Campaigns
Social
Social API Overview
Social Accounts
Social Media
Social Posts
Social Performance
Website Mockup Video
Sponsored
Aveiro
aveiro.app
Sponsored
Aveiro
aveiro.app
TrademarkTrademark
AveiroBlogContact
© Aveiro. All rights reserved.
Built with Aveiro

Website Mockup Video

GET/POST /api/v1/social/video and GET /api/v1/social/video/{renderId} — film a public URL into a 3D mockup video in the social library.
Updated 26 days ago
Social Performance
In short
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 ).
list_
screenshot_
styles
Site media

List bundles 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.
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.

Start a render

POST /api/v1/social/video Authorization: Bearer av_live_… Content-Type: application/json { "url": "https://example.com", "preset": "social-pack", "durationSec": 8, "still": false, "recapture": false, "estimateOnly": false }
Required scope: social:write
Field
Required
Description
urlyes
Publicly reachable page to film (max 2,000 chars)
presetno
Bundle id from GET (`presets` array); omit for a single landscape cut. Do not combine with look fields.
styleIdno
Style id from `GET …/media/screenshot-styles`; camera, backdrop, and framing preset. Do not combine with `preset`.
themeno
`light` or `dark` — which page variant to film
framingnoCamera distance (0.4–3)
chromeno
`none`, `light`, or `dark` — browser chrome around the page
viewportWidthno
Browser viewport width in CSS pixels (320–3840; default 1440)
viewportHeightno
Browser viewport height in CSS pixels (320–3840; default 900)
deviceScaleFactornoPixel density 1–3 (default 2)
fullPageno
Film the full scroll height instead of the first screen
durationSecno
Length in seconds (2–60); over 10s doubles the unit cost
stillno
Render one frame instead of a video — far cheaper
recaptureno
Re-film the page even when a capture exists (site changed)
estimateOnlyno
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
400VALIDATION_ERRORInvalid URL or body
401UNAUTHORIZEDMissing or invalid token
402QUOTA_EXCEEDEDInsufficient AI credits
403FORBIDDENToken lacks social:write
404NOT_FOUNDRender id not in this organization
501NOT_CONFIGURED
Frametic not configured on this deployment
502FRAMETIC_ERRORUpstream 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.

Related

  • Social API overview
  • Social media
  • Social posts
  • Platform docs: Social agents and API
{
  "credits": 50,
  "durationSec": 8,
  "variants": [{ "id": "…", "label": "Full HD landscape", "units": 1 }]
}
{
  "renders": [
    {
      "id": "render-uuid",
      "status": "pending",
      "sourceUrl": "https://example.com",
      "assetId": null,
      "credits": 50
    }
  ],
  "credits": 50
}