TidyTools

Article extraction

POST https://tools.yukai.uk/api/v1/article

Extract an article from a URL. Returns the article metadata and its clean body (main content only: navigation, ads, share bars, related-story lists and footers are removed). Never runs AI; summaryGenerated is always false here. Pages that are not articles return 422 not_an_article with details.pageType.

Cost

Credits: 9 ($0.0009) per successful call. Failed calls are free. Source price: news-scraper/article.

Input

Send a JSON body (POST) or the same fields as a query string (GET).

Required: url.

FieldTypeDefaultDescription
url requiredstringArticle URL. A bare domain is accepted (https is assumed). Private, local and cloud-metadata addresses are refused.
formatstring"markdown"Body format: markdown, text (plain text) or both.
maxCharsinteger200000Cut the body at this many characters (truncated tells you). Counts (words, tokens) always describe the whole article.
includeLinksbooleanfalseAlso return the absolute links inside the article body (up to 500).
allowNonArticlebooleanfalseReturn home pages, listings, product pages and paywall teasers too (with isArticle: false and pageType) instead of 422 not_an_article. Bot checks, login walls, consent pages and empty pages are always refused.
renderstring"auto"auto (default): plain HTTP first, a real Chrome browser only when the site blocks plain requests or needs JavaScript. never: HTTP only. always: browser only.
timeoutMsinteger20000Page-load timeout in milliseconds.
summarystring"none"Only none is accepted here: summaries are the /api/v1/article/summary endpoint (billed separately).

Examples

Replace tt_live_XXXX with your key from the pricing page.

curl

curl -i -X POST "https://tools.yukai.uk/api/v1/article" \
  -H "Authorization: Bearer tt_live_XXXX" \
  -H "Content-Type: application/json" \
  -d '{"url":"https://www.theguardian.com/us-news/2026/sep/30/trump-state-department-human-rights-fund"}'

JavaScript (fetch)

const res = await fetch("https://tools.yukai.uk/api/v1/article", {
  method: "POST",
  headers: { "Authorization": "Bearer tt_live_XXXX", "Content-Type": "application/json" },
  body: JSON.stringify({"url":"https://www.theguardian.com/us-news/2026/sep/30/trump-state-department-human-rights-fund"}),
});
console.log(res.status, res.headers.get("x-credits-charged"), res.headers.get("x-credits-balance"));
console.log(await res.json());

Python (requests)

import requests

r = requests.post(
    "https://tools.yukai.uk/api/v1/article",
    headers={"Authorization": "Bearer tt_live_XXXX"},
    json={"url": "https://www.theguardian.com/us-news/2026/sep/30/trump-state-department-human-rights-fund"},
    timeout=120,
)
print(r.status_code, r.headers.get("x-credits-charged"), r.headers.get("x-credits-balance"))
print(r.json())

Response

JSON with "success": true and the result fields; on failure {"success": false, "error": {"code", "message", "retryable"}} and no credits are used. Every answer carries x-credits-charged (credits used) and x-credits-balance (balance after the call); check the balance any time with GET https://tools.yukai.uk/v1/billing/balance.

Full field list and response schema: OpenAPI spec article-summary (its servers entry is the marketplace gateway; call https://tools.yukai.uk with your key).

← All routes · Pricing