theKrew APIthekrew.ai ↗
Access theKrew.ai website content via 6 endpoints. Retrieve blog posts, case studies, FAQs, and page metadata including JSON-LD, Open Graph, and full text.
What is the theKrew API?
The theKrew.ai API exposes 6 endpoints covering the full content of thekrew.ai, including 118+ indexed pages, blog posts with category metadata, case studies, and structured FAQ sections. Use list_pages to retrieve every URL with last-modified dates and priority values, or get_blog_post to fetch a single article's full text, read time, author, and publication dates directly.
No input parameters required.
curl -X GET 'https://api.parse.bot/scraper/7e946b30-46d5-44dd-a12b-a1ed3239b09d/list_pages' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace thekrew-ai-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""
theKrew.ai Website Content API Client
Get your API key from: https://parse.bot/settings
"""
import os
import requests
from typing import Optional, Dict, Any, List
class ParseClient:
"""Client for theKrew.ai Website Content API"""
def __init__(self, api_key: Optional[str] = None):
self.base_url = "https://api.parse.bot"
self.scraper_id = "7e946b30-46d5-44dd-a12b-a1ed3239b09d"
self.api_key = api_key or os.getenv("PARSE_API_KEY")
if not self.api_key:
raise ValueError("API key not provided. Set PARSE_API_KEY environment variable or pass it as argument.")
def _call(self, endpoint: str, method: str = "POST", **params) -> Dict[str, Any]:
"""Make API call to Parse bot"""
url = f"{self.base_url}/scraper/{self.scraper_id}/{endpoint}"
headers = {
"X-API-Key": self.api_key,
"Content-Type": "application/json"
}
if method == "GET":
response = requests.get(url, headers=headers, params=params)
elif method == "POST":
response = requests.post(url, headers=headers, json=params)
else:
raise ValueError(f"Unsupported method: {method}")
response.raise_for_status()
return response.json()
def list_pages(self) -> Dict[str, Any]:
"""List all pages on thekrew.ai from the sitemap.
Returns:
Dictionary with total page count and list of page objects containing
url, path, last_modified, and priority fields.
"""
return self._call("list_pages", method="GET")
def get_page(self, path: str = "/") -> Dict[str, Any]:
"""Get the full content of a page by its path.
Args:
path: URL path of the page (e.g., '/pricing/', '/about/').
Defaults to homepage.
Returns:
Dictionary with page metadata (title, description, keywords, og_data,
structured_data) and full text content.
"""
return self._call("get_page", method="GET", path=path)
def list_blog_posts(self, category: Optional[str] = None) -> Dict[str, Any]:
"""List all blog posts with metadata.
Args:
category: Optional filter by category (case-insensitive partial match).
Known categories: AI for Business, Growth Strategy, Founder Lessons,
Behind the Build, Business Growth, Team Efficiency.
Returns:
Dictionary with total post count and list of blog post objects containing
slug, title, category, read_time, excerpt, date, and url.
"""
params = {}
if category:
params["category"] = category
return self._call("list_blog_posts", method="GET", **params)
def get_blog_post(self, slug: str) -> Dict[str, Any]:
"""Get the full content of a blog post by its slug.
Args:
slug: Blog post slug from the URL (e.g., 'ai-content-marketing-drives-sales').
Returns:
Dictionary with blog post metadata (title, description, keywords, read_time,
article_meta with author and dates) and full text content.
"""
return self._call("get_blog_post", method="GET", slug=slug)
def list_case_studies(self) -> Dict[str, Any]:
"""List all case studies with titles and subtitles.
Returns:
Dictionary with total case study count and list of case study objects
containing slug, title, subtitle, and url.
"""
return self._call("list_case_studies", method="GET")
def get_faq(self) -> Dict[str, Any]:
"""Get all FAQ content organized by section.
Returns:
Dictionary with total sections and questions count, plus sections array
where each section contains section name and questions with answers.
"""
return self._call("get_faq", method="GET")
def main():
"""Practical workflow example: Research blog posts by category and compile insights"""
# Initialize client
client = ParseClient()
print("=" * 70)
print("theKrew.ai Content Analysis - Blog Posts by Category")
print("=" * 70)
# Step 1: Get all blog posts to understand available categories
print("\n1. Fetching all blog posts...")
all_posts_response = client.list_blog_posts()
total_posts = all_posts_response.get("total", 0)
all_posts = all_posts_response.get("posts", [])
print(f" Found {total_posts} total blog posts")
# Step 2: Extract unique categories
categories = set()
for post in all_posts:
if post.get("category"):
categories.add(post["category"])
print(f" Categories found: {', '.join(sorted(categories))}")
# Step 3: Filter and analyze posts from "AI for Business" category
print("\n2. Analyzing 'AI for Business' category posts...")
business_posts_response = client.list_blog_posts(category="AI for Business")
business_posts = business_posts_response.get("posts", [])
print(f" Found {len(business_posts)} posts in this category")
# Step 4: Get detailed content for first 2 posts and extract key insights
print("\n3. Fetching detailed content for sample posts...")
sample_insights = []
for i, post in enumerate(business_posts[:2]):
slug = post.get("slug")
print(f"\n Post {i+1}: {post.get('title')}")
print(f" Date: {post.get('date')} | Read time: {post.get('read_time')}")
print(f" Excerpt: {post.get('excerpt', 'N/A')[:100]}...")
# Get full blog post content
full_post = client.get_blog_post(slug=slug)
# Extract author info
article_meta = full_post.get("article_meta", {})
author = article_meta.get("author", "Unknown")
# Get first 150 chars of content for snippet
content = full_post.get("content", "")
content_snippet = content[:150].replace('\n', ' ') + "..." if len(content) > 150 else content
insight = {
"title": post.get("title"),
"author": author,
"date": article_meta.get("date_published"),
"read_time": post.get("read_time"),
"content_preview": content_snippet
}
sample_insights.append(insight)
# Step 5: Get FAQ information for context about the platform
print("\n4. Fetching FAQ sections...")
faq_response = client.get_faq()
total_sections = faq_response.get("total_sections", 0)
total_questions = faq_response.get("total_questions", 0)
print(f" Found {total_sections} FAQ sections with {total_questions} total questions")
# Display first question from each section for overview
sections = faq_response.get("sections", [])
for section in sections[:3]:
section_name = section.get("section", "")
questions = section.get("questions", [])
if questions:
first_q = questions[0].get("question", "")
print(f" • {section_name}: {first_q}")
# Step 6: Get homepage content for overall platform understanding
print("\n5. Fetching homepage content for platform overview...")
homepage = client.get_page(path="/")
homepage_title = homepage.get("title", "")
homepage_desc = homepage.get("description", "")
print(f" Title: {homepage_title}")
print(f" Description: {homepage_desc[:120]}...")
# Final summary
print("\n" + "=" * 70)
print("ANALYSIS SUMMARY")
print("=" * 70)
print(f"✓ Blog Posts Analyzed: {len(sample_insights)} detailed articles reviewed")
print(f"✓ Categories Explored: {', '.join(sorted(categories))}")
print(f"✓ FAQ Coverage: {total_questions} questions across {total_sections} sections")
print(f"✓ Platform Pages: {total_posts + 85} total pages available")
print("\nSample Blog Post Authors:")
for insight in sample_insights:
print(f" • {insight['author']} - '{insight['title'][:50]}...'")
print("\n" + "=" * 70)
if __name__ == "__main__":
main()List all pages on thekrew.ai from the sitemap. Returns URLs, paths, last modified dates, and priority values for all 118+ pages including blog posts, case studies, playbooks, and static pages.
No input parameters required.
{
"type": "object",
"fields": {
"pages": "array of page objects with url, path, last_modified, priority",
"total": "integer"
},
"sample": {
"pages": [
{
"url": "https://thekrew.ai/",
"path": "/",
"priority": 1,
"last_modified": "2026-06-08"
},
{
"url": "https://thekrew.ai/blog/",
"path": "/blog/",
"priority": 0.8,
"last_modified": "2026-06-08"
}
],
"total": 118
}
}About the theKrew API
Page and Blog Content
list_pages returns every URL on thekrew.ai sourced from the sitemap — each entry includes url, path, last_modified, and priority, with a total count of 118+ pages. get_page accepts any path (e.g. /pricing/, /about/, /how-it-works/) and returns title, content, description, keywords, og_data, and a structured_data array of JSON-LD objects. This makes it straightforward to pull Open Graph metadata or schema.org markup for any page on the site without traversing them individually.
Blog Posts and Case Studies
list_blog_posts returns post summaries including title, category, excerpt, read time, and date. An optional category parameter filters results by a case-insensitive partial match against known categories like AI for Business and Growth Strategy. get_blog_post takes a slug (e.g. ai-content-marketing-drives-sales) and returns the full article text alongside article_meta — a structured object with headline, date_published, date_modified, author, and author_url. list_case_studies returns titles, subtitles describing the business type and location, and URLs for all available case studies.
FAQ Data
get_faq returns all FAQ content grouped into named sections such as "Getting started", "How theKrew works", "Control and safety", "Pricing and billing", and "For tech-savvy users". Each section object contains a questions array, and the response also provides total_sections and total_questions counts for quick validation.
The theKrew API is a managed, monitored endpoint for thekrew.ai — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when thekrew.ai changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official thekrew.ai API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Build a content aggregator that surfaces theKrew.ai blog posts filtered by category using
list_blog_postswith thecategoryparameter - Populate a knowledge base with FAQ content from
get_faq, organized by the returned section names - Index all 118+ site pages for search by iterating
list_pagesresults and fetching full text withget_page - Extract JSON-LD structured data from any page via the
structured_datafield returned byget_page - Display a case study directory by mapping titles and subtitles from
list_case_studies - Track content freshness across the site using
last_modifieddates fromlist_pages - Pull article authorship and publication dates from
article_metainget_blog_postfor citation or content audits
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 100 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
One credit = one API call regardless of which marketplace API you call. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does theKrew.ai have an official developer API?+
What does `get_blog_post` return beyond the article text?+
get_blog_post returns title, description, keywords, read_time, the full content string, and an article_meta object containing headline, date_published, date_modified, author, and author_url. The slug parameter is required and must match a valid blog post slug.Can I get the full text of case studies, not just their listing metadata?+
list_case_studies returns titles, subtitles, and URLs for all case studies, but does not return full case study body text directly. You can pass a case study path to get_page to retrieve its full content. If you need a dedicated get_case_study endpoint with structured fields, you can fork this API on Parse and revise it to add that endpoint.Does `list_blog_posts` support pagination or a limit parameter?+
total count. Pagination and per-page limits are not currently supported. The API covers all posts available from the blog listing page combined with sitemap entries. You can fork it on Parse and revise to add offset or limit parameters.How current is the page data returned by `list_pages`?+
last_modified field sourced from the sitemap, so you can compare timestamps to detect stale entries. However, the API does not expose a separate refresh timestamp or guarantee a specific update cadence for the underlying data.