# Tumblr Post Detail Scraper (`xtracto/tumblr-post-detail-scraper`) Actor

Fetch a Tumblr post by URL or 'blog/id' shorthand.

- **URL**: https://apify.com/xtracto/tumblr-post-detail-scraper.md
- **Developed by:** [Farhan Febrian Nauval](https://apify.com/xtracto) (community)
- **Categories:** Social media
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.99 / 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 a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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 Post Detail Scraper

Fetch a single public Tumblr post by URL or `blog/post_id` shorthand — full post body, blog info, note count, tags, and timestamp — as clean structured JSON. Works out of the box without setup.

### Why use this actor

- **No setup required** — works anonymously, no account or API key needed. Optionally paste a free key for richer fields.
- **Full post body** — text paragraphs, photos, quotes, links, audio, video, and answer posts returned with HTML body content for text/answer posts and direct media URLs for photo/video posts.
- **Note count and tags** — see how viral a post is and which tags drove discovery, in one record.
- **Blog metadata bundled in** — every result carries the originating blog's name and URL so you do not need a second call.
- **All Tumblr URL flavours supported** — full URLs (`https://staff.tumblr.com/post/813992302192263168`) or the shorthand `blog/post_id`.
- **Stable JSON output** suitable for pipelines, spreadsheets, and databases — every row carries `_input`, `_source`, `_scrapedAt` envelope fields so you can join results back to your input list.

### How it works

1. You provide a list of Tumblr posts — full URLs or `blog/post_id` shorthand. Optionally include a Tumblr API key for richer data.
2. The actor reads each post — using the official Tumblr v2 API if a key was provided, otherwise the public anonymous endpoint — and assembles a flat JSON record.
3. Results stream into your dataset, ready to download as JSON, CSV, or Excel.

You do not need to manage scrapers or rotating IPs — all handled internally.

### Setup (optional) — get your free Tumblr API key for richer fields

The actor runs without any key. If you want richer fields (avatar URL, NSFW flag, reblog tree, additional metadata), register a Tumblr v2 API consumer key — it is free, instant, and takes about 2 minutes:

1. Go to **[tumblr.com/oauth/apps](https://www.tumblr.com/oauth/apps)** and sign in with any Tumblr account.
2. Click **Register application**, fill in any name and a URL.
3. Copy the **OAuth Consumer Key** that appears for your new app.
4. Paste it into the `apiKey` field on the input form (or set the `TUMBLR_API_KEY` environment variable).

The registration is instant — there is no review queue, and the key has no per-key cost.

### Input

```json
{
  "posts": [
    "staff/813992302192263168",
    "engineering/770213847934976000"
  ],
  "apiKey": "",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["DATACENTER"]
  }
}
````

| Field | Type | Description |
|---|---|---|
| `posts` | array | List of Tumblr posts to scrape. Each item may be a full URL (`https://blog.tumblr.com/post/123`) or the shorthand `blog/post_id` (e.g. `staff/813992302192263168`). |
| `apiKey` | string | **Optional** Tumblr v2 API consumer key for richer fields. Leave blank for anonymous mode (still returns post body, tags, note count, timestamp). |
| `proxyConfiguration` | object | Apify Proxy settings. Datacenter proxy is sufficient for the Tumblr API. |

### Output

Input: `staff/813992302192263168`

```json
{
  "_input": "staff/813992302192263168",
  "_blog": "staff",
  "_postId": "813992302192263168",
  "_source": "S1-api",
  "_scrapedAt": "2026-05-18T11:22:30.481922+00:00",
  "type": "text",
  "is_blocks_post_format": true,
  "blog_name": "staff",
  "blog": {
    "name": "staff",
    "title": "Tumblr Staff",
    "url": "https://staff.tumblr.com/",
    "description": "The official Tumblr blog."
  },
  "id": 813992302192263168,
  "post_url": "https://staff.tumblr.com/post/813992302192263168",
  "slug": "the-new-creator-tools",
  "timestamp": 1776283552,
  "date": "2026-04-12 14:25:52 GMT",
  "state": "published",
  "format": "html",
  "note_count": 3421,
  "tags": ["announcement", "creators", "tools"],
  "summary": "The new creator tools",
  "content": [
    { "type": "text", "subtype": "heading1", "text": "The new creator tools" },
    { "type": "text", "text": "Today we're rolling out...", "formatting": [{"start": 0, "end": 5, "type": "bold"}] }
  ],
  "trail": [
    {
      "blog": { "name": "engineering", "title": "Tumblr Engineering" },
      "post": { "id": "770213847934976000" },
      "content_raw": "<p>Originally posted by @engineering...</p>",
      "content": "Originally posted by @engineering...",
      "is_root_item": true
    }
  ],
  "reblog": { "comment": "", "tree_html": "" },
  "can_like": true,
  "can_reblog": true,
  "can_reply": true,
  "display_avatar": true
}
```

| Field | Type | Description |
|---|---|---|
| `_input` | string | The post identifier exactly as you supplied it. Use this to join results back to your input list. |
| `_blog` | string | The blog name parsed from your input. |
| `_postId` | string | The numeric post ID parsed from your input. |
| `_source` | string | Internal tag for the path used to fetch the record. `S1-api` means the official Tumblr v2 API path was used. |
| `_scrapedAt` | string | ISO-8601 UTC timestamp when the record was scraped. |
| `type` | string | Post type: `text`, `photo`, `quote`, `link`, `chat`, `audio`, `video`, or `answer`. |
| `is_blocks_post_format` | boolean | `true` if the post uses Tumblr's new block-based format (most modern posts). |
| `blog_name` | string | Slug of the blog that owns the post. |
| `blog` | object | Originating blog metadata: `name`, `title`, `url`, `description`. |
| `id` | integer | Numeric post ID. |
| `post_url` | string | Canonical post URL. |
| `slug` | string | URL slug fragment after the post ID. |
| `timestamp` | integer | Unix timestamp of the original publish time. |
| `date` | string | Human-readable publish time in GMT. |
| `state` | string | Publish state — usually `published`. |
| `format` | string | Legacy format flag (`html` or `markdown`). |
| `note_count` | integer | Total notes (likes + reblogs + replies). |
| `tags` | array | List of tag strings the author attached to the post. |
| `summary` | string | Short summary Tumblr generates for previews. |
| `content` | array | Array of content blocks. Each block has a `type` (`text`, `image`, `link`, `audio`, `video`, `quote`, `poll`) and type-specific fields. Text blocks include optional `formatting` ranges for bold/italic/links. |
| `trail` | array | The reblog tree, oldest-first. Each entry has the original `blog`, `post` reference, the `content` they added, and `is_root_item: true` for the original post. |
| `reblog` | object | Top-level reblog commentary (`comment`, `tree_html`) attached by the current post's author. |
| `can_like` / `can_reblog` / `can_reply` | boolean | Engagement flags the API reports for the viewer context. |

#### Error envelope

If a post is missing, the blog is private, or the API key is invalid, the actor returns a structured error instead of crashing:

```json
{
  "_input": "staff/813992302192263168",
  "_blog": "staff",
  "_postId": "813992302192263168",
  "_source": "S1-api",
  "_scrapedAt": "2026-05-18T11:20:42.702805+00:00",
  "_error": "fetch_failed",
  "_errorDetail": "TUMBLR_API_KEY not configured"
}
```

Common `_error` values:

| Value | Meaning |
|---|---|
| `invalid_input` | The input string did not match a known post URL or `blog/id` shorthand. |
| `not_found` | The post does not exist or is on a private blog. |
| `fetch_failed` | API call failed — most often missing `apiKey` (401) or rate limit. |

Filter on `_error` to triage failed rows.

### Pricing

This actor is billed per result: **$2.50 per 1,000 posts** (Tier 2). Each successful post = 1 result. Errors (not-found, fetch-failed) are not billed.

### Other Sosmed Actors

| Platform | Actor | Best for |
|---|---|---|
| Tumblr | [Tumblr Blog Scraper](https://apify.com/xtracto/tumblr-blog-scraper) | Bulk posts from a blog, filtered by tag or type |
| Medium | [Medium Post Detail Scraper](https://apify.com/xtracto/medium-post-detail-scraper) | Full article text + claps + author |
| Substack | [Substack Post Detail Scraper](https://apify.com/xtracto/substack-post-detail-scraper) | Newsletter post body + paywall flag |
| Mastodon | [Mastodon Status Detail Scraper](https://apify.com/xtracto/mastodon-status-detail-scraper) | Single fediverse status + reblog chain |
| Bluesky | [Bluesky Post Detail Scraper](https://apify.com/xtracto/bluesky-post-detail-scraper) | atproto post + thread context |
| Threads | [Threads Post Detail Scraper](https://apify.com/xtracto/threads-post-detail-scraper) | Single Threads post + replies count |

Browse the full catalog at [apify.com/xtracto](https://apify.com/xtracto).

### Notes

- **Content blocks vary by post type.** Text posts give `text` blocks; photo posts give `image` blocks with `media[]` URL variants; video posts give `video` blocks with embed metadata; answer posts include the `asking_name` and the question body. Always check `type` before reading type-specific fields.
- **Reblog tree depth.** The `trail` array can be long for viral posts (50+ entries). The first entry (`is_root_item: true`) is the original post; subsequent entries are reblogs in chronological order.
- **Counters are eventually-consistent.** `note_count` may lag the live total by a few minutes.
- **Legacy vs blocks format.** Posts older than 2019 may have `is_blocks_post_format: false` and a flat `body` / `caption` HTML field instead of the structured `content` array. Newer posts always use blocks.
- **Rate limits.** Tumblr enforces approximately 1,000 requests per hour per consumer key. For large jobs, register multiple keys or enable Apify Proxy rotation.

# Actor input Schema

## `posts` (type: `array`):

List of posts to scrape. Each entry can be a full URL (https://staff.tumblr.com/post/813992302192263168) or the shorthand 'blog/post\_id' (e.g. 'staff/813992302192263168').

## `apiKey` (type: `string`):

Optional Tumblr v2 API consumer key for richer fields (exact note count, avatar URLs, NSFW flag). If left blank, the actor uses Tumblr's anonymous legacy endpoint which still returns post body, tags, timestamp, and note count. Get a free key at tumblr.com/oauth/apps (no review, takes 1 minute).

## `proxyConfiguration` (type: `object`):

Apify Proxy settings. Datacenter proxy is sufficient for the Tumblr v2 API.

## Actor input object example

```json
{
  "posts": [
    "staff/813992302192263168",
    "engineering/770213840281124864"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# 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 = {
    "posts": [
        "staff/813992302192263168",
        "engineering/770213840281124864"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("xtracto/tumblr-post-detail-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 = { "posts": [
        "staff/813992302192263168",
        "engineering/770213840281124864",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("xtracto/tumblr-post-detail-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "posts": [
    "staff/813992302192263168",
    "engineering/770213840281124864"
  ]
}' |
apify call xtracto/tumblr-post-detail-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=xtracto/tumblr-post-detail-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Tumblr Post Detail Scraper",
        "description": "Fetch a Tumblr post by URL or 'blog/id' shorthand.",
        "version": "1.0",
        "x-build-id": "Cut1h5NcUaMcPgz4F"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/xtracto~tumblr-post-detail-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-xtracto-tumblr-post-detail-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/xtracto~tumblr-post-detail-scraper/runs": {
            "post": {
                "operationId": "runs-sync-xtracto-tumblr-post-detail-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/xtracto~tumblr-post-detail-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-xtracto-tumblr-post-detail-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "posts"
                ],
                "properties": {
                    "posts": {
                        "title": "Tumblr posts",
                        "type": "array",
                        "description": "List of posts to scrape. Each entry can be a full URL (https://staff.tumblr.com/post/813992302192263168) or the shorthand 'blog/post_id' (e.g. 'staff/813992302192263168').",
                        "items": {
                            "type": "string"
                        }
                    },
                    "apiKey": {
                        "title": "Tumblr API key (optional — recommended)",
                        "type": "string",
                        "description": "Optional Tumblr v2 API consumer key for richer fields (exact note count, avatar URLs, NSFW flag). If left blank, the actor uses Tumblr's anonymous legacy endpoint which still returns post body, tags, timestamp, and note count. Get a free key at tumblr.com/oauth/apps (no review, takes 1 minute)."
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Apify Proxy settings. Datacenter proxy is sufficient for the Tumblr v2 API.",
                        "default": {
                            "useApifyProxy": true
                        }
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
