home / skills / rawveg / skillsforge-marketplace / tumblr

tumblr skill

/tumblr

npx playbooks add skill rawveg/skillsforge-marketplace --skill tumblr

Review the files below or copy the command above to add this skill to your agents.

Files (4)
SKILL.md
10.0 KB
---
name: tumblr
description: Tumblr API Development and Integration
---

# Tumblr API Skill

Comprehensive assistance with Tumblr API development, authentication, and integration. This skill provides practical guidance for building applications that interact with Tumblr's platform.

## When to Use This Skill

This skill should be triggered when:
- Integrating with the Tumblr API (any version)
- Implementing OAuth 1.0a or OAuth 2.0 authentication for Tumblr
- Working with Tumblr blog data, posts, likes, or followers
- Building Tumblr clients, dashboard tools, or analytics applications
- Debugging Tumblr API requests or responses
- Understanding Tumblr's Neue Post Format (NPF) or legacy post types
- Managing rate limits or API quotas
- Handling Tumblr webhooks or real-time updates

## Quick Reference

### 1. Fetch Blog Information

Retrieve basic blog metadata including title, description, and post count:

```bash
curl -H 'User-Agent: MyApp/1.0' \
  'https://api.tumblr.com/v2/blog/staff.tumblr.com/info?api_key=YOUR_API_KEY'
```

**Response includes:** Blog title, URL, post count, description, avatar, theme settings.

### 2. Get Recent Posts

Retrieve the 5 most recent posts from a blog:

```bash
curl -H 'Authorization: Bearer YOUR_ACCESS_TOKEN' \
  'https://api.tumblr.com/v2/blog/staff.tumblr.com/posts?limit=5'
```

**Query parameters:**
- `limit`: 1-20 posts per request
- `offset`: Pagination offset
- `tag`: Filter by tag
- `npf=true`: Request Neue Post Format

### 3. OAuth 2.0 Token Exchange

Exchange authorization code for access token:

```bash
curl -X POST https://api.tumblr.com/v2/oauth2/token \
  -F grant_type=authorization_code \
  -F code=YOUR_AUTH_CODE \
  -F client_id=YOUR_CONSUMER_KEY \
  -F client_secret=YOUR_CONSUMER_SECRET
```

**Scopes:** `basic`, `write`, `offline_access`

### 4. Get Blog Avatar

Fetch blog avatar image URL:

```bash
curl 'https://api.tumblr.com/v2/blog/staff.tumblr.com/avatar/128'
```

**Available sizes:** 16, 24, 30, 40, 48, 64, 96, 128, 512 (default: 64)

### 5. Retrieve Liked Posts

Get posts liked by a blog:

```bash
curl -H 'Authorization: Bearer YOUR_ACCESS_TOKEN' \
  'https://api.tumblr.com/v2/blog/staff.tumblr.com/likes?limit=20&offset=0'
```

**Parameters:** `limit`, `offset`, `before` (timestamp), `after` (timestamp)

### 6. Queue Management

Retrieve queued posts:

```bash
curl -H 'Authorization: Bearer YOUR_ACCESS_TOKEN' \
  'https://api.tumblr.com/v2/blog/myblog.tumblr.com/posts/queue'
```

Reorder queue:

```bash
curl -X POST https://api.tumblr.com/v2/blog/myblog.tumblr.com/posts/queue/reorder \
  -H 'Authorization: Bearer YOUR_ACCESS_TOKEN' \
  -d 'post_id=123456789'
```

### 7. Get Followers

Retrieve blog followers:

```bash
curl -H 'Authorization: Bearer YOUR_ACCESS_TOKEN' \
  'https://api.tumblr.com/v2/blog/myblog.tumblr.com/followers'
```

**Response includes:** Total follower count, follower blog objects with names and URLs.

### 8. Filter Posts by Tag

Retrieve posts with specific tag:

```bash
curl -H 'User-Agent: MyApp/1.0' \
  'https://api.tumblr.com/v2/blog/staff.tumblr.com/posts?api_key=YOUR_KEY&tag=photography&limit=10'
```

### 9. Standard API Response Format

All Tumblr API responses follow this structure:

```json
{
  "meta": {
    "status": 200,
    "msg": "OK"
  },
  "response": {
    "blog": { },
    "posts": [ ]
  }
}
```

### 10. Working with Blog Identifiers

Three interchangeable identifier formats:

```bash
# Blog name
/v2/blog/staff/info

# Hostname
/v2/blog/staff.tumblr.com/info

# UUID (stable, persistent)
/v2/blog/t:0aY0xL2Fi1OFJg4YxpmegQ/info
```

**Recommendation:** Use UUID for long-term stability (survives blog renames).

## Key Concepts

### Authentication Levels

1. **None** - Public endpoints (blog info, public posts) require no authentication
2. **API Key** - Use OAuth Consumer Key as `api_key` query parameter
3. **OAuth** - Signed requests using OAuth 1.0a or OAuth 2.0 for user-specific data

### Rate Limits

**Per IP Address:**
- 300 calls/minute
- 18,000 calls/hour
- 432,000 calls/day

**Per Consumer Key:**
- 1,000 calls/hour
- 5,000 calls/day

**Action Limits:**
- 250 posts/day
- 200 follows/day
- 1,000 likes/day

### Post Formats

**Legacy Post Types:**
- Text, Photo, Quote, Link, Chat, Audio, Video, Answer

**Neue Post Format (NPF):**
- Modern block-based format
- Posts with `type: blocks` or `is_blocks_post_format: true`
- Request with `npf=true` parameter
- Contains `content` (blocks), `layout` (specifications), `trail` (reblog chain)

### Post IDs

