API

Everything the dashboard shows, as JSON – with your own keys and permissions.

The API serves the same data as the dashboard. It is meant for your own reports, status pages, automation and integration with existing tools.

Authentication #

Create a key under Settings → API. Pass it as a bearer token:

curl -H "Authorization: Bearer n64_your_key" \
     https://app.node64.de/api/v1/me

The key is shown once. We store only its hash.

Permissions #

Every key gets exactly the permissions you select:

PermissionAllows
account:readread account and user data
devices:readread devices, groups and uploads
devices:writeedit devices, create groups, delete devices
findings:readread findings
alerts:readread alerts and rules

A key for a status page needs findings:read – nothing more.

Endpoints #

MethodPathPurpose
GET/api/v1/meaccount, user, plan
GET/api/v1/devicesall devices
GET/api/v1/devices/{id}one device with details
PATCH/api/v1/devices/{id}change a device (name, group, role)
DELETE/api/v1/devices/{id}remove a device
GET/api/v1/groupsdevice groups
POST/api/v1/groupscreate a group
GET/api/v1/findingsfindings, filterable
GET/api/v1/uploadsupload history
GET/api/v1/alertstriggered alerts
GET/api/v1/openapi.jsonthe specification

Examples #

All open findings at "high" and above:

curl -H "Authorization: Bearer $KEY" \
     "https://app.node64.de/api/v1/findings?severity=high&status=open"

When each device last reported:

curl -s -H "Authorization: Bearer $KEY" \
     https://app.node64.de/api/v1/devices | jq '.data[] | {name, last_seen_at, agent_version}'

There is no score – not in the API either. Why, is under Understanding findings.

Response format #

{
  "data": [ ... ],
  "meta": { "count": 12 }
}

Errors come with a matching status code and a body:

{ "error": "forbidden", "message": "Missing scope: findings:read" }

Limits #

  • Read and manage, not control. There is no endpoint that runs anything on a device – for the same reason the agent has no command channel.
  • Rate limit per key. Hitting a limit returns 429; wait a moment.
  • Versioned. /api/v1/ stays stable; breaking changes get /api/v2/.

OpenAPI #

The full specification lives at /api/v1/openapi.json and imports into any API client.

Something unclear?

If anything is missing or hard to follow, tell us – these pages grow with the questions.

Ask a question