Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                

Tumblr API

Welcome to the Tumblr API! There isn't anything we enjoy more than seeing talented designers and engineers using Tumblr to invent whole new forms of creative expression. We've put a tremendous amount of care into making this API functional and flexible enough for any projects you throw at it. Drop a line in the GitHub Issues if you have ideas for what could be better, or want to discuss all the amazing things you're going to build with it. Follow our Engineering Blog for important news and announcements. Please use the API responsibly and read the Application Developer and API License Agreement. If you run into problems with the Tumblr API, please use our official support form to request help. Enjoy!

Tumblr also supports an API that delivers content according to the oEmbed standard. Our oEmbed API endpoint is https://www.tumblr.com/oembed, which supports post URLs in the format https://*.tumblr.com/post/*.

If you're looking for documentation for the old v1 API, you can find it here.

Table of Contents

What You Need

To get an OAuth key you must register an application.

You'll need this to get your API key, even if you don't ever need to use a fully signed OAuth request.

For more details, see Authentication below.

Console

Check out our developer API console to test calls and see live examples of using our official clients.

API Overview

Before you dive in, review these essentials.

URI Structure

All Tumblr API requests start with https://api.tumblr.com.

The next segment of the URI path depends on the type of request you want to make. For example, getting blog data or to make a post on a blog uses the /v2/blog/{blog-identifier}/... endpoint, so the full URL would be https://api.tumblr.com/v2/blog/{blog-identifier}/...

See the different Methods sections below for complete details on the available routes.

Request User Agent

The User-Agent header is required and every application is expected to use a consistent value across requests. Your application may be suspended if it uses a variety of values for the User-Agent header.

Request Content Types

Unless otherwise noted, Tumblr API endpoints that accept body parameters expect the body parameters to be encoded using one of the following content types:

  • application/json
  • application/x-www-form-urlencoded
  • multipart/form-data

Note that the Content-Type header must be set accordingly, and the absence of a Content-Type header may result in unexpected behavior.

Post Identifiers

Please note that Tumblr's Post IDs are 64-bit integers. Some languages, like Javascript, don't handle 64-bit numbers very well. With that in mind, there is also an id_string field available so you can handle these safely.

Blog Identifiers

Each blog has a few different unique identifiers that can be used to reference that specific blog in the API payload. They are interchangeable and can be used in any place that {blog-identifier} appears in these API docs. The three types of blog identifiers are:

  • Blog name: The name of the blog that appears in the URL. Examples:
    • staff for https://staff.tumblr.com/
    • changes for https://www.tumblr.com/changes or https://www.tumblr.com/@changes
  • Hostname: The hostname that's used to access the blog, excluding www.tumblr.com. Examples:
    • staff.tumblr.com for https://staff.tumblr.com/
    • changes.tumblr.com for https://www.tumblr.com/changes (not www.tumblr.com)
    • www.davidslog.com for https://www.davidslog.com/
  • Universally unique identifier: The UUID of the blog retrieved from the API. Examples:
    • t:0aY0xL2Fi1OFJg4YxpmegQ for staff, staff.tumblr.com, and even t:0aY0xL2Fi1OFJg4YxpmegQ
    • t:WX5xItRbCiJH_GJDsIdhAQ for changes, changes.tumblr.com, and even t:WX5xItRbCiJH_GJDsIdhAQ

Blog Unique Hostnames

Each blog has a unique hostname which can be used as its identifier. The hostname can be standard or custom.

  • Standard hostname: the blog short name + .tumblr.com. Example: greentype.tumblr.com
  • Custom hostname: these can be anything at all, as determined by a DNS CNAME entry. Example: www.davidslog.com

Blog Unique Identifiers

Each blog also has a unique identifier that you can retrieve from any API response that includes a blog, in the uuid field (example: t:0aY0xL2Fi1OFJg4YxpmegQ). The {blog-identifier} placeholder can also be replaced by this unique identifier.

The benefits of using a unique identifier instead of a blog name or hostname are that the unique identifier will not change if the blog name or custom domain changes. It can be used as a stable, persistent identifier for a blog.

However, note that under exceptional circumstances, a unique identifier can change. Your own blog's unique identifier will only be changed with your knowing.

Response Format

Unless otherwise noted, the API returns JSON-encoded objects (Content-Type: application/json) and every response body includes these standard properties:

FieldNotes
metaThe meta object matches the HTTP response message
responseEndpoint-specific results

The meta object should always contain:

FieldNotes
statusThe 3-digit HTTP Status-Code (e.g., 200)
msgThe HTTP Reason-Phrase (e.g., OK)

Even 4xx/5xx responses such as 400 Bad Request or 500 Internal Server Error should include this information, and the response may include more information about why you received the 4xx response.

Example

{
   "meta": {
      "status": 200,
      "msg": "OK"
   },
   "response": { ... }
}

All requests made with HTTP GET are JSONP enabled. To use JSONP, append jsonp= or callback= and the name of your callback function to the request. JSONP requests will always return an HTTP status code of 200 but will reflect the real status code in the meta field of the JSON response.

Rate Limits

Usage of the Tumblr API is rate limited in a few ways, but we respond with a 429 Limit Exceeded response whenever a consumer hits one of these limits. There is a global rate limit for all usage of the API per consumer, as well as a few per-feature rate limits, such as how many posts you can make per day. The error message or headers you receive with the 429 Limit Exceeded response should indicate what limit you've hit.

These rate limits include:

  • 300 API calls per minute, per IP address.
  • 18,000 API calls per hour, per IP address.
  • 432,000 API calls per day, per IP address.
  • 1,000 API calls per hour, per consumer key.
  • 5,000 API calls per day, per consumer key.
  • 250 new published posts (including reblogs) per day, per user.
  • 250 images uploaded per day, per user.
  • 200 follows per day, per user.
  • 1,000 likes per day, per user.
  • 10 new blogs per day, per user.
  • 20 videos uploaded per day, per user.
  • 60 minutes of total video uploaded per day, per user.

Note that these rate limits are based on the Tumblr servers' internal clocks and that the daily limits are per calendar day.

There are also overall limits to a few specific actions, including:

  • A blog can only follow 5,000 other blogs at a time.
  • A blog can only have 1,000 queued posts at a time.
  • You can only filter up to 1,000 tags at a time.

Reporting Issues

If you run into problems with the Tumblr API, please use our official support form to request help.

About the API Documentation

These docs include some working examples. Please click them to your heart's content, but don't use the embedded API key for your own nefarious purposes. Register your application to get your own API key (your OAuth Consumer Key).

URI Conventions

NotationMeaningExample
Curly brackets { }Required itemapi.tumblr.com/v2/blog/{blog-identifier}/posts (the blog identifier is required)
Square brackets [ ]Optional itemapi.tumblr.com/v2/blog/{blog-identifier}/posts[/type] (specifying the type is optional)

Official Tumblr API Client Libraries

Here is a list of official API client which will help you get up and running with your favorite language in no time.

Authentication

The API uses three different levels of authentication, depending on the method.

  • None: No authentication. Anybody can query the method.
  • API key: Requires an API key. Use your OAuth Consumer Key as your api_key.
  • OAuth: Requires a signed request that meets the OAuth 1.0a Protocol.

Each method description below includes a note about the authentication level.

OAuth1 Authorization

The API supports the OAuth 1.0a Protocol, accepting parameters via the Authorization header, with the HMAC-SHA1 signature method only.

Temporary Credentials Endpoint

This route is used to create a temporary oauth1 token to be used for oauth1 authorization. See https://tools.ietf.org/html/rfc5849#section-2.1 for further information.

Method

URIHTTP MethodAuthentication
https://www.tumblr.com/oauth/request_tokenPOSTOAuth (client credentials)

Request Parameters

None.

Response

Returns 200 OK or an error code. The response body parameters are url encoded (Content-Type: application/x-www-form-urlencoded), and the standard response properties are omitted.

Response FieldTypeDescription
oauth_tokenStringThe access token to use during the authorization process
oauth_token_secretStringThe access token secret to use during the authorization process
oauth_callback_confirmedStringIndicates whether the protocol is OAuth 1.0a

Resource Owner Authorization Endpoint

After retrieving temporary credentials, redirect the user to this endpoint so they can authorize your app. See https://tools.ietf.org/html/rfc5849#section-2.2 for further information.

Method

URIHTTP MethodAuthentication
https://www.tumblr.com/oauth/authorizeGETNone

Request Parameters

Include these parameters in the query string when you redirect the user.

ParameterTypeDescriptionDefaultRequired?
oauth_tokenStringThe temporary access token from the temporary credentials requestN/AYes
sourceStringAn optional identifier that indicates where the process startedN/ANo

Response

Upon successful authorization, the user is redirected to your callback url with the following parameters in the query string:

  • oauth_token - The access token retrieved from the temporary credentials request
  • oauth_verifier - The token required to retrieve an access token
  • source - The optional identifier that indicates where the process started

Access Token Endpoint

The endpoint that is used to exchange an oauth_verifier token for an access token and secret for the user. See https://tools.ietf.org/html/rfc5849#section-2.3 for further information.

Method

URIHTTP MethodAuthentication
https://www.tumblr.com/oauth/access_tokenGETOAuth (temporary credentials)

Request Parameters

ParameterTypeDescriptionDefaultRequired?
oauth_verifierStringThe token from the authorize redirect query stringN/AYes

Response

Returns 200 OK or an error code. The response body parameters are url encoded (Content-Type: application/x-www-form-urlencoded), and the standard response properties are omitted.

Response FieldTypeDescription
oauth_tokenStringThe user's access token
oauth_token_secretStringThe user's access token secret

OAuth2 Authorization

The API supports the OAuth 2.0 Protocol, accepting a bearer token via the Authorization header like so:

Authorization: Bearer {access_token}

API clients have access to Authorization Code, Client Credentials, and Refresh Token grants. Available scopes include basic, write, and offline_access. Note that you must specify a valid OAuth2 redirect URL for OAuth2 to be available to your application. You can find this field by editing one of your applications.

The OAuth2 Authorization flow

Step One: Redirect a user to Tumblr

Redirect the user to Tumblr's OAuth2 authorization endpoint. This will prompt the user to allow your application to access the Tumblr API on their behalf.

Step Two: Handle the callback request

Once a user decides to allow or disallow your application access to their account, Tumblr will redirect them to the OAuth2 redirect URL that you set when creating your application. If there was an error processing the request, the URL will contain an error query parameter. If the request was successful, the URL will contain code and state query parameters. You must verify the state value has the same value that you included when you redirected the user to Tumblr's OAuth2 authorization endpoint, and the code value can be used to retrieve an access token for the user.

Step Three: Retrieve an access token

Use your applications credentials and the code from the previous step to issue a request to Tumblr's OAuth2 access token endpoint. For example, using the curl command line tool:

curl -F grant_type=authorization_code -F code={code} -F client_id={Your OAuth consumer key} -F client_secret={Your OAuth secret key} https://api.tumblr.com/v2/oauth2/token

If you provided a redirect URI in the initial authorization request, you must provide the same redirect URI in the token request (as redirect_uri).

A successful request will yield a response that contains the following object:

{
    "access_token": "{access_token}",
    "expires_in": 2520,
    "id_token": false,
    "refresh_token": "{refresh_token}",
    "scope": "write offline_access",
    "token_type": "bearer"
}

Special tip: jq is a handy tool for formatting JSON on the command line, you can pipe the output of curl through jq to easily format the API response, like so:

curl -F ... https://api.tumblr.com/v2/oauth2/token | jq

You'll need to store this information somewhere so you can issue requests on behalf of the user, and so you can refresh the access token when it has expired.

Step Four: Make your API requests

Using the access_token, you can now talk directly to the Tumblr API. For example, this curl request will retrieve the user's account information:

curl -H 'Authorization: Bearer {access_token}' https://api.tumblr.com/v2/user/info

Step Five: Refresh an access token

Your application can use the expires_in property in the access token response to determine if the user's access token has expired. If it has, you can use the refresh token to retrieve a new access token and refresh token. For example, using curl again:

curl -F grant_type=refresh_token -F refresh_token={refresh_token} -F client_id={Your OAuth consumer key} -F client_secret={Your OAuth consumer secret} https://api.tumblr.com/v2/oauth2/token

/oauth2/authorize - Authorization Request

This request is used to request permission from a user to gain access to their account. Once a user grants your application access, they will be returned to your OAuth2 redirect Url as defined on your OAuth Application.

Method

URIHTTP MethodAuthentication
www.tumblr.com/oauth2/authorizeGETN/A

Request Parameters

ParameterTypeDescriptionDefaultRequired?
client_idStringYour OAuth consumer keyn/aYes
response_typeStringAlways coden/aYes
scopeStringA space delimited list of scopesn/aYes
stateStringA unique value used to maintain staten/aYes
redirect_uriStringA redirect URIn/aMaybe, see note below

A redirect URI must be supplied when multiple redirect URIs are registered.

/v2/oauth2/token - Authorization Code Grant Request

This request allows you to exchange an authorization code for an access token.

Method

URIHTTP MethodAuthentication
api.tumblr.com/v2/oauth2/tokenPOSTN/A

Request Parameters

ParameterTypeDescriptionDefaultRequired?
grant_typeStringAlways authorization_coden/aYes
codeStringThe code recieved at your OAuth2 redirect Urln/aYes
client_idStringYour OAuth consumer keyn/aYes
client_secretStringYour OAuth consumer secretn/aYes
redirect_uriStringA redirect URI (if it was included in the authorization request)n/aNo

Response

  • 200 Operation was successful
  • 401 Unauthorized
Response FieldTypeDescription
access_tokenStringThe OAuth2 access token
expires_inIntThe access token TTL in seconds
token_typeStringThe type of the access token
scopeStringThe OAuth2 access token scopes
refresh_tokenStringAn OAuth2 refresh token (if offline_access scope was requested)

/v2/oauth2/token - Refresh Token Grant Request

This request is used to exchange an OAuth2 refresh token for a new OAuth2 access token and refresh token.

Method

URIHTTP MethodAuthentication
api.tumblr.com/v2/oauth2/tokenPOSTOAuth2

Request Parameters

ParameterTypeDescriptionDefaultRequired?
grant_typeStringAlways a string refresh_tokenn/aYes
client_idStringYour OAuth consumer keyn/aYes
client_secretStringYour OAuth consumer secretn/aYes
refresh_tokenStringAn OAuth2 refresh tokenn/aYes

Example:

{
    "grant_type": "refresh_token",
    "client_id": "...",
    "refresh_token": "{refresh_token goes here}"
}

Response

  • 200 Operation was successful
  • 401 Unauthorized, refresh token has expired
Response FieldTypeDescription
access_tokenStringThe OAuth2 access token
expires_inIntThe access token TTL in seconds
token_typeStringThe type of the access token
scopeStringThe OAuth2 access token scopes
refresh_tokenStringAn OAuth2 refresh token

