Invisible image watermarking API

Send an image and a reference. You get the same image back, in the same format, with an invisible 256-bit watermark in its pixels.

Switch between the original and the watermarked image, then look at the difference.

sf26-launch.png3200 × 1800
Watermarked image. Close-up of a red and white Formula 1 car’s bodywork and sponsor letteringAfter: the file the API returned
47.7 dB
PSNR across the whole image
6 of 255
largest change to any color value
0.8 of 255
average change per color value
A real API result, cropped to 960 × 600 and stored losslessly. One example, not a guarantee for every image. SF-26 imagery via Formula 1; no affiliation.

What comes back, format by format.

Etchv tells file types apart by their contents, not their names, and returns the same type. Choose a format to see what is kept, what changes and what is refused.

.jpg.jpg: JPEG in, JPEG out

Written asQuality 100, 4:4:4 chroma

Kept

  • Dimensions
  • ICC color profile
  • EXIF and resolution

Changed

  • Re-encoded at quality 100 with full chroma, so the file is usually larger
  • Grayscale can be expanded to RGB

Refused

  • CMYK JPEG

Limits

  • 50 MB and 40 megapixels

.png.png: PNG in, PNG out

Written asLossless

Kept

  • Dimensions
  • Transparency, byte for byte
  • ICC color profile, EXIF and resolution

Changed

  • Palette and grayscale images can be expanded to RGB

Refused

  • 16-bit PNG
  • Fully transparent images

Limits

  • 50 MB and 40 megapixels

.png.png: APNG in, APNG out

Written asLossless, animated

Kept

  • Every visible frame
  • Frame timing and loop count
  • The default image setting

Changed

  • None beyond the watermark, which is verified in every frame

Refused

  • Fully transparent frames

Limits

  • 32 frames, default image included
  • 40 megapixels across all frames

.webp.webp: WebP in, WebP out

Written asLossless

Kept

  • Dimensions and transparency
  • ICC color profile and EXIF
  • Animation timing and loop count

Changed

  • Lossy WebP comes back lossless, so the file is usually larger

Refused

  • Fully transparent frames

Limits

  • 50 MB and 40 megapixels
  • 32 frames when animated

.tiff.tiff: TIFF in, TIFF out

Written asLossless Deflate

Kept

  • Every page
  • Each page’s own resolution, color profile and descriptive tags

Changed

  • JPEG-compressed pages come back with lossless compression

Refused

  • 16-bit samples
  • CMYK

Limits

  • 32 pages
  • 40 megapixels across all pages

.gif.gif: GIF in, GIF out

Written as255 colors plus transparency

Kept

  • Every frame
  • Frame timing and loop count
  • The comment block

Changed

  • Each frame is re-quantized to 255 colors with a transparency index

Refused

  • Fully transparent frames

Limits

  • 1 megapixel per frame
  • 32 frames

.bmp.bmp: BMP in, BMP out

Written asUncompressed

Kept

  • Dimensions

Changed

  • A 1-bit bitmap is delivered with 8-bit color

Refused

Nothing specific to BMP.

Limits

  • 50 MB and 40 megapixels

.ppm.ppm: PPM in, PPM out

Written as8-bit samples

Kept

  • Dimensions

Changed

  • None beyond the watermark

Refused

  • Anything but P3 or P6 color
  • 16-bit samples

Limits

  • 50 MB and 40 megapixels

.psd.psd: PSD in, PSD out

Written asLayered

Kept

  • Your layer records and pixels, byte for byte
  • The document’s ICC profile
  • Canvas size

Added

  • Two pixel layers: “Etchv watermark +” (Linear Dodge) and “Etchv watermark -” (Linear Burn)
  • A merged preview rewritten to match

Refused

  • CMYK or 16-bit documents
  • Effects that can’t be rendered faithfully
  • Transparent composites, or no merged preview

Limits

  • 4-megapixel canvas
  • 62 layers in your file

.psb.psb: PSB in, PSB out

Written asLayered, large document

Kept

  • Your layer records and pixels, byte for byte
  • The document’s ICC profile
  • Canvas size

Added

  • Two pixel layers: “Etchv watermark +” (Linear Dodge) and “Etchv watermark -” (Linear Burn)
  • A merged preview rewritten to match

Refused

  • CMYK or 16-bit documents
  • Effects that can’t be rendered faithfully
  • Transparent composites, or no merged preview

Limits

  • 4-megapixel canvas
  • 62 layers in your file

HEIC, HEIF and AVIF aren’t supported yet. Convert them to JPEG, PNG or WebP first.All image limits

