If you're building a product around AI-generated images, there's a surprisingly easy mistake to make:
You see the word "watermark" and assume you're dealing with one thing.
You're not.
A visible watermark, SynthID, and C2PA can all tell you something about an image, but they live in completely different places.
And once you understand where each one lives, most of the confusing behaviour starts making sense:
which tool can detect it,
what happens when you edit the file,
why one "fix" works while another does nothing, and
why a file can pass one check and fail another.
If you're building an image pipeline, this distinction can save you a lot of debugging time.
Here's the simplest mental model:
A visible watermark is in the picture.
Think of a logo composited into the pixels, usually at a known opacity and often placed in a corner.
You can see it.
No special detector required.
SynthID is also in the picture, but you can't see it.
It's a statistical pattern woven into the frequency content of the pixels during generation and distributed redundantly across the image.
There isn't a little section of the image that contains "the SynthID watermark."
It's spread across the raster.
C2PA is different again. It's in the file, not the picture.
C2PA uses a signed manifest attached to the file container as JUMBF boxes. That manifest can identify things such as the issuer, generating model, timestamp, and a cryptographic hash of the image pixels.
So you effectively have three different storage locations:
Visible watermark → pixels, visible
SynthID → pixels, hidden
C2PA → file container, signed metadata
Once you know that, the rest gets much easier.

This is where a lot of workflows go wrong.
People run one check and assume they've checked everything.
They haven't.
For a visible mark, the simplest detector is your own eyes.
Open the image at full size rather than relying on a thumbnail. A watermark can be much easier to identify when you're actually looking at the complete frame.
If the logo is visible, you know it's there.
C2PA requires a different approach.
You need a parser that validates the manifest rather than simply telling you that a JUMBF box exists.
Validation matters because you want to know whether the credential's signature is valid and whether the cryptographic pixel hash still matches the current image.
That distinction can tell you whether you're looking at:
an intact credential,
a credential attached to an image that has since been modified, or
no credential at all.
Simply opening an EXIF viewer and seeing nothing doesn't answer the C2PA question.
SynthID isn't something you're going to find by browsing EXIF data or opening the C2PA manifest.
It's a hidden statistical signal in the image data.
So you need a detector designed to look for it.
For an authoritative answer, Google's official detector is the reference implementation.
The important part is to match the test to the layer.
An EXIF viewer can't tell you whether SynthID exists.
A clean-looking corner can't tell you whether C2PA exists.
And a C2PA parser can't tell you whether a SynthID signal is present.
One check does not magically become three checks.
This is where the distinction becomes really useful if you're building an automated workflow.
A visible mark is pixel-level work.
If the mark occupies a known region, targeted image editing can address that region.
Cropping can also work if the watermark happens to be somewhere you're willing to cut away.
This is basically the only layer where the familiar "just crop it" intuition applies.
C2PA is container-level work.
A new file can be written without carrying the credential boxes across.
A JPEG re-save often has this effect because the new container may not preserve the original credential data.
But often isn't the same as always.
Some pipelines deliberately preserve credentials.
So if you're writing software around this, don't build your logic around assumptions such as:
"The hash changed, therefore the credentials are gone."
That's not what the hash tells you.
Verify the actual manifest.
SynthID is a different problem again.
Because the signal is embedded in the pixel data, changing the container doesn't directly address it.
According to the figures in this workflow, detection typically survives a 25% crop, while detection starts degrading sharply beyond roughly a 50% crop. It can also survive JPEG re-encoding, resizing, and format conversion.
That's why trying random file operations can be such a frustrating exercise.
You may be changing the file significantly without changing the thing your detector is looking for.
GPT Watermarker separates these paths by layer rather than treating every watermark as the same problem.
That distinction is useful because you can work on the layer that actually failed instead of processing everything by default.
Once you understand where the layers live, two rules become surprisingly powerful.
Screenshots, JPEG re-saves, frame grabs, format conversions, and services that re-encode files can create a new container.
That can mean the original metadata doesn't come across.
If the operation continues to carry the image pixels into the new file, pixel-level signals can come along with them.
That's why a re-save can appear to "work" while still leaving SynthID intact.
You changed the container.
You didn't necessarily change the image-level signal.
This is also why a changed hash can be misleading.
The hash tells you the bytes changed.
It doesn't tell you which layer changed.
Here's a particularly interesting failure mode.
Suppose an image has a C2PA credential.
You edit the pixels.
But the credential remains attached.
Now the cryptographic pixel hash in the manifest may no longer match the image.
A verifier can detect that the file was modified after signing.
That can be interpreted differently from an intact credential.
An intact credential can function as provenance or disclosure.
A credential whose pixel hash no longer matches can instead look like the file was altered after signing.
So you can actually make a file harder to interpret by trying to "clean it up."
That's an important consideration if you're building an image-processing pipeline.
There's another wrinkle worth knowing about.
The visible layer became optional.
In August 2026, Google introduced a setting that allows the visible watermark on Gemini creations to be turned off while leaving SynthID and C2PA embedded.
That means visual inspection became an even weaker test.
You can't look at the corner of an image, see nothing, and conclude that the other layers aren't there.
A file can have no visible watermark while still carrying the hidden layers.
For anyone building automated checks, that's an important distinction.
No visible mark is not the same thing as no provenance.

If you're an indie hacker building an AI image tool, marketplace, uploader, moderation system, or content pipeline, I'd keep the three layers separate in your architecture.
Don't create one generic boolean called:
watermarked = true
That loses too much information.
Instead, think in terms of independent checks:
visible_mark
c2pa_present / c2pa_valid
synthid_detected
That makes your system much easier to reason about.
A customer saying:
"The image has a watermark."
isn't enough information for your pipeline.
The useful question is:
"Which layer are we talking about?"
Once you know that, you can select the appropriate check and avoid applying the wrong operation.
A visible watermark sits in a known region of the pixels and can be seen directly.
SynthID is a hidden statistical signal distributed across the image pixels.
C2PA lives in the file container as a signed manifest.
They are three different systems living in three different places.
And because they live in different places, they respond differently when you manipulate the file.
Container operations can remove or change metadata while leaving pixel-level signals intact.
Pixel operations can affect the image while potentially leaving a credential attached—and that can create a hash mismatch.
And since the visible watermark can now be switched off while the hidden layers remain, looking at an image isn't enough to tell you what's actually inside it.
If you're building around AI-generated images, the best rule is simple:
Don't ask, "Does this image have a watermark?"
Ask:
"Which layer am I checking?"
That one question will save you from a lot of unnecessary debugging.