curl --request GET \
--url https://dripstack.com/api/v1/publications/{publicationSlug}/{postSlug}import requests
url = "https://dripstack.com/api/v1/publications/{publicationSlug}/{postSlug}"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://dripstack.com/api/v1/publications/{publicationSlug}/{postSlug}', 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/v1/publications/{publicationSlug}/{postSlug}",
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/v1/publications/{publicationSlug}/{postSlug}"
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/v1/publications/{publicationSlug}/{postSlug}")
.asString();require 'uri'
require 'net/http'
url = URI("https://dripstack.com/api/v1/publications/{publicationSlug}/{postSlug}")
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{
"id": "post_xyz789",
"publicationId": "pub_abc123",
"publicationSlug": "stratechery",
"guid": "https://stratechery.com/p/the-ai-infrastructure-boom",
"slug": "the-ai-infrastructure-boom",
"title": "The AI Infrastructure Boom",
"subtitle": "Why hyperscalers are spending billions on GPU clusters",
"description": "A deep dive into the capex cycle driving AI infrastructure buildout.",
"url": "https://stratechery.com/2026/the-ai-infrastructure-boom",
"author": "Ben Thompson",
"imageUrl": "https://substackcdn.com/image/fetch/w_1200/ai-infra.jpg",
"publishedAt": "2026-06-14T12:00:00Z",
"synthesizedSummary": "Nvidia reported $26B in datacenter revenue last quarter, up 427% YoY, as hyperscalers race to build GPU clusters for AI training and inference. The article argues this capex cycle differs from past infrastructure booms because demand is driven by revenue-generating workloads (LLM inference for paying customers) rather than speculative capacity. Key risks include: (1) GPU utilization rates declining as supply catches up, (2) inference costs dropping faster than revenue grows, (3) custom silicon from Google (TPU) and Amazon (Trainium) eroding Nvidia's moat. The author remains bullish on picks-and-shovels plays through 2027.",
"transcript": null,
"createdAt": "2026-06-14T12:05:00Z",
"updatedAt": "2026-06-15T08:00:00Z",
"paymentInfo": {
"amountUsd": "0.50",
"protocol": "x402"
}
}{
"type": "<string>",
"title": "<string>",
"status": 402,
"detail": "<string>",
"challengeId": "<string>"
}{
"error": "<string>"
}{
"error": "<string>",
"code": "summary_not_ready"
}Get article, podcast, or book chapter content (paid).
Returns post metadata and synthesized summary after payment. Podcast episodes may include a transcript; book chapters include raw Markdown in content. The first successful pay unlocks that post forever for the paying subject (Drip user for credits/API key/JWT/MCP OAuth; wallet or MPP credential otherwise). Later fetches are free. x402/MPP clients should store unlockToken / X-Drip-Unlock from the first settle and send X-Drip-Unlock on free re-reads.
curl --request GET \
--url https://dripstack.com/api/v1/publications/{publicationSlug}/{postSlug}import requests
url = "https://dripstack.com/api/v1/publications/{publicationSlug}/{postSlug}"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://dripstack.com/api/v1/publications/{publicationSlug}/{postSlug}', 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/v1/publications/{publicationSlug}/{postSlug}",
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/v1/publications/{publicationSlug}/{postSlug}"
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/v1/publications/{publicationSlug}/{postSlug}")
.asString();require 'uri'
require 'net/http'
url = URI("https://dripstack.com/api/v1/publications/{publicationSlug}/{postSlug}")
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{
"id": "post_xyz789",
"publicationId": "pub_abc123",
"publicationSlug": "stratechery",
"guid": "https://stratechery.com/p/the-ai-infrastructure-boom",
"slug": "the-ai-infrastructure-boom",
"title": "The AI Infrastructure Boom",
"subtitle": "Why hyperscalers are spending billions on GPU clusters",
"description": "A deep dive into the capex cycle driving AI infrastructure buildout.",
"url": "https://stratechery.com/2026/the-ai-infrastructure-boom",
"author": "Ben Thompson",
"imageUrl": "https://substackcdn.com/image/fetch/w_1200/ai-infra.jpg",
"publishedAt": "2026-06-14T12:00:00Z",
"synthesizedSummary": "Nvidia reported $26B in datacenter revenue last quarter, up 427% YoY, as hyperscalers race to build GPU clusters for AI training and inference. The article argues this capex cycle differs from past infrastructure booms because demand is driven by revenue-generating workloads (LLM inference for paying customers) rather than speculative capacity. Key risks include: (1) GPU utilization rates declining as supply catches up, (2) inference costs dropping faster than revenue grows, (3) custom silicon from Google (TPU) and Amazon (Trainium) eroding Nvidia's moat. The author remains bullish on picks-and-shovels plays through 2027.",
"transcript": null,
"createdAt": "2026-06-14T12:05:00Z",
"updatedAt": "2026-06-15T08:00:00Z",
"paymentInfo": {
"amountUsd": "0.50",
"protocol": "x402"
}
}{
"type": "<string>",
"title": "<string>",
"status": 402,
"detail": "<string>",
"challengeId": "<string>"
}{
"error": "<string>"
}{
"error": "<string>",
"code": "summary_not_ready"
}Headers
MPP (Payment HTTP Authentication Scheme): after HTTP 402, retry with Authorization: Payment <credential>.
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).
HMAC unlock token from a prior successful settle (unlockToken in the JSON body or this same response header). When valid for this post, returns the live summary with no charge (paymentInfo.protocol: unlock).
Path Parameters
Publication slug, which is the normalized host.
Post slug from the publication feed.
Response
Post summary with podcast transcript or book chapter content when applicable. Charged on first unlock; free re-reads use protocol unlock.
Internal post id.
Publication id.
Publication slug.
Feed-level globally unique identifier.
Post slug.
Post title.
Post subtitle.
Short description from the feed.
Original post URL.
Post author.
Post hero or thumbnail image URL.
ISO publication timestamp.
AI-synthesized post summary (returned after payment).
ISO timestamp when the post was first imported.
ISO timestamp of the last update.
Raw speech-to-text transcript HTML for podcast episodes (returned after payment); null for non-podcast posts or when the transcript isn't ready yet.
Raw Markdown content, included for book chapters after payment.
True when this response is a free forever-unlock re-read (protocol: unlock).
Issued on first x402/MPP settle. Store and send as X-Drip-Unlock for free re-reads.
Show child attributes
Show child attributes

