Tumblr API: List blog posts
Lists recent public posts of a Tumblr blog, optionally only those with a given tag. Private or login-only blogs cannot be read.
Unofficial. Not affiliated with or endorsed by Tumblr.
Inputs
Values from the run on Oct 31, 2026, shown under Output.
- Tag optional
tag Only posts tagged with this tag, for example art.
(default)
- Blog, required
blog Blog name or Tumblr blog link, for example staff or staff.tumblr.com.
staff
- Max Results optional
max_results Maximum number of posts to return, for example 20.
100
Whole number from 1 to 100. Default
20.
Input as JSON
{ "blog": "staff", "max_results": 100}Output
{ "posts": [ { "tags": [ "tumblr premium", "new features" ], "text": "Premium just got better\nYour feedback matters. Tumblr Premium now includes a few brand new, top-requested features.\nSaved Posts & Collections\nNever lose a post again. Use the bookmark icon to save any post you want to come back to, and sort them into private Collections. This is available on web rig…", "title": "Premium just got better", "post_id": "828009069026721792", "is_reblog": false, "post_link": "https://staff.tumblr.com/post/828009069026721792/premium-just-got-better" , "post_type": "text", "posted_at": "2026-09-17T13:16:22Z", "note_count": 2832, "image_links": [ "https://64.media.tumblr.com/8b352dd852517abad49b7b3aeae47ac1/0401186cfa311dc5-8b/s1280x1920/dbfb5aa1f846151c2aa25da0f7041829a01f2af3.pnj" , "https://64.media.tumblr.com/0cbcad38ff8141c6aabf32d9442648ec/0401186cfa311dc5-b0/s1280x1920/f6921cd84eb290a95e17d7500c859c3d7fbdd89b.gifv" , "https://64.media.tumblr.com/419975ae50a0cb928a94f0d33ecce9d9/0401186cfa311dc5-dd/s1280x1920/a6363773b973a30df1b993013c2de09861dbf5a1.gifv" ] }, { "tags": [ "tumblr" ], "text": "Deleted accounts can now be recovered up to 30 days later\nWe’re making a big change to how account deletion works on Tumblr, and we’re really excited about it, because this is something that some of you have been requesting for… well… a literal decade.\nBefore today, when you deleted your Tumblr acco…", "title": null, "post_id": "822057428507049984", "is_reblog": true, "post_link": "https://staff.tumblr.com/post/822057428507049984/in-case-youre-looking-for-a-blog-thats-gone" , "post_type": "text", "posted_at": "2026-07-13T20:37:36Z", "note_count": 12393, "image_links": [] }, { "tags": [ "radical speed month", "rsm", "radicalspeedmonth" ], "text": "Where's that comment?\nHello Tumblr! \n@jubs here, today, to tell you about a feature we're building: Comments by author!\nComments (or replies) have been around for a while, but they have always been tucked away from your regular feed, and so we're working on a few ways to integrate them into the rest…", "title": "Where's that comment?", "post_id": "818408523445731328", "is_reblog": true, "post_link": "https://staff.tumblr.com/post/818408523445731328" , "post_type": "text", "posted_at": "2026-06-03T13:59:49Z", "note_count": 7548, "image_links": [ "https://64.media.tumblr.com/b70baed40b8a42f2647f1e9727980326/bc08fda5fd4aaa10-94/s1280x1920/bde5fcc74d6cbed9f11ef7118606884423d43ac1.pnj" , "https://64.media.tumblr.com/1b0af89e8b0e820c96223492c467801e/bc08fda5fd4aaa10-f1/s1280x1920/58c455711260d7dceb148657a8e8f8faea2d6b9b.pnj" , "https://64.media.tumblr.com/bd5d92dc4ca0657b07706a8b37644e01/d633fec0a0ddd954-a0/s1280x1920/0155a6809e97ee7113e089a13986d0fdd98bc8ac.pnj" ] } ], "blog_link": "https://www.tumblr.com/staff" , "blog_title": "Tumblr Staff", "blog_description": ""}Code
curl https://api.fous.com/v1/runs \ -H "Authorization: Bearer $FOUS_API_KEY" \ -H "Content-Type: application/json" \ -d '{"method":"tumblr.com/list_blog_posts","input":{"blog":"staff","max_results":100}}' # Save as fous.py, then run: python3 fous.pyimport json, os, timefrom urllib.error import HTTPErrorfrom urllib.request import Request, urlopenAPI = "https://api.fous.com/v1/runs" KEY = os.environ["FOUS_API_KEY"]HEADERS = { "Authorization": f"Bearer {KEY}", "Content-Type": "application/json" ,}def call(url, body=None): data = json.dumps(body).encode() if body else None request = Request(url, data, HEADERS) try: with urlopen(request, timeout=120) as r: return r.status, json.load(r) except HTTPError as error: message = json.load(error)["error"]["message"] raise RuntimeError(message) from errorstatus, run = call(API, { "method": "tumblr.com/list_blog_posts" , "input": { "blog": "staff", "max_results": 100 }})# 202: still going after 30 s. Ask again until it ends.while status == 202: time.sleep(2) status, run = call(f"{API}/{run['id']}")print(json.dumps(run["data"], indent=2))// Save as fous.mjs, then run: node fous.mjsconst api = "https://api.fous.com/v1/runs" ;const headers = { Authorization: `Bearer ${process.env.FOUS_API_KEY}`, "Content-Type": "application/json" ,};let response = await fetch(api, { method: "POST", headers, body: JSON.stringify({ "method": "tumblr.com/list_blog_posts" , "input": { "blog": "staff", "max_results": 100 } }), signal: AbortSignal.timeout(120_000),});let run = await response.json();// 202: still going after 30 s. Ask again until it ends.while (response.status === 202) { await new Promise((done) => setTimeout(done, 2_000)); response = await fetch(`${api}/${run.id}`, { headers }); run = await response.json();}if (!response.ok) throw new Error(run.error.message);console.log(run.data);# Connect your agent to Fous once, over MCP (Streamable HTTP):# https://api.fous.com/mcp# Set FOUS_API_KEY first: create a key at https://app.fous.com/keys.# Claude Codeclaude mcp add \ --scope user \ --transport http fous https://api.fous.com/mcp \ --header "Authorization: Bearer ${FOUS_API_KEY:?Set FOUS_API_KEY to your Fous API key}"# Codexcodex mcp add fous \ --url https://api.fous.com/mcp \ --bearer-token-env-var FOUS_API_KEY# Cursor, VS Code, Windsurf, Cline and morenpx -y add-mcp https://api.fous.com/mcp -g -n fous \ --header "Authorization: Bearer ${FOUS_API_KEY:?Set FOUS_API_KEY to your Fous API key}"# Then ask your agent:# "Use Fous to run tumblr.com/list_blog_posts# with {"blog":"staff","max_results":100}"Over HTTP, the answer’s data holds the output. A run still going after 30 seconds answers 202 with its id: ask GET /v1/runs/{id} until it ends.
Schema
Input schema
{ "type": "object", "required": [ "blog" ], "properties": { "tag": { "type": "string", "default": "", "description": "Only posts tagged with this tag, for example art." }, "blog": { "type": "string", "description": "Blog name or Tumblr blog link, for example staff or staff.tumblr.com." }, "max_results": { "type": "integer", "default": 20, "maximum": 100, "minimum": 1, "description": "Maximum number of posts to return, for example 20." } }}Output schema
{ "type": "object", "required": [ "blog_title", "blog_description", "blog_link", "posts" ], "properties": { "posts": { "type": "array", "items": { "type": "object", "required": [ "post_id", "post_type", "title", "text", "image_links", "tags", "note_count", "posted_at", "is_reblog", "post_link" ], "properties": { "tags": { "type": "array", "items": { "type": "string" } }, "text": { "type": "string" }, "title": { "type": [ "string", "null" ] }, "post_id": { "type": "string", "description": "Tumblr post identifier." }, "is_reblog": { "type": "boolean" }, "post_link": { "type": "string" }, "post_type": { "enum": [ "text", "photo", "quote", "link", "video", "audio", "answer" ], "type": "string" }, "posted_at": { "type": [ "string", "null" ], "description": "Posting time in UTC." }, "note_count": { "type": [ "integer", "null" ] }, "image_links": { "type": "array", "items": { "type": "string" } } }, "additionalProperties": false } }, "blog_link": { "type": "string" }, "blog_title": { "type": "string" }, "blog_description": { "type": "string" } }, "additionalProperties": false}- Price
- 1 credit per completed run (1¢ with pay as you go); failed runs are free.
- Method
tumblr.com/list_blog_posts- Returns
- blog title, description and link; posts with type, title, text, images, tags, note count, posting time, reblog flag and link
Use it from your agent
Give your agent this line. It reads SKILL.md, gets a Fous API key and connects the Fous MCP server. Its run then takes the method tumblr.com/list_blog_posts with the inputs above.
Ask your agent
- Pull the 20 most recent posts from the staff blog on Tumblr, including note counts and whether each one is a reblog
- What has nasa.tumblr.com posted lately? Give me titles, text, and links for the last 10 posts
- Show me up to 50 posts tagged 'fanart' from the blog artsofaria, with image links and tags
- I need the latest 5 entries from the blog 'thelastgoodtumblr' — post type, posting time, and how many notes each got
- Get the blog description and the newest 30 posts tagged 'writing prompts' from writingprompts on tumblr.com
See more
Lists an account's latest public Threads posts, newest first, with text, engagement counts, thumbnails and links. Only posts shown without logging in are returned.
threads.com/list_recent_postsLists a Mastodon account's latest public posts, newest first. Replies and boosts are optional. Private and unlisted posts are left out.
mastodon.social/list_recent_postsLists the latest publicly embeddable posts and reels from an Instagram account, newest first. Without login Instagram may show fewer posts than requested. View counts that are not available are null.
instagram.com/list_recent_postsLists an account's latest public Bluesky posts, newest first. Replies and reposts are left out unless requested; a repost's time is when the account reposted it.
bsky.app/list_recent_postsLists the latest public articles by a Medium writer or publication (by username, publication name or Medium link), with dates, reading times, claps, member-only labels and tags.
medium.com/list_author_articlesLists the latest posts from a public Telegram channel preview, with text, posting time, approximate views, edit flag, forwarded source, thumbnails and post links.
t.me/list_channel_postsLists the latest public posts for a hashtag on a Mastodon server, newest first. Some servers require login for public timelines.
mastodon.social/list_hashtag_postsLists a company's recent public LinkedIn posts in page order, from its name or LinkedIn company page link: post text, approximate date, reactions, comments, image and link. Only updates shown on the signed-out company page are available.
linkedin.com/list_company_posts