TL;DR: Cleanlist serves a live OpenAPI 3.x spec scoped to the public surface. Browse it interactively at /docs (opens in a new tab) (Swagger) or /redoc (opens in a new tab), or pull the raw JSON from /openapi-public.json (opens in a new tab) to generate a typed client.
OpenAPI Specification
Cleanlist's API is built with FastAPI, which auto-generates an OpenAPI 3.x document. The published spec is filtered to the supported public surface — only /api/v1/public/* endpoints appear.
| URL | Format | Best for |
|---|---|---|
https://api.cleanlist.ai/openapi-public.json | Raw JSON | Code generation |
https://api.cleanlist.ai/docs | Swagger UI | Interactive exploration |
https://api.cleanlist.ai/redoc | Redoc | Clean read-only reference |
All three stay in sync with production automatically.
Browsing interactively
Swagger UI — /docs (opens in a new tab)
Swagger UI lets you expand each endpoint, see request/response schemas, and "Try it out" against the live API. Paste your clapi_ key into the Authorize dialog (HTTP Bearer scheme) before calling anything.
Redoc — /redoc (opens in a new tab)
Redoc renders a static three-column reference that's easier to skim than Swagger when reading rather than experimenting.
Downloading the spec
curl https://api.cleanlist.ai/openapi-public.json -o cleanlist-openapi.jsonThe spec is unauthenticated — you can pull it without an API key.
Generating a client SDK
TypeScript
npx openapi-typescript https://api.cleanlist.ai/openapi-public.json -o ./cleanlist-types.tsPython
pipx install openapi-python-client
openapi-python-client generate --url https://api.cleanlist.ai/openapi-public.jsonOther languages
# Java, Go, Ruby, Rust, C#, PHP, Swift, Kotlin, etc.
npm install -g @openapitools/openapi-generator-cli
openapi-generator-cli generate \
-i https://api.cleanlist.ai/openapi-public.json \
-g <language> \
-o ./cleanlist-clientSee the OpenAPI Generator project (opens in a new tab) for the full language list.
Versioning
The Public API is versioned via the URL prefix (/api/v1/...). Backwards-incompatible changes ship under a new version prefix; the prior version keeps working for a deprecation period announced via the portal (opens in a new tab) and email to key holders. A call to a retired version returns version_deprecated (see Errors).