AI Content Credentials & Disclosure Auditor (C2PA)
Pricing
from $4.00 / 1,000 page auditeds
AI Content Credentials & Disclosure Auditor (C2PA)
Audit delivered images for C2PA Content Credentials, IPTC AI markers and visible AI labels. Catch stripped credentials (EU AI Act Art. 50, California SB 942).
Pricing
from $4.00 / 1,000 page auditeds
Rating
0.0
(0)
Developer
Dave West
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a month ago
Last modified
Categories
Security
Limited permissionsShare
AI Content Credentials & Disclosure Auditor (C2PA, IPTC, EU AI Act Art. 50)
Check whether the images your website actually delivers still carry Content Credentials (C2PA) and AI markers, and
whether AI images are visibly labelled. Give it page URLs, a sitemap or image URLs. For every delivered image it
reports whether the file as served carries a C2PA manifest, whether that manifest validates against the
official trust lists, which organisation signed it, which tool made it (Adobe Firefly, ChatGPT/DALL·E, Google,
Microsoft Designer, a camera, your CMS…), whether it is marked as AI-generated (C2PA digitalSourceType or the
IPTC/XMP DigitalSourceType field), and whether the page shows a visible AI label near the image.
The most common real-world result: your originals are signed, but the resized versions your CMS or CDN delivers are not. Image optimizers, thumbnails and WebP/AVIF conversion silently strip provenance metadata. This Actor finds that, site-wide and on a schedule, instead of one file at a time.
- Site-wide: crawl a sitemap (or sitemap index,
.xml.gz, or just the homepage) up tomaxPages, or a list of pages. Every<img>,srcset,<picture>source andog:imageis checked; optionally also linked image files. - Real C2PA validation with the official Content Authenticity Initiative library (
@contentauth/c2pa-node) and the C2PA conformance trust list + CAI trust list:valid(intact and trusted signer),untrusted(intact, signer not on the trust lists) orinvalid(tampered, re-encoded after signing, expired or unreadable). - AI marking: C2PA actions with
trainedAlgorithmicMedia/compositeWithTrainedAlgorithmicMedia(also in ingredients), AI generators named in the credentials, and the IPTCDigitalSourceTypein XMP (JPEG, PNG, WebP, AVIF, HEIC, GIF, TIFF), even without C2PA. - Visible disclosure check in English, Dutch, German, French and Spanish ("AI-generated", "made with AI", "gemaakt met AI", "KI-generiert", "généré par IA", "generado por IA", "Illustration: Midjourney"…) in alt text, figcaptions, captions, credits, nearby text and the page.
- Findings you can act on: AI image without a visible label, visible label without machine-readable marking, invalid credentials, and credentials stripped from a rendition.
- Monitoring: scheduled runs remember every image and finding, mark images
new/changed, count resolved findings, and withonlyChangesoutput (and charge) only new findings. - Privacy-friendly: only organisation names from signing certificates; if a certificate looks personal it is shown
as
individual certificate. No cookies, no logins, public pages only. - Lightweight: HTTP only, no browser, 512 MB memory.
Why now: EU AI Act Art. 50 and California SB 942
- EU AI Act, Article 50 (transparency obligations) applies from 2 August 2026. Providers of generative AI must mark AI-generated images, audio, video and text in a machine-readable way (C2PA Content Credentials and IPTC metadata are the practical standards named in the EU Code of Practice on AI-generated content), and deployers must disclose deepfakes. Generative AI systems already on the market before that date have until 2 December 2026 to apply the marking.
- California AI Transparency Act (SB 942) took effect on 2 August 2026: covered AI providers must embed latent provenance disclosures in generated images, video and audio and offer a free detection tool.
- Marks only help if they survive. A widely documented problem is that CMS image pipelines and CDNs strip C2PA and XMP metadata when they resize, compress or convert images. If you publish AI images (or signed photos), you need evidence that the files your visitors receive still carry the marking.
This Actor is a technical audit tool and not legal advice; see the FAQ.
What are Content Credentials, C2PA and IPTC DigitalSourceType?
- C2PA / Content Credentials is an open standard (Adobe, Microsoft, Google, OpenAI, BBC, camera makers…) that embeds a cryptographically signed "nutrition label" in a file: who created it, with which tool, and which edits were made, including whether AI generated it. If the file is changed after signing, validation fails.
- IPTC DigitalSourceType is a simple metadata field (stored in XMP) that says how an image was made, e.g.
trainedAlgorithmicMedia(AI-generated) orcompositeWithTrainedAlgorithmicMedia(AI-edited composite). Many AI tools write it; it is not signed, so it is easy to add and easy to lose. - Visible labels ("AI-generated", "Made with AI") are what readers see. Machine-readable marks are what platforms, search engines and regulators' tools read. You usually want both.
Use cases
- Publishers and newsrooms that sign images (C2PA adopters): prove your credentials survive your CMS, image CDN
(Cloudflare, Akamai, Fastly, imgix, Cloudinary, WordPress/Jetpack) and social previews (
og:image). - Brands and agencies using AI imagery: check that AI visuals on campaign pages and blogs are marked and labelled, and find AI images that slipped through without a label.
- E-commerce and marketplaces: audit product and listing pages, including third-party sellers' images, for AI markers and missing disclosures.
- Compliance and legal teams, consultants: repeatable, dated evidence of the provenance status of delivered images (dataset export as JSON, CSV or Excel), ahead of the 2 December 2026 deadline.
- Developers and DevOps: run it after a CDN, theme or image-optimizer change to catch regressions; compare originals
(direct
imageUrlsfrom your DAM) with what the site delivers.
How it works
- Collects pages from
startUrlsand/or the sitemap (up tomaxPages). - Fetches each page with plain HTTP and parses the HTML:
og:image,<img>(src, or thesrcsetcandidate a desktop browser would load: the largest up to 2048 px wide or 2x; common lazy-load attributes such asdata-src),<picture>sources and, optionally, linked image files. - Downloads each image once per run like a browser does (sending
Accept: image/avif,image/webp,…, so CDNs that convert formats deliver the same file your visitors get; size capmaxImageMegabytes, files belowminImageBytesare skipped for free), detects the real format from the bytes, reads EXIF/XMP/IPTC and any embedded C2PA manifest, and validates the manifest with the C2PA SDK against the C2PA conformance trust list and the CAI trust list. - Classifies each image and looks for visible AI labels around it.
- Computes findings per page, compares with the previous run (named key-value store) and writes the dataset.
Classification
classification | Meaning |
|---|---|
ai-marked | Marked as AI-generated or AI-edited: C2PA AI action/generator and/or IPTC DigitalSourceType = trainedAlgorithmicMedia / compositeWithTrainedAlgorithmicMedia |
c2pa-signed (not AI) | Carries Content Credentials, no AI marker (e.g. a signed camera photo or CMS-signed image) |
metadata-only | Has EXIF/XMP/IPTC metadata but no Content Credentials and no AI marker |
no-provenance | No Content Credentials, no AI marker; metadataStripped: true when it has no metadata at all |
Findings (each one is a finding event)
| Finding | When |
|---|---|
ai-image-without-visible-label | The image is AI-marked, but no AI disclosure was found in its alt text, caption, nearby text or anywhere on the page |
visible-label-without-marking | Alt text/caption says the image is AI (or the page says its images are AI), but the delivered file carries no machine-readable AI marking: the typical sign of a pipeline that strips metadata (relevant to Art. 50) |
credentials-invalid | Content Credentials are present but do not validate (reported once per image per run) |
credentials-stripped-rendition | The same image (same file name, different size/format) is delivered both with and without provenance on one page: one finding per image group |
Input
| Field | Default | Description |
|---|---|---|
startUrls | – | Pages to audit. Links are not followed (use a sitemap for whole sites). A URL that is an image is checked as a direct image. |
sitemapUrl | – | Sitemap, sitemap index, .xml.gz, or a homepage (sitemap found via robots.txt or /sitemap.xml). |
imageUrls | – | Image files to check directly (no minimum size). Max 1000. |
maxPages | 50 | Max pages per run (start URLs first, then sitemap pages). |
maxImagesPerPage | 30 | Images per page, in document order with og:image first. |
minImageBytes | 5000 | Skip smaller files (icons, tracking pixels) for free. |
maxImageMegabytes | 15 | Skip larger files for free. |
includeLinkedImages | false | Also check image files the page links to (e.g. "download original"). |
checkVisibleLabels | true | Look for visible AI disclosures and report the two label findings. |
onlyChanges | false | Output/charge only new findings and new or changed image rows (first run = baseline). |
stateStoreName | ai-content-credentials-auditor-state | Named key-value store holding the history (one record per site host). |
Empty input runs a demo with public files that are known to carry Content Credentials or IPTC AI markers (Adobe Firefly, Google, Microsoft Designer, OpenAI DALL·E, a Gemini PNG with IPTC metadata, a C2PA test file, an invalid C2PA test file) and a Wikimedia Commons page where the original keeps its credentials but the delivered thumbnails do not.
Example: audit a site via its sitemap
{"sitemapUrl": "https://www.example.com/sitemap.xml","maxPages": 200,"maxImagesPerPage": 30}
Example: weekly monitoring of your AI campaign pages, alerts only
{"startUrls": [{ "url": "https://www.example.com/campaign/spring" }, { "url": "https://www.example.com/blog/ai-visuals" }],"onlyChanges": true,"stateStoreName": "example-com-provenance"}
Example: compare your DAM originals with what the CDN delivers
{"imageUrls": ["https://dam.example.com/originals/hero.jpg", "https://cdn.example.com/img/hero-1200w.webp"]}
Output
The dataset has three row types; use the Images, Pages and Summary views in the Output tab, or filter on
type. A JSON summary with counters, charged events and memory use is stored in the default key-value store as SUMMARY.
Image rows (type: "image", one per unique image)
{"type": "image","pageUrl": "https://commons.wikimedia.org/wiki/File:Adobe_Firefly_generated_landscape_photography.jpg","imageUrl": "https://upload.wikimedia.org/wikipedia/commons/a/ab/Adobe_Firefly_generated_landscape_photography.jpg","foundVia": "link","classification": "ai-marked","aiMarked": true,"aiSource": "c2pa","aiEvidence": ["C2PA c2pa.created: trainedAlgorithmicMedia"],"aiTool": "Adobe Firefly","c2paPresent": true,"validation": "valid","validationCodes": [],"signerOrg": "Adobe Inc.","signedAt": "2024-06-14","generator": "Adobe Firefly","c2paActions": ["c2pa.created (trainedAlgorithmicMedia)"],"digitalSourceType": null,"metadataStripped": false,"visibleLabel": "Adobe Firefly generated","visibleLabelWhere": "title","findings": [],"format": "jpeg","bytes": 844288,"changeType": "baseline"}
aiSource is c2pa, iptc-xmp, c2pa+iptc-xmp or null. validation is valid, untrusted, invalid or null
(no credentials). changeType is baseline (first run for the site), new, changed or unchanged. Also included:
hasExif, hasXmp, hasIptc, remoteManifestUrl (XMP dcterms:provenance), otherAiHints (non-standard AI
traces such as Stable Diffusion parameters), finalUrl after redirects.
Page rows (type: "page")
{"type": "page","pageUrl": "https://commons.wikimedia.org/wiki/File:Adobe_Firefly_generated_landscape_photography.jpg","status": "ok","imagesFound": 15,"imagesChecked": 8,"imagesSkipped": 7,"skippedReasons": { "too-small": 4, "not-image": 2, "failed": 1 },"aiMarked": 1,"signed": 1,"metadataStripped": 7,"coveragePct": 12.5,"visibleLabelFound": true,"visibleLabelPhrase": "AI-generated","findings": [{"type": "credentials-stripped-rendition","imageUrl": "https://thumb.wikimedia.org/.../1280px-Adobe_Firefly_generated_landscape_photography.jpg","detail": "6 rendition(s) of this image carry no Content Credentials or IPTC marker, while https://upload.wikimedia.org/.../Adobe_Firefly_generated_landscape_photography.jpg on the same page does. Your image resizer/CDN probably strips provenance.","isNew": true}],"findingCount": 2}
coveragePct = share of checked images with machine-readable provenance (Content Credentials or any IPTC
DigitalSourceType). Pages that cannot be fetched get status: "error" with the HTTP status and are not charged.
Summary row (type: "summary", always present, free)
Totals, coverage, credentials valid/untrusted/invalid, findings by type, resolved findings since the last run, and a
plain-English verdict, for example:
None of 120 images carry Content Credentials (C2PA) or IPTC AI markers. If you publish AI-generated images, the EU AI Act Art. 50 (in force since 2 Aug 2026) and California SB 942 expect machine-readable marking; your CMS, image optimizer or CDN may strip it (see README). 87 of 120 files carry no EXIF/XMP/IPTC metadata at all, a typical sign of a pipeline that strips metadata.
"Nothing signed" is the most common result today. It is useful: if you do publish AI or signed images, it means the
marks are lost before they reach visitors. Check your image optimizer/CDN settings ("preserve metadata", "keep C2PA",
"strip EXIF"), test with includeLinkedImages or direct imageUrls pointing at your originals, and re-run.
Pricing (pay per event)
| Event | Price | When |
|---|---|---|
page-audited | $0.004 | Per HTML page fetched and analysed (failed pages are free) |
image-checked | $0.001 | Per unique image downloaded and inspected (tiny, oversized, non-image and failed files are free; an image shown on many pages is charged once per run) |
finding | $0.01 | Per finding delivered (with onlyChanges: only new findings) |
The summary row is free. Examples: 100 pages × 10 images with no findings ≈ $0.40 + $1.00 = $1.40; the demo run
≈ $0.05. Runs respect your maximum total charge: when the budget is reached, the Actor stops cleanly, marks the
summary as partial and never charges beyond your limit.
Scheduling (monitoring)
Create a schedule (for example weekly) with the same input and onlyChanges: true. The first run is a full baseline;
later runs report new AI images, images whose credentials changed (e.g. became invalid after a CDN change), new
findings, and how many findings were resolved. Use a separate stateStoreName per project.
Limitations
- No JavaScript rendering: images injected by JavaScript (some sliders, infinite scroll, client-side frameworks)
are not seen. Common lazy-load attributes (
data-src,data-srcset) are read;lazyLoadedImagesNotCheckedcounts the rest that could be detected. - CSS background images, video and audio are not checked in this version.
- Watermarks (Google SynthID, Meta/TikTok invisible watermarks, Digimarc) are not detected: only embedded metadata and Content Credentials are read. A file without marks is not proof that it is human-made.
- Remote manifests (credentials stored in the cloud, referenced from XMP or HTTP headers) are reported via
remoteManifestUrlbut not fetched. - Visible-label detection is heuristic (phrase patterns in five languages near the image or on the page). Icons, badges or labels drawn into the image itself are not recognised.
credentials-stripped-renditiongroups renditions by file name (e.g.hero-1024x683.jpgandhero.jpg, MediaWiki960px-thumbnails); CDNs that rename files completely are not grouped.- "Untrusted" means the signer is not on the C2PA conformance or CAI trust lists bundled/refreshed at run time; it does not mean the file was tampered with.
- Some sites block or rate-limit automated requests. The Actor slows down per host on HTTP 429/503 and retries, and stops requesting a host after three requests still fail; those pages are reported with
status: "error"and not charged.
FAQ
Is this legal advice? No, this is not legal advice. It is an automated technical check of the files as they are delivered. Under the EU AI Act Art. 50 the machine-readable marking duty falls mainly on providers of AI systems; deployers' visible-disclosure duties apply mainly to deepfakes and AI-generated text on matters of public interest. Use the results as evidence and hygiene, and ask your legal adviser how the rules apply to you.
Why do pages from companies that promote Content Credentials show no credentials? Because most image pipelines re-encode images and drop metadata. That is exactly what this Actor is designed to detect.
Which formats are supported? JPEG, PNG, WebP, AVIF, HEIC, GIF and TIFF for C2PA; EXIF/XMP/IPTC detection for the same formats. SVG and ICO files are skipped.
Does it store the images? No. Images are inspected in memory and discarded; the dataset contains only the results.