Security — entry 009 of 30

FilterLists

Verified Jul 2026

FilterLists is Collin Barrett's independent, actively-maintained directory of filter and host lists used by adblockers, firewalls, and DNS sinkholes to block ads, trackers, malware, and other unwanted content. Its ASP.NET Core REST API serves the same catalog that powers the site -- filter lists, the domains/URLs they target, licenses, and maintainer info -- with an interactive Swagger UI for exploring the schema before writing a query. The API and site are fully free and keyless, open-sourced on GitHub with commits as recent as this week. The API lives entirely on a separate `api.filterlists.com` host -- the intuitive REST paths on the main `filterlists.com` domain just return the site's own SPA shell.

FilterLists catalogs the filter and host lists that adblockers, firewalls, and DNS sinkholes subscribe to. The API lives entirely on a separate `api.` subdomain from the site you'd naturally reach for docs -- `/lists` returns the full catalog as one flat array, and `/lists/{id}` returns one entry's much richer detail record.

adblockfilter-listsopen-sourceprivacytrackers
AuthenticationNone requiredCall it straight away — no key, no signup.
HTTPSSupportedTraffic is encrypted in transit.
CORSDisabledBrowser calls need a server-side proxy.
PricingFreeNo paid tier — free for the documented use case.
FormatsJSONResponses can be requested as JSON.

GreatAPIs Score

Score88out of 100
Authentication25/25No authentication required
Pricing20/20Free to use
Docs14/20Documentation URL provided
Formats9/15Single response format
Freshness20/20Verified within 6 months

Embed this badge

Scored 88 on greatapis.com
<a href="https://greatapis.com/api/filterlists/"><img src="https://greatapis.com/badge/filterlists.svg" alt="Scored 88 on greatapis.com"></a>

Auth quickstart

  1. No API key or account is required -- every endpoint below is a public, keyless read, confirmed live.
  2. Use `api.filterlists.com`, not `filterlists.com`. Confirmed live in this run: both `https://filterlists.com/api/v1/lists` and `https://filterlists.com/api/directory/lists` -- URLs that look like the natural REST path from the site's own domain -- return `200 text/html`, the site's own SPA shell, not API data. The real API only responds on `https://api.filterlists.com`.
Stored keyNo key stored

Your key is stored only in this browser (localStorage) and sent directly to the API — never to greatapis.

Fetch one filter list's full detail record

GEThttps://api.filterlists.com/lists/1

200 application/json

{"id":1,"name":"AdGuard Japanese filter Plus","description":"This complements AdGuard Japanese filter and mainly consists of 1) additional generic rules to counter circumvention ads and anti-adblock, and 2) specific rules to address sites not addresed in the Japanese filters.","licenseId":4,"syntaxIds":[4],"languageIds":[73],"tagIds":[2],"viewUrls":[{"segmentNumber":1,"primariness":1,"url":"https://raw.githubusercontent.com/Yuki2718/adblock2/main/japanese/jpf-plus.txt"}],"homeUrl":"https://github.com/Yuki2718/adblock2","onionUrl":null,"policyUrl":null,"submissionUrl":null,"issuesUrl":"https://github.com/Yuki2718/adblock2/issues","forumUrl":null,"chatUrl":null,"emailAddress":null,"donateUrl":null,"maintainerIds":[150],"upstreamFilterListIds":[],"forkFilterListIds":[],"includedInFilterListIds":[],"includesFilterListIds":[],"dependencyFilterListIds":[],"dependentFilterListIds":[]}

Captured live and unmodified -- list ID 1 happens to be the first row returned by /lists at probe time, not a curated pick.

Developer reference

Base URLhttps://api.filterlists.com

Gotchas & limits

  • The API is on a different host from both the site's own URL and its docs URL. Confirmed live: `filterlists.com/api/v1/lists` and `filterlists.com/api/directory/lists` both 200 with `text/html` (the SPA shell, 2,295 bytes), while `api.filterlists.com/lists` 200s with real `application/json`.
  • `/lists` (the index) returns every one of the catalog's 2,306 entries in a single, unpaginated 577 KB JSON array -- confirmed live, no page/limit/offset parameter is accepted or documented. Fetch a single entry via `/lists/{id}` (as in the worked example) rather than the whole index if you only need one.
  • The index entry and the single-item detail are genuinely different shapes, not just a trimmed/full version of the same object. Confirmed live: a `/lists` row for list 1 carries only 8 fields (id, name, description, licenseId, syntaxIds, languageIds, tagIds, maintainerIds), while `/lists/1` adds ten more -- viewUrls, homeUrl, onionUrl, policyUrl, submissionUrl, issuesUrl, forumUrl, chatUrl, emailAddress, donateUrl -- plus six relationship-ID arrays (upstream/fork/includedIn/includes/dependency/dependent FilterListIds) not present on the index row at all -- 24 keys on the detail record against 8 on the index row, the 16 extras being those ten fields plus these six.
  • An unknown `/lists/{id}` (confirmed live with `/lists/999999999`) returns a bare `404` with an empty body (`content-length: 0`), not a JSON error object.
  • No CORS support: confirmed live, `/lists/1` returns no `access-control-allow-origin` header at all, whether the request is bare or carries an `Origin: https://example.com` header -- matches this entry's stored `cors: no`.
  • Sibling reference endpoints exist alongside `/lists` for resolving the ID arrays above: `/languages` (78 entries, confirmed live, e.g. `{"id":4,"iso6391":"af","name":"Afrikaans"}`), `/tags` (41 entries), and `/software`.