Tumblr Blog Scraper avatar

Tumblr Blog Scraper

Pricing

from $0.99 / 1,000 results

Go to Apify Store
Tumblr Blog Scraper

Tumblr Blog Scraper

Get a Tumblr blog's info and posts via v2 API.

Pricing

from $0.99 / 1,000 results

Rating

0.0

(0)

Developer

Farhan Febrian Nauval

Farhan Febrian Nauval

Maintained by Community

Actor 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 photo posts, only video posts, 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 _scrapedAt envelope 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 _error row instead of crashing the run.

How it works

  1. You provide a list of Tumblr blog handles (e.g. staff.tumblr.com). Optionally include a Tumblr API key for richer data.
  2. The actor fetches the blog's info card, then paginates through posts up to maxPosts, optionally filtered by kind or tag.
  3. 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:

  1. Go to tumblr.com/oauth/apps and log into any Tumblr account.
  2. Click Register application. Fill in any name, website, and short description.
  3. Copy the OAuth consumer key (the short alphanumeric string, not the secret).
  4. Paste it as the apiKey input 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"]
}
}
FieldTypeDescription
blogsarrayList of Tumblr blog handles or URLs. Accepts staff, staff.tumblr.com, or https://staff.tumblr.com/. Dashed blog names are supported.
apiKeystringOptional Tumblr v2 API consumer key for richer fields. Leave blank for anonymous mode (still returns blog info + posts + tags + note counts).
maxPostsintegerMaximum posts per blog. Default 20. Set to 0 for unlimited (paginates until the blog runs out).
kindstringOptional post type filter: text, photo, quote, link, audio, video, answer. Leave blank for all types.
tagstringOptional single-tag filter. Case-insensitive. Leave blank to fetch all posts.
proxyConfigurationobjectApify 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..."
}
FieldTypeDescription
_inputstringThe blog handle or URL exactly as you supplied it. Use to join results back to your input list.
_typestring"blog_info" for the first row of each blog, "post" for each post that follows.
_sourcestringInternal tag for the path used to fetch the record. S1-api means the official Tumblr v2 API path.
_scrapedAtstringISO-8601 UTC timestamp when the record was scraped.
namestringBlog handle (info row).
titlestringBlog display title (info row) or post title (text/link posts).
descriptionstringBlog "About" text. May be empty.
urlstringCanonical blog URL (info row).
postsintegerTotal post count on the blog (info row).
is_nsfwbooleantrue if the blog is flagged as NSFW.
avatararrayAvatar images at multiple resolutions.
themeobjectBlog theme — colors, header image.
idintegerNumeric post ID (post row).
post_urlstringPermalink to the post.
typestringPost kind: text, photo, quote, link, audio, video, answer.
timestampintegerUnix epoch seconds when the post was published.
datestringHuman-readable post date in GMT.
summarystringShort text summary Tumblr generates for the post.
note_countintegerTotal notes (likes + reblogs + replies).
tagsarrayTags the author attached to the post.
body / caption / contentstring / arrayPost 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 configuredapiKey input 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

PlatformActorBest for
TumblrTumblr Post Detail ScraperOne permalink — full blocks content, notes, blog card
MediumMedium User ScraperAuthor profile + their published stories
SubstackSubstack Publication ScraperNewsletter masthead + recent posts
MastodonMastodon Account ScraperFediverse account profile + statuses
BlueskyBluesky Account Scraperatproto profile + counters
ThreadsThreads Account ScraperProfile 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.com are 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 maxPosts or 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.com handle, not the vanity domain.