/v2/oauth2/exchange - OAuth1 to OAuth2 Token Exchange

This route is used to exchange an OAuth1 access token for an OAuth2 access token and refresh token. Clients must expect the OAuth1 token to be invalidated if the exchange is successful.

Method

URIHTTP MethodAuthentication
api.tumblr.com/v2/oauth2/exchangePOSTOAuth1

Request Parameters

None.

Response

  • 200 Operation was successful
  • 400 Incorrect authorization type (requests must use OAuth1)
  • 401 Authentication failed
Response FieldTypeDescription
access_tokenStringThe OAuth2 access token
expires_inIntThe access token TTL in seconds
token_typeStringThe type of the access token
scopeStringThe OAuth2 access token scopes (always basic write)
refresh_tokenStringAn OAuth2 refresh token

Common Response Elements

Beyond the overall response format described above, there are some elements that are common throughout the API responses.

Links

Links describe an in-app or navigation behavior. A response may contain one or more of these contained under the _links response object key.

An object in the _links hash will always contain type and href keys.

A _links object may be of type navigation or action.

  • navigation: A reference to some external URI to which the user can go.
  • action: A reference to some internal client state change in the application. The most common example would be to open a different view.

A navigation link will only contain a href to which the user should be directed. An action type link will contain details on what request method as well as what query or body parameters should be used to take the action.

Example:

{
   "meta": {
      "status": 200,
      "msg": "OK"
   },
   "response": {
      "_links": {
         "previous": {
            "type": "action",
            "method": "GET",
            "href": "https://api.tumblr.com/v2/endpoint",
            "query_params": {
               "page": 1,
            }
         },
         "next": {
            "type": "action",
            "method": "GET",
            "href": "https://api.tumblr.com/v2/endpoint",
            "query_params": {
               "page": 3,
            }
         },
         "terms_of_service": {
            "type": "navigation",
            "href": "https://www.tumblr.com/policy/terms-of-service",
         },
         ...
      }
   }
}

Tag Objects

A tag object represents a tag, and could have these fields:

Response FieldTypeDescription
tagStringThe tag name
thumb_urlStringReturns an image (75x75) associated with the tag; may be null
is_trackedBooleanIndicates whether the requesting user is tracking this tag
featuredBooleanIndicates whether the tag is a featured tag

Neue Post Format objects

Some routes will return Posts that have type: blocks and/or is_blocks_post_format: true, which means their content is available in the Neue Post Format. See the NPF specification docs for more info!

Also, when making any request to our API that returns Posts, you may supply a npf=true query parameter to specify that you'd like all of the Posts' content returned in the Neue Post Format rather than the legacy format.

Blog Methods

/info - Retrieve Blog Info

This method returns general information about the blog, such as the title, number of posts, and other high-level data.

Examples

  • https://api.tumblr.com/v2/blog/scipsy.tumblr.com/info
  • https://api.tumblr.com/v2/blog/good.tumblr.com/info

Method

URIHTTP MethodAuthentication
api.tumblr.com/v2/blog/{blog-identifier}/info?api_key={key}GETAPI Key

Request Path Parameters

ParameterTypeDescriptionDefaultRequired?
blog-identifierStringAny blog identifier. See the Blog Identifiers section for more details.N/AYes

Query Parameters

ParameterTypeDescriptionDefaultRequired?
api_keyStringYour OAuth Consumer Key. See Authentication for more details.N/AYes
fieldsObjectSee next section: "Partial Responses".N/ANo

Partial Responses

Note that blog objects via the Tumblr API support "partial responses", which allows the request to specify which fields are returned any time a blog object is present by using the fields query parameter.

For example, if you would like to always only see the name and updated fields in blog objects:

https://api.tumblr.com/v2/blog/david/info?fields[blogs]=name,updated

That will return only the name and updated fields in the blog object. You can use this in any API request that includes blog objects, not just this blog info endpoint. Some fields are also "optional", and are preceded in the list by a ? (encoded to %3F).

Those optional fields are only available upon request, such as:

Response FieldTypeDescription
is_following_youBooleanWhether or not the blog is following your primary blog
duration_blog_following_youIntegerHow long (in seconds) that blog has been following your primary blog (-1 if they aren't)
duration_following_blogIntegerHow long (in seconds) you've been following that blog (-1 if you aren't)
timezoneStringThe blog's configured timezone, such as "US/Eastern". Only viewable by blog member.
timezone_offsetStringThe blog's configured timezone as a GMT offset such as "GMT+0800". Only viewable by blog member.

To access these, specify them in the fields[blogs] query parameter list, like so:

https://api.tumblr.com/v2/blog/david/info?fields[blogs]=name,updated,%3Fis_following_you,%3Fduration_following_blog

Which will return a response like:

{
    "meta": {
        "status": 200,
        "msg": "OK"
    },
    "response": {
        "blog": {
            "name": "david",
            "updated": 1591035760,
            "is_following_you": false,
            "duration_following_blog": 123456
        }
    }
}

Omitting the fields query parameter will return the default set of fields below.

Response

Note: Field ordering below may differ from actual response. Also, any fields present that aren't included here are not officially supported for third-party use.

Response FieldTypeDescription
titleStringThe display title of the blog
postsNumberThe total number of posts to this blog
nameStringThe short blog name that appears before tumblr.com in a standard blog hostname
updatedNumberThe time of the most recent post, in seconds since the epoch
descriptionStringYou guessed it! The blog's description
askBooleanIndicates whether the blog allows questions
ask_anonBooleanIndicates whether the blog allows anonymous questions; returned only if ask is true
followedBooleanWhether you're following the blog, returned only if this request has an authenticated user
likesNumberNumber of likes for this user, returned only if this is the user's primary blog and sharing of likes is enabled
is_blocked_from_primaryBooleanIndicates whether this blog has been blocked by the calling user's primary blog; returned only if there is an authenticated user making this call
avatarArrayAn array of avatar objects, each a different size, which should each have a width, height, and URL.
urlStringThe blog's url
themeObjectThe blog's general theme options, which may not be useful if the blog uses a custom theme. See next table.

Specific fields inside of the theme object and what they mean:

FieldTypeDescription
avatar_shapeString"circle" or "square", this is the shape of the mask over the user's avatar.
background_colorStringThe intended hex color used for the blog's background color.
body_fontStringThe font that the blog has selected as their "body" font.
header_boundsMixedIf the blog's header should be cropped, this is a comma-separated list of top/right/bottom/left coordinates to use.
header_imageStringThe URL of the blog's original, full header image. Note that this may be a default Tumblr header image.
header_image_npfObjectNPF image block format of the blog's header image. It will include one or more image sizes to choose from, in order from largest to smallest.
header_image_focusedStringIf the blog cropped/repositioned their header image, this will be that version, which should be preferred over the original.
header_image_posterStringThe URL of a single-frame "poster" version of the blog's header image, if it's an animated image. Note that this may be an empty string if no poster could be made or is not needed.
header_image_scaledStringIf the blog only scaled their header image, this will be that scaled version. Note that this may be a default Tumblr header image in the case that they scaled and repositioned it, in which case, use the _focused version.
header_stretchBooleanWhether or not the blog's header is meant to be stretched to aspect-fill any given space where it's used.
link_colorStringThe intended hex color of any links in the blog's description.
show_avatarBooleanWhether or not the blog's avatar should be displayed, even if it's given in the API payload.
show_descriptionBooleanWhether or not the blog's description should be displayed, even if it's given in the API payload.
show_header_imageBooleanWhether or not the blog's header image should be displayed, even if it's given in the API payload.
show_titleBooleanWhether or not the blog's title should be displayed, even if it's given in the API payload.
title_colorStringThe intended hex color of the blog's title.
title_fontStringThe intended font to use when displaying the blog's title.
title_font_weightStringThe intended font weight to use when displaying the blog's title.

Example

https://api.tumblr.com/v2/blog/david.tumblr.com/info?api_key={key}

{
   "meta": {
      "status": 200,
      "msg": "OK"
   },
   "response": {
      "blog": {
         "title": "David's Log",
         "posts": 3456,
         "name": "david",
         "url": "https:\/\/david.tumblr.com\/",
         "updated": 1308953007,
         "description": "<p><strong>Mr. Karp<\/strong> is tall and skinny, with
            unflinching blue eyes a mop of brown hair.\r\n
            He speaks incredibly fast and in complete paragraphs.</p>",
         "ask": true,
         "ask_anon": false,
         "likes": 12345
      }
   }
}

/avatar — Retrieve a Blog Avatar

You can get a blog's avatar in 9 different sizes. The default size is 64x64.

Examples

  • https://api.tumblr.com/v2/blog/david.tumblr.com/avatar/512
  • https://api.tumblr.com/v2/blog/david.tumblr.com/avatar

Method

URIHTTP MethodAuthentication
api.tumblr.com/v2/blog/{blog-identifier}/avatar[/size]GETNone

Request Path Parameters

ParameterTypeDescriptionDefaultRequired?
blog-identifierStringAny blog identifier. See the Blog Identifiers section for more details.N/AYes
sizeNumberThe size of the avatar (square, one value for both length and width). Must be one of the values: 16, 24, 30, 40, 48, 64, 96, 128, 51264No

Response

Requests that are not signed using OAuth1 will receive the requested avatar in PNG format, while requests that are signed will receive a response of the following form:

Response FieldTypeDescriptionNotes
avatar_urlStringThe URL of the avatar image. This is also returned in the Location HTTP header field (see note).An HTTP Location header field is returned — the response points to the avatar image. That means you can embed this method in an img tag in HTML.

/blocks – Retrieve Blog's Blocks

Get the blogs that the requested blog is currently blocking. The requesting user must be an admin of the blog to retrieve this list.

Note that this endpoint is rate limited to 60 requests per minute.

Method

URIHTTP MethodAuthentication
api.tumblr.com/v2/blog/{blog-identifier}/blocksGETOAuth

Request Path Parameters

ParameterTypeDescriptionDefaultRequired?
blog-identifierStringAny blog identifier. See the Blog Identifiers section for more details.N/AYes

Query Parameters

ParameterTypeDescriptionDefaultRequired?
offsetNumberBlock number to start at0No
limitNumberThe number of blocks to retrieve, 1-20, inclusive20No

Response

Returns 200 OK or an error code.

Response FieldTypeDescriptionNotes
blocked_tumblelogsArrayBlog objects that are blocked.
_linksObjectA standard _links object with pagination objects.

Example response:

{
   "meta": {
      "status": 200,
      "msg": "OK"
   },
   "response": {
      "blocked_tumblelogs": [
         {
            "name": "joe",
            "url": "http:\/\/www.spammyjoe.com",
            "updated": 1308797076,
            "title": "Spammy Joe",
            "description": "Posting things you don't really care for"
         },
         {
            "name": "harry",
            "url": "harryblog19.tumblr.com",
            "updated": 1808841333,
            "title": "The 19th Harry Blog",
            "description": ""
         },
         ...
      ],
      "_links": {
         "next": {
            "href": "/v2/blog/andysblog.tumblr.com/blocks?offset=20",
            "method": "GET",
            "query_params": {
               "offset": 20
            }
         }
      }
   }
}

/blocks – Block a Blog

Note that this endpoint is rate limited to 60 requests per minute.

Method

URIHTTP MethodAuthentication
api.tumblr.com/v2/blog/{blog-identifier}/blocksPOSTOAuth

Request Path Parameters

ParameterTypeDescriptionDefaultRequired?
blog-identifierStringAny blog identifier. See the Blog Identifiers section for more details.N/AYes

Request Parameters

ParameterTypeDescriptionDefaultRequired?
blocked_tumblelogStringThe tumblelog to block, specified by any blog identifierN/AOnly if post_id isn't passed
post_idStringThe anonymous post ID (asks, submissions) to blockN/AOnly if blocked_tumblelog isn't passed

Response

Returns 201 Created or an error code.

/blocks/bulk – Block a list of Blogs

Note that this endpoint is rate limited to 60 requests per minute.

Method

URIHTTP MethodAuthentication
api.tumblr.com/v2/blog/{blog-identifier}/blocks/bulkPOSTOAuth

Request Path Parameters

ParameterTypeDescriptionDefaultRequired?
blog-identifierStringAny blog identifier. See the Blog Identifiers section for more details.N/AYes

Request Parameters

ParameterTypeDescriptionDefaultRequired?
blocked_tumblelogsStringComma-separated list of tumblelogs to block, specified by any blog identifierN/AYes
forceBoolWhether to force the block to go through even if it requires canceling a Post+ SubscriptionfalseNo

Response

Returns 200 OK or an error code.

/blocks – Remove a Block

Note that this endpoint is rate limited to 60 requests per minute.

Method

URIHTTP MethodAuthentication
api.tumblr.com/v2/blog/{blog-identifier}/blocksDELETEOAuth

Request Path Parameters

ParameterTypeDescriptionDefaultRequired?
blog-identifierStringAny blog identifier. See the Blog Identifiers section for more details.N/AYes

Request Parameters

ParameterTypeDescriptionDefaultRequired?
blocked_tumblelogStringThe tumblelog whose block to remove, specified by any blog identifierN/AOnly if anonymous_only isn't passed
anonymous_onlyBooleanWhen passed without the blocked_tumblelog parameter, this will clear all anonymous IP blocksN/AOnly if blocked_tumblelog isn't passed
  • If you pass both params, anonymous_only is going to be ignored.
  • Passing just anonymous_only=false is the equivalent of no params. A 404 response will be returned.

Response

Returns 200 OK if the block on the passed blocked_tumblelog parameter was successfully removed.

Returns 200 OK if all anonymous blocks were successfully removed when anonymous_only=true was passed without a blocked_tumblelog parameter in the path.

/likes — Retrieve Blog's Likes

This method can be used to retrieve the publicly exposed likes from a blog.

Method

URIHTTP MethodAuthentication
api.tumblr.com/v2/blog/{blog-identifier}/likes?api_key={key}GETAPI Key

Request Path Parameters

ParameterTypeDescriptionDefaultRequired?
blog-identifierStringAny blog identifier. See the Blog Identifiers section for more details.N/AYes

Query Parameters

ParameterTypeDescriptionDefaultRequired?
limitNumberThe number of results to return: 1–20, inclusive20No
offsetNumberLiked post number to start at0 (first post)No
beforeIntegerRetrieve posts liked before the specified timestampNoneNo
afterIntegerRetrieve posts liked after the specified timestampNoneNo

Notes

  • You can only provide either before, after, or offset. If you provide more than one of these options together you will get an error.
  • You can still use limit with any of those three options to limit your result set.
  • When using the offset parameter the maximum limit on the offset is 1000. If you would like to get more results than that use either before or after.

Response

Response FieldTypeDescriptionNotes
liked_postsArrayAn array of post objects (posts liked by the user)
liked_countNumberTotal number of liked posts

/following — Retrieve Blog's following

