Tumblr Posts API
List a blog's public posts with summary, tags, notes, post time and link, page by page.
- 1 credit per call
- Failed calls are free
- Updated
- tumblr.posts.list
{ "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" ] } ]}
| # | 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 you send
The input
object of the request, with every field the endpoint accepts.
| Field | Type | Required | What it does | Example |
|---|---|---|---|---|
| username | string | yes | The blog's name, such as staff. | staff |
| limit | integer | no | How many posts to return. | 40 |
Fields it returns
What each record in the response holds, with the values from the sample above.
| Field | Type | What it is | Example |
|---|---|---|---|
| posts[].summary | string | A short summary of the post. | Premium just got better |
| posts[].noteCount | integer | Notes (likes and reblogs), as Tumblr shows them. | 3567 |
| posts[].type | string | The post format. | blocks |
| posts[].timestamp | integer | When it was posted, as a Unix time in seconds. | 1,789,650,982 |
| posts[].postUrl | string | The post's link. | https://staff.tumblr.com/post/828009069026721792/premium-just-g… |
| posts[].content[].text | string | Premium just got better | |
| posts[].content | array | The post's parts, such as text and images. | 19 records |
| posts[].blogName | string | The blog that posted it. | staff |
| posts[].content[].type | string | What kind of part it is, such as text. | text |
| posts[].id | string | Tumblr's ID for the post. | 828009069026721792 |
| posts[].tags | array | The post's tags. | tumblr premium, new features |
| posts | array | The blog's posts. | 34 records |
| totalCount | integer | How many posts this answer holds. | 34 |
Call it from your code, or ask your agent
Set UPSCRAPE_API_KEY to your key and copy a working request.
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));
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?
More from the Tumblr API
The same data from other platforms
Tumblr Posts API FAQ
The short answers. The docs have the long ones.
How much does the Tumblr Posts API cost?
1 credit per successful call, shown before it runs. You buy credits once, and paid credits never expire.
What do I send?
Send username. The input fields below list every option with its type and limits.
Do I need a Tumblr login?
No. It reads public Tumblr data; nothing runs on your account.
Can my AI agent call it?
Yes, over MCP: the agent finds tumblr.posts.list, checks its price and runs it with the same credits as the REST API.
Your first Tumblr call is free.
Up to 100 free credits to start, no card needed.