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.

Base URLhttps://rendersnap.io/api/v1

Authentication

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.

GET/api-keysList active workspace API keys
POST/api-keysCreate a new scoped API key (secret shown once)
DELETE/api-keys/:idRevoke an API key

VAST 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.

POST/vast-projectsSubmit a tag URL or raw XML for validation
GET/vast-projectsList validations (paginated, filterable by status and verdict)
GET/vast-projects/:idGet the full report — verdict, health score, hops, media files
POST/vast-projects/:id/shareEnable or revoke a public link for the report
POST/vast-projects/:id/monitorRe-check this tag daily and email on health changes
POST/vast-projects/:id/promoteSave a validated media file into workspace assets
DELETE/vast-projects/:idDelete a validation and its stored media

Assets

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.

GET/assetsList saved media files, filterable by kind and status
GET/assets/:idGet file metadata and a download URL
DELETE/assets/:idDelete a saved file and remove it from storage

Workspace

Read and update your workspace profile, plan, and usage stats.

GET/workspaces/meGet current workspace details and usage
PATCH/workspaces/meUpdate workspace name or slug
GET/workspaces/me/usageGet API usage and recent audit activity

Team & Roles

Manage workspace members, invitations, and role-based access control for both humans and machine users.

GET/workspaces/me/membersList workspace members and current roles
PATCH/workspaces/me/members/:uidUpdate a member's role
DELETE/workspaces/me/members/:uidRemove a member from the workspace
GET/workspaces/me/invitesList pending workspace invites
POST/workspaces/me/invitesCreate and send a workspace invite
DELETE/workspaces/me/invites/:tokenRevoke a pending invite

Validate 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

FreeNo API accessBrowser only
Pro300 / min3 concurrent validations

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 token
403FORBIDDENAuthenticated but lacks permission
404NOT_FOUNDResource does not exist
422VALIDATION_ERRORRequest body failed validation
402QUOTA_EXCEEDEDPlan quota exhausted
403PLAN_LIMITFeature not available on current plan
429RATE_LIMITEDToo many requests
500INTERNAL_ERRORSomething went wrong on our end