Skip to main content

The API is small on purpose. It exposes the coverage lookup and nothing else, because nothing else can be exposed without handling personal data.

Base URL

https://netguard.example/api

All responses are application/json; charset=utf-8. All requests must use HTTPS; plain HTTP is redirected.

POST /api/coverage

Checks whether a domain appears in the published blocklists.

Request

POST /api/coverage
Content-Type: application/json

{
  "domain": "example.com",
  "lists": ["gambling", "gambling-affiliate"]
}

domain is required, at most 253 characters. A full URL is accepted and reduced to its hostname. lists is optional; omit it to search every list.

Browser requests must include the CSRF token from the page, as the field _csrf. Server-to-server requests are exempt when no cookie is sent.

Response

200 OK

{
  "domain": "example.com",
  "listed": false,
  "checkedAt": "2026-08-23T09:14:22.000Z",
  "listsSearched": ["gambling", "gambling-affiliate"]
}

When the domain is listed, three further fields are present:

{
  "domain": "bet365.com",
  "listed": true,
  "list": "Gambling",
  "listId": "gambling",
  "matchedRule": "bet365.com",
  "source": "Operators licensed by the Gambling Commission, checked by hand against the public register",
  "checkedAt": "2026-08-23T09:14:22.000Z"
}

matchedRule is the list entry that matched, which may be a parent domain of the one you asked about, since a rule covers all subdomains.

A domain on the never-block list returns listed: false with "protected": true.

Errors

Every error carries a machine-readable error code and a sentence a human can act on.

StatuserrorMeaning
400invalid_domainThe domain was missing, too long, or not a plausible hostname.
400invalid_jsonThe body was not valid JSON.
403csrf_failedA cookie was sent without a matching token.
413body_too_largeThe body exceeded 64 KiB.
415unsupported_media_typeContent-Type was neither JSON nor form-encoded.
429rate_limitedSee the Retry-After header.
{
  "error": "invalid_domain",
  "message": "Enter a domain such as example.com."
}

Rate limits

Sixty requests per minute per IP address. Exceeding it returns 429 with a Retry-After header in seconds. There is no paid tier that raises this; if you need more, get in touch and we will talk about it rather than sell you something.

What the API does not return

No query logs. No per-device data. No information about who checked what. Those things are not behind authentication, they are not collected.

Coverage checks are recorded as a count only, so we know which lists get used. The domain checked is stored; the checker is not identified.

Versioning

There is no version prefix, because there is one endpoint. If a breaking change becomes necessary, a /api/v2 prefix will be introduced and the current path will keep working for at least twelve months. Changes are announced in the changelog.


Something wrong or missing on this page? Tell us and we will fix it. We reply to every enquiry within one working day.

Contact