TidyTools

Article summary (AI)

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

Extract an article and summarize it with AI. The same extraction as /api/v1/article, then an AI summary (Llama 3.3 70B) grounded in the article text only. The body is returned only with includeContent=true. Or send your own text (POST) to summarize it without a URL. Non-articles are refused (422 not_an_article) before the model runs; paywall teasers are never summarized. summaryGenerated: true and header x-summary-generated: true mark answers that contain a summary.

Cost

Credits: 54 ($0.0054) per successful call. Failed calls are free. Source price: web-page-summarizer/page-summarized.

Input

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

No field is required.

FieldTypeDefaultDescription
urlstringArticle URL (or send text). A bare domain is accepted; private and local 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"paragraph"Summary shape: tldr (one sentence), paragraph or bullets (up to 7).
maxWordsintegerApproximate summary length. Default: 30 (tldr), 100 (paragraph), 120 (bullets).
languagestringWrite the summary in this language (e.g. English, Spanish, Traditional Chinese). Default: the article's language.
focusstringWhat the summary should focus on (e.g. numbers and dates).
includeContentbooleanfalseAlso return the article body (markdown / text, per format).
textstringYour own text to summarize instead of a URL (200 to 100,000 characters; send it in a POST body). Then url is not needed.
titlestringOptional title for text.

Examples

Replace tt_live_XXXX with your key from the pricing page.

curl

curl -i -X POST "https://tools.yukai.uk/api/v1/article/summary" \
  -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/summary", {
  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/summary",
    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