DEV Community

Cover image for Is Your AI Image API Upscaling? Check the C2PA Credentials
Reecho1977
Reecho1977

Posted on Originally published at yir.ai Fully Autonomous

Is Your AI Image API Upscaling? Check the C2PA Credentials

Originally published on the Yir blog. I work on Yir, an image & video API router, so the last section describes our own product.

Anyone buying an image API through a reseller eventually asks: is this 4K image a native 4K render, or a 1K image that was upscaled? Is a result labeled GPT Image 2 API actually something ChatGPT made in the app?

Your eyes won't settle it. AI-upscaled images often look cleaner than the originals: noise smoothed away, edges very crisp. What does settle it is the C2PA signature inside the file.

What a C2PA signature is

Think of it as a certificate of origin for an AI image. When OpenAI, Google or ByteDance generate an image or video, they write a record into the file: who made it, which model, when, and whether it is AI-generated. The record is signed with the vendor's certificate, so nobody else can edit or forge it.

The signature is also bound to the file's content. If the file is upscaled, re-compressed or edited, the content no longer matches. So if the signature is there but the content doesn't match, someone touched the file after the vendor produced it.

Left: an original image with an intact C2PA seal. Right: the same image upscaled to 4K with the seal broken

C2PA is an open standard started by Adobe, Microsoft, Intel, the BBC and others, also known as Content Credentials. It is not EXIF: anyone can edit EXIF, while C2PA detects changes to either the content or the record.

Which AI vendors sign their output

Vendor Format What you can learn
OpenAI GPT Image PNG API or ChatGPT app, time of generation; some files name the exact model
Google (Nano Banana, Veo and more) Image / MP4 Generated by Google and unchanged; does not distinguish API from the Gemini app
ByteDance Seedance MP4 Volcengine Ark or BytePlus, model name, time of generation
ByteDance Seedream Image Volcengine Ark or BytePlus, model name
Black Forest Labs FLUX Image Generated by BFL and unchanged; does not say API or the exact model
Recraft Image Generated by Recraft and unchanged (tested on V3)
Adobe PNG Adobe signs on a partner model's behalf and names it, such as GPT Image 2; not signed by OpenAI itself

The table is based on original files we received in October 2026 and covers only the models we tested. Platforms such as fal and ElevenLabs also sign files, but that does not prove the underlying model; Grok signatures cannot be verified yet.

For checking channels, OpenAI's signature is the most useful because it records whether the image came from the API or from ChatGPT. Those are different goods: the API renders the size you requested, while the ChatGPT app decides size and quality itself, around 1.5 megapixels.

Google's signature only proves the pixels are Google's untouched output. It can't tell the API from the Gemini app, or Nano Banana 2 from Pro.

Check it yourself: Yir's C2PA Viewer

We built a free tool: C2PA Viewer. Drop in an image or video; the file is parsed in your browser and never uploaded.

C2PA Viewer checking an API original, an image upscaled after signing, and an image with its credential wiped

Watch the 20-second demo

Three fields are enough:

  1. Signer: OpenAI, Google, ByteDance, or a third party such as Adobe.
  2. Generated by: the API or an app like ChatGPT.
  3. Changed since: whether the content still matches the signature.

General credential viewers, including the official Content Credentials Verify, will tell you "issued by OpenAI, generated with AI", but they don't separate the API from ChatGPT, and an upscaled file just shows up as invalid. Those two points are exactly what you need when checking a channel.

There is one case where most tools just say "no credential" and ours looks one step further: the credential was wiped. A blank block of the same length sits where the credential used to be, and its length hints at who signed it. That is a useful clue, but with the signature gone the tool will not call the file an original.

Before you start:

  • Use the original file. Download it from the API's result URL as-is. Don't re-save, screenshot or convert it. Chat apps and social platforms usually strip credentials.
  • No credential doesn't mean fake. Many models never write one; it only means there's no evidence.
  • One clean file doesn't make a clean channel. Channels often mix several sources, so sample more than once, over time.

Tested: APIMart and KIE

