Documentation
RenderSnap API
Everything the dashboard does, available over HTTP — submit a VAST tag, resolve its wrapper chain, probe every media file, and read the verdict from CI, a cron job, or your trafficking pipeline.
https://rendersnap.io/api/v1Authentication
Every request sends the same header:
Authorization: Bearer <token> Content-Type: application/json
RenderSnap accepts two token types. Use session tokens for browser and first-party app flows. Use workspace API keys for server-to-server workers, cron jobs, and backend automations.
Session Token
Use this for browser or first-party app flows. Sign in to RenderSnap and copy your session token from the Developer Dashboard under API Access. Tokens expire after 1 hour.
// Copy your session token from the Developer Dashboard → API Access
const token = "<session_token>";
await fetch("https://rendersnap.io/api/v1/vast-projects", {
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json",
},
});Workspace API Key
Use this for backend services. Keys stay valid until revoked and carry scoped permissions like projects:create.
Authorization: Bearer rs_your_workspace_api_key Content-Type: application/json
Workspace API keys are created from an authenticated user session and are available on plans with API access enabled.
Create keys from the Developer Dashboard or programmatically:
POST https://rendersnap.io/api/v1/api-keys
Authorization: Bearer <session_token>
Content-Type: application/json
{
"name": "ci-preflight",
"scopes": [
"projects:create",
"projects:read",
"assets:read"
]
}API Keys
Create scoped workspace API keys for worker processes, CI pipelines, and backend integrations. Send the key as Authorization: Bearer <key> — the same endpoints the dashboard uses are available server-to-server, so tag validation can run without a browser.
/api-keysList active workspace API keys/api-keysCreate a new scoped API key (secret shown once)/api-keys/:idRevoke an API keyVAST Validation
Submit a VAST tag URL or raw XML and get back a full audit: wrapper chain resolution, schema compliance, and every media file downloaded and probed with FFmpeg. Validation is async — poll the project until status is done or failed. Run these from CI or a pre-flight check so tags are verified before they are trafficked.
/vast-projectsSubmit a tag URL or raw XML for validation/vast-projectsList validations (paginated, filterable by status and verdict)/vast-projects/:idGet the full report — verdict, health score, hops, media files/vast-projects/:id/shareEnable or revoke a public link for the report/vast-projects/:id/monitorRe-check this tag daily and email on health changes/vast-projects/:id/promoteSave a validated media file into workspace assets/vast-projects/:idDelete a validation and its stored mediaAssets
Media files kept from a validation report. Promoting a MediaFile from a VAST report stores it here so you can re-download the exact creative that was probed, after the original origin has rotated or expired.
/assetsList saved media files, filterable by kind and status/assets/:idGet file metadata and a download URL/assets/:idDelete a saved file and remove it from storageWorkspace
Read and update your workspace profile, plan, and usage stats.
/workspaces/meGet current workspace details and usage/workspaces/meUpdate workspace name or slug/workspaces/me/usageGet API usage and recent audit activityTeam & Roles
Manage workspace members, invitations, and role-based access control for both humans and machine users.
/workspaces/me/membersList workspace members and current roles/workspaces/me/members/:uidUpdate a member's role/workspaces/me/members/:uidRemove a member from the workspace/workspaces/me/invitesList pending workspace invites/workspaces/me/invitesCreate and send a workspace invite/workspaces/me/invites/:tokenRevoke a pending inviteValidate a tag — full example
Validation is asynchronous. Submit the tag, poll the project until status is done or failed, then read verdict and healthScore. This is the shape of a pre-flight check that fails a build on a broken tag.
// 1 — Submit the tag. Returns immediately with a projectId.
const submit = await fetch("https://rendersnap.io/api/v1/vast-projects", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.RENDERSNAP_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
input: { kind: "url", value: "https://pubads.g.doubleclick.net/gampad/ads?..." },
name: "Q3 campaign — pre-flight",
}),
});
const { data } = await submit.json();
// 2 — Poll until the validation settles.
let report;
do {
await new Promise((r) => setTimeout(r, 3000));
const res = await fetch(`https://rendersnap.io/api/v1/vast-projects/${data.projectId}`, {
headers: { Authorization: `Bearer ${process.env.RENDERSNAP_API_KEY}` },
});
report = (await res.json()).data;
} while (report.status !== "done" && report.status !== "failed");
// 3 — Fail the build on a broken tag.
if (report.verdict === "broken") {
console.error(`Tag is broken (health ${report.healthScore}/100)`);
process.exit(1);
}verdict is one of serves, warnings, or broken. Media file results arrive on mediaFiles, with the resolved wrapper chain on hops.
Rate limits
Rate limit headers are included in every response: X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset.
Error codes
All errors return a consistent JSON envelope:
401UNAUTHORIZEDMissing or invalid token403FORBIDDENAuthenticated but lacks permission404NOT_FOUNDResource does not exist422VALIDATION_ERRORRequest body failed validation402QUOTA_EXCEEDEDPlan quota exhausted403PLAN_LIMITFeature not available on current plan429RATE_LIMITEDToo many requests500INTERNAL_ERRORSomething went wrong on our endReady to start building?