List Posts
GET
/api/v1/content/postsOverview
Returns a paginated list of published blog posts for the resolved client site. Supports filtering by tag and category.
Authentication
info
No authentication required - Client is resolved from the X-Content-Domain header, which the Cloudflare Worker sets automatically based on the request domain.
Headers
| Header | Type | Required | Description |
|---|---|---|---|
X-Content-Domain | string | Yes | The domain used to resolve the client tenant. Automatically set by the CF Worker; set manually for external frontend integrations (WeWeb, Webflow, custom). |
Query Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
page | integer | 1 | Page number for pagination |
page_size | integer | 20 | Number of posts per page |
tag | string | - | Filter posts by tag name |
category | string | - | Filter posts by category name or UUID |
Response
postsarrayArray of published post objects
posts[].idstring (UUID)Unique post identifier
posts[].slugstringURL-friendly slug
posts[].titlestringPost title
posts[].excerptstringShort excerpt / summary
posts[].cover_image_urlstring | nullURL of the cover image
posts[].statusstringAlways published for this endpoint
posts[].published_atstringISO 8601 publication timestamp
posts[].author_namestringAuthor display name (flat field)
posts[].author_idstring (UUID)Author identifier
posts[].authorobjectNested author object with id, full_name, slug, avatar_url
posts[].reading_timeintegerEstimated reading time in minutes
posts[].view_countintegerTotal view count
posts[].is_featuredbooleanWhether the post is featured
posts[].tagsstring[]Array of tag names
totalintegerTotal number of matching posts
pageintegerCurrent page number
page_sizeintegerNumber of posts per page
Example Request
- cURL
- Python
- JavaScript
curl -s "https://spideriq.ai/api/v1/content/posts?page=1&page_size=10&tag=seo" \
-H "X-Content-Domain: your-domain.com"
import requests
resp = requests.get(
"https://spideriq.ai/api/v1/content/posts",
params={"page": 1, "page_size": 10, "tag": "seo"},
headers={"X-Content-Domain": "your-domain.com"}
)
data = resp.json()
for post in data["posts"]:
print(f"{post['title']} — {post['published_at']}")
print(f"Total: {data['total']}")
const resp = await fetch(
"https://spideriq.ai/api/v1/content/posts?page=1&page_size=10&tag=seo",
{ headers: { "X-Content-Domain": "your-domain.com" } }
);
const data = await resp.json();
data.posts.forEach(post => {
console.log(`${post.title} — ${post.published_at}`);
});
Example Response
{
"posts": [
{
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"slug": "how-to-scrape-google-maps",
"title": "How to Scrape Google Maps at Scale",
"excerpt": "A step-by-step guide to extracting business data from Google Maps using SpiderIQ.",
"cover_image_url": "https://cdn.spideriq.ai/blog/maps-guide-cover.webp",
"status": "published",
"published_at": "2026-03-15T09:00:00Z",
"author_name": "Martin Shein",
"author_id": "f1e2d3c4-b5a6-7890-abcd-ef1234567890",
"author": {
"id": "f1e2d3c4-b5a6-7890-abcd-ef1234567890",
"full_name": "Martin Shein",
"slug": "martin-shein",
"avatar_url": "https://cdn.spideriq.ai/authors/martin.webp"
},
"reading_time": 8,
"view_count": 1243,
"is_featured": true,
"tags": ["google-maps", "scraping", "seo"]
}
],
"total": 1,
"page": 1,
"page_size": 10
}
Status Codes
| Status Code | Meaning | Description |
|---|---|---|
| 200 | OK | Posts returned successfully |
| 422 | Unprocessable Entity | Invalid query parameters |