Tech Stack Checker API: what any website is built with
Send a list of URLs and get back what each site is running: the content management system and its plugins, the ecommerce platform, the analytics and tag managers, the JavaScript frameworks, the payment and chat widgets, the web server and the CDN. Version numbers come back wherever the page states one. Fifty URLs per call, one plain fetch each, no browser anywhere.
POST/v1/tech/detect
{
"data": [
{
"url": "techcrunch.com",
"final_url": "https://techcrunch.com/",
"status": "ok",
"http_status": 200,
"technologies": [
{
"name": "WordPress",
"categories": [
"CMS",
"Blogs"
],
"version": "6.9.7"
},
{
"name": "PHP",
"categories": [
"Programming languages"
],
"version": null
},
{
"name": "MySQL",
"categories": [
"Databases"
],
"version": null
},
{
"name": "Yoast SEO",
"categories": [
"SEO",
"WordPress plugins"
],
"version": "25.1"
},
{
"name": "Nginx",
"categories": [
"Web servers",
"Reverse proxies"
],
"version": null
},
"… 6 more technologies"
],
"tech_names": [
"WordPress",
"PHP",
"MySQL",
"Yoast SEO",
"Nginx",
"…"
],
"tech_slugs": [
"wordpress",
"php",
"mysql",
"yoast-seo",
"nginx",
"…"
],
"tech_count": 11,
"categories": [
"CMS",
"Databases",
"SEO",
"Security",
"Tag managers",
"…"
],
"scan_time_ms": 885
},
"… 1 more URL"
],
"meta": {
"request_id": "req_0d4a17c9b2e5",
"credits_used": 2,
"latency_ms": 1904
}
}
What you get
Every field in the response.
| Field | Meaning |
|---|---|
url, final_url | The URL you sent, and the address the fetch ended at after any redirects. Send a bare domain or a full URL to any page; both are accepted |
status | ok when the page was read and answered. A URL we could not reach, one our own safety guard refused, one whose path the site's robots.txt disallows, one that was not a web page at all and one that ran out of time are each marked instead, and none of them is charged for. So is filtered, a page whose every finding your own category filter removed |
http_status | The status code the site answered with, or null when nothing answered at all |
technologies[] | One entry per finding: name, categories, and version where the page states one. A technology another one implies is included in its own right, so WordPress brings PHP and MySQL with it |
tech_names[] | The same findings as a flat list of proper names, the column to put in a spreadsheet |
tech_slugs[] | The same findings as slugs, the form the tech_stack field uses elsewhere in Locomint, for joining a batch against records you already hold |
tech_count | How many technologies were found on that URL |
categories[] | Every category present on the site, so a batch can be sorted by what sites use rather than by which particular product they chose |
scan_time_ms | How long that URL took, the fetch included |
How it works
What happens between your request and the response.
One fetch per URL
Each page is requested once, from a datacenter address, the way a browser asks for it the first time. What comes back is what gets matched: the HTML, the response headers, the cookies the server sets, the meta tags and the script URLs on the page. Nothing is rendered, which is why fifty sites finish in seconds and cost a credit each rather than the price of a browser.
Matched against 7,610 fingerprints
The findings come from an open fingerprint set of 7,610 technologies in 107 categories, from content management systems and ecommerce platforms to analytics, tag managers, frameworks, payment processors, chat widgets, web servers, CDNs and WordPress plugins. 5,834 of them can be recognised from what a server sends, and those are the ones this endpoint reads.
Versions where the page states them
A version is reported only when the site gives it away, in a generator tag, a script filename or a plugin's own query string. Nothing is inferred from a release date, so a missing version means the site did not say rather than that the software is old.
Stops at a refusal
Public pages only, at a conservative pace. Each site's robots.txt is read before its page and a disallowed path is not fetched at all. A site that answers with a challenge or a rate limit ends the attempt there: it is never retried through a different address, and either way that row comes back marked and free.
Pricing
One credit system for every endpoint.
One credit per URL actually read, and between one and fifty URLs in a call. A URL we could not fetch, one our safety guard refused and one that ran out of time all come back marked and cost nothing. It uses no proxy bandwidth, so the free plan's 75 credits a month cover 75 sites.
Run it on Apify.
For bigger runs, or without writing any code, the same engine runs on Apify as the listing below. Apify bills per result, so there is no subscription and nothing to pay us, and Apify's own free plan includes $5 of usage a month with no card.
Questions
Things people ask about the Tech Stack Checker API.
Does it need a browser?
No, and that is the whole design. One ordinary HTTP request per URL, the same one a browser makes first, and the answer is read out of the HTML, the response headers, the cookies the server sets and the script URLs on the page. No browser is started and no JavaScript runs, which is what keeps fifty URLs to a few seconds and one credit a site.
How many technologies can it find?
7,610 are indexed, in 107 categories. 5,834 of those can be recognised from what a server sends without running any code, and that is the set this endpoint works from. On real sites it is the difference between naming the platform and naming the platform, its plugins, the analytics, the tag manager, the web server, the CDN and the language underneath.
What will it miss?
Anything a site only reveals once JavaScript has run. About a quarter of the fingerprint set is written that way, because it looks for a variable a script creates in the browser, and we do not run the browser, so those are not claimed. In practice a single-page app that renders everything client-side returns less than a server-rendered site of the same size, and a version is absent whenever the page never printed one.
How fresh are the fingerprints?
They are pinned to one commit of the upstream set rather than pulled live, so the same page checked twice gives the same answer and nothing shifts under a job halfway through. The pin is moved deliberately, and the safety and timing checks are re-run against hostile input before it moves.
Where do the technology fingerprints come from?
Technology detection matches each page against an open fingerprint set maintained by the enthec/webappanalyzer project, used under the GPL-3.0 and pinned to a specific commit. Locomint runs those fingerprints on its own servers and returns the results; the fingerprint data itself is not redistributed.
Does it read robots.txt?
This API does, before it reads the page: a path a site disallows for a general client is not fetched at all, comes back as robots_disallowed with the rule quoted, and costs no credit - so a site that excludes crawlers returns no technologies here. The Tech Stack Detector listing on Apify is deliberately the other way round: it reads whatever list of pages you give it, because you are naming pages you already mean to look at rather than turning a crawler loose. Neither one ever works around a block: a challenge or a rate limit ends that row and is never retried through another address. Pick the API when you want those rules applied for you.
How is this different from the Company Enrichment API?
Same detection engine, different question. Company enrichment starts from a domain and returns the company: what the site says it is, its email addresses, its social profiles, and the technologies as one part of that record. This starts from a list of URLs, any page and not just a homepage, returns the technologies and nothing else, and takes fifty at a time.