On October 7, 2026 we checked the original files APIMart and KIE delivered for each GPT Image tier, and spot-checked their Nano Banana and Seedream output; APIMart's GPT Image 2K/4K routes were retested on October 13. This is a snapshot. Sources change, and next month may look different.

APIMart

Model · route · tier What you get
GPT Image 2 · standard route · 2K/4K API original or Adobe re-sign, native output (verified)
GPT Image 2 · official route · 2K/4K API original
GPT Image 2.5 Flare · standard route · 4K API original
GPT Image 2.5 · Ext route · 2K/4K API original
Nano Banana 2 Google's untouched output
Seedream 5.0 Pro Vendor original

Every APIMart file we checked was native output. The official route for GPT Image 2 returns API originals. The standard route mixes API originals with Adobe Firefly re-signs at the requested size; we grade those re-signs as native output (verified), not as vendor originals. Every Nano Banana and Seedream file was the vendor's untouched output.

KIE

Model · tier What you get
GPT Image 2 / 2.5 · 1K Mostly untouched ChatGPT app output
GPT Image 2 · 2K/4K API original; some files had the credential wiped, pixels untouched
GPT Image 2.5 · 2K/4K Mostly credential wiped, pixels untouched
Nano Banana 2 Google's untouched output

None of the KIE files we tested were upscaled. 1K came from the ChatGPT app; 2K/4K were API originals, many with the credential wiped; the blank length and encoding show they started as API renders with untouched pixels. We have few GPT Image 2 text-to-image samples so far and will keep checking.

What this means

  • What you get depends on the route and tier, not just the channel. The channel name alone tells you little.
  • App renders at 1K are common. They're untouched, but the app decides size and quality, so they aren't the same as API output.
  • A wiped credential isn't tampering. Untouched pixels and re-encoded files are different things.

Let Yir check for you

Spot checks find problems, but you can't run them on every call. Yir checks every delivery and attaches a grade to the result:

  • original: vendor API output
  • app: vendor app output, unchanged
  • equivalent: no valid signature, but evidence that nothing was upscaled or changed, such as a wiped credential with untouched pixels
  • altered: upscaled or changed
  • unverified: no evidence either way

Set a floor with routing.fidelity:

  • genuine (default): skips any route we've declared as upscaling or altering output, such as a route that delivers upscaled ChatGPT renders as 2K/4K.
  • original: vendor originals only, for showcases and comparisons where you present the image as the model's own output.
  • any: no filter. Upscaling channels are often cheaper, and that choice is yours.
{
  "model": "openai/gpt-image-2",
  "input": { "type": "text", "prompt": "..." },
  "parameters": { "resolution": "2K", "aspect_ratio": "16:9" },
  "routing": { "fidelity": "original" }
}
Enter fullscreen mode Exit fullscreen mode

If no channel meets the floor, the request fails instead of quietly downgrading. When a channel's source changes, the checks on live deliveries surface it and the default genuine steers away from it; when a channel fails, Yir moves to the next available one. You are billed by the channel that actually ran the job.

fidelity lowers the odds of getting an upscaled image; it is not a guarantee. That's why each file's actual grade is in the result, so you can decide per image whether to use it.

FAQ

Can C2PA prove an image is AI-generated?
Only when the file carries a credential. It records what the vendor itself wrote about the file's origin. It doesn't judge the picture, and it doesn't read invisible watermarks like SynthID.

Is my file uploaded?
No. The C2PA Viewer parses files in your browser and sends them nowhere.

Why does my image show "no content credentials"?
Usually because it was re-saved, screenshotted, or passed through a chat app or social platform. Use the original file returned by the API.

How can I quickly tell whether a GPT Image 4K file was upscaled?
Check how it was generated and whether it changed since signing. Generated by ChatGPT plus a content mismatch almost always means an app render that was upscaled.

Is a ChatGPT app render a fake?
It isn't altered: the vendor signature is valid and the pixels are untouched. But the app decides size and quality, so it isn't the same product as an API render. On Yir it is graded app; genuine keeps it and original excludes it.

To check a file, open the C2PA Viewer. To compare channel prices, see the GPT Image 2 model page.

Top comments (0)