Build on CustomerGPT

A public read API, an MCP server, a CLI, Markdown for every page, and the discovery files agents look for — all on this domain, no account required.

Quickstart

Three requests cover most of what an agent needs: find a page, read it as Markdown, and check the plans. No keys, no sign-up. Responses are JSON (or text/markdown), CORS-open, and cached at the edge for an hour.

# 1. Find pages about a topic
curl -s "https://customergpt.ai/api/v1/search?q=zendesk+pricing"

# 2. Read any page as Markdown (same URL a browser uses)
curl -s -H "Accept: text/markdown" https://customergpt.ai/pricing
#    ...or append .md to the path
curl -s https://customergpt.ai/pricing.md

# 3. Plans and prices as JSON
curl -s https://customergpt.ai/api/v1/pricing

Every endpoint is described in the OpenAPI document at /api/openapi.json.

Public content API

Base URL https://customergpt.ai/api/v1. All endpoints are GET, unauthenticated and read-only. Errors are RFC 9457 problem details (application/problem+json); an unknown path under /api/v1 answers a JSON 404 with a link back to the index.

EndpointReturns
GET /api/v1API index: every endpoint, the OpenAPI URL, and how to ask for Markdown.
GET /api/v1/pagesAll 121 pages with title, description, section and Markdown URL. Filter with ?section=blog.
GET /api/v1/search?q=…Keyword search over page titles, descriptions and paths. Every term must match; title hits rank first.
GET /api/v1/markdown/{path}Any page rendered as text/markdown, e.g. /api/v1/markdown/pricing.
GET /api/v1/pricingSubscription plans, monthly and yearly prices, included limits.
GET /api/v1/glossaryGlossary terms with definitions; /api/v1/glossary/{slug} returns one term in full.

Markdown for agents

Every page on this site has two representations at one URL. Browsers get HTML. A client that sends Accept: text/markdown — or ranks it above text/html with q-values — gets the page's content as text/markdown; charset=utf-8: headings, links, tables and code, without navigation, footer or scripts. The response carries Vary: Accept, and the HTML response carries a Link: rel="alternate"; type="text/markdown" to the .md sibling for clients that cannot set headers.

curl -sI -H "Accept: text/markdown" https://customergpt.ai/product/how-it-works
# HTTP/1.1 200 OK
# Content-Type: text/markdown; charset=utf-8
# Vary: Accept

# q-values are honoured: this still returns HTML
curl -sI -H "Accept: text/markdown;q=0.2, text/html" https://customergpt.ai/pricing

# an Accept that matches neither is a 406 listing both
curl -sI -H "Accept: application/pdf" https://customergpt.ai/pricing

Convention: acceptmarkdown.com. Nonexistent paths answer a real 404 with a Markdown body that points at llms.txt, the search API and the sitemap.

Discovery files

Fixed-path files an agent can fetch before it has read anything else.

  • /api/openapi.json OpenAPI 3.1Machine-readable description of every endpoint above and of the free-tool backends.
  • /.well-known/api-catalog RFC 9727 API catalogLinkset pointing at the description, the docs and the status endpoint.
  • /.well-known/mcp.json MCP server cardTransport, tool list and client config for the MCP server.
  • /llms.txt llmstxt.orgMarkdown index of every page with a one-line description.
  • /llms-full.txt Plain textThe whole site as one document, for agents that want a single fetch.
  • /sitemap.xml sitemaps.orgEvery indexable URL with change frequency and priority.
  • /robots.txt robots.txtCrawl permissions; AI crawlers are explicitly allowed.

MCP server

The same read API is exposed as a Model Context Protocol server at https://customergpt.ai/api/mcp — Streamable HTTP transport, stateless, no authentication. Tools: search_pages, list_pages, get_page_markdown, get_pricing, get_glossary_term; resource: llms.txt. All tools are read-only (readOnlyHint: true). The server card is at /.well-known/mcp.json.

