From e1977bb57d3a125597bf4ac1a25d25d592fdd57a Mon Sep 17 00:00:00 2001 From: Juan Ku Quintana Date: Tue, 17 Feb 2026 11:41:21 -0600 Subject: [PATCH 1/5] Add support for domain research endpoint --- README.md | 20 +++++++++++ dnsimple/service/domains.py | 5 +-- dnsimple/service/domains_research.py | 35 +++++++++++++++++++ dnsimple/struct/__init__.py | 1 + dnsimple/struct/domain_research_status.py | 18 ++++++++++ .../v2/api/domainResearchStatus/success.http | 16 +++++++++ tests/service/domains_research_test.py | 26 ++++++++++++++ 7 files changed, 119 insertions(+), 2 deletions(-) create mode 100644 dnsimple/service/domains_research.py create mode 100644 dnsimple/struct/domain_research_status.py create mode 100644 tests/fixtures/v2/api/domainResearchStatus/success.http create mode 100644 tests/service/domains_research_test.py diff --git a/README.md b/README.md index ec3832b8..dc333407 100644 --- a/README.md +++ b/README.md @@ -92,6 +92,26 @@ domain_id = client.domains.list_domains(account_id).data[0].id domain = client.domains.get_domain(account_id, domain_id).data # The domain you are looking for ``` +### Research a domain + +> **Note:** This endpoint is part of a Private Beta. During the beta period, changes to the endpoint may occur at any time. If interested in using this endpoint, reach out to support@dnsimple.com. + +Research a domain name for availability and registration status information: + +```python +from dnsimple import Client + +client = Client(access_token='a1b2c3') + +account_id = client.identity.whoami().data.account.id +response = client.domains.domain_research_status(account_id, 'example.com') +research = response.data +print(research.domain) # "example.com" +print(research.availability) # "unavailable" +print(research.request_id) # "f453dabc-a27e-4bf1-a93e-f263577ffaae" +print(research.errors) # [] +``` + ## Configuration ### Sandbox Environment diff --git a/dnsimple/service/domains.py b/dnsimple/service/domains.py index 06c9581b..28793da4 100644 --- a/dnsimple/service/domains.py +++ b/dnsimple/service/domains.py @@ -3,9 +3,10 @@ from dnsimple.response import Response from dnsimple.struct import Domain, Dnssec, Collaborator, DelegationSignerRecord, EmailForward, DomainPush +from dnsimple.service.domains_research import DomainsResearch -class Domains(object): +class Domains(DomainsResearch): """ The Domains Service handles the domains endpoint of the DNSimple API. @@ -13,7 +14,7 @@ class Domains(object): """ def __init__(self, client): - self.client = client + super().__init__(client) def list_domains(self, account_id, sort=None, filter=None, page=None, per_page=None): """ diff --git a/dnsimple/service/domains_research.py b/dnsimple/service/domains_research.py new file mode 100644 index 00000000..e372e568 --- /dev/null +++ b/dnsimple/service/domains_research.py @@ -0,0 +1,35 @@ +import json +import warnings + +from dnsimple.response import Response +from dnsimple.struct import DomainResearchStatus + + +class DomainsResearch(object): + """ + The DomainsResearch Service handles the domain research endpoint of the DNSimple API. + """ + + def __init__(self, client): + self.client = client + + def domain_research_status(self, account_id, domain): + """ + Research a domain name for availability and registration status information. + + This endpoint provides information about a domain's availability status, including whether it's available for registration, already registered, or has other restrictions that prevent registration. + + Note: This endpoint is part of a Private Beta. During the beta period, changes to the endpoint may occur at any time. If interested in using this endpoint, reach out to support@dnsimple.com. + + See https://developer.dnsimple.com/v2/domains/research/#getDomainsResearchStatus + + :param account_id: int + The account ID + :param domain: str + The domain name to research + + :return: dnsimple.Response + The domain research result + """ + response = self.client.get(f'/{account_id}/domains/research/status', params={'domain': domain}) + return Response(response, DomainResearchStatus) diff --git a/dnsimple/struct/__init__.py b/dnsimple/struct/__init__.py index 5b422a2c..e136e00e 100644 --- a/dnsimple/struct/__init__.py +++ b/dnsimple/struct/__init__.py @@ -12,6 +12,7 @@ from dnsimple.struct.domain_price import DomainPrice from dnsimple.struct.domain_registration import DomainRegistration, DomainRegistrationRequest from dnsimple.struct.domain_renewal import DomainRenewal, DomainRenewRequest +from dnsimple.struct.domain_research_status import DomainResearchStatus from dnsimple.struct.domain_restore import DomainRestore, DomainRestoreRequest from dnsimple.struct.domain_transfer import DomainTransfer, DomainTransferRequest from dnsimple.struct.domain_transfer_lock import DomainTransferLock diff --git a/dnsimple/struct/domain_research_status.py b/dnsimple/struct/domain_research_status.py new file mode 100644 index 00000000..234d3c13 --- /dev/null +++ b/dnsimple/struct/domain_research_status.py @@ -0,0 +1,18 @@ +from dataclasses import dataclass + +from dnsimple.struct import Struct + + +@dataclass +class DomainResearchStatus(Struct): + request_id = None + """UUID identifier for this research request""" + domain = None + """The domain name that was researched""" + availability = None + """The availability status. See https://developer.dnsimple.com/v2/domains/research/#getDomainsResearchStatus""" + errors = None + """Array of error messages if the domain cannot be registered or researched""" + + def __init__(self, data): + super().__init__(data) diff --git a/tests/fixtures/v2/api/domainResearchStatus/success.http b/tests/fixtures/v2/api/domainResearchStatus/success.http new file mode 100644 index 00000000..33408cad --- /dev/null +++ b/tests/fixtures/v2/api/domainResearchStatus/success.http @@ -0,0 +1,16 @@ +HTTP/1.1 200 OK +server: nginx +date: Fri, 13 Feb 2026 16:04:05 GMT +content-type: application/json; charset=utf-8 +connection: keep-alive +status: 200 OK +x-ratelimit-limit: 4000 +x-ratelimit-remaining: 3999 +x-ratelimit-reset: 1456506245 +etag: W/"f3cf8499e935e48401aae26842f712c4" +cache-control: max-age=0, private, must-revalidate +x-request-id: e3c6fac1-a36d-42c3-8a04-d68f127add18 +x-runtime: 0.605907 +strict-transport-security: max-age=31536000 + +{"data":{"request_id":"f453dabc-a27e-4bf1-a93e-f263577ffaae","domain":"example.com","availability":"unavailable","errors":[]}} diff --git a/tests/service/domains_research_test.py b/tests/service/domains_research_test.py new file mode 100644 index 00000000..f539e54b --- /dev/null +++ b/tests/service/domains_research_test.py @@ -0,0 +1,26 @@ +import unittest + +import responses + +from dnsimple.response import Response +from dnsimple.struct import DomainResearchStatus +from tests.helpers import DNSimpleTest, DNSimpleMockResponse + + +class DomainsResearchTest(DNSimpleTest): + @responses.activate + def test_domain_research_status(self): + responses.add(DNSimpleMockResponse(method=responses.GET, + path='/1010/domains/research/status?domain=example.com', + fixture_name='domainResearchStatus/success')) + research = self.domains.domain_research_status(1010, 'example.com').data + + self.assertIsInstance(research, DomainResearchStatus) + self.assertEqual('f453dabc-a27e-4bf1-a93e-f263577ffaae', research.request_id) + self.assertEqual('example.com', research.domain) + self.assertEqual('unavailable', research.availability) + self.assertEqual([], research.errors) + + +if __name__ == '__main__': + unittest.main() From 701f6dfa252a4aaf626b0647c20c4b6ed26d0487 Mon Sep 17 00:00:00 2001 From: Juan Ku Quintana Date: Tue, 17 Feb 2026 11:52:08 -0600 Subject: [PATCH 2/5] Add support for domain research endpoint --- README.md | 2 +- dnsimple/service/domains.py | 2 +- dnsimple/service/domains_research.py | 3 --- 3 files changed, 2 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index dc333407..fd9685ee 100644 --- a/README.md +++ b/README.md @@ -94,7 +94,7 @@ domain = client.domains.get_domain(account_id, domain_id).data # The domain you ### Research a domain -> **Note:** This endpoint is part of a Private Beta. During the beta period, changes to the endpoint may occur at any time. If interested in using this endpoint, reach out to support@dnsimple.com. +> **Note:** This endpoint is part of a Private Beta. During the beta period, changes to the endpoint may occur at any time. If interested in using this endpoint, reach out to [DNSimple support](support@dnsimple.com). Research a domain name for availability and registration status information: diff --git a/dnsimple/service/domains.py b/dnsimple/service/domains.py index 28793da4..7e1fffc1 100644 --- a/dnsimple/service/domains.py +++ b/dnsimple/service/domains.py @@ -14,7 +14,7 @@ class Domains(DomainsResearch): """ def __init__(self, client): - super().__init__(client) + self.client = client def list_domains(self, account_id, sort=None, filter=None, page=None, per_page=None): """ diff --git a/dnsimple/service/domains_research.py b/dnsimple/service/domains_research.py index e372e568..cd510228 100644 --- a/dnsimple/service/domains_research.py +++ b/dnsimple/service/domains_research.py @@ -10,9 +10,6 @@ class DomainsResearch(object): The DomainsResearch Service handles the domain research endpoint of the DNSimple API. """ - def __init__(self, client): - self.client = client - def domain_research_status(self, account_id, domain): """ Research a domain name for availability and registration status information. From 3dc9df2dcbca56b5609a86ed0ed5080c1a289988 Mon Sep 17 00:00:00 2001 From: Juan Ku Quintana Date: Wed, 18 Feb 2026 12:48:33 -0600 Subject: [PATCH 3/5] Solve conflicts from merge with main --- .../v2/api/domainResearchStatus/success.http | 16 ---------------- tests/service/domains_research_test.py | 10 +++++----- 2 files changed, 5 insertions(+), 21 deletions(-) delete mode 100644 tests/fixtures/v2/api/domainResearchStatus/success.http diff --git a/tests/fixtures/v2/api/domainResearchStatus/success.http b/tests/fixtures/v2/api/domainResearchStatus/success.http deleted file mode 100644 index 33408cad..00000000 --- a/tests/fixtures/v2/api/domainResearchStatus/success.http +++ /dev/null @@ -1,16 +0,0 @@ -HTTP/1.1 200 OK -server: nginx -date: Fri, 13 Feb 2026 16:04:05 GMT -content-type: application/json; charset=utf-8 -connection: keep-alive -status: 200 OK -x-ratelimit-limit: 4000 -x-ratelimit-remaining: 3999 -x-ratelimit-reset: 1456506245 -etag: W/"f3cf8499e935e48401aae26842f712c4" -cache-control: max-age=0, private, must-revalidate -x-request-id: e3c6fac1-a36d-42c3-8a04-d68f127add18 -x-runtime: 0.605907 -strict-transport-security: max-age=31536000 - -{"data":{"request_id":"f453dabc-a27e-4bf1-a93e-f263577ffaae","domain":"example.com","availability":"unavailable","errors":[]}} diff --git a/tests/service/domains_research_test.py b/tests/service/domains_research_test.py index f539e54b..1809c223 100644 --- a/tests/service/domains_research_test.py +++ b/tests/service/domains_research_test.py @@ -11,13 +11,13 @@ class DomainsResearchTest(DNSimpleTest): @responses.activate def test_domain_research_status(self): responses.add(DNSimpleMockResponse(method=responses.GET, - path='/1010/domains/research/status?domain=example.com', - fixture_name='domainResearchStatus/success')) - research = self.domains.domain_research_status(1010, 'example.com').data + path='/1010/domains/research/status?domain=taken.com', + fixture_name='getDomainsResearchStatus/success-unavailable.http')) + research = self.domains.domain_research_status(1010, 'taken.com').data self.assertIsInstance(research, DomainResearchStatus) - self.assertEqual('f453dabc-a27e-4bf1-a93e-f263577ffaae', research.request_id) - self.assertEqual('example.com', research.domain) + self.assertEqual('25dd77cb-2f71-48b9-b6be-1dacd2881418', research.request_id) + self.assertEqual('taken.com', research.domain) self.assertEqual('unavailable', research.availability) self.assertEqual([], research.errors) From 13ea31c4ec637fb5c56f2c1367e75fa4dfe30b2e Mon Sep 17 00:00:00 2001 From: Juan Ku Quintana Date: Thu, 19 Feb 2026 05:14:38 -0600 Subject: [PATCH 4/5] Add support for domain research endpoint --- tests/service/domains_research_test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/service/domains_research_test.py b/tests/service/domains_research_test.py index 1809c223..34ce9bb5 100644 --- a/tests/service/domains_research_test.py +++ b/tests/service/domains_research_test.py @@ -12,7 +12,7 @@ class DomainsResearchTest(DNSimpleTest): def test_domain_research_status(self): responses.add(DNSimpleMockResponse(method=responses.GET, path='/1010/domains/research/status?domain=taken.com', - fixture_name='getDomainsResearchStatus/success-unavailable.http')) + fixture_name='getDomainsResearchStatus/success-unavailable')) research = self.domains.domain_research_status(1010, 'taken.com').data self.assertIsInstance(research, DomainResearchStatus) From c8daa485fadbae9b738f1fae1dd7bad450093762 Mon Sep 17 00:00:00 2001 From: Juan Ku Quintana Date: Thu, 26 Feb 2026 10:13:54 -0600 Subject: [PATCH 5/5] Rename domain_research_status to get_domain_research_status --- README.md | 2 +- dnsimple/service/domains_research.py | 2 +- tests/service/domains_research_test.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index fd9685ee..0de55aab 100644 --- a/README.md +++ b/README.md @@ -104,7 +104,7 @@ from dnsimple import Client client = Client(access_token='a1b2c3') account_id = client.identity.whoami().data.account.id -response = client.domains.domain_research_status(account_id, 'example.com') +response = client.domains.get_domain_research_status(account_id, 'example.com') research = response.data print(research.domain) # "example.com" print(research.availability) # "unavailable" diff --git a/dnsimple/service/domains_research.py b/dnsimple/service/domains_research.py index cd510228..0e3311b5 100644 --- a/dnsimple/service/domains_research.py +++ b/dnsimple/service/domains_research.py @@ -10,7 +10,7 @@ class DomainsResearch(object): The DomainsResearch Service handles the domain research endpoint of the DNSimple API. """ - def domain_research_status(self, account_id, domain): + def get_domain_research_status(self, account_id, domain): """ Research a domain name for availability and registration status information. diff --git a/tests/service/domains_research_test.py b/tests/service/domains_research_test.py index 34ce9bb5..19dee744 100644 --- a/tests/service/domains_research_test.py +++ b/tests/service/domains_research_test.py @@ -13,7 +13,7 @@ def test_domain_research_status(self): responses.add(DNSimpleMockResponse(method=responses.GET, path='/1010/domains/research/status?domain=taken.com', fixture_name='getDomainsResearchStatus/success-unavailable')) - research = self.domains.domain_research_status(1010, 'taken.com').data + research = self.domains.get_domain_research_status(1010, 'taken.com').data self.assertIsInstance(research, DomainResearchStatus) self.assertEqual('25dd77cb-2f71-48b9-b6be-1dacd2881418', research.request_id)