Skip to Content

REST API

The VDClip public API is a server-to-server REST interface under https://api.vdclip.com/v1. You authenticate with Authorization: Bearer <token>, where the token is either a VDClip API key (vdck_...) or an OAuth access token. Each credential is scoped to the resources you grant it.

i
Server-side only

The API has no CORS and rejects browser requests. Keep your vdck_... key on a server you control, never in client code. If it leaks, rotate it and contact contact@vdclip.com.

Base URL and versioning

  • Base URL: https://api.vdclip.com
  • REST surface: every endpoint is prefixed with /v1, for example https://api.vdclip.com/v1/projects.
  • OAuth surface: the OAuth 2.1 server lives under /oauth2/* and /.well-known/*. Those endpoints follow the relevant RFCs. See Authentication.

Authentication

Send your API key in the Authorization header as a Bearer token on every /v1 request.

curl https://api.vdclip.com/v1/account \ -H 'Authorization: Bearer vdck_your_key_here'

API keys carry a fixed set of scopes and draw from your credit balance. For clients acting on behalf of a user, use OAuth 2.1 with a Bearer token instead; see OAuth 2.1.

Responses

Successful /v1 endpoints return the resource directly as JSON. Errors return an errors array. Include X-Request-ID and X-Trace-ID response headers when you contact contact@vdclip.com.

{ "errors": [ { "code": "INSUFFICIENT_CREDITS", "description": "Your account does not have enough credits for this operation." } ] }

Error codes

CodeMeaning
INVALID_API_KEYThe Authorization header is missing, malformed, or not recognized.
MISSING_SCOPEThe key is valid but lacks the scope required by the endpoint.
INSUFFICIENT_CREDITSThe account does not have enough credits for the operation.
RATE_LIMITEDToo many requests. Returned with HTTP 429 and a Retry-After header.
UPSTREAM_ERRORA downstream service failed. Safe to retry with backoff.
VALIDATION_ERRORThe request body or query parameters failed validation.
INVALID_JSONThe request body could not be parsed as JSON.
NOT_FOUNDThe requested resource does not exist or is not visible to this key.
ORIGIN_REJECTEDThe request came from a browser or disallowed origin.
i
Rate limiting

On RATE_LIMITED the API returns HTTP 429 with a Retry-After header telling you how many seconds to wait. Honor it and use exponential backoff. Plan limits are on the pricing page .

Pagination

List endpoints use cursor pagination: limit sets the page size, and cursor is an opaque token from the previous page (do not parse or build it yourself). Defaults and maximums vary per endpoint and are defined in the OpenAPI spec.

# First page curl 'https://api.vdclip.com/v1/projects?limit=20' \ -H 'Authorization: Bearer vdck_your_key_here' # Next page, using the cursor from the previous response curl 'https://api.vdclip.com/v1/projects?limit=20&cursor=eyJpZCI6IjEyMyJ9' \ -H 'Authorization: Bearer vdck_your_key_here'

Idempotency

POST /v1/projects supports the Idempotency-Key header (max 200 chars). Send the same key on retry and the API replays the original response without creating a duplicate project. Use a unique value per operation; UUIDs work well.

curl -X POST https://api.vdclip.com/v1/projects \ -H "Authorization: Bearer vdck_..." \ -H "Content-Type: application/json" \ -H "Idempotency-Key: 550e8400-e29b-41d4-a716-446655440000" \ -d '{ ... }'

Scopes

Scopes follow the pattern vdclip:<resource>:<action>. There are 15. A request without the scope an endpoint requires fails with MISSING_SCOPE. Two scopes are plan-gated: vdclip:render:execute and vdclip:social:publish require a plan that includes them. See the pricing page .

ResourceScopeGrants
Accountvdclip:account:readRead account profile, plan, and credit balance.
Projectsvdclip:projects:readList and read projects, clips, and share links.
Projectsvdclip:projects:writeCreate and delete projects and manage share links.
Resultsvdclip:results:readRead clip detail.
Resultsvdclip:results:writeLike and dislike clips.
Rendervdclip:render:executeStart renders and read render status. Plan gated.
Socialvdclip:social:readList connected social accounts.
Socialvdclip:social:publishPublish or schedule clips. Plan gated.
Calendarvdclip:calendar:readList scheduled and posted content.
Calendarvdclip:calendar:writeReschedule, update, and cancel scheduled posts.
Templatesvdclip:templates:readList and read templates.
Templatesvdclip:templates:writeCreate, update, and delete templates.
Assetsvdclip:assets:readList and read brand kit assets.
Assetsvdclip:assets:writeManage brand kit vocabulary and censored-word lists.

Endpoint reference

All /v1 endpoints, grouped by resource. Full schemas and request bodies are generated from the OpenAPI spec.

Account

MethodPathScopeSummary
GET/v1/accountvdclip:account:readGet account profile and plan
GET/v1/creditsvdclip:account:readGet credit balance

Projects

MethodPathScopeSummary
GET/v1/projectsvdclip:projects:readList projects
POST/v1/projectsvdclip:projects:writeCreate a clipping/captions project
GET/v1/projects/{project_id}vdclip:projects:readGet project status and detail
DELETE/v1/projects/{project_id}vdclip:projects:writeDelete a project
GET/v1/projects/{project_id}/clipsvdclip:projects:readList the clips a project produced
GET/v1/projects/{project_id}/sharevdclip:projects:readGet the project share link
POST/v1/projects/{project_id}/sharevdclip:projects:writeCreate a project share link
POST/v1/projects/{project_id}/share/regeneratevdclip:projects:writeRegenerate the project share link
DELETE/v1/projects/{project_id}/sharevdclip:projects:writeDelete the project share link

Clips

MethodPathScopeSummary
GET/v1/clips/{clip_id}vdclip:results:readGet clip detail
POST/v1/clips/{clip_id}/likevdclip:results:writeLike a clip
POST/v1/clips/{clip_id}/dislikevdclip:results:writeDislike a clip
POST/v1/clips/{clip_id}/rendersvdclip:render:executeStart a render
GET/v1/clips/{clip_id}/renders/latestvdclip:render:executeGet the latest render status
POST/v1/clips/{clip_id}/publishvdclip:social:publishPublish or schedule a clip

Templates

MethodPathScopeSummary
GET/v1/templatesvdclip:templates:readList templates
POST/v1/templatesvdclip:templates:writeCreate a template
GET/v1/templates/{template_id}vdclip:templates:readGet a template
PATCH/v1/templates/{template_id}vdclip:templates:writeUpdate a template
DELETE/v1/templates/{template_id}vdclip:templates:writeDelete a template

Assets

MethodPathScopeSummary
GET/v1/assetsvdclip:assets:readList brand kit assets
GET/v1/assets/{asset_id}vdclip:assets:readGet a brand kit asset

Calendar

MethodPathScopeSummary
GET/v1/calendarvdclip:calendar:readList scheduled/posted content
PATCH/v1/calendar/{post_id}vdclip:calendar:writeReschedule/update a scheduled post
DELETE/v1/calendar/{post_id}vdclip:calendar:writeCancel a scheduled post

Social

MethodPathScopeSummary
GET/v1/social-accountsvdclip:social:readList connected social accounts

OAuth 2.1 for user-delegated clients

For MCP servers, AI agents, and integrations acting on behalf of a user, VDClip runs an OAuth 2.1 Authorization Server (issuer https://api.vdclip.com). These clients send Authorization: Bearer <JWT> instead of an API key.

i
RFC-shaped bodies, not the /v1 error format

The OAuth 2.1 endpoints use standard RFC request and response bodies, not the /v1 errors array. Handle their responses and errors separately.

MethodPathSummary
GET/.well-known/oauth-authorization-serverAuthorization Server metadata (RFC 8414)
GET/.well-known/jwks.jsonJWKS, the ES256 public signing keys
POST/oauth2/applicationDynamic Client Registration (RFC 7591)
GET/oauth2/application/{client_id}Read client registration (RFC 7592)
POST/oauth2/tokenToken endpoint, authorization code and refresh
POST/oauth2/revokeToken revocation (RFC 7009)
🔑

Authentication

API keys, scopes, and OAuth 2.1 in depth

📦

Projects API

Create projects and read the clips they produce

🎬

Clips API

Render clips, poll status, and publish

Tips & Best Practices

Keep the key server-side

The API has no CORS. Store vdck_ keys in server environment variables, never in browser or mobile client code.

Request only the scopes you need

A narrowly scoped key limits the blast radius if it is ever exposed.

Always read X-Request-ID

Log it on every call so support can trace a specific request when you reach contact@vdclip.com.

Respect Retry-After

On a 429, wait the seconds in the Retry-After header and use exponential backoff for repeated failures.

Never parse the cursor

Treat the pagination cursor as opaque. Pass back exactly what the previous response returned.

Frequently Asked Questions

Last updated on