This method can be used to retrieve the publicly exposed list of blogs that a blog follows, in order from most recently-followed to first.

Method

URIHTTP MethodAuthentication
api.tumblr.com/v2/blog/{blog-identifier}/followingGETOAuth

Request Path Parameters

ParameterTypeDescriptionDefaultRequired?
blog-identifierStringAny blog identifier. See the Blog Identifiers section for more details.N/AYes

Query Parameters

ParameterTypeDescriptionDefaultRequired?
limitNumberThe number of results to return: 1–20, inclusive20No
offsetNumberFollowed blog index to start at0 (most-recently followed)No

Response

Response FieldTypeDescription
blogsArrayAn array of short blog infos that this blog follows, in order from most recently-followed to first.
total_blogsNumberTotal number of followed blogs

/followers — Retrieve a Blog's Followers

Method

URIHTTP MethodAuthentication
api.tumblr.com/v2/blog/{blog-identifier}/followersGETOAuth

Request Path Parameters

ParameterTypeDescriptionDefaultRequired?
blog-identifierStringAny blog identifier. See the Blog Identifiers section for more details.N/AYes

Query Parameters

ParameterTypeDescriptionDefaultRequired?
limitNumberThe number of results to return: 1–20, inclusive20No
offsetNumberResult to start at0 (first follower)No

Response

These fields are wrapped in a users object:

Response FieldTypeDescription
total_usersNumberThe number of users currently following the blog
usersArrayEach item is a follower, containing these fields:
nameStringThe user's name on tumblr
followingBooleanWhether the caller is following the user
urlStringThe URL of the user's primary blog
updatedNumberThe time of the user's most recent post, in seconds since the epoch

Example

{
   "meta": {
      "status": 200,
      "msg": "OK"
   },
   "response": {
      "total_users": 2684,
      "users":  [
            {
               "name": "david",
               "following": true,
               "url": "https:\/\/www.davidslog.com",
               "updated": 1308781073
            },
            {
               "name": "ben",
               "following": true,
               "url": "http:\/\/bengold.tv",
               "updated": 1308841333
            },
            ...
         ]
   }
}

/followed_by — Check If Followed By Blog

This method can be used to check if one of your blogs is followed by another blog.

Method

URIHTTP MethodAuthentication
api.tumblr.com/v2/blog/{blog-identifier}/followed_byGETOAuth

Request Path Parameters

ParameterTypeDescriptionDefaultRequired?
blog-identifierStringAny blog identifier. See the Blog Identifiers section for more details.N/AYes

Query Parameters

ParameterTypeDescriptionRequired?
querystringThe name of the blog that may be following your blogYes

Example usage:

GET https://api.tumblr.com/v2/blog/YOUR-BLOG.tumblr.com/followed_by?query=staff

Response

Response FieldTypeDescription
followed_byBooleanTrue when the queried blog follows your blog, false otherwise.

/posts – Retrieve Published Posts

Examples

  • https://api.tumblr.com/v2/blog/peacecorps.tumblr.com/posts/text?notes_info=true
  • https://api.tumblr.com/v2/blog/pitchersandpoets.tumblr.com/posts/photo?tag=new+york+yankees
  • https://api.tumblr.com/v2/blog/staff.tumblr.com/posts?before=1496289599

Method

URIHTTP MethodAuthentication
api.tumblr.com/v2/blog/{blog-identifier}/posts[/type]?api_key={key}&[optional-params=]GETAPI Key

Request Path Parameters

ParameterTypeDescriptionDefaultRequired?
blog-identifierStringAny blog identifier. See the Blog Identifiers section for more details.N/AYes

Query Parameters

ParameterTypeDescriptionDefaultRequired?
api_keyStringYour OAuth Consumer Key See Authentication for more details.N/AYes
typeStringThe type of post to return. Specify one of the following: text, quote, link, answer, video, audio, photo, chatNone – return all typesNo
idNumberA specific post ID. Returns the single post specified or (if not found) a 404 error.NoneNo
tagString or ArrayLimits the response to posts with the specified tag(s), see note belowNoneNo
limitNumberThe number of posts to return: 1–20, inclusive20No
offsetNumberPost number to start at0 (first post)No
reblog_infoBooleanIndicates whether to return reblog information (specify true or false). Returns the various reblogged_ fields.FalseNo
notes_infoBooleanIndicates whether to return notes information (specify true or false). Returns note count and note metadata.FalseNo
filterStringSpecifies the post format to return, other than HTML: text – Plain text, no HTML; raw – As entered by the user (no post-processing); if the user writes in Markdown, the Markdown will be returned rather than HTMLNone (HTML)No
beforeNumberReturns posts published before a specified Unix timestamp, in seconds.FalseNo
afterNumberReturns posts published after a specified Unix timestamp, in seconds.FalseNo
sortStringA specific sort order, "desc" for descending, "asc" for ascending."desc"No
npfBooleanReturns posts' content in NPF format instead of the legacy format.FalseNo

By default, the list of posts on a blog is in reverse-chronological order, using the user-set publish time which allows backdating. Note that you cannot use before and offset in the same request; before is best used for paginating through posts. Also, using after is best used with sort set to asc.

Note that tag can either be a string or an array of strings:

Fetch posts using this one tag:
/v2/blog/{blog-identifier}/posts?tag=something
 or fetch posts using all of these tags:
/v2/blog/{blog-identifier}/posts?tag[0]=something&tag[1]=example

When given an array of tags, posts will be returned that have all of the provided tags (so in that example, posts with both "something" and "example" used on them). Also, a maximum of four tags can be provided for this use.

Response

Each response includes a blog object that is the equivalent of an /info response. Posts are returned as an array attached to the posts field.

Important note: Post content can be in two formats: legacy or Neue Post Format (NPF). By default, posts returned from this endpoint (and any other endpoint that returns posts) will be in the legacy post-type-based content formats described below. NPF-created posts from the official Tumblr mobile apps will be returned as text/regular posts to maintain backwards compatibility. Note that this "backwards compatibility" from NPF to HTML is best effort. To help transition to an NPF-only world, you can pass along the npf=true query parameter to force all posts returned here to be in Neue Post Format (also described below). Eventually, all posts will be NPF, so we strongly encourage leveraging NPF JSON via npf=true for post content when consuming posts via the API.

Fields available for all Post types:

Response FieldTypeDescriptionNotes
blog_nameStringThe short name used to uniquely identify a blog
idNumberThe post's unique ID
id_stringStringThe post's unique ID as a StringFor clients that don't support 64-bit integers
genesis_post_idStringThe post's unique "genesis" ID† as a StringOnly available to the post owner in certain circumstances
post_urlStringThe location of the post
parent_post_urlStringThe URL of the parent post, if this is a reblogOnly available if the post is a reblog
typeStringThe type of postSee the type request parameter
timestampNumberThe time of the post, in seconds since the epoch
dateStringThe GMT date and time of the post, as a string
formatStringThe post format: html or markdown
reblog_keyStringThe key used to reblog this postSee the /post/reblog method
tagsArray of stringsTags applied to the post
bookmarkletBooleanIndicates whether the post was created via the Tumblr bookmarkletExists only if true
mobileBooleanIndicates whether the post was created via mobile/email publishingExists only if true
source_urlStringThe URL for the source of the content (for quotes, reblogs, etc.)Exists only if there's a content source
source_titleStringThe title of the source siteExists only if there's a content source
likedBooleanIndicates if a user has already liked a post or notExists only if the request is fully authenticated with OAuth.
stateStringIndicates the current state of the postStates are published, queued, draft and private
is_blocks_post_formatBooleanIndicates whether the post is stored in the Neue Post Format
mutedBooleanIndicates whether push notifications and activity items are muted for this post by its author.Only available to the post owner in certain circumstances
mute_end_timestampNumberSee note below.Only available to the post owner in certain circumstances
total_postsNumberThe total number of post available for this request, useful for paginating through results

† The "genesis" ID for a post is only available and different than its current ID if that post had been drafted, queued, or scheduled, and is now published. In which case, the "genesis" ID will be the original post ID generated when drafting, queuing, or scheduling that post. You cannot use this ID to look up the post after it has been published, but it can be useful for tracking a post from its pre- to post-published state.

If muted: true and mute_end_timestamp: 0, then the post is muted forever. Otherwise, mute_end_timestamp is a unix timestamp of when the mute will end. If muted: false, then mute_end_timestamp will be 0, but doesn't matter since the post is not muted.

Fields available for posts from a community:

Response FieldTypeDescriptionNotes
communityObjectInfo about the community this post is fromSee the community info endpoint
can_reactBooleanWhether the current user can react to this post
can_moderateBooleanWhether the current user can moderate this postOnly visible for moderators, otherwise omitted
reactionsArrayThe reactions currently on this postSee the reaction object below
is_adminBooleanWhether the post author is an admin of the community
is_moderatorBooleanWhether the post author is a moderator of the community
post_authorStringThe blog name who authored the post inside the community
author_blogObjectThe blog info object for the post's author

Reactions have a specific object for each reaction in the array:

FieldTypeDescription
emojiObjectA description of the emoji reaction, with fields for our unique id, the emoji's grapheme, variants, and base_slug used to group them
countNumberHow many of this reaction have been used
previewArrayA preview of the blog names of who have used this reaction
reactedBooleanWhether the current user has reacted to this post

Neue Post Format (NPF) Posts

Posts that have type: blocks and/or is_blocks_post_format: true will have three fields for the post's content:

Response FieldTypeDescription
contentArrayThe content of the post.
layoutArrayThe layout of the post content.
trailArrayThe reblog trail items, if any.

The specification for what objects you can find in these fields is documented here.

Legacy Text Posts

Response FieldTypeDescription
titleStringThe optional title of the post
bodyStringThe full post body

Example

https://api.tumblr.com/v2/blog/citriccomics.tumblr.com/posts/text?api_key={key}

