# Pinterest Image Downloader (`maximedupre/pinterest-image-downloader`) Actor

Download images from public Pinterest pins, boards, or one keyword search. Get direct source links and available previews, sizes, formats, titles, descriptions, and public pin context in your dataset.

- **URL**: https://apify.com/maximedupre/pinterest-image-downloader.md
- **Developed by:** [Maxime Dupré](https://apify.com/maximedupre) (community)
- **Categories:** Social media, Developer tools, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.50 / 1,000 image retrieveds

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/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

### 📌 Download Public Pinterest Images

Pinterest Image Downloader helps designers, content teams, and developers collect images from public Pinterest pins, public boards, or one keyword search. It returns direct source image links and available previews, sizes, formats, pin text, board and creator details, and public engagement data in an Apify dataset.

**Try these workflows**

- Save a direct source image link and available pin details with **[Pinterest Downloader](https://apify.com/maximedupre/pinterest-image-downloader/examples/pinterest-downloader)**.
- Download one public pin image with **[Download Pinterest Image](https://apify.com/maximedupre/pinterest-image-downloader/examples/download-pinterest-image)**.
- Collect a public pin's photo link and metadata with **[Pinterest Photo Downloader](https://apify.com/maximedupre/pinterest-image-downloader/examples/pinterest-photo-downloader)**.
- Find a higher-quality source image link with **[Pinterest Downloader HD](https://apify.com/maximedupre/pinterest-image-downloader/examples/pinterest-downloader-hd)**.
- Save a high-definition photo link for later use with **[Pinterest Photo Download HD](https://apify.com/maximedupre/pinterest-image-downloader/examples/pinterest-photo-download-hd)**.

#### 🖼️ What the Pinterest Image Downloader Returns

**Dataset link**

The output includes a link named `dataset` that opens the default Apify dataset for the run.

**Image rows**

Each saved row has a Pinterest pin URL and a direct source image URL. When Pinterest exposes them, the row also includes a preview link, image size and format, pin title and description, board and creator details, public engagement counts, and the pin creation time.

#### ▶️ Find Pinterest Images Your Way

**Quick start**

1. Choose `Pin URLs`, `Board URL`, or `Keyword` in the input.
2. Add one or more public pin URLs, one public board URL, or one keyword.
3. Set `minWidth` or `minHeight` if you want to skip smaller images.
4. Keep the prefilled `maxItems` value of `10` for a shorter first run, or set your own limit.
5. Start the Actor and open the dataset link in the output.

**Source choices**

Use `Pin URLs` for one or more public pins. Full Pinterest pin URLs and `pin.it` short URLs are accepted. Use `Board URL` for one public board. Use `Keyword` for one Pinterest image search, and run the Actor again for another search.

**Work limit**

`maxItems` sets the board collection size and stops work after that many images for Pin URLs or Keyword. Leave it empty to return all available results until the source is exhausted. A smaller limit or an image-size filter can reduce the amount of work in a run.

**Duplicate pins**

If the same source pin appears more than once in your submitted list, the first eligible occurrence is saved. Later matches are ignored.

#### ⚙️ Input

**Input example**

This is the public input from the successful current-beta default-input run.

```json
{
  "findImagesBy": "pinUrls",
  "pinUrls": [
    {
      "url": "https://www.pinterest.com/pin/99360735500167749/"
    }
  ],
  "maxItems": 10
}
```

**Input fields**

| Field | Type | What it does |
| --- | --- | --- |
| `findImagesBy` | string | Chooses `pinUrls`, `boardUrl`, or `keyword` as the source for this run. |
| `pinUrls` | list of objects | Adds one or more public Pinterest pin URLs. Full URLs and `pin.it` short URLs are accepted. Used when `findImagesBy` is `pinUrls`. |
| `pinUrls[].url` | string | Holds one public full Pinterest pin URL or `pin.it` short URL. |
| `boardUrl` | string | Adds one public Pinterest board URL. Used when `findImagesBy` is `boardUrl`. |
| `keyword` | string | Adds one keyword for a Pinterest image search. Use a separate run for each search. Used when `findImagesBy` is `keyword`. |
| `minWidth` | integer | Skips images narrower than this width in pixels. Leave it empty to include every available width. |
| `minHeight` | integer | Skips images shorter than this height in pixels. Leave it empty to include every available height. |
| `maxItems` | integer | Optionally stops after this many images. For a board, it sets the collection size. For pin URLs or a keyword, it stops after this many images. Leave it empty to return all available results until the source is exhausted. |

**Input notes**

Choose one source type at a time. Values in the other source sections are ignored. The image filters and `maxItems` limit can be used with the selected source.

#### 🧾 Output

**Output link**

| Field | Type | What it does |
| --- | --- | --- |
| `dataset` | URL string | Opens the default dataset that contains the Pinterest image rows. |

**Dataset row**

Every dataset row uses the shape below. Fields marked optional may be missing when Pinterest does not expose the value.

| Field | Type | What it does |
| --- | --- | --- |
| `pinId` | string, optional | Public Pinterest ID of the pin, when available. |
| `pinUrl` | URL string | Public Pinterest URL for the pin. |
| `imageUrl` | URL string | Best source image URL available for direct download. |
| `previewUrl` | URL string, optional | Lower-resolution preview URL, when Pinterest provides one. |
| `width` | integer, optional | Image width in pixels, when available. |
| `height` | integer, optional | Image height in pixels, when available. |
| `format` | string, optional | Image file format, when available. |
| `title` | string, optional | Pin title, when available. |
| `description` | string, optional | Pin description, when available. |
| `board` | object, optional | Public board details for the pin, when available. |
| `board.id` | string, optional | Public Pinterest ID of the board. |
| `board.name` | string, optional | Public name of the board. |
| `board.url` | URL string, optional | Public Pinterest URL of the board. |
| `creator` | object, optional | Public creator details for the pin, when available. |
| `creator.id` | string, optional | Public Pinterest ID of the creator. |
| `creator.username` | string, optional | Public username of the creator. |
| `creator.name` | string, optional | Public display name of the creator. |
| `creator.url` | URL string, optional | Public Pinterest URL of the creator. |
| `engagement` | object, optional | Public engagement counts for the pin, when available. |
| `engagement.saves` | integer, optional | Public save count for the pin. |
| `engagement.likes` | integer, optional | Public like count for the pin. |
| `engagement.comments` | integer, optional | Public comment count for the pin. |
| `engagement.shares` | integer, optional | Public share count for the pin. |
| `createdAt` | date-time string, optional | Pin creation time from Pinterest, when available. |

**Example row**

This genuine row comes from the current beta run and is shown in full.

```json
{
  "pinId": "99360735500167749",
  "pinUrl": "https://www.pinterest.com/pin/99360735500167749/",
  "imageUrl": "https://i.pinimg.com/originals/a7/66/56/a76656e966b1958f568d63c3f1c05aec.jpg",
  "previewUrl": "https://i.pinimg.com/236x/a7/66/56/a76656e966b1958f568d63c3f1c05aec.jpg",
  "width": 236,
  "height": 176,
  "format": "jpg",
  "title": "Next stop: Pinterest!",
  "description": "Love my Pinterest t-shirt!",
  "createdAt": "2012-10-04T21:50:37.000Z",
  "board": {
    "id": "99360804217844427",
    "name": "Adventures at Pinterest",
    "url": "https://www.pinterest.com/kentbrew/adventures-at-pinterest/"
  },
  "creator": {
    "id": "99360872937292935",
    "username": "kentbrew",
    "url": "https://www.pinterest.com/kentbrew/",
    "name": "Kent Brewster"
  },
  "engagement": {
    "saves": 101772,
    "likes": 4,
    "comments": 30,
    "shares": 23
  }
}
```

#### 💳 Pricing

This Actor uses pay-per-event pricing. The primary event is **Image Retrieved**. It applies when one image with a direct source link and available metadata is saved to your dataset. The price shown by Apify depends on your plan tier. Use `maxItems` to cap how many image retrieval events a run can create.

#### 🔌 Integrations

**Dataset and API**

Open the default dataset link from the output, export the rows from Apify, or read them through the Apify API. You can use the same input in scheduled runs or connect a completion webhook in Apify.

**Video guide**

https://www.youtube.com/watch?v=bNACk1\_S\_6w\&list=PLObrtcm1Kw6MUrlLNDbK9QRg8VDJg0gOW\&index=4

#### ❓ FAQ

##### What does `maxItems` control?

For a board, `maxItems` sets the collection size. For Pin URLs or Keyword, it stops work after that many images. Leave it empty to return all available results until the source is exhausted.

##### Can I use a `pin.it` short URL?

Yes. Add the short URL in the `pinUrls` list. Full Pinterest pin URLs are also accepted.

##### Can I use a public board URL?

Yes. Choose `Board URL` and enter one public Pinterest board URL. Use `maxItems` when you want to set the collection size.

##### Can I search for several keywords in one run?

No. Choose `Keyword` for one search. Run the Actor again for another keyword.

##### What happens when the same pin is submitted twice?

The first eligible occurrence is saved, and later matches for the same source pin are ignored.

##### What happens when Pinterest does not expose a field?

Fields such as title, dimensions, board details, creator details, and engagement counts may be missing when Pinterest does not provide them. The Actor does not fill in values that are not available.

##### Does the Actor save image files?

No. It returns direct source image links. It does not make Actor-hosted file copies.

##### Can I use private pins or profile URLs?

No. The Actor is for publicly accessible pin and board URLs, plus one public keyword search. Private or login-gated content and Pinterest profile pages are outside its scope.

##### Do I need a Pinterest login or API key?

No. The input does not ask for Pinterest login details, cookies, or source credentials.

### 📝 Changelog

**v0.0** (01-09-2026)

- Initial release.

### 🆘 Support

For issues, questions, or feature requests, [file a ticket](https://console.apify.com/actors/maximedupre~pinterest-image-downloader/issues) and I'll fix or implement it in less than 24h 🫡

### 🔗 Related Actors

**Owned actors**

- [Pinterest Video Downloader](https://apify.com/maximedupre/pinterest-video-downloader): Get video or image links and pin metadata from known public Pinterest pins.
- [Pinterest Keyword Autocomplete Scraper](https://apify.com/maximedupre/pinterest-keyword-scraper): Find Pinterest autocomplete phrases before you run an image search.
- [Web Images Scraper](https://apify.com/maximedupre/web-images-scraper): Collect image URLs from public webpages and direct image links.
- [Unsplash Image Scraper](https://apify.com/maximedupre/unsplash-image-scraper): Find image URLs from Unsplash searches for design and content research.
- [Instagram Downloader API](https://apify.com/maximedupre/instagram-downloader-api): Collect direct media links and public post data from Instagram.

**Made with ❤️ by Maxime Dupré**

# Actor input Schema

## `findImagesBy` (type: `string`):

Choose one way to find Pinterest images. Use Pin URLs for one or more pins, Board URL for one public board, or Keyword for one search.

## `pinUrls` (type: `array`):

Add one or more public Pinterest pin URLs. Full Pinterest URLs and pin.it short URLs are accepted.

## `boardUrl` (type: `string`):

Add one public Pinterest board URL. The Actor retrieves the images available from that board.

## `keyword` (type: `string`):

Enter one keyword for a Pinterest image search. Use a separate run for each search.

## `minWidth` (type: `integer`):

Skip images narrower than this width in pixels. Leave blank to include every available width.

## `minHeight` (type: `integer`):

Skip images shorter than this height in pixels. Leave blank to include every available height.

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

Optionally stop after this many images. For Board URL, this sets the collection size. For Pin URLs or Keyword, it stops after this many images. Leave it empty to return all available results until the source is exhausted.

## Actor input object example

```json
{
  "findImagesBy": "pinUrls",
  "pinUrls": [
    {
      "url": "https://www.pinterest.com/pin/99360735500167749/"
    }
  ],
  "maxItems": 10
}
```

# Actor output Schema

## `dataset` (type: `string`):

Open the Pinterest image results.

# 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 = {
    "findImagesBy": "pinUrls",
    "pinUrls": [
        {
            "url": "https://www.pinterest.com/pin/99360735500167749/"
        }
    ],
    "maxItems": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("maximedupre/pinterest-image-downloader").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 = {
    "findImagesBy": "pinUrls",
    "pinUrls": [{ "url": "https://www.pinterest.com/pin/99360735500167749/" }],
    "maxItems": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("maximedupre/pinterest-image-downloader").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 '{
  "findImagesBy": "pinUrls",
  "pinUrls": [
    {
      "url": "https://www.pinterest.com/pin/99360735500167749/"
    }
  ],
  "maxItems": 10
}' |
apify call maximedupre/pinterest-image-downloader --silent --output-dataset

```

## MCP server setup

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

```

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/dXlMbxdB0LTakqbac/builds/3vEzpTu3HnlBJeHTl/openapi.json
