GoDaddy provider
The GoDaddy provider implements Protocol53 Get, Append, Set, and Delete Records with GoDaddy Domains API v1. It deliberately omits Zone listing; callers must supply the Zone they intend to manage.
Installation
Until the first release, use the provider’s Git coordinate:
{:deps {com.outskirtslabs/protocol53-godaddy
{:git/url "https://github.com/outskirtslabs/protocol53.git"
:git/sha "d155950489196ab7b569230cf06124c0b5f1a83b"
:deps/root "providers/godaddy" }}}
The provider module also brings in the shared Protocol53 API.
Authentication
Create a production API key and secret through GoDaddy’s developer portal.
Supply them separately; the provider constructs the sso-key authorization
header internally.
(require ' [ol.protocol53.godaddy :as godaddy])
(def dns
(godaddy/provider {:api-key "key"
:api-secret "secret" }))
A reseller managing a Zone outside the reseller account’s normal scope can
also supply :shopper-id. The provider sends it as X-Shopper-Id.
(def dns
(godaddy/provider {:api-key "key"
:api-secret "secret"
:shopper-id "shopper-id" }))
Pass a caller-built java.net.http.HttpClient as :http-client when advanced
HTTP policy requires Java interop.
Record behavior
The provider accepts Zone Names with or without a trailing dot. It returns
lowercase Zone-relative Record Names and uses @ for the Zone Apex. Record
types are uppercase.
GoDaddy Domains API v1 exposes A, AAAA, CAA, CNAME, MX, NS, SOA, SRV, and TXT.
It does not expose HTTPS or SVCB. The provider translates CNAME and NS targets
to portable absolute names. It combines GoDaddy’s separate CAA flags, tag,
and data fields and its separate MX and SRV fields into Protocol53 RDATA
strings, reversing those conversions on writes. GoDaddy’s live v1 CAA fields
are required even though the supplied v1 schema omits them.
Get requests the complete Zone in pages of at most 500 Records and advances each offset by the number of Records received. Every page shares the caller’s operation deadline.
GoDaddy enforces a 600-second minimum TTL. The provider raises lower Record TTLs—and explicit lower Delete selector TTLs—to 600. Append and Set reread GoDaddy state and return the effective Stored Records.
Append uses the v1 preserving batch operation and leaves existing Records intact. Set replaces each addressed complete RRset. Delete resolves portable selectors against a Zone snapshot, rewrites a partially selected replacement scope with every survivor, and deletes the scope only when no members survive. Several portable SRV RRsets can share one v1 type-and-base-name replacement scope; Set and Delete preserve unaddressed service/protocol siblings. GoDaddy’s filtered SRV GET expects the full portable owner instead of that mutation base name, so Set reads the full Zone and filters SRV preservation and recovery state locally.
Concurrency and failure recovery
GoDaddy v1 provides no conditional Record writes. Coordinate concurrent Mutations of the same RRset across Provider instances and processes. A per-instance Provider lock cannot protect those other writers.
Protocol53 reports planning failures before dispatch with an unchanged Zone. After a write may have reached GoDaddy, it reports the Zone state as unknown and stops the remaining plan. The provider neither retries ambiguous writes nor attempts rollback. Read the affected Records and reconcile them before retrying an unknown Mutation.
Read-only live validation
Before authorizing live Mutations, validate the dedicated Zone with a safe full-Zone read. This call follows GoDaddy’s v1 pagination route and changes no Records:
(require ' [ol.protocol53 :as protocol53])
(import ' [java.time Duration])
(protocol53/get-records!
dns
"disposable.example."
{:timeout (Duration/ofSeconds 30 )})
A failed read blocks the destructive lifecycle run. The provider never lists account domains to discover a test Zone.
Integration tests
|
Run the lifecycle suite only against a dedicated disposable Zone. It creates,
replaces, and deletes DNS Records whose effective owner starts with
|
Set these variables in the process environment or the repository .env file.
Process values take precedence over .env values. The test wrapper never
prints their values.
| Variable | Required | Description |
|---|---|---|
|
yes |
Production API key with access to the dedicated test Zone. |
|
yes |
Secret paired with the API key. |
|
yes |
Dedicated disposable Zone, with or without a trailing dot. |
|
no |
Reseller shopper ID for the dedicated Zone. |
Run only the GoDaddy lifecycle suite from the repository root:
bb test:integration --provider godaddy
The suite remains pending when the key, secret, or Zone is absent. It uses the
shared Protocol53 lifecycle while omitting HTTPS, SVCB, and NS. The Provider’s
lack of ZoneLister automatically omits only the Zone-listing phase. Shared
comparisons ignore TTL because GoDaddy raises 300-second fixtures to 600;
provider-specific tests still assert the exact 600-second policy.
The integration suite stays outside ordinary test, QA, and CI runs. Never run two lifecycle suites concurrently against the same Zone.