Salesforce APItrailhead.salesforce.com ↗
Search and read public questions from the Salesforce Trailblazer Community feed, including author profiles, answers, topics, and hashtags via 3 structured endpoints.
What is the Salesforce API?
The Salesforce Trailblazer Community API exposes 3 endpoints for reading public questions, answers, and topic filters from the Trailblazer Community feed at trailhead.salesforce.com. The search_questions endpoint lets you filter by free-text query, topic, and answer status with cursor-based pagination, while get_question returns a full thread — up to 250 answers — alongside each author's real name, company, job title, role, and location.
curl -X GET 'https://api.parse.bot/scraper/28f7279c-bc0c-4efc-8326-c9172b892fc5/search_questions?sort=recent_activity&query=flow&topic_id=0TO4S000000c4vdWAA&answer_status=all' \ -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 trailhead-salesforce-com-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.
"""Walkthrough: Salesforce Trailblazer Community Questions — browse topics, search, drill into answers."""
from parse_apis.trailhead_salesforce_com_api import (
Trailhead, FeedSort, AnswerStatus, InputNotFound,
)
client = Trailhead()
# Browse featured topic categories and pick the first topic from each.
for cat in client.topic_categories.list(limit=3):
print(cat.category)
for topic in cat.topics[:3]:
print(f" {topic.name} ({topic.id})")
# Search unanswered questions, newest first — cap at 5 total items.
for q in client.question_summaries.search(
sort=FeedSort.CREATED_DATE,
answer_status=AnswerStatus.UNANSWERED,
limit=5,
):
print(q.title, f"by {q.author.name} at {q.author.company}")
# Drill from a search hit into the full question with all answers.
hit = client.question_summaries.search(query="flow error", limit=1).first()
if hit is not None:
detail = hit.details()
print(detail.title, f"— {detail.answer_count} answers")
for ans in detail.answers[:3]:
print(f" {ans.author.name}: {ans.body[:100]}")
# Point-lookup by an id discovered from the search above.
if hit is not None:
try:
question = client.questions.get(id=hit.id)
print(question.title, question.posted_in.name)
except InputNotFound:
print("Question was deleted")
print("exercised: topic_categories.list / question_summaries.search / details / questions.get")
Returns one page of public questions from the Trailblazer Community feed, newest first. Each row is one question with its title, plain-text body, hashtags, the topic or group it was posted in, answer count, best-answer id, and the author's public profile (real name, company, job title, role, state/country, ambassador flag). Filters: free-text search over question text, answer status, sort order, and an optional topic restriction (topic ids come from list_topics). One upstream call per page. Pagination is cursor based: pass next_cursor from a previous response as cursor to fetch the following page; omit cursor for the first page. limit is clamped to 50. Author fields other than name/company are null when the poster has not filled in their profile. An empty questions array with has_more=false is a valid result for a narrow search.
| Param | Type | Description |
|---|---|---|
| sort | string | Ordering of results (the feed's Sort dropdown). |
| limit | integer | Number of questions per page; values above 50 are clamped to 50. |
| query | string | Free-text search over question titles and bodies (e.g. 'flow error'). Omitted = no text filter. |
| cursor | string | Opaque continuation token from a previous response's next_cursor. Omit for the first page. |
| topic_id | string | Restrict to questions posted in one community topic; use an id from list_topics.categories[*].topics[*].id. Omitted = all topics and groups. An unknown id returns a not-found error. |
| answer_status | string | Restrict to questions by answer state (the feed's Answer Status dropdown). |
{
"type": "object",
"fields": {
"count": "number of questions in this page",
"has_more": "true when another page exists",
"questions": "array of question objects: id, type, url, title, body (plain text), hashtags (array of topic names), created_at/last_modified_at (ISO 8601 UTC), likes, answer_count, best_answer_id (null when none accepted), posted_in {id, type TOPIC|GROUP, name, url}, author {id, name, profile_url, company, job_title, role, location_state, location_country, is_forum_ambassador}",
"next_cursor": "cursor for the next page, null when has_more is false"
},
"sample": {
"data": {
"count": 1,
"has_more": true,
"questions": [
{
"id": "0D5KX00000jAT7R0AW",
"url": "https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000jAT7R0AW",
"body": "I facilitate a community group in the Trailblazer Community. Is there an option to move it Salesforce hosted Slack community?",
"type": "QUESTION",
"likes": 0,
"title": "Moving a trailblazer group to slack?",
"author": {
"id": "0053A00000CBP8OQAX",
"name": "Roy Moore",
"role": "Architect",
"company": "Compassion International",
"job_title": "Salesforce Guy",
"profile_url": "https://trailblazers.salesforce.com/profileView?u=0053A00000CBP8OQAX",
"location_state": "Colorado",
"location_country": "United States",
"is_forum_ambassador": false
},
"hashtags": [
"Slack Community",
"Slack"
],
"posted_in": {
"id": "0TO30000000Dt7IGAS",
"url": "https://trailhead.salesforce.com/trailblazer-community/topics/slackcommunity",
"name": "Slack Community",
"type": "TOPIC"
},
"created_at": "2026-09-11T17:20:03.000Z",
"answer_count": 0,
"best_answer_id": null,
"last_modified_at": "2026-09-11T17:20:03.000Z"
}
],
"next_cursor": "MjAyNi0wOS0xMVQxNzoyMDowM1osMEQ1S1gwMDAwMGpBVDdSMEFXLCw0LA"
},
"status": "success"
}
}About the Salesforce API
What the API Returns
The search_questions endpoint returns up to 50 questions per page, ordered by the feed's native sort order. Each question object includes id, title, body (plain text), hashtags (an array of tagged topic names), created_at, last_modified_at, answer_count, best_answer_id, and a posted_in block with the topic or group the question belongs to. Author profiles carry name, company, job_title, role, location_state, and location_country when the poster has made those fields public.
Filtering and Pagination
search_questions accepts a query string for free-text search over titles and bodies, a topic_id to restrict results to one community topic, and an answer_status filter that mirrors the feed's Answer Status dropdown. Topic ids come from list_topics, which returns all featured topics grouped by category (Featured Product Topics, Featured Other Topics, Featured Solution Topics). Pagination is cursor-based: pass the next_cursor value from one response as the cursor parameter in the next call; has_more indicates whether another page exists.
Full Thread Detail
get_question takes a question_id (the 15–18 character alphanumeric id from search_questions) and returns the complete question plus its answers in posting order. Each answer carries id, created_at, body, likes, is_best_answer, and an author profile with the same fields as question authors. The endpoint fetches up to 250 answers (10 pages of 25); when more answers exist on the site, answers_truncated is set to true and answer_count reflects the true total.
Coverage Notes
Only public, unauthenticated data from the Trailblazer Community feed is accessible. Private groups, member-only content, and Trailhead learning module data (badges, trails, ranks) are outside the scope of these endpoints. The list_topics endpoint returns no parameters and reflects the community's current featured topic taxonomy, which can change over time.
The Salesforce API is a managed, monitored endpoint for trailhead.salesforce.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when trailhead.salesforce.com 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 trailhead.salesforce.com 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?+
- Aggregate Salesforce product pain points by topic using
topic_idfiltering insearch_questionsfor customer research - Monitor unanswered questions in a specific community topic by filtering on
answer_statusto build support tooling - Extract author company and job title from question threads to identify which types of organizations report specific Salesforce issues
- Build a digest of the newest Flow or Apex questions by passing a
querystring like 'flow error' tosearch_questions - Identify accepted answers and their authors via
best_answer_idandis_best_answerfields for community expertise mapping - Track question volume and answer rates over time per topic using
answer_countandlist_topicscategory data - Pull full answer threads with
get_questionto train or evaluate support chatbots on real Salesforce troubleshooting conversations
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 200 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
| Team | $300/mo | 20,000 | 300 req/min |
| Company | $1,000/mo | 100,000 | 500 req/min |
Each endpoint has a fixed posted price per successful call — most fall between 1 and 10 credits — shown on this API's page before you run it. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does Salesforce offer an official developer API for the Trailblazer Community?+
What author profile fields are returned, and are they always populated?+
name, profile_url, company, job_title, role, location_state, location_country, and is_forum_ambassador. Fields beyond name and profile_url are only present when the community member has made them public on their profile; expect nulls for users who have not filled out or shared those fields.Is there a limit on how many answers `get_question` returns?+
get_question returns at most 250 answers (10 pages of 25 in posting order). When a thread has more than 250 replies, answers_truncated is set to true and answer_count reflects the actual total on the site. The 250-answer cap is a fixed constraint of this endpoint.