Browse

Link Safety Check

Checks the domain of a URL against the CERT Polska Warning List of malicious domains, whose licence allows commercial use, and reports whether the domain or a parent domain is listed and the date of the list. A URL on no list is not proof it is safe: the list only holds domains that have already been reported, and it checks the domain, not the page.

POST https://YOUR_API_HOST/v1/link-safety

Credits and caching

  • Per-call billing. 1 credit per URL checked (a check that cannot run is free). Every completed lookup is charged, found or not.
  • Results are cached per account for 0 days. Repeating the same lookup in that window is free and returns cache_hit: true.
  • Invalid input, rate limits and errors are never charged.
  • Read the billing rules for the full picture.

Request

Send a JSON body with Authorization: Bearer <key>. The body can be up to 64 KB.

FieldTypeRequiredNotes
urlstringyesUp to 2048 characters.

Example request

Terminal
curl -X POST https://YOUR_API_HOST/v1/link-safety \
  -H "Authorization: Bearer $LOOKVALID_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"url":"https://example.com"}'

Response

The status is 200 whether or not anything was found. Check found. Every response also carries the X-Request-Id, X-Credits-Charged, X-Credits-Remaining and X-RateLimit-* headers.

Envelope

FieldTypeNotes
request_idstring-
product"link-safety"-
foundbooleanFalse means the lookup ran and found nothing; it is free.
reasonstring or nullWhy nothing was found; null when found.
sourcesarray of stringWhere the data came from, including any attribution the licence requires.
credits_chargedinteger0 for a cache hit, a not-found result or an error.
credits_remaininginteger-
cache_hitbooleanTrue when the account already paid for this lookup within the cache window.
cacheobject-

The data object

Present when found is true, otherwise null.

FieldTypeNotes
urlstring-
hoststring-
verdictstringOne of listed, not_listed.
matchesarray of object-
matches[].feedstring-
matches[].match_typestringOne of host, parent_domain.
matches[].matchedstring-
feeds_checkedarray of object-
feeds_checked[].idstring-
feeds_checked[].namestring-
feeds_checked[].data_datestringWhen the feed data was published or last updated
feeds_checked[].matchedboolean-
feeds_checked[].licencestring-
feeds_unavailablearray of object-
feeds_unavailable[].idstring-
feeds_unavailable[].namestring-
feeds_unavailable[].reasonstring-
disclaimerstring-

Captured example (2026-10-18)

A real run of this lookup on 2026-10-18, using the request above, which is a public input. The envelope fields are left out.

{
  "product": "link-safety",
  "found": true,
  "data": {
    "url": "https://example.com/",
    "host": "example.com",
    "verdict": "not_listed",
    "matches": [],
    "feeds_checked": [
      {
        "id": "cert-pl-warning-list",
        "name": "CERT Polska Warning List of malicious domains",
        "data_date": "2026-10-18T03:00:12.000Z",
        "matched": false,
        "licence": "Free for any purpose including commercial use (CERT Polska), no attribution required"
      }
    ],
    "feeds_unavailable": [],
    "disclaimer": "A URL on no list is not proof it is safe: the list only holds domains that have already been reported, and it checks the domain, not the page. A listed domain can be a compromised site that is now clean. Feeds that could not be checked are named under feeds_unavailable."
  },
  "sources": [
    "CERT Polska Warning List of malicious domains (Free for any purpose including commercial use (CERT Polska), no attribution required), data of 2026-10-18"
  ]
}

Errors

  • 400 invalid_input: The request input is invalid.
  • 401 unauthorized: The API key is missing, malformed, revoked or unknown.
  • 402 insufficient_credits: The account does not have enough credits for this lookup. Error code: insufficient_credits. During a trial whose allowance is used up the code is trial_allowance_exhausted: nothing is charged and the customer starts the plan from the billing page.
  • 405 method_not_allowed: This endpoint does not accept that HTTP method.
  • 413 payload_too_large: The request body is too large.
  • 429 rate_limited: Too many requests for this API key.
  • 500 internal_error: An unexpected error occurred.
  • 503 provider_unavailable: The data source for this product is unavailable right now.