// Claude Desktop, Claude Code, Cursor, VS Code — any Streamable HTTP client
{
  "mcpServers": {
    "customergpt": { "type": "http", "url": "https://customergpt.ai/api/mcp" }
  }
}

# Or talk JSON-RPC directly
curl -s https://customergpt.ai/api/mcp \
  -H "Content-Type: application/json" -H "Accept: application/json, text/event-stream" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'

initialize answers without an auth challenge; GET and DELETE return 405 because a stateless server has no session stream.

Command-line tool

customergpt-cli on npm wraps the read API for scripts and shells. Zero dependencies, Node 18+, honours the rate-limit headers and reports Retry-After when throttled.

npm install -g customergpt-cli        # or run once with: npx customergpt-cli ...

customergpt search zendesk pricing    # find pages by keyword
customergpt page /pricing             # any page as Markdown
customergpt pricing                   # plans and prices
customergpt glossary retrieval-augmented-generation
customergpt mcp                       # MCP client config for the server above
customergpt pages --section blog --json

Getting started, without talking to sales

  • Free, no account: everything on this page — /api/v1, /api/mcp, Markdown pages, the CLI — works right now with no key.
  • Free trial of the product: 14 days, no credit card, self-serve at https://dashboard.customergpt.ai/?mode=register.
  • API keys: issued and rotated by you in the dashboard on the Growth plan and above (see pricing); each key is scoped to one chatbot.
  • Sandbox: the free tools run the same conversion and generation backends as the product, open to anyone. Their endpoints are in the OpenAPI file under Browser tools; each call needs a Cloudflare Turnstile token from the tool page, so drive them from a browser and use /api/v1 from scripts.

Product API

The chatbot platform itself — creating agents, ingesting sources, reading conversations, webhooks — is operated from the dashboard. That API is not yet described in the public OpenAPI document; when it is, it will be listed in /.well-known/api-catalog and here. Need it sooner, or an endpoint the read API does not cover? Contact us or email [email protected].

Rate limits

120 requests per 60 seconds per client IP, on /api/v1 and /api/mcp. Every response tells you where you stand with the IETF RateLimit header fields, plus the widely-read X-RateLimit-* trio:

RateLimit-Policy: "default";q=120;w=60    # quota and window
RateLimit: "default";r=118;t=41              # remaining, seconds until reset
X-RateLimit-Limit: 120
X-RateLimit-Remaining: 118
X-RateLimit-Reset: 41

# over quota:
HTTP/1.1 429 Too Many Requests
Retry-After: 41
Content-Type: application/problem+json

Wait Retry-After seconds, or pace requests so RateLimit's r never reaches 0. Cached JSON responses (s-maxage=3600) carry the counters from the moment they were rendered.

Versioning and deprecation policy

  • Version in the path. /api/v1 is the current major version. A breaking change ships as /api/v2 alongside v1; it never replaces it in place.
  • Additive within a major. Fields are added, never removed, renamed or retyped; new query parameters are optional; enum values may grow. Treat unknown fields as ignorable.
  • Six months' notice. A deprecated endpoint, field or major version keeps working for at least six months after the announcement.
  • Machine-readable signals. Affected responses carry Deprecation (RFC 9745, the date the deprecation took effect), Sunset (RFC 8594, the removal date) and Link: <…>; rel="deprecation" pointing at the notice here. The OpenAPI document marks the operation deprecated: true and its x-versioning-policy object states the same rules.
  • Today: nothing is deprecated. The MCP server and the CLI follow the same policy; the CLI's major version tracks the API's.

Caching, CORS and support

  • JSON responses are cached publicly for one hour (s-maxage=3600) and served stale for a day while revalidating. MCP responses are never cached.
  • CORS: Access-Control-Allow-Origin: * on every /api/v1 and /api/mcp response, so both are callable from a browser.
  • Errors are RFC 9457 problem details; MCP errors are JSON-RPC errors or isError tool results.
  • Questions or a broken endpoint: [email protected].