Post IDs are 64-bit integers. **Important:** Use `id_string` field for JavaScript or languages with unsafe integer handling.

### Required Headers

**User-Agent:** Mandatory for all requests. Must be consistent. Format: `AppName/Version`

**Content-Type:** Required for POST/PUT with body. Accepted:
- `application/json`
- `application/x-www-form-urlencoded`
- `multipart/form-data`

## Reference Files

This skill includes comprehensive documentation in `references/`:

- **api.md** - Complete Tumblr API documentation including:
  - All authentication methods (OAuth 1.0a, OAuth 2.0, API key)
  - Blog endpoints (info, posts, avatar, likes, following, followers)
  - User endpoints (dashboard, likes, following)
  - Post creation and management
  - Queue and draft management
  - Neue Post Format (NPF) specification
  - Legacy post type fields
  - Rate limits and best practices
  - Response format documentation

Use the `view` command to read specific reference files when detailed information is needed.

## Working with This Skill

### For Beginners

1. **Start with public endpoints** - No authentication needed:
   - Fetch blog info: `/v2/blog/{blog}/info?api_key={key}`
   - Get public posts: `/v2/blog/{blog}/posts?api_key={key}`

2. **Register your application:**
   - Visit https://www.tumblr.com/oauth/apps
   - Get OAuth Consumer Key and Secret
   - Use Consumer Key as `api_key` for public endpoints

3. **Test with API Console:**
   - https://api.tumblr.com/console
   - Interactive testing environment

### For OAuth Implementation

1. **Choose OAuth version:**
   - OAuth 2.0: Modern, simpler, bearer tokens
   - OAuth 1.0a: Legacy, more complex, signed requests

2. **OAuth 2.0 flow:**
   - Redirect user to authorization URL with scopes
   - Exchange authorization code for access token
   - Use token in `Authorization: Bearer {token}` header

3. **OAuth 1.0a flow:**
   - Request temporary credentials
   - Redirect user to authorize
   - Exchange verifier for access token
   - Sign all requests with token

### For Advanced Features

1. **Neue Post Format (NPF):**
   - Add `npf=true` to any post-returning endpoint
   - Work with content blocks and layout objects
   - Access full reblog trail

2. **Pagination:**
   - Use `offset` for numeric pagination
   - Use `before`/`after` with timestamps for chronological navigation
   - Check `_links` object for next/previous URLs

3. **Partial responses:**
   - Use `fields` parameter to specify blog object fields
   - Reduces response size and improves performance

4. **JSONP support:**
   - Add `jsonp=callbackName` to GET requests
   - Useful for client-side JavaScript

## Common Patterns

### Authentication Flow (OAuth 2.0)

```bash
# Step 1: Redirect user to authorization URL
https://www.tumblr.com/oauth2/authorize?client_id={key}&response_type=code&scope=basic%20write&state={random}

# Step 2: User authorizes, Tumblr redirects back with code
# Your redirect URL receives: ?code={auth_code}

# Step 3: Exchange code for access token
curl -X POST https://api.tumblr.com/v2/oauth2/token \
  -F grant_type=authorization_code \
  -F code={auth_code} \
  -F client_id={consumer_key} \
  -F client_secret={consumer_secret}

# Step 4: Use access token in requests
curl -H 'Authorization: Bearer {access_token}' \
  'https://api.tumblr.com/v2/user/info'
```

### Error Handling

```json
{
  "meta": {
    "status": 401,
    "msg": "Unauthorized"
  },
  "response": [ ],
  "errors": [
    {
      "title": "Unauthorized",
      "code": 401,
      "detail": "OAuth authentication required"
    }
  ]
}
```

**Common status codes:**
- 200: Success
- 401: Unauthorized (missing/invalid credentials)
- 404: Not Found (blog or post doesn't exist)
- 429: Rate Limit Exceeded
- 503: Service Temporarily Unavailable

### Handling Large Post Counts

```bash
# Fetch all posts using pagination
offset=0
limit=20

while true; do
  curl "https://api.tumblr.com/v2/blog/staff.tumblr.com/posts?api_key={key}&limit=${limit}&offset=${offset}"
  offset=$((offset + limit))
  # Check if response contains fewer than 'limit' posts, then break
done
```

## Resources

### Official Links

- **API Console:** https://api.tumblr.com/console
- **Developer Portal:** https://www.tumblr.com/docs/api/v2
- **OAuth Apps:** https://www.tumblr.com/oauth/apps
- **Support:** https://www.tumblr.com/support

### Official Clients

- JavaScript: `tumblr.js`
- Ruby: `tumblr_client`
- PHP: `tumblr/tumblr`
- Python: `pytumblr`
- Java: `jumblr`
- Objective-C: `TMTumblrSDK`
- Go: `tumblr/tumblr.go`

### Best Practices

1. **Always include User-Agent header** - Inconsistent or missing User-Agent may result in suspension
2. **Respect rate limits** - Implement exponential backoff for 429 responses
3. **Use UUIDs for blog identifiers** - More stable than blog names (survive renames)
4. **Cache blog info** - Reduce API calls by caching static blog data
5. **Use NPF for new integrations** - Legacy formats may be deprecated
6. **Handle 64-bit integers carefully** - Use `id_string` for JavaScript
7. **Validate responses** - Check `meta.status` before processing `response`

## Notes

- This skill was generated from official Tumblr API documentation
- All endpoints use base URL: `https://api.tumblr.com`
- API version is included in path: `/v2/`
- HTTPS is required for all API requests
- Reference files preserve structure and examples from source docs
- Code examples include language detection for better syntax highlighting

## Updating

To refresh this skill with updated documentation:
1. Re-run the scraper with the same configuration
2. The skill will be rebuilt with the latest information from the official GitHub repository