{"openapi":"3.1.0","info":{"title":"Ingram Domains API","version":"1.3.0","description":"REST API for the Ingram Domains registrar. Built agent-first: every operation is also exposed as an MCP tool.\n\nAll POST/DELETE/PATCH endpoints accept an optional `Idempotency-Key` header. Replays with the same key + body return the cached response (with `Idempotent-Replay: true`). Same key + different body returns `409 idempotency_key_reused`. Cached entries are kept for ~24 hours.","contact":{"name":"Ingram Domains","url":"https://domains.ingram.tech"}},"servers":[{"url":"https://domains.ingram.tech"}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"ingram_live_<32 base64url chars>","description":"Mint at https://domains.ingram.tech/settings/tokens."}},"schemas":{"Error":{"type":"object","required":["error","message"],"properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{}}},"CheckResult":{"type":"object","properties":{"domain":{"type":"string"},"tld":{"type":"string"},"result":{"type":"string","enum":["AVAILABLE","NOT AVAILABLE","ERROR","PENDING APPLICATION"]},"reason":{"type":"string"},"price":{"type":"number","description":"EUR per year"},"currency":{"type":"string","enum":["EUR"]},"source":{"type":"string","enum":["fastly","registry"]}}},"DomainListItem":{"type":"object","properties":{"domain":{"type":"string"},"addedVia":{"type":"string"},"createdAt":{"type":"string","format":"date-time"}}},"DomainInfo":{"type":"object","description":"Registry-side detail. Field casing mirrors Netim's REST v1.0 — most fields are camelCase but DNSSEC-related flags use PascalCase (IsSigned, HasDNS4Service, DNSSEC). additionalProperties is true because ccTLDs add their own fields.","properties":{"domain":{"type":"string"},"status":{"type":"string"},"dateCreate":{"type":"string","format":"date"},"dateExpiration":{"type":"string","format":"date"},"dateMinRenew":{"type":"string","format":"date"},"dateMaxRenew":{"type":"string","format":"date"},"dateMaxRestore":{"type":"string","format":"date"},"idOwner":{"type":"string"},"idAdmin":{"type":"string"},"idTech":{"type":"string"},"idBilling":{"type":"string"},"domainIsLock":{"type":"integer","enum":[0,1],"description":"Registrar lock (1 = locked)."},"whoisPrivacy":{"type":"integer","enum":[0,1]},"autoRenew":{"type":"integer","enum":[0,1]},"ns":{"type":"array","items":{"type":"string"},"description":"Active nameserver hostnames."},"authID":{"type":"string","description":"EPP auth code (when readable; many TLDs hide this)."},"IsSigned":{"type":"integer","enum":[0,1],"description":"DNSSEC enabled."},"HasDNS4Service":{"type":"integer","enum":[0,1]},"DNSSEC":{"type":"array","items":{}}},"additionalProperties":true},"DomainDetail":{"type":"object","properties":{"domain":{"type":"string"},"addedVia":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"info":{"$ref":"#/components/schemas/DomainInfo"}}},"TldPricing":{"type":"object","properties":{"tld":{"type":"string","example":".com"},"currency":{"type":"string","enum":["EUR"]},"register":{"type":"number"},"renew":{"type":"number"},"transfer":{"type":"number"}}},"RegisterRequest":{"type":"object","required":["domain","confirm_price"],"properties":{"domain":{"type":"string","example":"example.com"},"duration":{"type":"integer","minimum":1,"maximum":10,"default":1},"confirm_price":{"type":"number","description":"Total expected price in EUR (registerEur × duration). Reject if it differs by more than €0.01 from the live price."}}},"RegisterResponse":{"type":"object","properties":{"domain":{"type":"string"},"duration":{"type":"integer"},"pricePaid":{"type":"number"},"currency":{"type":"string","enum":["EUR"]},"dryRun":{"type":"boolean"}}},"TransferRequest":{"type":"object","required":["auth_code"],"properties":{"auth_code":{"type":"string","description":"EPP code from the losing registrar."}}},"RenewRequest":{"type":"object","required":["confirm_price"],"properties":{"duration":{"type":"integer","minimum":1,"maximum":10,"default":1},"confirm_price":{"type":"number"}}},"ZoneRecord":{"type":"object","required":["type","value"],"properties":{"subdomain":{"type":"string","default":""},"type":{"type":"string","enum":["A","AAAA","CNAME","MX","TXT","NS","CAA","SRV"]},"value":{"type":"string"},"ttl":{"type":"integer","minimum":60,"maximum":86400},"priority":{"type":"integer","minimum":0,"maximum":65535}}},"SettingsRequest":{"type":"object","properties":{"auto_renew":{"type":"boolean"},"registrar_lock":{"type":"boolean"},"whois_privacy":{"type":"boolean"},"dnssec":{"type":"boolean"}},"description":"Provide one or more toggles to update."},"AuthCodeRequest":{"type":"object","properties":{"send_to_registrant":{"type":"boolean","default":true,"description":"True (default) emails the existing code to the registrant. False regenerates the code (rare)."}}}},"parameters":{"IdempotencyKey":{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":255},"description":"Opaque client-generated string. Repeat the same key + body to safely retry; mismatched bodies return 409."}},"responses":{"Unauthorized":{"description":"Missing, malformed, or revoked token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"Forbidden":{"description":"Token is missing the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"NotFound":{"description":"Resource not found or not in your portfolio.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"BadRequest":{"description":"Validation failed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"PriceChanged":{"description":"TLD price has changed since the last check; re-check before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"IdempotencyConflict":{"description":"Idempotency-Key has already been used with a different request body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"paths":{"/api/v1/check":{"get":{"summary":"Check domain availability","description":"Public, no auth. Pass a bare name to fan out across popular TLDs, or a fully-qualified domain to check just that one.","security":[],"parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":2,"maxLength":253}}],"responses":{"200":{"description":"Availability results.","content":{"application/json":{"schema":{"type":"object","properties":{"query":{"type":"string"},"results":{"type":"array","items":{"$ref":"#/components/schemas/CheckResult"}}}}}}},"400":{"$ref":"#/components/responses/BadRequest"}}}},"/api/v1/tlds":{"get":{"summary":"List supported TLDs with pricing","responses":{"200":{"description":"TLD list.","content":{"application/json":{"schema":{"type":"object","properties":{"tlds":{"type":"array","items":{"$ref":"#/components/schemas/TldPricing"}}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"}}}},"/api/v1/domains":{"get":{"summary":"List your domains","responses":{"200":{"description":"Portfolio list.","content":{"application/json":{"schema":{"type":"object","properties":{"domains":{"type":"array","items":{"$ref":"#/components/schemas/DomainListItem"}}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"}}},"post":{"summary":"Register a domain","description":"Agent-safe: requires `confirm_price` matching the live TLD price within €0.01.","parameters":[{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterRequest"}}}},"responses":{"201":{"description":"Registered.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterResponse"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"409":{"$ref":"#/components/responses/PriceChanged"},"422":{"description":"Registry rejected the registration.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/domains/{name}":{"parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string"}}],"get":{"summary":"Get a domain","responses":{"200":{"description":"Domain detail.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DomainDetail"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}}},"delete":{"summary":"Schedule a deletion","description":"Default mode is END_OF_PERIOD (do-not-renew). `?mode=NOW` performs immediate deletion.","parameters":[{"name":"mode","in":"query","required":false,"schema":{"type":"string","enum":["NOW","END_OF_PERIOD"]}},{"$ref":"#/components/parameters/IdempotencyKey"}],"responses":{"200":{"description":"Scheduled.","content":{"application/json":{"schema":{"type":"object","properties":{"domain":{"type":"string"},"dryRun":{"type":"boolean"},"mode":{"type":"string","enum":["NOW","END_OF_PERIOD"]}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"422":{"description":"Registry rejected the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/domains/{name}/transfer":{"post":{"summary":"Initiate inbound transfer","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TransferRequest"}}}},"responses":{"202":{"description":"Transfer initiated.","content":{"application/json":{"schema":{"type":"object","properties":{"domain":{"type":"string"},"dryRun":{"type":"boolean"}}}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"422":{"description":"Registry rejected the transfer.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/domains/{name}/zone":{"parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string"}}],"get":{"summary":"List DNS zone records","responses":{"200":{"description":"Zone records.","content":{"application/json":{"schema":{"type":"object","properties":{"domain":{"type":"string"},"records":{"type":"array","items":{"$ref":"#/components/schemas/ZoneRecord"}}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}}},"post":{"summary":"Add a DNS zone record","parameters":[{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ZoneRecord"}}}},"responses":{"201":{"description":"Record added.","content":{"application/json":{"schema":{"type":"object","properties":{"domain":{"type":"string"},"record":{"$ref":"#/components/schemas/ZoneRecord"}}}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"}}},"delete":{"summary":"Delete a DNS zone record","description":"Identify the record by subdomain + type + value (Netim doesn't expose stable record ids).","parameters":[{"name":"subdomain","in":"query","required":false,"schema":{"type":"string"}},{"name":"type","in":"query","required":true,"schema":{"type":"string"}},{"name":"value","in":"query","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/IdempotencyKey"}],"responses":{"200":{"description":"Record removed.","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"}}}},"/api/v1/domains/{name}/settings":{"patch":{"summary":"Update domain-level toggles","description":"Toggle whois_privacy, registrar_lock, auto_renew, and DNSSEC. Each setting is applied independently; partial successes return per-setting errors alongside applied values.","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SettingsRequest"}}}},"responses":{"200":{"description":"Updated.","content":{"application/json":{"schema":{"type":"object","properties":{"domain":{"type":"string"},"applied":{"type":"object"},"errors":{"type":"object"}}}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"}}}},"/api/v1/domains/{name}/auth-code":{"post":{"summary":"Request the EPP auth code (outbound transfer)","description":"Triggers the registry to send the EPP/auth code to the registrant's email on file. The code is delivered out-of-band — the API does not return plaintext (anti-hijacking pattern).","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthCodeRequest"}}}},"responses":{"202":{"description":"Auth code request accepted by the registry.","content":{"application/json":{"schema":{"type":"object","properties":{"domain":{"type":"string"},"delivery":{"type":"string","enum":["registrant_email","regenerated"]},"message":{"type":"string"}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"}}}},"/api/v1/domains/{name}/renew":{"post":{"summary":"Renew a domain","description":"Same confirm_price guard rail as POST /domains.","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RenewRequest"}}}},"responses":{"200":{"description":"Renewed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterResponse"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"409":{"$ref":"#/components/responses/PriceChanged"},"422":{"description":"Registry rejected the renewal.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}