curl --request GET \
--url https://dripstack.com/api/v2/stock-picksimport requests
url = "https://dripstack.com/api/v2/stock-picks"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://dripstack.com/api/v2/stock-picks', 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://dripstack.com/api/v2/stock-picks",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$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://dripstack.com/api/v2/stock-picks"
req, _ := http.NewRequest("GET", url, nil)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://dripstack.com/api/v2/stock-picks")
.asString();require 'uri'
require 'net/http'
url = URI("https://dripstack.com/api/v2/stock-picks")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_body{
"meta": {
"plan": "FREE",
"allowedRange": {
"from": "<string>",
"to": "<string>"
},
"appliedRange": {
"from": "<string>",
"to": "<string>"
},
"requestAllowance": 123,
"asOf": "<string>"
},
"pagination": {
"count": 1,
"nextCursor": "<string>"
},
"picks": [
{
"assetId": "<string>",
"assetResolutionStatus": "RESOLVED",
"asset": {
"id": "<string>",
"name": "<string>",
"kind": "EQUITY",
"symbol": "<string>",
"exchangeMic": "<string>",
"currency": "<string>"
},
"tickerExchange": "<string>",
"instrumentType": "EQUITY",
"date": "<string>",
"ticker": "<string>",
"action": "<string>",
"author": "<string>",
"publicationSlug": "<string>",
"publicationTitle": "<string>",
"articleUrl": "<string>",
"conviction": 2,
"convictionLabel": "<string>",
"evidenceQuote": "<string>",
"thesis": "<string>",
"sentiment": "BULLISH",
"rationaleSnippet": "<string>",
"publishedAt": "<string>",
"prices": {
"entry": 123,
"current": 123,
"returnPct": 123,
"currency": "<string>"
}
}
]
}{
"type": "<string>",
"title": "<string>",
"status": 402,
"detail": "<string>",
"challengeId": "<string>"
}V2 — Stock picks with subscription access, credits, or x402 pay-per-use.
V2 (recommended over V1). Tier-aware stock-picks API. Bearer API key / JWT / OAuth resolves the subscription first: EXPERT sees full history, PRO is clamped to the live 7-day window, and neither is ever charged for requests their plan covers. Anonymous callers use x402; authenticated callers without a paid plan spend Drip credits. Each paid request buys one dated bundle, priced at the flat unit × distinct attributed source articles. Filters, search, range pagination, and prices apply to subscription reads; the paid flow uses date/limit and sort, and ignores the subscription-only options. Out-of-window explicit date returns 403; PRO ranges are clamped, with 403 when there is no overlap (see meta.appliedRange).
curl --request GET \
--url https://dripstack.com/api/v2/stock-picksimport requests
url = "https://dripstack.com/api/v2/stock-picks"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://dripstack.com/api/v2/stock-picks', 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://dripstack.com/api/v2/stock-picks",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$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://dripstack.com/api/v2/stock-picks"
req, _ := http.NewRequest("GET", url, nil)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://dripstack.com/api/v2/stock-picks")
.asString();require 'uri'
require 'net/http'
url = URI("https://dripstack.com/api/v2/stock-picks")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_body{
"meta": {
"plan": "FREE",
"allowedRange": {
"from": "<string>",
"to": "<string>"
},
"appliedRange": {
"from": "<string>",
"to": "<string>"
},
"requestAllowance": 123,
"asOf": "<string>"
},
"pagination": {
"count": 1,
"nextCursor": "<string>"
},
"picks": [
{
"assetId": "<string>",
"assetResolutionStatus": "RESOLVED",
"asset": {
"id": "<string>",
"name": "<string>",
"kind": "EQUITY",
"symbol": "<string>",
"exchangeMic": "<string>",
"currency": "<string>"
},
"tickerExchange": "<string>",
"instrumentType": "EQUITY",
"date": "<string>",
"ticker": "<string>",
"action": "<string>",
"author": "<string>",
"publicationSlug": "<string>",
"publicationTitle": "<string>",
"articleUrl": "<string>",
"conviction": 2,
"convictionLabel": "<string>",
"evidenceQuote": "<string>",
"thesis": "<string>",
"sentiment": "BULLISH",
"rationaleSnippet": "<string>",
"publishedAt": "<string>",
"prices": {
"entry": 123,
"current": 123,
"returnPct": 123,
"currency": "<string>"
}
}
]
}{
"type": "<string>",
"title": "<string>",
"status": 402,
"detail": "<string>",
"challengeId": "<string>"
}Headers
Bearer API key, OAuth access token, or session JWT. PRO/EXPERT subscription reads are included; other authenticated callers spend Drip credits.
x402 v2: after HTTP 402, retry with the encoded payment payload from the PAYMENT-REQUIRED challenge (same header name as in @x402/core HTTP transport).
Query Parameters
UTC calendar day to return (mutually exclusive with from/to). Outside a subscriber's plan window this returns 403.
^\d{4}-\d{2}-\d{2}$Range start (inclusive). Intersected with the subscriber's allowed window — a Pro request for from=2020-01-01 is clamped to the start of the Pro window.
^\d{4}-\d{2}-\d{2}$Range end (inclusive). Also intersected with the subscriber's allowed window.
^\d{4}-\d{2}-\d{2}$Maximum pick rows per day (1-500). Defaults to 200.
1 <= x <= 500Maximum days returned per range page (1-30). Pass the previous response's pagination.nextCursor as cursor to fetch older days.
1 <= x <= 30Older-than marker: return days strictly before this date (the previous page's pagination.nextCursor).
^\d{4}-\d{2}-\d{2}$Exact author name filter (paid tiers only).
100Case-insensitive substring over ticker, author, and publication title (paid tiers only).
200Order rows within the current page by pick date and publish time. Range pages always select newer days first and the cursor moves toward older days, even with oldest sorting.
newest, oldest Pass false to omit prices. Available by default only for historical subscription reads (omitted for the current day and pay-per-use reads); prices require a resolved identity and matching provider symbol, exchange, asset type, and currency. Unverified prices are omitted.
true, false 
