POST /api/arstechnica/articles
Price: 10 credits
Get a full Ars Technica article by id, slug or URL: headline, the editorial kicker printed above it, the dek, the complete article body as plain text and as HTML, separate publish and update timestamps, the credited staff writer with bio, the section, topic-tag and editorial-series taxonomies, the number of forum comments the story has collected and the featured image with its photo credit.
Fetch a single Ars Technica article. Accepts the numeric post id, the bare slug, or the full article URL (https://arstechnica.com/{section}/YYYY/MM/slug/). Returns one item with article_title, kicker (the short line the editors print above the headline), excerpt (the dek), text (plain text body), html (original markup), published_at and updated_at as separate unix timestamps, comment_count, author (name, alias, bio, homepage), categories[]/tags[]/series[]/feature_series[] taxonomy terms, image plus featured_image with credit and copyright, and apple_news_url. Use arstechnica/articles/search to discover article ids.
access-token string requiredtimeout integer — Max scrapping execution timeout (in seconds) (default: 300; min: 20; max: 1500)article string required — Ars Technica article id, slug or article URL (examples: "https://arstechnica.com/ai/2026/08/new-font-turns-ordinary-webpages-into-nonsense-for-ai-scrapers/", "new-font-turns-ordinary-webpages-into-nonsense-for-ai-scrapers", "2167263"; minLength: 1)@type string (default: "ArstechnicaArticle")id integer requiredarticle_title string requiredalias string requiredweb_url string requiredpublished_at integer nullableupdated_at integer nullableexcerpt string nullablepost_format string nullableimage string nullableimage_id integer nullableapple_news_url string nullablewp_author_id integer nullableauthor object nullable@type string (default: "ArstechnicaArticleAuthor")id integer requiredname string requiredalias string nullableweb_url string nullabledescription string nullablehomepage_url string nullablecategories array (default: [])@type string (default: "ArstechnicaTerm")id integer requiredname string requiredalias string nullabletaxonomy string nullableweb_url string nullabledescription string nullablearticle_count integer nullabletags array (default: [])@type string (default: "ArstechnicaTerm")id integer requiredname string requiredalias string nullabletaxonomy string nullableweb_url string nullabledescription string nullablearticle_count integer nullablefeature_series array (default: [])@type string (default: "ArstechnicaTerm")id integer requiredname string requiredalias string nullabletaxonomy string nullableweb_url string nullabledescription string nullablearticle_count integer nullableseries array (default: [])@type string (default: "ArstechnicaTerm")id integer requiredname string requiredalias string nullabletaxonomy string nullableweb_url string nullabledescription string nullablearticle_count integer nullablekicker string nullablecomment_count integer nullabletext string nullablehtml string nullablefeatured_image object nullable@type string (default: "ArstechnicaImage")id integer requiredimage string requiredimage_title string nullablealias string nullableweb_url string nullablealt string nullablecaption string nullabledescription string nullablecredit string nullablecopyright string nullableembedded_title string nullableembedded_caption string nullablekeywords array (default: [])camera string nullableaperture number nullablefocal_length number nullableiso integer nullableshutter_speed number nullabletaken_at integer nullablewidth integer nullableheight integer nullablefile_size integer nullablemedia_type string nullablemime_type string nullableuploaded_at integer nullableupdated_at integer nullablepost_id integer nullablewp_author_id integer nullablesizes array (default: [])@type string (default: "ArstechnicaImageSize")name string requiredimage string requiredwidth integer nullableheight integer nullablemime_type string nullable422 — The request body did not validate Check the fields against this schema. A URN with the wrong prefix is the most common cause.408 — The request ran past its time limit Raise `timeout` in the request body, up to the maximum this endpoint documents. Lowering `count` or turning off the `with_*` flags also helps, because less work finishes sooner.412 — Article not found (well-formed but nonexistent id, slug or URL) Retrying will not help: either the entity does not exist, or the input points at a different one.429 — Too many requests: a rate limit or a usage window is exhausted When the response carries an X-Retry-After header, wait that many seconds and retry: the same number is in the body as `detail.retry_after`, and the limit clears once that window passes. The message in the body names the limit that was hit.500 — Something broke on our side Retrying will not help. If it keeps happening, send us the X-Request-ID from the response headers.529 — Rate limit reached, or the endpoint is overloaded Wait at least 30 seconds, then retry.X-Error — Error message text (present only on error)X-Request-ID — Unique request identifierX-Execution-Time — Execution time in secondsX-Result-Count — How many records the body carries. 0 means an empty result, which is a normal answer and not by itself an error. A non-zero count can come back together with X-Error when the failure happened partway through — read this header and X-Error independently.X-Total-Available-Results — How many records exist for this query, when the endpoint can say. On a `dry_run` request this is the answer and the body is empty. It saturates: the endpoint's documented maximum means 'at least that many', any smaller number is exact.X-Warning — Present when the request body carried keys this endpoint does not document. They were ignored, so any filter you meant to apply through them did not apply. Check the spelling against this schema and retry.X-Retry-After — Seconds to wait before retrying. Present only on 429.