{
   "meta": {
      "status": 200,
      "msg": "OK"
   },
   "response": {
      "blog": { ... },
      "posts": [
         {
            "blog_name": "citriccomics",
            "id": 3507845453,
            "id_string": "3507845453",
            "post_url": "https:\/\/citriccomics.tumblr.com\/post\/3507845453",
            "type": "text",
            "date": "2011-02-25 20:27:00 GMT",
            "timestamp": 1298665620,
            "state": "published",
            "format": "html",
            "reblog_key": "b0baQtsl",
            "tags": [
               "tumblrize",
               "milky dog",
               "mini comic"
            ],
            "note_count": 14,
            "title": "Milky Dog",
            "body": "<p><img src=\"https:\/\/media.tumblr.com\
               /tumblr_lh6x8d7LBB1qa6gy3.jpg\"\/><a href=\"http:\/\
               /citriccomics.com\/blog\/?p=487\" target=\"_blank\">TO READ
               THE REST CLICK HERE<\/a><br\/>\n\nMilky Dog was inspired by
               something <a href=\"http:\/\/gunadie.com\/naomi\"
               target=\"_blank\">Naomi Gee<\/a> wrote on twitter, I really
               liked the hash tag <a href=\"https:\/\/twitter.com\/
               search?q=%23MILKYDOG\" target=\"_blank\">#milkydog<\/a>
               and quickly came up with a little comic about it. You can
               (and should) follow Naomi on twitter <a href=\"https:\/\
               /twitter.com\/ngun\" target=\"_blank\">@ngun<\/a> I'm on
               twitter as well <a href=\"https:\/\/twitter.com\
               /weflewairplanes\"target=\"_blank\">@weflewairplanes<\/a>
               <\/p>\n\nAlso, if you’re a Reddit user (or even if
               you're not) I submitted this there, if you could up vote
               it I'd be super grateful just <a href=\"http:\/\
               /tinyurl.com\/5wj3tqz\" target=\"_blank\">CLICK HERE<\/a>"
         },
         ...
      ],
      "total_posts": 3
   }
}

Legacy Photo Posts

Response FieldTypeDescription
captionStringThe user-supplied caption
widthNumberThe width of the photo or photoset
heightNumberThe height of the photo or photoset
photosArrayPhoto objects with properties:
captionStringuser supplied caption for the individual photo (Photosets only)
alt_sizesArrayalternate photo sizes, each with:
widthNumberwidth of the photo, in pixels
heightNumberheight of the photo, in pixels
urlStringLocation of the photo file (either a JPG, GIF, or PNG)

Multi-photo Photo posts, called Photosets, will send return multiple photo objects in the photos array.

Example

https://api.tumblr.com/v2/blog/derekg.org/posts/photo?id=7431599279&api_key={key}

{
   "meta": {
      "status": 200,
      "msg": "OK"
   },
   "response": {
      "blog": { ... },
      "posts": [
         {
            "blog_name": "derekg",
            "id": 7431599279,
            "id_string": "7431599279",
            "post_url": "https:\/\/derekg.org\/post\/7431599279",
            "type": "photo",
            "date": "2011-07-09 22:09:47 GMT",
            "timestamp": 1310249387,
            "format": "html",
            "reblog_key": "749amggU",
            "tags": [],
            "note_count": 18,
            "caption": "<p>my arm is getting tired.<\/p>",
            "photos": [
               {
                  "caption": "",
                  "alt_sizes": [
                     {
                        "width": 1280,
                        "height": 722,
                        "url": "https:\/\/derekg.org\/photo\/1280\/7431599279\/1\/
                           tumblr_lo36wbWqqq1qanqww"
                     },
                     {
                        "width": 500,
                        "height": 282,
                        "url": "https:\/\/30.media.tumblr.com\/
                           tumblr_lo36wbWqqq1qanqwwo1_500.jpg"
                     },
                     {
                        "width": 400,
                        "height": 225,
                        "url": "https:\/\/29.media.tumblr.com\/
                           tumblr_lo36wbWqqq1qanqwwo1_400.jpg"
                     },
                     {
                        "width": 250,
                        "height": 141,
                        "url": "https:\/\/26.media.tumblr.com\/
                           tumblr_lo36wbWqqq1qanqwwo1_250.jpg"
                     },
                     {
                        "width": 100,
                        "height": 56,
                        "url": "https:\/\/24.media.tumblr.com\/
                           tumblr_lo36wbWqqq1qanqwwo1_100.jpg"
                     },
                     {
                        "width": 75,
                        "height": 75,
                        "url": "https:\/\/30.media.tumblr.com\/
                           tumblr_lo36wbWqqq1qanqwwo1_75sq.jpg"
                     }
                  ]
               }
            ]
         }
      ],
      "total_posts": 1
   }
}

Legacy Quote Posts

Response FieldTypeDescriptionNotes
textStringThe text of the quote (can be modified by the user when posting)
sourceStringFull HTML for the source of the quote Example: <a href="...">Steve Jobs</a>See also the table of common response fields

Example

https://api.tumblr.com/v2/blog/museumsandstuff.tumblr.com/posts/quote?api_key={key}

{
   "meta": {
      "status": 200,
      "msg": "OK"
   },
   "response": {
      "blog": { ... },
      "posts": [
         {
            "blog_name": "museumsandstuff",
            "id": 4742980381,
            "id_string": "4742980381",
            "post_url": "https:\/\/museumsandstuff.tumblr.com\/post\/4742980381",
            "type": "quote",
            "date": "2011-04-19 08:52:34 GMT",
            "timestamp": 1303203154,
            "format": "html",
            "reblog_key": "KLA85e6c",
            "tags": [],
            "note_count": 23,
            "source_url": "http:\/\/museumtwo.blogspot.com\/2011\/04\/
               guest-post-convivial-museum-photo-essay.html",
            "source_title": "museumtwo.blogspot.com",
            "text": "Why do visitors still report discomfort, confusion,
               elitism, exclusion?",
            "source": "<a href=\"http:\/\/museumtwo.blogspot.com\/2011\/04\/
               guest-post-convivial-museum-photo-essay.html\"
               target=\"_blank\">Museum 2.0: Guest Post: The Convivial
               Museum Photo Essay<\/a> (via <a href=\"http:\/\/
               www.joshrobinson.org\/\"target=\"_blank\">joshrobinsonblog
               <\/a>)"
         },
         ...
      ],
      "total_posts": 9
   }
}

Legacy Link Posts

Response FieldTypeDescription
titleStringThe title of the page the link points to
descriptionStringA user-supplied description
urlStringThe link!
link_authorStringThe author of the article the link points to
excerptStringAn excerpt from the article the link points to
publisherStringThe publisher of the article the link points to
photosArrayPhoto objects with properties:
captionStringThe thumbnail caption
original_sizeObjectThe photo at its original size
widthNumberWidth of the image, in pixels
heightNumberHeight of the image, in pixels
urlStringLocation of the image file (either a JPG, GIF, or PNG)
alt_sizesArrayAlternate photo sizes, each with the same properties as above.

Example

https://api.tumblr.com/v2/blog/travellingcameraclub.com/posts/link?api_key={key}

{
   "meta": {
      "status": 200,
      "msg": "OK"
   },
   "response": {
      "blog": { ... },
      "posts": [
         {
            "blog_name": "travellingcameraclub",
            "id": 688472164,
            "id_string": "688472164",
            "post_url": "https:\/\/travellingcameraclub.com\/post\/688472164",
            "type": "link",
            "date": "2010-06-11 23:17:08 GMT",
            "timestamp": 1276298228,
            "format": "html",
            "reblog_key": "RWhJJWia",
            "tags": [],
            "note_count": 9,
            "title": "Esther Aarts Illustration | News and Blog: Faq: How do
               you make those marker doodles?",
            "url": "https:\/\/blog.estadiezijn.nl\/post\/
               459075181\/faq-how-do-you-make-those-marker-doodles",
            "link_author": "Ester Aarts",
            "excerpt": "How I make marker doodles",
            "publisher": "blog.estadiezijn.nl",
            "photos": [
               {
                  "caption": "",
                  "original_size":
                     {
                        "width": 500,
                        "height": 500,
                        "url": "https:\/\/40.media.tumblr.com
                        \/1393850e5c331da2e3c9fb478a30310d
                        \/tumblr_inline_nm3lwntw8k1rplry2_500.jpg"
                     },
                  "alt_sizes": []
               }
            ],
            "description": "<blockquote>\n<p>On my Ipad, of course!<\/p>
                <p>Nothing better than the latest technology to get the job done.
                Look at all my apps!<\/p> <p><img height=\"555\" width=\"500\"
                src=\"http:\/\/farm5.static.flickr.com\/4006\/
                4445161463_31da0327c2_o.jpg\" alt=\"my iPad\"\/><\/p>
                <p>My favourite markers are an Edding 400, a Sharpie and a
                Copic Ciao. The white gouache is from Dr Martins and does a
                decent job covering up whatever needs to be covered up, and
                flows.<\/p><\/blockquote>"
         }
         ...
      ],
      "total_posts": 7
   }
}

Legacy Chat Posts

Response FieldTypeDescription
titleStringThe optional title of the post
bodyStringThe full chat body
dialogueArrayArray of objects with the following properties:
nameStringName of the speaker
labelStringLabel of the speaker
phraseStringText.

Example

https://api.tumblr.com/v2/blog/www.davidslog.com/posts/chat?api_key={key}

{
   "meta": {
      "status": 200,
      "msg": "OK"
   },
   "response": {
      "blog": { ... },
      "posts": [
         {
            "blog_name": "david",
            "id": 5845345725,
            "id_string": "5845345725",
            "post_url": "https:\/\/www.davidslog.com\/5845345725\/if-youre-okay-with-it-destroying-tumblr",
            "type": "chat",
            "date": "2011-05-25 22:32:00 GMT",
            "timestamp": 1306362720,
            "format": "html",
            "reblog_key": "wlxAsElf",
            "tags": [],
            "note_count": 114,
            "title": null,
            "body": "David: https://staff.tumblr.com/post/5845153911
                [draft] Topherchris: are you freaking serious\r\n
                David: If you're okay with it - I'd love to :)\r\n
                Topherchris: i'm okay with it, if you're okay with
                it destroying tumblr",
            "dialogue": [
                {
                   "label": "David:",
                   "name": "David",
                   "phrase": "https://staff.tumblr.com/post/5845153911 [draft]\r",
                },
                {
                   "label": "Topherchris:",
                   "name": "Topherchris",
                   "phrase": "are you freaking serious\r"
                },
                {
                   "label": "David:",
                   "name": "David",
                   "phrase": "If you're okay with it - I'd love to :)"
                },
                {
                   "label": "Topherchris:",
                   "name": "Topherchris",
                   "phrase": "i'm okay with it, if you're okay with it
                      destroying tumblr",
                }
            ]
         }
         ...
      ],
      "total_posts": 7
   }
}

Legacy Audio Posts

Response FieldTypeDescription
captionStringThe user-supplied caption
playerStringHTML for embedding the audio player
playsNumberNumber of times the audio post has been played
album_artStringLocation of the audio file's ID3 album art image
artistStringThe audio file's ID3 artist value
albumStringThe audio file's ID3 album value
track_nameStringThe audio file's ID3 title value
track_numberNumberThe audio file's ID3 track value
yearNumberThe audio file's ID3 year value

Example

https://api.tumblr.com/v2/blog/derekg.org/posts?id=5578378101&api_key={key}

{
   "meta": {
      "status": 200,
      "msg": "OK"
   },
   "response": {
      "blog": { ... },
      "posts": [
         {
            "blog_name": "derekg",
            "id": 5578378101,
            "id_string": "5578378101",
            "post_url": "http:\/\/derekg.org\/post\/5578378101/otis-redding",
            "type": "audio",
            "date": "2011-05-17 16:21:05 GMT",
            "timestamp": 1305649265,
            "format": "html",
            "reblog_key": "Wa65rR5l",
            "tags": [],
            "note_count": 3,
            "source_url": "http:\/\/soundcloud.com\/mariam-cabal\/otis-redding",
            "source_title": "SoundCloud \/ Mariam Caballero",
            "id3_title": "Otis Redding - Cigarettes And Coffee",
            "caption": "<p>Otis Redding never fails me.\u00a0<\/p>",
            "embed": "<iframe class=\"tumblr_audio_player tumblr_audio_player_5578378101\" src=\"http:\/\/derekg.org\/post\/5578378101/otis-redding/audio_player_iframe" frameborder=\"0\" allowtransparency=\"true\" scrolling=\"no\" width=\"540\" height=\"85\"></iframe>",
            "plays": 1576
         }
      ],
      "total_posts": 1
   }
}

Legacy Video Posts

Response FieldTypeDescriptionNotes
captionStringThe user-supplied caption
playerArray of embed objectsObject fields within the array:Values vary by video source
widthNumberWidth of video player, in pixels
embed_codeStringHTML for embedding the video player

Example

https://api.tumblr.com/v2/blog/john.io/posts/video?api_key={key}

{
   "meta": {
      "status": 200,
      "msg": "OK"
   },
   "response": {
      "blog": { ... },
      "posts": [
         {
            "blog_name": "john",
            "id": 6522991678,
            "id_string": "6522991678",
            "post_url": "http:\/\/john.io\/post\/6522991678",
            "type": "video",
            "date": "2011-06-14 15:51:21 GMT",
            "timestamp": 1308066681,
            "format": "html",
            "reblog_key": "sWRdVJrI",
            "tags": [],
            "note_count": 17,
            "source_url": "http:\/\/www.WatchMojo.com",
            "source_title": "WatchMojo.com",
            "caption": "<p><a href=\"https:\/\/foreverneilyoung.tumblr.com\/
               post\/6522738445\" target=\"_blank\">foreverneilyoung<\/a>:
               <\/p>\n<blockquote>\n<p><a href=\"https:\/\/watchmojo.tumblr.com\/
               post\/6521201320\" target=\"_blank\">watchmojo<\/a>:<\/p>\n
               <blockquote>\n<p>Neil Young\u2019s live album \u201cA Treasure\
               u201d is available today. To celebrate, we take a look at the
               life and career of the Canadian singer-songwriter.
               <\/p>\n<\/blockquote>\n<p>Neil 101 for you new fans out
               there.<\/p>\n<\/blockquote>\n<p><strong>If you don't
               know\/appreciate Neil Young's impressive body of work,
               this will help<\/strong><\/p>",
            "player": [
               {
                  "width": 250,
                  "embed_code": "<object width=\"248\" height=\"169\"><param
                     name=\"movie\" value=\"http:\/\/www.youtube.com\/
                     v\/4Q1aI7xPo0Y&rel=0&egm=0&
                     showinfo=0&fs=1\"><\/param><param name=\"wmode\"
                     value=\"transparent\"><\/param><param name=\"
                     allowFullScreen\" value=\"true\"><\/param><embed
                     src=\"http:\/\/www.youtube.com\/v\/
                     4Q1aI7xPo0Y&rel=0&egm=0&showinfo=
                     0&fs=1\" type=\"application\/x-shockwave-flash\"
                     width=\"248\" height=\"169\" allowFullScreen=\"true\"
                     wmode=\"transparent\"><\/embed><\/object>"
               },
               {
                  "width": 400,
                  "embed_code": "<object width=\"400\" height=\"251\">
                     <param name=\"movie\" value=\"http:\/\/www.youtube.com\/
                     v\/4Q1aI7xPo0Y&rel=0&egm=0&showinfo=0&fs=1\"><\/
                     param><param name=\"wmode\" value=\"transparent
                     \"><\/param><param name=\"allowFullScreen\" value=
                     \"true\"><\/param><embed src=\"http:\/\/www.youtube.com
                     \/v\/4Q1aI7xPo0Y&rel=0&egm=0&
                     showinfo=0&fs=1\" type=\"application\/
                     x-shockwave-flash\" width=\"400\" height=\"251\"
                     allowFullScreen=\"true\" wmode=\"transparent\">
                     <\/embed><\/object>"
               },
               {
                  "width": 500,
                  "embed_code": "<object width=\"500\" height=\"305\"><param
                     name=\"movie\" value=\"http:\/\/www.youtube.com\/
                     v\/4Q1aI7xPo0Y&rel=0&egm=0&
                     showinfo=0&fs=1\"><\/param><param name=\"wmode\"
                     value=\"transparent\"><\/param><param name=\"
                     allowFullScreen\" value=\"true\"><\/param><embed
                     src=\"http:\/\/www.youtube.com\/v\/4Q1aI7xPo0Y&
                     rel=0&egm=0&showinfo=0&fs=1\"
                     type=\"application\/x-shockwave-flash\" width=\"500\"
                     height=\"305\" allowFullScreen=\"true\"
                     wmode=\"transparent\"><\/embed><\/object>"
               }
            ]
         },
         ...
      ],
      "total_posts": 48
   }
}

Legacy Answer Posts

Response FieldTypeDescription
asking_nameStringThe blog that sent this ask, or answered it if it was privately answered
asking_urlStringThe blog URL that sent this ask, or answered it if it was privately answered
questionStringThe question being asked
answerStringThe answer given

Example

https://api.tumblr.com/v2/blog/david.tumblr.com/posts?id=7504154594&api_key={key}

{
   "meta": {
      "status": 200,
      "msg": "OK"
   },
   "response": {
      "blog": { ... },
      "posts": [
         {
            "blog_name": "david",
            "id": 7504154594,
            "id_string": "7504154594",
            "post_url": "https://www.davidslog.com/7504154594",
            "type": "answer",
            "date": "2011-07-11 20:24:14 GMT",
            "timestamp": 1310415854,
            "format": "html",
            "reblog_key": "HNvqLd5G",
            "tags": [],
            "asking_name": "aperfectfacade",
            "asking_url": "https://aperfectfacade.tumblr.com/",
            "question": "I thought Tumblr started in 2007, yet you
               have posts from 2006?",
            "answer": "<p>Good catch! Tumblr <strong>launched</strong> in
               February 2007. We were testing it for a few months before
               then.</p>\n<p><strong>Tumblr Trivia:</strong> Before Tumblr,
               my blog (davidslog.com) was a manually edited, single page,
               HTML tumblelog.</p>"
         }
      ],
      "total_posts": 1
   }
}

/posts/queue — Retrieve Queued Posts

Gives you a list of the currently queued posts for the specified blog.

Method

URIHTTP MethodAuthentication
api.tumblr.com/v2/blog/{blog-identifier}/posts/queueGETOAuth

Request Path Parameters

ParameterTypeDescriptionDefaultRequired?
blog-identifierStringAny blog identifier. See the Blog Identifiers section for more details.N/AYes

Query Parameters

ParameterTypeDescriptionDefaultRequired?
offsetStringPost number to start at0 (first post)No
limitNumberThe number of results to return: 1–20, inclusive20No
filterStringSpecifies the post format to return, other than HTML: text – Plain text, no HTML; raw – As entered by the user (no post-processing); if the user writes in Markdown, the Markdown will be returned rather than HTMLNone (HTML)No

/posts/queue/reorder — Reorder Queued Posts

This allows you to reorder a post within the queue, moving it after an existing queued post, or to the top.

Method

URIHTTP MethodAuthentication
api.tumblr.com/v2/blog/{blog-identifier}/posts/queue/reorderPOSTOAuth

Request Path Parameters

ParameterTypeDescriptionDefaultRequired?
blog-identifierStringAny blog identifier. See the Blog Identifiers section for more details.N/AYes

Request Body Parameters

ParameterTypeDescriptionDefaultRequired?
post_idString/IntegerPost ID to moveN/AYes
insert_afterString/IntegerWhich post ID to move it after, or 0 to make it the first post0No

/posts/queue/shuffle - Shuffle Queued Posts

This randomly shuffles the queue for the specified blog.

Method

