{
  "creationTime": "2026-10-01",
  "documentation": "https://growganic.io/crawler",
  "contact": "hey@growganic.io",
  "signatureAgent": "https://growganic.io",
  "keyDirectory": "https://growganic.io/.well-known/http-message-signatures-directory",
  "userAgents": [
    {
      "token": null,
      "name": "Browser-equivalent fetch",
      "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/149.0.0.0 Safari/537.36",
      "purpose": "The first attempt at reading a connected customer's own pages for the technical part of their audit. It is a plain HTTP request carrying a current browser's header set, because a great many sites serve different markup, or a challenge page, to anything that does not look like a browser, and an audit scored against that version of the page would be wrong about the customer's own site. This one carries no GrowGanic token, which is why the addresses above are the reliable way to identify us. The Chrome version tracks current stable and changes."
    },
    {
      "token": "GrowGanicBot",
      "name": "Site fetch",
      "userAgent": "GrowGanicBot/1.0 (+https://growganic.io/crawler)",
      "purpose": "The same audit read, retried under our own name after the first attempt was challenged. This is the string to allow if your firewall matches on User-Agent."
    },
    {
      "token": "GrowGanic",
      "name": "Publishing",
      "userAgent": "GrowGanic/1.0 (+https://growganic.io)",
      "purpose": "Authenticated calls to a customer's own CMS: connection checks, article create and update, image upload. Also the availability lookup we make to the Internet Archive when an origin is unreachable."
    },
    {
      "token": "GrowGanic-Webhook",
      "name": "Custom integration delivery",
      "userAgent": "GrowGanic-Webhook/1.0 (+https://growganic.io/docs/webhooks)",
      "purpose": "Posting a published article to the endpoint a customer entered themselves, signed with the secret they issued."
    },
    {
      "token": "GrowGanic-HostDetector",
      "name": "Host detection",
      "userAgent": "GrowGanic-HostDetector/1.0 (+https://growganic.io)",
      "purpose": "A single request, HEAD where the server allows it and a one byte ranged GET where it does not, that identifies which platform serves a customer's site so their dashboard can show the right setup snippet. Distinct from the crawler so it can be rate limited on its own."
    },
    {
      "token": "GrowGanicBlogImport",
      "name": "Blog migration read",
      "userAgent": "GrowGanicBlogImport/1.0 (+https://growganic.io/crawler)",
      "purpose": "The read half of a migration a customer asked us to run: the WordPress REST index, then one request per page of posts, pages and custom post types, then one per image so the pictures can be served from our own storage. It is the busiest thing we ever send, a few hundred requests inside a few minutes, and it is all GET. Nothing is written, changed or deleted on the source site."
    },
    {
      "token": "GrowGanic-BlogProbe",
      "name": "Hosting reachability probe",
      "userAgent": "GrowGanic-BlogProbe/1.0 (+https://growganic.io)",
      "purpose": "One GET of /blog/growganic-ping on a customer's own domain, checking that the snippet they installed is forwarding that path to us. It repeats while their hosting settings screen is open and the path is not answering yet, so it is the string most likely to appear in a log more than once. It reads a single path, carries no credentials and changes nothing."
    }
  ],
  "prefixes": [
    {
      "ipv4Prefix": "152.55.184.0/24"
    },
    {
      "ipv4Prefix": "152.55.185.0/24"
    },
    {
      "ipv4Prefix": "208.77.244.0/24"
    }
  ],
  "addresses": [
    "152.55.184.241",
    "152.55.185.190",
    "208.77.244.241",
    "208.77.244.242"
  ]
}