# Shopify Alt Text Generator: Bulk Image SEO Auto-Fix EN/FR/AR (`j0l30/shopify-seo-alt-text-fixer`) Actor

Audit and fix Shopify image SEO for e-commerce stores: find missing, duplicate or filename alt text, generate alt text in English, French or Arabic, and add it in bulk (dry run, rollback). Outputs image issues with fixes, a CSV and a store report. Works as an AI agent / MCP tool.

- **URL**: https://apify.com/j0l30/shopify-seo-alt-text-fixer.md
- **Developed by:** [Youssef ferri](https://apify.com/j0l30) (community)
- **Categories:** SEO tools, E-commerce, AI
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.00 / 1,000 image audited with fixes

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?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

**Shopify Alt Text Generator** audits and fixes image SEO on Shopify stores. It finds product images with missing, duplicate or filename alt text, writes a better alt text for each one in **English, French or Arabic**, and adds it to your images in bulk (dry run first, free rollback) or hands you a **Shopify-ready CSV**.

Made for e-commerce teams on Shopify. Output: a dataset of image issues with a suggested fix for each, page SEO and image-speed results, a store report and the CSV. Run it in Apify Console, through the API, or as a tool for AI agents through the Apify MCP server. It also checks page-speed image problems (images over 200 KB, no WebP/AVIF, missing width/height, no lazy loading) and on-page SEO. No AI keys and no paid APIs.

### Use with AI agents (MCP)

This Actor is an AI agent / MCP tool. Through the hosted [Apify MCP server](https://docs.apify.com/platform/integrations/mcp), Claude, Cursor, VS Code, ChatGPT or any MCP client can call it, read the input fields below as the tool's docs, and get the results as JSON.

- **This tool only:** `https://mcp.apify.com/?tools=j0l30/shopify-seo-alt-text-fixer`
- **All 5 Lycorax tools:** `https://mcp.apify.com/?tools=j0l30/shopify-seo-alt-text-fixer,j0l30/woocommerce-seo-alt-text-fixer,j0l30/website-image-seo-audit,j0l30/domain-rdap-dns-reputation-checker,j0l30/website-exposure-defense-knowledge`

Sign in with Apify (OAuth) when your client asks, or send the header `Authorization: Bearer <APIFY_TOKEN>`. Runs are billed to your Apify account at the prices in "How much does it cost?". The tool returns the run and its `datasetId`; the agent then reads the rows with `get-dataset-items`, which the server adds for you.

**Claude Desktop / claude.ai:** Settings → Connectors → Add custom connector → paste the URL as *Remote MCP server URL*.

**Claude Code:**

```bash
claude mcp add --transport http lycorax "https://mcp.apify.com/?tools=j0l30/shopify-seo-alt-text-fixer"
```

**Cursor** (`~/.cursor/mcp.json`, or `.cursor/mcp.json` in your project):

```json
{ "mcpServers": { "lycorax": { "url": "https://mcp.apify.com/?tools=j0l30/shopify-seo-alt-text-fixer" } } }
```

**VS Code** (`.vscode/mcp.json`):

```json
{ "servers": { "lycorax": { "type": "http", "url": "https://mcp.apify.com/?tools=j0l30/shopify-seo-alt-text-fixer" } } }
```

**ChatGPT** (Developer mode on): Settings → Apps & Connectors → Create → *MCP Server URL* = the URL, *Authentication* = OAuth. ChatGPT can't change a connector's tools later, so pick the one-tool or the all-tools URL first.

Swap in the all-tools URL to give your agent every Lycorax tool at once.

**Example prompts**

1. *"Audit the product image alt text on https://www.allbirds.com (first 100 products) and list the 10 images that most need a fix, with the suggested alt text."*
2. *"Check my Shopify store https://my-store.com in French (altLanguage fr): which product images have missing or filename alt text? Give me the link to the Shopify-ready CSV."*
3. *"I own your-store.myshopify.com. Run a dry-run auto-fix of the alt text and show me the before/after for each image. Do not apply anything yet."*

Auto-fix changes a live store: agents should run with `dryRun: true` first and set `authorizationConfirmed` only after the store owner says yes.

**Output sample.** Two items from a real run on the public store allbirds.com (shortened). Rows have `type` `image`, `page`, `fix`, `rollback` or `report`.

```json
[
  {"type": "image", "product_title": "Women's Allbirds Flip Flop - Dusty Pink", "product_url": "https://www.allbirds.com/products/womens-allbirds-flip-flop-dusty-pink", "image_position": 1, "current_alt": "", "issues": ["missing"], "suggested_alt": "Women's Allbirds Flip Flop - Dusty Pink - Shoes, left side view", "alt_language": "en"},
  {"type": "report", "store": "https://www.allbirds.com", "products": 3, "images_total": 15, "images_with_alt_issues": 15, "alt_issue_counts": {"missing": 15}, "pages_audited": 2, "average_seo_score": 77, "fix_first": [{"issue": "missing", "count": 15}, {"issue": "images_without_alt", "count": 2}]}
]
```

Other Lycorax tools: [WooCommerce Alt Text Generator](https://apify.com/j0l30/woocommerce-seo-alt-text-fixer) · [Image SEO Checker for Any Website](https://apify.com/j0l30/website-image-seo-audit) · [Domain Reputation Checker](https://apify.com/j0l30/domain-rdap-dns-reputation-checker) · [Website Exposure Audit & Dorks List for Defense](https://apify.com/j0l30/website-exposure-defense-knowledge).

### What does this Shopify alt text generator do?

- **Alt text audit.** Flags images whose alt text is `missing`, `generic` ("image", "photo", "produit", "صورة"), a `filename` (IMG_1234.jpg), a `duplicate` across products, `too_long` (over 125 characters) or uses a `redundant_prefix` ("image of...", "photo de...").
- **Alt text generator in 3 languages.** Writes a unique, descriptive alt from each product's title, variant (color, size), type and the angle in the file name (front, back, side...), under 125 characters. The language is detected from the store (`<html lang>`, `Content-Language`) or set with `altLanguage`: `en`, `fr` or `ar`. Arabic alts use proper Arabic phrasing and the Arabic comma (،).
- **Auto-fix in Shopify (premium).** Writes the alts straight into your product media through the Shopify Admin GraphQL API (version 2026-10).
- **Shopify image SEO and page speed.** For audited pages: images over 200 KB as served to a modern browser, images not served as WebP/AVIF, `<img>` without `width`/`height` (layout shift, CLS), and images below the first one without `loading="lazy"`.
- **On-page SEO audit.** Title length, meta description, H1 count, canonical tag, Product schema, Open Graph image and images without alt. Each page gets a 0 to 100 score.
- **Fix-first list.** The 5 most common problems on the store, so you know where to start.

### Why fix Shopify alt text and image SEO?

Google Images uses alt text to understand product photos, and screen reader users depend on it, so missing alt text also breaks WCAG 2.2 accessibility rules. Most Shopify themes leave product image alt text empty unless you fill it in by hand, which takes hours on a large catalog. Heavy images and images without dimensions slow down the page and make it jump while loading. Better alt text and lighter images help Google and shoppers understand your pages, but no tool can promise a ranking.

### Who is it for?

- **Shopify store owners** who want image SEO and accessibility fixed in minutes, including French and Arabic stores (Morocco, France, Canada, the Gulf...)
- **Agencies and freelancers** auditing client stores or pitching new ones, since the audit works on any public Shopify store
- **AI agents and MCP clients** running SEO workflows that need clean JSON

### How much does it cost?

Pay per result. Platform usage is included.

| Event | Price |
|---|---|
| Image audited, with a suggested fix | $0.004 per image ($4 per 1,000) |
| Page SEO + image speed audit | $0.02 per page |
| Store report + CSV | $0.10 per run |
| Image fixed in your store (auto-fix) | $0.01 per image actually changed |

Dry runs, skipped images, failed writes and rollbacks are never charged as fixes. A store with 100 products, 400 images needing fixes and 20 audited pages costs about $2.10 to audit, plus $4 if you let it fix all 400. Set a spending cap on the run and the Actor stops cleanly before it would go over, without changing anything it can't charge for.

### Input

Audit only (no login):

```json
{ "storeUrl": "https://your-store.com", "maxProducts": 250, "maxAuditPages": 20, "maxImageChecks": 20, "altLanguage": "auto" }
```

Auto-fix (your own store):

```json
{ "storeUrl": "https://your-store.com", "shopDomain": "your-store.myshopify.com", "adminAccessToken": "shpat_...",
  "autoFix": true, "dryRun": true, "authorizationConfirmed": true, "altLanguage": "fr" }
```

### How to auto-fix alt text in Shopify (step by step)

1. In your Shopify admin go to **Settings → Apps and sales channels → Develop apps → Create an app**.
2. Under **Admin API scopes** tick `read_products` and `write_products`. Add `write_files` too if you want the newer `fileUpdate` API (otherwise the Actor uses `productUpdateMedia`).
3. **Install** the app and copy the **Admin API access token** (starts with `shpat_`).
4. Run the Actor with `autoFix` on, `dryRun` on, your `shopDomain`, the token and `authorizationConfirmed`. Check the **Auto-fix log**: every row shows the alt before and after.
5. Happy with it? Run again with `dryRun` off. Each change is logged and saved in `rollback.json`.
6. To undo, paste `rollback.json` into the **Rollback** field and run. Rollback is free.
7. Done? Uninstall the custom app to revoke the token.

#### Built-in safety

- **Dry run by default.** Nothing changes until you turn it off.
- **Your token stays yours.** It's a secret input, encrypted by Apify, never logged, and only ever sent to `https://<your-store>.myshopify.com`. A custom domain or plain HTTP is refused.
- **Never overwrites a human.** Right before each write it re-reads the image's alt. If someone changed it since the audit, the image is skipped. Rollback does the same: images edited after the fix are left alone.
- **Verified writes.** An image counts as fixed (and is charged) only when Shopify returns the new alt.
- **Rate limits respected.** It follows Shopify's leaky-bucket cost limits and waits instead of hammering your store.
- **Wrong token?** The run stops at once with a clear message, before anything is audited or charged.

### Output

Each dataset item has a `type`: `image`, `page`, `fix`, `rollback` or `report`. Views: **Results**, **Alt text fixes**, **Page SEO & image speed**, **Auto-fix log**.

```json
{ "type": "image", "product_title": "Chaussure Classique", "image_position": 1, "current_alt": "", "issues": ["missing"], "suggested_alt": "Chaussure Classique - Noir / 42 - Chaussures, vue de face", "alt_language": "fr" }
```

```json
{ "type": "image", "product_title": "حقيبة جلدية", "image_position": 2, "current_alt": "", "issues": ["missing"], "suggested_alt": "حقيبة جلدية - حقائب، منظر خلفي", "alt_language": "ar" }
```

```json
{ "type": "page", "url": "https://store.com/", "score": 85, "issues": ["title_too_long", "heavy_images", "images_missing_dimensions"],
  "image_speed": { "images_on_page": 14, "images_missing_dimensions": 3, "images_not_lazy": 2, "images_size_checked": 10, "heavy_images": [{ "url": "https://store.com/cdn/shop/files/hero.jpg", "kb": 412 }], "images_not_next_gen": [] } }
```

```json
{ "type": "fix", "media_id": "gid://shopify/MediaImage/123", "before": "IMG_1234.jpg", "after": "Classic Sneaker - Shoes, back view", "status": "fixed" }
```

The `report` item gives totals, an average SEO score, `image_speed` totals, a `fix_first` list, the `csv_url` and the `auto_fix` summary.

### AI agents can pay here (x402, USDC)

Agents don't need an Apify account. With [x402](https://docs.apify.com/integrations/x402), an agent pays in USDC on Base, gets a prepaid token, and calls `https://api.apify.com/v2/acts/j0l30~shopify-seo-alt-text-fixer/run-sync-get-dataset-items`.

### FAQ

#### Do I need my Shopify login or an API key?

Not for the audit. It reads the store's public product data and pages, the same data any shopper sees. Auto-fix needs an Admin API token from a custom app in **your** store, never your password.

#### Does it change my store?

Only if you turn on auto-fix **and** turn off dry run **and** confirm you're authorized. Otherwise it only reads, and you import the CSV yourself.

#### Which languages does the alt text generator support?

English, French and Arabic. Auto-detect picks the store's language; you can force one with `altLanguage`.

#### Does it use AI?

No. The alt text is written by fixed rules from your real product data, so it's fast, consistent and free of made-up details.

#### Does it work on stores that aren't on Shopify?

No. It needs Shopify's public `/products.json`. If a store hides it, the run stops with a clear message, and you're charged nothing. For WooCommerce or WordPress, use the [WooCommerce Alt Text Generator](https://apify.com/j0l30/woocommerce-seo-alt-text-fixer); for any other site, the [Image SEO Checker](https://apify.com/j0l30/website-image-seo-audit).

#### How do I add alt text to images in Shopify in bulk?

Run an audit, check the suggested alts, then either import the CSV or turn on auto-fix with a custom app token (steps above). Dry run shows every change before anything is written.

### How it compares (honestly)

- **Typing alt text by hand in Shopify admin:** same end result, one image at a time. This handles the whole catalog in one run, and you review a dry run before anything changes.
- **AI vision alt text apps:** tools that send each photo to an image model can describe things that aren't in your product data, like a background or a pattern. This Actor doesn't look at the photo. It writes from your title, variant, type and the angle in the file name, so it never invents details, needs no AI keys and gives the same alt every time. If you want scene descriptions, a vision tool fits better, or edit our suggestions.
- **Apps installed in your store:** they live inside your admin and can act on new uploads. This one needs no install for the audit, works on any public Shopify store (handy for agencies), and charges per result. It doesn't watch your store in the background: schedule it in Apify for regular checks.

### Real case study (anonymized)

**Footwear and apparel brand on Shopify, audited 17 Oct 2026.** 100 of the 100 product images scanned had no alt text at all. The Actor wrote a unique alt for every one, reading the angle from the file name ("..., back view", "..., left side view"), and produced a ready-to-import CSV. The brand's pages scored 78/100 on average. The main fixes: titles over 60 characters, overlong meta descriptions and multiple H1s.

### More tools from the same publisher

- [WooCommerce Alt Text Generator](https://apify.com/j0l30/woocommerce-seo-alt-text-fixer): the same for WooCommerce products and WordPress media, with a WP-CLI script.
- [Image SEO Checker for Any Website](https://apify.com/j0l30/website-image-seo-audit): image SEO and alt text checks on any CMS, with white-label PDF reports.
- [Domain Reputation Checker](https://apify.com/j0l30/domain-rdap-dns-reputation-checker): bulk RDAP lookup, DNS, SPF and DMARC checks and a risk score.
- [Website Exposure Audit & Dorks List for Defense](https://apify.com/j0l30/website-exposure-defense-knowledge): playbooks to find and fix leaked files on sites you own.

### Legal and responsible use

- **Public pages only for audits.** It reads what any browser or search engine can see. No login, and it never bypasses paywalls, captchas or blocks.
- **Respects robots.txt.** It follows the rules for `User-agent: *` and `LycoraxSEOAudit` on every host it reads (the store and its image CDN), honors `Crawl-delay`, and waits at least 1 second between public requests. Image size checks are capped per run (`maxImageChecks`). Every skipped URL is counted in `skipped_by_robots_txt`.
- **Auto-fix only with permission.** It changes a store only with that store's own Admin API token and your confirmation that you own it or are authorized to manage it.
- **No personal data.** It collects only page URLs, image URLs, alt text and SEO tags. It never reads customers or orders. Nothing is stored after your run except your own results.
- **No ranking guarantees.** Better alt text and faster images are good practice; search rankings depend on many things no tool controls.
- **Your responsibility.** Audit sites you own or are authorized to audit, or use the data for public research, and follow the target site's terms.
- **Anonymized case studies.** We don't name any brand without its permission.
- Not affiliated with or endorsed by Shopify, WooCommerce, WordPress or Google. Trademarks belong to their owners.

### Privacy

No tracking, and no third-party calls beyond the store you name, its image CDN and, for auto-fix, your store's Shopify Admin API. By Youssef Ferri / [Lycorax Technologies](https://ko-fi.com/lycorax).

# Actor input Schema

## `storeUrl` (type: `string`):

Public URL of the Shopify store to audit (home page or any page of it). The audit needs no login. Example: https://www.allbirds.com

## `maxProducts` (type: `integer`):

Maximum number of products to read from the store (1 to 5,000). Example: 250

## `maxAuditPages` (type: `integer`):

Home page plus product pages to audit for title, meta description, H1, canonical, Product schema and page-speed image issues (0 to 500). 0 skips the page audit. Example: 20

## `maxImageChecks` (type: `integer`):

How many page images to check for file size (over 200 KB) and format (WebP/AVIF), with one polite HEAD request each, at least 1 second apart (0 to 100). 0 skips size checks. Example: 20

## `altLanguage` (type: `string`):

Language of the suggested alt text: auto (reads the store's <html lang> and Content-Language), en, fr or ar. Alts are written by rules from your product data, no AI. Example: fr

## `onlyImagesWithIssues` (type: `boolean`):

true = return (and charge for) only images with alt text problems. false = return every image. Example: true

## `autoFix` (type: `boolean`):

Premium ($0.01 per image actually changed). true = write the suggested alt text into product media through the Shopify Admin API. Needs shopDomain, adminAccessToken and authorizationConfirmed. Every change is re-checked, logged and can be rolled back. Example: false

## `dryRun` (type: `boolean`):

For autoFix. true = show exactly what would change without touching the store. false = apply the changes. Run with true first. Example: true

## `authorizationConfirmed` (type: `boolean`):

Set to true only if you own this store or are authorized to change it. Required for autoFix and rollback. AI agents: ask the store owner before setting it. Example: true

## `shopDomain` (type: `string`):

The store's myshopify.com domain (Shopify admin → Settings → Domains). Needed for autoFix and rollback. Your token is only ever sent here, over HTTPS. Example: your-store.myshopify.com

## `adminAccessToken` (type: `string`):

Secret, for autoFix and rollback. Shopify admin → Settings → Apps and sales channels → Develop apps → Create an app → Admin API scopes read_products, write_products (add write_files for fileUpdate) → Install → copy the Admin API access token. Uninstall the app to revoke it. Example format: shpat_xxxxxxxx

## `maxFixes` (type: `integer`):

Upper limit of images changed in one autoFix run (1 to 5,000). Example: 500

## `rollback` (type: `array`):

Free undo. Paste the array from rollback.json of an earlier applied fix run (key-value store). Restores each image's original alt text; images edited after the fix are left alone. Needs shopDomain, adminAccessToken and authorizationConfirmed. Example: \[{"id": "gid://shopify/MediaImage/123", "alt_before": "", "alt_written": "Blue shirt, front view"}]

## Actor input object example

```json
{
  "storeUrl": "https://www.allbirds.com",
  "maxProducts": 250,
  "maxAuditPages": 20,
  "maxImageChecks": 20,
  "altLanguage": "auto",
  "onlyImagesWithIssues": true,
  "autoFix": false,
  "dryRun": true,
  "authorizationConfirmed": false,
  "maxFixes": 500
}
```

# Actor output Schema

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

No description

## `images` (type: `string`):

No description

## `pages` (type: `string`):

No description

## `fixes` (type: `string`):

No description

## `csv` (type: `string`):

No description

## `report` (type: `string`):

No description

## `rollback` (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 = {
    "storeUrl": "https://www.allbirds.com"
};

// Run the Actor and wait for it to finish
const run = await client.actor("j0l30/shopify-seo-alt-text-fixer").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 = { "storeUrl": "https://www.allbirds.com" }

# Run the Actor and wait for it to finish
run = client.actor("j0l30/shopify-seo-alt-text-fixer").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 '{
  "storeUrl": "https://www.allbirds.com"
}' |
apify call j0l30/shopify-seo-alt-text-fixer --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,j0l30/shopify-seo-alt-text-fixer"
        }
    }
}
```

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/iRMWegkysgJoHyCPd/builds/1A778vPvluB2KlRBO/openapi.json
