List the profile's devices.
const url = 'https://api.opdns.io/v1/profiles/example/devices?limit=50';const options = {method: 'GET', headers: {cookie: 'opdns_session=<opdns_session>'}};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request GET \ --url 'https://api.opdns.io/v1/profiles/example/devices?limit=50' \ --cookie opdns_session=<opdns_session>Token scope: profiles:read. Devices are learnt from query logs (DoH path
segment, DoT/DoQ SNI prefix; resolver design section 3): ingest records the
first and last time each device id was seen, its latest sanitised name and
last transport, writing each device at most every 30 seconds, so last_seen
lags by up to about a minute. Profiles that keep no logs (logs off, log
destination none) have no devices. Newest (by first_seen) first.
queries_24h and blocked_24h count the last 24 hours from ClickHouse
(top_devices) when the profile’s logs are in the cloud (cloud, both)
and the server has ClickHouse; otherwise, or when the count query fails,
they are null.
Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Path Parameters
Section titled “Path Parameters”Public 6-character id; never 000000.
Query Parameters
Section titled “Query Parameters”Page size.
The next_cursor of the previous page (opaque).
Responses
Section titled “Responses”Devices.
object
Cursor of the next page (pass it as cursor); null on the last page.
object
Stable per (profile, sanitised name); the device filter of logs and analytics.
Latest sanitised name the client sent (may be empty).
User override, null when unset.
display_name when set, else name, else id.
How the device names itself, from the last transport (DoH/DoH3 path, DoT/DoQ SNI).
Transport of the latest sighting (doh, doh3, dot, doq).
Queries in the last 24 hours; null when counts are unavailable.
Blocked queries in the last 24 hours; null when counts are unavailable.
Example
{ "devices": [ { "kind": "phone", "identification": "doh_path" } ]}Malformed request.
object
Stable machine code.
object
Seconds, repeating the Retry-After header (rate limits, offline nodes).
Example
{ "type": "https://opdns.io/problems/bad_request", "title": "Bad Request", "status": 400, "code": "bad_request", "detail": "invalid JSON body", "request_id": "5f2c9a0e7b1d4c38"}Not authenticated.
object
Stable machine code.
object
Seconds, repeating the Retry-After header (rate limits, offline nodes).
Example
{ "type": "https://opdns.io/problems/unauthenticated", "title": "Unauthorized", "status": 401, "code": "unauthenticated", "detail": "authentication required", "request_id": "5f2c9a0e7b1d4c38"}Authenticated but not allowed: insufficient_scope, session_required, csrf_rejected, mfa_enrolment_required (restricted session), mfa_required (an operator action, or an admin-scoped token, from a session signed in with the password alone; not in dev), reauth_required (sign in again within five minutes), account_pending_deletion (the account is in its deletion cooling-off).
object
Stable machine code.
object
Seconds, repeating the Retry-After header (rate limits, offline nodes).
Example
{ "type": "https://opdns.io/problems/insufficient_scope", "title": "Forbidden", "status": 403, "code": "insufficient_scope", "detail": "the token lacks the profiles:write scope", "request_id": "5f2c9a0e7b1d4c38"}Not found (also for resources of another organisation).
object
Stable machine code.
object
Seconds, repeating the Retry-After header (rate limits, offline nodes).
Example
{ "type": "https://opdns.io/problems/not_found", "title": "Not Found", "status": 404, "code": "not_found", "detail": "resource not found", "request_id": "5f2c9a0e7b1d4c38"}Field validation failed (validation_failed, unknown_list).
object
Stable machine code.
object
Seconds, repeating the Retry-After header (rate limits, offline nodes).
Example
{ "type": "https://opdns.io/problems/validation_failed", "title": "Unprocessable Content", "status": 422, "code": "validation_failed", "detail": "the request has invalid fields", "errors": [ { "field": "settings.block_mode", "message": "one of nxdomain, refused, null, block-page" } ], "request_id": "5f2c9a0e7b1d4c38"}