Invisible video watermarking API
Send a short MP4 or MOV and a reference. You get the clip back with an invisible watermark in every frame, each one read back from the finished file.
Switch between the original and the watermarked frame, then look at the difference.

After: the same frame of the delivered copy- 120 of 120
- frames returned the watermark after one more compression
- 48 of 48
- frames of a 2-second cut returned it too
- 35.6 dB
- median PSNR over every frame, after that compression
What goes in. What comes back.
The video API takes short H.264 clips as files. It isn’t a streaming or live product, and it is strict about what it accepts so that every frame can be verified.
What you send
One clip per request, as an MP4 or MOV file.
- One H.264 video track: progressive, 8-bit, 4:2:0
- A constant frame rate from 1 to 60 fps
- Even dimensions, square pixels, no rotation
- No audio, or one mono or stereo AAC-LC track
What comes back
The same file type, with the watermark in every frame.
- The same frame count and frame timing
- Lossless H.264, which can be much larger than the file you sent
- Your audio, copied packet for packet and not watermarked
- A master, not a file every phone and browser can play: re-encode it for delivery
Refused
You get an error and no charge. Nothing is converted silently.
- HEVC, ProRes, AV1, VP9 and other codecs
- 10-bit, HDR and interlaced video
- Variable frame rates and fragmented MP4
- Extra tracks, subtitles and attachments
How long a clip can be
Three limits apply together: 240 frames, 1 megapixel per frame and 40 megapixels across the whole clip. The larger the frame, the shorter the clip.
Files go in at up to 20 MB and come back at up to 100 MB.
| Frame size | Frames | 24 fps | 30 fps |
|---|---|---|---|
| 1920 × 1080 | Refused: over 1 megapixel per frame | ||
| 1280 × 720 | 43 | 1.8 s | 1.4 s |
| 960 × 540 | 77 | 3.2 s | 2.6 s |
| 640 × 360 | 173 | 7.2 s | 5.8 s |
| 480 × 270 | 240 | 10.0 s | 8.0 s |
Checked after the final encode.
Saving a video changes its pixels a little, so a watermark that was fine before saving can be broken after it. Etchv builds the finished clip, then opens it again and reads the watermark back from every frame.
A frame the codec can’t keep above the quality floor fails early and names itself in the error.
The floor applies to the lossless file the API returns. The example above was re-encoded once more for the web, so its figures include that encode.
How clips are verifiedChecked on the finished file
The file
- Same container, same number of frames
- Frame timing unchanged
- Audio packets and their timing unchanged
Each frame
- At least 35 dB PSNR against your original, color conversion and encoding included
- The exact watermark read back from the frame
200- Every frame passed. You receive the clip.
422- A frame failed. You receive an error, never a clip.
Every frame answers for itself.
Send a clip to the detect endpoint and get a result for each frame. The clip counts as watermarked only when every frame returns the same watermark.
From a cut
Each frame carries the whole watermark, so you don’t need the whole clip. In the saved run above, a 2-second cut was sent on its own and every frame of it returned the watermark.
After a re-encode
The copy in that run had been re-encoded once to an everyday H.264 profile before it was checked. That is one clip at one high-quality setting, not a survival rate.
What isn’t promised
Detection reads H.264 MP4 and MOV files up to 95 MB, within the same frame limits, so a screen recording or a platform’s transcode often has to be cut and re-wrapped first. Heavier compression, resizing and cropping can remove the mark, and audio isn’t watermarked at all.
120 frames- 120 of 120frames of the delivered copy returned the watermark
- 48 of 48frames of the cut returned it again, on their own
Lowest confidence on any frame: 0.991
How long it takes. What it costs.
Video watermarking is part of the Growth plan and above, and of the free trial.
Measured on the live API
Median time to finish one request at a time, measured September 29, 2026 on 5 short test clips of up to 60 frames. Each finished frame is saved, so a retried job only redoes what is missing. Across every published run, 750 of 750 video operations completed.
Performance benchmarksCredits for video
- 1
- credit per 24 frames watermarked, about a second: a 120-frame clip is five credits
- 1
- credit per clip checked, whatever its length, found or not
- 0
- for refused or failed clips, retries with the same idempotency key and result downloads
- 3×
- credits on GPU, or the standard rate if the request runs on CPU instead
Two requests. Then collect the result.
Most clips take longer than the 20-second wait of a direct request, so send them as jobs and fetch the result, or take a signed webhook.
POST /watermarks/videos/asynccurl --fail-with-body https://api.etchv.com/watermarks/videos/async \
-H "X-API-Key: $ETCHV_API_KEY" \
-H "Idempotency-Key: delivery_0084" \
-F 'file=@teaser.mp4' \
-F 'data={"delivery":"delivery_0084"}'
# Then, when the job has succeeded:
curl --fail-with-body https://api.etchv.com$RESULT_URL \
-H "X-API-Key: $ETCHV_API_KEY" \
-D response-headers.txt \
--output teaser-watermarked.mp4202 · application/json{
"request_id": "req_0123…cdef",
"status": "queued",
"operation": "embed",
"status_url": "/watermarks/jobs/req_0123…cdef",
"result_url": "/watermarks/jobs/req_0123…cdef/result",
"frame_count": 120,
"credits": 5
}POST /watermarks/videos/detectcurl --fail-with-body https://api.etchv.com/watermarks/videos/detect \
-H "X-API-Key: $ETCHV_API_KEY" \
-F 'file=@found-clip.mp4'200 · application/json{
"watermarked": true,
"watermark_id": "ea112880a8774fd1a251…b57654f3",
"confidence": 0.99,
"units": [
{ "index": 0, "watermarked": true, "confidence": 0.99,
"watermark_id": "ea112880a8774fd1a251…b57654f3" },
{ "index": 1, "watermarked": true, "confidence": 0.99,
"watermark_id": "ea112880a8774fd1a251…b57654f3" }
]
}For clips that leave early.
Today the API takes preview-size clips: a few seconds at 360p, a second or two at 720p. That covers more work than it sounds.
- Advertising
Teasers before they air
A teaser cut goes to the agency, the media partner and the client for approval. Each of them gets a different copy.
The watermark leads toRecipient’s copy - Product launches
Reveal clips under embargo
A few seconds of a new product reach press and retail partners days early. A clip that appears online points to one delivery.
The watermark leads toDelivery record - VFX and animation
Shots out for review
Review proxies of single shots travel between vendors and reviewers long before the film does. Every reviewer’s shot carries its own watermark.
The watermark leads toVendor and version - Games
Footage for press
Embargoed gameplay moments go to press and creators ahead of a reveal. Each outlet’s clip is its own copy.
The watermark leads toOutlet and embargo - Generative video
Clips with a record
Most generated clips are a few seconds long. Mark each one as it is made and keep the model, prompt reference and owner in your own record.
The watermark leads toGeneration record - Sports and events
Highlights for partners
A goal, a finish, a reveal: preview-size highlights sent to rights partners each carry that partner’s own watermark.
The watermark leads toPartner feed
Every frame.
The same watermark.
Start with 200 free credits: enough to watermark about 200 seconds of video.
7 days · 200 credits · No card required