Tumblr Post Detail Scraper
Pricing
from $0.99 / 1,000 results
Pricing
from $0.99 / 1,000 results
Rating
0.0
(0)
Developer
Farhan Febrian Nauval
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
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 shorthandblog/post_id. - Stable JSON output suitable for pipelines, spreadsheets, and databases — every row carries
_input,_source,_scrapedAtenvelope fields so you can join results back to your input list.
How it works
- You provide a list of Tumblr posts — full URLs or
blog/post_idshorthand. Optionally include a Tumblr API key for richer data. - 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.
- 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:
- Go to tumblr.com/oauth/apps and sign in with any Tumblr account.
- Click Register application, fill in any name and a URL.
- Copy the OAuth Consumer Key that appears for your new app.
- Paste it into the
apiKeyfield on the input form (or set theTUMBLR_API_KEYenvironment variable).
The registration is instant — there is no review queue, and the key has no per-key cost.
Input
{"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
{"_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:
{"_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 | Bulk posts from a blog, filtered by tag or type |
| Medium | Medium Post Detail Scraper | Full article text + claps + author |
| Substack | Substack Post Detail Scraper | Newsletter post body + paywall flag |
| Mastodon | Mastodon Status Detail Scraper | Single fediverse status + reblog chain |
| Bluesky | Bluesky Post Detail Scraper | atproto post + thread context |
| Threads | Threads Post Detail Scraper | Single Threads post + replies count |
Browse the full catalog at apify.com/xtracto.
Notes
- Content blocks vary by post type. Text posts give
textblocks; photo posts giveimageblocks withmedia[]URL variants; video posts givevideoblocks with embed metadata; answer posts include theasking_nameand the question body. Always checktypebefore reading type-specific fields. - Reblog tree depth. The
trailarray 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_countmay lag the live total by a few minutes. - Legacy vs blocks format. Posts older than 2019 may have
is_blocks_post_format: falseand a flatbody/captionHTML field instead of the structuredcontentarray. 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.