List account audit events

GET /api/v2/audit-log

Return recent audit events for the authenticated account.

The response keeps the raw endpoint/method fields for forensics, but also includes API-composed summary, category, action, resourceLabel, and changes fields so clients do not have to interpret route names or request bodies.

By default the list also merges dedicated DNS change-history events, which provide concrete before/after DNS record and nameserver changes.

Use hideGet=true to filter out read-only GET events and focus on changes.

Account & Access Account

Authentication

Required API scope: audit:read

Authenticate with an API key in the Authorization: Bearer <token> header.

Context

Query Parameters

limit integer · min: 1 · max: 100 · default: 50

Page size from 1 to 100. Defaults to 50. Values outside this range are rejected with 400 invalid_request.

cursor string

Opaque cursor from nextCursor for the next page.

startAt string

Inclusive ISO-8601 lower bound. Defaults to the last 12 hours.

endAt string

Inclusive ISO-8601 upper bound.

severity string

Filter to events with this exact severity, for example info, warning, error, or critical. DNS change-history events always have info severity, so any other value excludes them.

method string

Filter to events with this exact HTTP method (case-insensitive). When set, hideGet is ignored. DNS change-history events match the method of the equivalent API call (POST for creations, imports, and nameserver changes; PUT for updates and zone replacements; DELETE for deletions), so filtering on GET excludes them.

endpoint string

Case-insensitive substring filter on the event endpoint path. For DNS change-history events the filter also matches the domain name and event summary.

hideGet boolean · default: false

Exclude read-only GET events so the list focuses on changes. Ignored when method is set.

includeStats boolean · default: false

Include account activity counters in the stats field. Counters are computed from startAt onward and ignore endAt and the other filters.

includeDnsEvents boolean · default: true

Include dedicated DNS change-history events with before/after DNS values. Defaults to true.

Headers

Authorization Bearer <token>
Accept application/json

Responses

200 Paginated audit events.
data array<object> required
data[].id string required
data[].occurredAt string required
data[].method string required
data[].endpoint string required
data[].path string required
data[].ipAddress string · nullable

Nullable: may be null when not applicable.

data[].userAgent string · nullable

Nullable: may be null when not applicable.

data[].statusCode integer · nullable

Nullable: may be null when not applicable.

data[].success boolean required
data[].durationMs integer · nullable

Nullable: may be null when not applicable.

data[].errorMessage string · nullable

Nullable: may be null when not applicable.

data[].authMethod string · nullable

Nullable: may be null when not applicable.

data[].resourcesAccessed array<string> required
data[].severity string required
data[].tags array<string> required
data[].eventSource string · enum required
request_audit
dns_history
data[].actorType string · nullable · enum

Nullable: may be null when not applicable.

customer
staff
system
api
smartcopy
data[].actorId string · nullable

Nullable: may be null when not applicable.

data[].requestId string · nullable

Nullable: may be null when not applicable.

data[].category string · enum required
dns
domain
security
billing
api
account
data[].action string required
data[].summary string required
data[].resourceLabel string · nullable

Nullable: may be null when not applicable.

data[].changes array<object> required
data[].changes[].label string required
data[].changes[].before string · nullable required

Nullable: may be null when not applicable.

data[].changes[].after string · nullable required

Nullable: may be null when not applicable.

total integer required
hasMore boolean required
nextCursor string · nullable required

stats object

Account activity counters, present only when includeStats=true. Counters cover events from startAt onward; endAt and the other filters are not applied. totalEvents includes DNS change-history events; the remaining counters cover API request log entries only.

stats.totalEvents integer required
stats.failedLogins integer required
stats.apiCalls integer required
stats.securityEvents integer required
stats.avgResponseTimeMs integer required
stats.topEndpoints array<object> required
stats.topEndpoints[].endpoint string required
stats.topEndpoints[].count integer required
stats.recentActivity array<object> required
stats.recentActivity[].date string required
stats.recentActivity[].count integer required
400 Invalid request. The response body is an RFC 7807 Problem Details document.
type string · Example: https://developer.hostup.se/errors/invalid_request
title string · Example: Validation failed
status integer · Example: 400
detail string · Example: The request body failed validation.
code string · Example: invalid_request

Stable machine-readable code. Branch on this field, not on detail.

instance string · Example: /api/v2/orders
requestId string · Example: req_01hxa3b4c5d6e7f8g9h0j1k2m3
timestamp string · Example: 2026-04-27T12:34:56.000Z
errors array<object>

Field-level validation errors when code is invalid_request.

errors[].pointer string required · Example: /items/0/eppCode
errors[].detail string required · Example: `eppCode` is required for this transfer.
errors[].code string required · Example: missing_required
extensions object
401 Unauthorized. Authentication is required.
type string · Example: https://developer.hostup.se/errors/invalid_request
title string · Example: Validation failed
status integer · Example: 400
detail string · Example: The request body failed validation.
code string · Example: invalid_request

Stable machine-readable code. Branch on this field, not on detail.

instance string · Example: /api/v2/orders
requestId string · Example: req_01hxa3b4c5d6e7f8g9h0j1k2m3
timestamp string · Example: 2026-04-27T12:34:56.000Z
errors array<object>

Field-level validation errors when code is invalid_request.

