# Tumblr Scraper (`codenest/tumblr-scraper`) Actor

Extract complete Tumblr posts with all media types—images, videos, audio, GIFs—plus rich metadata like tags, uploader info, and engagement stats. Get direct CDN download links and secure KV store url and  comprehensive post data in clean JSON format for archiving, analysis, or content repurposing.

- **URL**: https://apify.com/codenest/tumblr-scraper.md
- **Developed by:** [CodeNest](https://apify.com/codenest) (community)
- **Categories:** Social media, Developer tools, Other
- **Stats:** 4 total users, 0 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.30 / 1,000 tumblr post scrapeds

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

## 📝 Tumblr Scraper - Ultimate Tumblr Post & Media Extractor

**Effortlessly scrape Tumblr posts with our powerful **Tumblr Scraper**! This Apify actor enables bulk extraction of post content, media assets, engagement metrics, and complete blog metadata from any Tumblr URL.**

***

### 📋 Overview

Need to archive Tumblr content, analyze engagement patterns, or download media? This **Tumblr Scraper** delivers:

- 📄 **Complete Post Data** - Captions, summaries, tags, and post types
- 🎬 **Media Extraction** - Images, videos, GIFs, and audio download links
- 📊 **Engagement Metrics** - Notes, likes, reblogs, and replies
- 👤 **Blog Metadata** - Author info, avatar, header image, and top tags
- 💬 **Chat Post Support** - Extract dialogue from chat-style posts
- 🔄 **Reblog Detection** - Identify original posts vs reblogs
- 🎯 **Retry Logic** - Configurable retry attempts for reliability

Perfect for content archivists 📚, social media analysts 📈, researchers 🔬, and digital marketers 🎯!

***

### ⭐ Core Capabilities of Tumblr Scraper

#### 📄 Post Content Extraction

- **Multiple Post Types** - Images, videos, GIFs, chats, and more
- **Full Captions** - Complete post text and summaries
- **Tag Extraction** - All associated tags from posts
- **Word Count** - Automatic content length calculation
- **Slug Detection** - URL-friendly post identifiers

#### 🎬 Media Download Mastery

- **Image Extraction** - Multiple image formats (JPG, PNG, WebP)
- **Video Downloads** - Direct video URLs with poster images
- **GIF Support** - Animated GIFs with MP4 alternatives
- **High-Resolution** - Original and scaled media URLs
- **Dimension Data** - Width and height for all media

#### 📊 Engagement Analytics

- **Note Counts** - Total engagement metrics
- **Like Tracking** - Individual like counts
- **Reblog Metrics** - Reblog counts for virality analysis
- **Reply Counts** - Comment engagement data

#### 👤 Blog Intelligence

- **Complete Blog Info** - Name, title, and description
- **Visual Assets** - Avatar and header images
- **Blog Creation Date** - Account age tracking
- **Top Tags** - Most used tags by the blog
- **Adult Content Flag** - Content rating detection

***

### ⚙️ Input Configuration

Simply enter Tumblr post URLs, configure options, and click "Start". Input looks like this:

```json
{
  "download_media": true,
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"]
  },
  "urls": [
    {
      "url": "https://www.tumblr.com/hotvampireadjacent/827368576765820928?source=share"
    },
    {
      "url": "https://www.tumblr.com/ajulesr/826584059678539776/wild-at-heart-rdr2-fanart?source=share"
    }
  ],
  "useKvStore": true,
  "maxRetries": 3
}
```

#### 📝 Input Specifications

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| `urls` | Array | ✅ Yes | - | Tumblr post URLs to scrape |
| `download_media` | Boolean | ❌ No | true | Generate downloadable media links |
| `useKvStore` | Boolean | ❌ No | true | Store media in Apify Key-Value Store |
| `maxRetries` | Integer | ❌ No | 3 | Maximum retry attempts per URL |
| `proxy.useApifyProxy` | Boolean | ❌ No | true | Enable Apify proxy |
| `proxy.apifyProxyGroups` | Array | ❌ No | \["RESIDENTIAL"] | Proxy groups to use |

***

### 📤 Output Structure

Your **Tumblr Scraper** produces comprehensive post data with media and engagement metrics:

```json
[
  {
    "platform": "tumblr",
    "id": "827368576765820928",
    "url": "https://www.tumblr.com/hotvampireadjacent/827368576765820928",
    "inputUrl": "https://www.tumblr.com/hotvampireadjacent/827368576765820928?source=share",
    "shortUrl": "https://tmblr.co/ZHimuxjxPrP4Se00",
    "slug": "",
    "postType": "image",
    "caption": "",
    "wordCount": 0,
    "date": "2026-09-10 11:36:01 GMT",
    "timestamp": 1789040161,
    "tags": [],
    "noteCount": 38308,
    "likeCount": 23577,
    "reblogCount": 14411,
    "replyCount": 320,
    "blog": {
      "name": "hotvampireadjacent",
      "title": "愛する人を失った世界にはどんな色の花が咲く",
      "url": "https://hotvampireadjacent.tumblr.com/",
      "description": "30/he+him/they+them ENG/SPAN/日本語/",
      "avatarUrl": "https://i0.wp.com/64.media.tumblr.com/...",
      "headerImageUrl": "https://i0.wp.com/64.media.tumblr.com/...",
      "uuid": "t:qtpyHj0jOefDqGG42v4UVA",
      "created": 1294362304,
      "isAdult": false,
      "topTags": ["happy", "jjba", "video", "legendary"]
    },
    "hasImages": true,
    "imagesCount": 1,
    "images": ["https://api.apify.com/v2/key-value-stores/.../827368576765820928_img_1.webp"],
    "hasVideo": false,
    "hasGif": false,
    "hasChat": false,
    "hasPoll": false,
    "hasAudio": false,
    "isReblog": false,
    "reblogKey": "D8Qynw1g",
    "download_links": [
      {
        "type": "image",
        "url": "https://i0.wp.com/64.media.tumblr.com/.../s1280x1920/...jpg",
        "originalUrl": "https://64.media.tumblr.com/.../s1280x1920/...jpg",
        "width": 1152,
        "height": 1373,
        "ext": "jpg",
        "altText": ""
      }
    ],
    "scrapedAt": "2026-09-12T13:17:05.355386Z"
  }
]
```

#### 📖 Output Field Documentation

**🔹 Post Identification**
| Field | Description |
|-------|-------------|
| `platform` | Source platform (tumblr) |
| `id` | Unique post ID |
| `url` | Clean post URL |
| `inputUrl` | Original input URL |
| `shortUrl` | Tumblr short URL |
| `slug` | URL slug from post |

**🔹 Content Details**
| Field | Description |
|-------|-------------|
| `postType` | Type (image, video, gif, chat, etc.) |
| `caption` | Full post caption text |
| `summary` | Post summary text |
| `wordCount` | Total word count |
| `date` | Formatted post date |
| `timestamp` | Unix timestamp |
| `tags` | Array of post tags |

**🔹 Engagement Metrics**
| Field | Description |
|-------|-------------|
| `noteCount` | Total engagement notes |
| `likeCount` | Like count |
| `reblogCount` | Reblog count |
| `replyCount` | Reply count |

**🔹 Blog Information**
| Field | Description |
|-------|-------------|
| `blog.name` | Blog username |
| `blog.title` | Blog title |
| `blog.url` | Blog URL |
| `blog.description` | Blog description |
| `blog.avatarUrl` | Avatar image URL |
| `blog.headerImageUrl` | Header image URL |
| `blog.created` | Blog creation timestamp |
| `blog.isAdult` | Adult content flag |
| `blog.topTags` | Most used tags |

**🔹 Media Information**
| Field | Description |
|-------|-------------|
| `hasImages` | Image presence indicator |
| `imagesCount` | Number of images |
| `images` | Array of hosted image URLs |
| `hasVideo` | Video presence indicator |
| `video.videoUrl` | Video URL |
| `video.posterUrl` | Video poster image |
| `video.duration` | Video duration in seconds |
| `hasGif` | GIF presence indicator |
| `hasAudio` | Audio presence indicator |
| `hasPoll` | Poll presence indicator |
| `hasChat` | Chat post indicator |
| `chat` | Array of chat dialogue |

**🔹 Download Links**
| Field | Description |
|-------|-------------|
| `type` | Media type (image, video, gif) |
| `url` | Download URL |
| `originalUrl` | Original media URL |
| `width` | Media width in pixels |
| `height` | Media height in pixels |
| `ext` | File extension |
| `mp4Url` | MP4 alternative (GIFs) |

**🔹 Post Metadata**
| Field | Description |
|-------|-------------|
| `isReblog` | Reblog indicator |
| `reblogKey` | Reblog key |
| `trail` | Reblog trail info |
| `links` | Extracted links |
| `scrapedAt` | Scrape timestamp |

***

### 🎨 Key Features of This Tumblr Scraper

#### 📄 Multiple Post Type Support

- **Image Posts** - Photo and image gallery posts
- **Video Posts** - Native video content
- **GIF Posts** - Animated GIFs with MP4 alternatives
- **Chat Posts** - Dialogue-style conversations
- **Text Posts** - Written content and quotes

#### 🎬 Complete Media Extraction

- **High-Resolution Images** - Up to 2048px width
- **Original Quality** - Uncompressed media URLs
- **Video Downloads** - Direct video file links
- **GIF Animation** - Both GIF and MP4 formats
- **Poster Images** - Video and media thumbnails

#### 📊 Deep Engagement Analysis

- **Note Breakdown** - Likes, reblogs, replies
- **Virality Metrics** - Share and reblog ratios
- **Interaction Data** - Complete engagement picture
- **Timing Analysis** - Post date and timestamp

#### 👤 Blog Intelligence

- **Author Profiles** - Complete blog information
- **Visual Assets** - Avatar and header images
- **Content History** - Blog creation date
- **Tag Analysis** - Most used tags by blogger

#### 🚀 Smart Features

- **Key-Value Store** - Optional media hosting
- **Retry Logic** - Configurable retry attempts
- **Residential Proxies** - Reliable access
- **Batch Processing** - Multiple URLs at once

***

### 💡 Use Cases for Tumblr Scraper

- **📚 Content Archiving** - Preserve Tumblr content
- **📊 Social Media Analytics** - Track engagement trends
- **🎬 Media Collection** - Download images and videos
- **🔬 Research** - Study Tumblr communities
- **📈 Marketing Analysis** - Analyze viral content
- **🎨 Art Collection** - Archive fan art and creative works
- **💬 Chat Extraction** - Capture dialogue-style posts
- **🏷️ Tag Monitoring** - Track specific content tags

***

### ✨ Why Choose Our Tumblr Scraper?

- **⚡ Fast & Reliable** - Quick post extraction with retry logic
- **🎯 Complete Data** - Everything from captions to media
- **📦 Rich Output** - Comprehensive post and blog data
- **🔄 Retry Support** - Configurable reliability options
- **🛡️ Proxy Ready** - Residential proxy support
- **💾 KV Store** - Optional media hosting
- **🔒 Privacy Focused** - No personal data stored or shared

***

### ⚠️ Limitations

- Only works with publicly accessible Tumblr posts
- Some posts may have restricted access
- Media download links may expire
- Rate limits may apply for high-volume scraping
- Adult content may require age verification

***

### 📧 Need Custom Features for Your Tumblr Scraper?

Want **additional post fields**, **specific media filters**, **custom output formats**, **advanced analytics**, or **automated monitoring**?

✉️ Email **<codenest2.0@gmail.com>** for tailored enterprise solutions!

***

# Actor input Schema

## `urls` (type: `array`):

List of Tumblr post URLs or Spotify URLs. Accepts any post type: text, image, photoset, video, audio, gif, chat, poll, or ask.

## `download_media` (type: `boolean`):

When enabled, media files are downloaded server-side and uploaded to the Apify Key-Value Store for permanent public URLs.

## `useKvStore` (type: `boolean`):

When enabled (alongside download\_media), downloaded media items are stored in Apify Key-Value Store.

## `maxTotalChargeUsd` (type: `number`):

Optional user spending limit in USD for Pay-Per-Event pricing (e.g. 5.00 for $5.00 USD).

## `proxy` (type: `object`):

Proxy settings for requests. Apify Residential Proxy is recommended to prevent Tumblr IP rate limits.

## `maxRetries` (type: `integer`):

Number of retries with exponential backoff on transient errors (429/5xx).

## Actor input object example

```json
{
  "urls": [
    {
      "url": "https://www.tumblr.com/yesornopolls/827411833045532672/look-at-the-last-text-message-you-sent-if-you?source=share"
    },
    {
      "url": "https://www.tumblr.com/hotvampireadjacent/827368576765820928?source=share"
    },
    {
      "url": "https://www.tumblr.com/robdogdraws/827339744287522816/my-dogs-are-hongrayyy?source=share"
    },
    {
      "url": "https://www.tumblr.com/iwritefanficx/827377541684822016/my-spidey-brendon-park?source=share"
    },
    {
      "url": "https://www.tumblr.com/robs-your-robins/827494904578097152/dick-thanks-for-the-hoodie-jay-jason-its?source=share"
    },
    {
      "url": "https://www.tumblr.com/linusx/827372768006914048/hehe-anyone-into-wkm-and-endacopia-markiplier?source=share"
    },
    {
      "url": "https://www.tumblr.com/artyphex/827339896099405824/hows-the-writing-going?source=share"
    },
    {
      "url": "https://www.tumblr.com/tiktoksthataregood-ish/827375802491584512?source=share"
    },
    {
      "url": "https://www.tumblr.com/audiojunkyard/809712185709346816/mitski-in-a-lake?source=share"
    }
  ],
  "download_media": false,
  "useKvStore": false,
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  },
  "maxRetries": 3
}
```

# Actor output Schema

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

Tabular and JSON records of all extracted Tumblr posts, metadata, media, polls, chats, and asks.

## `outputRecord` (type: `string`):

Consolidated JSON dataset array of all scraped items stored in the Key-Value Store.

# 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 = {
    "urls": [
        {
            "url": "https://www.tumblr.com/yesornopolls/827411833045532672/look-at-the-last-text-message-you-sent-if-you?source=share"
        },
        {
            "url": "https://www.tumblr.com/hotvampireadjacent/827368576765820928?source=share"
        },
        {
            "url": "https://www.tumblr.com/robdogdraws/827339744287522816/my-dogs-are-hongrayyy?source=share"
        },
        {
            "url": "https://www.tumblr.com/iwritefanficx/827377541684822016/my-spidey-brendon-park?source=share"
        },
        {
            "url": "https://www.tumblr.com/robs-your-robins/827494904578097152/dick-thanks-for-the-hoodie-jay-jason-its?source=share"
        },
        {
            "url": "https://www.tumblr.com/linusx/827372768006914048/hehe-anyone-into-wkm-and-endacopia-markiplier?source=share"
        },
        {
            "url": "https://www.tumblr.com/artyphex/827339896099405824/hows-the-writing-going?source=share"
        },
        {
            "url": "https://www.tumblr.com/tiktoksthataregood-ish/827375802491584512?source=share"
        },
        {
            "url": "https://www.tumblr.com/audiojunkyard/809712185709346816/mitski-in-a-lake?source=share"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("codenest/tumblr-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 = { "urls": [
        { "url": "https://www.tumblr.com/yesornopolls/827411833045532672/look-at-the-last-text-message-you-sent-if-you?source=share" },
        { "url": "https://www.tumblr.com/hotvampireadjacent/827368576765820928?source=share" },
        { "url": "https://www.tumblr.com/robdogdraws/827339744287522816/my-dogs-are-hongrayyy?source=share" },
        { "url": "https://www.tumblr.com/iwritefanficx/827377541684822016/my-spidey-brendon-park?source=share" },
        { "url": "https://www.tumblr.com/robs-your-robins/827494904578097152/dick-thanks-for-the-hoodie-jay-jason-its?source=share" },
        { "url": "https://www.tumblr.com/linusx/827372768006914048/hehe-anyone-into-wkm-and-endacopia-markiplier?source=share" },
        { "url": "https://www.tumblr.com/artyphex/827339896099405824/hows-the-writing-going?source=share" },
        { "url": "https://www.tumblr.com/tiktoksthataregood-ish/827375802491584512?source=share" },
        { "url": "https://www.tumblr.com/audiojunkyard/809712185709346816/mitski-in-a-lake?source=share" },
    ] }

# Run the Actor and wait for it to finish
run = client.actor("codenest/tumblr-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 '{
  "urls": [
    {
      "url": "https://www.tumblr.com/yesornopolls/827411833045532672/look-at-the-last-text-message-you-sent-if-you?source=share"
    },
    {
      "url": "https://www.tumblr.com/hotvampireadjacent/827368576765820928?source=share"
    },
    {
      "url": "https://www.tumblr.com/robdogdraws/827339744287522816/my-dogs-are-hongrayyy?source=share"
    },
    {
      "url": "https://www.tumblr.com/iwritefanficx/827377541684822016/my-spidey-brendon-park?source=share"
    },
    {
      "url": "https://www.tumblr.com/robs-your-robins/827494904578097152/dick-thanks-for-the-hoodie-jay-jason-its?source=share"
    },
    {
      "url": "https://www.tumblr.com/linusx/827372768006914048/hehe-anyone-into-wkm-and-endacopia-markiplier?source=share"
    },
    {
      "url": "https://www.tumblr.com/artyphex/827339896099405824/hows-the-writing-going?source=share"
    },
    {
      "url": "https://www.tumblr.com/tiktoksthataregood-ish/827375802491584512?source=share"
    },
    {
      "url": "https://www.tumblr.com/audiojunkyard/809712185709346816/mitski-in-a-lake?source=share"
    }
  ]
}' |
apify call codenest/tumblr-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,codenest/tumblr-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/rFSrYVzOLnLfVXlk4/builds/7RgbAlqyWZqvW670s/openapi.json
