{
  "name": "BOT Intelligence Network",
  "version": "0.2.0",
  "purpose": "A public observation exchange: requests contribute coarse telemetry; later clients retrieve aggregated knowledge.",
  "attribution": "Client families are unverified User-Agent claims. No human/bot classification is performed.",
  "scope": "Only requests received by this service. Explicit BIN verification clients are excluded; initial launch observations have been removed.",
  "policy": {
    "daily_observation_limit": null,
    "detail_retention_days": null,
    "aggregate_retention_days": null,
    "recommended_poll_interval_seconds": 3600,
    "minimum_published_group_size": 3,
    "burst_protection": {
      "requests": 60,
      "period_seconds": 10,
      "scope": "per source IP and Cloudflare location; approximate"
    }
  },
  "endpoints": [
    {
      "path": "/v1/observe",
      "purpose": "Your coarse request context and recording receipt",
      "freshness": "per request",
      "url": "https://ninizemi.com/bot-intelligence/v1/observe"
    },
    {
      "path": "/v1/stats",
      "purpose": "Traffic distributions and all-time daily counts",
      "freshness": "hourly",
      "url": "https://ninizemi.com/bot-intelligence/v1/stats"
    },
    {
      "path": "/v1/patterns",
      "purpose": "Observed country/ASN/client-family combinations; groups of at least 3",
      "freshness": "hourly",
      "url": "https://ninizemi.com/bot-intelligence/v1/patterns"
    },
    {
      "path": "/v1/changes",
      "purpose": "Difference between the two most recent snapshots",
      "freshness": "hourly",
      "url": "https://ninizemi.com/bot-intelligence/v1/changes"
    },
    {
      "path": "/v1/bots.json",
      "purpose": "Known crawler profiles and unverified individual User-Agent observations",
      "freshness": "per request",
      "url": "https://ninizemi.com/bot-intelligence/v1/bots.json"
    },
    {
      "path": "/v1/updates.json",
      "purpose": "New daily User-Agent observations and catalog additions; paginated",
      "freshness": "per request",
      "url": "https://ninizemi.com/bot-intelligence/v1/updates.json"
    },
    {
      "path": "/v1/bot-daily.json",
      "purpose": "Daily UTC claimed bot counts by profile",
      "freshness": "per request",
      "url": "https://ninizemi.com/bot-intelligence/v1/bot-daily.json"
    },
    {
      "path": "/v1/bot-weekly.json",
      "purpose": "Weekly UTC claimed bot counts by profile, Monday through Sunday",
      "freshness": "per request",
      "url": "https://ninizemi.com/bot-intelligence/v1/bot-weekly.json"
    },
    {
      "path": "/datasets/latest.json",
      "purpose": "Complete latest aggregate snapshot",
      "freshness": "hourly",
      "url": "https://ninizemi.com/bot-intelligence/datasets/latest.json"
    }
  ],
  "discovery": {
    "bots": "https://ninizemi.com/bot-intelligence/bots/",
    "updates_rss": "https://ninizemi.com/bot-intelligence/updates.xml",
    "dataset": "https://ninizemi.com/bot-intelligence/datasets",
    "docs": "https://ninizemi.com/bot-intelligence/docs",
    "methodology": "https://ninizemi.com/bot-intelligence/about",
    "openapi": "https://ninizemi.com/bot-intelligence/openapi.json",
    "llms": "https://ninizemi.com/bot-intelligence/llms.txt",
    "llms_full": "https://ninizemi.com/bot-intelligence/llms-full.txt",
    "sitemap": "https://ninizemi.com/bot-intelligence/sitemap.xml",
    "privacy": "https://ninizemi.com/bot-intelligence/privacy"
  },
  "client_guidance": "Use conditional GET with ETag. Poll aggregates at most hourly; repeated self-requests do not create independent evidence."
}