Tumblr Blog 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
12 days ago
Last modified
Categories
Share
Fetch a Tumblr blog's profile data and its posts in a single run — info card, follower-visible metadata, and a paginated stream of posts with content, tags, and note counts. Works out of the box without any setup.
Why use this actor
- No setup required — works anonymously, no account or API key needed. Optionally paste a free key for richer fields.
- Blog info + posts in one call — you get the blog's title, description, post counter, and avatar (with key) alongside the actual posts, so you do not need to combine two actors.
- Filter by post type or tag — pull only
photoposts, onlyvideoposts, only items tagged#illustration, etc. - Bulk input — pass a list of blog handles in one run; each blog produces one info record plus its posts.
- Stable JSON output — every row carries
_input,_type,_source, and_scrapedAtenvelope fields so you can join results back to your input list and tell info-rows from post-rows. - Automatic retries — transient errors (429, 5xx) retry with backoff; missing or private blogs surface as a structured
_errorrow instead of crashing the run.
How it works
- You provide a list of Tumblr blog handles (e.g.
staff.tumblr.com). Optionally include a Tumblr API key for richer data. - The actor fetches the blog's info card, then paginates through posts up to
maxPosts, optionally filtered bykindortag. - Each record streams into your dataset, ready to download as JSON, CSV, or Excel.
You do not need to manage scrapers, browsers, 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 URLs, NSFW flag, theme metadata, ask configuration), register a Tumblr v2 API consumer key — it is free, instant, and takes about two minutes:
- Go to tumblr.com/oauth/apps and log into any Tumblr account.
- Click Register application. Fill in any name, website, and short description.
- Copy the OAuth consumer key (the short alphanumeric string, not the secret).
- Paste it as the
apiKeyinput field.
There is no review process. One key gives you 5,000 API requests per day, enough for roughly 100,000 posts on this actor.
Input
{"blogs": ["staff.tumblr.com","engineering.tumblr.com"],"apiKey": "","maxPosts": 20,"kind": "","tag": "","proxyConfiguration": {"useApifyProxy": true,"apifyProxyGroups": ["DATACENTER"]}}
| Field | Type | Description |
|---|---|---|
blogs | array | List of Tumblr blog handles or URLs. Accepts staff, staff.tumblr.com, or https://staff.tumblr.com/. Dashed blog names are supported. |
apiKey | string | Optional Tumblr v2 API consumer key for richer fields. Leave blank for anonymous mode (still returns blog info + posts + tags + note counts). |
maxPosts | integer | Maximum posts per blog. Default 20. Set to 0 for unlimited (paginates until the blog runs out). |
kind | string | Optional post type filter: text, photo, quote, link, audio, video, answer. Leave blank for all types. |
tag | string | Optional single-tag filter. Case-insensitive. Leave blank to fetch all posts. |
proxyConfiguration | object | Apify Proxy settings. Datacenter proxy is recommended and works in nearly all cases. |
Output
Each blog produces one blog_info row followed by its posts. Records stream into the dataset as they are fetched.
Blog info row
Input: staff.tumblr.com
{"_input": "staff.tumblr.com","_type": "blog_info","_source": "S1-api","_scrapedAt": "2026-05-18T11:24:08.187026+00:00","name": "staff","title": "Tumblr Staff","url": "https://staff.tumblr.com/","description": "The official Tumblr Staff blog.","posts": 2986,"updated": 1778641000,"is_nsfw": false,"can_chat": false,"share_likes": false,"ask": true,"ask_anon": false,"avatar": [{ "width": 512, "height": 512, "url": "https://64.media.tumblr.com/.../s512x512u_c1/..." }],"theme": {"background_color": "#001935","link_color": "#ffffff","title_color": "#ffffff","header_image": "https://..."}}
Post row
{"_input": "staff.tumblr.com","_type": "post","_source": "S1-api","_scrapedAt": "2026-05-18T11:24:09.012345+00:00","id": 775423442789793792,"blog_name": "staff","post_url": "https://staff.tumblr.com/post/775423442789793792","slug": "welcome-to-tumblr","type": "text","format": "html","timestamp": 1778641000,"date": "2026-05-12 20:30:00 GMT","summary": "Welcome to Tumblr","note_count": 24512,"tags": ["tumblr", "welcome"],"state": "published","title": "Welcome to Tumblr","body": "<p>...</p>","reblog_key": "AbCdEfGh","short_url": "https://tmblr.co/Z..."}
| Field | Type | Description |
|---|---|---|
_input | string | The blog handle or URL exactly as you supplied it. Use to join results back to your input list. |
_type | string | "blog_info" for the first row of each blog, "post" for each post that follows. |
_source | string | Internal tag for the path used to fetch the record. S1-api means the official Tumblr v2 API path. |
_scrapedAt | string | ISO-8601 UTC timestamp when the record was scraped. |
name | string | Blog handle (info row). |
title | string | Blog display title (info row) or post title (text/link posts). |
description | string | Blog "About" text. May be empty. |
url | string | Canonical blog URL (info row). |
posts | integer | Total post count on the blog (info row). |
is_nsfw | boolean | true if the blog is flagged as NSFW. |
avatar | array | Avatar images at multiple resolutions. |
theme | object | Blog theme — colors, header image. |
id | integer | Numeric post ID (post row). |
post_url | string | Permalink to the post. |
type | string | Post kind: text, photo, quote, link, audio, video, answer. |
timestamp | integer | Unix epoch seconds when the post was published. |
date | string | Human-readable post date in GMT. |
summary | string | Short text summary Tumblr generates for the post. |
note_count | integer | Total notes (likes + reblogs + replies). |
tags | array | Tags the author attached to the post. |
body / caption / content | string / array | Post content. Field depends on type — text posts use body, photo/video posts use caption and photos/video_url, blocks-format posts use content. |
Error envelope
If the API key is missing, invalid, or the blog does not exist, the actor returns a structured error row instead of crashing:
{"_input": "blog-that-does-not-exist.tumblr.com","_error": "fetch_failed","_errorDetail": "NotFound https://api.tumblr.com/v2/blog/blog-that-does-not-exist.tumblr.com/info","_source": "S1-api","_scrapedAt": "2026-05-18T11:24:11.998877+00:00"}
Common _errorDetail values:
TUMBLR_API_KEY not configured—apiKeyinput is missing.401 Unauthorized— the key is invalid, revoked, or quota-exhausted.NotFound ...— the blog handle does not exist or has been deactivated.
Filter on _error to triage failed rows.
Pricing
This actor is billed per result: $2.50 per 1,000 results (Tier 2). Each blog_info row, each post row, and each _error row counts as one result.
Other Sosmed Actors
| Platform | Actor | Best for |
|---|---|---|
| Tumblr | Tumblr Post Detail Scraper | One permalink — full blocks content, notes, blog card |
| Medium | Medium User Scraper | Author profile + their published stories |
| Substack | Substack Publication Scraper | Newsletter masthead + recent posts |
| Mastodon | Mastodon Account Scraper | Fediverse account profile + statuses |
| Bluesky | Bluesky Account Scraper | atproto profile + counters |
| Threads | Threads Account Scraper | Profile data for a Threads handle |
Browse the full catalog at apify.com/xtracto.
Notes
- Quota — one Tumblr API key gives you 5,000 requests per day. This actor uses one request per 20 posts plus one request per blog's info card, so a single key comfortably handles ~100,000 posts/day.
- NSFW filter — blogs that opted out of API exposure for adult content may return a partial response. The actor respects Tumblr's NSFW visibility rules.
- Dashed blog names — handles like
my-awesome-blog.tumblr.comare fully supported. Both bare handle (my-awesome-blog) and full URL forms are accepted. - Pagination — the actor paginates in batches of 20 posts (Tumblr's API limit per request) and stops when it reaches
maxPostsor the blog runs out. - Custom domains — blogs hosted on custom domains (e.g. a personal
.com) still work as long as you supply the underlying.tumblr.comhandle, not the vanity domain.