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.

FieldTypeNotes
url or urlsstring / arrayRequired. 1 to 10 video, Shorts, playlist or channel URLs (or video IDs).
languagestringPreferred transcript language, default en.
translateTostringOptional language code to auto-translate into.
outputFormatsarrayAny of text, segments, srt, vtt. Default ["text","segments"].
maxVideosPerSourceintegerFor playlists and channels, 1 to 25, default 10.
includeMetadata, preferManualbooleanDefault 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.

FieldTypeNotes
url or urlsstring / arrayRequired. 1 to 5 http(s) URLs.
formatstringpng (default), jpeg or pdf.
fullPagebooleanDefault true.
viewportWidth, viewportHeightintegerDefault 1280 × 800.
deviceScaleFactorinteger1 to 3, default 1.
pdfPageFormatstringA4, A3, Letter or Legal.
blockCookieBannersbooleanDefault true.
waitForSelector, delaySecstring / integerWait 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.

FieldTypeNotes
querystringRequired.
maxItemsinteger1 to 100, default 30.
language, countrystringDefault 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

PlanPriceSuccessful results / month
Starter$29/month10,000
Pro$99/month50,000
Business$299/month250,000
Enterprise$999/month1,500,000

Errors

Errors return a JSON body like {"error": {"code": "invalid_api_key", "message": "..."}}.

StatusCodeMeaning
400invalid_body, invalid_inputThe JSON body is missing or a field is invalid.
401missing_api_key, invalid_api_keyNo key, or the key isn't recognised.
402subscription_inactiveThe subscription is canceled or a payment failed. Update your card in the billing portal.
429quota_exceededYou've used this period's included results. Upgrade or wait for the next period.
429rate_limitedMore than 60 requests per minute. Retry after the Retry-After header.
502 / 504upstream_error, upstream_timeoutThe 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.