Siftwright API docs
Version 1 · Base URL https://siftwright.com/v1
The Siftwright API gives you our YouTube transcript, website screenshot/PDF and Google News tools behind one key. Every endpoint takes a JSON body with POST and returns JSON. Get a key by subscribing to a plan.
Authentication
Send your key in the Authorization header on every request:
Authorization: Bearer sw_live_YOUR_KEY
Keys are shown once after checkout, and we store only a hash of them. Keep your key server-side, and never put it in browser or mobile app code. If a key leaks or is lost, email support@siftwright.com and we'll replace it.
Endpoints
POST /v1/youtube-transcript
Transcripts and subtitles for YouTube videos, Shorts, playlists and channels.
| Field | Type | Notes |
|---|---|---|
url or urls | string / array | Required. 1 to 10 video, Shorts, playlist or channel URLs (or video IDs). |
language | string | Preferred transcript language, default en. |
translateTo | string | Optional language code to auto-translate into. |
outputFormats | array | Any of text, segments, srt, vtt. Default ["text","segments"]. |
maxVideosPerSource | integer | For playlists and channels, 1 to 25, default 10. |
includeMetadata, preferManual | boolean | Default true. |
Counts one result per video whose transcript came back.
POST /v1/screenshot
PNG/JPEG screenshots or PDFs of web pages. Each result includes a fileUrl to download the file.
| Field | Type | Notes |
|---|---|---|
url or urls | string / array | Required. 1 to 5 http(s) URLs. |
format | string | png (default), jpeg or pdf. |
fullPage | boolean | Default true. |
viewportWidth, viewportHeight | integer | Default 1280 × 800. |
deviceScaleFactor | integer | 1 to 3, default 1. |
pdfPageFormat | string | A4, A3, Letter or Legal. |
blockCookieBanners | boolean | Default true. |
waitForSelector, delaySec | string / integer | Wait for an element, or up to 10 seconds, before capturing. |
Counts one result per page captured.
POST /v1/google-news
Google News articles for a keyword, brand or topic.
| Field | Type | Notes |
|---|---|---|
query | string | Required. |
maxItems | integer | 1 to 100, default 30. |
language, country | string | Default en and US. |
Counts one result per article returned.
Response
{
"endpoint": "google-news",
"count": 10,
"billed": 10,
"results": [ { "title": "...", "link": "...", "source": "...", "publishedAt": "...", "status": "ok" } ],
"usage": { "plan": "pro", "used": 1210, "quota": 50000, "remaining": 48790, "period_end": "2026-10-28T12:00:00.000Z" }
}
Each item has a status. Only items with "status": "ok" count toward your plan (billed); failed items are included so you can see why, and they're free.
Examples
curl
curl https://siftwright.com/v1/screenshot \
-H "Authorization: Bearer $SIFTWRIGHT_API_KEY" \
-H "Content-Type: application/json" \
-d '{"url": "https://example.com", "format": "pdf"}'
Python
import os, requests
r = requests.post(
"https://siftwright.com/v1/youtube-transcript",
headers={"Authorization": f"Bearer {os.environ['SIFTWRIGHT_API_KEY']}"},
json={"url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ", "outputFormats": ["text"]},
timeout=300,
)
r.raise_for_status()
for item in r.json()["results"]:
print(item["title"], item.get("wordCount"))
JavaScript (Node 18+)
const res = await fetch("https://siftwright.com/v1/google-news", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.SIFTWRIGHT_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({ query: "electric vehicles", maxItems: 20 }),
});
if (!res.ok) throw new Error((await res.json()).error.message);
const { results, usage } = await res.json();
console.log(results.length, "articles;", usage.remaining, "results left this period");
Limits
| Plan | Price | Successful results / month |
|---|---|---|
| Starter | $29/month | 10,000 |
| Pro | $99/month | 50,000 |
| Business | $299/month | 250,000 |
| Enterprise | $999/month | 1,500,000 |
- Rate limit: 60 requests per minute per key.
- Requests run synchronously and can take up to about 5 minutes for large batches, so set a generous client timeout. Smaller batches return faster.
- Usage resets at the start of each billing period. Unused results don't roll over.
- A request never uses more than your remaining results. Large batches are trimmed to fit.
Errors
Errors return a JSON body like {"error": {"code": "invalid_api_key", "message": "..."}}.
| Status | Code | Meaning |
|---|---|---|
| 400 | invalid_body, invalid_input | The JSON body is missing or a field is invalid. |
| 401 | missing_api_key, invalid_api_key | No key, or the key isn't recognised. |
| 402 | subscription_inactive | The subscription is canceled or a payment failed. Update your card in the billing portal. |
| 429 | quota_exceeded | You've used this period's included results. Upgrade or wait for the next period. |
| 429 | rate_limited | More than 60 requests per minute. Retry after the Retry-After header. |
| 502 / 504 | upstream_error, upstream_timeout | The tool failed or took too long. Nothing is counted; retry, or send a smaller batch. |
AI agents and MCP
A hosted MCP server for Siftwright API keys isn't available yet. For now, agents can call the REST endpoints above as tools, or use every Siftwright tool through Apify's hosted MCP server with an Apify account (that's billed by Apify, separately from this API).
Billing
Plans renew monthly through Stripe. Cancel, switch plans or update your card anytime from Manage subscription. Cancellation takes effect at the end of the paid period. Questions: support@siftwright.com.