# EU AI Act Image Labeler (Official Icons) (`rainminer/eu-ai-image-labeler`) Actor

Label AI generated and AI modified images with official EU AI Act icons. Stamp AI GENERATED, AI MODIFIED, or compact AI into JPEG, PNG, and WebP so the mark stays after download. Paste URLs or upload; Auto picks icon, colour, and corner. For newsrooms, marketers, and platforms.

- **URL**: https://apify.com/rainminer/eu-ai-image-labeler.md
- **Developed by:** [rainminer](https://apify.com/rainminer) (community)
- **Categories:** AI, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 image labeleds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

[![Before and after: an unlabeled photo, then the same file with an official AI GENERATED label stamped in](https://api.apify.com/v2/key-value-stores/vdPXKRB5smkRYhtEV/records/eu-ai-image-labeler-hero.jpg)](https://apify.com/rainminer/eu-ai-image-labeler)

### What is EU AI Act Image Labeler?

**EU AI Act Image Labeler** stamps official **EU AI Act labels** onto **AI generated** and **AI modified** images. Paste image URLs or upload JPEG, PNG, or WebP files. It embeds the Commission **AI GENERATED**, **AI MODIFIED**, or compact **AI** icon in the pixels so the label stays after download, forward, and screenshot.

Use it to disclose AI-generated content under **Article 50**: click Start and Auto recommends icon, colour, and corner — or pin `generated`, `modified`, or `basic`. Official icons are optional; the labelling duty is not. Using them does **not by itself** prove Article 50 compliance.

Also monitoring **TikTok** for existing AI disclosures? See [TikTok AI-Generated Label Scraper](https://apify.com/rainminer/tiktok-aigc-label-scraper) — scrape platform AIGC labels for EU AI Act brand-safety checks, then come back here to stamp your own creatives.

### What can EU AI Act Image Labeler do?

- Apply the official **EU AI Act labels** (**AI GENERATED**, **AI MODIFIED**, compact **AI**)
- Follow Commission **placement rules**: readable, not covered, **embedded in the pixels** so the mark survives download and reshare
- **Auto** — AI-powered: recommends which icon, colour treatment, and corner fit the pixels
- Auto-pick **black or white** from corner contrast when you choose the icon yourself
- Embed the label in the file (PNG, JPEG, or WebP) so it survives reshare and download
- Write plain-language alt text (`AI generated` / `AI modified` / `AI`) plus an IPTC Digital Source Type URI in metadata
- Batch-label public image URLs or uploaded files in one run
- Use a quieter 50% transparency mark for **artistic, satirical, or fictional** works

| [![Fully AI-generated EU label](https://api.apify.com/v2/key-value-stores/vdPXKRB5smkRYhtEV/records/eu-ai-image-labeler-generated.jpg)](https://apify.com/rainminer/eu-ai-image-labeler) | [![Partially AI-modified EU label](https://api.apify.com/v2/key-value-stores/vdPXKRB5smkRYhtEV/records/eu-ai-image-labeler-modified.jpg)](https://apify.com/rainminer/eu-ai-image-labeler) | [![Basic EU AI icon](https://api.apify.com/v2/key-value-stores/vdPXKRB5smkRYhtEV/records/eu-ai-image-labeler-basic.jpg)](https://apify.com/rainminer/eu-ai-image-labeler) |
| :---: | :---: | :---: |
| **AI GENERATED** | **AI MODIFIED** | **Basic AI** |
| Whole image is AI | Real photo, AI-altered | Compact AI mark |

[![EU label auto-picks a light icon on a dark background](https://api.apify.com/v2/key-value-stores/vdPXKRB5smkRYhtEV/records/eu-ai-image-labeler-contrast.jpg)](https://apify.com/rainminer/eu-ai-image-labeler)

### Official EU AI Act icons for images

The Actor uses the Commission’s free, user-tested icon set — the same artwork in [Section 2 / Annex I of the Code of Practice](https://digital-strategy.ec.europa.eu/en/policies/code-practice-ai-generated-content). Anyone may use the icons; signatories commit to the placement specs. This tool burns them into the file so the label is still there after download, which is the placement rule people miss when they only overlay a UI badge.

### Which EU label should I use?

Article 50(4) covers **deepfakes**: AI-generated or manipulated image, audio, or video that resembles existing persons, objects, places, entities, or events and would falsely appear authentic. Clearly fantastical images (for example a dragon) sit outside that definition.

Leave **EU label** on **Auto** (AI-powered) to get a recommended icon from the picture. Auto is a **visual recommendation**, not a legal classification — you remain responsible for whether the file is in scope and which disclosure fits. Pin `generated`, `modified`, or `basic` when you already know how the file was made.

| Official icon | Use when | Examples |
| --- | --- | --- |
| **AI GENERATED** | The entire image is AI, with no human-made pixels besides the prompt | AI portraits, fully synthetic product shots, generated news illustrations |
| **AI MODIFIED** | A real photograph or artwork was partly changed with AI | Face swap, virtual furniture in an empty apartment, sky replacement |
| **Basic AI** | AI was involved and you add your own text, or you need a compact mark | Custom “voices generated with” layouts, small corner mark on a film still |

User testing by the Commission found people recognised the mark more reliably when the icon included a text label such as “generated” or “modified”. Prefer those two variants over the basic icon unless you have a reason not to.

### How colour, variant, and corner are chosen

Two Auto paths — they are not the same:

1. **EU label = Auto (AI-powered)**\
   Auto looks at the image and recommends:
   - icon: `generated`, `modified`, or `basic`
   - official colour: black, white, black 50%, or white 50%
   - corner: the emptiest of the four corners
   - quieter artistic mark when the work looks satirical, fictional, or otherwise artistic\
     Explicit inputs win: if you pin colour, corner, or turn on **artistic / satirical work**, those values are not overridden. If Auto cannot choose, the Actor falls back to **AI GENERATED**, contrast colour, and bottom-left.

2. **Colour = Auto with a manual icon**\
   The Actor samples the destination corner. Dark corner → solid white icon; light corner → solid black. This path **never** picks 50% transparency, because a faint mark is less likely to meet Article 50(5) “clear and distinguishable”.

The overlay is always burned into the pixels after the choice is made.

### What the EU AI Act actually requires

A short, practical reading of the rules this Actor is built around (not legal advice):

1. **Article 50(4) — deployers (you, if you publish the image)** must disclose that deepfake image/audio/video was artificially generated or manipulated. Disclosure must be **clear and distinguishable** and shown **at first exposure** (Article 50(5)), and it must meet accessibility requirements.
2. **Official EU icons are optional.** The labelling duty is not. The icons are part of Section 2 / Annex I of the [Code of Practice on transparency of AI-generated content](https://digital-strategy.ec.europa.eu/en/policies/code-practice-ai-generated-content). Signatories commit to the Code’s placement rules; everyone else can still use the icons as a consistent, user-tested mark.
3. **Placement (Commission summary of the Code):** the icon should be perceivable at first exposure, sit where nothing else covers it, and be **embedded in the content** (or an equivalent UI overlay). It must remain visible when the file is downloaded or reshared.
4. **Article 50(2) — providers of generative systems** must also apply **machine-readable** marking (watermarks, C2PA, and similar). This Actor helps with the **visible** deployer label. It is not a substitute for provider-side provenance.
5. **Carve-outs:** authorised law-enforcement uses; **evidently artistic, creative, satirical, fictional or analogous works** (disclosure in a way that does not hamper enjoyment); AI-generated **text** on public-interest matters that had human review and editorial responsibility. Personal, non-professional use is outside the company-facing duty described in the Commission’s public guidance.

Sources: [EU icons for labelling AI-generated content](https://digital-strategy.ec.europa.eu/en/policies/eu-icons-labelling-ai-generated-content), [Article 50](https://artificialintelligenceact.eu/article/50/), [Code of Practice FAQ](https://digital-strategy.ec.europa.eu/en/faqs/code-practice-transparency-ai-generated-content).

### Who needs EU AI Act labels on AI generated images?

- **Newsrooms and publishers** — keep audiences from mistaking a synthetic still for a photograph
- **Marketing and e-commerce teams** — label AI product shots and campaign creatives before they go live in the EU
- **Real-estate and interior** — mark virtually staged apartments as AI modified
- **Social and performance agencies** — batch-stamp client assets before scheduling
- **Political and public-interest campaigns** — disclose deepfake-style portraits and event images
- **Stock and AI image marketplaces** — attach a consistent EU mark at export
- **DAM / CMS pipelines** — call the Actor from an integration and store the labeled file
- **Legal and compliance ops** — give deployers a repeatable way to apply the official EU AI Act labels
- **Film, games, and satire** — use artistic mode for a quieter mark that still discloses AI
- **Brand safety reviewers** — check that every hero image in a pack carries a visible label
- **Creators selling into the EU** — add `AI generated` on Midjourney / Flux / Imagen outputs
- **Platforms that host user images** — offer a one-click EU label before publish

### How to add an EU AI Act label to AI generated images

1. Open [EU AI Act Image Labeler](https://apify.com/rainminer/eu-ai-image-labeler) and click **Try for free**.
2. Paste one or more **image URLs**, or **upload** the files in the Images field.
3. Click **Start**. Defaults apply an official icon (AI-powered Auto picks which one, where, and in which colour) following Commission placement rules.
4. Download labeled files from the **Key-Value Store**, or use each dataset row’s `imageUrl`.

Open **Customize label (optional)** only if you want to pin the icon, corner, colour, size, or output format.

### How much does it cost to label AI images?

EU AI Act Image Labeler uses **pay-per-event** pricing on the Apify platform.

| Event | When it fires |
| --- | --- |
| **Image labeled** | Once per image successfully stamped. Failed downloads are not charged. |
| **Auto mode (per 1K tokens)** | When AI-powered Auto runs. `ceil((tokens) / 1000)`, at least one unit after a successful Auto call. Pin `generated` / `modified` / `basic` to skip. |
| **Actor start** | Once when the run starts (depends on memory; minimum one event). |

A typical JPEG or PNG labels in a few seconds. Apify Free plans include monthly credits that cover small test batches.

### Input

| Field | Type | Default | Description |
| --- | --- | --- | --- |
| `imageUrls` | Array | — | Image URLs or uploads to label. Required. |
| `labelType` | Enum | `auto` | `auto`, `generated`, `modified`, or `basic`. |
| `position` | Enum | `auto` | `auto`, `bottom-left`, `bottom-right`, `top-left`, `top-right`. |
| `color` | Enum | `auto` | `auto`, `black`, `white`, `black-50`, `white-50`. |
| `sizePercent` | Integer | `20` | Icon width as % of image width (5–45). |
| `paddingPercent` | Integer | `3` | Gap from the edge as % of the shorter side. |
| `artisticMode` | Boolean | `false` | Smaller, 50% transparency mark for artistic/satirical works. |
| `outputFormat` | Enum | `png` | `png`, `jpeg`, or `webp`. |
| `jpegQuality` | Integer | `90` | Quality for JPEG/WebP. |
| `maxItems` | Integer | `5` | Max images per run. |
| `proxyConfiguration` | Object | no proxy | Only needed if image hosts block the fetch. |

**Example input:**

```json
{
  "imageUrls": [
    "https://example.com/ai-portrait.jpg",
    "https://example.com/staged-apartment.jpg"
  ],
  "labelType": "auto",
  "position": "auto",
  "color": "auto",
  "maxItems": 5
}
```

### Output example

```json
{
  "sourceUrl": "https://example.com/ai-portrait.jpg",
  "imageUrl": "https://api.apify.com/v2/key-value-stores/{storeId}/records/labeled-1-generated-example.com.png",
  "labeledKey": "labeled-1-generated-example.com.png",
  "labelType": "generated",
  "colorUsed": "white",
  "position": "bottom-left",
  "altText": "AI generated",
  "width": 1024,
  "height": 1024,
  "digitalSourceType": "https://cv.iptc.org/newscodes/digitalsourcetype/trainedAlgorithmicMedia"
}
```

You can download the labeled files from the **Key-Value Store** tab, or via `imageUrl` on each dataset row.

### FAQ

#### Does this make me compliant with the EU AI Act?

No. The Commission’s own icon page says the **icons are optional**, the **labelling duty is not**, and **using the icons does not establish legal compliance by itself**. Deployers stay responsible for Article 50.

What this Actor *does* do is apply the **official EU AI Act labels** the way the placement summary describes: readable, not covered, **embedded in the file** so the mark survives download. That is the visible labelling step. It does not decide if your file is a deepfake, whether you are a deployer or a provider, or whether your website shows the mark at first exposure.

#### What is the difference between AI generated and AI modified?

**AI generated** is for images that are fully synthetic. **AI modified** is for authentic images that AI partly changed — the Commission’s examples include swapping a face onto a real photograph and furnishing an empty apartment with AI. If you are unsure, use **Auto** for a visual recommendation, or pick the description that matches how the file was made. Auto is not a legal determination.

#### Does Auto mode classify my image under the EU AI Act?

No. Auto only recommends which official icon, colour, and corner will stay readable. You still decide whether Article 50 applies.

#### Will the label still show after someone downloads the image?

Yes. The icon is composited into the image bytes. A UI-only overlay on a website can vanish on save; an embedded mark travels with the file. That matches the Commission’s guidance that the icon should remain visible when content is reshared or downloaded.

#### Does this add C2PA or invisible watermarks?

No. Article 50(2) machine-readable marking is a **provider** obligation (watermarking, C2PA, and similar). This Actor is the **visible** deployer label. It writes an IPTC Digital Source Type URI and alt text into metadata as a helper, which is not a replacement for C2PA.

#### What about artistic, satirical, or fictional work?

Article 50(4) narrows the duty for evidently artistic, creative, satirical, fictional, or analogous works: disclose that AI was used in a way that does not hamper enjoyment. Turn on **artistic / satirical work** to use the official 50% transparency variant and a smaller default size. You still need a disclosure.

#### Can I label images that are not deepfakes?

Yes. Many teams stamp every AI image they ship so EU viewers are never left guessing. That is stricter than the legal minimum and is a product choice, not a requirement of this Actor.

#### Can I upload files instead of pasting URLs?

Yes. The Images field accepts public URLs and Console uploads. Each upload is stored on Apify and passed to the Actor as a file URL. You can mix URLs and uploads in the same run.

#### What image formats are supported?

Downloads: JPEG, PNG, WebP, GIF, AVIF, TIFF, and other rasters **sharp** can decode. Output: PNG (default), JPEG, or WebP. Animated GIF/WebP is flattened to a still.

#### Is this legal advice?

No. Read the [Commission icon page](https://digital-strategy.ec.europa.eu/en/policies/eu-icons-labelling-ai-generated-content), [Article 50](https://artificialintelligenceact.eu/article/50/), and the [Code of Practice](https://digital-strategy.ec.europa.eu/en/policies/code-practice-ai-generated-content), and take advice for your use case.

#### How do I check AI labels already on TikTok videos?

Use [TikTok AI-Generated Label Scraper](https://apify.com/rainminer/tiktok-aigc-label-scraper) to read TikTok’s public **creator** and **platform** AIGC disclosures (`isAiGenerated`, label text, raw enums). That Actor monitors what the platform already shows — useful for EU AI Act brand-safety reviews. This Image Labeler is for **stamping official EU icons onto your own images** before you publish.

#### Other rainminer Actors

| Actor | Job |
| ----- | --- |
| [TikTok AI-Generated Label Scraper](https://apify.com/rainminer/tiktok-aigc-label-scraper) | Scrape TikTok AIGC disclosure labels for EU AI Act / Article 50 monitoring |
| [URL to PDF Converter](https://apify.com/rainminer/url-to-pdf-converter) | Render public webpages to PDF |
| [XML to JSON Converter](https://apify.com/rainminer/xml-to-json-converter) | Convert XML feeds to JSON |

### Image Credit

Official EU AI labelling icons: [European Commission, Shaping Europe’s digital future](https://digital-strategy.ec.europa.eu/en/policies/eu-icons-labelling-ai-generated-content). Sample photos in the banner and default input: [Wikimedia Commons](https://commons.wikimedia.org/).

# Actor input Schema

## `imageUrls` (type: `array`):

Image URLs or uploads (JPEG, PNG, WebP, GIF, AVIF, TIFF). Each item produces one labeled file. Paste a public URL or upload a file.

## `labelType` (type: `string`):

Which official EU icon to embed. Auto (default) is AI-powered: it recommends generated, modified, or the compact basic mark from the pixels — a visual hint, not a legal classification. Fully AI-generated: the whole image is AI with no human-created pixels (apart from prompting). Partially AI-modified: a real photo/artwork was altered with AI (face swap, virtual staging, object insert). Basic AI: AI was involved and you add your own text, or you need a compact mark for artistic/satirical works.

## `position` (type: `string`):

Corner where the icon is burned in. Auto lets AI-powered Auto pick the emptiest corner so the mark is less likely to cover faces or captions. The Code of Practice requires the mark to be clearly perceivable at first exposure, with no intervening overlays, and embedded in the pixels so it remains visible after download or reshare. Bottom-left is used when Auto is off or cannot choose.

## `color` (type: `string`):

Official colour treatments: solid black, solid white, or the 50% transparency variants. With EU label Auto, AI-powered Auto may pick any official treatment including 50% for artistic-looking work. With a manual label, Auto samples the destination corner and picks solid black or white for contrast — it never uses 50% transparency, because a faint mark is less likely to meet the 'clear and distinguishable' test in Article 50(5).

## `sizePercent` (type: `integer`):

Width of the EU icon as a percentage of the image width (generated/modified pills). The square basic AI mark uses half of this percentage so it matches the height of the text pills. Default 20% is readable on typical social and editorial photos. Artistic mode uses a smaller default unless you set this.

## `paddingPercent` (type: `integer`):

Gap between the icon and the image edge, as a percentage of the shorter image side.

## `artisticMode` (type: `boolean`):

For evidently artistic, creative, satirical, fictional or analogous works, Article 50(4) limits disclosure to a manner that does not hamper enjoyment of the work. When enabled, the Actor uses the 50% transparency variant and a smaller default size. You still must disclose that AI was used.

## `outputFormat` (type: `string`):

File format for the labeled image stored in the Key-Value Store. PNG keeps the icon's transparency on the canvas; JPEG flattens on white.

## `jpegQuality` (type: `integer`):

Quality 1–100 used when output format is JPEG or WebP.

## `maxItems` (type: `integer`):

Maximum number of images to label in this run.

## `proxyConfiguration` (type: `object`):

Proxy used only when fetching remote image URLs. Leave off unless those hosts block datacenter IPs. Uploads already on Apify storage do not use this proxy.

## Actor input object example

```json
{
  "imageUrls": [
    "https://upload.wikimedia.org/wikipedia/commons/thumb/3/3a/Cat03.jpg/500px-Cat03.jpg"
  ],
  "labelType": "auto",
  "position": "auto",
  "color": "auto",
  "sizePercent": 20,
  "paddingPercent": 3,
  "artisticMode": false,
  "outputFormat": "png",
  "jpegQuality": 90,
  "maxItems": 5,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

## `labeledImages` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "imageUrls": [
        "https://upload.wikimedia.org/wikipedia/commons/thumb/3/3a/Cat03.jpg/500px-Cat03.jpg"
    ],
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("rainminer/eu-ai-image-labeler").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "imageUrls": ["https://upload.wikimedia.org/wikipedia/commons/thumb/3/3a/Cat03.jpg/500px-Cat03.jpg"],
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("rainminer/eu-ai-image-labeler").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "imageUrls": [
    "https://upload.wikimedia.org/wikipedia/commons/thumb/3/3a/Cat03.jpg/500px-Cat03.jpg"
  ],
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call rainminer/eu-ai-image-labeler --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,rainminer/eu-ai-image-labeler"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/o6GhpzLov42ZadSse/builds/34i0eVw2Rii6cp9Ad/openapi.json
