Domain RDAP

A template for monitoring domain registration data via the RDAP protocol.

Available solutions

Zabbix version 8.0
Download

Domain RDAP by HTTP

Overview

This template monitors domain registration and related information using RDAP (Registration Data Access Protocol) over HTTP. It retrieves data such as expiration dates, registrar information, status, and more for the specified domains. The template also includes low-level discovery (LLD) rules to automatically discover additional information like notices and entities associated with each domain.

Requirements

Zabbix version: 8.0 and higher.

Tested versions

This template has been tested on:

  • Tested on zabbix.com domain.

Configuration

Zabbix should be configured according to the instructions in the Templates out of the box section.

Setup

Set values for the macros according to your monitoring requirements.

  • {$RDAP.DOMAINS}. Required. Enter one or more domains, separated by commas (e.g., example.com,test.net).
  • {$RDAP.INTERVAL.TLD.CHECK} (Optional) TLD data does not change frequently. The default value of 12h (12 hours) or even 1d (1 day) is optimal to reduce the load on the Zabbix server and external RDAP services.
  • {$RDAP.INTERVAL.DOMAIN.CHECK} (Optional) Use 1h as the standard. Checking too frequently may cause rate-limiting by RDAP services.

Notes

  • Accepts seconds or time unit with suffix (e.g., 30s, 1m, 2h, 1d) and, optionally, one or more custom intervals, all separated by semicolons.

Macros used

Name Description Default
{$HTTP.TLS.VERIFY}

TLS certificate verification for script items: "none" - disabled, "peer" - verify the certificate chain and expiration, "full" - full verification. Any other value enables full verification. To override the setting for this template only, define the macro with the context "Domain RDAP", e.g. {$HTTP.TLS.VERIFY:"Domain RDAP"}.

full
{$RDAP.DOMAINS}

List of domains separated by commas.

{$RDAP.LLD.ADDITIONAL.INFO.ENABLED}

Enable discovery additional information in LLD (1 - enabled, 0 - disabled).

1
{$RDAP.EXPIRATION.WARNING.DAYS}

Number of days before expiration to trigger a warning.

7
{$RDAP.NOT.UPDATED.WARNING.DAYS}

Number of days after last update to trigger a warning.

7
{$RDAP.INTERVAL.TLD.CHECK}

Interval for checking TLD registration data.

12h
{$RDAP.INTERVAL.DOMAIN.CHECK}

Interval for checking domain registration data.

1h

Items

Name Description Type Key and additional info
Get registration data for domains

Get registration data for domains using RDAP protocol over HTTP.

Script rdap.domain.info
Error retrieving registration data for domains

Error message when retrieving registration data for domains.

Dependent item rdap.domain.info.error

Preprocessing

  • Discard unchanged with heartbeat: 1d

  • JSON Path: $.error

    ⛔️Custom on fail: Set value to: Error retrieving registration data.

Triggers

Name Description Expression Severity Dependencies and additional info
RDAP: Error retrieving registration data for domains last(/Domain RDAP by HTTP/rdap.domain.info.error)<>"" High

LLD rule Discovery domains with RDAP server

Name Description Type Key and additional info
Discovery domains with RDAP server

Discover domains using RDAP protocol over HTTP.

Dependent item rdap.domain.with.rdap.discovery

Preprocessing

  • JSON Path: $.data

Item prototypes for Discovery domains with RDAP server

