Tumblr Posts API
List a blog's public posts with summary, tags, notes, post time and link, page by page.
Sendusername
ReturnssummarynoteCounttypetimestamppostUrlcontent
Get public Tumblr blogs, posts, reblog trails, polls, tag stats, search results and original-size images as clean JSON. Send a blog name, a post link or a tag. No Tumblr login.
| # | Post | Notes | Type | Posted (Unix time) | Link | Blog name | Id |
|---|---|---|---|---|---|---|---|
| 1 | Premium just got better | 3567 | blocks | 1,789,650,982 | https://staff.tumblr.com/post/828009069026721792/premium-just-g… | staff | 828009069026721792 |
| 2 | Deleted accounts can now be recovered up to 30 days later | 12,431 | blocks | 1,783,975,056 | https://staff.tumblr.com/post/822057428507049984/in-case-youre-… | staff | 822057428507049984 |
| 3 | Where's that comment? | 7553 | blocks | 1,780,495,189 | https://staff.tumblr.com/post/818408523445731328 | staff | 818408523445731328 |
| 4 | A note from the Tumblr team | 46,168 | blocks | 1,776,283,552 | https://staff.tumblr.com/post/813992302192263168/a-note-from-th… | staff | 813992302192263168 |
| 5 | Tumblr Hack Day, March 2026 Edition | 5640 | blocks | 1,775,805,709 | https://staff.tumblr.com/post/813491247714074624 | staff | 813491247714074624 |
| 6 | We meant it. Let's work together | 17,292 | blocks | 1,774,903,543 | https://staff.tumblr.com/post/812545258409934848/we-meant-it-le… | staff | 812545258409934848 |
| 7 | tumblr tuesday: the amazing digital circus | 13,096 | blocks | 1,774,371,863 | https://staff.tumblr.com/post/811987751056605184 | staff | 811987751056605184 |
| 8 | Tumblr Advisor Board | 35,079 | blocks | 1,774,066,484 | https://staff.tumblr.com/post/811667537981030400 | staff | 811667537981030400 |
| 9 | Tumblr Advisor Board | 35,079 | blocks | 1,774,051,345 | https://staff.tumblr.com/post/811651663989538816 | staff | 811651663989538816 |
| 10 | Reblogs in a chain now get their own notes | 319,772 | blocks | 1,773,704,660 | https://staff.tumblr.com/post/811288138350821376/its-very-clear… | staff | 811288138350821376 |
What each one takes and what it returns. Open one for a real response, every input and every field.
List a blog's public posts with summary, tags, notes, post time and link, page by page.
Sendusername
ReturnssummarynoteCounttypetimestamppostUrlcontent
Get one post from its link, or its blog and ID: the full content blocks, reblog trail, poll, tags and note count.
Sendusernameorpost_idorurl
ReturnssummaryblogNamenoteCounttypetimestamppostUrl
Get a public blog from its name or link: title, description and whether it is marked NSFW.
Sendusernameorurl
ReturnsnametitledescriptionheaderImageisNsfwisPrivate
Search public Tumblr posts by keyword.
Sendquery
ReturnsJSON; every field is in the API reference
Get a tag's stats: followers, total posts, new posts and whether it is trending.
Sendtag
ReturnsnamedescriptionfollowerCountpostCountnewPostCountisTrending
List the recent public posts under a tag.
Sendtag
ReturnsJSON; every field is in the API reference
Collect the original-size images from a blog's recent posts.
Sendusername
ReturnsJSON; every field is in the API reference
Collect the original-size images from one post and its reblog trail.
Sendusernameorpost_idorurl
ReturnsJSON; every field is in the API reference
List a blog's posts as Tumblr's own records, for your own parsing.
Sendusername
ReturnsJSON; every field is in the API reference
Get a blog's profile as Tumblr's own record, for your own parsing.
Sendusername
ReturnsJSON; every field is in the API reference
Measure how big a tag is and read what people post under it.
TagTag postsPosts searchGather the original-size images from a blog or from a post's whole reblog trail.
ImagesPost imagesTake Tumblr's own post and profile records when you want every field as Tumblr has it.
Raw postsRaw profileOne request shape for every Tumblr endpoint: the endpoint ID and its input. No SDK needed.
curl --request POST \ --url https://data.upscrape.com/execute \ --header "Authorization: Bearer $UPSCRAPE_API_KEY" \ --header "Content-Type: application/json" \ --header "Prefer: wait=30" \ --data '{ "capability": "tumblr.posts.list", "input": { "limit": 40, "username": "staff" }}'
import jsonimport osimport requestspayload = json.loads(r'''{ "capability": "tumblr.posts.list", "input": { "limit": 40, "username": "staff" }}''')response = requests.post( "https://data.upscrape.com/execute", headers={ "Authorization": f"Bearer {os.environ['UPSCRAPE_API_KEY']}", "Content-Type": "application/json", "Prefer": "wait=30", }, json=payload,)response.raise_for_status()print(json.dumps(response.json(), indent=2))
const response = await fetch("https://data.upscrape.com/execute", { method: "POST", headers: { "Authorization": `Bearer ${process.env.UPSCRAPE_API_KEY}`, "Content-Type": "application/json", "Prefer": "wait=30", }, body: JSON.stringify({ "capability": "tumblr.posts.list", "input": { "limit": 40, "username": "staff" }}),});if (!response.ok) { throw new Error(`Upscrape request failed: ${response.status}`);}console.log(JSON.stringify(await response.json(), null, 2));
{ "totalCount": 34, "posts": [ { "blogName": "staff", "id": "828009069026721792", "noteCount": 3567, "postUrl": "https://staff.tumblr.com/post/828009069026721792/premium-just-got-better", "summary": "Premium just got better", "timestamp": 1789650982, "type": "blocks", "content": [ { "text": "Premium just got better", "type": "text" }, { "type": "image" } ], "tags": [ "tumblr premium", "new features" ] }, { "blogName": "staff", "id": "822057428507049984", "noteCount": 12431, "postUrl": "https://staff.tumblr.com/post/822057428507049984/in-case-youre-looking-for-a-blog-thats-gone", "summary": "Deleted accounts can now be recovered up to 30 days later", "timestamp": 1783975056, "type": "blocks", "content": [ { "text": "In case you’re looking for a blog that’s gone missing on Tumblr and didn’t see this recent update.", "type": "text" }, { "text": "\nA missing blog without “-deactivated” isn’t necessarily a sign of a suspension, it might just mean that someone deleted their own account …", "type": "text" } ], "tags": [ "tumblr" ] } ]}
https://data.upscrape.com/mcp
Use Upscrape to list the latest posts on Tumblr's staff blog and rank them by notes. What were the five biggest announcements?
With Upscrape, open staff.tumblr.com/post/828009069026721792 and summarise what it announces, with its tags and note count.
With Upscrape, get the Tumblr profile for https://www.tumblr.com/staff. Tell me what it costs before you run it, then show the results as a table.
The short answers. The docs have the long ones.
Tumblr has an API that needs a registered app and OAuth keys. Upscrape reads public Tumblr pages, so you get blogs, posts, tags and images with one API key.
No. You send a blog name, a link or a tag and get JSON back. Nothing runs on your account. Private blogs are not part of it.
Yes. The image endpoints return the original-size files from a blog's posts or from one post and its reblog trail.
Posts, post, profile, posts search, tag, tag posts, images, post images, raw posts and raw profile. Each is its own endpoint with a published input schema, and the response is JSON.
Every Tumblr endpoint costs 1 credit per successful call. You buy credits once, with no subscription, and paid credits never expire. New accounts get free credits to try it.
Yes. Connect any MCP client to the Upscrape MCP server with OAuth or an API key. The agent finds the Tumblr endpoint, checks its price and runs it with the same credits as the REST API.
Upscrape reads public pages only and needs no login. How you use the data is yours to decide under the laws that apply to you; we sign a data processing agreement for your legal review.
We fix the endpoint. Your request and the response fields stay the same.
Up to 100 free credits to start, no card needed.