# IconArchive Scraper (`crawlerbros/iconarchive-scraper`) Actor

Scrape IconArchive.com - search icons by keyword, browse categories/tags, fetch icon pack contents, single-icon metadata (designer, license, tags, download URLs at every size), and designer profiles.

- **URL**: https://apify.com/crawlerbros/iconarchive-scraper.md
- **Developed by:** [Crawler Bros](https://apify.com/crawlerbros) (community)
- **Categories:** Automation, Developer tools, Integrations
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
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

## IconArchive Scraper

Scrape [IconArchive.com](https://www.iconarchive.com) — one of the web's largest free icon
directories, covering 700,000+ icons across thousands of free and commercial icon packs.
Search by keyword, browse any of the 48 fixed categories or a tag, pull every icon inside
a named pack, fetch full metadata for a single icon (license, tags, designer, download URLs
at every size), list every pack by a specific designer, or discover valid tags and designers
by browsing the site's own directories. HTTP-only, no login, no proxy required.

### What this actor does

- **9 modes** covering every reliable browse/search axis IconArchive exposes:
  - `search` — free-text keyword search across all icons
  - `category` — browse one of the 48 fixed categories (returns icon packs)
  - `tag` — browse icons by an exact tag (e.g. `cat`, `arrow`, `folder`)
  - `pack` — every icon inside one named icon pack, with pack-level metadata merged in
  - `icon` — full metadata for a single icon page (designer, license, tags, all sizes)
  - `artist` — every icon pack published by one designer, with designer stats merged in
  - `curated` — the site's curated pack listings: newest, popular, random, SVG, commercial-free,
    high-resolution, largest, staff picks, and pixelart
  - `tags` — the full tag directory by starting letter, with each tag's exact icon count
    (use this to discover valid values for mode=`tag`)
  - `designers` — the full designer directory, optionally filtered by starting letter, with
    each designer's exact pack count (use this to discover valid values for mode=`artist`)
- **Download URLs at every standard size** — 16, 24, 32, 48, 64, 72, 96, 128, and 256px, built
  from the site's own CDN so every link resolves directly to a PNG
- **Windows `.ico` and macOS `.icns` download URLs** — every icon's converted-format
  downloads, alongside the PNGs
- **Designer and license metadata** — commercial-usage flag, license text, designer profile
  links, wherever the source page exposes them
- **Automatic pagination** up to your `maxItems` cap
- **Omit-empty output** — a field only appears on a record if real data was found for it

### Output fields

#### Icon records (`recordType: "icon"` — from `search`, `tag`, `pack`, `icon` modes)

| Field | Description |
|---|---|
| `iconId` | Numeric IconArchive icon ID |
| `name` | Icon title |
| `packSlug` / `packName` | Parent icon pack slug / display name |
| `packUrl` | Icon pack page URL |
| `designerSlug` / `designerName` | Designer slug / display name (name only available on `pack`/`icon` modes) |
| `designerUrl` | Designer profile page URL |
| `packIconCount` | Number of icons in the parent pack (mode=`icon`/`pack`) |
| `license` | License text as published on the icon/pack page |
| `commercialUseAllowed` | `true`/`false` — whether commercial use is allowed (mode=`icon` only) |
| `categories` | Pack's category names (mode=`pack` only) |
| `tags` | Tag list (mode=`icon` only) |
| `imageUrl16` … `imageUrl256` | Direct PNG download URLs at 16/24/32/48/64/72/96/128/256px |
| `icoUrl` | Windows `.ico` download URL |
| `icnsUrl` | macOS `.icns` download URL |
| `listingTotalCount` | Total icons IconArchive reports for this query/tag, as shown on page 1 (mode=`search`/`tag` only) |
| `sourceUrl` | Canonical icon page URL |
| `scrapedAt` | UTC ISO timestamp |
| `recordType` | Always `"icon"` |

#### Icon pack records (`recordType: "iconPack"` — from `category`, `artist`, `curated` modes)

| Field | Description |
|---|---|
| `packSlug` / `packName` | Icon pack slug / display name |
| `sourceUrl` | Icon pack page URL |
| `designerSlug` / `designerUrl` | Designer slug / profile URL (derived from the pack's own URL) |
| `designerName` / `designerWebsite` | Designer display name / external website (mode=`artist` only) |
| `designerTotalPacks` / `designerTotalIcons` | Designer's total published pack / icon counts across all of IconArchive (mode=`artist` only) |
| `iconCount` | Number of icons in the pack |
| `previewImageUrl` | Preview strip image for the pack |
| `maxResolution` | Highest available resolution badge (e.g. `1024px`), where shown |
| `category` | Requested category slug (mode=`category` only) |
| `listingTotalCount` | Total icon packs IconArchive reports for this browse axis, as shown on page 1 (mode=`category`/`curated` only) |
| `scrapedAt` | UTC ISO timestamp |
| `recordType` | Always `"iconPack"` |

#### Tag directory records (`recordType: "tag"` — from `tags` mode)

| Field | Description |
|---|---|
| `tagSlug` | Tag URL slug, e.g. `cat` — feed this into `tag` on mode=`tag` |
| `tagName` | Human-readable tag name |
| `iconCount` | Exact number of icons tagged with this tag, as published by IconArchive |
| `sourceUrl` | Tag browse page URL |
| `scrapedAt` | UTC ISO timestamp |
| `recordType` | Always `"tag"` |

#### Designer directory records (`recordType: "designer"` — from `designers` mode)

| Field | Description |
|---|---|
| `designerSlug` | Designer URL slug, e.g. `fasticon` — feed this into `artistSlug` on mode=`artist` |
| `designerName` | Designer display name |
| `designerUrl` | Designer profile page URL |
| `totalPacks` | Exact number of icon packs published by this designer, as published by IconArchive |
| `scrapedAt` | UTC ISO timestamp |
| `recordType` | Always `"designer"` |

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `mode` | select | `search` | `search` / `category` / `tag` / `pack` / `icon` / `artist` / `curated` / `tags` / `designers` |
| `query` | string | `cat` | Keyword (mode=`search`) |
| `categorySlug` | select | `animals-icons` | One of 48 fixed categories (mode=`category`) |
| `tag` | string | `cat` | Exact tag (mode=`tag`) |
| `packSlug` | string | – | Icon pack slug, e.g. `cat-icons-by-fasticon` (mode=`pack`) |
| `iconUrl` | string | – | Full single-icon page URL (mode=`icon`) |
| `artistSlug` | string | – | Designer slug, e.g. `fasticon` (mode=`artist`) |
| `listingType` | select | `newest` | `newest` / `popular` / `random` / `svg` / `commercialFree` / `highRes` / `largest` / `staffPicks` / `pixelart` (mode=`curated`) |
| `tagLetter` | select | `a` | Starting letter `a`–`z` of the tag directory to browse (mode=`tags`) |
| `artistLetter` | select | `all` | Starting letter filter for the designer directory: `all` / `0-9` / `a`–`z` (mode=`designers`) |
| `minIconCount` | int | – | Drop records with fewer icons than this: icon packs (mode=`category`/`artist`/`curated`) or tags (mode=`tags`) |
| `maxItems` | int | `20` | Hard cap on emitted records (1–2000) |

#### Example: search for icons by keyword

```json
{ "mode": "search", "query": "cat", "maxItems": 50 }
```

#### Example: browse a category, only large packs

```json
{ "mode": "category", "categorySlug": "food-icons", "minIconCount": 30, "maxItems": 100 }
```

#### Example: every icon inside one pack

```json
{ "mode": "pack", "packSlug": "cat-icons-by-fasticon", "maxItems": 50 }
```

#### Example: full metadata for a single icon

```json
{ "mode": "icon", "iconUrl": "https://www.iconarchive.com/show/cat-icons-by-fasticon/Cat-Orange-icon.html" }
```

#### Example: all packs by one designer

```json
{ "mode": "artist", "artistSlug": "fasticon", "maxItems": 50 }
```

#### Example: newest icon packs

```json
{ "mode": "curated", "listingType": "newest", "maxItems": 30 }
```

#### Example: discover tags starting with a letter, only popular ones

```json
{ "mode": "tags", "tagLetter": "c", "minIconCount": 500, "maxItems": 100 }
```

#### Example: discover designers whose name starts with "F"

```json
{ "mode": "designers", "artistLetter": "f", "maxItems": 100 }
```

### Use cases

- **App / web design** — bulk-discover icon packs in a matching category and license
- **Design-system audits** — pull every icon in a pack with license and commercial-use terms
- **Asset cataloging** — build a searchable local index of icon metadata and download links
- **Designer research** — track a designer's full catalog and pack count over time
- **Content curation** — surface newest, most popular, or staff-picked icon packs

### FAQ

**Do I need to log in or provide an API key?** No — the actor scrapes IconArchive's public
pages directly; no account, cookies, or proxy are required.

**What license do the icons have?** Each icon page publishes its own license text and a
commercial-use flag as set by the pack's designer — always check the `license` and
`commercialUseAllowed` fields (mode=`icon`/`pack`) before using an icon commercially.

**Why do some icon records have a `designerName` and others only a `designerSlug`?** Search,
tag, and category listing pages only expose the designer's URL slug; the full display name is
only shown on the pack detail (`pack`), single-icon (`icon`), and designer (`artist`) pages.
When you need the designer's display name, use one of those three modes.

**What image sizes are available?** Every icon is available at 16, 24, 32, 48, 64, 72, 96, 128,
and 256 pixels square — all nine are included as direct PNG URLs on every icon record.

**Can I filter icon packs by size?** Yes — set `minIconCount` on `category`, `artist`, or
`curated` mode to drop packs with fewer icons than your threshold.

**How many categories are there?** 48 fixed categories, from Adobe to Vintage — see the
`categorySlug` dropdown for the full list.

**How do I find a valid tag or designer slug without guessing?** Use `mode=tags` (browse
every tag starting with a chosen letter, with its exact icon count) or `mode=designers`
(browse every designer, optionally filtered by starting letter, with their exact pack count)
to discover slugs before feeding them into `mode=tag` or `mode=artist`.

**Is this affiliated with IconArchive?** No, this is a third-party actor that scrapes
IconArchive's public pages. It is not affiliated with, endorsed by, or sponsored by
IconArchive.com.

# Actor input Schema

## `mode` (type: `string`):

What to fetch.

## `query` (type: `string`):

Free-text keyword (mode=search), e.g. `cat`, `home`, `arrow`.

## `categorySlug` (type: `string`):

One of the 48 fixed IconArchive categories.

## `tag` (type: `string`):

Exact tag slug, e.g. `cat`, `arrow`, `folder`.

## `packSlug` (type: `string`):

Pack slug from its IconArchive URL, e.g. `saint-whiskers-icons-by-iconka` (from `/show/saint-whiskers-icons-by-iconka.html`).

## `iconUrl` (type: `string`):

Full single-icon page URL, e.g. `https://www.iconarchive.com/show/cat-icons-by-fasticon/Cat-Orange-icon.html`.

## `artistSlug` (type: `string`):

Designer slug from their IconArchive URL, e.g. `fasticon` (from `/artist/fasticon.html`).

## `listingType` (type: `string`):

Which curated icon-pack listing to browse.

## `tagLetter` (type: `string`):

Browse the full tag directory: every tag whose name starts with this letter, with its exact icon count.

## `artistLetter` (type: `string`):

Filter the full designer directory to names starting with this letter. Use `all` for every designer.

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

Hard cap on the number of records emitted.

## `minIconCount` (type: `integer`):

Drop records with fewer icons than this: icon packs (mode=category, artist, curated) or tags (mode=tags).

## Actor input object example

```json
{
  "mode": "search",
  "query": "cat",
  "categorySlug": "animals-icons",
  "tag": "cat",
  "packSlug": "cat-icons-by-fasticon",
  "iconUrl": "https://www.iconarchive.com/show/cat-icons-by-fasticon/Cat-Orange-icon.html",
  "artistSlug": "fasticon",
  "listingType": "newest",
  "tagLetter": "a",
  "artistLetter": "all",
  "maxItems": 20
}
```

# Actor output Schema

## `icons` (type: `string`):

Dataset containing all scraped IconArchive records.

# 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 = {
    "mode": "search",
    "query": "cat",
    "categorySlug": "animals-icons",
    "tag": "cat",
    "packSlug": "cat-icons-by-fasticon",
    "iconUrl": "https://www.iconarchive.com/show/cat-icons-by-fasticon/Cat-Orange-icon.html",
    "artistSlug": "fasticon",
    "listingType": "newest",
    "tagLetter": "a",
    "artistLetter": "all",
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("crawlerbros/iconarchive-scraper").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 = {
    "mode": "search",
    "query": "cat",
    "categorySlug": "animals-icons",
    "tag": "cat",
    "packSlug": "cat-icons-by-fasticon",
    "iconUrl": "https://www.iconarchive.com/show/cat-icons-by-fasticon/Cat-Orange-icon.html",
    "artistSlug": "fasticon",
    "listingType": "newest",
    "tagLetter": "a",
    "artistLetter": "all",
    "maxItems": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("crawlerbros/iconarchive-scraper").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 '{
  "mode": "search",
  "query": "cat",
  "categorySlug": "animals-icons",
  "tag": "cat",
  "packSlug": "cat-icons-by-fasticon",
  "iconUrl": "https://www.iconarchive.com/show/cat-icons-by-fasticon/Cat-Orange-icon.html",
  "artistSlug": "fasticon",
  "listingType": "newest",
  "tagLetter": "a",
  "artistLetter": "all",
  "maxItems": 20
}' |
apify call crawlerbros/iconarchive-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,crawlerbros/iconarchive-scraper"
        }
    }
}

```

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/gzaXbFIgGcjKCjHvX/builds/bDdbkdd7ESaaNhVVU/openapi.json
