How to verify photos your users upload are real

If your product accepts photos from users, a claim, a listing, a return, an onboarding check, you inherit a hard question: is the image real, taken when and where it claims? For most of the web, the honest answer is that you cannot tell from the file alone, and that gap is now actively exploited.

This post separates what genuinely helps from what only looks reassuring. It covers why an uploaded file cannot be trusted by default, what you can still do with one after the fact, and the stronger model of capturing proof at the moment instead of accepting a file.

Why an uploaded photo cannot be trusted by default

A file your user uploads has no anchor. Its date and GPS live in editable metadata that free tools rewrite in seconds, and that most apps strip on upload anyway. The pixels themselves can be generated or retouched, so a convincing defect, document or scene can be produced that never existed. Nothing in the file ties it to a real moment.

That means your reviewers are deciding on trust, not evidence, and it does not scale. Worse, once staff suspect AI, a genuine photo gets waved away as a possible fake, so honest users are penalised for a problem created by fraud. The file format was never designed to defend itself.

What you can do with a file after the fact

Two checks help as a first screen. An AI media detector scans the file and returns a probability that it was generated or edited: useful to triage incoming claims, but a probability is not proof, and it can be wrong in either direction. Reading provenance (Content Credentials, the C2PA standard) helps when a manifest is present, but it depends on the capturing device or software supporting it, and the manifest is easily stripped on upload.

Treat both as filters, not verdicts. They raise or lower suspicion and route the hard cases to a human, but neither can turn an arbitrary file someone sent you into something an independent party would accept. For anything that matters, you need evidence created at capture, not inferred afterward.

The stronger model: capture proof at the moment

Instead of accepting a file and trying to vouch for it, change the question: have the user capture the photo live, so it is sealed as it is taken. Danaya binds a SHA-256 fingerprint of the image to a server timestamp and the GPS position at the instant of capture. The timestamp comes from the server, not the device, so it cannot be back-dated, and capture is live only, so an imported or AI-generated file cannot earn a valid seal.

You can add this with no code by sending a capture link, the user opens it in the browser, captures with no account, and the sealed result lands in your dashboard, or integrate it directly through the API. Anyone can then confirm a result from a public verification link. Honest scope: this works where you control the capture step, it is not a retrofit that makes an arbitrary third-party file trustworthy, and the GPS position is declarative, taken from the capturing device.

FAQ

Can I verify that an arbitrary uploaded file is authentic?

Not with certainty. You can screen it with AI detection (a probability) and read Content Credentials when present, but neither proves a file you received is real. To get proof, capture the photo live through a capture link or the API so it is sealed at the moment it is taken.

Does an AI detector prove a photo is real?

No. It returns a probability that an image was generated or edited, which is a useful first filter but not proof, and it can err both ways. Pair it with proof captured live for the claims that matter.

How do users capture without an account or an app?

They open a capture link in the browser and capture live, with nothing to install and no account. The sealed photo, with its server timestamp, GPS and SHA-256 fingerprint, arrives in your dashboard, and anyone can check it from a public link.

Do I have to build an integration?

No. Capture links are no-code: create one and share the URL. If you want verification inside your own flow, the API lets you create and verify seals programmatically.

Capture proof instead of trusting an upload

Create a capture link free, or screen a file with the free detector. Either way, stop relying on a file anyone could have made.

Create a free proof

Keep reading