Suspend or reinstate a profile (admin).
const url = 'https://api.opdns.io/v1/admin/profiles/example';const options = { method: 'PATCH', headers: { cookie: 'opdns_session=<opdns_session>', 'Content-Type': 'application/json' }, body: '{"suspended":true,"reason":"example"}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request PATCH \ --url https://api.opdns.io/v1/admin/profiles/example \ --header 'Content-Type: application/json' \ --cookie opdns_session=<opdns_session> \ --data '{ "suspended": true, "reason": "example" }'Scope admin. A suspended profile keeps answering but resolves without
filtering and without logging on every edge and node (the published
document carries suspended: true), and customer writes to it fail with 409
profile_suspended. The change goes through the outbox like any profile
change (new version) and writes a profile.suspended or
profile.unsuspended audit entry in the profile’s organisation; its
meta.reason and meta.previous_reason appear only in the operator audit
log. A request that changes nothing writes nothing.
Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Path Parameters
Section titled “Path Parameters”Public 6-character id; never 000000.
Request Bodyrequired
Section titled “Request Bodyrequired”object
Required to suspend (printable text, at most 200 characters); ignored when reinstating.
Examplegenerated
{ "suspended": true, "reason": "example"}Responses
Section titled “Responses”The operator view after the change.
The operator view of a profile’s suspension.
object
Public 6-character id; never 000000.
The operator’s note; empty when not suspended. Operator-visible only.
Audit actor who suspended the profile; empty when not suspended.
Examplegenerated
{ "id": "example", "org_id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "name": "example", "version": 1, "suspended": true, "suspended_reason": "example", "suspended_at": "2026-04-15T12:00:00Z", "suspended_by": "example", "updated_at": "2026-04-15T12:00:00Z"}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"}