Secure client access to allowlisted extended registrar operations, plus bulk domain availability checks.
Important
The DNSSEC/glue integration requires the supported theme and registrar adapters described below. The FOSSBilling 0.8.9 bulk availability API works with any theme and uses each TLD's assigned registrar adapter.
DomainX requires:
- Tide FOSSBilling Theme v1.2.15 or newer
- Namingo FOSSBilling EPP Registrar v1.2.6 or newer
- The Namingo EPP registrar must be configured and assigned to the domain being managed.
- For DNSSEC, the
secDNS-1.1EPP extension must be enabled in the registrar configuration. - For glue hostname management, the registrar must use EPP host objects (hostObj). The generic EPP profile must also include urn:ietf:params:xml:ns:host-1.0 in its login objects.
DomainX exposes each feature only when the assigned registrar adapter supports it for the domain. Glue hostname operations are unavailable for registries using hostAttr.
Install and configure the required EPP registrar and Tide theme first.
git clone https://github.com/getnamingo/fossbilling-domainx
mv fossbilling-domainx/Domainx /var/www/modules/
mv fossbilling-domainx/Domains /var/www/modules/- Go to Extensions > Overview in the admin panel and activate "DomainX" and "Domain Prices".
- Ensure Tide v1.2.15 or newer is the active client theme.
Before upgrading, make a database backup.
To upgrade, replace the existing module files with the latest version and open the FOSSBilling admin panel. The module update routine will ensure that the required database tables exist.
Call the public guest endpoint domainx/check_all with an SLD. Optionally pass tld to preserve the explicitly searched suffix:
FOSSBilling.api.guest.post('domainx/check_all', { sld: 'example', tld: '.com' }, function (data) {
data.results.forEach(function (result) {
// result.available: true = available, false = unavailable, null = check failed.
// Use result.sld and result.tld with the existing pricing/cart form.
console.log(result.domain, result.available, result.error);
});
});The result inside FOSSBilling's normal API response envelope has this shape:
{
"sld": "example",
"results": [
{"sld": "example", "tld": ".com", "domain": "example.com", "available": true, "cached": false, "error": null},
{"sld": "example", "tld": ".net", "domain": "example.net", "available": false, "cached": true, "error": null},
{"sld": "example", "tld": ".org", "domain": "example.org", "available": null, "cached": false, "error": "Domain availability could not be determined."}
]
}- By default, checks every
active = 1 AND allow_register = 1TLD in TLD order. An optionaltldis normalized (including compound and IDN suffixes), selected before checking, and returned first regardless of availability. Unsupported, inactive or non-registerable requested suffixes return an unknown result without a registrar call. With no requested suffix, an empty configuration returnsresults: []. LOOKUP_RESULT_LIMIT = nullnear the top ofDomainx/Service.phpmeans no result limit. Set it to a positive integer, for example10, to cap both returned results and selected TLDs before cache reads or registrar calls. The requested suffix counts toward that cap, including an unsupported-suffix result. Cached results also count; this is separate from the existing live-check rate budgets. There are no admin settings or per-request limit overrides.- Reuses
Servicedomain::isDomainAvailable, including registrar configuration validation and test mode. The DNSSEC/glue adapter llowlist does not apply. - Uses the same
domain_lookup_iplimiter asservicedomain/check, consuming one lookup per batch, including cache hits. - Additional code-owned live-check budgets prevent a batch from multiplying that public allowance: 600 registrar checks per IP per hour and 600 registrar checks site-wide per minute, using FOSSBilling's shared rate-limit cache. Cache hits consume neither budget. When a budget runs out, remaining uncached TLDs return
available: nulland a limit message; cache hits are still returned. A rate-limit storage failure prevents live checks. These controls use the same Symfony limiter mechanism as core FOSSBilling; server timeouts and web-server protections still matter for slow adapters and concurrent traffic. - Continues after individual failures, logging the domain and exception class server-side and returning a generic error. Raw registrar exception messages are not logged by this endpoint. Failed lookups are not cached.
- Uses FOSSBilling's application cache for boolean availability results. In
Domainx/Service.php,LOOKUP_CACHE_ENABLED = trueandLOOKUP_CACHE_TTL = 60enable caching for 60 seconds. Set the former tofalseto disable it; no admin settings or request overrides exist. Cache failures fall back to live checks. - The active TLD list is read each time; reassigning a TLD to a different registrar changes its cache key. Other registrar configuration changes may take up to 60 seconds to appear.
- Checks run sequentially, as with the core API. Large TLD lists may need longer server/registrar timeouts. Availability remains advisory; checkout uses the core live validation.
DomainX adds allowlisted extended registrar operations to active and paid domain services.
DNSSEC DS record management and glue hostname (EPP host object) management are supported through the Namingo EPP registrar. Tide shows each set of controls only when DomainX reports that feature as available for the domain.
Apache License 2.0