Video APIv1 Home OpenAPI spec

Docs › Test mode

Test mode

Try the whole API without paying for it or touching your real videos, like test keys in a payments API. A test key works exactly like an API key, but everything it makes is a test video: free, small (one MP4, 480p, a minute), marked, and deleted after a day. Test mode is on every plan, including Free.

Test keys

Create one in the app (Account → API keys → Create test key) or with POST /account/keys {"mode": "test"} from a signed-in session. A test key starts with vp_test_ (live keys start with vpk_) and is used the same way, as a bearer token on the same base URL. You can have 5 active test keys, and they don't use your plan's API key allowance. In GET /account/keys each key has a mode of live or test.

Upload tokens and edit tokens made with a test key are test-mode too, so a browser using one makes test videos. In the web app, the Test mode switch in the sidebar does the same for your signed-in session: it lists and makes test videos until you switch back. (A session sends X-Video-Piper-Mode: test; an API key can't switch, because the key decides.)

What is different

Test mode
Separate from liveA test key only sees test videos, and a live key never sees them: GET /videos, status, reprocess, delete and edits all answer 404 NOT_FOUND for the other mode's videos. Videos have "mode": "test" (or "live") in the list and in status.
FreeNever metered or billed: no processing minutes, storage or delivery are counted, GET /usage is empty in test mode, and no overage applies. Every plan feature (captions, redaction, screen + camera, streaming) is available.
Short and smallOne MP4 of at most 60 seconds and 480p, with no streaming (HLS) copies; sources up to 2 GB. Asking for more is not an error: a higher maxHeight or streaming is clamped to 480p and one MP4, and effective in the video's status says what it was made with. Only a request that can't be clamped is refused with 403 TEST_LIMIT before anything starts: a durationSeconds above 60, a trim or edit known to be longer than 60 seconds, or a larger file. When the length isn't known up front (a recording, a URL import), the first 60 seconds are processed.
Daily quotaBy your plan, per rolling 24 hours per account: 5 test videos on Free (or with no plan), 20 on Starter, Pro and Scale. Uploads, edits and reprocesses each count, separately from your live daily limit. Over it: 429 TEST_LIMIT, naming the limit and your plan. Captions are allowed and don't count extra.
MarkedA small TEST mark is burned into the top-left corner of every output (the download, the streaming renditions, the poster and thumbnails). It can't be turned off or redacted away.
TemporaryA test video, its original upload and its work files are deleted about 24 hours after it was made, by the same removal as DELETE /videos/{id}. Status shows deletesAt (Unix time). A video.deleted webhook is sent with reason: "test_expired".
Not availableA test key can't read or change the account, its profile or its webhook (403 TEST_LIMIT; sign in for those), and test videos can't be embedded.
ProcessingTest videos go to the standard queue, never ahead of paying customers' work, and always encode on CPU.

Webhooks in test mode

Every webhook event now has a livemode field: false for events about test videos, true for live ones. Test events are sent to the same endpoint as live events; check livemode to tell them apart (and ignore or route test events as you like).

{
  "id": "evt_a1b2c3d4e5f6g7h8",
  "type": "video.ready",
  "livemode": false,
  "createdAt": "2026-10-09T14:30:45Z",
  "data": { "videoId": "3f1c…", "fileName": "demo.mp4", … }
}

Moving to live

Nothing else changes: swap the test key for a live key. Videos made before test mode existed are live. Test videos can't be promoted; make the video again with a live key.