{"openapi":"3.1.0","info":{"title":"Website Technology & Tech Stack Detection API","version":"1.0.0","description":"Detect the CMS, e-commerce platform, JavaScript frameworks, analytics, tag managers, CDN, hosting, payment, chat, consent and more a website uses (325 technologies in 31 categories), with a confidence level, version when visible, and the evidence for each match. A BuiltWith / Wappalyzer alternative with hand-written fingerprints (headers, cookies, meta tags, script and asset URLs).\n\nAll endpoints accept GET (query string) or POST (JSON body). Errors use one shape: `{\"success\": false, \"error\": {\"code\", \"message\", \"retryable\"}}`. When a numeric `Retry-After` header is present, `error.retryAfterSeconds` is included.","contact":{"name":"TidyTools","url":"https://apify.com/tidytools"}},"servers":[{"url":"https://webcapture-api.yukailin.workers.dev","description":"Origin (reachable only through the marketplace gateway)"}],"tags":[{"name":"Tech stack"}],"paths":{"/api/v1/techstack":{"get":{"operationId":"techstackGet","summary":"Detect the technologies of a website (GET)","description":"Fetches the page with headers and cookies (a real browser if the site blocks plain requests) and matches it against the fingerprint list.","tags":["Tech stack"],"parameters":[{"name":"url","schema":{"type":"string"},"description":"Page URL. A bare domain such as `example.com` is accepted (https is assumed). Private, local and cloud-metadata addresses are refused.","required":true,"example":"https://example.com","in":"query"},{"name":"minConfidence","schema":{"type":"string","default":"medium","enum":["medium","high"]},"description":"`medium` includes weak single-signal matches; `high` only strong ones.","required":false,"in":"query"},{"name":"includeEvidence","schema":{"type":"boolean","default":true},"description":"Include up to 3 evidence strings per technology.","required":false,"in":"query"},{"name":"render","schema":{"type":"string","default":"auto","enum":["auto","never","always"]},"description":"`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.","required":false,"in":"query"},{"name":"timeoutMs","schema":{"type":"integer","default":15000,"minimum":1000,"maximum":30000},"description":"Page-load timeout in milliseconds.","required":false,"in":"query"}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"url":{"type":"string"},"finalUrl":{"type":"string"},"statusCode":{"type":"integer"},"renderedWith":{"type":"string"},"count":{"type":"integer"},"technologies":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"category":{"type":"string"},"confidence":{"type":"string"},"version":{"type":"string"},"evidence":{"type":"array","items":{"type":"string"}}}}},"categories":{"type":"object","properties":{"CMS":{"type":"array","items":{"type":"string"}},"Tag manager":{"type":"array","items":{"type":"string"}},"Programming language":{"type":"array","items":{"type":"string"}},"WordPress plugin":{"type":"array","items":{"type":"string"}}}}}},"example":{"success":true,"url":"https://wordpress.org/news/","finalUrl":"https://wordpress.org/news/","statusCode":200,"renderedWith":"http","count":4,"technologies":[{"name":"WordPress","category":"CMS","confidence":"high","version":"7.2","evidence":["header: link: <https://wordpress.org/news/wp-json/>; rel=\"https://api.w.org/\", <https://wordp…","meta: generator: WordPress 7.2-alpha-64014","script: https://wordpress.org/news/wp-content/mu-plugins/pub-sync/blocks/local-navigation-bar/build/view.js?ver=2ae6cba4cf35f43…"]},{"name":"Google Tag Manager","category":"Tag manager","confidence":"high","version":null,"evidence":["inline script: j.src= 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insert","iframe: https://www.googletagmanager.com/ns.html?id=GTM-P24PF4B","inline script: w[l]||[];w[l].push({'gtm.start': new Date().getTime(),event:'"]},{"name":"PHP","category":"Programming language","confidence":"high","version":null,"impliedBy":"WordPress","evidence":["implied by WordPress"]},{"name":"Jetpack","category":"WordPress plugin","confidence":"high","version":null,"evidence":["script: https://stats.wp.com/e-202640.js"]}],"categories":{"CMS":["WordPress"],"Tag manager":["Google Tag Manager"],"Programming language":["PHP"],"WordPress plugin":["Jetpack"]}}}}},"400":{"description":"Invalid parameter (`invalid_request`) or a private/local target (`url_not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"error":{"code":"url_not_allowed","message":"private, local and reserved hosts are not allowed"}}}}},"413":{"description":"Request body or target document too large (`too_large`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The target site refused (`target_blocked`), could not be reached or its domain does not resolve (`target_unreachable`), the page does not exist (`target_error`, HTTP 404/410), or returned unsupported content.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"error":{"code":"target_blocked","message":"The target refused the request: target returned HTTP 403","details":{"targetStatus":403,"finalUrl":"https://www.g2.com/"}}}}}},"502":{"description":"Temporary failure on our side (`upstream_error`); safe to retry.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"The target did not respond in time (`timeout`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"techstack","summary":"Detect the technologies of a website","description":"Fetches the page with headers and cookies (a real browser if the site blocks plain requests) and matches it against the fingerprint list.\n\nThe same parameters as the GET form, sent as a JSON body.","tags":["Tech stack"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","description":"Page URL. A bare domain such as `example.com` is accepted (https is assumed). Private, local and cloud-metadata addresses are refused."},"minConfidence":{"type":"string","default":"medium","enum":["medium","high"],"description":"`medium` includes weak single-signal matches; `high` only strong ones."},"includeEvidence":{"type":"boolean","default":true,"description":"Include up to 3 evidence strings per technology."},"render":{"type":"string","default":"auto","enum":["auto","never","always"],"description":"`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."},"timeoutMs":{"type":"integer","default":15000,"minimum":1000,"maximum":30000,"description":"Page-load timeout in milliseconds."}},"required":["url"]}}}},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"url":{"type":"string"},"finalUrl":{"type":"string"},"statusCode":{"type":"integer"},"renderedWith":{"type":"string"},"count":{"type":"integer"},"technologies":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"category":{"type":"string"},"confidence":{"type":"string"},"version":{"type":"string"},"evidence":{"type":"array","items":{"type":"string"}}}}},"categories":{"type":"object","properties":{"CMS":{"type":"array","items":{"type":"string"}},"Tag manager":{"type":"array","items":{"type":"string"}},"Programming language":{"type":"array","items":{"type":"string"}},"WordPress plugin":{"type":"array","items":{"type":"string"}}}}}},"example":{"success":true,"url":"https://wordpress.org/news/","finalUrl":"https://wordpress.org/news/","statusCode":200,"renderedWith":"http","count":4,"technologies":[{"name":"WordPress","category":"CMS","confidence":"high","version":"7.2","evidence":["header: link: <https://wordpress.org/news/wp-json/>; rel=\"https://api.w.org/\", <https://wordp…","meta: generator: WordPress 7.2-alpha-64014","script: https://wordpress.org/news/wp-content/mu-plugins/pub-sync/blocks/local-navigation-bar/build/view.js?ver=2ae6cba4cf35f43…"]},{"name":"Google Tag Manager","category":"Tag manager","confidence":"high","version":null,"evidence":["inline script: j.src= 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insert","iframe: https://www.googletagmanager.com/ns.html?id=GTM-P24PF4B","inline script: w[l]||[];w[l].push({'gtm.start': new Date().getTime(),event:'"]},{"name":"PHP","category":"Programming language","confidence":"high","version":null,"impliedBy":"WordPress","evidence":["implied by WordPress"]},{"name":"Jetpack","category":"WordPress plugin","confidence":"high","version":null,"evidence":["script: https://stats.wp.com/e-202640.js"]}],"categories":{"CMS":["WordPress"],"Tag manager":["Google Tag Manager"],"Programming language":["PHP"],"WordPress plugin":["Jetpack"]}}}}},"400":{"description":"Invalid parameter (`invalid_request`) or a private/local target (`url_not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"error":{"code":"url_not_allowed","message":"private, local and reserved hosts are not allowed"}}}}},"413":{"description":"Request body or target document too large (`too_large`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The target site refused (`target_blocked`), could not be reached or its domain does not resolve (`target_unreachable`), the page does not exist (`target_error`, HTTP 404/410), or returned unsupported content.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"error":{"code":"target_blocked","message":"The target refused the request: target returned HTTP 403","details":{"targetStatus":403,"finalUrl":"https://www.g2.com/"}}}}}},"502":{"description":"Temporary failure on our side (`upstream_error`); safe to retry.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"The target did not respond in time (`timeout`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}},"components":{"schemas":{"Error":{"type":"object","required":["success","error"],"properties":{"success":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_configured","unauthorized","not_found","method_not_allowed","invalid_request","rate_limited","url_not_allowed","target_blocked","target_unreachable","target_error","unsupported_content","too_large","timeout","upstream_error","board_not_found","app_not_found"]},"message":{"type":"string"},"retryable":{"type":"boolean","description":"true for rate_limited, timeout, upstream_error and browser_busy; false for other errors."},"retryAfterSeconds":{"type":"integer","description":"Seconds to wait before retrying, when a numeric Retry-After header is present."},"details":{"type":"object","additionalProperties":true}}}}}}}}