URIHTTP MethodAuthentication
api.tumblr.com/v2/blog/{blog-identifier}/posts/queue/shufflePOSTOAuth

Request Path Parameters

ParameterTypeDescriptionDefaultRequired?
blog-identifierStringAny blog identifier. See the Blog Identifiers section for more details.N/AYes

/posts/draft — Retrieve Draft Posts

Method

URIHTTP MethodAuthentication
api.tumblr.com/v2/blog/{blog-identifier}/posts/draftGETOAuth

Request Path Parameters

ParameterTypeDescriptionDefaultRequired?
blog-identifierStringAny blog identifier. See the Blog Identifiers section for more details.N/AYes

Request Parameters

ParameterTypeDescriptionDefaultRequired?
before_idNumberReturn posts that have appeared before this ID; Use this parameter to page through the results: first get a set of posts, and then get posts since the last ID of the previous set.0No
filterStringSpecifies the post format to return, other than HTML: text – Plain text, no HTML; raw – As entered by the user (no post-processing); if the user writes in Markdown, the Markdown will be returned rather than HTMLNone (HTML)No

/posts/submission — Retrieve Submission Posts

Method

URIHTTP MethodAuthentication
api.tumblr.com/v2/blog/{blog-identifier}/posts/submissionGETOAuth

Request Path Parameters

ParameterTypeDescriptionDefaultRequired?
blog-identifierStringAny blog identifier. See the Blog Identifiers section for more details.N/AYes

Request Parameters

ParameterTypeDescriptionDefaultRequired?
offsetStringPost number to start at0 (first post)No
filterStringSpecifies the post format to return, other than HTML: text – Plain text, no HTML; raw – As entered by the user (no post-processing); if the user writes in Markdown, the Markdown will be returned rather than HTMLNone (HTML)No

Response

Response FieldTypeDescription
idNumberThe ID of the submitted post
id_stringStringThe ID of the submitted post, in String format for clients that do not support 64-bit integers
post_urlStringThe location of the post
slugStringShort text summary to the end of the post URL
typeStringThe type of post. One of the following: text, photo, quote, link, video
dateStringThe GMT date and time of the post
timestampNumberThe time of the post, in seconds since the epoch
stateStringIndicates the current state of the post (submission)
formatStringFormat type of post.
reblog_keyStringThe reblog key for the post
tagsArrayTags applied to the post
short_urlStringShort url for the post
post_authorStringAuthor of post, only available when submission is not anonymous
is_submissionBooleanIndicates post is a submission (true)
anonymous_nameStringName on an anonymous submission
anonymous_emailStringEmail on an anonymous submission

/notifications — Retrieve Blog's Activity Feed

Retrieve the activity items for a specific blog, in reverse chronological order.

Method

URIHTTP MethodAuthentication
api.tumblr.com/v2/blog/{blog-identifier}/notificationsGETOAuth

Request Path Parameters

ParameterTypeDescriptionDefaultRequired?
blog-identifierStringAny blog identifier. See the Blog Identifiers section for more details.N/AYes

Query Parameters

ParameterTypeDescriptionDefaultRequired?
beforeIntegerUnix epoch timestamp that begins the page, defaults to request time.Request timeNo
typesString[]An array of one or more types to filter by, or none if you want allNoneNo
rollupsBooleanWhether to "roll up" similar activity items into single itemstrueNo
omit_post_idsString[]An array of one or more of your own Post IDs to filter outNoneNo

Available "types" include:

TypeDescription
likeA like on your post
replyA reply on your post
followA new follower
mention_in_replyA mention of your blog in a reply
mention_in_postA mention of your blog in a post
reblog_nakedA reblog of your post, without commentary
reblog_with_contentA reblog of your post, with commentary
askA new ask received
answered_askAn answered ask that you had sent
new_group_blog_memberA new member of your group blog
post_attributionSomeone using your post content in their post
post_flaggedA post of yours being flagged
post_appeal_acceptedAn appeal accepted
post_appeal_rejectedAn appeal rejected
what_you_missedA post we think you missed
conversational_noteA conversational note (reply, reblog with comment) on a post you're watching

Response

Response FieldTypeDescription
notificationsArrayAn array of activity item objects, see below.
_linksObjectA pagination links object with a next key to use, to load more activity items.

Note that different activity item objects vary field schema by activity item type. Some common fields include:

  • id -- The ID of the activity item.
  • type -- The type of activity item, from the list above.
  • timestamp -- A unix epoch timestamp of when the event happened.
  • unread -- A boolean indicating whether this is new/unread as of the last activity read time.
  • target_post_id -- If the activity has to do with one of your blog's posts, this will be its ID.
  • from_tumblelog_name -- If the activity is coming from another blog, like a Like or Reblog, this will be its name.
  • post_id -- For activity like Reblogs and Replies, this will be the relevant post's ID.
  • post_tags -- An array of used in the reblog, if any.
  • added_text -- For reblogs with comment, this will be a summary of the added content.
  • reply_text -- For replies, this will be the text of the reply.

/post — Create a New Blog Post (Legacy)

These legacy posting flows are still available, but we encourage you to use the Neue Post Format creation route.

Method

URIHTTP MethodAuthentication
api.tumblr.com/v2/blog/{blog-identifier}/postPOSTOAuth

Request Path Parameters

ParameterTypeDescriptionDefaultRequired?
blog-identifierStringAny blog identifier. See the Blog Identifiers section for more details.N/AYes

Request Parameters

These parameters are used for /post, /post/edit, and /post/reblog methods.

Fields available for all Post types:

ParameterTypeDescriptionDefaultRequired?
typeStringThe type of post to create. Specify one of the following: text, photo, quote, link, chat, audio, videotextYes
stateStringThe state of the post. Specify one of the following: published, draft, queue, privatepublishedNo
tagsStringComma-separated tags for this postNoneNo
tweetStringManages the autotweet (if enabled) for this post: set to off for no tweet, or enter text to override the default tweetNoneNo
dateStringThe GMT date and time of the post, as a stringThe date and time of the POST requestNo
formatStringSets the format type of post. Supported formats are: html & markdownhtmlNo
slugStringAdd a short text summary to the end of the post URLDynamically generated if enabled on the blogNo
native_inline_imagesBooleanConvert any external image URLs to Tumblr image URLsfalseNo

Text Posts

ParameterTypeDescriptionDefaultRequired?
titleStringThe optional title of the post, HTML entities must be escapedNoneNo
bodyStringThe full post body, HTML allowedNoneYes

Photo Posts

ParameterTypeDescriptionDefaultRequired?
captionStringThe user-supplied caption, HTML allowedNoneNo
linkStringThe "click-through URL" for the photoNoneNo
sourceStringThe photo source URLNoneYes, either source or data or data64
dataArray (URL-encoded binary contents)One or more image files (submit multiple times to create a slide show), limit 10MBNoneYes, either source or data or data64
data64StringThe contents of an image file encoded using base64, limit 10MBNoneYes, either source or data or data64

Quote Posts

ParameterTypeDescriptionDefaultRequired?
quoteStringThe full text of the quote, HTML entities must be escapedNoneYes
sourceStringCited source, HTML allowedNoneNo

Link Posts

ParameterTypeDescriptionDefaultRequired?
titleStringThe title of the page the link points to, HTML entities should be escapedNoneNo
urlStringThe linkNoneYes
descriptionStringA user-supplied description, HTML allowedNoneNo
thumbnailStringThe url of an image to use as a thumbnail for the postNoneNo
excerptStringAn excerpt from the page the link points to, HTML entities should be escapedNoneNo
authorStringThe name of the author from the page the link points to, HTML entities should be escapedNoneNo

Chat Posts

ParameterTypeDescriptionDefaultRequired?
titleStringThe title of the chatNoneNo
conversationStringThe text of the conversation/chat, with dialogue labels (no HTML)NoneYes

Audio Posts

ParameterTypeDescriptionDefaultRequired?
captionStringThe user-supplied captionNoneNo
external_urlStringThe URL of the site that hosts the audio file (not tumblr)NoneYes, either external_url or data
dataString (URL-encoded binary contents)An audio file, limit 10MBNoneYes, either external_url or data

Video Posts

ParameterTypeDescriptionDefaultRequired?
captionStringThe user-supplied captionNoneNo
embedStringHTML embed code for the video or a URI to the video. If you provide an unsupported service's URI you may receive a 400 response.NoneYes, either a URI, embed, or data.
dataString (URL-encoded binary contents)A video file, limited to 500MB and 10 minutesNoneYes, either embed or data

Response

Returns 201: Created or an error code.

/post/edit – Edit a Blog Post (Legacy)

Method

URIHTTP MethodAuthentication
api.tumblr.com/v2/blog/{blog-identifier}/post/editPOSTOAuth

Request Path Parameters

ParameterTypeDescriptionDefaultRequired?
blog-identifierStringAny blog identifier. See the Blog Identifiers section for more details.N/AYes

Request Parameters

These parameters are in addition to the common parameters listed under /post.

ParameterTypeDescriptionDefaultRequired?
idNumberThe ID of the post to editNoneYes

Response

Returns 200: OK (successfully edited) or an error code.

/post/reblog – Reblog a Post (Legacy)

Method

URIHTTP MethodAuthentication
api.tumblr.com/v2/blog/{blog-identifier}/post/reblogPOSTOAuth

Request Path Parameters

ParameterTypeDescriptionDefaultRequired?
blog-identifierStringAny blog identifier. See the Blog Identifiers section for more details.N/AYes

Request Parameters

These parameters are in addition to the common parameters listed under /post.

ParameterTypeDescriptionDefaultRequired?
idNumberThe ID of the reblogged post on tumblelogNoneYes
reblog_keyNumberThe reblog key for the reblogged post – get the reblog key with a /posts requestNoneYes
commentStringA comment added to the reblogged postNoneNo
native_inline_imagesBooleanConvert external image URLs in the comment to Tumblr image URLsfalseNo

Response

Returns 201: Created or an error code.

/posts - Create/Reblog a Post (Neue Post Format)

This route allows you to create posts (and reblogs) using the Neue Post Format. The specification for NPF is here.

Note about Post States

Posts can be in the following "states" as indicated in requests to the post creation/editing endpoints:

  • "published" means the post should be publicly published immediately.
  • "queue" means the post should be added to the end of the blog's post queue.
  • "draft" means the post should be saved as a draft.
  • "private" means the post should be privately published immediately.
  • "unapproved" means the post is a new submission.

If omitted, the state parameter on a new post defaults to "published".

Method

URIHTTP MethodAuthentication
api.tumblr.com/v2/blog/{blog-identifier}/postsPOSTOAuth

Request Path Parameters

ParameterTypeDescriptionDefaultRequired?
blog-identifierStringAny blog identifier. See the Blog Identifiers section for more details.N/AYes

Request Parameters

ParameterTypeDescriptionDefaultRequired?
contentArrayAn array of NPF content blocks to be used to make the post; in a reblog, this is any content you want to add.[]Yes, for new posts
layoutArrayAn array of NPF layout objects to be used to lay out the post content.[]No
stateStringThe initial state of the new post, such as "published" or "queued"."published"No
publish_onStringThe exact future date and time (ISO 8601 format) to publish the post, if desired. This parameter will be ignored unless the state parameter is "queue".NowNo
dateStringThe exact date and time (ISO 8601 format) in the past to backdate the post, if desired. This backdating does not apply to when the post shows up in the Dashboard.NowNo
tagsStringA comma-separated list of tags to associate with the post.NoneNo
source_urlStringA source attribution for the post content.NoneNo
send_to_twitterBooleanWhether or not to share this via any connected Twitter account on post publish. Defaults to the blog's global setting.falseNo
is_privateBooleanWhether this should be a private answer, if this is an answer.falseNo
slugStringA custom URL slug to use in the post's permalink URLAutomatically generated based on the post's contentNo
interactability_reblogStringWho can interact with this when reblogging; 'everyone' or 'noone''everyone'No

If the post being created is a reblog, all of the above parameters are expected, along with:

ParameterTypeDescriptionDefaultRequired?
parent_tumblelog_uuidStringThe unique public identifier of the Tumblelog that's being reblogged from.N/AYes
parent_post_idIntegerThe unique public post ID being reblogged.N/AYes
reblog_keyStringThe unique per-post hash validating that this is a genuine reblog action.N/AYes
hide_trailBooleanWhether or not to hide the reblog trail with this new post. Defaults to false.falseNo
exclude_trail_itemsArrayInstead of hide_trail, use this to specify an array of specific reblog trail item indexes to exclude from your reblog.[]No

Note that when making a reblog, the trail from the post you're reblogging is not required, and will be ignored if given. Any content you provide when making a reblog will be added at the end of the reblog trail, in your post.

User Uploaded Media

In order to support user uploaded media (photos, videos, etc.), the creation and edit routes also support a multi-part form request where the first part contains the JSON body and subsequent parts contain media data. The Content-Type: multipart/form-data header must be used in this case.

To specify which media data pertains to which block, we use a unique identifier in the JSON body and this identifier is used as the key in the form data.

{
    "content": [
        {
            "type": "image",
            "media": [
                {
                    "type": "image/jpeg",
                    "identifier": "some-identifier",
                    "width": 250,
                    "height": 200
                }
            ]
        }
    ]
}
--TumblrBoundary
Content-Disposition: form-data; name="json"
Content-Type: application/json

{JSON encoded parameters}
--TumblrBoundary
Content-Disposition: form-data; name="some-identifier"; filename="filename.jpg"
Content-Type: image/jpeg

{image data}
--TumblrBoundary--

Uploading a video for a video content block follows the same identifier pattern as above:

{
    "content": [
        {
            "type": "video",
            "media": {
                "type": "video/mp4",
                "identifier": "some-identifier",
                "width": 250,
                "height": 200
            }
        }
    ]
}

Normally we would require a provider field inside the video block, but on post creation this is assumed to be tumblr if none is provided.

Response

This returns a 201 Created on successful post creation, or an error code. The response JSON object will contain the id of the created post, which is intentionally a string instead of an integer for 32bit device compatibility.

Example response:

{
    "meta": {
        "msg": "Created",
        "status": 201
    },
    "response": {
        "id": "1234567891234567"
    }
}

Errors and Error Subcodes

