This report tracks endpoint coverage across all DNSimple API clients.
Date: 2026-04-09
Reference spec: content/v2/openapi.yml
Tracking ticket: dnsimple/dnsimple-engineering#174
The openapi.yml defines 111 client-facing operations.
| Client | Missing | Delta vs. prior report |
|---|---|---|
| Node | 4 | -5 (was 9) |
| Ruby | 8 | +1 (was 7) |
| Go | 8 | +1 (was 7) |
| Python | 8 | +1 (was 7) |
| PHP | 12 | +2 (was 10) |
| Java | 12 | +2 (was 10) |
| Elixir | 12 | +2 (was 10) |
| C# | 12 | +2 (was 10) |
| Rust | 13 | +2 (was 11) |
The deltas account for a newly-surfaced gap: no client implements updateZoneNsRecords except Node. That endpoint was not tracked in the previous INCONSISTENCIES report.
Legend: ✅ = implemented, ❌ = missing.
| operationId | C# | Elixir | Go | Java | Node | PHP | Python | Ruby | Rust |
|---|---|---|---|---|---|---|---|---|---|
| listAccounts | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| whoami | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| oauthToken | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| listCharges | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ |
| listDomains | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| createDomain | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| getDomain | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| deleteDomain | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| getDomainsResearchStatus | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| getDomainDnssec | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| enableDomainDnssec | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| disableDomainDnssec | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| listDomainDelegationSignerRecords | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| createDomainDelegationSignerRecord | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| getDomainDelegationSignerRecord | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| deleteDomainDelegationSignerRecord | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| listEmailForwards | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| createEmailForward | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| getEmailForward | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| deleteEmailForward | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| initiateDomainPush | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| listPushes | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| acceptPush | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| rejectPush | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| listCertificates | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| getCertificate | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| downloadCertificate | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| getCertificatePrivateKey | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| purchaseLetsencryptCertificate | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| issueLetsencryptCertificate | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| purchaseRenewalLetsencryptCertificate | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| issueRenewalLetsencryptCertificate | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| listTlds | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| getTld | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| getTldExtendedAttributes | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| checkDomain | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| getDomainPrices | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| registerDomain | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| getDomainRegistration | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| transferDomain | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| getDomainTransfer | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| cancelDomainTransfer | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| domainRenew | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| getDomainRenewal | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| domainRestore | ❌ | ❌ | ✅ | ❌ | ❌ | ❌ | ✅ | ✅ | ❌ |
| getDomainRestore | ❌ | ❌ | ✅ | ❌ | ❌ | ❌ | ✅ | ✅ | ❌ |
| authorizeDomainTransferOut | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| getDomainDelegation | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| changeDomainDelegation | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| changeDomainDelegationToVanity | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| changeDomainDelegationFromVanity | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| getDomainTransferLock | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| enableDomainTransferLock | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| disableDomainTransferLock | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| enableDomainAutoRenewal | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| disableDomainAutoRenewal | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| enableWhoisPrivacy | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| disableWhoisPrivacy | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| listPrimaryServers | ❌ | ❌ | ❌ | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ |
| createPrimaryServer | ❌ | ❌ | ❌ | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ |
| getPrimaryServer | ❌ | ❌ | ❌ | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ |
| removePrimaryServer | ❌ | ❌ | ❌ | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ |
| linkPrimaryServer | ❌ | ❌ | ❌ | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ |
| unlinkPrimaryServer | ❌ | ❌ | ❌ | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ |
| createSecondaryZone | ❌ | ❌ | ❌ | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ |
| listZones | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| getZone | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| getZoneFile | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| checkZoneDistribution | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| updateZoneNsRecords | ❌ | ❌ | ❌ | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ |
| listZoneRecords | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| createZoneRecord | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| getZoneRecord | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| updateZoneRecord | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| deleteZoneRecord | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| batchChangeZoneRecords | ❌ | ❌ | ✅ | ❌ | ❌ | ❌ | ✅ | ✅ | ❌ |
| checkZoneRecordDistribution | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| activateZoneService | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| deactivateZoneService | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| listContacts | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| createContact | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| getContact | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| updateContact | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| deleteContact | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| listRegistrantChanges | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| createRegistrantChange | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| checkRegistrantChange | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| getRegistrantChange | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| deleteRegistrantChange | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| listServices | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| getService | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| listDomainAppliedServices | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| applyServiceToDomain | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| unapplyServiceFromDomain | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| listTemplates | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| createTemplate | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| getTemplate | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| updateTemplate | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| deleteTemplate | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| listTemplateRecords | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| createTemplateRecord | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| getTemplateRecord | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| deleteTemplateRecord | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| applyTemplateToDomain | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| enableVanityNameServers | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| disableVanityNameServers | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| listWebhooks | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| createWebhook | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| getWebhook | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| deleteWebhook | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| queryDnsAnalytics | ❌ | ❌ | ✅ | ❌ | ❌ | ❌ | ✅ | ✅ | ❌ |
Six distinct gaps account for the entire coverage delta. The updateZoneNsRecords gap is new in this report; every other gap was already tracked in issue #174.
POST /{account}/registrar/domains/{domain}/restores(domainRestore)GET /{account}/registrar/domains/{domain}/restores/{domainrestore}(getDomainRestore)
Implemented by:
- Go, Python, Ruby
Missing in:
- C#, Elixir, Java, Node, PHP, Rust
POST /{account}/zones/{zone}/batch (batchChangeZoneRecords)
Implemented by:
- Go, Python, Ruby
Missing in:
- C#, Elixir, Java, Node, PHP, Rust
GET /{account}/dns_analytics (queryDnsAnalytics)
Implemented by:
- Go, Python, Ruby
Missing in:
- C#, Elixir, Java, Node, PHP, Rust
PUT /{account}/zones/{zone}/ns_records (updateZoneNsRecords)
Implemented by:
- Node
Missing in:
- C#, Elixir, Go, Java, PHP, Python, Ruby, Rust
GET /{account}/secondary_dns/primaries(listPrimaryServers)POST /{account}/secondary_dns/primaries(createPrimaryServer)GET /{account}/secondary_dns/primaries/{primaryserver}(getPrimaryServer)DELETE /{account}/secondary_dns/primaries/{primaryserver}(removePrimaryServer)PUT /{account}/secondary_dns/primaries/{primaryserver}/link(linkPrimaryServer)PUT /{account}/secondary_dns/primaries/{primaryserver}/unlink(unlinkPrimaryServer)POST /{account}/secondary_dns/zones(createSecondaryZone)
Implemented by:
- Node
Missing in:
- C#, Elixir, Go, Java, PHP, Python, Ruby, Rust
GET /{account}/billing/charges (listCharges)
Implemented by:
- C#, Elixir, Go, Java, Node, PHP, Python, Ruby
Missing in:
- Rust
domainRestoregetDomainRestorebatchChangeZoneRecordsqueryDnsAnalytics
listPrimaryServerscreatePrimaryServergetPrimaryServerremovePrimaryServerlinkPrimaryServerunlinkPrimaryServercreateSecondaryZoneupdateZoneNsRecords
listPrimaryServerscreatePrimaryServergetPrimaryServerremovePrimaryServerlinkPrimaryServerunlinkPrimaryServercreateSecondaryZoneupdateZoneNsRecords
listPrimaryServerscreatePrimaryServergetPrimaryServerremovePrimaryServerlinkPrimaryServerunlinkPrimaryServercreateSecondaryZoneupdateZoneNsRecords
domainRestoregetDomainRestorebatchChangeZoneRecordsqueryDnsAnalyticsupdateZoneNsRecordslistPrimaryServerscreatePrimaryServergetPrimaryServerremovePrimaryServerlinkPrimaryServerunlinkPrimaryServercreateSecondaryZone
domainRestoregetDomainRestorebatchChangeZoneRecordsqueryDnsAnalyticsupdateZoneNsRecordslistPrimaryServerscreatePrimaryServergetPrimaryServerremovePrimaryServerlinkPrimaryServerunlinkPrimaryServercreateSecondaryZone
domainRestoregetDomainRestorebatchChangeZoneRecordsqueryDnsAnalyticsupdateZoneNsRecordslistPrimaryServerscreatePrimaryServergetPrimaryServerremovePrimaryServerlinkPrimaryServerunlinkPrimaryServercreateSecondaryZone
domainRestoregetDomainRestorebatchChangeZoneRecordsqueryDnsAnalyticsupdateZoneNsRecordslistPrimaryServerscreatePrimaryServergetPrimaryServerremovePrimaryServerlinkPrimaryServerunlinkPrimaryServercreateSecondaryZone
listChargesdomainRestoregetDomainRestorebatchChangeZoneRecordsqueryDnsAnalyticsupdateZoneNsRecordslistPrimaryServerscreatePrimaryServergetPrimaryServerremovePrimaryServerlinkPrimaryServerunlinkPrimaryServercreateSecondaryZone
- The
updateZoneNsRecordsendpoint (PUT /{account}/zones/{zone}/ns_records) is present inopenapi.ymland implemented in the Node client, but was not tracked in the previous INCONSISTENCIES report. It is the only new gap surfaced by this audit. - The Node client is now the most complete, having picked up all seven Secondary DNS endpoints and
updateZoneNsRecords. Its remaining gaps aredomainRestore,getDomainRestore,batchChangeZoneRecords, andqueryDnsAnalytics.