An AI website detector API: check from code if a site was built with AI

Check from code whether a site was built with Lovable, Bolt, v0 or another AI builder: one API call, a batch of 50 sites, or a question to your AI agent, each answer with its evidence.

If you need to know whether one website was made with an AI builder, the AI Website Detector answers in a few seconds. If you need to know it for a list of sites, a spreadsheet of leads, every supplier in a marketplace, or inside a tool you’re building, you want the same answer from code: an AI website detector API. Here is how, with the CheckAnySite API, its Python library and its MCP server.

The short version: one request returns the AI builders whose traces a site carries, each with the exact line we found, plus anything else you ask for, such as its tech stack and the domain’s age. You get a free key with monthly credits.

One request

Ask for a site’s stored result with the ai check:

curl "https://api.checkanysite.com/v1/sites/lovable.dev?checks=ai" \
  -H "Authorization: Bearer $CHECKANYSITE_API_KEY"

What comes back:

  • ai.level: high when a builder’s own trace was found, medium when only a combination of weaker traces was, and none when there were none.
  • ai.builders: each builder found, with its name, its kind (ai for AI builders, general for other site builders) and its evidence, the line of the page, header or address that gave it away.
  • resultUrl: our result page, where a person can see the same evidence.

A lookup reads our stored result and never scans. For a site we haven’t seen, start a scan with POST /v1/scans; the quickstart shows both.

In Python

Install the library with pip install checkanysite (or uv add checkanysite) and set your key in CHECKANYSITE_API_KEY. Then:

from checkanysite import CheckAnySite

client = CheckAnySite()  # Reads the key from CHECKANYSITE_API_KEY.
site = client.sites.retrieve("lovable.dev", checks=["ai"])

if site.ai.level == "none":
    print(f"No AI builder traces found on {site.domain}.")
else:
    builders = ", ".join(builder.name for builder in site.ai.builders)
    print(f"{site.domain}: traces of {builders}, {site.ai.level} confidence")
print(f"Evidence: {site.result_url}")

Check a list of sites

client.sites.batch looks up to 50 sites in one request. This example writes each site’s AI builders, a few of its technologies and the date its domain was registered to a CSV file:

import csv

from checkanysite import CheckAnySite

client = CheckAnySite()
domains = ["lovable.dev", "stripe.com", "example.org"]
batch = client.sites.batch(domains, checks=["ai", "tech", "history"])

with open("sites.csv", "w", newline="") as file:
    writer = csv.writer(file)
    writer.writerow(["domain", "ai_level", "ai_builders", "technologies", "registered"])
    for item in batch.data:
        if not item.result:
            writer.writerow([item.input, "", "", "", item.error.message])
            continue
        site = item.result
        builders = ", ".join(b.name for b in site.ai.builders if b.kind == "ai")
        technologies = ", ".join(t.name for t in site.tech.technologies[:5])
        registration = site.history.registration
        registered = registration.registered_at.date().isoformat() if registration and registration.registered_at else ""
        writer.writerow([site.domain, site.ai.level, builders, technologies, registered])

A site without a stored result comes back with an error in its place and costs nothing. To check those too, client.scans.batch_and_wait scans up to 10 sites and waits for the results.

Ask your AI agent instead

The same answers are tools in our MCP server, so Claude, ChatGPT, Cursor or VS Code can ask them while you work. In Claude Code:

claude mcp add --transport http checkanysite https://checkanysite.com/mcp \
  --header "Authorization: Bearer $CHECKANYSITE_API_KEY"

Then ask in plain words: “Was cinegram.lovable.app vibe coded?” The agent calls detect_ai_builder and answers with the traces it found. In the Claude app, add https://checkanysite.com/mcp as a custom connector and sign in: there’s no key to copy. The MCP docs cover every client.

How to read the answer

  • A trace proves the builder was used, at least once. A Lovable badge script or a .lovable.app address doesn’t appear by accident.
  • No traces never proves a person built the site. Builders let people remove their traces, and some leave none. That’s why the level is none, not “human”.
  • It says how a site was built, not who runs it or whether to trust it. For that, ask the trust check, which lists signals such as contact details and domain age, with their sources.

Our accuracy test measures the detector on sites whose makers we know, misses included, and How to tell if a website was made with AI explains every kind of trace.

What it costs

Each check costs credits, fewer from a stored result than with a new scan, and a request never costs more than every check at once. A free key comes with monthly credits: get one here, where every check, its price and its MCP tool are listed.

Real websites made with AI builders

Put it to work

Domain History

How old is this website?

ExampleFirst archived in 2009; two changes since our last scan
See its history

Something here out of date or wrong? Tell us and we’ll fix it, with the date of the change.