{
 "slug": "chatgpt-agent",
 "name": "ChatGPT Agent",
 "operator": "OpenAI",
 "operator_slug": "openai",
 "category": "user-fetch",
 "category_label": "User-triggered fetchers",
 "robots_token": "ChatGPT-User",
 "user_agent_substring": "ChatGPT Agent",
 "user_agent_example": "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko); compatible; ChatGPT-User/1.0; +https://openai.com/bot",
 "respects_robots_txt": "documented",
 "respects_robots_txt_label": "obeys robots.txt (documented)",
 "verification_method": "published-ranges",
 "verification_label": "published IP ranges",
 "published_ip_ranges_url": "https://openai.com/chatgpt-user.json",
 "ip_ranges_endpoint": "https://www.pathwren.workers.dev/ip-ranges/openai-chatgpt-user.json",
 "ipv4_prefix_count": 204,
 "ipv6_prefix_count": 0,
 "what_it_is": "ChatGPT's agent mode driving a real browser: it navigates and interacts with sites to finish a multi-step task a user gave it. OpenAI governs it with the ChatGPT-User token and the ChatGPT-User prefix list rather than a token of its own, so the robots rule and the address check are the same ones.",
 "cost_of_blocking": "Agentic tasks a user asked for — booking, comparing, filling a form on your site — fail. This is the fetch that ends in a transaction, so it is the most expensive user-triggered block on this list.",
 "operator_docs": "https://platform.openai.com/docs/bots",
 "html_url": "https://www.pathwren.workers.dev/crawler/chatgpt-agent.html",
 "json_url": "https://www.pathwren.workers.dev/crawler/chatgpt-agent.json",
 "last_reviewed": "2026-09-01",
 "links": [
  {
   "rel": "self",
   "href": "https://www.pathwren.workers.dev/crawler/chatgpt-agent.json",
   "type": "application/json"
  },
  {
   "rel": "changes",
   "href": "https://www.pathwren.workers.dev/changes.json?since=105",
   "type": "application/json",
   "title": "What changed since your cursor — poll this instead of re-downloading this document",
   "cursor_param": "since",
   "head_cursor": 105,
   "min_poll_seconds": 21600,
   "how": "Read `cursor` from the response and send it back as `since`. It advances only when something really changed, so an unchanged answer is proof rather than luck — about 700 bytes, or a 304 with no body if you send back the ETag."
  },
  {
   "rel": "related",
   "href": "https://www.pathwren.workers.dev/data/agents.json",
   "type": "application/json",
   "title": "Every crawler record in one file"
  },
  {
   "rel": "related",
   "href": "https://www.pathwren.workers.dev/crawler/chatgpt-agent.md",
   "type": "text/markdown"
  },
  {
   "rel": "related",
   "href": "https://www.pathwren.workers.dev/ip-ranges/openai-chatgpt-user.json",
   "type": "application/json"
  },
  {
   "rel": "service-desc",
   "href": "https://www.pathwren.workers.dev/openapi.json",
   "type": "application/json",
   "title": "Every read endpoint, described formally"
  }
 ]
}