{
  "answers": {
    "/v1/free/agent-web-index": {
      "fields": [
        {
          "description": "Version of this document's shape.",
          "name": "schema_version"
        },
        {
          "description": "Index name.",
          "name": "name"
        },
        {
          "description": "Title.",
          "name": "title"
        },
        {
          "description": "Calendar month (YYYY-MM).",
          "name": "month"
        },
        {
          "description": "provisional or final.",
          "name": "status"
        },
        {
          "description": "Start and end of the month (UTC).",
          "name": "window_utc"
        },
        {
          "description": "ISO weeks counted in the month.",
          "name": "weeks"
        },
        {
          "description": "When the index was built.",
          "name": "generated_at_utc"
        },
        {
          "description": "The headline figures, each with count, denominator and share (withheld under 5).",
          "name": "figures"
        },
        {
          "description": "Beside the figures: the month's latest frozen weekly declared_derivations block (data appetite, outside dependencies, operator concentration), as frozen; null before a week with it is frozen.",
          "name": "declared_derivations"
        },
        {
          "description": "The reference panel (size, membership hash) and the registry size it is read against.",
          "name": "sample_frame"
        },
        {
          "description": "Counting rules.",
          "name": "rules"
        },
        {
          "description": "Figures whose collector is switched off.",
          "name": "not_collected_yet"
        },
        {
          "description": "5: counts and totals under it are withheld.",
          "name": "minimum_cell_size"
        },
        {
          "description": "How to cite the month's index.",
          "name": "citation"
        },
        {
          "description": "This document's URL.",
          "name": "json"
        },
        {
          "description": "The published queries and the script that recompute each figure (/v1/free/agent-web-index/queries, /v1/free/agent-web-index/reproduce.py).",
          "name": "reproduce"
        },
        {
          "description": "How each figure's count and total split into ISO-week parts, and when parts are withheld (a part under 5 withholds all parts of that figure).",
          "name": "weekly_totals_rule"
        },
        {
          "description": "Licence note.",
          "name": "licence"
        },
        {
          "description": "Licence URL.",
          "name": "licence_url"
        },
        {
          "description": "false when no copy is stored for the month.",
          "name": "available"
        },
        {
          "description": "Why not available.",
          "name": "message"
        },
        {
          "description": "What a missing month means.",
          "name": "meaning"
        },
        {
          "description": "MONTH_FORMAT for a bad ?month=.",
          "name": "error"
        },
        {
          "description": "A valid month.",
          "name": "example"
        },
        {
          "description": "The month's reachability and response-time figures (final once the month is frozen, else the latest 30 days): share of visits reachable, share of agents reachable on at least 95% of visits, p50 and p95 response time, by protocol and cohort.",
          "name": "reliability"
        },
        {
          "description": "When the stored copy was built and whether it is stale.",
          "name": "served"
        },
        {
          "description": "Licence block (see /v1/free/data/dictionary).",
          "name": "license"
        }
      ],
      "title": "Agent Web Index (monthly)"
    },
    "/v1/free/data/releases": {
      "fields": [
        {
          "description": "Version of this document's shape.",
          "name": "schema_version"
        },
        {
          "description": "Name.",
          "name": "title"
        },
        {
          "description": "What an id is and that it is never edited.",
          "name": "meaning"
        },
        {
          "description": "Licence note.",
          "name": "licence"
        },
        {
          "description": "Licence URL.",
          "name": "licence_url"
        },
        {
          "description": "What the figures are.",
          "name": "notice"
        },
        {
          "description": "Check of the committed registry's hash chain.",
          "name": "chain"
        },
        {
          "description": "Cohort and quarterly release ids (committed registry), each with its content and SHA-256.",
          "name": "entries"
        },
        {
          "description": "DOIs recorded for issued releases.",
          "name": "dois"
        },
        {
          "description": "Method page.",
          "name": "method"
        },
        {
          "description": "Always 0.",
          "name": "price_gbp"
        },
        {
          "description": "Always false.",
          "name": "automatic_evidence_credit"
        },
        {
          "description": "Weekly snapshot ids AGENT-WEB-YYYY-Www with each download file's SHA-256 (database registry, append-only, hash-chained).",
          "name": "weekly_snapshots"
        },
        {
          "description": "Licence block (see /v1/free/data/dictionary).",
          "name": "license"
        }
      ],
      "title": "Permanent dataset ids"
    },
    "/v1/free/ecosystem/snapshots": {
      "fields": [
        {
          "description": "Version of this document's shape.",
          "name": "schema_version"
        },
        {
          "description": "Name of the series.",
          "name": "title"
        },
        {
          "description": "What the figures are and are not.",
          "name": "notice"
        },
        {
          "description": "Check of the snapshot hash chain.",
          "name": "chain"
        },
        {
          "description": "Method page.",
          "name": "method"
        },
        {
          "description": "How to cite one snapshot.",
          "name": "citation"
        },
        {
          "description": "Licence note (CC BY 4.0 for aggregate figures).",
          "name": "licence"
        },
        {
          "description": "Licence URL.",
          "name": "licence_url"
        },
        {
          "description": "Corrections and opt-out route.",
          "name": "corrections"
        },
        {
          "description": "Always 0.",
          "name": "price_gbp"
        },
        {
          "description": "Always false.",
          "name": "automatic_evidence_credit"
        },
        {
          "description": "Index: each frozen week with its snapshot SHA-256, the previous week's and its URL.",
          "name": "weeks"
        },
        {
          "description": "When the first snapshot is frozen.",
          "name": "first_snapshot"
        },
        {
          "description": "With ?week=: the ISO week.",
          "name": "week"
        },
        {
          "description": "With ?week=: the frozen aggregate snapshot.",
          "name": "snapshot"
        },
        {
          "description": "With ?week=: the previous week's snapshot hash.",
          "name": "previous_sha256"
        },
        {
          "description": "With ?week=: this snapshot's SHA-256 (commits to previous_sha256).",
          "name": "snapshot_sha256"
        },
        {
          "description": "WEEK_NOT_FROZEN when the asked week has no snapshot.",
          "name": "error"
        },
        {
          "description": "Licence block (see /v1/free/data/dictionary).",
          "name": "license"
        }
      ],
      "title": "Weekly ecosystem snapshots (frozen, hash-chained)"
    },
    "/v1/free/observatory/methods": {
      "fields": [
        {
          "description": "Version of this document's shape.",
          "name": "schema_version"
        },
        {
          "description": "Name.",
          "name": "title"
        },
        {
          "description": "How method versions are kept and applied.",
          "name": "meaning"
        },
        {
          "description": "Link to the method section.",
          "name": "method_doc"
        },
        {
          "description": "The old-and-new overlap a later method change must run.",
          "name": "overlap_rule"
        },
        {
          "description": "How each version's from_utc was set.",
          "name": "from_basis_note"
        },
        {
          "description": "Per dataset: title, cycle, method versions with dates, what changed and known defects.",
          "name": "datasets"
        },
        {
          "description": "This document's URL.",
          "name": "url"
        },
        {
          "description": "Licence block (see /v1/free/data/dictionary).",
          "name": "license"
        }
      ],
      "title": "Dataset methods: versions and changes"
    },
    "/v1/free/observatory/summary": {
      "fields": [
        {
          "description": "Version of this document's shape.",
          "name": "schema_version"
        },
        {
          "description": "When the summary was built (UTC).",
          "name": "generated_at_utc"
        },
        {
          "description": "What the figures are and are not (facts observed at a stated time; not an assessment).",
          "name": "notice"
        },
        {
          "description": "No ranking, league table or score of any party; small counts suppressed.",
          "name": "neutrality"
        },
        {
          "description": "Public targets GAIP watches: total, by kind and by source, and those withdrawn or unpublished.",
          "name": "targets"
        },
        {
          "description": "Targets with an observation and the share observed in the last 48 hours.",
          "name": "coverage"
        },
        {
          "description": "Targets by their latest observed state (counts).",
          "name": "status_distribution"
        },
        {
          "description": "Count of published manifest changes in the last 7 days.",
          "name": "manifest_changes"
        },
        {
          "description": "Aggregate counts of declared-metadata checks by protocol (cells of at least 5).",
          "name": "ecosystem_conformance"
        },
        {
          "description": "Per signal pattern: present, not present, not evaluable, and the rate.",
          "name": "metadata_signal_pattern_rates"
        },
        {
          "description": "Always null: GAIP issues no overall verdict.",
          "name": "overall_verdicts"
        },
        {
          "description": "Always null: GAIP does not rank.",
          "name": "ranking"
        },
        {
          "description": "The 2026-10 reference panel (size, membership hash, status counts), change-log head and the quarter's random sample.",
          "name": "capability_record"
        },
        {
          "description": "Revisit tiers: daily-tier and census sizes, cadence and coverage.",
          "name": "tiers"
        },
        {
          "description": "Weekly coverage: share of known public remote agents observed in the last 7 days.",
          "name": "reach"
        },
        {
          "description": "Request budget and revisit plan (per cycle, per hour).",
          "name": "limits"
        },
        {
          "description": "Scheduler state, last cycle and errors (operational).",
          "name": "cycle_health"
        },
        {
          "description": "Registries and lists GAIP reads, with their terms basis.",
          "name": "sources"
        },
        {
          "description": "Counts of archived Official MCP Registry entries (versions kept, names).",
          "name": "registry_archive"
        },
        {
          "description": "What agents declared beyond their tools (MCP instructions present, MCP Apps UI, tasks, tool-list change notices, extensions; A2A AP2, x402 and UCP extensions; 401 challenge schemes): counts over public targets, 1 to 4 shown as '<5'.",
          "name": "declared_extras"
        },
        {
          "description": "Derived from what agents declared (data5): data_appetite (share of agents whose tools' input fields ask for each category: payment card, bank account, email, phone, postal address, precise location, government id, health, date of birth, credentials, biometric, unbounded free text, file upload; counted by keyword rules, never field names), dependencies (agents pointing to outside domains; well-known service domains shared by at least 5 agents named, others only counted) and operators (operators counted, share of agents run by the 10 largest, operators by agents run; no operator named). Cells under 5 as '<5'; writing: when the newest record was written.",
          "name": "declared_derivations"
        },
        {
          "description": "The agentic-commerce shop panel's cohort and aggregate figures.",
          "name": "shop_panel"
        },
        {
          "description": "Heads and counts of the long-run datasets (agent keys, AI permissions, client behaviour, agent terms, agent prices, ERC-8004 cards, MCP package history), and whether each own-reader dataset's collector is on.",
          "name": "unique_datasets"
        },
        {
          "description": "Head of GAIP's monthly outcome ledger.",
          "name": "outcome_ledger"
        },
        {
          "description": "Head of the weekly snapshot chain: hash, count and newest week.",
          "name": "weekly_snapshots"
        },
        {
          "description": "When the reachability and response-time figures were last stored, and the newest final month's headline (share of visits reachable, p50 and p95 response time).",
          "name": "reliability_index"
        },
        {
          "description": "Retention per record (null means no deletion date).",
          "name": "retention_days"
        },
        {
          "description": "Plain-English retention rules.",
          "name": "retention_notes"
        },
        {
          "description": "Outside scanners named in the method and whether GAIP ran them (NOT_RUN).",
          "name": "third_party_scanners"
        },
        {
          "description": "URLs of the per-target, lookup, change and capture routes.",
          "name": "endpoints"
        },
        {
          "description": "Always 0: free.",
          "name": "price_gbp"
        },
        {
          "description": "Always false.",
          "name": "automatic_evidence_credit"
        },
        {
          "description": "Present when served from the copy the Observatory stored: when it was built and whether it is stale.",
          "name": "served"
        },
        {
          "description": "Licence block: CC BY 4.0 for aggregate figures, with what it covers.",
          "name": "license"
        }
      ],
      "title": "Agent Observatory summary (updated each Observatory cycle)"
    }
  },
  "downloads": {
    "addresses": {
      "latest": "https://www.gaipagents.com/data/weekly/latest/<file> (redirects to the newest week)",
      "week": "https://www.gaipagents.com/data/weekly/YYYY-Www/<file>"
    },
    "changes": {
      "columns": [
        {
          "description": "Citable id of the weekly snapshot, AGENT-WEB-YYYY-Www.",
          "name": "snapshot_id",
          "type": "string"
        },
        {
          "description": "ISO week in which GAIP observed the change.",
          "name": "week",
          "type": "string"
        },
        {
          "description": "Position of the entry in GAIP's change log.",
          "name": "sequence",
          "type": "integer"
        },
        {
          "description": "GAIP's id of the observed public MCP server or A2A agent (obs_...).",
          "name": "target_id",
          "type": "string"
        },
        {
          "description": "MCP_REMOTE, A2A or another target kind.",
          "name": "target_kind",
          "type": "string"
        },
        {
          "description": "The public endpoint or agent card URL GAIP read, as the public change feed shows it.",
          "name": "target_locator",
          "type": "string"
        },
        {
          "description": "SHA-256 of the declared document before the change.",
          "name": "before_hash",
          "type": "string"
        },
        {
          "description": "SHA-256 of the declared document after the change.",
          "name": "after_hash",
          "type": "string"
        },
        {
          "description": "When GAIP observed the change (RFC 3339, UTC).",
          "name": "observed_at_utc",
          "type": "string"
        },
        {
          "description": "What changed, as the public feed shows it (tool names, hashes, short excerpts). JSON text in the CSV.",
          "name": "diff",
          "type": "object"
        },
        {
          "description": "Change classes (for example tool_added, description_changed). JSON text in the CSV.",
          "name": "labels",
          "type": "array"
        },
        {
          "description": "GAIP receipt for the observation, when one was issued.",
          "name": "receipt_id",
          "type": "string"
        },
        {
          "description": "Where to verify that receipt.",
          "name": "receipt_url",
          "type": "string"
        },
        {
          "description": "Hash of the change-log entry before this one (the chain).",
          "name": "previous_entry_sha256",
          "type": "string"
        },
        {
          "description": "SHA-256 of this entry; commits to previous_entry_sha256.",
          "name": "entry_sha256",
          "type": "string"
        },
        {
          "description": "What kind of evidence the entry is (a fact GAIP observed, not a verdict).",
          "name": "evidence_class",
          "type": "string"
        }
      ],
      "files": [
        "changes.csv",
        "changes.jsonl"
      ],
      "licence": "Not covered by CC BY 4.0: per-agent entries of GAIP's public change log, exactly as served at /v1/free/observatory/changes; GAIP's terms of use apply (https://www.gaipagents.com/terms).",
      "one_row_per": "public change-log entry observed in the ISO week"
    },
    "encoding": "UTF-8; CSV with a header row (RFC 4180); JSON Lines, one object per line.",
    "not_included": {
      "gaip_first_party_demand": "GAIP's own interface events (first-party demand) are in the weekly snapshot JSON but not in the downloads.",
      "parquet": "Not offered: it needs a heavy library on the web runtime."
    },
    "reliability_index": {
      "built": "from the copies the Observatory tick stores (final months frozen once; current hourly)",
      "columns": [
        {
          "description": "YYYY-MM for a final month, or rolling_30_days for the current block",
          "name": "period",
          "type": "string"
        },
        {
          "description": "final or provisional",
          "name": "status",
          "type": "string"
        },
        {
          "description": "Start of the period (UTC)",
          "name": "window_start_utc",
          "type": "datetime"
        },
        {
          "description": "End of the period (UTC, exclusive)",
          "name": "window_end_utc",
          "type": "datetime"
        },
        {
          "description": "all (every public agent GAIP watches) or panel (AGENTS-COHORT-2026-10)",
          "name": "cohort",
          "type": "string"
        },
        {
          "description": "MCP, A2A or ALL",
          "name": "protocol",
          "type": "string"
        },
        {
          "description": "Agents with at least one visit (empty when under 5: the cell is withheld)",
          "name": "agents",
          "type": "count"
        },
        {
          "description": "Visits: observations in which GAIP sent a request",
          "name": "visits",
          "type": "count"
        },
        {
          "description": "Visits where the host answered (any HTTP status); empty under 5",
          "name": "visits_reachable",
          "type": "count"
        },
        {
          "description": "visits_reachable / visits",
          "name": "visits_reachable_share",
          "type": "share"
        },
        {
          "description": "Agents reachable on at least 95% of their visits; empty under 5",
          "name": "agents_reachable_95",
          "type": "count"
        },
        {
          "description": "agents_reachable_95 / agents",
          "name": "agents_reachable_95_share",
          "type": "share"
        },
        {
          "description": "Median response time of successful handshakes",
          "name": "response_time_p50_ms",
          "type": "milliseconds"
        },
        {
          "description": "95th percentile response time of successful handshakes",
          "name": "response_time_p95_ms",
          "type": "milliseconds"
        },
        {
          "description": "Reachable visits with an HTTP 2xx answer and a response time",
          "name": "successful_handshakes",
          "type": "count"
        }
      ],
      "files": [
        "reliability-index.csv",
        "reliability-index.json"
      ],
      "licence": "CC BY 4.0",
      "one_row_per": "period (final month or the current 30 days), cohort and protocol"
    },
    "totals": {
      "columns": [
        {
          "description": "Citable id of the weekly snapshot, AGENT-WEB-YYYY-Www.",
          "name": "snapshot_id",
          "type": "string"
        },
        {
          "description": "ISO week the figures cover (Monday 00:00 UTC to the next Monday), e.g. 2026-W40.",
          "name": "week",
          "type": "string"
        },
        {
          "description": "Which record the figure comes from: a section of the weekly snapshot (observatory, capability_record, revisit_tiers, reach_coverage, market_coverage, standards_adoption, shop_panel, declaration_drift: what agents changed that week by kind with protocol-version-only changes apart, declared_totals: totals of declared tools, behaviour hints, output schemas, sign-in kinds, x402 and registry churn, declared_derivations: share of agents asking for each input-field category, agents pointing to outside domains, operator concentration; domain names are not in the files) or one of the long-run datasets (agent_keys, ai_permissions, client_behaviour, agent_terms, agent_prices, erc8004_cards, package_history: weekly npm and PyPI facts of MCP server packages and the OSV advisories for them).",
          "name": "dataset",
          "type": "string"
        },
        {
          "description": "Path of the figure inside its dataset block, dot-separated (as in the snapshot JSON at /v1/free/ecosystem/snapshots?week=). A share cell gives two rows: <cell>.count and <cell>.share.",
          "name": "metric",
          "type": "string"
        },
        {
          "description": "The figure. Empty when withheld (see withheld) or not available that week.",
          "name": "value",
          "type": "number"
        },
        {
          "description": "For count and share rows of a share cell: the number of items the share is taken over (the cell's 'of'). Empty otherwise or when withheld.",
          "name": "denominator",
          "type": "number"
        },
        {
          "description": "count, share (a fraction from 0 to 1), milliseconds, seconds, hours, days or number.",
          "name": "unit",
          "type": "string"
        },
        {
          "description": "true when GAIP withheld the value: a count from 1 to 4, or a share whose count or denominator is under 5 (minimum cell size 5).",
          "name": "withheld",
          "type": "boolean"
        },
        {
          "description": "Method version(s) of the dataset in force that week, from /v1/free/observatory/methods (several joined with +); for snapshot sections without a methods entry, the snapshot schema version.",
          "name": "method_version",
          "type": "string"
        }
      ],
      "files": [
        "totals.csv",
        "totals.jsonl"
      ],
      "licence": "CC-BY-4.0",
      "one_row_per": "ISO week, dataset and metric"
    },
    "watched_agents": {
      "address": "https://www.gaipagents.com/data/<file>",
      "columns": [
        {
          "description": "GAIP's id of the watched agent (obs_ + 24 hex characters).",
          "name": "target_id",
          "type": "string"
        },
        {
          "description": "The public registry that lists it: official-mcp-registry or a2aregistry-org.",
          "name": "source_registry",
          "type": "string"
        },
        {
          "description": "The name as that registry lists it (the Official MCP Registry's title; empty when the registry gives none, and for the A2A Registry, from which GAIP keeps no name).",
          "name": "registry_name",
          "type": "string"
        },
        {
          "description": "The identifier as that registry lists it: the Official MCP Registry's server name (e.g. io.github.owner/server) or, for the A2A Registry, the URL of the agent card it lists (wellKnownURI).",
          "name": "registry_identifier",
          "type": "string"
        },
        {
          "description": "MCP_REMOTE (a remote MCP server) or A2A_CARD (an A2A agent card).",
          "name": "kind",
          "type": "string"
        },
        {
          "description": "Cohort memberships: AGENTS-COHORT-2026-10 (the reference panel), AGENTS-COHORT-YYYYQn (first watched in that quarter) and AGENTS-SAMPLE-YYYYQn (that quarter's random sample). JSON text in the CSV.",
          "name": "cohorts",
          "type": "array"
        },
        {
          "description": "The date (UTC, YYYY-MM-DD) GAIP first watched it.",
          "name": "first_watched_date",
          "type": "string"
        }
      ],
      "files": [
        "watched-agents.csv",
        "watched-agents.jsonl"
      ],
      "left_out": "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.",
      "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).",
      "metadata": "watched-agents.json",
      "one_row_per": "public agent GAIP watches (listed by a public registry, not opted out or excluded)",
      "opt_out": "An operator can opt out through https://www.gaipagents.com/corrections (machine route: POST https://www.gaipagents.com/v1/free/observatory/corrections); an opted-out or excluded agent is left out of the list from its next build, at the latest the next day."
    }
  },
  "license": {
    "attribution": "Credit the GAIP Agent Observatory and give the dataset or snapshot id (see citation).",
    "covers": "Aggregate figures only (counts and shares; no per-agent or per-shop result), founder decision #13(c), 1 Oct 2026. It does not cover per-agent or per-shop results (for example the change-log entries), receipts, GAIP's software, its name or logo; GAIP's terms of use apply to those.",
    "data_page": "https://www.gaipagents.com/data",
    "id": "CC-BY-4.0",
    "name": "Creative Commons Attribution 4.0 International",
    "terms": "https://www.gaipagents.com/terms#reuse-licence",
    "url": "https://creativecommons.org/licenses/by/4.0/"
  },
  "meaning": "Every column of the weekly download files and every top-level field of GAIP's main public data answers, with types, units and licence. Facts observed at the stated time; not an assessment of any party.",
  "minimum_cell_size": 5,
  "price_gbp": 0,
  "schema_version": "gaip.open-data.v1.dictionary",
  "title": "GAIP data dictionary",
  "units": {
    "count": "a number of items",
    "days": "time in days",
    "hours": "time in h",
    "milliseconds": "time in ms",
    "number": "another numeric value",
    "seconds": "time in s",
    "share": "a fraction from 0 to 1 (count / denominator)"
  }
}