Skip to main content
Glama
jlucasmcrell

Apify Public Data & Leads

Website Tech Stack & Ecommerce Scanner

tech_stack_detector
Read-only

Scan public websites to identify their CMS, ecommerce platform, payment gateway, CDN, analytics, hosting, and other technologies, plus extract contact and social links.

Instructions

Scan a batch of public websites and detect the CMS, ecommerce platform, payment gateway, CDN, analytics, hosting, and 15 other technology categories from 75 signatures, alongside the infrastructure headers, page metadata, and contact/social links the same page response already carries.

Behavioral Transparency:

  • Execution: Network call executed synchronously in the cloud via Apify Actor 'captainhandsome/tech-stack-detector'.

  • Side Effects: Reads public sources and creates a billed Actor run and dataset on your Apify account.

  • Authentication: Requires APIFY_TOKEN environment variable.

  • Latency & Limits: Typical run duration is 5-20 seconds for a small batch; timeout capped at 120 seconds. Detection is signature-based HTML/header matching, not a headless browser, so it is evidence of presence, never proof of absence, and JavaScript-rendered technology is not executed or seen.

Usage Guidelines:

  • When to use: Use for competitive technology research, B2B lead qualification and segmentation, ecommerce/payment-stack prospecting, or pulling the public contact and social links a company's own website exposes.

  • When NOT to use: Do not use for a company's legal registration or corporate-registry status (use 'us_business_entity_search' or 'gleif_lei_search'), hiring signals (use 'linkedin_jobs_search' or 'glassdoor_jobs_search'), app-store sentiment (use 'google_play_reviews_search'), or a business's physical location and reviews (use 'google_maps_search').

  • Named alternatives: Use 'us_business_entity_search' for state corporate registry records, 'gleif_lei_search' for global legal entity identifiers, 'linkedin_jobs_search' or 'glassdoor_jobs_search' for a company's open roles and employee sentiment, or 'google_maps_search' for a business's physical location and reviews.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
