List pitches
Paginated write-ups. Narrow with companyId or authorUsername from search, catalog slugs or typed quality params (authorBadge, authorReturn, winRateGte, pitchReturn), and filterSetIds. All of those constraints AND together. Within extraTags, slugs OR within a type and AND across types. Several filter sets OR together. Paywalled pitches the key owner cannot read stay in the page with is_locked: true and write-up fields cleared.
curl --request GET \
--url https://www.joinyellowbrick.com/api/v1/pitches \
--header 'Authorization: Bearer <token>'import requests
url = "https://www.joinyellowbrick.com/api/v1/pitches"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://www.joinyellowbrick.com/api/v1/pitches', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://www.joinyellowbrick.com/api/v1/pitches",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://www.joinyellowbrick.com/api/v1/pitches"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://www.joinyellowbrick.com/api/v1/pitches")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://www.joinyellowbrick.com/api/v1/pitches")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": [
{
"pitch_id": "<string>",
"pitch_date": "<string>",
"added_on": "<string>",
"pitch": {
"pitch_id": "<string>",
"pitch_date": "<string>",
"added_on": "<string>",
"pitch_title": "<string>",
"pitch_summary": "<string>",
"author_user_id": "<string>",
"author_username": "<string>",
"author_display_name": "<string>",
"author_tier": "<string>",
"ticker_symbol": "<string>",
"company_name": "<string>",
"is_premium_pitch": true,
"is_locked": true,
"sentiment": "<string>",
"position_decision_type": "<string>",
"slugs": [
"<string>"
]
}
}
],
"has_more": true,
"next_cursor": "<string>",
"head_cursor": "<string>"
}{
"type": "<string>",
"title": "<string>",
"status": 0,
"detail": "<string>"
}{
"type": "<string>",
"title": "<string>",
"status": 0,
"detail": "<string>"
}{
"type": "<string>",
"title": "<string>",
"status": 0,
"detail": "<string>"
}Authorizations
Key from Profile. Send Authorization: Bearer yb_....
Query Parameters
Optional. Vercel Protection Bypass for Automation — use when calling the Staging server.
Page size. 1–50. Default 20.
1 <= x <= 50Opaque cursor from the previous page's next_cursor. Must be used with the same sort.
1post_date is when Yellowbrick added the pitch. pitch_returns is the write-up's realized return. investor_returns is the author's return.
post_date, pitch_returns, investor_returns Tag slugs this request must match. Get every slug from GET /api/v1/tags, including author badge, author return, win rate, pitch return, sentiment, position, and paywall. Repeat the parameter or comma-separate. Slugs are grouped by type: OR within a type, AND across types. Invert a type with extraTagsNoneOf. Quality filters also have typed parameters (authorBadge, authorReturn, winRateGte, pitchReturn) which compile to these slugs.
1Tag type keys to invert in extraTags, not slugs. Use tagTypeKey from GET /api/v1/tags sections (for example pitch_category, strategy, author_return, badge). Pitches that match that type's extraTags slugs are excluded.
1Author badge: elite or rising. Repeat to include both (OR). Same filter as the badge slugs in GET /api/v1/tags.
elite, rising Author return floor. {period}_{abs|excess}_gte_{0|10|25|50} where period is 6m, 1y, or 2y. abs is absolute return; excess is versus the market. Repeat to OR. Same values as GET /api/v1/tags author_return (without the col_author_return_ prefix).
6m_abs_gte_0, 6m_abs_gte_10, 6m_abs_gte_25, 6m_abs_gte_50, 6m_excess_gte_0, 6m_excess_gte_10, 6m_excess_gte_25, 6m_excess_gte_50, 1y_abs_gte_0, 1y_abs_gte_10, 1y_abs_gte_25, 1y_abs_gte_50, 1y_excess_gte_0, 1y_excess_gte_10, 1y_excess_gte_25, 1y_excess_gte_50, 2y_abs_gte_0, 2y_abs_gte_10, 2y_abs_gte_25, 2y_abs_gte_50, 2y_excess_gte_0, 2y_excess_gte_10, 2y_excess_gte_25, 2y_excess_gte_50 Author 1-year win rate floor in percent: 50, 60, or 75. Requires at least 8 pitches. Repeat to OR.
50, 60, 75 Pitch return floor. {period}_{abs|excess}_gte_pct{0|25|50|100} or {period}_{abs|excess}_gte_x{2|3|4|10}. Repeat to OR. Same values as GET /api/v1/tags pitch_return (without the col_pitch_return_ prefix).
6m_abs_gte_pct0, 6m_abs_gte_pct25, 6m_abs_gte_pct50, 6m_abs_gte_pct100, 6m_abs_gte_x2, 6m_abs_gte_x3, 6m_abs_gte_x4, 6m_abs_gte_x10, 6m_excess_gte_pct0, 6m_excess_gte_pct25, 6m_excess_gte_pct50, 6m_excess_gte_pct100, 6m_excess_gte_x2, 6m_excess_gte_x3, 6m_excess_gte_x4, 6m_excess_gte_x10, 1y_abs_gte_pct0, 1y_abs_gte_pct25, 1y_abs_gte_pct50, 1y_abs_gte_pct100, 1y_abs_gte_x2, 1y_abs_gte_x3, 1y_abs_gte_x4, 1y_abs_gte_x10, 1y_excess_gte_pct0, 1y_excess_gte_pct25, 1y_excess_gte_pct50, 1y_excess_gte_pct100, 1y_excess_gte_x2, 1y_excess_gte_x3, 1y_excess_gte_x4, 1y_excess_gte_x10, 2y_abs_gte_pct0, 2y_abs_gte_pct25, 2y_abs_gte_pct50, 2y_abs_gte_pct100, 2y_abs_gte_x2, 2y_abs_gte_x3, 2y_abs_gte_x4, 2y_abs_gte_x10, 2y_excess_gte_pct0, 2y_excess_gte_pct25, 2y_excess_gte_pct50, 2y_excess_gte_pct100, 2y_excess_gte_x2, 2y_excess_gte_x3, 2y_excess_gte_x4, 2y_excess_gte_x10 Pitch sentiment: bullish, bearish, or neutral. Repeat to OR.
bullish, bearish, neutral Extracted position action, such as initiate_long or hold. Repeat to OR. Full list is GET /api/v1/tags position_decision.
initiate_long, initiate_short, increase_long, increase_short, reduce_long, reduce_short, close_long, close_short, hold, monitor, pass_idea, not_specified true for paywalled write-ups, false for free ones.
true, false When true, only authors the key owner follows.
Author username without @. Get it from GET /api/v1/search (authors[].username). Limits the list to that author.
1Company id from GET /api/v1/search (companies[].companyId). Limits the list to pitches on that company.
x <= 9007199254740991Inclusive start date (YYYY-MM-DD) for when Yellowbrick added the pitch. If you send only one bound, both ends use that day.
^\d{4}-\d{2}-\d{2}$Inclusive end date (YYYY-MM-DD) for when Yellowbrick added the pitch.
^\d{4}-\d{2}-\d{2}$Saved filter set ids for the key owner. List them with GET /api/v1/filter-sets. Repeat the parameter or comma-separate. A pitch matches if it matches any listed set (OR). Combined with extraTags and the other filters using AND. Maximum 100 ids.
1001curl --request GET \
--url https://www.joinyellowbrick.com/api/v1/pitches \
--header 'Authorization: Bearer <token>'import requests
url = "https://www.joinyellowbrick.com/api/v1/pitches"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://www.joinyellowbrick.com/api/v1/pitches', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://www.joinyellowbrick.com/api/v1/pitches",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://www.joinyellowbrick.com/api/v1/pitches"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://www.joinyellowbrick.com/api/v1/pitches")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://www.joinyellowbrick.com/api/v1/pitches")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": [
{
"pitch_id": "<string>",
"pitch_date": "<string>",
"added_on": "<string>",
"pitch": {
"pitch_id": "<string>",
"pitch_date": "<string>",
"added_on": "<string>",
"pitch_title": "<string>",
"pitch_summary": "<string>",
"author_user_id": "<string>",
"author_username": "<string>",
"author_display_name": "<string>",
"author_tier": "<string>",
"ticker_symbol": "<string>",
"company_name": "<string>",
"is_premium_pitch": true,
"is_locked": true,
"sentiment": "<string>",
"position_decision_type": "<string>",
"slugs": [
"<string>"
]
}
}
],
"has_more": true,
"next_cursor": "<string>",
"head_cursor": "<string>"
}{
"type": "<string>",
"title": "<string>",
"status": 0,
"detail": "<string>"
}{
"type": "<string>",
"title": "<string>",
"status": 0,
"detail": "<string>"
}{
"type": "<string>",
"title": "<string>",
"status": 0,
"detail": "<string>"
}