# Tumblr API

> Tumblr returns public blog posts as a workflow and API.

Tumblr’s List blog posts method returns recent public posts with text, titles, tags, links, types, posting times, note counts, and image links. List blog posts requires a blog name or link; an optional tag filters posts, and a maximum results value sets the return count.

- Page: https://fous.com/workflows/tumblr
- Handle: `@tumblr`
- Category: [Social](https://fous.com/workflows/category/social)
- Source website: https://tumblr.com
- Last verified: Sep 29, 2026
- Fous is not affiliated with Tumblr.

## Methods

### List blog posts

Operation `list_blog_posts`, version 1. 1 credit per call.

List recent public Tumblr blog posts, with an optional tag filter. Private or login-only blogs cannot be read.

**Input**

| Field | Type | Required | Example | Description |
|---|---|---|---|---|
| `tag` | string | no | `"tumblr premium"` | Only posts tagged with this tag, for example art. |
| `blog` | string | yes | `"staff"` | Blog name or Tumblr blog link, for example staff or staff.tumblr.com. |
| `max_results` | integer | no | `20` | Maximum number of posts to return, for example 20. |

**Input schema**

```json
{
  "type": "object",
  "required": [
    "blog"
  ],
  "properties": {
    "tag": {
      "type": "string",
      "default": "",
      "description": "Only posts tagged with this tag, for example art.",
      "examples": [
        "tumblr premium",
        "asdfnonexistentxyz989898"
      ]
    },
    "blog": {
      "type": "string",
      "description": "Blog name or Tumblr blog link, for example staff or staff.tumblr.com.",
      "examples": [
        "staff",
        "staff.tumblr.com"
      ]
    },
    "max_results": {
      "type": "integer",
      "default": 20,
      "maximum": 100,
      "minimum": 1,
      "description": "Maximum number of posts to return, for example 20.",
      "x-fous-developer": true,
      "examples": [
        20,
        5
      ]
    }
  },
  "additionalProperties": false,
  "examples": [
    {
      "tag": "tumblr premium",
      "blog": "staff",
      "max_results": 20
    },
    {
      "tag": "asdfnonexistentxyz989898",
      "blog": "staff",
      "max_results": 5
    },
    {
      "blog": "staff.tumblr.com",
      "max_results": 20
    }
  ]
}
```

**Output**

| Field | Type | Example | Description |
|---|---|---|---|
| `posts` | array |  |  |
| `posts[].tags` | array |  |  |
| `posts[].text` | string |  |  |
| `posts[].title` | string or null | `"Premium just got better"` |  |
| `posts[].post_id` | string | `"828009069026721792"` | Tumblr post identifier. |
| `posts[].is_reblog` | boolean | `false` |  |
| `posts[].post_link` | string | `"https://staff.tumblr.com/post/828009069026721792/premium-just-got-better"` |  |
| `posts[].post_type` | string | `"text"` |  |
| `posts[].posted_at` | string or null | `"2026-09-17T13:16:22Z"` | Posting time in UTC. |
| `posts[].note_count` | integer or null | `2832` |  |
| `posts[].image_links` | array |  |  |
| `blog_link` | string | `"https://www.tumblr.com/staff"` |  |
| `blog_title` | string | `"Tumblr Staff"` |  |
| `blog_description` | string | `""` |  |

**Example input**

```json
{
  "tag": "tumblr premium",
  "blog": "staff",
  "max_results": 20
}
```

**Example output**

```json
{
  "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…",
      "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"
      ]
    },
    {
      "tags": [
        "features",
        "tumblr premium"
      ],
      "text": "✨Ad-free Browsing is becoming Tumblr Premium ✨\nYou read that right: We’re upgrading Ad-free Browsing to a bigger, better package—based on your feedback and wishes. We hope you like it!\nSo, what’s in t…",
      "title": "✨Ad-free Browsing is becoming Tumblr Premium ✨",
      "post_id": "756904138164649984",
      "is_reblog": false,
      "post_link": "https://staff.tumblr.com/post/756904138164649984/ad-free-browsing-is-becoming-tumblr-premium",
      "post_type": "text",
      "posted_at": "2024-07-24T16:53:56Z",
      "note_count": 4102,
      "image_links": [
        "https://64.media.tumblr.com/ec3b6bdc520ddd37712182ccc31e07fe/2d73f12ecc636976-f8/s1280x1920/bbec5c8ddc91885675a2360191761b9863b50bcc.gifv"
      ]
    }
  ],
  "blog_link": "https://www.tumblr.com/staff",
  "blog_title": "Tumblr Staff",
  "blog_description": ""
}
```

## Quick start

Call the API with a Fous API key (`FOUS_API_KEY`). To create one, turn on Developer mode in Fous Studio, then open Keys & connections → API keys (https://app.fous.com/keys).

```bash
# First set your key: export FOUS_API_KEY='YOUR_FOUS_API_KEY'
: "${FOUS_API_KEY:?Set FOUS_API_KEY before running this example}"

curl 'https://api.fous.com/v1/query' \
  --fail-with-body --silent --show-error --max-time 120 \
  -H "Authorization: Bearer $FOUS_API_KEY" \
  -H 'Content-Type: application/json' \
  --data-raw '{
  "api": "@tumblr",
  "visibility": "public",
  "operation": "list_blog_posts",
  "version": 1,
  "input": {
    "tag": "tumblr premium",
    "blog": "staff",
    "max_results": 20
  },
  "response": {
    "format": "json"
  }
}'
```

```python
# Save as fous.py and run with python3 fous.py. No packages needed.
# First set your key: export FOUS_API_KEY='YOUR_FOUS_API_KEY'
import json
import os
import urllib.error
import urllib.request

api_key = os.environ.get("FOUS_API_KEY")
if not api_key:
    raise RuntimeError("Set FOUS_API_KEY before running this example")

body = json.loads("{\n  \"api\": \"@tumblr\",\n  \"visibility\": \"public\",\n  \"operation\": \"list_blog_posts\",\n  \"version\": 1,\n  \"input\": {\n    \"tag\": \"tumblr premium\",\n    \"blog\": \"staff\",\n    \"max_results\": 20\n  },\n  \"response\": {\n    \"format\": \"json\"\n  }\n}")
request = urllib.request.Request(
    "https://api.fous.com/v1/query",
    data=json.dumps(body).encode("utf-8"),
    headers={
        "Authorization": f"Bearer {api_key}",
        "Content-Type": "application/json",
    },
    method="POST",
)
try:
    with urllib.request.urlopen(request, timeout=120) as response:
        result = json.load(response)
except urllib.error.HTTPError as error:
    raise RuntimeError(f"HTTP {error.code}: {error.read().decode('utf-8', errors='replace')}") from error
if result.get("success") is False:
    raise RuntimeError(result.get("error", {}).get("message", "Request failed"))
print(json.dumps(result["data"]["output"], indent=2))
```

```typescript
// Save as fous.mts and run with npx tsx fous.mts.
// First set your key: export FOUS_API_KEY='YOUR_FOUS_API_KEY'
const apiKey = process.env.FOUS_API_KEY;
if (!apiKey) throw new Error("Set FOUS_API_KEY before running this example");

const response = await fetch("https://api.fous.com/v1/query", {
  method: "POST",
  headers: {
    "Authorization": `Bearer ${apiKey}`,
    "Content-Type": "application/json",
  },
  signal: AbortSignal.timeout(120_000),
  body: JSON.stringify({
  "api": "@tumblr",
  "visibility": "public",
  "operation": "list_blog_posts",
  "version": 1,
  "input": {
    "tag": "tumblr premium",
    "blog": "staff",
    "max_results": 20
  },
  "response": {
    "format": "json"
  }
}),
});
type ApiResult = { success: boolean; data?: { output: unknown }; error?: { message: string } };
const result: ApiResult = await response.json();
if (!response.ok || result.success === false) {
  throw new Error(result.error?.message ?? `HTTP ${response.status}`);
}
if (!result.data) throw new Error("Missing API response data");
console.log(result.data.output);
```

Or describe the data in plain language: send `{"api":"@tumblr","prompt":"Describe the data you need, with every detail"}` to the same URL. Fous fills in the input, runs the method that fits and returns only the fields you asked for; `data.route.calls[].request` is the exact call it made. Routing is free; the run costs the same.

## Use cases

- Review recent posts from a public blog
- Find public posts tagged with a specific topic
- Track post types and reblogs
- Collect post links and image links
- Compare posting times and note counts

## FAQ

### Is Fous affiliated with Tumblr?

No. Fous is not affiliated with Tumblr. This workflow reads the public tumblr.com website and returns its data.

### How much does it cost?

Each run costs 1 credit. With pay-as-you-go, a credit costs 1¢; monthly plans cost less per credit.

### Do I need a Tumblr account?

No. You only need a Fous account.

### How current is the data?

Fous gets the data from tumblr.com when you run it; repeating the same request within a day may return the saved result. Fous checks this workflow automatically; it last passed a check on Sep 29, 2026.

### What recent posts did a public Tumblr blog publish?

List blog posts returns recent public posts when given a blog name or link.

### Which posts use a particular tag?

List blog posts can filter a blog’s public posts by an optional tag.

### When were posts published, and how many notes do they have?

List blog posts returns each post’s posting time in UTC and note count.

## Related

- [Mastodon API](https://fous.com/workflows/mastodon.md): Mastodon provides public profiles and recent public posts, including hashtag posts, but excludes private and unlisted posts and may limit visibility to accounts known to mastodon.social or a selected server.
- [Threads API](https://fous.com/workflows/threads.md): Threads provides public profiles and posts, including recent posts, engagement and replies; private or login-only content is excluded, and replies may be limited to 10.
- [Instagram API](https://fous.com/workflows/instagram.md): Instagram provides public photos, videos, profiles, exact headline counts, bio links, and profile pictures, plus recent public posts and reels; some profiles or posts require login, and view counts may be unavailable.
- [Telegram API](https://fous.com/workflows/telegram.md): Telegram provides public channel details and the latest posts visible in public previews, with media and view totals that may be rounded or approximate.
- [Substack API](https://fous.com/workflows/substack.md): Substack returns public newsletters and recent public post details or text; paid posts expose previews or metadata, and some custom-domain newsletters may be unavailable.
- [Reddit API](https://fous.com/workflows/reddit.md): Reddit returns searchable public posts, community feeds/details, user profiles and recent activity, posts with up to 200 comments; unavailable content limits results; Top defaults weekly.
- [Bluesky API](https://fous.com/workflows/bluesky.md): Bluesky provides public profile details and latest posts, plus searches of up to 100 matching public posts; search results may lag behind new posts.
- [Medium API](https://fous.com/workflows/medium.md): Medium returns public writer, publication, and topic articles, including newest posts and weekly popular picks, plus readable article text; member-only stories remain limited to visible previews.
- [All Social workflows](https://fous.com/workflows/category/social)