urlsYesDomains or URLs to analyze; one record is returned per site. A bare domain is normalized to https automatically. Example: ["ghost.org", "webflow.com"].
max_resultsNoMaximum number of site records to return. Defaults to 10.
include_detailsNoAlso fetch /robots.txt and a discovered contact or about page per site, adding the sitemap URL, crawl-rule count, and any extra emails/phones the homepage omits. Costs up to two extra requests per site. Defaults to false.

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
runNo
errorNo
statusYes
resultsYes

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed82 schema fields changedv1.1.0
    • addedInput schema / additionalProperties
      Added value: +false
    • addedInput schema / properties / urls / maxItems
      Added value: +100
    • addedOutput schema / properties / error
      Added value: +{
      +  "type": "object"
      +}
    • removedOutput schema / properties / results / description
      Removed value: -"One record per analyzed website."
    • changedOutput schema / properties / results / items / properties / analytics / description
      Previous value: -"Detected analytics and tag-management tools, comma separated."New value: +"Detected analytics and tag-management tools, comma-separated."
    • addedOutput schema / properties / results / items / properties / analytics / title
      Added value: +"Analytics"
    • changedOutput schema / properties / results / items / properties / analytics / type
      Previous value: -"string"New value: +[
      +  "string",
      +  "null"
      +]
    • changedOutput schema / properties / results / items / properties / categories / description
      Previous value: -"Distinct categories of detected technologies, e.g. cdn, framework."New value: +"Distinct categories of detected technologies."
    • removedOutput schema / properties / results / items / properties / categories / items
      Removed value: -{
      -  "type": "string"
      -}
    • addedOutput schema / properties / results / items / properties / categories / title
      Added value: +"Categories"
    • changedOutput schema / properties / results / items / properties / categories / type
      Previous value: -"array"New value: +[
      +  "array",
      +  "null"
      +]
    • changedOutput schema / properties / results / items / properties / cdn / description
      Previous value: -"Detected content delivery networks, comma separated."New value: +"Detected content delivery networks, comma-separated."
    • addedOutput schema / properties / results / items / properties / cdn / title
      Added value: +"Cdn"
    • changedOutput schema / properties / results / items / properties / cdn / type
      Previous value: -"string"New value: +[
      +  "string",
      +  "null"
      +]
    • changedOutput schema / properties / results / items / properties / cms / description
      Previous value: -"Detected content management systems, comma separated."New value: +"Detected content management systems, comma-separated."
    • addedOutput schema / properties / results / items / properties / cms / title
      Added value: +"Cms"
    • changedOutput schema / properties / results / items / properties / cms / type
      Previous value: -"string"New value: +[
      +  "string",
      +  "null"
      +]
    • changedOutput schema / properties / results / items / properties / contact_page_url / description
      Previous value: -"Contact or about page found on the same host. Null unless include_details is on."New value: +"Contact or about page found on the same host and fetched for extra contact details. Null unless include_details is on."
    • addedOutput schema / properties / results / items / properties / contact_page_url / title
      Added value: +"Contact Page Url"
    • changedOutput schema / properties / results / items / properties / contact_page_url / type
      Previous value: -"string"New value: +[
      +  "string",
      +  "null"
      +]
    • addedOutput schema / properties / results / items / properties / count / title
      Added value: +"Count"
    • changedOutput schema / properties / results / items / properties / count / type
      Previous value: -"integer"New value: +[
      +  "integer",
      +  "null"
      +]
    • changedOutput schema / properties / results / items / properties / domain / description
      Previous value: -"Registered host of the final URL with any leading www. removed."New value: +"Registered host of the final URL with any leading www. removed, for joining and de-duplicating lists."
    • addedOutput schema / properties / results / items / properties / domain / title
      Added value: +"Domain"
    • changedOutput schema / properties / results / items / properties / domain / type
      Previous value: -"string"New value: +[
      +  "string",
      +  "null"
      +]
    • changedOutput schema / properties / results / items / properties / ecommerce_platform / description
      Previous value: -"Detected ecommerce platforms, comma separated."New value: +"Detected ecommerce platforms, comma-separated."
    • addedOutput schema / properties / results / items / properties / ecommerce_platform / title
      Added value: +"Ecommerce Platform"
    • changedOutput schema / properties / results / items / properties / ecommerce_platform / type
      Previous value: -"string"New value: +[
      +  "string",
      +  "null"
      +]
    • changedOutput schema / properties / results / items / properties / emails / description
      Previous value: -"Email addresses published on the page (mailto: links plus same-domain plain-text addresses), comma separated."New value: +"Email addresses published on the page: every mailto: target, plus plain-text addresses on the site's own domain. Includes the contact page when include_details is on."
    • addedOutput schema / properties / results / items / properties / emails / title
      Added value: +"Emails"
    • changedOutput schema / properties / results / items / properties / emails / type
      Previous value: -"string"New value: +[
      +  "string",
      +  "null"
      +]
    • changedOutput schema / properties / results / items / properties / error / description
      Previous value: -"Fetch or processing error for this site, or null on success."New value: +"Fetch or processing error, or null on success."
    • addedOutput schema / properties / results / items / properties / error / title
      Added value: +"Error"
    • changedOutput schema / properties / results / items / properties / error / type
      Previous value: -"string"New value: +[
      +  "string",
      +  "null"
      +]
    • addedOutput schema / properties / results / items / properties / final_url / title
      Added value: +"Final Url"
    • changedOutput schema / properties / results / items / properties / final_url / type
      Previous value: -"string"New value: +[
      +  "string",
      +  "null"
      +]
    • changedOutput schema / properties / results / items / properties / framework / description
      Previous value: -"Detected web application frameworks, comma separated."New value: +"Detected web application frameworks, comma-separated."
    • addedOutput schema / properties / results / items / properties / framework / title
      Added value: +"Framework"
    • changedOutput schema / properties / results / items / properties / framework / type
      Previous value: -"string"New value: +[
      +  "string",
      +  "null"
      +]
    • changedOutput schema / properties / results / items / properties / github_url / description
      Previous value: -"First GitHub organization or repository URL linked from the page."New value: +"First GitHub organisation or repository URL linked from the page."
    • addedOutput schema / properties / results / items / properties / github_url / title
      Added value: +"Github Url"
    • changedOutput schema / properties / results / items / properties / github_url / type
      Previous value: -"string"New value: +[
      +  "string",
      +  "null"
      +]
    • changedOutput schema / properties / results / items / properties / hosting / description
      Previous value: -"Detected hosting and deployment platforms, comma separated."New value: +"Detected hosting and deployment platforms, comma-separated."
    • addedOutput schema / properties / results / items / properties / hosting / title
      Added value: +"Hosting"
    • changedOutput schema / properties / results / items / properties / hosting / type
      Previous value: -"string"New value: +[
      +  "string",
      +  "null"
      +]
    • addedOutput schema / properties / results / items / properties / is_https / title
      Added value: +"Is Https"
    • changedOutput schema / properties / results / items / properties / is_https / type
      Previous value: -"boolean"New value: +[
      +  "boolean",
      +  "null"
      +]
    • changedOutput schema / properties / results / items / properties / linkedin_url / description
      Previous value: -"First LinkedIn company, school, or member URL linked from the page."New value: +"First LinkedIn company, school or member URL linked from the page."
    • addedOutput schema / properties / results / items / properties / linkedin_url / title
      Added value: +"Linkedin Url"
    • changedOutput schema / properties / results / items / properties / linkedin_url / type
      Previous value: -"string"New value: +[
      +  "string",
      +  "null"
      +]
    • addedOutput schema / properties / results / items / properties / meta_description / title
      Added value: +"Meta Description"
    • changedOutput schema / properties / results / items / properties / meta_description / type
      Previous value: -"string"New value: +[
      +  "string",
      +  "null"
      +]
    • changedOutput schema / properties / results / items / properties / payments / description
      Previous value: -"Detected payment providers, comma separated."New value: +"Detected payment providers, comma-separated."
    • addedOutput schema / properties / results / items / properties / payments / title
      Added value: +"Payments"
    • changedOutput schema / properties / results / items / properties / payments / type
      Previous value: -"string"New value: +[
      +  "string",
      +  "null"
      +]
    • changedOutput schema / properties / results / items / properties / phones / description
      Previous value: -"Phone numbers taken from tel: links, comma separated."New value: +"Phone numbers taken from tel: links, comma-separated."
    • addedOutput schema / properties / results / items / properties / phones / title
      Added value: +"Phones"
    • changedOutput schema / properties / results / items / properties / phones / type
      Previous value: -"string"New value: +[
      +  "string",
      +  "null"
      +]
    • addedOutput schema / properties / results / items / properties / robots_txt_found / title
      Added value: +"Robots Txt Found"
    • changedOutput schema / properties / results / items / properties / robots_txt_found / type
      Previous value: -"boolean"New value: +[
      +  "boolean",
      +  "null"
      +]
    • changedOutput schema / properties / results / items / properties / security_tech / description
      Previous value: -"Detected bot-protection and CAPTCHA services, comma separated."New value: +"Detected bot-protection and CAPTCHA services, comma-separated."
    • addedOutput schema / properties / results / items / properties / security_tech / title
      Added value: +"Security Tech"
    • changedOutput schema / properties / results / items / properties / security_tech / type
      Previous value: -"string"New value: +[
      +  "string",
      +  "null"
      +]
    • addedOutput schema / properties / results / items / properties / sitemap_url / title
      Added value: +"Sitemap Url"
    • changedOutput schema / properties / results / items / properties / sitemap_url / type
      Previous value: -"string"New value: +[
      +  "string",
      +  "null"
      +]
    • addedOutput schema / properties / results / items / properties / status / title
      Added value: +"Status"
    • changedOutput schema / properties / results / items / properties / status / type
      Previous value: -"integer"New value: +[
      +  "integer",
      +  "null"
      +]
    • changedOutput schema / properties / results / items / properties / technologies / description
      Previous value: -"Detected technology names, e.g. Fastly, Next.js."New value: +"Detected technology names."
    • removedOutput schema / properties / results / items / properties / technologies / items
      Removed value: -{
      -  "type": "string"
      -}
    • addedOutput schema / properties / results / items / properties / technologies / title
      Added value: +"Technologies"
    • changedOutput schema / properties / results / items / properties / technologies / type
      Previous value: -"array"New value: +[
      +  "array",
      +  "null"
      +]
    • addedOutput schema / properties / results / items / properties / title / title
      Added value: +"Title"
    • changedOutput schema / properties / results / items / properties / title / type
      Previous value: -"string"New value: +[
      +  "string",
      +  "null"
      +]
    • addedOutput schema / properties / results / items / properties / twitter_url / title
      Added value: +"Twitter Url"
    • changedOutput schema / properties / results / items / properties / twitter_url / type
      Previous value: -"string"New value: +[
      +  "string",
      +  "null"
      +]
    • changedOutput schema / properties / results / items / properties / url / description
      Previous value: -"Requested website URL, as normalized before the request."New value: +"Requested website URL."
    • addedOutput schema / properties / results / items / properties / url / title
      Added value: +"Url"
    • changedOutput schema / properties / results / items / properties / url / type
      Previous value: -"string"New value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / results / items / required
      Removed value: -[
      -  "url"
      -]
    • addedOutput schema / properties / run
      Added value: +{
      +  "type": "object"
      +}
    • addedOutput schema / properties / status
      Added value: +{
      +  "enum": [
      +    "success",
      +    "empty_unverified",
      +    "partial",
      +    "error"
      +  ],
      +  "type": "string"
      +}
    • changedOutput schema / required
      Previous value: -[
      -  "results"
      -]New value: +[
      +  "results",
      +  "status"
      +]
  2. Addedv1.0.11

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description goes well beyond the annotations by disclosing that execution is a synchronous cloud network call, that it creates a billed Actor run and dataset, that APIFY_TOKEN is required, that latency is typically 5-20s capped at 120s, and that detection is signature-based and therefore cannot prove absence of JavaScript-rendered technology. This is exactly the kind of contextual behavioral transparency that annotations alone do not provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The core purpose is front-loaded in the first sentence, and the Behavioral Transparency and Usage Guidelines sections are well organized. It is slightly longer than strictly necessary, with some redundancy between the 'When NOT to use' list and the 'Named alternatives' section, but every major section earns its place given the tool's complexity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with this complexity, the description covers execution model, authentication, side effects, latency caps, limitations, use cases, exclusions, and named alternatives. An output schema exists, so detailed return-value documentation is not required here; nothing essential is missing for an agent to select and invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the input schema already documents urls, max_results, and include_details well, including defaults, ranges, and behavioral effects such as extra requests for include_details. The description does not add significant parameter-level meaning beyond that, so the baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action ('Scan a batch of public websites and detect...') and a concrete resource with rich detail: CMS, ecommerce platform, payment gateway, CDN, analytics, hosting, plus 15 other categories from 75 signatures. It clearly differentiates this from the sibling business/job/map search tools by emphasizing website technology detection.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly lists when to use the tool for competitive tech research and B2B prospecting, and when NOT to use it, naming concrete alternatives like us_business_entity_search, gleif_lei_search, linkedin_jobs_search, glassdoor_jobs_search, google_play_reviews_search, and google_maps_search. This gives an agent strong routing guidance beyond any schema information.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.