Siftwright API docs
Version 1 · Base URL https://siftwright.com/v1 · Updated 28 September 2026
The Siftwright API gives you every Siftwright tool behind one key: YouTube transcripts, website screenshots/PDFs, Google News, company contact details, website tech stacks, App Store reviews, company job openings, domain WHOIS/DNS and post-quantum TLS scans, over REST or a hosted MCP server. Every endpoint takes a JSON body with POST and returns JSON. Get a key by subscribing to a plan, or try the tools first in the live demo.
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. Overview.
| Field | Type | Notes |
|---|---|---|
url or urls | string / array | Required. 1 to 10 video, Shorts, playlist or channel URLs (or video IDs). |
language | string | Preferred caption language(s), comma-separated in order, default en. If none match, the first available track is used. |
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. Overview. Each result includes a fileUrl: a signed link you can download without your API key while the file is retained (7 days).
| 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 | 320–3840 × 240–2160. Default 1280 × 800. |
deviceScaleFactor | integer | 1 to 3, default 1. |
pdfPageFormat | string | A4 (default), A3, Letter or Legal. |
blockCookieBanners | boolean | Default true. Best-effort. |
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. Overview.
| Field | Type | Notes |
|---|---|---|
query | string | Required. Up to 300 characters. |
maxItems | integer | 1 to 100, default 30. |
language, country | string | Default en and US. |
Counts one result per article returned.
POST /v1/pqc-scan
Post-quantum TLS readiness for public domains: which key-exchange groups the server accepts (X25519MLKEM768, NIST hybrids, pure ML-KEM, the old Kyber draft, classical curves), whether it prefers post-quantum, TLS 1.2/1.3 support, the leaf certificate's algorithms and expiry, and HSTS. Same checks as the free checker.
| Field | Type | Notes |
|---|---|---|
host or hosts | string / array | Required. 1 to 20 public domain names (a URL is fine; we take the hostname). IP addresses and internal names are rejected. |
Each result has grade (letter, label, notes), pqKeyExchange, groups, prefersPostQuantum, tls13, tls12, certificate, hsts and method: live-handshake, or inferred-cloudflare for hosts on Cloudflare's network, which our Workers can't probe directly. Results are cached for 30 minutes per host. Counts one result per host that answered; unreachable hosts are free.
POST /v1/contact-details
Public emails, phone numbers and social profiles from company websites. Overview.
| Field | Type | Notes |
|---|---|---|
url or urls | string / array | Required. 1 to 10 websites or domains. |
maxPagesPerDomain | integer | 1 to 15, default 6. |
Counts one result per website with "status": "ok".
POST /v1/tech-stack
CMS, ecommerce platform, frameworks, analytics, ad pixels, hosting, CDN, email and DNS provider of a website, with evidence. Overview.
| Field | Type | Notes |
|---|---|---|
url or urls | string / array | Required. 1 to 20 websites or domains. |
includeDns | boolean | Default true. |
Counts one result per website with "status": "ok".
POST /v1/app-store-reviews
Apple App Store reviews by app name, ID or URL. Overview.
| Field | Type | Notes |
|---|---|---|
app or apps | string / array | Required. 1 to 5 app names, numeric IDs or App Store URLs. |
countries | array | Two-letter storefront codes, up to 5. Default ["us"]. |
maxReviewsPerApp | integer | 1 to 2,000, default 200. |
sortBy | string | mostrecent (default) or mosthelpful. |
minRating, maxRating | integer | 1 to 5. |
keywords | array | Keep reviews mentioning any of these words. |
since | string | ISO date; keep reviews on or after it. |
Counts one result per 25 reviews returned, rounded up per request.
POST /v1/ats-jobs
Open jobs from Greenhouse, Lever, Ashby, SmartRecruiters and Recruitee boards in one schema. Overview.
| Field | Type | Notes |
|---|---|---|
company or companies | string / array | Required. 1 to 10 careers-page URLs, company domains or values like greenhouse:airbnb. |
titleKeywords, excludeTitleKeywords, locations, departments | array | Filters, applied before counting. |
remoteOnly | boolean | Default false. |
postedWithinDays | integer | 0 (any time) to 365. |
maxJobsPerCompany | integer | 1 to 500, default 100. |
includeDescription | boolean | Full description text. Default false. |
Counts one result per 3 jobs returned, rounded up per request.
POST /v1/domain-whois
Registrar, creation and expiry dates, status, nameservers and DNSSEC from RDAP with WHOIS fallback, plus A, MX, SPF and DMARC records. Overview.
| Field | Type | Notes |
|---|---|---|
domain or domains | string / array | Required. 1 to 50 domain names. |
includeDns | boolean | Default true. |
Counts one result per 3 domains with a registry answer, rounded up per request.
Response format
{
"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", "pdfPageFormat": "A4"}'
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=jNQXAC9IVRw", "outputFormats": ["text"]},
timeout=300,
)
r.raise_for_status()
video = r.json()["results"][0]
print(video["title"], video["wordCount"], "words")
print(video["text"][:500])
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: "artificial intelligence", maxItems: 10, country: "GB" }),
});
const { results, usage } = await res.json();
results.forEach((a) => console.log(a.source, a.title));
console.log(usage.remaining, "results left this period");
More complete, tested walk-throughs are on the blog.
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. Small requests typically return in a few seconds.
- 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. |
| 405 | method_not_allowed | Use POST. |
| 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
Siftwright runs a hosted MCP server at https://siftwright.com/mcp (Streamable HTTP). Connect it with your API key and your agent gets nine tools: youtube_transcript, website_screenshot, google_news, pqc_scan, contact_details, tech_stack, app_store_reviews, ats_jobs and domain_whois. Tool calls use the same plan, quota, rate limit and billing as the REST endpoints: only successful results count. Listing the tools works without a key; calling them needs one.
Claude Code:
claude mcp add --transport http siftwright https://siftwright.com/mcp --header "Authorization: Bearer sw_live_YOUR_KEY"
Claude Desktop, Cursor, VS Code and other clients that accept a JSON config:
{
"mcpServers": {
"siftwright": {
"type": "http",
"url": "https://siftwright.com/mcp",
"headers": { "Authorization": "Bearer sw_live_YOUR_KEY" }
}
}
}
No Siftwright plan? The same tools also run through Apify's hosted MCP server with an Apify account, billed pay-per-event by Apify, separately from this API:
{
"mcpServers": {
"apify": {
"url": "https://mcp.apify.com?tools=siftwright/youtube-transcript-extractor,siftwright/pageframe-screenshots,siftwright/google-news-scraper,siftwright/contact-details-extractor,siftwright/app-store-reviews-scraper,siftwright/tech-stack-detector,siftwright/ats-jobs-scraper,siftwright/domain-whois-dns-lookup,siftwright/email-validator-mx-disposable",
"headers": { "Authorization": "Bearer YOUR_APIFY_TOKEN" }
}
}
}
See web data for AI agents for tool definitions and tips.
OpenAPI spec
Every /v1 endpoint, its request fields, the response envelope and the error bodies are described in an OpenAPI 3.1 file: /openapi.json. Import it into Postman, Insomnia or your code generator of choice.
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.