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>",
"speakerIsGuest": true,
"timeframe": "<string>",
"timeframeQuote": "<string>",
"priceTarget": {
"kind": "above",
"value": 123,
"currency": "<string>",
"valueHigh": 123
},
"priceTargetQuote": "<string>",
"underlyingTarget": {
"label": "<string>",
"kind": "above",
"value": 123,
"unit": "price",
"currency": "<string>",
"valueHigh": 123
},
"underlyingTargetQuote": "<string>",
"prices": {
"entry": 123,
"current": 123,
"returnPct": 123,
"currency": "<string>"
}
}
]
}Get stock-picker calls.
Account mount: Bearer API key / JWT / OAuth only, and an active plan is required — EXPERT sees full history, PRO is clamped to the live 7-day window, and neither is ever charged for requests their plan covers. Callers without a plan are rejected with 403 subscription_required (there is no free tier and no credits fallback). Wallet payments (x402 / MPP) are rejected with 403 account_only — use GET /api/v2/x402/stock-picks. Each pay-per-use request is priced at a flat rate per UTC day served (a from/to range costs the day price × charged days). Filters, search, range pagination, and prices apply to subscription reads; the paid flow uses date/limit/from/to 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>",
"speakerIsGuest": true,
"timeframe": "<string>",
"timeframeQuote": "<string>",
"priceTarget": {
"kind": "above",
"value": 123,
"currency": "<string>",
"valueHigh": 123
},
"priceTargetQuote": "<string>",
"underlyingTarget": {
"label": "<string>",
"kind": "above",
"value": 123,
"unit": "price",
"currency": "<string>",
"valueHigh": 123
},
"underlyingTargetQuote": "<string>",
"prices": {
"entry": 123,
"current": 123,
"returnPct": 123,
"currency": "<string>"
}
}
]
}Headers
Bearer API key (pk_drip_…), OAuth access token, or session JWT. PRO/EXPERT subscription reads are included; other authenticated callers spend Drip credits. Wallet payments are not accepted on this mount — use the /api/v2/x402/ twin.
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 