The error codes here are the HTTP statuses that'll be returned in error states, the error subcodes are the specific subcodes also returned in some situations. The response should have an errors array at the top level alongside meta, containing what error(s) occurred.

  • 400 Bad Request when the request has not provided the required data.
    • 400.8001 when an NPF JSON parameter is invalid or a bad format.
    • 400.8002 when the reblog parent post and/or blog is invalid or cannot be found or cannot be interacted with.
    • 400.8005 when the uploaded media is an invalid format we cannot accept.
    • 400.8016 when there is something invalid about the format of the answer content or layout.
  • 401 Unauthorized when the requester is an unauthorized client.
  • 403 Forbidden when the requester is not allowed to reblog the parent post they specified.
    • 403.8004 when the requesting user cannot upload more media today.
    • 403.8008 when trying to upload a video in reblog content, which is not allowed.
    • 403.8010 when there is a video upload still transcoding, so you can't upload another video yet.
    • 403.8011 when the requesting user cannot upload more videos today.
    • 403.8022 when the blog's queue limit has been reached.
    • 403.8023 when the blog's daily posting limit has been reached.
  • 404 Not Found when the request is not HTTPS.
  • 404 Not Found when the Tumblelog identifier in the path does not resolve to an existing blog.
  • 404 Not Found when the given post ID for editing/fetching doesn't exist.
  • 500 Internal Server Error when something has gone very wrong.
    • 500.8006 when there was an unknown upload error (not video related).
    • 500.8009 when there was an unknown upload error (video related).
  • 503 Service Unavailable when all posting, or posting via the API, is disabled.

For example:

{
    "meta": {
        "msg": "Bad Request",
        "status": 400
    },
    "errors": [
        {
            "title": "'content' must be an array'",
            "code": 8001
        }
    ]
}

/posts/{post-id} - Fetching a Post (Neue Post Format)

This route can fetch a post, either legacy or NPF, and return it in either in the legacy or NPF format. The specification for NPF is here. Note that NPF to legacy conversion is not valid yet, so the available conversions are: NPF -> NPF, legacy -> legacy, and legacy -> NPF.

The intention of this route is to fetch a post for editing in either the NPF or legacy format.

Method

URIHTTP MethodAuthentication
api.tumblr.com/v2/blog/{blog-identifier}/posts/{post-id}GETOAuth

Request Path Parameters

ParameterTypeDescriptionDefaultRequired?
blog-identifierStringAny blog identifier. See the Blog Identifiers section for more details.N/AYes
post-idStringPost ID. See the Post Identifiers section for more details.N/AYes

Request Parameters

ParameterTypeDescriptionDefaultRequired?
post_formatStringThe format to serve the post as, either npf or legacy.npfNo

Response

This returns a 200 OK on successful post fetching, or an error code.

The response JSON object will contain:

Response FieldTypeDescription
object_typeStringThe timeline object type, always post.
typeStringThe post type. If formatting as NPF, the type will be blocks; if formatting as legacy, the type will be one of the original legacy types (text, photo, quote, chat, link, video, audio).
idStringThe post ID, intentionally a string instead of an integer, for 32bit device compatibility.
tumblelog_uuidStringThe posting blog's unique identifier.
parent_post_idStringThe parent post ID, if the post being fetched is a reblog.
parent_tumblelog_uuidStringThe parent posting blog's UUID, if the post being fetched is a reblog.
reblog_keyStringThe reblog key needed as an additional authentication token.
trailArrayArray of trail items, if the post being fetched is a reblog.
contentArrayArray of the content blocks of the post itself.
layoutArrayArray of the post's layout objects.
queued_stateStringIf the post's state is queued, this field will indicate whether it's actually a scheduled post.
scheduled_publish_timeIntegerIf the post's state is queued, this will provide the scheduled publishing timestamp.
publish_onStringIf the queued_state is "scheduled", this is the timestamp of when the post is scheduled to publish, in ISO 8601 format.
interactability_reblogStringWho can interact with this when reblogging; 'everyone' or 'noone'

Note about queued/scheduled posts: the queued_state field will only exist for a state: queued post, and will indicate either queued or scheduled. The scheduled_publish_time field will tell you when the post is currently scheduled for publishing, as a Unix epoch timestamp. These fields are read-only; to change post's state or scheduled publish time, please use the state and publish_on fields when editing the post.

Errors and Error Subcodes

See the notes from the NPF Post creation route for info about this.

/posts/{post-id} - Editing a Post (Neue Post Format)

This route allows you to edit posts using the Neue Post Format. Note that you can only edit posts in NPF if they were originally created in NPF, or are legacy text posts. The specification for NPF is here.

Method

URIHTTP MethodAuthentication
api.tumblr.com/v2/blog/{blog-identifier}/posts/{post-id}PUTOAuth

Request Path Parameters

ParameterTypeDescriptionDefaultRequired?
blog-identifierStringAny blog identifier. See the Blog Identifiers section for more details.N/AYes
post-idStringPost ID. See the Post Identifiers section for more details.N/AYes

Request Parameters