No verified watermark, no file.

A job succeeds only after Etchv reads the watermark back from the exact file it is about to return and compares that file with your original.

A file that fails a check is never returned.

The example at the top of this page measured 47.7 dB.

Output verification

Checked on the final bytes

The file

  • Same container, same number of frames or pages
  • Animation timing and loop count unchanged
  • Your Photoshop layer data unchanged

The picture

  • Dimensions unchanged
  • Colour profile unchanged
  • Transparency unchanged, byte for byte
  • At least 35 dB PSNR against your original, encoding loss included

The watermark

  • The exact 256-bit watermark read back from every frame, page or layered image
200
Every check passed. You receive the file.
422
A check failed. You receive an error, never a file.

Read it back from the file alone.

Send a copy to the detect endpoint. You don’t need the original. It tells you which watermark it found, how sure it is, and gives a result for every frame or page.

When a copy comes back damaged

A heavily edited or photographed copy can come back with some of the watermark’s 256 bits wrong. If what Etchv reads is within 48 bits of a watermark your organization created, Etchv returns that watermark. Two unrelated watermarks differ in about 128 bits.

What isn’t promised

Resizing, recompression, cropping and screenshots can weaken or remove a watermark. See what 208 photographs survived, then test the edits your images really go through before you rely on it.

Damaged copy

31 of 256 bits wrong

Your watermark

Returned

An illustration with a sample watermark. The marked squares are the bits that came back wrong.

How long it takes. What it costs.

Measured on the live API

  • EmbedCPU2.7 s
  • EmbedGPU, on Business and Enterprise1.5 s
  • DetectCPU0.4 s

Median time to finish one request at a time, measured September 29, 2026 on 20 small test images. Larger files take longer. Across every published run, 3,000 of 3,000 image operations completed.

Performance benchmarks

Credits for images

1
credit per image watermarked, whatever its frames, pages or layers
1
credit per image checked, whether or not a watermark is found
0
for failed jobs, retries with the same idempotency key and result downloads
3×
credits on GPU, or the standard rate if the request runs on CPU instead
Plans and credits

Two requests. That’s the integration.

Embed when a file leaves your system. Detect when a copy comes back.

RequestPOST /watermarks/images
curl --fail-with-body https://api.etchv.com/watermarks/images \
  -H "X-API-Key: $ETCHV_API_KEY" \
  -H "Idempotency-Key: delivery_0084" \
  -F 'file=@launch-hero.jpg' \
  -F 'data={"delivery":"delivery_0084"}' \
  -D response-headers.txt \
  --output response-body
Response200 · image/jpeg
HTTP/2 200
content-type: image/jpeg
content-disposition: attachment;
  filename="launch-hero-watermarked.jpg"
x-watermark-id: ea112880a8774fd1a251…b57654f3

# On 200 the body is the watermarked JPEG.
# Save the full 64-character watermark ID with your record.
# A 202 body is a job receipt instead.
RequestPOST /watermarks/images/detect
curl --fail-with-body https://api.etchv.com/watermarks/images/detect \
  -H "X-API-Key: $ETCHV_API_KEY" \
  -F 'file=@found-copy.jpg'
Response200 · application/json
{
  "watermarked": true,
  "watermark_id": "ea112880a8774fd1a251…b57654f3",
  "confidence": 0.99,
  "units": [{
    "index": 0,
    "watermarked": true,
    "confidence": 0.99,
    "watermark_id": "ea112880a8774fd1a251…b57654f3"
  }]
}

Your images.
Traceably yours.

Start with 200 free credits: enough to watermark or check 200 images.

7 days · 200 credits · No card required

Your privacy, your choice

We use essential cookies to keep Etchv working. Optional analytics helps us improve the site. Analytics is on by default; you can turn it off in preferences. PostHog loads only if you accept all. Privacy policy

ETCHV

Privacy preferences

Choose what you allow on this browser. Analytics is enabled by default. You can turn it off, and change your choice at any time.

Essential

Always active

Supports secure sign-in, account sessions, site security, and remembering your privacy choice. These are needed for Etchv to work.

Analytics

Helps us understand visits and improve the website using page-view and device statistics, which do not use cookies. PostHog also measures visits and campaigns and may set cookies; it loads only after you save a choice with analytics on. Turning this off stops future analytics events.

We do not load advertising scripts. Meeting calendars load only when you open them. These preferences do not change your account, watermarking requests, or asset storage.

Your choice is remembered for 180 days on this browser. Privacy policy