errors[].pointer string required · Example: /items/0/eppCode
errors[].detail string required · Example: `eppCode` is required for this transfer.
errors[].code string required · Example: missing_required
extensions object
403 Forbidden. The caller lacks a required scope or does not own the resource.
type string · Example: https://developer.hostup.se/errors/invalid_request
title string · Example: Validation failed
status integer · Example: 400
detail string · Example: The request body failed validation.
code string · Example: invalid_request

Stable machine-readable code. Branch on this field, not on detail.

instance string · Example: /api/v2/orders
requestId string · Example: req_01hxa3b4c5d6e7f8g9h0j1k2m3
timestamp string · Example: 2026-04-27T12:34:56.000Z
errors array<object>

Field-level validation errors when code is invalid_request.

errors[].pointer string required · Example: /items/0/eppCode
errors[].detail string required · Example: `eppCode` is required for this transfer.
errors[].code string required · Example: missing_required
extensions object
404 Not found. The resource does not exist or is not owned by the caller.
type string · Example: https://developer.hostup.se/errors/invalid_request
title string · Example: Validation failed
status integer · Example: 400
detail string · Example: The request body failed validation.
code string · Example: invalid_request

Stable machine-readable code. Branch on this field, not on detail.

instance string · Example: /api/v2/orders
requestId string · Example: req_01hxa3b4c5d6e7f8g9h0j1k2m3
timestamp string · Example: 2026-04-27T12:34:56.000Z
errors array<object>

Field-level validation errors when code is invalid_request.

errors[].pointer string required · Example: /items/0/eppCode
errors[].detail string required · Example: `eppCode` is required for this transfer.
errors[].code string required · Example: missing_required
extensions object
429 Rate limited. Retry after the limit resets. 429 responses include Retry-After seconds plus X-RateLimit-* headers.
type string · Example: https://developer.hostup.se/errors/invalid_request
title string · Example: Validation failed
status integer · Example: 400
detail string · Example: The request body failed validation.
code string · Example: invalid_request

Stable machine-readable code. Branch on this field, not on detail.

instance string · Example: /api/v2/orders
requestId string · Example: req_01hxa3b4c5d6e7f8g9h0j1k2m3
timestamp string · Example: 2026-04-27T12:34:56.000Z
errors array<object>

Field-level validation errors when code is invalid_request.

errors[].pointer string required · Example: /items/0/eppCode
errors[].detail string required · Example: `eppCode` is required for this transfer.
errors[].code string required · Example: missing_required
extensions object
500 Internal error. Retry later or contact support if the issue persists.
type string · Example: https://developer.hostup.se/errors/invalid_request
title string · Example: Validation failed
status integer · Example: 400
detail string · Example: The request body failed validation.
code string · Example: invalid_request

Stable machine-readable code. Branch on this field, not on detail.

instance string · Example: /api/v2/orders
requestId string · Example: req_01hxa3b4c5d6e7f8g9h0j1k2m3
timestamp string · Example: 2026-04-27T12:34:56.000Z
errors array<object>

Field-level validation errors when code is invalid_request.

errors[].pointer string required · Example: /items/0/eppCode
errors[].detail string required · Example: `eppCode` is required for this transfer.
errors[].code string required · Example: missing_required
extensions object
GET https://cloud.hostup.se/api/v2/audit-log
For AI assistants
View as Markdown
cURL
curl -X GET "https://cloud.hostup.se/api/v2/audit-log" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Accept: application/json"
Response
{
  "data": [
    {
      "id": "b95de54b-2d8d-45f1-96b9-2d2e5a3c02fb",
      "occurredAt": "2026-05-19T09:55:00.000Z",
      "method": "PUT",
      "endpoint": "/api/v2/dns-zones/zone_01hxa3b4c5d6e7f8g9h0j1k2m3/records/drr_01hxa3b4c5d6e7f8g9h0j1k2m4",
      "path": "/api/v2/dns-zones/zone_01hxa3b4c5d6e7f8g9h0j1k2m3/records/drr_01hxa3b4c5d6e7f8g9h0j1k2m4",
      "ipAddress": "203.0.113.25",
      "userAgent": "Mozilla/5.0",
      "statusCode": 200,
      "success": true,
      "durationMs": 214,
      "errorMessage": null,
      "authMethod": "session",
      "resourcesAccessed": [
        "v2_dns_zone:zone_01hxa3b4c5d6e7f8g9h0j1k2m3:record_update"
      ],
      "severity": "info",
      "tags": [
        "v2_dns_record_update"
      ],
      "eventSource": "request_audit",
      "actorType": null,
      "actorId": null,
      "category": "dns",
      "action": "dns_record_update",
      "summary": "Changed DNS record A @ -> 203.0.113.10.",
      "resourceLabel": "drr_01hxa3b4c5d6e7f8g9h0j1k2m4",
      "changes": [
        {
          "label": "Type",
          "before": null,
          "after": "A"
        },
        {
          "label": "Name",
          "before": null,
          "after": "@"
        },
        {
          "label": "Value",
          "before": null,
          "after": "203.0.113.10"
        },
        {
          "label": "TTL",
          "before": null,
          "after": "3600"
        }
      ]
    }
  ],
  "total": 1,
  "hasMore": false,
  "nextCursor": null
}