AIScan data study cover: Who publishes the agent files, 36.0% pass at least one of P1, P3, P4, E2, 835 sites
AIScan data study cover: Who publishes the agent files, 36.0% pass at least one of P1, P3, P4, E2, 835 sites
AI Readiness

Agent Discovery Files Census: P1, P3, P4 and E2 Across 835 Sites

We counted who publishes an API catalog, Agent Skills, OAuth metadata and OpenAPI across 835 scanned sites: 36% pass one, 11.9% pass all four, mostly Astro.

AAIScan Content Team 11 Oct 2026 16 min read

This guide covers P1 · Capabilities, P3 · Capabilities, P4 · Capabilities, E2 · Capabilities.

Table of contents

Only 301 of the 835 sites in our scan corpus pass any one of four agent-discovery checks that depend on a /.well-known/ file or an API description. All four pass on 99 sites. Take out one platform and the picture changes: 79 of those 99 are Astro sites, which are 113 of the 835 hosts. This post is the census behind those numbers, built from what our scanner stored, with the limits of that evidence stated next to every figure.

The four checks are P1 (API catalog, /.well-known/api-catalog), P3 (Agent Skills bundle), P4 (OAuth discovery documents) and E2 (an OpenAPI description). They sit on the capabilities page of our check docs. Each one asks a site to publish a machine-readable file at a predictable address so that an agent does not have to guess.

TL;DR: what the census found

QuestionAnswer from 835 hostsWhere it comes from
How many sites pass at least one of P1, P3, P4, E2?301 (36.0%)scan DB, rubric 2026.08.2
How many pass all four?99 (11.9%)scan DB
How many pass none of the four?534 (64.0%)scan DB
How much of the all-four group is Astro?79 of 99113 Astro hosts in the corpus
Which path is most common?P1 api-catalog, 238 passesscan DB
Which one never fails?P3, which scores a missing file as infoscan DB
Which verdicts disagree with their own evidence?P4: one evidence string, three statusesscan DB

Start here: run npx aiscan-cli yoursite.com (or paste your address at aiscan.site, free, no account) and read the lines for P1, P3, P4 and E2. If you would rather check by hand, the curl commands are in the last section.

Best for a site with an API: publish an OpenAPI file first (E2), then point an API catalog at it (P1). The API catalog how-to walks through the file.

Best for a site with no API: do nothing for P4 and P1 beyond reading the product notes below. A missing file is the right answer there, and two of our four checks score it as a failure anyway.

What we counted, and what we did not

This is a census of stored scan results, not a live sweep of the web. We ran no new probes against third-party hosts for this post. An earlier plan for it called for a fresh sweep of every agentic well-known path across a named external population. That sweep needs thousands of requests to hosts we do not own, so we answered the question from the scans users and we had already run.

The population:

  • Table scans, rubric version 2026.08.2 only, scope site.
  • The latest scan per host, with www. and scheme stripped before deduplicating.
  • aiscan.site excluded.
  • 835 hosts, first scan stored 25 August 2026, read on 11 October 2026.
  • No host is named anywhere in this post.

Every figure was aggregated in SQL. A representative query:

WITH latest AS (
  SELECT DISTINCT ON (lower(regexp_replace(url,'^https?://(www\.)?','')))
         url, platform, result
  FROM scans
  WHERE rubric_version = '2026.08.2' AND scope = 'site'
    AND url NOT ILIKE '%aiscan.site%'
  ORDER BY lower(regexp_replace(url,'^https?://(www\.)?','')), created_at DESC)
SELECT c->>'id' AS check_id, c->>'status' AS status, count(*)
FROM latest, jsonb_array_elements(result->'checks') c
WHERE c->>'id' IN ('P1','P3','P4','E2')
GROUP BY 1, 2 ORDER BY 1, 2;

Three limits shape everything below:

  1. The corpus is not a random sample of the web. It is the set of sites that someone chose to scan. That skews toward people who care about agent readiness, and toward sites built with tools that advertise it. Read every percentage as "of scanned sites", never "of websites".
  2. The evidence stores status codes, not bodies. For these four checks the stored evidence says things like 200 at /.well-known/api-catalog. It does not say whether the body parsed as the file the RFC describes. A soft 200 that returns an HTML page would look the same, and we cannot separate it from a real file without fetching the host again.
  3. Check status has four values. pass, partial, fail and info, where info carries no weight. A missing optional file is often info, so a "pass rate" over the whole corpus mixes sites that failed with sites that were never asked. We give counts for every status.

The four paths, in plain terms

