curl --request GET \
--url https://dripstack.com/api/v2/x402/stock-picksimport requests
url = "https://dripstack.com/api/v2/x402/stock-picks"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://dripstack.com/api/v2/x402/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/x402/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/x402/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/x402/stock-picks")
.asString();require 'uri'
require 'net/http'
url = URI("https://dripstack.com/api/v2/x402/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>"
}
}
]
}{
"type": "<string>",
"title": "<string>",
"status": 402,
"detail": "<string>",
"challengeId": "<string>"
}Get stock-picker calls (pay-per-use bundle).
Wallet-payment mount of GET /api/v2/stock-picks. Every caller pays per request, priced at a flat rate per UTC day served — a from/to range costs the day price × charged days (empty days are skipped, max 30 days per request); subscriptions and credits do not apply. Account credentials (Bearer API key / JWT / OAuth) are rejected with 403 wallet_only. The paid flow uses date/limit/from/to and sort, and ignores the subscription-only options.
curl --request GET \
--url https://dripstack.com/api/v2/x402/stock-picksimport requests
url = "https://dripstack.com/api/v2/x402/stock-picks"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://dripstack.com/api/v2/x402/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/x402/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/x402/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/x402/stock-picks")
.asString();require 'uri'
require 'net/http'
url = URI("https://dripstack.com/api/v2/x402/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>"
}
}
]
}{
"type": "<string>",
"title": "<string>",
"status": 402,
"detail": "<string>",
"challengeId": "<string>"
}Headers
MPP (Payment HTTP Authentication Scheme): after HTTP 402, retry with Authorization: Payment <credential>. Account credentials (Bearer API key / JWT / OAuth) are not accepted on this mount.
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 
