{"openapi":"3.1.0","jsonSchemaDialect":"https://spec.openapis.org/oas/3.1/dialect/base","info":{"title":"Thoth.id Public API","version":"1.0.0","summary":"Resolve .htr names and profiles on the Hathor Network.","description":"Read-only REST API over the ThothNamer nano contract. No authentication required.\n\n- **Versioning**: URL-versioned (`/api/v1`). v1 only receives additive changes.\n- **Names** are case-insensitive and accepted with or without `.htr`; responses echo the canonical form.\n- **Errors** use RFC 9457 `application/problem+json` with a stable `code`.\n- **Caching**: responses carry `Cache-Control` and `ETag`; send `If-None-Match` to get `304`.\n- **Rate limits**: per client IP per 60s, reported in `RateLimit-*` headers on uncached responses. CDN-cached responses omit `RateLimit-*` and `X-Request-Id` and do not count against the limit.\n- **Batching**: up to 50 items per `POST /batch/resolve`.","contact":{"name":"Thoth.id","url":"https://thoth.id/developers"}},"externalDocs":{"description":"Developer documentation","url":"https://testnet.thoth.id/developers"},"servers":[{"url":"https://testnet.thoth.id/api/v1","description":"This deployment"}],"security":[],"tags":[{"name":"Resolution","description":"Forward (name → address) and reverse (address → name) resolution."},{"name":"Names","description":"Name records, status, availability and fee quotes."},{"name":"Profiles","description":"Profile records attached to a name (avatar, description, socials)."},{"name":"Addresses","description":"Names managed by an address."},{"name":"Meta","description":"Contract configuration, health and API description."}],"paths":{"/names/{name}/address":{"get":{"operationId":"resolveName","tags":["Resolution"],"summary":"Resolve a name to an address","description":"Strict forward resolution: returns the resolving address only while the name is active. Expired names return `404 NAME_EXPIRED`, so a `200` is always safe to send funds to.\n\nCache-Control: `public, max-age=15, s-maxage=30, stale-while-revalidate=60`","parameters":[{"name":"name","in":"path","required":true,"description":"A .htr name, with or without the suffix. Case-insensitive; the canonical lowercase form is echoed back.","schema":{"type":"string","maxLength":128},"example":"jackal.htr"}],"responses":{"200":{"description":"Success.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"Cache-Control":{"description":"`public, max-age=15, s-maxage=30, stale-while-revalidate=60`","schema":{"type":"string"}},"ETag":{"$ref":"#/components/headers/ETag"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NameResolution"},"example":{"name":"jackal.htr","address":"WjcD1MGLi1TS8pH1JRcYzd9bJ1YPejVRtH"}}}},"304":{"description":"Not modified (the `If-None-Match` header matched the current `ETag`).","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}}},"400":{"description":"`INVALID_NAME`: The name is not a valid .htr name (3-80 chars, a-z, 0-9 and single inner hyphens).","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"INVALID_NAME":{"value":{"type":"https://thoth.id/developers#error-invalid-name","title":"Invalid name","status":400,"detail":"The name is not a valid .htr name (3-80 chars, a-z, 0-9 and single inner hyphens).","instance":"/api/v1/names/jackal.htr/address","code":"INVALID_NAME","requestId":"5b0f3c1e-8d43-4c55-9d0a-2a57d1c2e9f1"}}}}}},"404":{"description":"`NAME_NOT_FOUND`: The name is not registered, or its registration and grace period have lapsed.\n\n`NAME_EXPIRED`: The name is registered but expired (in its grace period), so it does not resolve.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"NAME_NOT_FOUND":{"value":{"type":"https://thoth.id/developers#error-name-not-found","title":"Name not found","status":404,"detail":"The name is not registered, or its registration and grace period have lapsed.","instance":"/api/v1/names/jackal.htr/address","code":"NAME_NOT_FOUND","requestId":"5b0f3c1e-8d43-4c55-9d0a-2a57d1c2e9f1"}},"NAME_EXPIRED":{"value":{"type":"https://thoth.id/developers#error-name-expired","title":"Name expired","status":404,"detail":"The name is registered but expired (in its grace period), so it does not resolve.","instance":"/api/v1/names/jackal.htr/address","code":"NAME_EXPIRED","requestId":"5b0f3c1e-8d43-4c55-9d0a-2a57d1c2e9f1"}}}}}},"405":{"$ref":"#/components/responses/MethodNotAllowed"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"502":{"$ref":"#/components/responses/UpstreamError"},"504":{"$ref":"#/components/responses/UpstreamTimeout"}}}},"/addresses/{address}/name":{"get":{"operationId":"reverseResolve","tags":["Resolution"],"summary":"Reverse-resolve an address to its primary name","description":"Returns the primary name the address set as manager, if that name is active. `verified` is `true` when the name also resolves forward to the same address; only display unverified names with care.\n\nCache-Control: `public, max-age=15, s-maxage=30, stale-while-revalidate=60`","parameters":[{"name":"address","in":"path","required":true,"description":"A base58 Hathor address.","schema":{"type":"string","maxLength":128},"example":"WSoSypkhE8i3iZxZvXCq91vWDwr8wKFVVq"}],"responses":{"200":{"description":"Success.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"Cache-Control":{"description":"`public, max-age=15, s-maxage=30, stale-while-revalidate=60`","schema":{"type":"string"}},"ETag":{"$ref":"#/components/headers/ETag"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReverseResolution"},"example":{"address":"WSoSypkhE8i3iZxZvXCq91vWDwr8wKFVVq","name":"biu.htr","verified":true}}}},"304":{"description":"Not modified (the `If-None-Match` header matched the current `ETag`).","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}}},"400":{"description":"`INVALID_ADDRESS`: The value is not a valid base58 Hathor address.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"INVALID_ADDRESS":{"value":{"type":"https://thoth.id/developers#error-invalid-address","title":"Invalid address","status":400,"detail":"The value is not a valid base58 Hathor address.","instance":"/api/v1/addresses/WSoSypkhE8i3iZxZvXCq91vWDwr8wKFVVq/name","code":"INVALID_ADDRESS","requestId":"5b0f3c1e-8d43-4c55-9d0a-2a57d1c2e9f1"}}}}}},"404":{"description":"`PRIMARY_NAME_NOT_SET`: The address has no primary name, or its primary name is no longer active.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"PRIMARY_NAME_NOT_SET":{"value":{"type":"https://thoth.id/developers#error-primary-name-not-set","title":"Primary name not set","status":404,"detail":"The address has no primary name, or its primary name is no longer active.","instance":"/api/v1/addresses/WSoSypkhE8i3iZxZvXCq91vWDwr8wKFVVq/name","code":"PRIMARY_NAME_NOT_SET","requestId":"5b0f3c1e-8d43-4c55-9d0a-2a57d1c2e9f1"}}}}}},"405":{"$ref":"#/components/responses/MethodNotAllowed"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"502":{"$ref":"#/components/responses/UpstreamError"},"504":{"$ref":"#/components/responses/UpstreamTimeout"}}}},"/batch/resolve":{"post":{"operationId":"batchResolve","tags":["Resolution"],"summary":"Resolve many names and addresses at once","description":"Resolve up to 50 items in total (names + addresses) in one request. Results keep the input order and carry a per-item `error` (same codes as problem responses). Node outages fail the whole request with 502/504. Counts as 1 + ⌊items / 5⌋ rate-limit units. Not cached.\n\nCache-Control: `no-store`","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchResolveRequest"},"example":{"names":["jackal.htr","thoth","nobody-here"],"addresses":["WSoSypkhE8i3iZxZvXCq91vWDwr8wKFVVq"]}}}},"responses":{"200":{"description":"Success.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"Cache-Control":{"description":"`no-store`","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchResolveResponse"},"example":{"names":[{"input":"jackal.htr","name":"jackal.htr","address":"WjcD1MGLi1TS8pH1JRcYzd9bJ1YPejVRtH","error":null},{"input":"thoth","name":"thoth.htr","address":"WSoSypkhE8i3iZxZvXCq91vWDwr8wKFVVq","error":null},{"input":"nobody-here","name":"nobody-here.htr","address":null,"error":{"code":"NAME_NOT_FOUND","message":"nobody-here.htr is not registered."}}],"addresses":[{"input":"WSoSypkhE8i3iZxZvXCq91vWDwr8wKFVVq","address":"WSoSypkhE8i3iZxZvXCq91vWDwr8wKFVVq","name":"biu.htr","verified":true,"error":null}]}}}},"400":{"description":"`INVALID_REQUEST`: The request body or query string failed validation. See `errors` for details.\n\n`BATCH_TOO_LARGE`: The batch request contains more items than allowed.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"INVALID_REQUEST":{"value":{"type":"https://thoth.id/developers#error-invalid-request","title":"Invalid request","status":400,"detail":"The request body or query string failed validation. See `errors` for details.","instance":"/api/v1/batch/resolve","code":"INVALID_REQUEST","requestId":"5b0f3c1e-8d43-4c55-9d0a-2a57d1c2e9f1"}},"BATCH_TOO_LARGE":{"value":{"type":"https://thoth.id/developers#error-batch-too-large","title":"Batch too large","status":400,"detail":"The batch request contains more items than allowed.","instance":"/api/v1/batch/resolve","code":"BATCH_TOO_LARGE","requestId":"5b0f3c1e-8d43-4c55-9d0a-2a57d1c2e9f1"}}}}}},"405":{"$ref":"#/components/responses/MethodNotAllowed"},"413":{"description":"`PAYLOAD_TOO_LARGE`: The request body exceeds the maximum accepted size.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"PAYLOAD_TOO_LARGE":{"value":{"type":"https://thoth.id/developers#error-payload-too-large","title":"Payload too large","status":413,"detail":"The request body exceeds the maximum accepted size.","instance":"/api/v1/batch/resolve","code":"PAYLOAD_TOO_LARGE","requestId":"5b0f3c1e-8d43-4c55-9d0a-2a57d1c2e9f1"}}}}}},"415":{"description":"`UNSUPPORTED_MEDIA_TYPE`: Request bodies must be sent as `application/json`.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"UNSUPPORTED_MEDIA_TYPE":{"value":{"type":"https://thoth.id/developers#error-unsupported-media-type","title":"Unsupported media type","status":415,"detail":"Request bodies must be sent as `application/json`.","instance":"/api/v1/batch/resolve","code":"UNSUPPORTED_MEDIA_TYPE","requestId":"5b0f3c1e-8d43-4c55-9d0a-2a57d1c2e9f1"}}}}}},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"502":{"$ref":"#/components/responses/UpstreamError"},"504":{"$ref":"#/components/responses/UpstreamTimeout"}}}},"/names/{name}":{"get":{"operationId":"getName","tags":["Names"],"summary":"Get a name record","description":"Full on-chain record: status, resolving address, manager, owner, NFT and expiration. Names whose grace period has lapsed return `404 NAME_NOT_FOUND`.\n\nCache-Control: `public, max-age=15, s-maxage=30, stale-while-revalidate=60`","parameters":[{"name":"name","in":"path","required":true,"description":"A .htr name, with or without the suffix. Case-insensitive; the canonical lowercase form is echoed back.","schema":{"type":"string","maxLength":128},"example":"test.htr"}],"responses":{"200":{"description":"Success.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"Cache-Control":{"description":"`public, max-age=15, s-maxage=30, stale-while-revalidate=60`","schema":{"type":"string"}},"ETag":{"$ref":"#/components/headers/ETag"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NameRecord"},"example":{"name":"test.htr","label":"test","status":"active","resolvingAddress":"WSoSypkhE8i3iZxZvXCq91vWDwr8wKFVVq","manager":"WSoSypkhE8i3iZxZvXCq91vWDwr8wKFVVq","owner":"WSoSypkhE8i3iZxZvXCq91vWDwr8wKFVVq","nftDeposited":true,"tokenUid":"00f34fabeb19991b7981c3e4439d713856a9ee9ff0725ed6023c335da52eb5e0","expiresAt":"2027-02-10T14:56:07.000Z","expiresAtUnix":1802271367,"gracePeriodEndsAt":"2027-03-12T14:56:07.000Z","gracePeriodEndsAtUnix":1804863367}}}},"304":{"description":"Not modified (the `If-None-Match` header matched the current `ETag`).","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}}},"400":{"description":"`INVALID_NAME`: The name is not a valid .htr name (3-80 chars, a-z, 0-9 and single inner hyphens).","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"INVALID_NAME":{"value":{"type":"https://thoth.id/developers#error-invalid-name","title":"Invalid name","status":400,"detail":"The name is not a valid .htr name (3-80 chars, a-z, 0-9 and single inner hyphens).","instance":"/api/v1/names/test.htr","code":"INVALID_NAME","requestId":"5b0f3c1e-8d43-4c55-9d0a-2a57d1c2e9f1"}}}}}},"404":{"description":"`NAME_NOT_FOUND`: The name is not registered, or its registration and grace period have lapsed.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"NAME_NOT_FOUND":{"value":{"type":"https://thoth.id/developers#error-name-not-found","title":"Name not found","status":404,"detail":"The name is not registered, or its registration and grace period have lapsed.","instance":"/api/v1/names/test.htr","code":"NAME_NOT_FOUND","requestId":"5b0f3c1e-8d43-4c55-9d0a-2a57d1c2e9f1"}}}}}},"405":{"$ref":"#/components/responses/MethodNotAllowed"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"502":{"$ref":"#/components/responses/UpstreamError"},"504":{"$ref":"#/components/responses/UpstreamTimeout"}}}},"/names/{name}/availability":{"get":{"operationId":"getAvailability","tags":["Names"],"summary":"Check availability and quote the fee","description":"Whether anyone can register the name right now, its status, and the registration fee for one period. Unregistered names return `200` with `available: true`.\n\nCache-Control: `public, max-age=5, s-maxage=10, stale-while-revalidate=20`","parameters":[{"name":"name","in":"path","required":true,"description":"A .htr name, with or without the suffix. Case-insensitive; the canonical lowercase form is echoed back.","schema":{"type":"string","maxLength":128},"example":"abc"}],"responses":{"200":{"description":"Success.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"Cache-Control":{"description":"`public, max-age=5, s-maxage=10, stale-while-revalidate=20`","schema":{"type":"string"}},"ETag":{"$ref":"#/components/headers/ETag"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Availability"},"example":{"name":"abc.htr","label":"abc","available":true,"status":"available","expiresAt":null,"expiresAtUnix":null,"gracePeriodEndsAt":null,"gracePeriodEndsAtUnix":null,"fee":{"currency":"HTR","decimals":2,"baseFee":1,"multiplier":20,"amount":20,"formatted":"0.20","periodDays":365}}}}},"304":{"description":"Not modified (the `If-None-Match` header matched the current `ETag`).","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}}},"400":{"description":"`INVALID_NAME`: The name is not a valid .htr name (3-80 chars, a-z, 0-9 and single inner hyphens).","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"INVALID_NAME":{"value":{"type":"https://thoth.id/developers#error-invalid-name","title":"Invalid name","status":400,"detail":"The name is not a valid .htr name (3-80 chars, a-z, 0-9 and single inner hyphens).","instance":"/api/v1/names/abc/availability","code":"INVALID_NAME","requestId":"5b0f3c1e-8d43-4c55-9d0a-2a57d1c2e9f1"}}}}}},"405":{"$ref":"#/components/responses/MethodNotAllowed"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"502":{"$ref":"#/components/responses/UpstreamError"},"504":{"$ref":"#/components/responses/UpstreamTimeout"}}}},"/names/{name}/profile":{"get":{"operationId":"getProfile","tags":["Profiles"],"summary":"Get profile records","description":"Profile records of a registered name: typed well-known keys, a displayable `avatarUrl`, and the raw key/value map as stored on-chain.\n\nCache-Control: `public, max-age=30, s-maxage=60, stale-while-revalidate=300`","parameters":[{"name":"name","in":"path","required":true,"description":"A .htr name, with or without the suffix. Case-insensitive; the canonical lowercase form is echoed back.","schema":{"type":"string","maxLength":128},"example":"test.htr"}],"responses":{"200":{"description":"Success.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"Cache-Control":{"description":"`public, max-age=30, s-maxage=60, stale-while-revalidate=300`","schema":{"type":"string"}},"ETag":{"$ref":"#/components/headers/ETag"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Profile"},"example":{"name":"test.htr","status":"active","avatarUrl":"https://abeesgqcvlollxwc.public.blob.vercel-storage.com/domain-images/test-hsdSU0hh1L5qF21L54mTn4QMzHCb1u.htr/avatar","records":{"avatar":"https://abeesgqcvlollxwc.public.blob.vercel-storage.com/domain-images/test-hsdSU0hh1L5qF21L54mTn4QMzHCb1u.htr/avatar","description":null,"website":null,"email":null,"twitter":null,"github":null,"discord":null,"telegram":null},"raw":{"avatar_link":"https://abeesgqcvlollxwc.public.blob.vercel-storage.com/domain-images/test-hsdSU0hh1L5qF21L54mTn4QMzHCb1u.htr/avatar"}}}}},"304":{"description":"Not modified (the `If-None-Match` header matched the current `ETag`).","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}}},"400":{"description":"`INVALID_NAME`: The name is not a valid .htr name (3-80 chars, a-z, 0-9 and single inner hyphens).","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"INVALID_NAME":{"value":{"type":"https://thoth.id/developers#error-invalid-name","title":"Invalid name","status":400,"detail":"The name is not a valid .htr name (3-80 chars, a-z, 0-9 and single inner hyphens).","instance":"/api/v1/names/test.htr/profile","code":"INVALID_NAME","requestId":"5b0f3c1e-8d43-4c55-9d0a-2a57d1c2e9f1"}}}}}},"404":{"description":"`NAME_NOT_FOUND`: The name is not registered, or its registration and grace period have lapsed.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"NAME_NOT_FOUND":{"value":{"type":"https://thoth.id/developers#error-name-not-found","title":"Name not found","status":404,"detail":"The name is not registered, or its registration and grace period have lapsed.","instance":"/api/v1/names/test.htr/profile","code":"NAME_NOT_FOUND","requestId":"5b0f3c1e-8d43-4c55-9d0a-2a57d1c2e9f1"}}}}}},"405":{"$ref":"#/components/responses/MethodNotAllowed"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"502":{"$ref":"#/components/responses/UpstreamError"},"504":{"$ref":"#/components/responses/UpstreamTimeout"}}}},"/addresses/{address}/names":{"get":{"operationId":"getManagedNames","tags":["Addresses"],"summary":"List names managed by an address","description":"All names the address manages (max 100 per address, enforced on-chain) plus its primary name. An address with no names returns an empty list.\n\nCache-Control: `public, max-age=15, s-maxage=30, stale-while-revalidate=60`","parameters":[{"name":"address","in":"path","required":true,"description":"A base58 Hathor address.","schema":{"type":"string","maxLength":128},"example":"WjcD1MGLi1TS8pH1JRcYzd9bJ1YPejVRtH"}],"responses":{"200":{"description":"Success.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"Cache-Control":{"description":"`public, max-age=15, s-maxage=30, stale-while-revalidate=60`","schema":{"type":"string"}},"ETag":{"$ref":"#/components/headers/ETag"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ManagedNames"},"example":{"address":"WjcD1MGLi1TS8pH1JRcYzd9bJ1YPejVRtH","primaryName":"jackal.htr","names":["jackal.htr"],"total":1}}}},"304":{"description":"Not modified (the `If-None-Match` header matched the current `ETag`).","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}}},"400":{"description":"`INVALID_ADDRESS`: The value is not a valid base58 Hathor address.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"INVALID_ADDRESS":{"value":{"type":"https://thoth.id/developers#error-invalid-address","title":"Invalid address","status":400,"detail":"The value is not a valid base58 Hathor address.","instance":"/api/v1/addresses/WjcD1MGLi1TS8pH1JRcYzd9bJ1YPejVRtH/names","code":"INVALID_ADDRESS","requestId":"5b0f3c1e-8d43-4c55-9d0a-2a57d1c2e9f1"}}}}}},"405":{"$ref":"#/components/responses/MethodNotAllowed"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"502":{"$ref":"#/components/responses/UpstreamError"},"504":{"$ref":"#/components/responses/UpstreamTimeout"}}}},"/config":{"get":{"operationId":"getConfig","tags":["Meta"],"summary":"Get contract configuration","description":"Fee tiers, profile limits, grace period and API limits. Changes rarely; cache it on your side too.\n\nCache-Control: `public, max-age=300, s-maxage=3600, stale-while-revalidate=86400`","parameters":[],"responses":{"200":{"description":"Success.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"Cache-Control":{"description":"`public, max-age=300, s-maxage=3600, stale-while-revalidate=86400`","schema":{"type":"string"}},"ETag":{"$ref":"#/components/headers/ETag"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Config"},"example":{"domain":"htr","network":"testnet-india","contractId":"00001f87ed606c28465afac15fe3805736993f77d4cc83da026531e120469d73","blueprintId":"000000009108a3ab3c24297df5e33679177fb8a051c133bcad467a8a23bf0dd3","contractVersion":"1.0.0","gracePeriodDays":30,"fees":{"currency":"HTR","decimals":2,"baseFee":1,"periodDays":365,"tiers":[{"minLength":3,"maxLength":3,"multiplier":20,"amount":20,"formatted":"0.20"},{"minLength":4,"maxLength":4,"multiplier":10,"amount":10,"formatted":"0.10"},{"minLength":5,"maxLength":null,"multiplier":1,"amount":1,"formatted":"0.01"}]},"limits":{"nameMinLength":3,"nameMaxLength":80,"maxProfileEntries":20,"maxProfileKeyLength":50,"maxProfileValueLength":1000,"maxTotalProfileSize":10000,"maxTokenSymbolLength":5,"maxManagedNamesPerAddress":100},"api":{"version":"1.0.0","batchMaxItems":50,"rateLimit":{"limit":120,"windowSeconds":60}}}}}},"304":{"description":"Not modified (the `If-None-Match` header matched the current `ETag`).","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}}},"405":{"$ref":"#/components/responses/MethodNotAllowed"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"502":{"$ref":"#/components/responses/UpstreamError"},"504":{"$ref":"#/components/responses/UpstreamTimeout"}}}},"/health":{"get":{"operationId":"getHealth","tags":["Meta"],"summary":"Health check","description":"API liveness plus reachability of the Hathor node(s). Returns `503` when no node is reachable. Not rate limited, never cached.\n\nCache-Control: `no-store`","parameters":[],"responses":{"200":{"description":"Success.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"Cache-Control":{"description":"`no-store`","schema":{"type":"string"}},"ETag":{"$ref":"#/components/headers/ETag"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Health"},"example":{"status":"ok","apiVersion":"1.0.0","time":"2026-09-23T21:00:00.000Z","upstream":{"primary":{"reachable":true,"latencyMs":142,"network":"testnet-india","nodeVersion":"0.71.0"},"fallback":null}}}}},"304":{"description":"Not modified (the `If-None-Match` header matched the current `ETag`).","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}}},"405":{"$ref":"#/components/responses/MethodNotAllowed"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"502":{"$ref":"#/components/responses/UpstreamError"},"503":{"description":"No Hathor node reachable (body has `status: \"down\"`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Health"}}}},"504":{"$ref":"#/components/responses/UpstreamTimeout"}}}},"/openapi.json":{"get":{"operationId":"getOpenApiDocument","tags":["Meta"],"summary":"This OpenAPI 3.1 document","responses":{"200":{"description":"The OpenAPI document.","content":{"application/json":{"schema":{"type":"object"}}}},"429":{"$ref":"#/components/responses/RateLimited"}}}}},"components":{"schemas":{"Problem":{"type":"object","properties":{"type":{"type":"string","description":"URI identifying the problem type (links to the docs)."},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"instance":{"type":"string","description":"Request path that produced the problem."},"code":{"type":"string","description":"Stable machine-readable error code."},"requestId":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string"}},"required":["field","message"]}}},"required":["type","title","status","detail","instance","code"]},"NameResolution":{"type":"object","properties":{"name":{"type":"string","description":"Canonical name, always lowercase with the `.htr` suffix."},"address":{"type":"string","description":"The resolving address of an active name."}},"required":["name","address"]},"ReverseResolution":{"type":"object","properties":{"address":{"type":"string","description":"Base58 Hathor address."},"name":{"type":"string","description":"Primary name set by this address (as manager)."},"verified":{"type":"boolean","description":"`true` when the primary name also resolves forward to this same address. Wallets should only display unverified names with a warning."}},"required":["address","name","verified"]},"BatchResolveRequest":{"type":"object","properties":{"names":{"type":"array","items":{"type":"string","maxLength":128},"maxItems":50},"addresses":{"type":"array","items":{"type":"string","maxLength":128},"maxItems":50}},"additionalProperties":false},"BatchResolveResponse":{"type":"object","properties":{"names":{"type":"array","items":{"type":"object","properties":{"input":{"type":"string","description":"The item exactly as sent."},"name":{"type":["string","null"],"description":"Canonical name, `null` if the input was invalid."},"address":{"type":["string","null"],"description":"Base58 Hathor address."},"error":{"type":["object","null"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"description":"`null` on success; otherwise a stable error `code` (same codes as problem responses)."}},"required":["input","name","address","error"]}},"addresses":{"type":"array","items":{"type":"object","properties":{"input":{"type":"string","description":"The item exactly as sent."},"address":{"type":["string","null"],"description":"Trimmed address, `null` if the input was invalid."},"name":{"type":["string","null"],"description":"Canonical name, always lowercase with the `.htr` suffix."},"verified":{"type":["boolean","null"]},"error":{"type":["object","null"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"description":"`null` on success; otherwise a stable error `code` (same codes as problem responses)."}},"required":["input","address","name","verified","error"]}}},"required":["names","addresses"]},"NameRecord":{"type":"object","properties":{"name":{"type":"string","description":"Canonical name, always lowercase with the `.htr` suffix."},"label":{"type":"string","description":"The name without the `.htr` suffix."},"status":{"type":"string","enum":["active","grace_period"],"description":"`active`: registered and resolving. `grace_period`: expired, does not resolve, only the current owner can renew."},"resolvingAddress":{"type":"string","description":"Address the name points to. Only authoritative while `status` is `active`; use `/names/{name}/address` for strict resolution."},"manager":{"type":"string","description":"Address allowed to edit the resolving address and profile."},"owner":{"type":["string","null"],"description":"Owner of the name NFT. `null` when the NFT has been withdrawn from the contract, in which case on-chain ownership cannot be asserted."},"nftDeposited":{"type":"boolean","description":"Whether the name NFT is held by the contract."},"tokenUid":{"type":"string","description":"UID of the NFT token that represents the name."},"expiresAt":{"type":"string","description":"ISO-8601 UTC timestamp."},"expiresAtUnix":{"type":"integer","description":"Unix timestamp in seconds."},"gracePeriodEndsAt":{"type":"string","description":"ISO-8601 UTC timestamp."},"gracePeriodEndsAtUnix":{"type":"integer","description":"Unix timestamp in seconds."}},"required":["name","label","status","resolvingAddress","manager","owner","nftDeposited","tokenUid","expiresAt","expiresAtUnix","gracePeriodEndsAt","gracePeriodEndsAtUnix"]},"Profile":{"type":"object","properties":{"name":{"type":"string","description":"Canonical name, always lowercase with the `.htr` suffix."},"status":{"type":"string","enum":["active","grace_period"],"description":"`active`: registered and resolving. `grace_period`: expired, does not resolve, only the current owner can renew."},"avatarUrl":{"type":["string","null"],"description":"Displayable avatar URL: the `avatar_link` record when it is an http(s) URL (`ipfs://` is rewritten to a public gateway), otherwise `null`."},"records":{"type":"object","properties":{"avatar":{"type":["string","null"],"description":"From the `avatar_link` key."},"description":{"type":["string","null"],"description":"From the `description` key."},"website":{"type":["string","null"],"description":"From `website` or `url`."},"email":{"type":["string","null"],"description":"From `email`."},"twitter":{"type":["string","null"],"description":"From `twitter`, `x` or `com_twitter`."},"github":{"type":["string","null"],"description":"From `github` or `com_github`."},"discord":{"type":["string","null"],"description":"From `discord` or `com_discord`."},"telegram":{"type":["string","null"],"description":"From `telegram` or `org_telegram`."}},"required":["avatar","description","website","email","twitter","github","discord","telegram"],"description":"Well-known profile keys, normalized. Always present; `null` when unset."},"raw":{"type":"object","additionalProperties":{"type":"string"},"description":"Every profile key/value exactly as stored on-chain, in contract order."}},"required":["name","status","avatarUrl","records","raw"]},"Availability":{"type":"object","properties":{"name":{"type":"string","description":"Canonical name, always lowercase with the `.htr` suffix."},"label":{"type":"string","description":"The name without the `.htr` suffix."},"available":{"type":"boolean","description":"`true` when anyone can register the name right now."},"status":{"type":"string","enum":["active","grace_period","available"],"description":"`active`: registered and resolving. `grace_period`: expired, renewable by the owner only. `available`: can be registered by anyone."},"expiresAt":{"type":["string","null"],"description":"`null` when the name was never registered."},"expiresAtUnix":{"type":["integer","null"],"description":"Unix timestamp in seconds."},"gracePeriodEndsAt":{"type":["string","null"],"description":"ISO-8601 UTC timestamp."},"gracePeriodEndsAtUnix":{"type":["integer","null"],"description":"Unix timestamp in seconds."},"fee":{"type":"object","properties":{"currency":{"const":"HTR"},"decimals":{"type":"integer","description":"Decimal places of the integer amounts (2 → 1 = 0.01 HTR)."},"baseFee":{"type":"integer","description":"Contract base fee, in the smallest HTR unit."},"multiplier":{"type":"integer","description":"Length-based multiplier applied to the base fee."},"amount":{"type":"integer","description":"Fee for one registration period, in the smallest HTR unit."},"formatted":{"type":"string","description":"`amount` as a decimal HTR string, e.g. `\"0.20\"`."},"periodDays":{"type":"integer","description":"Days of registration bought by one fee payment."}},"required":["currency","decimals","baseFee","multiplier","amount","formatted","periodDays"],"description":"Registration fee quote for this name."}},"required":["name","label","available","status","expiresAt","expiresAtUnix","gracePeriodEndsAt","gracePeriodEndsAtUnix","fee"]},"ManagedNames":{"type":"object","properties":{"address":{"type":"string","description":"Base58 Hathor address."},"primaryName":{"type":["string","null"],"description":"Primary name of the address, if set."},"names":{"type":"array","items":{"type":"string","description":"Canonical name, always lowercase with the `.htr` suffix."},"description":"Names managed by the address, in contract order. May include expired names; check each name for its status."},"total":{"type":"integer"}},"required":["address","primaryName","names","total"]},"Config":{"type":"object","properties":{"domain":{"type":"string","description":"Top-level domain served by the contract."},"network":{"type":["string","null"],"description":"Hathor network reported by the node, e.g. `testnet-india`."},"contractId":{"type":"string"},"blueprintId":{"type":"string"},"contractVersion":{"type":["string","null"]},"gracePeriodDays":{"type":"integer"},"fees":{"type":"object","properties":{"currency":{"const":"HTR"},"decimals":{"type":"integer"},"baseFee":{"type":"integer"},"periodDays":{"type":"integer"},"tiers":{"type":"array","items":{"type":"object","properties":{"minLength":{"type":"integer"},"maxLength":{"type":["integer","null"],"description":"`null` means no upper bound."},"multiplier":{"type":"integer"},"amount":{"type":"integer","description":"Fee per period, in the smallest HTR unit."},"formatted":{"type":"string"}},"required":["minLength","maxLength","multiplier","amount","formatted"]}}},"required":["currency","decimals","baseFee","periodDays","tiers"]},"limits":{"type":"object","properties":{"nameMinLength":{"type":"integer"},"nameMaxLength":{"type":"integer"},"maxProfileEntries":{"type":"integer"},"maxProfileKeyLength":{"type":"integer"},"maxProfileValueLength":{"type":"integer"},"maxTotalProfileSize":{"type":"integer"},"maxTokenSymbolLength":{"type":"integer"},"maxManagedNamesPerAddress":{"type":["integer","null"]}},"required":["nameMinLength","nameMaxLength","maxProfileEntries","maxProfileKeyLength","maxProfileValueLength","maxTotalProfileSize","maxTokenSymbolLength","maxManagedNamesPerAddress"]},"api":{"type":"object","properties":{"version":{"type":"string"},"batchMaxItems":{"type":"integer"},"rateLimit":{"type":"object","properties":{"limit":{"type":"integer"},"windowSeconds":{"type":"integer"}},"required":["limit","windowSeconds"]}},"required":["version","batchMaxItems","rateLimit"]}},"required":["domain","network","contractId","blueprintId","contractVersion","gracePeriodDays","fees","limits","api"]},"Health":{"type":"object","properties":{"status":{"type":"string","enum":["ok","degraded","down"],"description":"`degraded`: primary node down, serving from fallback. `down`: no node reachable (HTTP 503)."},"apiVersion":{"type":"string"},"time":{"type":"string","description":"ISO-8601 UTC timestamp."},"upstream":{"type":"object","properties":{"primary":{"type":"object","properties":{"reachable":{"type":"boolean"},"latencyMs":{"type":["integer","null"]},"network":{"type":["string","null"]},"nodeVersion":{"type":["string","null"]}},"required":["reachable","latencyMs","network","nodeVersion"]},"fallback":{"type":["object","null"],"properties":{"reachable":{"type":"boolean"},"latencyMs":{"type":["integer","null"]},"network":{"type":["string","null"]},"nodeVersion":{"type":["string","null"]}},"required":["reachable","latencyMs","network","nodeVersion"],"description":"`null` when no fallback node is configured."}},"required":["primary","fallback"]}},"required":["status","apiVersion","time","upstream"]}},"headers":{"X-Request-Id":{"description":"Request identifier. Echoes a valid incoming `X-Request-Id`, otherwise a UUID. Omitted on CDN-cacheable responses (`s-maxage`), which are shared between clients.","schema":{"type":"string"}},"ETag":{"description":"Weak entity tag of the response body.","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Requests allowed per window. Rate-limit headers are omitted on CDN-cacheable responses.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets.","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"Allow":{"description":"Methods supported by the resource.","schema":{"type":"string"}}},"responses":{"MethodNotAllowed":{"description":"`METHOD_NOT_ALLOWED`: The HTTP method is not supported on this resource. See the `Allow` header.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"Allow":{"$ref":"#/components/headers/Allow"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"METHOD_NOT_ALLOWED":{"value":{"type":"https://thoth.id/developers#error-method-not-allowed","title":"Method not allowed","status":405,"detail":"The HTTP method is not supported on this resource. See the `Allow` header.","instance":"/api/v1/names/thoth.htr","code":"METHOD_NOT_ALLOWED","requestId":"5b0f3c1e-8d43-4c55-9d0a-2a57d1c2e9f1"}}}}}},"RateLimited":{"description":"`RATE_LIMITED`: The client exceeded its rate limit. Retry after `Retry-After` seconds.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"RATE_LIMITED":{"value":{"type":"https://thoth.id/developers#error-rate-limited","title":"Too many requests","status":429,"detail":"The client exceeded its rate limit. Retry after `Retry-After` seconds.","instance":"/api/v1/names/thoth.htr","code":"RATE_LIMITED","requestId":"5b0f3c1e-8d43-4c55-9d0a-2a57d1c2e9f1"}}}}}},"InternalError":{"description":"`INTERNAL_ERROR`: An unexpected error occurred. Include `X-Request-Id` when reporting it.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"INTERNAL_ERROR":{"value":{"type":"https://thoth.id/developers#error-internal-error","title":"Internal error","status":500,"detail":"An unexpected error occurred. Include `X-Request-Id` when reporting it.","instance":"/api/v1/names/thoth.htr","code":"INTERNAL_ERROR","requestId":"5b0f3c1e-8d43-4c55-9d0a-2a57d1c2e9f1"}}}}}},"UpstreamError":{"description":"`UPSTREAM_ERROR`: The Hathor node returned an error or an unexpected response.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"UPSTREAM_ERROR":{"value":{"type":"https://thoth.id/developers#error-upstream-error","title":"Upstream node error","status":502,"detail":"The Hathor node returned an error or an unexpected response.","instance":"/api/v1/names/thoth.htr","code":"UPSTREAM_ERROR","requestId":"5b0f3c1e-8d43-4c55-9d0a-2a57d1c2e9f1"}}}}}},"UpstreamTimeout":{"description":"`UPSTREAM_TIMEOUT`: The Hathor node did not respond in time. Safe to retry.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"examples":{"UPSTREAM_TIMEOUT":{"value":{"type":"https://thoth.id/developers#error-upstream-timeout","title":"Upstream node timeout","status":504,"detail":"The Hathor node did not respond in time. Safe to retry.","instance":"/api/v1/names/thoth.htr","code":"UPSTREAM_TIMEOUT","requestId":"5b0f3c1e-8d43-4c55-9d0a-2a57d1c2e9f1"}}}}}}}}}