Four well-known paths, defined by four different documents. Calling them "the agentic web files" hides how different they are.

CheckWhat it looks forDefined byWho it is for
P1/.well-known/api-catalog, a linkset listing your APIsRFC 9727Anyone with an API
P3An Agent Skills index under /.well-known/The Agent Skills convention, not an IETF documentSites that want agents to call a service
P4/.well-known/oauth-authorization-server and /.well-known/oauth-protected-resourceRFC 8414 and RFC 9728APIs that require sign-in
E2/openapi.json, /api/openapi.json or a Swagger file, or a catalog entry pointing at oneThe OpenAPI SpecificationAnyone with an HTTP API

The first three live under the /.well-known/ prefix that RFC 8615 reserves for exactly this kind of discovery file. E2 is a convention about common filenames, and it only counts as well-known when a catalog points at it.

Two of the four are only meaningful if you have the thing they describe. A marketing site with no API has nothing to put in an API catalog, no OAuth server to point at and no OpenAPI file to publish. That matters when we get to the verdicts.

The headline table: statuses for all four checks

CheckPassPartialFailInfoPass share of 835
P1 API catalog238016443328.5%
P3 Agent Skills1640067119.6%
P4 OAuth discovery213019342925.5%
E2 OpenAPI184018047122.0%

Each row sums to 835. Three observations before looking at combinations.

P3 cannot fail. Of 835 hosts, 164 pass and 671 are info. The evidence for the info rows is dominated by HTTP 404 (562 hosts), then HTTP 403 (45), HTTP 429 (19), HTTP 530 (12) and 14 rows that read not published (optional). A site that returns 404 for the Agent Skills path loses nothing. That is a defensible rule for an optional convention, and the next table shows it is not how the other three checks treat a missing file.

P3 probes one path. Our own notes from an earlier manual comparison record a large payments site that serves its skills index after a redirect to another host, and P3 reports the miss. The 164 passes are therefore a floor. Neither this post nor the rubric claims that 671 sites lack a skills file.

P1 and P4 count a 429 as a fail in the stored data. Four P1 fails read 429 at /.well-known/api-catalog and four P4 fails read auth-server: 429, protected-resource: 429. A host that rate-limited our scanner is recorded the same as a host without the file. Our determinism self-audit found the same pattern on two other checks and we filed it as a scanner issue.

One absence, three different verdicts

Here is how each check scores a plain "not there":

CheckWhat the stored evidence saysStatus givenHosts
P1404 at /.well-known/api-catalogfail156
P3HTTP 404info562
P4auth-server: 404, protected-resource: 404fail170
E2no /openapi.json, /api/openapi.json or swagger document foundfail180

That is 506 failing readings across P1, P4 and E2 for a plain absence (one host can fail more than one). P3 is the only one of the four that treats a missing file as nothing.

Is that fair? It depends on the site. A store with a public product API and a sign-in flow should publish all of it. A brochure site with no API has nothing to describe, and the check cannot know that. The stored data carries no signal that separates "has an API and forgot to document it" from "has no API". In the rubric P1 is worth 4 points and P4 is worth 3.

For the reader: if your site has no API and no sign-in, a fail on P1, P4 or E2 is the scanner's limit, not your mistake. Publishing an empty catalog to turn the line green would help nobody, and an agent reading it learns nothing true. Treat the failing lines as questions: "Do I have an API?" If the answer is no, move on.

The Astro effect

Compare the platform groups:

PlatformHostsP1 passP3 passP4 passE2 pass
Astro11397 (85.8%)81 (71.7%)88 (77.9%)96 (85.0%)
Unknown29547 (15.9%)38 (12.9%)16 (5.4%)19 (6.4%)
WordPress19723 (11.7%)19 (9.6%)58 (29.4%)13 (6.6%)
Next.js16845 (26.8%)18 (10.7%)24 (14.3%)37 (22.0%)
Shopify172 (11.8%)013 (76.5%)2 (11.8%)
Lovable1714 (82.4%)3 (17.6%)12 (70.6%)11 (64.7%)

Astro hosts are 13.5% of the corpus and supply 97 of the 238 P1 passes (40.8%), 81 of the 164 P3 passes (49.4%) and 96 of the 184 E2 passes (52.2%). Of the 114 E2 passes that rest on "api-catalog advertises a service-desc document", 86 are Astro.

Splitting the corpus in two shows how much of the headline sits in one group:

