A premium editorial image prepared for protected delivery

Invisible watermarking API

Every copy carries its own history.

Embed invisible recipient-level identities into every image your platform delivers. Decode an image later to trace where it came from.

The attribution gap

Downloads erase attribution.

Filenames change, metadata disappears, and forwarded links lose their origin. Once an image leaves your platform, its delivery context is easy to lose.

  • Renamed files

    A download becomes final_v7.jpg, then something else entirely.

  • Stripped metadata

    Export tools and social platforms routinely remove the context attached to an image.

  • Forwarded links

    A shared asset can travel far beyond the original delivery without a useful trail.

How it works

A traceable delivery, in three steps.

  1. 01

    Protect

    Send an image and recipient identifier through the API.

  2. 02

    Deliver

    Receive a visually unchanged, uniquely marked copy.

  3. 03

    Trace

    Submit a recovered image and decode its embedded identity.

Original
Original editorial image
Protected
Protected editorial image

Developer preview

Put traceability in the delivery flow.

Send an image and the recipient context you already have. This illustrative contract shows an accepted job, status polling, and protected-image retrieval.

POST /v1/encode

Example languagesJavaScriptcURLPython

REQUEST

await etchv.encode({
  source: "https://cdn.example.com/campaign-final.jpg",
  payload: { recipient_id: "partner_84f2" }
});

RESPONSE

{
  "job_id": "job_9a31",
  "status": "accepted"
}

GET /v1/jobs/job_9a31

Poll immediately, then wait one second between up to five status checks before retrieving the protected image.

const wait = (milliseconds) => new Promise((resolve) => setTimeout(resolve, milliseconds));
let job;

for (let attempt = 0; attempt < 5; attempt += 1) {
  if (attempt > 0) await wait(1000);
  job = await fetch("/v1/jobs/job_9a31").then((response) => response.json());

  if (job.status !== "accepted" && job.status !== "processing") break;
}

if (job.status !== "complete") {
  throw new Error("Encode job " + job.job_id + " did not complete.");
}

if (!job.protected_image_url) {
  throw new Error("Encode job " + job.job_id + " has no protected image URL.");
}

const protectedImage = await fetch(job.protected_image_url);
{
  "job_id": "job_9a31",
  "status": "complete",
  "protected_image_url": "https://preview.etchv.com/v1/jobs/job_9a31/image"
}

Illustrative contract only; no live backend is connected.

Delivery primitives

Built for delivery pipelines.

A compact request model for the image delivery work your product already performs.

  • 01Direct uploads or external URLs
  • 02Asynchronous jobs
  • 03Batch-ready request model
  • 04Stable request IDs
  • 05Signed webhooks
  • 06Usage visibility

Where it fits

Traceability where images move.

01

Partner portals

Keep a delivery record connected to every image shared with a partner.

02

Paid media platforms

Attach recipient context as campaign imagery moves between teams and destinations.

03

Premium image delivery

Make traceability part of a polished, recipient-specific delivery experience.

Build traceability into every image delivery.

Start building