Docs API
API reference
Every endpoint, with its fields and what it returns.
Updated November 2026
Basics
- Send your key as
Authorization: Bearer cvc_live_...orX-API-Key: cvc_live_... - Requests and replies are JSON, apart from the PDF report and the file upload.
- Times are in UTC, in ISO 8601 format.
For tools that read API descriptions, the full OpenAPI description is at https://complyvideochecker.in/v1/openapi.json. It needs no key.
Endpoints
| Request | What it does | Key needs |
|---|---|---|
GET /v1/account | Your plan, checks used this month and limits | Read |
GET /v1/clients | Your clients, to use as client_id | Read |
POST /v1/uploads | An address to upload a video to | Write |
POST /v1/checks | Start a check. Uses 1 check, or 2 for several platforms | Write |
GET /v1/checks | List checks, newest first, without findings | Read |
GET /v1/checks/{id} | One check, with its findings once complete | Read |
GET /v1/checks/{id}/report | The PDF report, once complete | Read |
POST /v1/uploads
| Field | Required | Meaning |
|---|---|---|
content_type | Yes | video/mp4, video/quicktime or video/webm |
file_size_bytes | Yes | The file's size. Refused if it's over your plan's limit |
duration_seconds | No | Gives a quick error if it's too long. We also measure the real file |
Returns upload_url, video_uri and expires_in_minutes. Upload with PUT, using the same Content-Type.
POST /v1/checks
| Field | Required | Meaning |
|---|---|---|
video_uri | Yes | From POST /v1/uploads |
kinds | Yes | One or more of paid_ad, sponsored, organic, footage. Footage is checked only for what's in the frame |
ad_platforms | For paid_ad | meta, tiktok, google |
organic_platforms | For organic | instagram, youtube, tiktok, linkedin, facebook, twitter, snapchat |
markets | For sponsored | us, in, ae, uk, eu, au, ca |
client_id | No | Also checks this client's brand rules. With no client, your team approves the video |
title | No | Up to 140 characters |
caption | No | The post's caption, up to 2,200 characters |
landing_page | No | For paid ads |
brief | No | What the video should deliver, one point per line, up to 6,000 characters |
scan_frame | No | Also look for logos, bystanders, plates and watermarks. On unless you set it to false |
report_language | No | The language's English name, such as Hindi. See report languages |
previous_check_id | No | A completed check this video is a fixed version of. Shows what was fixed |
Returns 202 with id, status and replayed. Fields we don't recognise are refused, so a typo can't quietly change what gets checked.
GET /v1/checks
| Query | Meaning |
|---|---|
limit | How many, from 1 to 100. 20 if you leave it out |
cursor | The next_cursor from the previous page |
check_status | pending, processing, complete or failed |
client_id | Only this client's checks |
Returns data, has_more and next_cursor. Keep asking with the cursor until has_more is false.
A check
{
"id": "6725f0c1a7b3d2e1f0a9c8b7",
"title": "November launch reel",
"status": "complete",
"stage": "done",
"error": null,
"client_id": null,
"client_name": "",
"kinds": ["organic"],
"ad_platforms": [],
"organic_platforms": ["instagram"],
"markets": [],
"duration_seconds": 28.4,
"version": 1,
"series_id": "6725f0c1a7b3d2e1f0a9c8b7",
"previous_check_id": null,
"approval_status": null,
"created_by": "API key: Nightly upload",
"created_at": "2026-11-02T10:15:00+00:00",
"completed_at": "2026-11-02T10:17:12+00:00",
"report_url": "/v1/checks/6725f0c1a7b3d2e1f0a9c8b7/report",
"result": {
"verdict": "ready",
"counts": { "blocker": 0, "fix": 0, "advisory": 0 },
"findings": []
}
}status moves from pending to processing, then complete or failed. A failed check explains why in error, and isn't charged. result stays empty until the check is complete. See how to read a report for what the verdict and findings mean.