Skip to content

The calling node's identity (node side).

GET
/v1/nodes/self
curl --request GET \
--url https://api.opdns.io/v1/nodes/self \
--header 'Authorization: Bearer <token>'

Returns the calling node’s identity: its node and profile ids, its current record and the link URL it should connect to. Node token only.

Identity.

Media typeapplication/json
object
node_id
required

Same as node.id.

string
profile_id
required

The profile this node serves; same as node.profile_id.

string
node
required
object
id
required
string format: uuid
profile_id
required

Public 6-character id; never 000000.

string
/^[a-z0-9]{6}$/
name
required
string
mode
required
string
Allowed values: enrolled standalone
status
required

pending until the enrolment code is exchanged.

string
Allowed values: pending enrolled revoked
online
required
boolean
versions
required
object
edge
string
unbound
string
lists
integer
profile
integer
schema
integer
health
required
object
link_rtt_ms

Round trip of the link as the node measured it at its last health report (handshake, then keepalive pings). Absent when unknown (older nodes).

integer
profile_key_ids

Ids of the profile-signing keys the node trusts (configured and learnt), as it reported them in its last health report; the node refuses profiles signed by any other key. Empty when it checks no signature. Absent from nodes that predate the field.

Array<string>
uptime_s
integer
last_sync_unix_ms
integer
sqlite_bytes
integer
queue_depth
integer
oldest_record_unix_ms
integer
clock_offset_ms
integer
dropped_records
integer
unbound_healthy
boolean
reported_at_unix_ms
integer
link_rtt_ms

health.link_rtt_ms while the node is online; null when offline or unknown.

integer | null
profile_key_ids

health.profile_key_ids, the key ids from the node’s last health report (kept while it is offline); empty when unknown.

Array<string>
created_at
required
string format: date-time
enrol_expires_at
string format: date-time
enrolled_at
string format: date-time
connected_at
string format: date-time
last_seen
required
string | null format: date-time
revoked_at
string format: date-time
token_rotated_at

Last committed rotation of the node token (node.token_rotated); absent before the first.

string format: date-time
location
required
One of:

Approximate location of a self-hosted node, from GeoIP.

object
lat
required

Latitude; the country’s representative point when the database has no coordinates.

number
>= -90 <= 90
lon
required

Longitude, as lat.

number
>= -180 <= 180
country
required

ISO 3166-1 alpha-2 country code.

string
/^[A-Z]{2}$/
city

The city, when the database has one (a country database has none).

string
source
required

Where the location comes from.

string
Allowed values: geoip
queue_depth

Only in GET /v1/profiles/{id}/nodes: log batches waiting in the node’s queue (pending plus delivered but unacknowledged on its consumer, or every queued batch of the profile before the node first connected). Null when unknown (revoked node, or the queue could not be read).

integer | null format: int64
link_url
required
string format: uri
Example
{
"node": {
"mode": "enrolled",
"status": "pending",
"location": {
"source": "geoip"
}
}
}

Missing or unknown node token (unauthenticated) or revoked node (node_revoked).

Media typeapplication/problem+json
object
type
required
string format: uri
title
required
string
status
required
integer
code
required

Stable machine code.

string
Allowed values: bad_request body_too_large bad_if_match unauthenticated invalid_credentials signup_closed invite_required waitlist_unavailable invalid_token token_expired token_used session_required insufficient_scope csrf_rejected not_found version_mismatch ip_conflict unknown_list too_many_rules validation_failed rate_limited internal node_revoked node_offline node_busy node_timeout node_error result_too_large shape_unsupported node_token_superseded relay_unavailable not_implemented query_timeout query_too_expensive range_too_large too_many_queries second_factor_required invalid_second_factor mfa_enrolment_required mfa_required reauth_required no_second_factor totp_already_enabled totp_not_enabled last_credential passkey_exists passkey_invalid passkeys_unavailable ceremony_invalid account_pending_deletion credential_required deletion_pending no_deletion_pending deletion_started organisation_has_members export_in_progress export_not_ready block_exists invalid_recovery_code profile_not_empty invalid_cursor bad_idempotency_key idempotency_key_reused idempotency_in_progress too_many_streams too_many_reports password_too_short password_too_long profile_suspended
detail
string
errors
Array<object>
object
field
required
string
message
required
string
request_id
string
retry_after

Seconds, repeating the Retry-After header (rate limits, offline nodes).

integer
Example
{
"type": "https://opdns.io/problems/node_revoked",
"title": "Unauthorized",
"status": 401,
"code": "node_revoked",
"detail": "the node was revoked",
"request_id": "5f2c9a0e7b1d4c38"
}

Rate limited (rate_limited).

Media typeapplication/problem+json
object
type
required
string format: uri
title
required
string
status
required
integer
code
required

Stable machine code.

string
Allowed values: bad_request body_too_large bad_if_match unauthenticated invalid_credentials signup_closed invite_required waitlist_unavailable invalid_token token_expired token_used session_required insufficient_scope csrf_rejected not_found version_mismatch ip_conflict unknown_list too_many_rules validation_failed rate_limited internal node_revoked node_offline node_busy node_timeout node_error result_too_large shape_unsupported node_token_superseded relay_unavailable not_implemented query_timeout query_too_expensive range_too_large too_many_queries second_factor_required invalid_second_factor mfa_enrolment_required mfa_required reauth_required no_second_factor totp_already_enabled totp_not_enabled last_credential passkey_exists passkey_invalid passkeys_unavailable ceremony_invalid account_pending_deletion credential_required deletion_pending no_deletion_pending deletion_started organisation_has_members export_in_progress export_not_ready block_exists invalid_recovery_code profile_not_empty invalid_cursor bad_idempotency_key idempotency_key_reused idempotency_in_progress too_many_streams too_many_reports password_too_short password_too_long profile_suspended
detail
string
errors
Array<object>
object
field
required
string
message
required
string
request_id
string
retry_after

Seconds, repeating the Retry-After header (rate limits, offline nodes).

integer
Example
{
"type": "https://opdns.io/problems/rate_limited",
"title": "Too Many Requests",
"status": 429,
"code": "rate_limited",
"detail": "too many requests",
"request_id": "5f2c9a0e7b1d4c38",
"retry_after": 6
}
Retry-After
integer