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.

FieldTypeNotes
url or urlsstring / arrayRequired. 1 to 10 video, Shorts, playlist or channel URLs (or video IDs).
languagestringPreferred caption language(s), comma-separated in order, default en. If none match, the first available track is used.
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. Overview. Each result includes a fileUrl: a signed link you can download without your API key while the file is retained (7 days).

FieldTypeNotes
url or urlsstring / arrayRequired. 1 to 5 http(s) URLs.
formatstringpng (default), jpeg or pdf.
fullPagebooleanDefault true.
viewportWidth, viewportHeightinteger320–3840 × 240–2160. Default 1280 × 800.
deviceScaleFactorinteger1 to 3, default 1.
pdfPageFormatstringA4 (default), A3, Letter or Legal.
blockCookieBannersbooleanDefault true. Best-effort.
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. Overview.

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

FieldTypeNotes
host or hostsstring / arrayRequired. 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.

FieldTypeNotes
url or urlsstring / arrayRequired. 1 to 10 websites or domains.
maxPagesPerDomaininteger1 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.

FieldTypeNotes
url or urlsstring / arrayRequired. 1 to 20 websites or domains.
includeDnsbooleanDefault 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.

FieldTypeNotes
app or appsstring / arrayRequired. 1 to 5 app names, numeric IDs or App Store URLs.
countriesarrayTwo-letter storefront codes, up to 5. Default ["us"].
maxReviewsPerAppinteger1 to 2,000, default 200.
sortBystringmostrecent (default) or mosthelpful.
minRating, maxRatinginteger1 to 5.
keywordsarrayKeep reviews mentioning any of these words.
sincestringISO 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.

FieldTypeNotes
company or companiesstring / arrayRequired. 1 to 10 careers-page URLs, company domains or values like greenhouse:airbnb.
titleKeywords, excludeTitleKeywords, locations, departmentsarrayFilters, applied before counting.
remoteOnlybooleanDefault false.
postedWithinDaysinteger0 (any time) to 365.
maxJobsPerCompanyinteger1 to 500, default 100.
includeDescriptionbooleanFull 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.

FieldTypeNotes
domain or domainsstring / arrayRequired. 1 to 50 domain names.
includeDnsbooleanDefault 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

PlanPriceSuccessful results / month
Starter$29/month10,000
Pro$99/month50,000
Business$299/month250,000
Enterprise$999/month1,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": "..."}}.

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.
405method_not_allowedUse POST.
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

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.