For editing a post, all of the request parameters from the NPF Post Creation route are expected (depending on if it's an original post or reblog), along with the Post's ID in the query path. If you are editing a scheduled post, make sure to include its publish_on value.

Note that the exclude_trail_items parameter will edit the reblog's current trail at the time of editing, not the trail that existed when the reblog was created. So if you had created a reblog and excluded trail items at creation, then are editing it to exclude trail items again, you are now editing that reblog's trail, not the parent post's trail. Basically: you can't "bring back" trail items without reblogging the parent post all over again.

Response

This returns a 200 OK on successful post editing, or an error code. The response JSON object will contain the post_id of the edited post, which is intentionally a string instead of an integer for 32bit device compatibility.

Example response:

{
    "meta": {
        "msg": "OK",
        "status": 200
    },
    "response": {
        "id": "1234567891234567"
    }
}

Errors and Error Subcodes

See the notes from the NPF Post creation route for info about this.

/post/delete – Delete a Post

Method

URIHTTP MethodAuthentication
api.tumblr.com/v2/blog/{blog-identifier}/post/deletePOSTOAuth

Request Path Parameters

ParameterTypeDescriptionDefaultRequired?
blog-identifierStringAny blog identifier. See the Blog Identifiers section for more details.N/AYes

Request Parameters

ParameterTypeDescriptionDefaultRequired?
idNumberThe ID of the post to deleteN/AYes

Response

Returns 200: OK (successfully deleted) or an error code.

/posts/{post-id}/mute – Muting a Post's Notifications

Muting a post's notifications means the author of the post will no longer receive activity items or push notifications about the post, until the post is unmuted, or until the temporary mute expires.

Methods

The POST request mutes the given post, and the DELETE request can unmute a post.

URIHTTP MethodAuthentication
api.tumblr.com/v2/blog/{blog-identifier}/posts/{post-id}/mutePOSTOAuth
api.tumblr.com/v2/blog/{blog-identifier}/posts/{post-id}/muteDELETEOAuth

Request Path Parameters

ParameterTypeDescriptionDefaultRequired?
blog-identifierStringAny blog identifier. See the Blog Identifiers section for more details.N/AYes
post-idStringThe post ID to mute.N/AYes

Body Parameters

To make the mute temporary, you can supply how long you want the mute to last.

ParameterTypeDescriptionDefaultRequired?
mute_length_secondsIntegerHow many seconds the mute should last0 (forever)No

Giving 0 or omitting mute_length_seconds entirely means the mute will last until the post is unmuted by the author.

Response

Returns 200 OK on successful muting or unmuting, or an error code.

Returns 400 Bad Request if the given mute_length_seconds is less than 0.

/notes - Get notes for a specific Post

Method

URIHTTP MethodAuthentication
api.tumblr.com/v2/blog/{blog-identifier}/notesGETAPI Key

Request Path Parameters

ParameterTypeDescriptionDefaultRequired?
blog-identifierStringAny blog identifier. See the Blog Identifiers section for more details.N/AYes

Request Parameters

ParameterTypeDescriptionDefaultRequired?
idNumberThe ID of the post to fetch notes forN/AYes
before_timestampNumberFetch notes created before this timestamp, for pagination. This is a unix timestamp in seconds precision, but microsecond precision for conversation mode.N/ANo
modeStringThe response formatting mode, see list below."all"No

The mode field can be one of a few things, most of which act as filters for the types of notes returned. All return notes in reverse chronological order.

  • "all" loads all notes for the post.
  • "likes" loads only likes for the post.
  • "conversation" loads only replies and reblogs with added text commentary, with the rest of the notes (likes, reblogs without commentary) in a rollup_notes field.
  • "rollup" loads only like and reblog notes for the post in the notes array.
  • "reblogs_with_tags" loads only the reblog notes for the post, and each note object includes a tags array field (which may be empty).

And different modes can cause the response to contain different things.

Example request:

GET https://api.tumblr.com/v2/blog/YOUR-BLOG.tumblr.com/notes?id=1234567890000&mode=all&before_timestamp=1234567890

Response

Returns 200: OK with an array of notes, along with more info, and a _links object to load more notes.

FieldTypeDescription
notesArrayAn array of note objects, which may be formatted differently based on the mode and note type
rollup_notesArrayIn "conversation" mode, this contains notes not listed in the notes array.
total_notesNumberThe total notes, which can change depending on the mode.
total_likesNumberThe total likes, when mode is conversation.
total_reblogsNumberThe total reblogs, when mode is conversation.
_linksObjectContains a next link object for pagination.

Example response:

{
    "meta": {
        "status": 200,
        "msg": "OK"
    },
    "response": {
        "notes": [
            {
                "type": "reblog",
                "timestamp": 1595527574,
                "blog_name": "test-blog",
                "blog_uuid": "t:abcd1234",
                "blog_url": "https://test-blog.tumblr.com/",
                "followed": false,
                "avatar_shape": "square",
                "post_id": "1123456688899000",
                "reblog_parent_blog_name": "other-test-blog"
            },
            {
                "type": "like",
                "timestamp": 1595527569,
                "blog_name": "test-blog",
                "blog_uuid": "t:abcd1234",
                "blog_url": "https://test-blog.tumblr.com/",
                "followed": false,
                "avatar_shape": "square"
            }
        ],
        "total_notes": 2
    }
}

User Methods

/user/info – Get a User's Information

Use this method to retrieve the user's account information that matches the OAuth credentials submitted with the request.

Method

URIHTTP MethodAuthentication
api.tumblr.com/v2/user/infoGETOAuth

Response

ParameterTypeDescription
followingNumberThe number of blogs the user is following
default_post_formatStringThe default posting format - html, markdown, or raw
nameStringThe user's tumblr short name
likesNumberThe total count of the user's likes
blogsArrayEach item is a blog the user has permissions to post to, containing these fields:
blogs.nameStringthe short name of the blog
blogs.urlStringthe URL of the blog
blogs.titleStringthe title of the blog
blogs.primaryBooleanindicates if this is the user's primary blog
blogs.followersNumbertotal count of followers for this blog
blogs.tweetStringindicate if posts are tweeted auto, Y, N
blogs.typeStringindicates whether a blog is public or private

Example

{
    "meta": {
        "status": 200,
        "msg": "OK"
    },
    "response": {
        "user": {
            "following": 263,
            "default_post_format": "html",
            "name": "derekg",
            "likes": 606,
            "blogs": [
            {
                "name": "derekg",
                "title": "Derek Gottfrid",
                "url": "https://derekg.org/",
                "tweet": "auto",
                "primary": true,
                "followers": 33004929,
            },
            {
                "name": "ihatehipstrz",
                "title": "I Hate Hipstrz",
                ...
            }
        ]
     }
  }
}

/user/limits – Get a User's Limits

Use this method to retrieve information about the various limits for the current user.

Method

URIHTTP MethodAuthentication
api.tumblr.com/v2/user/limitsGETOAuth

Response

Example

{
    "meta": {
        "status": 200,
        "msg": "OK"
    },
    "response": {
        "user": {
            "blogs": {
               "description": "the number of secondary blogs you can create per day",
               "limit": 10,
               "remaining": 4,
               "reset_at": 1670043600
            },
            "follows": {
                "description": "the number of blogs you can follow per day",
                "limit": 200,
                "remaining": 199,
                "reset_at": 1670043600
            },
            ...
        }
    }
}

/user/dashboard – Retrieve a User's Dashboard

Use this method to retrieve the dashboard that matches the OAuth credentials submitted with the request.

⚠️ Note: Please don't re-implement the Dashboard, and don't recreate complete Tumblr functions or clients on a platform where Tumblr already has an official client. See our API policies here.

Method

URIHTTP MethodAuthentication
api.tumblr.com/v2/user/dashboardGETOAuth

Request Parameters

ParameterTypeDescriptionDefaultRequired?
limitNumberThe number of results to return: 1–20, inclusive20No
offsetNumberPost number to start at0 (first post)No
typeStringThe type of post to return. Specify one of the following: text, photo, quote, link, chat, audio, video, answerNone – return all typesNo
since_idNumberReturn posts that have appeared after this ID; Use this parameter to page through the results: first get a set of posts, and then get posts since the last ID of the previous set.0No
reblog_infoBooleanIndicates whether to return reblog information (specify true or false). Returns the various reblogged_ fields.FalseNo
notes_infoBooleanIndicates whether to return notes information (specify true or false). Returns note count and note metadata.FalseNo
npfBooleanReturns posts' content in NPF format instead of the legacy format.FalseNo

Response

Dashboard responses include the fields returned in /posts responses (with all the various type-specific fields), but without the blog object. Instead, a blog_name field identifies the blog for each post returned.

Important note: Post content can be in two formats: legacy or Neue Post Format (NPF). By default, posts returned from this endpoint (and any other endpoint that returns posts) will be in the legacy post-type-based content formats described here. NPF-created posts from the official Tumblr mobile apps will be returned as text/regular posts to maintain backwards compatibility. To help transition to an NPF-only world, you can pass along the npf=true query parameter to force all posts returned here to be in Neue Post Format (also described here).

Example

{
   "meta": {
      "status": 200,
      "msg": "OK"
   },
   "response": {
      "posts": [
         {
            "blog_name": "laughingsquid",
            "id": 6828225215,
            "id_string": "6828225215",
            "post_url": "https:\/\/links.laughingsquid.com\/post\/6828225215",
            ...
         }
      ]
   }
}

/user/likes — Retrieve a User's Likes

Use this method to retrieve the liked posts that match the OAuth credentials submitted with the request.

Method

URIHTTP MethodAuthentication
api.tumblr.com/v2/user/likesGETOAuth

Request Parameters

ParameterTypeDescriptionDefaultRequired?
limitNumberThe number of results to return: 1–20, inclusive20No
offsetNumberLiked post number to start at0 (first post)No
beforeIntegerRetrieve posts liked before the specified timestampNoneNo
afterIntegerRetrieve posts liked after the specified timestampNoneNo
  • You can only provide either before, after, or offset. If you provide more than one of these options together you will get an error.
  • You can still use limit with any of those three options to limit your result set.
  • When using the offset parameter the maximum limit on the offset is 1000. If you would like to get more results than that use either before or after.

Response

Response FieldTypeDescription
liked_postsArrayAn array of post objects (posts liked by the user)
liked_countNumberTotal number of liked posts

/user/following – Retrieve the Blogs a User Is Following

Use this method to retrieve the blogs followed by the user whose OAuth credentials are submitted with the request.

Method

URIHTTP MethodAuthentication
api.tumblr.com/v2/user/followingGETOAuth

Request Parameters

ParameterTypeDescriptionDefaultRequired?
limitNumberThe number of results to return: 1–20, inclusive20No
offsetNumberResult number to start at0 (first followee)No

Response

These fields are wrapped in a blog object:

Response FieldTypeDescription
total_blogsNumberThe number of blogs the user is following
blogsArrayEach item is a blog that's being followed, containing these fields:
nameStringthe user name attached to the blog that's being followed
urlStringthe URL of the blog that's being followed
updatedNumberthe time of the most recent post, in seconds since the epoch
titleStringthe title of the blog
descriptionStringthe description of the blog

Example

{
   "meta": {
      "status": 200,
      "msg": "OK"
   },
   "response": {
       "total_blogs": 259,
       "blogs": [
          {
             "name": "david",
             "url": "https:\/\/www.davidslog.com",
             "updated": 1308781073,
             "title": "David’s Log",
             "description": "“Mr. Karp is tall and skinny, with unflinching blue eyes and a mop of brown hair. He speaks incredibly fast and in complete paragraphs.” – NY Observer"
          },
          {
             "name": "matthew",
             "url": "https:\/\/matthew.tumblr.com",
             "updated": 1306436424,
             "title": "Matt Hackett",
             "description": " I obsess over the engineering and dissemination of technology for creative people.

\nI'm happily torn between work on the visible (marketing) and the invisible (architecture, management) components of media-product-making machinery.\n

\nMost recently, I saw as Tumblr's team grew from 10 to 110 and monthly audience from 25 million to 150 million from my vantage point as VP Engineering and later Head of Brand Strategy.

\nMore about Matt Hackett"
          },
          ...
       ]
   }
}

/user/follow – Follow a blog

Method

URIHTTP MethodAuthentication
api.tumblr.com/v2/user/followPOSTOAuth

Request Parameters

ParameterTypeDescriptionDefaultRequired?
urlStringThe URL of the blog to followNoneMust supply url or email
emailStringThe email of the blog to follow. A blog is only followable by email if it has the Let people find your blogs through this address. setting enabled on tumblr.com/settings/account.NoneMust supply url or email

Response

Returns 200: OK (blog successfully followed) or a 404 (blog was not found)

Response FieldTypeDescription
blogObjectThe followed blog info

/user/unfollow – Unfollow a blog

Method

URIHTTP MethodAuthentication
api.tumblr.com/v2/user/unfollowPOSTOAuth

Request Parameters

ParameterTypeDescriptionDefaultRequired?
urlStringThe URL of the blog to unfollowNoneYes

Response

Returns 200: OK (blog successfully unfollowed) or a 404 (if the blog was not found)

/user/like – Like a Post

Method

URIHTTP MethodAuthentication
api.tumblr.com/v2/user/likePOSTOAuth

Request Parameters

ParameterTypeDescriptionDefaultRequired?
idNumberThe ID of the post to likeNoneYes
reblog_keyStringThe reblog key for the post idNoneYes

Response

Returns 200: OK (post successfully liked ) or a 404 (post ID or reblog_key was not found)

/user/unlike – Unlike a Post

Method

URIHTTP MethodAuthentication
api.tumblr.com/v2/user/unlikePOSTOAuth

Request Parameters

ParameterTypeDescriptionDefaultRequired?
idNumberThe ID of the post to unlikeNoneYes
reblog_keyStringThe reblog key for the post idNoneYes

Response

Returns 200: OK (post successfully unliked ) or a 404 (post ID or reblog_key was not found)

/user/filtered_tags - Tag Filtering

This endpoint lets you manage the tagged content you'd like covered on your dashboard. See more info about this feature here. Note that this filtering relies on the content being tagged, but also filters tag recommendations and other tag-based content. For filtering the text content of posts, see Content Filtering.

Methods

All of the endpoints require OAuth authentication.

URIHTTP MethodDescription
api.tumblr.com/v2/user/filtered_tagsGETRetrieve a list of currently-filtered tag strings.
api.tumblr.com/v2/user/filtered_tagsPOSTAdd one or more tags to filter.
api.tumblr.com/v2/user/filtered_tags/{tag}DELETERemove a tag filter.

Request Parameters

For adding new tag filters, you can add one at a time or many at once via the POST body:

ParameterTypeDescription
filtered_tagsArray of StringsOne or more than one tag string to add to your list of filters

Example:

POST https://api.tumblr.com/v2/user/filtered_tags
Content-Type: application/json
{ "filtered_tags": [ "something" ] }

POST https://api.tumblr.com/v2/user/filtered_tags
Content-Type: application/json
{ "filtered_tags": [ "something", "technology" ] }

For deleting a tag filter, pass along the tag string in the path:

ParameterTypeDescription
tagStringTag to stop filtering; this is expected to be "raw" URL encoded.

Example:

DELETE https://api.tumblr.com/v2/user/filtered_tags/tag%20here

That would delete the tag "tag here".

Response

For GET requests, the endpoint will return a 200 OK on success, along with the list of tags:

{
    "meta": {
        "status": 200,
        "msg": "OK"
    },
    "response": {
        "filtered_tags": [
            "technology",
            "something",
            "and something else"
        ]
    }
}

For POST requests, the endpoint will return a 201 Created on success, with an empty response object.

For DELETE requests, the endpoint will return a 200 OK on success, with an empty response object.

Errors

  • 400 Bad Request if given an invalid/empty tag to filter or delete.

/user/filtered_content - Content Filtering

This endpoint lets you manage the plain text content you'd like covered on your dashboard, including blog names in the reblog trail. See more info about this feature here. For filtering based on tags, see Tag Filtering.

Limits

  • Each user can have a maximum of 200 filtered strings.
  • Each filtered string cannot be more than 250 characters in length.
  • Filtered strings can contain any characters that are valid UTF-8.

Methods

All of the endpoints require OAuth authentication.

URIHTTP MethodDescription
api.tumblr.com/v2/user/filtered_contentGETRetrieve a list of currently-filtered content strings.
api.tumblr.com/v2/user/filtered_contentPOSTAdd one or more content strings to filter.
api.tumblr.com/v2/user/filtered_contentDELETERemove a content filter string.

Request Parameters

For adding new content filters, you can add one at a time or many at once via the POST body:

ParameterTypeDescription
filtered_contentString or Array of StringsOne or more than one string to add to your list of filters

Example:

POST https://api.tumblr.com/v2/user/filtered_content
Content-Type: application/x-www-form-urlencoded
filtered_content=something

POST https://api.tumblr.com/v2/user/filtered_content
Content-Type: application/json
{ "filtered_content": [ "something", "technology" ] }

For deleting a content filter, pass along the string in the query params:

ParameterTypeDescription
filtered_contentStringContent filter string to remove.

Example:

DELETE https://api.tumblr.com/v2/user/filtered_content?filtered_content=something

Response

For GET requests, the endpoint will return a 200 OK on success, along with the list of strings:

{
    "meta": {
        "status": 200,
        "msg": "OK"
    },
    "response": {
        "filtered_content": [
            "technology",
            "something",
            "and something else"
        ]
    }
}

For POST requests, the endpoint will return a 201 Created on success, with an empty response object.

For DELETE requests, the endpoint will return a 200 OK on success, with an empty response object.

Errors

  • 400 Bad Request if given an invalid/empty string to filter or delete, or if given an already-filtered string.
  • 403 Forbidden if at the maximum number of allowed filters.

Tagged Method

/tagged – Get Posts with Tag

Examples

  • https://api.tumblr.com/v2/tagged?tag=gif
  • https://api.tumblr.com/v2/tagged?tag=lol

Method

URIHTTP MethodAuthentication
api.tumblr.com/v2/taggedGETAPI Key or OAuth

Request Parameters

ParameterTypeDescriptionDefaultRequired?
tagStringThe tag on the posts you'd like to retrieveNoneYes
beforeIntegerThe timestamp of when you'd like to see posts before. If the Tag is a "featured" tag, use the "featured_timestamp" on the post object for pagination.Current timestampNo
limitNumberThe number of results to return: 1–20, inclusive20No
filterStringSpecifies the post format to return, other than HTML: text – Plain text, no HTML; raw – As entered by the user (no post-processing); if the user writes in Markdown, the Markdown will be returned rather than HTML;None (HTML)No

Communities Methods

⚠️ NOTE: Communities is a brand new beta feature that's under active development. These endpoints may change in backwards-incompatible ways until the feature is fully released.

Communities endpoints often require a "community handle" path parameter, which can be given in one of a few different forms:

  • The name of the community, without the double-@ prefix, i.e. communities-feedback.
  • The community's unique Tumblr UUID, like blog unique identifiers. Community objects will include this.

GET /v2/communities - List joined communities

Method

URIHTTP MethodAuthentication
api.tumblr.com/v2/communitiesGETOAuth

Response

The response field is an array of your joined communities. See the next endpoint for the community object definition.

{
	"meta": {
		"status": 200,
		"msg": "OK"
	},
	"response": [
        { ... }, // community object
        { ... }, // community object
    ]
}

GET /v2/communities/{community-handle} - Get info about a community

Method

URIHTTP MethodAuthentication
api.tumblr.com/v2/communities/{community-handle}GETOAuth

Request Path Parameters

ParameterTypeDescriptionDefaultRequired?
community-handleStringThe community handle, see Communities methodsNoneYes

Request Query Parameters

ParameterTypeDescriptionDefaultRequired?
contextStringThe context of what the info will be used for, see note belowNoneNo

The context request parameter can be set to edit (i.e. ?context=edit) to get additional editable parts of the community, like its settings.

Response

Community objects contain these fields in the "full" version of the object. Some of them are only visible to certain roles or specific situations.

The "short" abbreviated version of the community object contains only name, uuid, title, member_count, mention_tag, can_view, and avatar_image.

FieldTypeDescriptionVisibility
nameStringThe name/handle of the community, without the double-@Visible to all
uuidStringThe unique identifier of the communityVisible to all
titleStringThe title of the communityVisible to all
descriptionStringThe description of the communityVisible to all
aboutStringThe About information of the communityVisible to all
guidelinesArrayAn array of strings, each a community guidelineVisible to all
visibilityStringThe community's visibility, public or privateVisible to all
member_countNumberHow many members are in this communityVisible to all
members_online_countNumberHow many members are "online" nowVisible to all
mention_tagStringThe handle of the community, with the double-@Visible to all
is_memberBooleanWhether the current user is a member of this communityVisible to all
can_viewBooleanWhether the community can be viewed by the current userVisible to all
can_postBooleanWhether the current user can post to this communityVisible to all
can_editBooleanWhether the current user can edit this communityVisible to all
can_interactBooleanWhether the current user can interact with the posts in this communityVisible to all
can_inviteBooleanWhether the current user can invite others to this communityVisible to all
can_view_commentsBooleanWhether the current user can view comments in posts in this communityVisible to all
post_countNumberThe number of posts published in this communityVisible to all
unread_post_countNumberThe number of "unread" posts for the current userVisible to all
tagsArrayThe tags used to describe this communityVisible to all
created_tsNumberThe unix epoch timestamp of when this community was createdVisible to all
invitationObjectInformation about the current user's invitationVisible if the user has an invitation
handle_can_changeBooleanWhether the community handle can be changedVisible to admins in "edit" context
handle_next_change_tsBooleanIf the handle cannot be changed, this is the next time it can be changedVisible to admins in "edit" context
can_edit_content_labelBooleanWhether the content label can be changedVisible to admins in "edit" context
settingsObjectThe community's current settings valuesVisible to admins in "edit" context
avatar_imageArrayThe community's avatar, in various sizesVisible to all
header_imageArrayThe community's header image, in various sizesVisible to all
population_capNumberThe population cap of the community, can be null if there is noneVisible to all
join_typeStringWhether the community is invite-only or free-to-joinVisible to all
has_content_labelBooleanWhether this community has a "mature" content labelVisible to all
content_label_categoriesArrayThe specific content labels this community has appliedVisible to all
invite_linkStringThe invite link to join the community, can be null if disabledVisible to admins
pending_invitations_countNumberHow many pending invitations there areVisible to admins

For those who can edit the community, the settings object contains:

FieldTypeDescription
invite_links_enabledBooleanWhether an invite link is available for this community
join_typeStringWhat join options non-members have, can be "free" or "invite". Note that the top-level join_type field takes precedence.
mods_can_inviteBooleanWhether moderators in the community can invite new members, or only admins
{
	"meta": {
		"status": 200,
		"msg": "OK"
	},
	"response": {
        "name": "community-name",
        "uuid": "t:abcd123",
        "title": "Community Title",
        "description": "A description of the community",
        "about": "Nothing here yet",
        "guidelines": [],
        "visibility": "public",
        "member_count": 12,
        "members_online_count": 10,
        "mention_tag": "@@community-name",
        "is_member": true,
        "can_view": true,
        "can_post": true,
        "can_edit": true,
        "can_interact": true,
        "can_invite": true,
        "can_view_comments": true,
        "post_count": 8,
        "unread_post_count": 1,
        "tags": ['tumblr communities'],
        "created_ts": 1709221499,
        "invitation": {
            "type": "direct",
            "sender": { ... } // blog info object
        },
        "handle_can_change": false,
        "handle_next_change_ts": 1234567890,
        "settings": {}, // settings object
        "avatar_image": [
            {
                "width": 512,
                "height": 512,
                "url": "https://64.media.tumblr.com/bac5b311618185a605d83e7244bfdec3/b26b33c94f644486-87/s512x512u_c1/39187fb2bbf11f92e91f40ca9a15f92041149ee6.pnj"
            },
            {
                "width": 128,
                "height": 128,
                "url": "https://64.media.tumblr.com/bac5b311618185a605d83e7244bfdec3/b26b33c94f644486-87/s128x128u_c1/424063b0e2e23d9060dedb40428e05402bfc0078.pnj"
            },
            {
                "width": 96,
                "height": 96,
                "url": "https://64.media.tumblr.com/bac5b311618185a605d83e7244bfdec3/b26b33c94f644486-87/s96x96u_c1/25bfccd20b0777a82aa8cb201b6e3d48714a2c41.pnj"
            },
            {
                "width": 64,
                "height": 64,
                "url": "https://64.media.tumblr.com/bac5b311618185a605d83e7244bfdec3/b26b33c94f644486-87/s64x64u_c1/a2ed9c2bec1c1c9e39d53fc5df564467dd01f7be.pnj"
            }
        ],
        "population_cap": 9001,
        "join_type": "invite",
        "invite_link": "https://www.tumblr.com/join/abcd123",
        "header_image": [
            {
                "type": "image/jpeg",
                "width": 2048,
                "height": 1542,
                "url": "https://64.media.tumblr.com/2ad713f0fa15a3f0517e7c5b217b4c54/32cbed0b10ff7b6c-23/s2048x3072/dad0b45b4740f15510fcb0373b52ecf6a2f7ddee.jpg"
            },
            {
                "type": "image/jpeg",
                "width": 1280,
                "height": 963,
                "url": "https://64.media.tumblr.com/2ad713f0fa15a3f0517e7c5b217b4c54/32cbed0b10ff7b6c-23/s1280x1920/7eb927d8f7e3a563c05e1ba39f3a24c3b1913791.jpg"
            },
            {
                "type": "image/jpeg",
                "width": 640,
                "height": 482,
                "url": "https://64.media.tumblr.com/2ad713f0fa15a3f0517e7c5b217b4c54/32cbed0b10ff7b6c-23/s640x960/4a7d164a3d0e2bffc1225489217e4d172c5f4822.jpg"
            }
        ],
        "pending_invitations_count": 2
	}
}

Errors

  • 403 Forbidden if you are not allowed to view this:
    • Error code 23020 signifies that you have been banned from the community.
    • Error code 23001 signifies that the community is private and you are not a member.
    • Error code 23002 signifies that you are not a member and you need to be to see the content.
  • 404 Not Found if the community was not found.

PUT /v2/communities/{community-handle} - Edit your community

Method

URIHTTP MethodAuthentication
api.tumblr.com/v2/communities/{community-handle}PUTOAuth

Request Path Parameters

ParameterTypeDescriptionDefaultRequired?
community-handleStringThe community handle, see Communities methodsNoneYes

Request Body Parameters

The different community fields that are editable:

ParameterTypeDescription
titleStringThe title of the community
descriptionStringThe description/tagline of the community
handleStringThe handle/URL of the community, see note below
privacyNumber0 for public, 1 for private
tagsArrayAn array of strings, each a tag to describe your community
aboutStringMore information about your community
guidelinesArrayAn array of strings, each a guideline that members need to follow
invite_links_enabledBooleanWhether invite links are enabled for your community
join_typeStringThe type of options for joining, 'invite' or 'free'
mods_can_inviteBooleanWhether moderators can invite new members for your community
has_content_labelBooleanWhether this community has a "mature" content label
content_label_categoriesArrayThe specific content labels, see note below

Note that the handle can only be edited once every 7 days. When reading a community object, the handle_can_change and handle_next_change_ts fields will tell you if you can edit this.

Also note that updating the handle will invalidate the previous community URL and free up that handle to be taken by another community.

Also note that content_label_categories can include sexual_themes, violence, and/or drug_use specific labels.

Response

200 OK on successful save, along with the JSON object for your community, including the additional fields as if context=edit had been passed.

Errors

  • 400 Bad Request when you've provided an invalid parameter. Error code 23025 means you cannot edit the content label.
  • 403 Forbidden when you do not have permission to edit this community.
  • 503 Service Unavailable when we've encountered a problem saving your community.

GET /v2/communities/{community-handle}/timeline - Get posts from a community

Method

URIHTTP MethodAuthentication
api.tumblr.com/v2/communities/{community-handle}/timelineGETOAuth

Request Path Parameters

ParameterTypeDescriptionDefaultRequired?
community-handleStringThe community handle, see Communities methodsNoneYes

Request Query Parameters

ParameterTypeDescriptionDefaultRequired?
typeStringThe type of timeline to visit, see note belowrecentNo

We currently support timelines of type recent, polls, and discover.

Response

200 OK with a standard timeline response

Errors

  • 403 Forbidden when you do not have permission to view this community, see the info endpoint for specific error codes.

GET /v2/communities/{community-handle}/members - Get community members

The list of all members can only be fetched by members, those with a pending invite, an invite code, or if the community is free-to-join and public.

The lists of admins and moderators is always accessible for public communities.

Method

URIHTTP MethodAuthentication
api.tumblr.com/v2/communities/{community-handle}/membersGETOAuth

Request Path Parameters

ParameterTypeDescriptionDefaultRequired?
community-handleStringThe community handle, see Communities methodsNoneYes

Request Query Parameters

ParameterTypeDescriptionDefaultRequired?
pageNumberThe page of results to fetch1No
filterStringFilter to a specific set of members'all'No

The filter field, if provided, can have one of these values:

  • 'all' for all members.
  • 'admin' to list only admins.
  • 'moderator' to list only moderators.
  • 'following' to list any blogs the requesting user is following.
  • 'mutual' to list any blogs the requesting user has a mutual following relationship with.

Response

200 OK on success. The response will have a members array, which contains standard blog info objects for each member.

Each member blog object will also contain additional fields:

FieldTypeDescription
joined_tsNumberThe unix epoch timestamp of when this member joined.
is_adminBooleanWhether this member has the "admin" role.
is_moderatorBooleanWhether this member has the "moderator" role.
is_following_youBooleanWhether this member is following the requesting user's primary blog.
followedBooleanWhether this member is being followed by the requesting user.
is_mutualBooleanWhether this member is a mutual of the requesting user.

Errors

  • 403 Forbidden with all the error codes from the "get info" endpoint.

PUT /v2/communities/{community-handle}/members - Join a community

Users can join a maximum of 25 communities per hour and 100 per day via free-to-join or invite link.

Method

URIHTTP MethodAuthentication
api.tumblr.com/v2/communities/{community-handle}/membersPUTOAuth

Request Path Parameters

ParameterTypeDescriptionDefaultRequired?
community-handleStringThe community handle, see Communities methodsNoneYes

Request Body Parameters

To join, the request must have one of the following:

  • The correct invite_hash,
  • or the community is free-to-join,
  • or the requesting user must have a pending invitation.
ParameterTypeDescriptionDefaultRequired?
invite_hashStringThe invite code/hashNoneNo

Response

200 OK on successful join.

Errors

  • 403 Forbidden with all the error codes from the "get info" endpoint, but also:
    • Error code 23003 if the community is already at capacity.
    • Error code 23015 if the pending invitation no longer exists or was already declined.
  • 400 Bad Request with error code 23014 if the given invite hash is invalid.
  • 429 Limit Exceeded when too many joins have happened too quickly. See note above.

DELETE /v2/communities/{community-handle}/members/{blog-identifier} - Remove a member

Remove another member from the community, if you have permission, or your own blog

Method

URIHTTP MethodAuthentication
api.tumblr.com/v2/communities/{community-handle}/members/{blog-identifier}DELETEOAuth

Request Path Parameters

ParameterTypeDescriptionDefaultRequired?
community-handleStringThe community handle, see Communities methodsNoneYes
blog-identifierStringThe blog to remove, see blog identifiersNoneYes

Request Body Parameters

ParameterTypeDescriptionDefaultRequired?
reasonStringThe reason for removing the member, see note belowNoneYes
noteStringWhy the member is being removed, max length 1,000 characters, see note belowNoneDepends
ban_userBooleanWhether to also ban the user permenantly from rejoiningfalseNo

The reason value can be:

  • community_guidelines for community guidelines violations.
  • off_topic if their content is off topic.
  • spam if their content is considered spam.
  • inappropriate_behavior for inappropriate behavior in the community.
  • tumblr_guidelines for violating Tumblr's user guidelines.
  • other for another reason -- this requires the "note" parameter to be used as well

Response

200 OK on success.

Errors

  • 403 Forbidden for anyone trying to do this who isn't an admin of the community, or not trying to remove their own blog
  • 400 Bad Request if an invalid reason is given, or if a note wasn't given when reason = 'other'

PUT /v2/communities/{community-handle}/members/{blog-identifier} - Change a member's role

Method

URIHTTP MethodAuthentication
api.tumblr.com/v2/communities/{community-handle}/members/{blog-identifier}PUTOAuth

Request Path Parameters

ParameterTypeDescriptionDefaultRequired?
community-handleStringThe community handle, see Communities methodsNoneYes
blog-identifierStringThe blog to change, see blog identifiersNoneYes

Request Body Parameters

ParameterTypeDescriptionDefaultRequired?
roleStringTheir new role, we currently support member, moderator, and adminNoneYes

Response

200 OK on success.

Errors

  • 400 Bad Request if you provided an invalid role, or are trying to demote yourself as the last admin.
  • 403 Forbidden for anyone trying to do this who isn't an admin of the community.

PUT /v2/communities/{community-handle}/invitations - Invite someone to the community

Admins can send invites at a maximum rate of 1 per second and 250 per day across all their communities.

Method

URIHTTP MethodAuthentication
api.tumblr.com/v2/communities/{community-handle}/invitationsPUTOAuth

Request Path Parameters

ParameterTypeDescriptionDefaultRequired?
community-handleStringThe community handle, see Communities methodsNoneYes

Request Body Parameters

ParameterTypeDescriptionDefaultRequired?
recipient_blogStringThe blog to invite, accepts any blog identifierNoneYes
messageStringA message to send with the invite, max length 100 charactersNoneNo

Response

200 OK on success.

Errors

  • 400 Bad Request if you're missing a receipient blog in the request.
    • with error code 5041 if the message is too long.
  • 403 Forbidden for anyone trying to do this who isn't an admin of the community. Various error codes:
    • 23003 if the community is at capacity already.
    • 23008 if the recipient blog, or its owner, has been banned from the community, or otherwise cannot join.
    • 23009 if the recipient blog is actually already a member.
    • 23011 if the recipient blog already has an invitation.
  • 429 Limit Exceeded if sending invites too fast. See note above.

Limits

Admins can send 250 invites per day, at a maximum rate of 1 per second, across all of their communities.

GET /v2/communities/{community-handle}/invitations - View pending invites

Method

URIHTTP MethodAuthentication
api.tumblr.com/v2/communities/{community-handle}/invitationsGETOAuth

Request Path Parameters

ParameterTypeDescriptionDefaultRequired?
community-handleStringThe community handle, see Communities methodsNoneYes

Response Query Parameters

ParameterTypeDescriptionDefaultRequired?
beforeNumberThe timestamp to use for the next page boundaryNoneNo

Response

200 OK on success.

The response will have a invitations array of invitations, sorted in reverse chronological order, each with fields:

  • sender -- a blog object representing who sent the invite.
  • recipient -- a blog object representing who was invited.
  • sent_on -- the unix timestamp of when the invite was sent.

If there are more than 20 invitations, a _links object alongside the invitations array will provide the next page info.

GET /v2/communities/{community-handle}/invitations/{blog-identifier} - Check invitation status

This allows you to check the invitation status for a specific blog recipient belonging to the current user.

Method

URIHTTP MethodAuthentication
api.tumblr.com/v2/communities/{community-handle}/invitations/{blog-identiifer}GETOAuth

Request Path Parameters

ParameterTypeDescriptionDefaultRequired?
community-handleStringThe community handle, see Communities methodsNoneYes
blog-identifierStringThe blog to check, see blog identifiersNoneYes

Response

200 OK on success, with a sender object with a name field indicating who sent the invite.

Errors

  • 404 Not Found if the given blog does not have an invitation to the community.

DELETE /v2/communities/{community-handle}/invitations/{blog-identifier} - Cancel an invitation

This allows an admin to cancel a pending invitation to a specific blog, and it allows a receipient of an invitation to decline the invite, and disallow future invitations.

Method

URIHTTP MethodAuthentication
api.tumblr.com/v2/communities/{community-handle}/invitations/{blog-identiifer}DELETEOAuth

Request Path Parameters

ParameterTypeDescriptionDefaultRequired?
community-handleStringThe community handle, see Communities methodsNoneYes
blog-identifierStringThe blog to cancel, see blog identifiersNoneYes

Response Query Parameters

ParameterTypeDescriptionDefaultRequired?
do_not_inviteBooleanWhether to disallow any future re-invitationsNoneNo

Response

200 OK on success.

POST /v2/communities/{community-handle}/invite_hash - Regenerate the invite URL

Allows admins to regenerate the invite URL with a new hash. Note that this invalidates the previous invite link.

Method

URIHTTP MethodAuthentication
api.tumblr.com/v2/communities/{community-handle}/invite_hashPOSTOAuth

Request Path Parameters

ParameterTypeDescriptionDefaultRequired?
community-handleStringThe community handle, see Communities methodsNoneYes

Response

200 OK on success, with a invite_link field containing the new invite link.

Errors

  • 403 Forbidden with error code 23017 if invite links have been disabled for the community.
    • ... or error code 23012 if the user trying to regenerate the link is not allowed to do so.

PUT /v2/communities/{community-handle}/posts/{post-id}/reactions - Add reaction to post

React to a specific post in a community.

Method

URIHTTP MethodAuthentication
api.tumblr.com/v2/communities/{community-handle}/posts/{post-id}/reactionsPUTOAuth

Request Path Parameters

ParameterTypeDescriptionDefaultRequired?
community-handleStringThe community handle, see Communities methodsNoneYes
post-idString/NumberThe post ID to react toNoneYes

Request Body Parameters

The client must supply one of these two body parameters, and slug will take precedence if both are provided:

ParameterTypeDescription
slugStringA specific slug to use, i.e. :thumbs_up:
graphemeStringA unicode emoji to use, i.e. 👍

When using grapheme, we'll make a best effort to use that specific unicode character, if we support it.

Response

200 OK on successful save. The API may return a timeline response with a celebration banner on the first reaction used, or nothing.

Errors

  • 400 Bad Request with subcode 22001 - when the post has reached its overall reaction limit.
  • 400 Bad Request with subcode 22002 - when the current user has reached their reaction limit on this post.
  • 403 Forbidden with subcode 23002 - when you're trying to react to a post in a community you're not a member of.

DELETE /v2/communities/{community-handle}/posts/{post-id}/reactions/{reaction-id} - Remove reaction from post

Remove your reaction from a specific post in a community.

Method

URIHTTP MethodAuthentication
api.tumblr.com/v2/communities/{community-handle}/posts/{post-id}/reactions/{reaction-id}DELETEOAuth

Request Path Parameters

ParameterTypeDescriptionDefaultRequired?
community-handleStringThe community handle, see Communities methodsNoneYes
post-idString/NumberThe post ID to remove a reaction fromNoneYes
reaction-idStringThe unique identifier of the reaction to remove, or its graphemeNoneYes

Response

200 OK on successful removal.

PUT /v2/communities/{community-handle}/mute - Mute a community

Mute the community. Note that this only hides the unread count right now.

Method

URIHTTP MethodAuthentication
api.tumblr.com/v2/communities/{community-handle}/mutePUTOAuth

Request Path Parameters

ParameterTypeDescriptionDefaultRequired?
community-handleStringThe community handle, see Communities methodsNoneYes

Response

200 OK on successful save.

Errors

  • 403 Forbidden when you're trying to mute a community you're not a member of.

DELETE /v2/communities/{community-handle}/mute - Unmute a community

Method

URIHTTP MethodAuthentication
api.tumblr.com/v2/communities/{community-handle}/muteDELETEOAuth

Request Path Parameters

ParameterTypeDescriptionDefaultRequired?
community-handleStringThe community handle, see Communities methodsNoneYes

Response

200 OK on successful save.

Errors

  • 403 Forbidden when you're trying to unmute a community you're not a member of.

Note that these docs are generated from our public documentation on Github.