# Image EXIF Injector — Add Copyright & Metadata (`hipersoft/image-exif-injector`) Actor

Bulk-write EXIF metadata into images: copyright, author, description, software and comments. Stamp ownership across photo sets in one run.

- **URL**: https://apify.com/hipersoft/image-exif-injector.md
- **Developed by:** [hiper soft](https://apify.com/hipersoft) (community)
- **Categories:** Developer tools, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.0025 / image tagged

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#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

## Image EXIF Injector — Add Copyright, Author & Metadata

**Write EXIF metadata into images in bulk** — stamp **copyright, author, caption, software and comments** across an entire photo set in one run and get back tagged JPEG files ready to publish or deliver. The companion to stripping metadata: this one *adds* the ownership and attribution data you want images to carry.

### What it does

- Writes **copyright** and **author/artist** into each image's EXIF.
- Adds a **description/caption**, **software** name and a free-text **comment**.
- Optionally **keeps existing metadata** and merges the new fields in.
- Corrects orientation and outputs clean, web-ready JPEGs.
- Returns a per-image report of which fields were written.

### Use cases

- **Photographers & studios** — stamp copyright and author across thousands of exports before delivery.
- **Stock & DAM pipelines** — apply consistent attribution and captions to catalog images.
- **Agencies & brands** — mark ownership on campaign assets in bulk.
- **Publishers** — embed credit lines so attribution travels with the file.

### Input

```json
{
  "imageUrls": ["https://example.com/photo1.jpg"],
  "copyright": "© 2026 Acme Studio",
  "artist": "Jane Doe",
  "description": "Product shot — spring collection",
  "software": "Acme Pipeline",
  "userComment": "Do not redistribute",
  "keepExisting": true
}
```

| Field | Type | Description |
|---|---|---|
| `imageUrls` | array | Direct links to the images to tag. |
| `copyright` | string | Copyright notice written to EXIF. |
| `artist` | string | Author / photographer name. |
| `description` | string | Image caption / description. |
| `software` | string | Software or pipeline name. |
| `userComment` | string | Free-text EXIF comment. |
| `keepExisting` | boolean | Merge with existing metadata instead of replacing. Default `true`. |

### Output

Each image becomes one dataset item, and the tagged file is saved to your key-value store.

```json
{
  "sourceUrl": "https://example.com/photo1.jpg",
  "taggedUrl": "https://api.apify.com/v2/key-value-stores/.../records/tagged-0001-photo1.jpg",
  "fieldsWritten": ["Copyright", "Artist", "ImageDescription"],
  "copyright": "© 2026 Acme Studio",
  "artist": "Jane Doe",
  "bytes": 512044,
  "ok": true
}
```

#### Output schema

| Field | Type | Description |
|---|---|---|
| `sourceUrl` | string (URL) | The original image URL. |
| `taggedUrl` | string (URL) | Link to the tagged image in your key-value store. |
| `fieldsWritten` | array | EXIF fields written. |
| `copyright` | string | Copyright value applied. |
| `artist` | string | Author value applied. |
| `bytes` | integer | Output file size. |
| `ok` | boolean | Whether the image was processed successfully. |

### FAQ

**Which fields can I write?**
Copyright, author/artist, description/caption, software and a free-text user comment — the standard EXIF attribution fields.

**Does it keep the existing metadata?**
By default yes — the new fields are merged. Turn off `keepExisting` to write only your fields.

**What format are the results?**
Tagged images are saved as JPEG in the key-value store; the report dataset exports to JSON, CSV, Excel and XML.

**Can I automate or integrate it?**
Yes. Connect it with almost any app via [integrations on the Apify platform](https://apify.com/integrations) — [Make](https://apify.com/integrations/make), [Zapier](https://apify.com/integrations/zapier), [Slack](https://docs.apify.com/platform/integrations/slack), [Google Drive](https://docs.apify.com/platform/integrations/drive) and more, plus the [Apify API](https://docs.apify.com/api/v2).

### Notes

Original clean-room implementation. You are responsible for how you use the processed images. Pairs with the [Image Metadata Remover](https://apify.com/hipersoft/image-metadata-remover).

# Actor input Schema

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

Direct links to the images to tag. Each image gets the metadata below written into it and is saved to your storage as JPEG.

## `copyright` (type: `string`):

Copyright notice, e.g. "© 2026 Acme Studio".

## `artist` (type: `string`):

Creator or photographer name.

## `description` (type: `string`):

Image caption or description.

## `software` (type: `string`):

Software or pipeline name to record.

## `userComment` (type: `string`):

Free-text comment stored in the EXIF UserComment field.

## `keepExisting` (type: `boolean`):

Merge with any metadata already on the image instead of replacing it.

## Actor input object example

```json
{
  "imageUrls": [
    "https://example.com/photo1.jpg"
  ],
  "copyright": "© 2026 Acme Studio",
  "keepExisting": true
}
```

# Actor output Schema

## `results` (type: `string`):

The tagged images as dataset items.

# 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://raw.githubusercontent.com/ianare/exif-samples/master/jpg/Canon_40D.jpg"
    ],
    "copyright": "© 2026 Acme Studio"
};

// Run the Actor and wait for it to finish
const run = await client.actor("hipersoft/image-exif-injector").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://raw.githubusercontent.com/ianare/exif-samples/master/jpg/Canon_40D.jpg"],
    "copyright": "© 2026 Acme Studio",
}

# Run the Actor and wait for it to finish
run = client.actor("hipersoft/image-exif-injector").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://raw.githubusercontent.com/ianare/exif-samples/master/jpg/Canon_40D.jpg"
  ],
  "copyright": "© 2026 Acme Studio"
}' |
apify call hipersoft/image-exif-injector --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,hipersoft/image-exif-injector"
        }
    }
}

```

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/eH9ZMJTALwItn79q4/builds/kkhgzSoWAsbLHuINV/openapi.json
