
I built an API that AI assistants can browse
I've been working on a structured data API for monitor specs and hit an interesting problem: how do you let ChatGPT, Claude, and Perplexity query your API when their web browsing tools were designed to read websites, not call APIs?
The standard approaches all require platform-specific integration:
- GPT Actions → OpenAI only, requires JSON schema registration
- MCP servers → Claude only, requires local installation
- Traditional RAG → requires an embedding pipeline, vector DB, and a wrapper app
- Plugins → deprecated
I wanted something that works with any AI that can browse the web, no setup, no plugins, no accounts. Here's what I figured out.
The core discovery: AI browsing tools can only follow clickable links
ChatGPT's browsing tool and Claude's web_fetch both have URL allowlists. They can only visit URLs that appear as actual <a href> links in HTML pages they've already fetched. They cannot:
- Construct URLs from documentation (blocked by ChatGPT's url_safe system)
- Follow URLs that appear as string values in JSON (invisible to the allowlist)
- Modify previously-seen URLs (even changing limit=10 to limit=50 gets rejected)
This means a traditional JSON API is useless to browsing-mode AI. The AI reads your docs, understands your filter syntax, constructs
a perfect query URL... and gets blocked.
The architecture: HTML link chains
Instead of serving JSON, we serve HTML to AI agents with every URL as a clickable <a href> link. The AI navigates our API like a human browsing a website:
AI reads llms.txt (discovery file, like robots.txt for AI)
AI fetches /v1/status → HTML with clickable example query links
AI fetches /v1/browse → 75 categorized filter links (by panel type, size, brand, use case, price...)
AI follows the closest matching link → gets HTML results with per-monitor detail links
Each results page has "Refine results" links (add USB-C, change sort, try different size)
AI follows detail/compare links for specific monitors
Every hop in the chain is an <a href> link that the AI's browsing tool can follow. No URL construction needed. The AI just clicks links like a human would.
Content negotiation: same endpoint, different formats
We detect the user agent and serve HTML to AI assistants, JSON to everything else. Same URL, same data, just a different wrapper:
ChatGPT-User → HTML with <a href> links
Claude-User → HTML with <a href> links
Regular browser → JSON (for developers)
The HTML includes all the same data (specs, scores, measurements, purchase links) plus navigation: "Next page", "Compare top 4",
"Refine results: + USB-C, try 27 inch, sort by gaming", "Browse all categories", "Back to status."
Dynamic refinement links
This is the part I'm most proud of. Every results page analyzes which filters are NOT yet applied and generates clickable refinement
links:
- If no size filter → shows "24 inch", "27 inch", "32 inch" links
- If no panel filter → shows "IPS", "VA", "OLED", "Mini LED" links
- If no price filter → shows "Under $500", "Under $800" links
- Always shows alternative sort options
This turns 75 static browse links into hundreds of reachable URLs after just 2-3 hops. The AI can drill down to arbitrarily specific combinations by following links hence never needs to construct a URL.
What we learned the hard way
JSON is invisible to AI browsing tools. URLs in JSON response bodies are not followable. This single discovery changed our entire architecture.
Affiliate language triggers content classifiers. ChatGPT's browsing tool blocked our entire domain when it saw "(affiliate)" labels repeated in responses. Clean "Buy: Amazon" links with the affiliate tag silently in the URL work fine.
Claude flags "prompt injection" on directive language. Words like "Use X", "Always do Y", "Behavior policies" in API responses trigger Claude's safety filters. Neutral, descriptive language works.
The llms.txt standard is powerful. A simple text file at /llms.txt that describes your API in plain language is all an AI needs to get started. It's like robots.txt but for AI assistants. (llmstxt.org)
<noscript> doesn't work for Bing SEO. Bingbot's Chromium engine signals JS support (skips noscript) but doesn't reliably render React SPAs. Static HTML must be in the DOM without JS tricks.
The result
Any user can paste a one-line prompt into ChatGPT, Claude, Perplexity, or Grok: Use https://specapis.com/. My monitor question: best 32-inch Mini LED IPS under $800
The AI reads the contract, navigates the link chain, and answers with structured data from 5,800+ monitors. No plugin setup. No API key. Works today in any AI with web access.
Would love feedback on the architecture. Is anyone else building APIs meant to be consumed by AI browsing tools? The traditional API design patterns (REST, GraphQL, OpenAPI) feel wrong for this use case, the consumer isn't a programmer writing code, it's an AI agent clicking links.