GroupHostsPass at least onePass all fourAverage overall score
Astro11398 (86.7%)79 (69.9%)88.7
Everything else722203 (28.1%)20 (2.8%)56.5
All hosts835301 (36.0%)99 (11.9%)60.9

Outside Astro, 20 of 722 sites pass all four, and 56 of the 722 pass P4 and nothing else in the group.

We do not know why Astro is this far ahead. One reading is a shared starter template, theme or integration that generates all four files, so a few dozen sites made the same choice once. Another is that the people who build Astro sites and also run an agent-readiness scan are a self-selected group. The data cannot separate those. It says only that the Astro number should not be read as a property of the framework and that it lifts every overall figure for the corpus. When you read the ranking in our priority-ladder study, remember this group is in it.

For everyone else the rates are low and close together: P1 on 141 of 722 non-Astro sites (19.5%), P3 on 83 (11.5%), P4 on 125 (17.3%) and E2 on 88 (12.2%).

P4 is the odd one: one string, three statuses

The most useful query in this programme groups a check's evidence strings. For P4 it turns up something that cannot be a pure function of the evidence.

The string auth-server: 200, protected-resource: 200 appears on 232 hosts. Their statuses:

StatusHosts
pass188
fail12
info32

Identical evidence, three outcomes. Something other than the status codes decides the status, and the stored evidence does not record it. A guess is that the check also reads the body, or the response type, and only the status line is saved. A guess is all it is.

Two more patterns in the P4 data:

  • Of the 213 passes, 188 have both documents answering 200. At least 22 pass with one document answering 200 and the other 404, so the check accepts either document alone.
  • The sites that pass P4 and nothing else are not Astro sites. Of the 56 such hosts, 39 are WordPress, 11 are Shopify and 6 are unknown. P4 is also where WordPress and Shopify do best: 58 of 197 WordPress hosts and 13 of 17 Shopify hosts pass it.

A platform serving a 200 at an OAuth metadata path is not necessarily an OAuth deployment ready for agents. Without the body, "pass" here means "answered", and that is as far as the stored evidence goes. We have not fetched those documents to check them.

E2: the OpenAPI path and the Swagger path

Of 184 E2 passes, 114 come from an API catalog that advertises a service-desc document, which is the link relation RFC 9727 uses to point at an API description. The other 70 are direct hits on a filename.

For the direct hits, the grouped evidence shows /openapi.json answering 200 with application/json on 40 hosts, application/openapi+json on 11 and application/vnd.oai.openapi+json on 7. Those last two are the registered media types for an OpenAPI document, and a client can recognise them without opening the file.

The weakest passes are the seven (at least; this counts only the evidence strings that repeat three or more times) that rest on /swagger.json answering 200 with text/html. A Swagger path that returns HTML is more likely a documentation page or a single-page app falling back to its shell than a JSON file. They pass the check. Whether they should is a question about the check, and a different post, and it is the same pattern we found when C1 passed on status code alone.

On the failing side, 180 hosts show the single string no /openapi.json, /api/openapi.json or swagger document found. The probe list is short. An OpenAPI file at /api/v1/openapi.json, /docs/openapi.yaml or behind a link relation in the HTML head is invisible to it, so a site can document its API well and still fail E2.

How the four combine

Of the 835 hosts, the pass patterns are:

P1P3P4E2Hosts
nononono534
yesyesyesyes99
nonoyesno56
yesnoyesyes43
yesyesnono38
yesnonoyes21
yesyesnoyes17
yesnonono8
yesyesyesno7
yesnoyesno5
nononoyes4
noyesyesno3

Three things stand out.

All-or-nothing. 633 of 835 hosts (75.8%) are either all four or none. A site that publishes one of these files usually has a reason to publish others, or a tool that does it for them.

P1 and E2 travel together. Of the 184 hosts that pass E2, 180 also pass P1. Only 4 pass E2 without P1. That fits the 114 catalog-advertised passes, where the catalog is the route to the OpenAPI file, but it also holds for direct-path hits.

P4 is the loner. 56 hosts pass P4 and nothing else. Only the none-at-all and all-four patterns are more common.

Do the files move the score?

Hosts that pass at least one of the four average an overall score of 83.0. All 835 average 60.9. That gap is large, and it is mostly Astro: the Astro group averages 88.7, the other 722 hosts average 56.5.

This is an association, not a cause. The scoring weights are public: P1 is worth 4 points, P3 4, P4 3, and the checks interact with every other file on the site. Sites that publish agent-discovery files also tend to publish llms.txt, a sitemap and server-rendered pages. Adding a catalog to a site that does none of the rest will not lift it to 83.