Name Description Type Key and additional info
[{#DOMAIN}]: Get data

Get registration data for domain {#DOMAIN} using RDAP protocol over HTTP.

HTTP agent rdap.domain.data[{#DOMAIN}]

Preprocessing

  • Check for error in JSON: $.errorCode

    ⛔️Custom on fail: Set value to: {"status": ["Error get data"], "lld_notices": [], "lld_entities": []}

  • JavaScript: The text is too long. Please see the template.

  • Check for not supported value: any error

    ⛔️Custom on fail: Set value to: {"status": ["Error get data"], "lld_notices": [], "lld_entities": []}

[{#DOMAIN}]: Expiration date

Expiration date for domain {#DOMAIN}.

Dependent item rdap.domain.expiration[{#DOMAIN}]

Preprocessing

  • Discard unchanged with heartbeat: 1d

  • JSON Path: $.events[?(@.eventAction=="expiration")].eventDate.first()

    ⛔️Custom on fail: Set value to: 1970-01-01T00:00:00Z

  • JavaScript: return Math.floor(Date.parse(value) / 1000);<br>

[{#DOMAIN}]: Days until expiration

Days until expiration for domain {#DOMAIN}.

Dependent item rdap.domain.registrar.until[{#DOMAIN}]

Preprocessing

  • Discard unchanged with heartbeat: 1d

  • JavaScript: The text is too long. Please see the template.

[{#DOMAIN}]: Registrar

Registrar for domain {#DOMAIN}.

Dependent item rdap.domain.registrar[{#DOMAIN}]

Preprocessing

  • Discard unchanged with heartbeat: 1d

  • JSON Path: $.events[?(@.eventAction=="registration")].eventDate.first()

    ⛔️Custom on fail: Discard value

  • JavaScript: return Math.floor(Date.parse(value) / 1000);<br>

[{#DOMAIN}]: Last changed

Last changed date for domain {#DOMAIN}.

Dependent item rdap.domain.changed[{#DOMAIN}]

Preprocessing

  • Discard unchanged with heartbeat: 1d

  • JSON Path: $.events[?(@.eventAction=="last changed")].eventDate.first()

    ⛔️Custom on fail: Discard value

  • JavaScript: return Math.floor(Date.parse(value) / 1000);<br>

[{#DOMAIN}]: Last update of RDAP data

Last update date of RDAP data for domain {#DOMAIN}.

Dependent item rdap.domain.updated[{#DOMAIN}]

Preprocessing

  • Discard unchanged with heartbeat: 1d

  • JSON Path: The text is too long. Please see the template.

    ⛔️Custom on fail: Discard value

  • JavaScript: return Math.floor(Date.parse(value) / 1000);<br>

[{#DOMAIN}]: Status

Status of domain {#DOMAIN}.

Dependent item rdap.domain.status[{#DOMAIN}]

Preprocessing

  • Discard unchanged with heartbeat: 1d

  • JSON Path: $.status

    ⛔️Custom on fail: Discard value

  • JavaScript: return JSON.parse(value).join(', ');

[{#DOMAIN}]: Authority RDAP server

Authority RDAP server for {#TLD} domain.

Dependent item rdap.domain.authority[{#DOMAIN}]

Preprocessing

  • Discard unchanged with heartbeat: 1d

  • JSON Path: $.data[?(@.domain=="{#DOMAIN}")].rdap_server.first()

    ⛔️Custom on fail: Set value to: ``

Trigger prototypes for Discovery domains with RDAP server

Name Description Expression Severity Dependencies and additional info
RDAP: [{#DOMAIN}] will expire soon

Until domain {#DOMAIN} expiration left is less than {$RDAP.EXPIRATION.WARNING.DAYS:"{#DOMAIN}"} days.

last(/Domain RDAP by HTTP/rdap.domain.registrar.until[{#DOMAIN}]) < {$RDAP.EXPIRATION.WARNING.DAYS:"{#DOMAIN}"} High Depends on:
  • RDAP: [{#DOMAIN}] is expired
  • RDAP: [{#DOMAIN}] expiration date is unknown
RDAP: [{#DOMAIN}] is expired

Domain {#DOMAIN} expiration date is in the past.

last(/Domain RDAP by HTTP/rdap.domain.registrar.until[{#DOMAIN}]) = -1 High Depends on:
  • RDAP: [{#DOMAIN}] expiration date is unknown
RDAP: [{#DOMAIN}] expiration date is unknown

Expiration date not found for domain {#DOMAIN}.

last(/Domain RDAP by HTTP/rdap.domain.registrar.until[{#DOMAIN}]) = -2 Average Depends on:
  • RDAP: [{#DOMAIN}] not exist
RDAP: [{#DOMAIN}] was changed recently

Domain {#DOMAIN} was changed in the last 7 days. Acknowledge to close the problem manually.

(now() - last(/Domain RDAP by HTTP/rdap.domain.changed[{#DOMAIN}])) < 604800 Info Manual close: Yes
RDAP: [{#DOMAIN}] not updated data for {$RDAP.NOT.UPDATED.WARNING.DAYS:"{#DOMAIN}"} days

RDAP data for domain {#DOMAIN} not updated for {$RDAP.NOT.UPDATED.WARNING.DAYS:"{#DOMAIN}"} days. Acknowledge to close the problem manually.

(now() - last(/Domain RDAP by HTTP/rdap.domain.updated[{#DOMAIN}])) / 86400 > {$RDAP.NOT.UPDATED.WARNING.DAYS:"{#DOMAIN}"} Info Manual close: Yes
RDAP: [{#DOMAIN}] status was changed recently

Domain {#DOMAIN} was changed recently. Acknowledge to close the problem manually.

length(last(/Domain RDAP by HTTP/rdap.domain.status[{#DOMAIN}]))>0 and change(/Domain RDAP by HTTP/rdap.domain.status[{#DOMAIN}])=1 Warning Manual close: Yes
Depends on:
  • RDAP: [{#DOMAIN}] not exist
RDAP: [{#DOMAIN}] not exist

Status information not found for domain {#DOMAIN}. The domain may not be registered or there was an error retrieving the data.

last(/Domain RDAP by HTTP/rdap.domain.status[{#DOMAIN}])="Error get data" Average
RDAP: [{#DOMAIN}] authority RDAP server not found

The domain is not registered, there's a typo in your query,
or the initial bootstrap service is unable to locate
the correct server to direct the request to.

last(/Domain RDAP by HTTP/rdap.domain.authority[{#DOMAIN}])="" Warning

LLD rule Discovery notices for domain [{#DOMAIN}]

Name Description Type Key and additional info
Discovery notices for domain [{#DOMAIN}]

Discover notices for domain {#DOMAIN}.

Dependent item rdap.domain.notices.discovery[{#DOMAIN}]

Preprocessing

  • JSON Path: $.lld_notices

    ⛔️Custom on fail: Set value to: []

Item prototypes for Discovery notices for domain [{#DOMAIN}]

Name Description Type Key and additional info
[{#DOMAIN}]: Notice [{#NOTICE_TITLE}]

{#NOTICE_DESCRIPTION}

Script rdap.domain.notice.title[{#DOMAIN},{#NOTICE_TITLE}]

Preprocessing

  • Discard unchanged with heartbeat: 1d

LLD rule Discovery entities for domain [{#DOMAIN}]

Name Description Type Key and additional info
Discovery entities for domain [{#DOMAIN}]

Discover entities for domain {#DOMAIN}.

Dependent item rdap.domain.entities.discovery[{#DOMAIN}]

Preprocessing

  • JSON Path: $.lld_entities

    ⛔️Custom on fail: Set value to: []

Item prototypes for Discovery entities for domain [{#DOMAIN}]

Name Description Type Key and additional info
[{#DOMAIN}]: {#ENTITY_VCARD_NAME}

Information about entity {#ENTITY_ROLE} {#ENTITY_SUB_ROLE}.

Script rdap.domain.entity.vcard.entry[{#DOMAIN},{#ENTITY_VCARD_KEY}]

Preprocessing

  • Discard unchanged with heartbeat: 1d

Feedback

Please report any issues with the template at https://support.zabbix.com

You can also provide feedback, discuss the template, or ask for help at ZABBIX forums

Articles and documentation

+ Propose new article

Didn't find integration you need?