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:
If you are integrating with the current DNSBL/FraudBL stack, the normal order is:
GET /api/dnsbl/token/infoPOST /api/dnsbl/check-ip/api/dnsbl/records/*GET /api/dnsbl/statsGET /api/dnsbl/engine-settingsPOST /api/dnsbl/forum/bouncePOST /api/dnsbl/dmarc/reportTools now exposes GET /api/dnsbl/stats for API-readable DNSBL counters.
X-Dnsbl-Token / dnsbl_token, active DNSBL provider keys, and admin/session contexts that already resolve for /api/dnsbl/*.stats.api_queries summarizes recorded /api/dnsbl/* traffic from the local api_endpoint_visits tracker.stats.mutations summarizes database-backed logical DNSBL add/delete/update outcomes, including successful writes, dry-runs, failures, and delete no-op cases such as already_not_listed.Example:
curl -s "https://tools.tornevall.net/api/dnsbl/stats" \
-H "X-Dnsbl-Token: YOUR_TOKEN"
Tools also now has a public browser page at:
/dnsbl/statistics
That page combines:
GET /api/dnsbl/stats, andDNSBL_V5.ipwhitelist.Important whitelist behavior notes:
description is now shown publicly when it is not empty,is_local_network marks rows that represent local-network exceptions that are normally supposed to stay out of blacklist publication and therefore also be purged from the DNSBL zones when they appear there.Admin note:
/admin/dnsbl/engine-settings now also shows the same whitelist/local-network overview,ipwhitelist.For DNSBL-oriented endpoints, the delegated auth model is still a DNSBL token sent as either:
X-Dnsbl-Token: <token>dnsbl_token=<token>Depending on the endpoint, active DNSBL provider keys and active admin-owned Tools tokens can also resolve through the same transport.
Check token status:
curl -s "https://tools.tornevall.net/api/dnsbl/token/info?dnsbl_token=YOUR_TOKEN"
Check one IP:
curl -s "https://tools.tornevall.net/api/dnsbl/check-ip" \
-H "Content-Type: application/json" \
-H "X-Dnsbl-Token: YOUR_TOKEN" \
-d '{"ip":"203.0.113.4"}'
Delete one IP (server-side delist scope resolution):
curl -s "https://tools.tornevall.net/api/dnsbl/records/delete" \
-H "Content-Type: application/json" \
-H "X-Dnsbl-Token: YOUR_TOKEN" \
-d '{"ip":"203.0.113.4"}'
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.dnsbl.tornevall.orgopm.tornevall.orgbl.fraudbl.orgbl.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.
For delete / delist requests, the current controller is now authoritative on the server side:
dnsbl.tornevall.org, opm.tornevall.org, bl.fraudbl.org, and/or ecom.fraudbl.org,DELETE operations are built from that live result.Clients therefore no longer need to decide which blacklist subzone should be deleted for a given IP. Caller-provided publication_type / bitmask on delete is treated as a hint at most; the authoritative delist scope now comes from the server-side DNS lookup.
Delete no-op note:
invalid_dnsbl_publication error,reason="already_not_listed", already_not_listed=true, forced_success=true, and operation_count=0,Private-network hygiene note:
10.0.0.0/8, 172.16.0.0/12, and 192.168.0.0/16 are now rejected before DNS writes are applied.422 with reason="private_ipv4_not_allowed_in_dnsbl"./admin/dnsbl/engine-settings so operators can remove any historical private reverse-owner rows that may have leaked into dnsbl.tornevall.org, opm.tornevall.org, bl.fraudbl.org, or ecom.fraudbl.org before this guard existed.Local-network whitelist hygiene note:
DNSBL_V5.ipwhitelist, not only by the three hard-coded RFC1918 ranges,is_local_network=1 are treated as table-driven local-network exceptions,/dnsbl/statistics,Operational note for DNS transport:
1.2.3.4.bl.fraudbl.org or 1.2.3.4.opm.tornevall.org,fraudbl.org / tornevall.org) instead of incorrectly using the child zone itself as the update-zone section.Operational guidance for helper/native clients:
check-ip / delete_candidates into multiple follow-up delete requests for the same IP unless you are intentionally deleting multiple distinct IP addresses,The current DNS endpoints support these access modes:
Authorization: Bearer <token>X-API-Key: <token>?api_key=<token> query parameterFor /api/dnsbl/* writes specifically, a dedicated DNSBL token remains the normal delegated model. In addition, an active admin-owned Tools API key/token now receives automatic effective DNSBL access through the same X-Dnsbl-Token / dnsbl_token transport.
When a pending DNSBL token request is approved from /admin/dnsbl/tokens, Tools now also sends a requester-facing approval email confirming that the token is ready, listing the granted scope, and summarizing the current delete guardrails/default limits applied to that account.
Tools now also exposes a DMARC intake path for dnsbl-engine / site-owner workflows:
POST /api/dnsbl/dmarc/reportPurpose:
message/rfc822 mails where the actual DMARC XML/ZIP arrives as a nested attachment,Auth rules:
X-Dnsbl-Token or dnsbl_token,can_add is true,provider=tornevall_dnsbl) are also accepted through the same token transport,401,403 with reason="insufficient_dnsbl_scope",Example request body:
{
"payload_base64": "H4sIAAAAA...",
"source_type": "dnsbl_engine_dmarc",
"source_name": "dnsbl-engine",
"original_filename": "mailru-report.xml.gz",
"content_type": "application/gzip",
"content_encoding": "gzip"
}
Typical success response:
{
"ok": true,
"duplicate": false,
"message": "DMARC payload ingested for admin review.",
"report": {
"id": 12,
"report_id": "33491921110551199191685577600",
"org_name": "Mail.Ru",
"policy_domain": "tornevall.net",
"status": "pending",
"record_count": 1,
"source_ip_count": 1,
"date_begin": "2023-06-01T00:00:00+00:00",
"date_end": "2023-06-02T00:00:00+00:00"
},
"records": [
{
"id": 99,
"source_ip": "60.13.8.218",
"message_count": 1,
"disposition": "reject",
"dkim_result": "fail",
"spf_result": "fail",
"recommended_action": "spam_fraud",
"status": "pending"
}
]
}
Operational/admin flow:
/admin/dnsbl/dmarc,spam (16) or spam + fraud (84),Tools now also exposes the normalized runtime settings used by dnsbl-engine:
GET /api/dnsbl/engine-settingsPurpose:
Auth rules:
/api/dnsbl/* endpoints,Typical success response:
{
"ok": true,
"message": "DNSBL engine settings loaded.",
"settings": {
"skip_delivery_status_notifications": true,
"forum_bounce_enabled": true,
"forum_bounce_group_id": 156,
"forum_bounce_exempt_group_ids": [6, 7, 37]
},
"auth": {
"auth_mode": "dnsbl_token",
"scope_label": "add"
}
}
Tools now also exposes a dedicated intake path for forum-related bounce / mailer-daemon analysis from dnsbl-engine:
POST /api/dnsbl/forum/bouncePurpose:
156) as a secondary forum group,Auth rules:
X-Dnsbl-Token / dnsbl_token,provider=tornevall_dnsbl) are also accepted,401, and ordinary non-DNSBL Tools tokens return 403 with reason="wrong_token_type".Example request body:
{
"rejected_recipients": [
{"email": "user@example.net"},
{"email": "second@example.net"}
],
"source_type": "dnsbl_engine_forum_bounce",
"source_name": "dnsbl-engine",
"original_filename": "1700000000.12345.mail",
"subject": "Delivery Status Notification (Failure)",
"sender_identity": "MAILER-DAEMON <mailer-daemon@example.net>",
"remote_host": "mx.example.net",
"diagnostic": "550 5.1.1 User unknown"
}
Typical success response:
{
"ok": true,
"message": "Forum bounce recipients were processed against vBulletin users.",
"summary": {
"submitted_emails": 2,
"matched_users": 1,
"updated_users": 1,
"skipped_users": 0,
"already_grouped_users": 0,
"exempt_users": 0,
"unmatched_emails": 1,
"dry_run": false
},
"updated_users": [
{
"userid": 123,
"username": "ForumUser",
"email": "user@example.net",
"action": "update_membergroups",
"new_membergroupids": "20,156"
}
],
"unmatched_emails": [
"second@example.net"
],
"settings": {
"enabled": true,
"target_group_id": 156,
"exempt_group_ids": [6, 7, 37]
}
}
Admin/operator note:
GET /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/updatePOST /api/dnsbl/check-ipCurrent implementation notes:
DnsUpdateServicetarget value to avoid dangerous full-RRset deletionUse GET /api/dnsbl/token/info when a helper client, plugin, or native tool needs to confirm whether the supplied token is:
This is the fastest way to distinguish:
401 no_token404 not found422 wrong_token_typeRecommended flow for one IP:
POST /api/dnsbl/check-ipPOST /api/dnsbl/records/delete request for that IPImportant: do not fan out one check-ip result into multiple delete calls for the same IP just because delete_candidates[] contains multiple publication families. The server-side delete flow already expands the live-listed owners/zones for that IP.
Example delete response for an already cleared IP:
{
"ok": true,
"reason": "already_not_listed",
"already_not_listed": true,
"forced_success": true,
"operation_count": 0,
"message": "No active DNSBL/FraudBL listings were found for this IP, so the delete request was accepted as a no-op."
}
Use the DNSBL endpoints when the caller has an IP address + bitmask and wants Tools to own:
Example add request:
{
"ip": "203.0.113.4",
"bitmask": 64,
"publication_type": "dnsbl",
"ttl": 300
}
Example update request:
{
"ip": "203.0.113.4",
"old_bitmask": 64,
"bitmask": 84,
"publication_type": "fraudbl",
"ttl": 300
}
POST /api/dnsbl/records/add|delete|update|bulk accepts dry_run=true.
Use it when you want to validate:
without applying DNS writes.
GET /api/dnsbl/engine-settings is for dnsbl-engine-style runtime alignmentPOST /api/dnsbl/forum/bounce is for rejected forum-recipient intakePOST /api/dnsbl/dmarc/report is for DMARC review ingestion, not direct blacklist publicationWhen 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,
"dry_run": true
}
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
Fraud/non-commerce adds now behave differently from commerce adds:
publication_type=fraud / fraudbl, or a bitmask containing IP_PHISHING) now mirrors into dnsbl.tornevall.org, opm.tornevall.org, and bl.fraudbl.orgbl.fraudbl.org + ecom.fraudbl.org and is not mirrored into the ordinary DNSBL zonespublication.publication_types[] metadata so clients can see which publication families were expanded for the submitted writePOST /api/dnsbl/records/delete{
"ip": "1.2.3.4",
"bitmask": 12,
"publication_type": "commerce",
"dry_run": true
}
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.
Delete handling is now also removal-audited server-side. Real delete attempts, dry-runs, denied removals, and delete items inside bulk requests all emit dedicated DNSBL removal audit entries in the backend logs with the resolved IP, owner names, zones, and delete targets when that information is available.
Delete/write callers can now also add optional audit-tracing metadata when they want the backend audit trail to identify the originating system more clearly, for example:
{
"source_type": "wordpress_plugin",
"source_name": "Example Site",
"source_site_url": "https://example.org/",
"source_page_url": "https://example.org/removal/"
}
These fields are additive only. They are meant for operator/audit visibility and do not change the authoritative server-side delist resolution. When explicit source fields are missing, Tools can still derive partial origin details from request headers such as Origin, Referer, and User-Agent when those headers exist.
If the admin enables the Slack log category DNSBL removal audit, those dedicated removal events are also forwarded to Slack without requiring the broader API /dnsbl requests audit stream.
The same removal audits can now also be sent as plain-text mail to the configured DNSBL_REMOVAL_AUDIT_EMAIL recipient list. This is intended for operators who want a second audit sink in addition to logs/Slack.
POST /api/dnsbl/records/update{
"ip": "1.2.3.4",
"old_bitmask": 4,
"bitmask": 12,
"publication_type": "commerce",
"ttl": 300,
"dry_run": true
}
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.
GET /api/dnsbl/token/infoReturns permission and scope information for a DNSBL token without requiring a logged-in session.
Auth: X-Dnsbl-Token: <token> header or ?dnsbl_token=<token> query parameter.
Returns info for any token status (active, pending, revoked) so clients can see the exact state and understand why a token may not be working.
The endpoint now performs live inspection for any non-empty token string. It no longer rejects a value only because it fails a local length/format check before lookup.
If the supplied value matches another Tools token/provider that belongs to an active admin-owned Tools token, the endpoint now treats it as having automatic effective DNSBL access and returns a success payload with token.resolved_via="admin_api_key_passthrough" plus full effective permission fields.
Example response:
{
"ok": true,
"token": {
"name": "My Token",
"status": "active",
"is_admin_token": false,
"allow_add": true,
"allow_delete": false,
"can_add": true,
"can_delete": false,
"scope_label": "add",
"zones": ["dnsbl.tornevall.org", "opm.tornevall.org", "bl.fraudbl.org", "ecom.fraudbl.org"],
"approved_at": "2026-04-04T12:00:00+00:00",
"requested_by_email": "user@example.com"
}
}
Error responses:
401 – no token provided404 – token not found in the system422 – the supplied value matches another Tools token/provider instead of a DNSBL write token and it is not eligible for admin passthroughAdmin passthrough example:
{
"ok": true,
"message": "The supplied token belongs to a Tools admin and therefore has automatic DNSBL read/write access through the same X-Dnsbl-Token flow.",
"token": {
"name": "Tools AI Bearer",
"status": "active",
"is_admin_token": true,
"allow_add": true,
"allow_delete": true,
"can_add": true,
"can_delete": true,
"scope_label": "admin_api_key_passthrough",
"zones": ["dnsbl.tornevall.org", "opm.tornevall.org", "bl.fraudbl.org", "ecom.fraudbl.org"],
"approved_at": null,
"requested_by_email": "admin@example.com",
"provider": "tools_ai_bearer",
"resolved_via": "admin_api_key_passthrough",
"is_admin_passthrough": true
},
"user": {
"id": 1,
"name": "Admin User",
"email": "admin@example.com",
"is_admin": true,
"is_acknowledged_admin": true
},
"admin_owner": {
"is_admin_user": true,
"is_acknowledged_admin": true,
"automatic_dnsbl_access": true,
"accepted_for_dnsbl_reads_and_writes_via_token": true,
"token_is_active": true
}
}
Example 422 wrong_token_type response:
{
"ok": false,
"reason": "wrong_token_type",
"message": "The supplied token is a valid Tools bearer token, but it is not a DNSBL write token.",
"token_type": "tools_bearer",
"provider": "tools_ai_bearer",
"token": {
"provider": "tools_ai_bearer",
"name": "Tools AI Bearer",
"is_active": true,
"is_global": false,
"is_personal": true,
"user_id": 7
},
"user": {
"id": 7,
"name": "Example User",
"email": "user@example.com",
"is_admin": false,
"is_acknowledged_admin": false
}
}
POST /api/dnsbl/check-ipPerforms a live DNS-backed inspection for one IP address and returns the currently listed DNSBL/FraudBL publication families together with the delist candidates that the authenticated token/session can act on.
Auth: the same DNSBL auth model as the write endpoints (X-Dnsbl-Token, dnsbl_token, or privileged admin/session/API-key access).
Request:
{
"ip": "1.2.3.4"
}
Example response:
{
"ok": true,
"ip": "1.2.3.4",
"message": "Current DNS lookup found active listings and the authenticated context can delist: DNSBL (64).",
"lookup": {
"listed": true,
"combined_bitmask": 64,
"constants": ["IP_ABUSE_NO_SMTP"],
"statement": "Current DNS lookup found active DNSBL/FraudBL listings for this IP.",
"zones": [
{
"zone": "dnsbl.tornevall.org",
"publication_type": "dnsbl",
"host": "4.3.2.1.dnsbl.tornevall.org",
"listed": true,
"bitmask": 64,
"target": "127.0.0.64",
"constants": ["IP_ABUSE_NO_SMTP"]
}
],
"delete_candidates": [
{
"publication_type": "dnsbl",
"bitmask": 64,
"active_flags": ["IP_ABUSE_NO_SMTP"],
"zones": ["dnsbl.tornevall.org", "opm.tornevall.org"]
}
],
"delete_candidate_count": 1
},
"token": {
"auth_mode": "dnsbl_token",
"has_token": true,
"can_add": true,
"can_delete": true,
"can_update": true,
"scope_label": "add_delete",
"token_name": "My Token",
"token_status": "active"
}
}
Operational note: POST /api/dnsbl/check-ip and the current DNSBL write endpoints now always emit explicit backend logs and also forward DNSBL API activity to the configured audit/notification out-channels when those channels and matching rules are enabled.
POST /api/dnsbl/records/add|delete|update|bulk now accepts optional dry_run.
dry_run=true validates payload, token scope, zone permissions, and publication expansion.dry_run: true and dry_run_accepted: true when the request is accepted.Example response shape:
{
"ok": true,
"message": "Dry run accepted. No DNS updates applied.",
"dry_run": true,
"dry_run_accepted": true,
"operation_count": 2
}
DNSBL delete operations can now be constrained per token owner through admin-managed guardrails in /admin/dnsbl/tokens.
Current guardrail fields:
delete_min_cidr_prefix - delegated IPv4 CIDR delete floor for non-admin token owners (/24 broadest, /32 single-IP only, null = CIDR delete not delegated)delete_limit_per_day - max delete units per day for the userdelete_cidr_limit - max expanded IP/delete targets accepted in one requestdelete_throttle_limitdelete_throttle_window_secondsGuardrails apply to POST /api/dnsbl/records/delete and bulk delete items in POST /api/dnsbl/records/bulk.
When blocked, the API returns explicit reasons:
delete_cidr_not_allowed (422)delete_cidr_prefix_too_broad (422)delete_daily_limit_exceeded (429)delete_throttle_exceeded (429)delete_cidr_limit_exceeded (422)Additive delete_guardrails metadata is now included in DNSBL token-info and auth-summary responses so clients can show effective delete limits before sending delist requests. Token/auth metadata can now also include can_cidr_delete so helper clients can hide CIDR delete UI until delegated CIDR access is actually enabled.
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.
Large DNSBL bulk writes can keep one HTTP request busy for a while because each submitted IP may still fan out into multiple DNS update operations server-side.
The current implementation now extends the runtime budget for those DNSBL bulk requests and also retries retryable interrupted UDP socket reads (for example socket_recvfrom(): Interrupted system call) before the write is finally treated as failed.
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 bitmaskPOST /api/dnsbl/check-ip before the delete button is unlockedsource_type, source_name, source_site_url, source_site_host) so DNSBL delist audits can show which WordPress site submitted the request even during server-to-server calls/25../32) through delete_guardrails.delete_min_cidr_prefix; when that value is absent the public plugin keeps CIDR delete disabled and falls back to single-IP delist onlytoken.can_delete access before WordPress accepts that page as the plugin-managed primary removal pagetemplates/removal-page.php when the selected delisting page does not already contain one of the supported removal shortcodes[dnsbl_removal_form] / [tornevall_dnsbl_removal_form], while hiding operations that the current token is not allowed to performGET /api/dnsbl/token/info permission data that the admin Check token permissions button already reads.The 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-04-24