# Tumblr Post Reblogs Scraper (`scrapingmonkey/tumblr-post-reblogs-scraper`) Actor

Extract public Tumblr post reblogs with author blogs, reblog URLs, tags, parent blog names and timestamps.

- **URL**: https://apify.com/scrapingmonkey/tumblr-post-reblogs-scraper.md
- **Developed by:** [ScrapingMonkey](https://apify.com/scrapingmonkey) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 results

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?

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

Collect individual public Tumblr post reblogs with pagination. **Tumblr Post Reblogs Scraper** returns reblog authors, post identifiers, timestamps, tags and available parent-blog references, with one reblog per dataset row.

Analyze a selected post’s reblogs while retaining the source and the identity of each returned interaction.

| At a glance | Details |
|---|---|
| 📥 Input | Public Tumblr post URLs or blog-name/post-id values. |
| 📤 Output | One reblog per success row, with source input retained |
| 📄 Pagination | pagesPerPost limits interaction-result pages for each source post. A short page can still have more results. |
| 🔐 Login required | No |
| ⚡ Processing | Up to 5 HTTP requests concurrently with automatic retries |
| 💾 Delivery | One Apify dataset view, useful flat columns and complete nested JSON |

### What the Tumblr Post Reblogs scraper collects 📦

The Actor collects the public reblogs list for each supplied post. It keeps the actual interaction records and their source context in one dataset view.

Data can include:

- Source post identity and original input
- Reblogging blog name, UUID, profile URL and avatar when available
- Reblog post ID, timestamp, tags and parent-blog name when supplied

### How to collect post reblogs from Tumblr 🚀

1. Enter one or more supported inputs in `inputList`.
2. Set the result-page budget for each input.
3. Start the Actor.
4. Open the **Reblogs** dataset view and review the individual records.
5. Export the dataset or retrieve it from your application.

```json
{
  "inputList": [
    "https://www.tumblr.com/staff/822057428507049984"
  ],
  "pagesPerPost": 1
}
```

pagesPerPost limits interaction-result pages for each source post. A short page can still have more results.

### Tumblr post reblogs data and complete output 📦

| Field | Type | Meaning |
|---|---|---|
| `status` | string | Result status: success or failed. |
| `input` | string | Original submitted input. |
| `id` | string or null | Stable interaction key combining note type, author, timestamp and any reblog post ID; not an independent post ID. |
| `post_id` | string or null | Source post ID associated with this interaction or trail entry. |
| `post_url` | string or null | Public URL of the post whose interaction list is being collected. |
| `post_blog_name` | string or null | Name of the blog containing the source post. |
| `note_type` | string or null | Tumblr interaction type for this like, reblog or reply. |
| `timestamp` | number or null | Source Unix timestamp in seconds; fractional precision is retained when supplied. |
| `created_at` | string or null | Creation time in an ISO-formatted date string when supplied. |
| `author_name` | string or null | Name of the blog responsible for this interaction. |
| `author_uuid` | string or null | UUID of the blog responsible for this interaction. |
| `author_url` | string or null | Public profile URL of the interacting blog. |
| `author_title` | string or null | Available title of the interacting blog. |
| `author_avatar_url` | string or null | Available avatar URL of the interacting blog. |
| `author_is_adult` | boolean or null | Source adult-content flag for the interacting blog, when supplied. |
| `reblog_post_id` | string or null | ID of the separately published reblog when supplied. |
| `reblog_url` | string or null | Public URL of the separately published reblog when its identity is available. |
| `reblog_parent_blog_name` | string or null | Available parent blog name for this reblog interaction. |
| `tags` | array or null | Available tag values associated with the post or interaction. |

The source post and interacting blog are separate fields. The result ID identifies an interaction record; reblog post IDs, where present, identify published reblogs. Several records can share an author without being duplicates.

Every top-level output field appears in these complete examples. The success example is normalized from a public response; its values are a snapshot and can change. Nested arrays remain inside their parent result.

Complete representative success result:

```json
{
  "status": "success",
  "input": "https://www.tumblr.com/staff/822057428507049984",
  "id": "reblog:t:O2NVhkEPdD5A-IwWwR9nIA:1789153199:827487105345355776",
  "post_id": "822057428507049984",
  "post_url": "https://www.tumblr.com/staff/822057428507049984",
  "post_blog_name": "staff",
  "note_type": "reblog",
  "timestamp": 1789153199,
  "created_at": "2026-09-11T18:59:59Z",
  "author_name": "rchshak",
  "author_uuid": "t:O2NVhkEPdD5A-IwWwR9nIA",
  "author_url": "https://rchshak.tumblr.com/",
  "author_title": "Shak",
  "author_avatar_url": "https://64.media.tumblr.com/7ee8ff754efaffecd2c7b585967eee89/617ed4945ca4c18d-11/s128x128u_c1/a01c15b8052bd986b394ee7eb382ae14a154d990.jpg",
  "author_is_adult": false,
  "reblog_post_id": "827487105345355776",
  "reblog_url": "https://www.tumblr.com/rchshak/827487105345355776",
  "reblog_parent_blog_name": "staff",
  "tags": []
}
```

Complete failed result:

```json
{
  "status": "failed",
  "input": "invalid input",
  "id": null,
  "post_id": null,
  "post_url": null,
  "post_blog_name": null,
  "note_type": null,
  "timestamp": null,
  "created_at": null,
  "author_name": null,
  "author_uuid": null,
  "author_url": null,
  "author_title": null,
  "author_avatar_url": null,
  "author_is_adult": null,
  "reblog_post_id": null,
  "reblog_url": null,
  "reblog_parent_blog_name": null,
  "tags": null
}
```

A failed row preserves `input`, sets `status` to `failed`, and sets every other top-level field to `null`. The run log records the reason. Optional successful fields can be null or empty when Tumblr does not supply them. Object fields are exposed through useful columns in the single **Reblogs** view; arrays are not expanded into extra result rows.

### Input requirements and pagination settings ⚙️

| Parameter | Type | Required | Default | Rules |
|---|---|---|---|---|
| `inputList` | array of strings | Yes | None | Public Tumblr post URLs or blog-name/post-id values. At least `1` item. |
| `pagesPerPost` | integer | No | `1` | Maximum result pages per input. Setup requests do not count as pages. Stops when the source has no next page or repeats a continuation. Actual rows per page can vary. Minimum `1`. |

Enter supported full Tumblr post URLs. This Actor collects reblogs for those selected posts; it does not discover posts or scan whole blogs.

Supported examples include `https://www.tumblr.com/staff/822057428507049984`, `https://staff.tumblr.com/post/822057428507049984` and the compact `staff/822057428507049984` form. Public `/blog/view/BLOG/POST_ID` links are also accepted. A bare numeric post ID has no source blog and is not sufficient.

Duplicate normalized inputs are processed once. Within the collection for one source input, repeated records are removed while distinct interactions or objects remain separate. The same object returned for different source inputs retains its source relationship.

The first result page counts as page 1. Public-page preparation and metadata lookups do not consume result pages. Collection stops at your page budget or the end of the available list. A short page alone does not mean that the list has ended.

### Tumblr post reblogs use cases 🎯

#### Tumblr Staff Post Reblog Source Map

Collect public reblogs of a selected Tumblr Staff post with authors, timestamps, reblog post IDs and available parent-blog names. Export individual events to review the post’s visible distribution paths.

#### Tumblr Reblog Tags for Topic Analysis

Collect reblog records for a selected Tumblr post and retain their available tags, authors and dates. Export the rows to review how rebloggers label the material in your own topic analysis.

#### Tumblr Reblog Events and Author Review

Collect individual reblog events for a selected Tumblr Staff post with author identities and post IDs. Use the export to distinguish repeat rebloggers from unique events in your own spreadsheet.

### Pricing and saved-result behavior 💰

Check the Actor’s **Pricing** tab for the active pricing model and current rate. Store settings can change, so this README does not claim a fixed price or runtime.

Under dataset-item pricing:

- Each successful result represents one reblog for its source input.
- An invalid or unavailable input, an input with no accessible results, or an exhausted request can produce a `failed` row.
- Retry attempts and supporting requests do not create extra dataset rows by themselves.
- Nested media, profile information and other arrays remain part of their parent row.
- A normal empty continuation after earlier successes creates no additional row.
- Saved failed rows are not assumed to be free; check their treatment in the active pricing configuration.

More inputs and larger page budgets can produce more saved rows. Start with a small run and check actual usage before increasing the workload.

### Tumblr post reblogs API 🔌

Replace `$ACTOR_ID` with the identifier shown in this Actor’s **API** tab and `$APIFY_TOKEN` with your Apify token.

```bash
curl -X POST "https://api.apify.com/v2/acts/$ACTOR_ID/runs?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"inputList":["https://www.tumblr.com/staff/822057428507049984"],"pagesPerPost":1}'
```

Download the dataset in JSON, CSV, Excel or other formats available in the Console, or retrieve it through the Apify API. Use schedules, webhooks and Apify integrations to connect results to Google Sheets, Make, Zapier, cloud storage or your own application. These connections are configured separately by the user.

### Reliability, retries, and public-data limits ⚠️

Collection uses pure HTTP with up to five concurrent requests. Invalid syntax and confirmed missing, removed or unavailable targets stop without unnecessary retries. Temporary network or proxy failures, timeouts, blocking responses, malformed data, throttling and server errors allow up to five total attempts per request.

Successful earlier pages remain saved if a later request fails. A normal end after saved results is not retried. An input with no accessible results can receive a failed row; that alone does not prove that its underlying source does not exist. An exhausted later request can add a failed row while preserving previous output.

The same blog can create multiple reblogs, which remain separate records. A reblog note is not the complete content of the reblogged post; use Post Scraper for selected full post records. The public list can be incomplete compared with the visible total count, and availability may change during collection.

Tumblr controls public availability, ranking and optional fields. Result counts can be affected by duplicates, removed content and changes during a run. A page budget is a collection limit, not a promise of exhaustive coverage.

An invalid string within a valid input list does not stop other inputs. Invalid overall configuration, such as a non-string list item or a wrong page-count type, exits before source requests. Startup failures, unavailable dataset storage or an unrecoverable result-save error can still stop the whole run. A failed save is not retried as a new scraping request.

### Frequently asked questions ❓

#### Can the same blog appear more than once?

Yes. Distinct reblog events remain separate rows even when their author is the same. Deduplicating only by author would lose valid results.

#### Does the page budget guarantee a specific number of rows?

No. The number of available interactions varies. Collection ends when the page budget is reached or the public list ends.

#### Does it require a Tumblr account or personal cookies?

No. You do not need to provide a Tumblr account, password or personal session cookie. Collection uses HTTP without opening a browser.

#### What happens to invalid or unavailable inputs?

Invalid individual inputs are recorded as failed without a source request. Confirmed missing or unavailable targets stop without unnecessary retries. Temporary failures allow up to five total attempts per request; other inputs and earlier saved results remain available.

#### Can I export results or run the same input again?

Yes. Export the default dataset or retrieve it through the Apify API. You can create an Apify schedule and connect completed runs to your own workflow.

### Support, responsible use, and related actors 🛟

For a reproducible issue, use the Actor’s **Issues** tab and provide the run ID, approximate time, a safe public input, expected behavior and actual result. Include the mode or page budget when relevant. Never share access tokens, personal cookies or proxy credentials.

Use public data responsibly and follow applicable privacy, copyright, contractual and platform requirements before storing, analyzing or redistributing collected information.

# Actor input Schema

## `inputList` (type: `array`):

Public Tumblr post URLs or blog-name/post-id values.

## `pagesPerPost` (type: `integer`):

Maximum result pages per input. Setup requests do not count as pages. Stops when the source has no next page or repeats a continuation. Actual rows per page can vary.

## Actor input object example

```json
{
  "inputList": [
    "https://www.tumblr.com/staff/822057428507049984"
  ],
  "pagesPerPost": 1
}
```

# Actor output Schema

## `reblogs` (type: `string`):

One dataset row per public result. Check success or failed status.

# 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 = {
    "inputList": [
        "https://www.tumblr.com/staff/822057428507049984"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapingmonkey/tumblr-post-reblogs-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 = { "inputList": ["https://www.tumblr.com/staff/822057428507049984"] }

# Run the Actor and wait for it to finish
run = client.actor("scrapingmonkey/tumblr-post-reblogs-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 '{
  "inputList": [
    "https://www.tumblr.com/staff/822057428507049984"
  ]
}' |
apify call scrapingmonkey/tumblr-post-reblogs-scraper --silent --output-dataset

```

## MCP server setup

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