What this endpoint helps with
The response includes public Blog data and context needed for subsequent API requests.
When to use it
Use this method when an input identifier or parameter is known and one predictable API result is required.
Retrieve Blog data from Tumblr through the focused “Posts by blog identifier” operation and connect it to product workflows.
Use this method when an input identifier or parameter is known and one predictable API result is required.
Review the result and common workflows first, then move to parameters and a working request example.
The response includes public Blog data and context needed for subsequent API requests.
Use this method when an input identifier or parameter is known and one predictable API result is required.
Request the object you need without loading a larger collection.
Add the Tumblr API result to records, workflows, and internal tools.
Use the response as input for adjacent methods and multi-step workflows.
Both versions solve the same job and accept the same parameters. Use the switch to compare the response structure and choose the version your client expects.
Switch versions on this page to compare response structures while keeping the same documentation URL.
Authentication, required parameters, and the request shape stay the same across V1 and V2. In practice, you choose the version when you build the endpoint path and when you parse the response.
The main difference is the response envelope. Use V2 for new integrations and keep V1 only when you need compatibility with an existing client contract.
Use the same API key header and the same query parameters for both versions. This documentation shows the shared parameter set first, then version-specific endpoint paths and code snippets.
| Parameter | Required | Type | Example | Description |
|---|---|---|---|---|
blog_identifier |
Yes | str |
staff |
Tumblr blog username or host without protocol or path. Pass `staff` or `staff.tumblr.com`, not a full URL. Example: staff. |
cursor |
No | str | None |
opaque-cursor-next-page |
Next-page cursor returned by the previous response. Omit it for the first page. |
post_type |
No | all | regular | photo | quote | link | conversation | audio | video | answer |
all |
Optional Tumblr post type filter. Use `all` for the default mixed timeline. Examples: all, photo. |
tag |
No | str | None |
tumblr staff |
Optional Tumblr tag filter. Spaces are allowed, slashes and URL fragments are not. Example: tumblr staff. |
Choose a version when you copy the exact endpoint path, example URL, and code snippet. The parameter list above stays the same.
GET /api/v2/tumblr.com/blog/posts-by-blog-identifiercurl --request GET \
--url "https://www.scrapestorm.net/api/v2/tumblr.com/blog/posts-by-blog-identifier" \
--header "X-API-Key: 00000000-0000-4000-8000-000000000000" \
--get --data-urlencode 'blog_identifier=staff' \
# Optional parameters:
# --data-urlencode 'cursor=opaque-cursor-next-page'
# --data-urlencode 'post_type=all'
# --data-urlencode 'tag=tumblr staff'
from urllib.parse import urljoin
import requests
BASE_URL = "https://www.scrapestorm.net"
ENDPOINT = "/api/v2/tumblr.com/blog/posts-by-blog-identifier"
HEADERS = {"Accept": "application/json", "X-API-Key": "00000000-0000-4000-8000-000000000000"}
params = {
"blog_identifier": "staff",
}
# Optional parameters
# params["cursor"] = "opaque-cursor-next-page"
# params["post_type"] = "all"
# params["tag"] = "tumblr staff"
with requests.Session() as session:
response = session.request(
method="GET",
url=urljoin(BASE_URL, ENDPOINT),
headers=HEADERS,
params=params,
timeout=30,
)
response.raise_for_status()
payload = response.json()
print(payload)
const BASE_URL = "https://www.scrapestorm.net";
const endpoint = "/api/v2/tumblr.com/blog/posts-by-blog-identifier";
const params = new URLSearchParams({
blog_identifier: "staff",
});
// Optional parameters
// params.set("cursor", "opaque-cursor-next-page");
// params.set("post_type", "all");
// params.set("tag", "tumblr staff");
const response = await fetch(`${BASE_URL}${endpoint}?${params.toString()}`, {
method: "GET",
headers: {
Accept: "application/json",
"X-API-Key": "00000000-0000-4000-8000-000000000000",
},
});
if (!response.ok) {
throw new Error(`Request failed: ${response.status} ${response.statusText}`);
}
const payload = await response.json();
console.log(payload);
import axios from "axios";
const client = axios.create({
baseURL: "https://www.scrapestorm.net",
timeout: 30000,
headers: {
Accept: "application/json",
"X-API-Key": "00000000-0000-4000-8000-000000000000",
},
});
const params = {
blog_identifier: "staff",
};
// Optional parameters
// params.cursor = "opaque-cursor-next-page";
// params.post_type = "all";
// params.tag = "tumblr staff";
const { data: payload } = await client.request({
method: "GET",
url: endpoint,
params,
});
console.log(payload);
<?php
declare(strict_types=1);
use GuzzleHttp\Client;
use GuzzleHttp\Exception\GuzzleException;
$client = new Client([
'base_uri' => "https://www.scrapestorm.net",
'timeout' => 30.0,
'headers' => [
'Accept' => 'application/json',
'X-API-Key' => "00000000-0000-4000-8000-000000000000",
],
]);
$query = [
"blog_identifier" => "staff",
];
// Optional parameters
// $query["cursor"] = "opaque-cursor-next-page";
// $query["post_type"] = "all";
// $query["tag"] = "tumblr staff";
try {
$response = $client->request("GET", "/api/v2/tumblr.com/blog/posts-by-blog-identifier", [
'query' => $query,
]);
$payload = json_decode(
(string) $response->getBody(),
true,
512,
JSON_THROW_ON_ERROR
);
var_dump($payload);
} catch (GuzzleException $e) {
throw $e;
}
package main
import (
"encoding/json"
"fmt"
"net/http"
"net/url"
"time"
)
func main() {
baseURL := "https://www.scrapestorm.net"
endpoint := "/api/v2/tumblr.com/blog/posts-by-blog-identifier"
params := url.Values{}
params.Set("blog_identifier", "staff")
// Optional parameters
// params.Set("tag", "tumblr staff")
req, err := http.NewRequest(
"GET",
fmt.Sprintf("%s%s?%s", baseURL, endpoint, params.Encode()),
nil,
)
if err != nil {
panic(err)
}
req.Header.Set("Accept", "application/json")
req.Header.Set("X-API-Key", "00000000-0000-4000-8000-000000000000")
client := &http.Client{Timeout: 30 * time.Second}
resp, err := client.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
var payload any
if err := json.NewDecoder(resp.Body).Decode(&payload); err != nil {
panic(err)
}
fmt.Printf("%+v\n", payload)
}
Choose a version when you copy the exact endpoint path, example URL, and code snippet. The parameter list above stays the same.
GET /api/v1/tumblr.com/blog/posts-by-blog-identifiercurl --request GET \
--url "https://www.scrapestorm.net/api/v1/tumblr.com/blog/posts-by-blog-identifier" \
--header "X-API-Key: 00000000-0000-4000-8000-000000000000" \
--get --data-urlencode 'blog_identifier=staff' \
# Optional parameters:
# --data-urlencode 'cursor=opaque-cursor-next-page'
# --data-urlencode 'post_type=all'
# --data-urlencode 'tag=tumblr staff'
from urllib.parse import urljoin
import requests
BASE_URL = "https://www.scrapestorm.net"
ENDPOINT = "/api/v1/tumblr.com/blog/posts-by-blog-identifier"
HEADERS = {"Accept": "application/json", "X-API-Key": "00000000-0000-4000-8000-000000000000"}
params = {
"blog_identifier": "staff",
}
# Optional parameters
# params["cursor"] = "opaque-cursor-next-page"
# params["post_type"] = "all"
# params["tag"] = "tumblr staff"
with requests.Session() as session:
response = session.request(
method="GET",
url=urljoin(BASE_URL, ENDPOINT),
headers=HEADERS,
params=params,
timeout=30,
)
response.raise_for_status()
payload = response.json()
print(payload)
const BASE_URL = "https://www.scrapestorm.net";
const endpoint = "/api/v1/tumblr.com/blog/posts-by-blog-identifier";
const params = new URLSearchParams({
blog_identifier: "staff",
});
// Optional parameters
// params.set("cursor", "opaque-cursor-next-page");
// params.set("post_type", "all");
// params.set("tag", "tumblr staff");
const response = await fetch(`${BASE_URL}${endpoint}?${params.toString()}`, {
method: "GET",
headers: {
Accept: "application/json",
"X-API-Key": "00000000-0000-4000-8000-000000000000",
},
});
if (!response.ok) {
throw new Error(`Request failed: ${response.status} ${response.statusText}`);
}
const payload = await response.json();
console.log(payload);
import axios from "axios";
const client = axios.create({
baseURL: "https://www.scrapestorm.net",
timeout: 30000,
headers: {
Accept: "application/json",
"X-API-Key": "00000000-0000-4000-8000-000000000000",
},
});
const params = {
blog_identifier: "staff",
};
// Optional parameters
// params.cursor = "opaque-cursor-next-page";
// params.post_type = "all";
// params.tag = "tumblr staff";
const { data: payload } = await client.request({
method: "GET",
url: endpoint,
params,
});
console.log(payload);
<?php
declare(strict_types=1);
use GuzzleHttp\Client;
use GuzzleHttp\Exception\GuzzleException;
$client = new Client([
'base_uri' => "https://www.scrapestorm.net",
'timeout' => 30.0,
'headers' => [
'Accept' => 'application/json',
'X-API-Key' => "00000000-0000-4000-8000-000000000000",
],
]);
$query = [
"blog_identifier" => "staff",
];
// Optional parameters
// $query["cursor"] = "opaque-cursor-next-page";
// $query["post_type"] = "all";
// $query["tag"] = "tumblr staff";
try {
$response = $client->request("GET", "/api/v1/tumblr.com/blog/posts-by-blog-identifier", [
'query' => $query,
]);
$payload = json_decode(
(string) $response->getBody(),
true,
512,
JSON_THROW_ON_ERROR
);
var_dump($payload);
} catch (GuzzleException $e) {
throw $e;
}
package main
import (
"encoding/json"
"fmt"
"net/http"
"net/url"
"time"
)
func main() {
baseURL := "https://www.scrapestorm.net"
endpoint := "/api/v1/tumblr.com/blog/posts-by-blog-identifier"
params := url.Values{}
params.Set("blog_identifier", "staff")
// Optional parameters
// params.Set("tag", "tumblr staff")
req, err := http.NewRequest(
"GET",
fmt.Sprintf("%s%s?%s", baseURL, endpoint, params.Encode()),
nil,
)
if err != nil {
panic(err)
}
req.Header.Set("Accept", "application/json")
req.Header.Set("X-API-Key", "00000000-0000-4000-8000-000000000000")
client := &http.Client{Timeout: 30 * time.Second}
resp, err := client.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
var payload any
if err := json.NewDecoder(resp.Body).Decode(&payload); err != nil {
panic(err)
}
fmt.Printf("%+v\n", payload)
}
The preview keeps key fields and the first collection items so you can scan the response shape quickly. Switching versions changes the JSON format.
This compact JSON example comes from the latest successful verification run for V2.
{
"success": true,
"status": "ok",
"pagination": {
"cursor": null,
"has_more": false
},
"search_context": {
"blog_identifier": "staff",
"post_type": "all",
"tag": "tumblr staff"
},
"data": {
"blog": {
"url": "https://staff.tumblr.com",
"blog_identifier": "staff.tumblr.com",
"uuid": "t:0aY0xL2Fi1OFJg4YxpmegQ",
"username": "staff",
"display_name": "Tumblr Staff",
"description": null,
"emails": [],
"external_links": [],
"rss_url": null,
"timezone": "US/Eastern",
"is_custom_domain": false,
"avatar_url": "https://example.com/image.jpg",
"avatar_urls": "https://example.com/image.jpg"
},
"posts": {
"count": 1,
"total_count": 1,
"items": [
{
"url": "https://staff.tumblr.com/post/813992302192263168/a-note-from-the-tumblr-team",
"post_id": "813992302192263168",
"title": null,
"summary": "A note from the Tumblr team A few weeks ago, a small but higher-than-normal number of accounts were mistakenly suspended. The suspensions were quickly reversed, but our response…",
"hashtags": [],
"emails": [],
"body_html": "<h2><b>A note from the Tumblr team</b></h2><p>A few weeks ago, a small but higher-than-normal number of accounts were mistakenly suspended. The suspensions were quickly reversed…",
"blog_username": "staff",
"blog_display_name": "Tumblr Staff",
"blog_url": "https://staff.tumblr.com",
"blog_avatar_url": "https://example.com/image.jpg",
"blog_avatar_urls": "https://example.com/image.jpg",
"published_at": "2026-04-15T20:05:52Z",
"note_count": 46265,
"type": "regular",
"slug": "a-note-from-the-tumblr-team",
"tags": [
"tumblr staff"
],
"reblogged_from": null,
"reblogged_root": null,
"media": []
}
]
}
}
}
This compact JSON example comes from the latest successful verification run for V1.
{
"success": true,
"status": "ok",
"pagination": {
"cursor": null,
"has_more": false
},
"search_context": {
"post_type": "all",
"tag": "tumblr staff",
"blog_identifier": "staff"
},
"data": {
"tumblelog": {
"name": "staff",
"title": "Tumblr Staff",
"description": "",
"url": "https://staff.tumblr.com",
"feeds": [
"https://staff.tumblr.com/rss"
]
},
"posts-start": 0,
"posts-total": 20,
"posts-type": false,
"posts": [
{
"id": "828009069026721792",
"type": "regular",
"url-with-slug": "https://staff.tumblr.com/post/828009069026721792",
"slug": null,
"regular-title": "Premium just got better",
"regular-body": "<div class=\"npf_row\"><figure class=\"tmblr-full\" data-orig-height=\"500\" data-orig-width=\"1080\"><img src=\"https://64.media.tumblr.com/8b352dd852517abad49b7b3aeae47ac1/0401186cfa31…",
"unix-timestamp": 1789650982,
"tumblelog": {
"name": "staff",
"title": "Tumblr Staff",
"url": "https://staff.tumblr.com/"
},
"tags": [
"tumblr premium",
"new features"
]
},
{
"id": "822057428507049984",
"type": "regular",
"url-with-slug": "https://staff.tumblr.com/post/822057428507049984",
"slug": null,
"regular-title": "In case you’re looking for a blog that’s gone missing on Tumblr and didn’t see this recent update.",
"regular-body": "<p><a class=\"tumblr_blog\" href=\"https://changes.tumblr.com/post/818409292753436672/deleted-accounts-can-now-be-recovered-up-to-30\">changes</a>:</p><blockquote><h1>Deleted accoun…",
"unix-timestamp": 1783975056,
"tumblelog": {
"name": "staff",
"title": "Tumblr Staff",
"url": "https://staff.tumblr.com/"
},
"tags": [
"tumblr"
]
},
{
"_more_items": 18
}
],
"pagination": {
"cursor": null,
"has_more": false
}
}
}
Use this documentation as the first decision point, then move into pricing, platform coverage, and integration rules before you connect the endpoint for recurring use.
Use these answers to decide whether this API method fits your workflow, versioning choice, and rollout plan.
The method performs “Posts by blog identifier” for Blog. The compact response example below shows the exact field structure.
Choose V2 for new integrations because it provides a normalized structure. Use V1 only for compatibility with clients that already consume the platform-native format.
Create an API key, send it in the request header, and provide the required parameters from the table. The code samples already contain the correct path and request structure.