If you want the ordering by return for effort, the priority-ladder study ranks all checks by score delta. The four here are not at the top of that list. They matter most to sites that already have an API.

Product notes from this census

These came out of the grouped-evidence queries. We list them because publishing the bugs in your own checks is cheaper than having someone else find them.

  1. P4 status is not derivable from its evidence. The same 200/200 string gives pass, fail and info. Store the reason, such as "body parsed as JSON with an issuer key".
  2. Rate limits read as absence. P1 and P4 score a 429 as a fail. A 429 should read as "could not tell", the way P3 already treats it.
  3. Absence is scored three ways. P3 gives info, the other three give fail. Either every optional file should be info when absent, or the rubric should say why not.
  4. Status codes are stored without bodies. For P1, P4 and E2 the evidence should say whether the body matched the format, so a soft 200 is visible.
  5. P3 probes one path. A redirected or relocated skills index is missed.
  6. E2 probes a short list of filenames. A spec in a conventional but unlisted location fails the check.

Check your own site

The scan is the default way to check this. Run npx aiscan-cli yoursite.com and read four lines: P1, P3, P4 and E2. A status of info means the file is optional and absent; fail means the check expects it and could not find it. If you have an API, treat a fail on P1 and E2 as a to-do. If you have none, you can ignore all four.

If you would rather check by hand:

# P1: should return 200 and a linkset, not an HTML page
curl -sIL https://yoursite.com/.well-known/api-catalog | head -n 15
# P4: both documents, and look for "issuer" and "resource" in the JSON
curl -sL https://yoursite.com/.well-known/oauth-authorization-server | head -c 400
curl -sL https://yoursite.com/.well-known/oauth-protected-resource | head -c 400
# E2: content type should be an OpenAPI or JSON type, not text/html
curl -sIL https://yoursite.com/openapi.json | grep -i -E "^(HTTP|content-type)"

Always check the content-type and open the body. This census could only count statuses. You can do better.

For the how-to on each file, read the guides for the API catalog, the OAuth discovery documents, the Agent Skills index and the MCP server card. For a Shopify store, the commerce-side picture is in our UCP adoption study, and if you run a store, StoreSEO covers the llms.txt, schema and AEO side that these four files do not touch.

Next step

Scan your site, read the P1, P3, P4 and E2 lines, and decide for each whether you have the thing it describes. Then open the guides index for the fix that matches your platform, and scan again. The capabilities check docs list what each check requests.

Frequently asked questions

My scan fails P4 but I have no OAuth or API. Is something broken?

No. P4 scores a missing OAuth metadata document as a fail, and 170 of 835 corpus hosts show the 404/404 reading. If your site has no sign-in-protected API, there is nothing to publish, and you can ignore the line.

P1 shows a 429 and a fail. Does my site lack an API catalog?

Not necessarily. Four P1 fails in our data read 429, which means the scanner was rate limited, and the check records that as a fail. Re-scan after a few minutes, and check the file by hand with curl.

E2 fails but my OpenAPI file exists at /api/v1/openapi.json. Why?

E2 probes /openapi.json, /api/openapi.json and Swagger paths, or follows a service-desc link in an API catalog. A file at another path is invisible to it. Add an API catalog entry that points at the file, or serve a copy at /openapi.json.

P3 says info with HTTP 403 or 530. Is my Agent Skills file blocked?

The check could not read the path, and P3 scores that as info, not fail. A 403 or 530 usually means a firewall or edge rule answered the scanner. Fetch the path with curl and a browser user agent to see what a real client gets.

Why does the same P4 evidence give pass on one site and fail on another?

In the stored data the string 'auth-server: 200, protected-resource: 200' maps to 188 passes, 12 fails and 32 info results. The evidence does not record what decided the status, so treat it as a known gap in the check, not a fault in your site.

Which of the four files should an API owner publish first?

Publish an OpenAPI description first (E2), then an API catalog (P1) that links to it. In the corpus, 180 of the 184 sites that pass E2 also pass P1, so the two work as a pair.

Is the 36% figure the share of the web that publishes these files?

No. It is 301 of 835 scanned sites, and the corpus is self-selected. Astro sites are 113 of the hosts and 79 of the 99 that pass all four, so the figure says little about sites in general.

Does a 200 response mean my catalog or OAuth file is valid?

No. The stored evidence holds status codes, not bodies, so a soft 200 that returns an HTML page looks like a pass. Open the body and check the content type: a catalog is a linkset, and OAuth metadata is JSON with an issuer or resource key.

Related guides