Status
This page now documents the current ToolsAPI model used on
tools.tornevall.*together with the current WordPress DNSBL plugin behaviour.The historical DNSBL v5 / API v3 interface is deprecated, phased out, and no longer the active integration model. A legacy reference is kept at the bottom of this page for compatibility and migration work.
GDPR notice
Older blacklist workflows sometimes stored more contextual material around why a host or message was flagged. That is no longer the design target.
In the current ToolsAPI direction, GDPR and data minimization must be considered before data is published to DNS. Because the live reputation layer is now distributed through DNS zones and zone files rather than a real-time database API, anonymization and minimization must happen in the publication flow itself. Only data required for classification, abuse mitigation, and fraud protection should be exposed.
With "our API" in this document, we mean ToolsAPI, hosted on tools.tornevall.*.
Today, the active model is:
3.0/dnsbl request semantics are no longer the primary public contractThere is not a new public one-to-one replacement for the old PUT /3.0/dnsbl / DELETE /3.0/dnsbl workflow documented here as an active API.
Instead, the current stack is built around:
The returned reputation value is a bitmask integer.
Each bit represents a specific reputation state. Multiple bits can be active at the same time.
| Value | Constant | Meaning | Status |
|---|---|---|---|
1 |
FREE_SLOT_1_PREVIOUSLY_REPORTED |
Previously used for older reported-IP flows. Considered unreliable. | Deprecated |
2 |
IP_CONFIRMED |
IP address confirmed as a working proxy. | Active |
4 |
IP_PHISHING |
Host confirmed as phishing or fraud infrastructure. | Active |
8 |
IP_FRAUDCOMMERCE |
Reserved for e-commerce fraud classification. This value is occupied and must not be reused for anything else. | Active |
16 |
IP_MAILSERVER_SPAM |
E-mail spam source. | Active |
32 |
IP_SECOND_EXIT |
Secondary exit point, for example TOR exit or alternate abuse IP. | Active |
64 |
IP_ABUSE_NO_SMTP |
General abuse through web forms, attacks, telnet, forums, or similar channels. | Active |
128 |
IP_ANONYMOUS |
Anonymous proxy or anonymizing service. | Active |
You must treat the response as a sum of active bits, never as a single-status enum.
Example:
4 + 16 + 64 = 84
This means the host is simultaneously classified as:
8 must use IP_FRAUDCOMMERCE.8 must not be recycled for an unrelated meaning.Historical API v3 code used the name FREE_SLOT_8_PREVIOUSLY_PROXYTIMEOUT for bit 8. That name belongs to the legacy model only and should be considered obsolete in new documentation and new integration logic.
The current DNSBL / FraudBL stack is DNS-first.
dnsbl.tornevall.orgbl.fraudbl.orgecom.fraudbl.orgbl.fraudbl.org.bl.fraudbl.org zoneecom.fraudbl.org zoneWhen a commerce blacklist event is published, it should not only create a regular FraudBL-style entry. It should also create a dedicated commerce entry.
Example zone target:
X.X.X.X.ecom.fraudbl.org
The exact DNS name construction for commerce publication should be handled by the DNSBL/DNS layer, not manually reconstructed by external callers.
Because the current system publishes through DNS zone files, you cannot treat the data model like a database-driven API that can always be rewritten or anonymized afterward.
Therefore:
The active write/read surfaces in the current codebase are now exposed under both:
/api/dns
/api/dnsbl
The DNS endpoints remain the low-level DNS-backed write surface.
The DNSBL endpoints are convenience aliases for reputation publication where the caller sends an IP address plus a bitmask and lets the DNSBL layer decide owner encoding, zone selection, and commerce mirroring.
The current DNS endpoints support these access modes:
Authorization: Bearer <token>X-API-Key: <token>?api_key=<token> query parameterGET /api/dns/zonesLists zones available to the caller.
Possible access types in responses include:
authenticatedapi_key_globalip_whitelistExample:
{
"ok": true,
"count": 2,
"zones": [
{
"zone": "dnsbl.tornevall.org",
"file": "...",
"key": "dnsbl.tornevall.org"
}
],
"access_type": "authenticated"
}
GET /api/dns/zones/{zone}Returns zone data for a specific zone.
Supported read modes in the current controller are:
The response contains paged zoneData records with fields such as:
nametyperdatattlclassGET /api/dns/zones/{zone}/axfrForces an AXFR-style fetch path in the current controller flow. AXFR is used because dynamic DNS updates may exist in journal state before they are flushed to local zone files.
GET /api/dns/zones/{zone}/cacheChecks whether a fresh cache entry exists.
Response source values currently include:
from_databaseneeds_axfrIf cache is available, the response can include:
cached_atcache_agecache_ttl_secondszoneDataGET /api/dns/zones/{zone}/search?q=...Searches cached zone data only.
Important behaviour in the current implementation:
Possible response source values include:
from_databasefrom_database_stalePOST /api/dns/zones/{zone}/cache/clearClears the stored cache entry for one zone.
These endpoints are the active write surface in the public ToolsAPI codebase:
POST /api/dns/records/addPOST /api/dns/records/deletePOST /api/dns/records/updatePOST /api/dns/records/bulkThe same DNSBL publication logic is also reachable through:
POST /api/dnsbl/records/addPOST /api/dnsbl/records/deletePOST /api/dnsbl/records/updateCurrent implementation notes:
DnsUpdateServicetarget value to avoid dangerous full-RRset deletionWhen you use the DNSBL-oriented write flow, you send an IP address and a bitmask instead of constructing owner names yourself.
POST /api/dnsbl/records/add{
"ip": "1.2.3.4",
"bitmask": 12,
"publication_type": "commerce",
"ttl": 300
}
This currently results in publication to both:
4.3.2.1.bl.fraudbl.org4.3.2.1.ecom.fraudbl.orgwith target:
127.0.0.12
POST /api/dnsbl/records/delete{
"ip": "1.2.3.4",
"bitmask": 12,
"publication_type": "commerce"
}
Delete requests remove the specific A record target from every owner generated by the DNSBL publication layer. For commerce-related entries that means both the ordinary FraudBL zone and the dedicated ecom zone.
POST /api/dnsbl/records/update{
"ip": "1.2.3.4",
"old_bitmask": 4,
"bitmask": 12,
"publication_type": "commerce",
"ttl": 300
}
Update requests require old_bitmask so the DNS update layer can safely delete the previous 127.0.0.X target before inserting the new one.
The active DNS update service uses a default TTL of 300 seconds for new records unless another TTL is supplied. That aligns with the intended low-TTL approach for fast-changing reputation data.
The intended commerce flow in the current ToolsAPI architecture is:
This keeps anonymization and naming logic in one place.
The current implementation still uses reverse-IP owner encoding for the published DNS owner names.
That is intentional for now: the important architectural rule is that the caller does not construct those names manually. If anonymized hashing or another GDPR-driven encoding model is introduced later, that change belongs in the DNSBL publication layer rather than in clients or in the generic DNS endpoints.
For commerce-related removals, delete handling should cover both:
bl.fraudbl.org entryecom.fraudbl.org entryCommerce-related records should use the shortest safe TTL in the DNS environment.
Recommended target:
300 seconds
Why this matters:
The current WordPress plugin is no longer driven by the old API v3 endpoint contract.
The current plugin code:
dnsbl.tornevall.orgbl.fraudbl.org127.0.0.X result into a bitmaskThe current plugin cache model now uses:
600 seconds300 seconds300 secondsThe plugin also includes scheduled cleanup of expired cache entries.
The admin UI now distinguishes between:
It also records live event statistics such as:
Whitelisted IPs are still:
But they are not:
This is the intended safe dry-run model for WordPress administration.
For new installs, the current visitor IP can be seeded into the whitelist when REMOTE_ADDR is available.
The admin UI also supports:
The plugin also contains an optional Tools-based comment assessment call to:
/api/tools/dnsbl/comment-assess
That path is treated as an optional Tools integration by the plugin. The public DNS documentation on this page focuses on the active DNS-backed read/write model in the current ToolsAPI codebase.
Deprecated
Everything in this section is historical reference material only. It is no longer the active integration model for ToolsAPI.
The DNSBL backend used to be described as version 5.0, while the HTTP layer was described as API v2 or API v3.
Legacy permission names included:
allow_cidrallow_cidr_updatecan_purgednsbl_updatefraudbl_updateglobal_delistlocal_delistoverwrite_flagsLegacy v2 lookup requests used forms like:
POST https://api.tornevall.net/2.0/dnsbl/ip/
bulk[]=ipaddr1&bulk[]=ipaddr2
The older API also used overloaded suffix syntax for extended info and add/delete operations.
POST /3.0/dnsbl/Used to resolve or check whether an IP was listed.
Example:
{"ip":"1.2.3.4"}
PUT /3.0/dnsbl/Used to insert or update blacklisted IP data.
Example:
{
"ip": {
"10.10.10.10": 64
},
"type": "dnsbl"
}
DELETE /3.0/dnsbl/Used to delist or remove an IP.
Example:
{
"ip": "1.2.3.4"
}
The old API described:
dnsblecommerceIn that legacy implementation, commerce registration was already treated as a special case and the old codebase also referenced:
dnsbl.tornevall.orgbl.fraudbl.orgecom.fraudbl.orgOlder API v3 code still named bit 8 as:
FREE_SLOT_8_PREVIOUSLY_PROXYTIMEOUT
That naming is legacy-only and should not be used in current specifications.
Last Updated: 2026-03-14