Open data
GAIP's data, in bulk.
Weekly files of every aggregate figure GAIP's Agent Observatory publishes, the week's public change log, a citable id for each weekly snapshot, a data dictionary and the methods. Facts observed at the stated time; not an assessment of any party. Free; no account.
Datasets
| Dataset | What it is | Cadence | Licence | Where |
|---|---|---|---|---|
| Weekly snapshot totals (downloads) | Every aggregate figure of a frozen ISO week, one row per metric, with denominators and withheld cells marked. | Weekly, built once after the week is frozen | CC BY 4.0 | totals.csv · totals.jsonl |
| Weekly public change log (downloads) | The week's change-log entries for public MCP servers and A2A agents, with exactly the fields of the public change feed. | Weekly, built once after the week is frozen | Not CC BY: GAIP terms of use (per-agent entries) | changes.csv · changes.jsonl · live feed |
| Weekly ecosystem snapshots | The frozen, hash-chained aggregate snapshot of each ISO week as JSON (the source of the totals files). | Weekly | CC BY 4.0 | JSON |
| Agent Observatory summary | Current totals across the public agents GAIP watches. | Each Observatory cycle (about 15 minutes) | CC BY 4.0 | JSON · page |
| Agent Web Index | Monthly headline figures on the 2026-10 reference panel, each with its denominator. | Monthly | CC BY 4.0 | JSON |
| State of Agents | Monthly report of aggregate figures. | Monthly | CC BY 4.0 | page · JSON |
| Agent Web Index: how to reproduce it | The queries behind each index figure and a script that recomputes them from GAIP's public files. | With each index | CC BY 4.0 | queries · reproduce.py |
| Quarterly releases and cohorts | Permanent ids of frozen cohorts and quarterly aggregate releases, and the weekly snapshot ids. | Per release | CC BY 4.0 (aggregates) | registry |
| Dataset methods | Each long-run dataset's method versions and known defects. | On change | CC BY 4.0 | JSON |
| Public agents GAIP watches | The public MCP servers and A2A agents the Observatory watches, with names and identifiers as their public registries list them, kind, cohorts and date first watched (no results). | Daily, and after any opt-out | Not CC BY: facts as listed by public registries; GAIP terms of use | watched-agents.csv · watched-agents.jsonl · how to check |
| Agent Reliability Index | Reachability and response times of public agents per month and for the latest 30 days: share of visits reachable, agents reachable on at least 95% of visits, p50 and p95 response time, by protocol and cohort (cells under 5 agents withheld). | Monthly (final once a month ends); latest 30 days hourly | CC BY 4.0 | reliability-index.csv · reliability-index.json |
| Collection ledger | GAIP's own daily record of when its Observatory ran: ticks, errors by class, targets observed, requests, 15-minute windows with a tick, and gaps; each ended day frozen and hash-chained, plus a register of known earlier gaps. | Daily (each UTC day frozen once it ends) | CC BY 4.0 | collection-ledger.csv · collection-ledger.json · record |
The weekly totals cover the Observatory (targets, reachability, response times, protocol versions), the capability record and its 2026-10 reference panel, revisit tiers and coverage, standards adoption (OAuth metadata, agent cards, MCP server cards, AI catalogues, x402, llms.txt), what agents changed that week by kind (declaration drift, protocol-version-only changes counted apart) and declared totals (tools per server, behaviour hints, output schemas, sign-in kinds, x402, registry churn), the agentic-commerce shop panel and the long-run datasets (agent keys, AI permissions, client behaviour by client family, agent terms, MCP server package history from npm and PyPI with the OSV advisories for those packages, and agent prices and ERC-8004 cards once switched on). Every column is described in the data dictionary (JSON).
Weekly downloads
Built once, when the week's snapshot is frozen, and stored; the same address always returns the same week. The newest week is always at /data/weekly/latest/<file> (a redirect). Counts from 1 to 4 are withheld and shares are given only when both counts are at least 5, as in the snapshots. No host is named in the totals files. Each file's SHA-256 is recorded with its snapshot id in the release registry. Parquet is not offered.
| Snapshot id | Week | Files |
|---|---|---|
AGENT-WEB-2026-W41 | 2026-W41 | totals.csv (950 rows, SHA-256 e1fed5599f92…)totals.jsonl (950 rows, SHA-256 616b164393ee…)changes.csv (2697 rows, SHA-256 e09acdff06a9…)changes.jsonl (2697 rows, SHA-256 6b2f227a5781…) |
AGENT-WEB-2026-W40 | 2026-W40 | totals.csv (836 rows, SHA-256 3114f421b274…)totals.jsonl (836 rows, SHA-256 77aee116b05d…)changes.csv (1118 rows, SHA-256 e59c97f7ab73…)changes.jsonl (1118 rows, SHA-256 2247df51e2d4…) |
Public agents GAIP watches
The public MCP servers and A2A agents GAIP's Agent Observatory watches, with their names and identifiers exactly as the public registries list them: facts as listed by those registries, not an assessment, result, score or ranking of any party, and no observation of any of them. Fields, and nothing else: GAIP's target id, the source registry, the name and identifier exactly as the registry lists them, the kind (MCP server or A2A agent card), cohort memberships and the date first watched. No results, states, scores, tools or response times. Left out: agents on GAIP's exclusion list or on a host paused by an opt-out, agents retired from their registry, agents that did not come from a public registry (hosts callers asked about, cards a caller published or captured) and GAIP's own agents.
watched-agents.csv · watched-agents.jsonl · watched-agents.json. Rebuilt daily (UTC) at the Observatory tick and after any opt-out; never computed on request.
Built 2026-10-17T00:09:44Z: 22414 agents listed. Panel AGENTS-COHORT-2026-10: 4090 members listed, 67 withheld; the registered membership hash cannot be recomputed from the list alone while members are withheld (see verification in the metadata file).
Licence: Not covered by CC BY 4.0 (which covers GAIP's aggregate figures only): the names and identifiers are as listed by public registries; GAIP's terms of use apply (https://www.gaipagents.com/terms). Opt out: an operator can opt out through corrections and opt-out; an opted-out or excluded agent is left out from the list's next build, at the latest the next day. A registry name can contain a person's name or handle (for example a GitHub username in an MCP server name): see the privacy notice.
Check the panel fingerprint and repeat the sample
The 2026-10 reference panel's registered membership hash (release registry, id AGENTS-COHORT-2026-10) is SHA-256 over the panel's target ids, sorted and joined by newlines. Take the rows whose cohorts include AGENTS-COHORT-2026-10 and hash their ids: when no member is withheld the result equals the registered hash. Members that opted out, were retired from their registry or did not come from a public registry are left out of the list, so the metadata file gives how many are withheld and why, and the hash of the listed members. A quarter's random sample uses the seed SHA-256 of the quarter label (e.g. 2026-Q4); each target id is ranked by SHA-256(seed + ":" + target_id) and the lowest ones (200) are taken.
import csv, hashlib, json
with open("watched-agents.csv", encoding="utf-8", newline="") as handle:
rows = list(csv.DictReader(handle))
def membership_sha256(ids): # sorted target ids joined by newlines
return hashlib.sha256("\n".join(sorted(ids)).encode("utf-8")).hexdigest()
panel = [r["target_id"] for r in rows if "AGENTS-COHORT-2026-10" in json.loads(r["cohorts"])]
print(len(panel), membership_sha256(panel)) # compare with /v1/free/data/releases (and withheld_members)
quarter = "2026-Q4"; seed = hashlib.sha256(quarter.encode("utf-8")).hexdigest()
rank = lambda i: hashlib.sha256(f"{seed}:{i}".encode("utf-8")).hexdigest()
sample = sorted(r["target_id"] for r in rows if "AGENTS-SAMPLE-2026Q4" in json.loads(r["cohorts"]))
print(membership_sha256(sample), max(map(rank, sample)) if sample else None)
Collection record
When GAIP's Observatory was running, from its own daily ledger (since 2026-10-04; 13 days frozen and hash-chained, head 4dbbcccd48a13636b69fc3490e2535def01d9e20a443aa17b761d6701df3c586).
Last 30 days: 13 days, 1336 ticks, 11 days fully covered; a tick started in 98.6% of 15-minute windows. Gaps (no tick start for more than 30 minutes): 1.
- 2026-10-09T16:34:12Z to 2026-10-09T17:32:32Z (58 min)
Known gaps (register, append-only):
- 2026-10-02T23:16:00Z to 2026-10-03T07:52:15Z (times partly estimated): Observatory observations: every tick claimed and observed 0 targets (tick lines showed budget_exhausted or TimeoutError), so no status observations, manifest changes or capability records were written. Cause: Registry walks read up to 20 pages from one host while the outbound gate allows 10 requests a minute per host; the 11th page raised _BudgetExhausted out of the walk, the cursor was never saved and the cycle returned before observing, on every tick (the refresh livelock). Fixed by PR #824.
- 2026-10-01T21:09:04Z to 2026-10-03T10:02:34Z (times partly estimated): About 75% (estimate) of shop-host AI-permission facts (ai_permissions dataset, shop hosts) were evicted from an in-memory queue before they were written; the rest were written. Cause: The in-memory buffer evicted entries waiting for an extra read before they were written; the shop panel did not read tdmrep.json itself. Fixed by PR #826.
- 2026-10-03T16:55:00Z to 2026-10-03T17:14:00Z (times partly estimated): One Observatory tick observed nothing: the tick right after the data5 deploy ended with DatabaseError. Cause: Deploy overlap during the PR #843 deploy (as recorded in the handover); no code fix was needed, the next tick was clean.
- 2026-09-28T00:00:00Z to 2026-10-01T19:30:20Z (times partly estimated): No independent daily timestamp (Sigstore/Rekor anchor) of the history log's chain head was kept for 28, 29 and 30 Sep 2026 or the morning of 1 Oct. The history log itself kept every entry; the 1 Oct anchor's chain head covers every entry before it, so those entries are dated no later than 1 Oct by an outside witness, not day by day. Cause: The anchor workflow's runs on 28 Sep failed twice and were then cancelled; it ran on GitHub Actions only on a push or by hand until the COO schedule dispatcher began running it daily on 1 Oct 2026 (moat moves), and dated anchor files began the same day (record durability).
Method: collection ledger and known gaps. Downloads: collection-ledger.csv · collection-ledger.json.
The record, by date
Seven free reads answer one subject on one date from the datasets above, with the week the fact was recorded: /v1/free/record/tenure?url= (how long an endpoint has been on GAIP's record and how often it answered), /record/names?name= (since when a registry name has been on record, and earlier names that look like it), /record/keys?host=&on=, /record/permissions?host=&agent=&on= (what the site's robots.txt said for an AI agent token on that date), /record/prices?host=&on=, /record/ingredients?url=&on= (what the agent's own documents said it runs on, and whether they say it is an AI) and /record/residence?url=&on= (the network and country its endpoint answered from; never the address). The same seven are MCP tools on /mcp/all, and every answer is signed. What each answers: /record. Facts GAIP recorded, never an assessment of the party.
The Names register holds 45,502 registry names with the date GAIP's record of each begins and 50,000 lookalike pairs. Collectors running: 18 of 18 (status).
Revocations published in the last 7 days, by kind (1 to 4 shown as 1-4): MANDATE_WITHDRAWN_AS_INDEXED 0, KEY_RETIRED_AS_INDEXED 1-4, SERVER_DELETED_AS_INDEXED 0, PREFERENCE_CHANGED_AS_INDEXED 0, REPRESENTATION_REMOVED_AS_INDEXED 0, NOTICE_ISSUED 50, AGREEMENT_CANCELLED_AS_RECORDED 0, HANDLE_RETIRED 0. First event: 2026-10-10. The log itself: JSON Feed · Atom; the check alone, /v1/free/revocations/check?subject=&since= (gaip_revoked_since). GAIP publishes that a fact in its record stopped being true as indexed at the stated time; it says nothing about the effect of that on any party.
Second Look accuracy record: what pages showed against what was claimed, by quarter and field, every cell at least 5 checks from 3 shops; vendor-submitted pairs (what an assistant answered, beside the page as GAIP read it) folded in. No shop, assistant or vendor is named. /check/accuracy · JSON; CC BY 4.0.
Licence
Aggregate figures (the totals files, the snapshots, the summary, the index and the monthly report) are licensed under CC BY 4.0: reuse them for any purpose, including commercially, crediting the GAIP Agent Observatory with the snapshot id. The licence does not cover per-agent or per-shop results, such as the change-log files, receipts, GAIP's software, its name or logo; GAIP's terms of use (draft) apply to those.
How to cite
GAIP Agent Observatory. GAIP Agent Observatory: weekly agent-web snapshots, snapshot AGENT-WEB-2026-W41. https://www.gaipagents.com/data (CC BY 4.0 for aggregate figures; facts observed at the stated time).
@misc{gaip_agent_web_agent_web_2026_w41,
author = {{GAIP Agent Observatory}},
title = {GAIP Agent Observatory: weekly agent-web snapshots, AGENT-WEB-2026-W41},
year = {2026},
howpublished = {\url{https://www.gaipagents.com/data}},
note = {Aggregate figures licensed CC BY 4.0. Snapshot id and file SHA-256 in https://www.gaipagents.com/v1/free/data/releases}
}
Methods
How GAIP observes, what it keeps and how anyone can check it: methodology, Agent Observatory, dataset method versions and the daily signed anchors. To correct a record or opt out: corrections and opt-out; an opted-out agent's change entries are removed from the stored change files.