Skip to content

Platform API

13 operations. Every call needs a session cookie or an Authorization: Bearer nct_… token unless marked Public. Conventions, errors and scopes

GET/platform-services

Platform services: the catalog and what is set up

Services NebulaCtrl runs for its own use (S3 storage, a log store, a tailnet control server, single sign-on), each wired into the integration that asked for it.

Response 200 · OK · application/json
PlatformListing
  • PlatformKindView[] | nullrequired
  • projectIdstring
Errors
  • 401Unauthorized
  • 403Forbidden
  • 500Internal Server Error

Errors are RFC 9457 application/problem+json with a stable code field.

POST/platform-services

Set up a platform service for me

Stages the service in the team's system project, deploys it, then wires it into the integration (a backup destination, a log drain, the Tailscale integration or a sign-in provider) with generated credentials and tests the connection. Returns 202; poll the service (or listen to events) until status is ready or failed. Not idempotent-keyed: the response of the identity provider carries a one-time password.

Request body · application/json · required
ProvisionInputBody
  • bucketstring
    S3: the bucket (default nebulactrl-backups).
  • hostnamestring
    Public hostname; default a generated one under the server's base domain, else <ip>.sslip.io.
  • kindenum: s3 | loki | grafana | headscale | idp | registryrequired
    Which platform service to set up. registry: the managed container registry for build servers.
  • providerNamestring
    Single sign-on: the label of the sign-in button (default NebulaCtrl SSO).
  • publicUrlstring
    Overrides https://<hostname>: a proxy on a non-standard port, or plain http for a local test.
  • replaceboolean
    Headscale: replace an existing Tailscale integration.
  • retentionDaysinteger (int64)
    Loki: how long logs are kept (default 14).
  • serverIdstring
    The server it runs on (Grafana always runs next to Loki).
  • variantenum: pocketid | authelia
    Single sign-on: the product. pocketid (default): passkeys only, people managed in Pocket ID. authelia: password + 2FA, NebulaCtrl manages the people.
Response 202 · Accepted · application/json
PlatformProvisionBody
  • initialPasswordstring
    Shown once; reset it from the people list if lost.
  • initialUserstring
  • PlatformServiceViewrequired
Errors
  • 401Unauthorized
  • 403Forbidden
  • 409Conflict
  • 422Unprocessable Entity
  • 500Internal Server Error

Errors are RFC 9457 application/problem+json with a stable code field.

GET/platform-services/{id}

Get a platform service

ParameterInTypeDescription
idrequiredpathstring
Response 200 · OK · application/json
PlatformServiceView
  • PlatformBackupView
  • createdAtstring (date-time)required
  • map of stringrequired
  • environmentSlugstring
  • hostnamestringrequired
  • idstringrequired
  • kindenum: s3 | loki | grafana | headscale | idp | registryrequired
  • labelstringrequired
  • messagestringrequired
    What is happening or why it failed.
  • projectIdstring
  • publicUrlstringrequired
  • serverIdstring
  • serverNamestring
  • PlatformServiceRef[] | nullrequired
  • statusenum: provisioning | ready | failed | removingrequired
  • stepenum: configure | deploy | await | wire | donerequired
  • updatedAtstring (date-time)required
  • PlatformUserView[] | null
  • variantenum: pocketid | authelia
  • warningsstring[] | nullrequired
  • PlatformWiringView
Errors
  • 401Unauthorized
  • 403Forbidden
  • 404Not Found
  • 422Unprocessable Entity
  • 500Internal Server Error

Errors are RFC 9457 application/problem+json with a stable code field.

DELETE/platform-services/{id}

Remove a platform service and unwire its integration

confirm must equal the kind. The integration is removed first; an integration still in use (a backup destination with schedules or stored backups, a tailnet in use, people who sign in only through the provider) answers 409 and nothing changes. deleteData also deletes the data volumes.

ParameterInTypeDescription
idrequiredpathstring
confirmquerystringMust equal the kind.
deleteDataquerybooleanAlso delete the data volumes.
forcequerybooleanSingle sign-on: remove it although people can sign in only through it.
Response 204 · No Content

No body.

Errors
  • 401Unauthorized
  • 403Forbidden
  • 404Not Found
  • 409Conflict
  • 422Unprocessable Entity
  • 500Internal Server Error

Errors are RFC 9457 application/problem+json with a stable code field.

PUT/platform-services/{id}/backup

Schedule a daily volume backup of a platform service's data

Uses the volume backup feature (restic) with the chosen destination: daily at 03:17 UTC, 7 daily, 4 weekly and 3 monthly kept.

ParameterInTypeDescription
idrequiredpathstring
Request body · application/json · required
BackupInputBody
  • destinationIdstringrequired
Response 200 · OK · application/json
PlatformServiceView
  • PlatformBackupView
  • createdAtstring (date-time)required
  • map of stringrequired
  • environmentSlugstring
  • hostnamestringrequired
  • idstringrequired
  • kindenum: s3 | loki | grafana | headscale | idp | registryrequired
  • labelstringrequired
  • messagestringrequired
    What is happening or why it failed.
  • projectIdstring
  • publicUrlstringrequired
  • serverIdstring
  • serverNamestring
  • PlatformServiceRef[] | nullrequired
  • statusenum: provisioning | ready | failed | removingrequired
  • stepenum: configure | deploy | await | wire | donerequired
  • updatedAtstring (date-time)required
  • PlatformUserView[] | null
  • variantenum: pocketid | authelia
  • warningsstring[] | nullrequired
  • PlatformWiringView
Errors
  • 401Unauthorized
  • 403Forbidden
  • 404Not Found
  • 409Conflict
  • 422Unprocessable Entity
  • 500Internal Server Error

Errors are RFC 9457 application/problem+json with a stable code field.

POST/platform-services/{id}/reconnect

Run the wiring of a ready platform service again

Headscale mints a new API key and updates the Tailscale integration; the others re-create a missing destination or drain and test it again.

ParameterInTypeDescription
idrequiredpathstring
Response 202 · Accepted · application/json
PlatformServiceView
  • PlatformBackupView
  • createdAtstring (date-time)required
  • map of stringrequired
  • environmentSlugstring
  • hostnamestringrequired
  • idstringrequired
  • kindenum: s3 | loki | grafana | headscale | idp | registryrequired
  • labelstringrequired
  • messagestringrequired
    What is happening or why it failed.
  • projectIdstring
  • publicUrlstringrequired
  • serverIdstring
  • serverNamestring
  • PlatformServiceRef[] | nullrequired
  • statusenum: provisioning | ready | failed | removingrequired
  • stepenum: configure | deploy | await | wire | donerequired
  • updatedAtstring (date-time)required
  • PlatformUserView[] | null
  • variantenum: pocketid | authelia
  • warningsstring[] | nullrequired
  • PlatformWiringView
Errors
  • 401Unauthorized
  • 403Forbidden
  • 404Not Found
  • 409Conflict
  • 422Unprocessable Entity
  • 500Internal Server Error

Errors are RFC 9457 application/problem+json with a stable code field.

POST/platform-services/{id}/retry

Retry a failed platform service

ParameterInTypeDescription
idrequiredpathstring
Response 202 · Accepted · application/json
PlatformServiceView
  • PlatformBackupView
  • createdAtstring (date-time)required
  • map of stringrequired
  • environmentSlugstring
  • hostnamestringrequired
  • idstringrequired
  • kindenum: s3 | loki | grafana | headscale | idp | registryrequired
  • labelstringrequired
  • messagestringrequired
    What is happening or why it failed.
  • projectIdstring
  • publicUrlstringrequired
  • serverIdstring
  • serverNamestring
  • PlatformServiceRef[] | nullrequired
  • statusenum: provisioning | ready | failed | removingrequired
  • stepenum: configure | deploy | await | wire | donerequired
  • updatedAtstring (date-time)required
  • PlatformUserView[] | null
  • variantenum: pocketid | authelia
  • warningsstring[] | nullrequired
  • PlatformWiringView
Errors
  • 401Unauthorized
  • 403Forbidden
  • 404Not Found
  • 409Conflict
  • 422Unprocessable Entity
  • 500Internal Server Error

Errors are RFC 9457 application/problem+json with a stable code field.

POST/platform-services/{id}/reveal

Reveal the generated credentials of a platform service (audited)

ParameterInTypeDescription
idrequiredpathstring
Response 200 · OK · application/json
RevealOutputBody
  • PlatformCredential[] | nullrequired
Errors
  • 401Unauthorized
  • 403Forbidden
  • 404Not Found
  • 422Unprocessable Entity
  • 500Internal Server Error

Errors are RFC 9457 application/problem+json with a stable code field.

GET/platform-services/{id}/users

People of the single sign-on provider

ParameterInTypeDescription
idrequiredpathstring
Response 200 · OK · application/json
UsersOutputBody
  • PlatformUserView[] | nullrequired
Errors
  • 401Unauthorized
  • 403Forbidden
  • 404Not Found
  • 422Unprocessable Entity
  • 500Internal Server Error

Errors are RFC 9457 application/problem+json with a stable code field.

POST/platform-services/{id}/users

Add a person to the single sign-on provider (instance administrators)

Rewrites the users file in the service's configuration and deploys it. Without a password one is generated and returned once.

ParameterInTypeDescription
idrequiredpathstring
Request body · application/json · required
AddUserInputBody
  • displayNamestringrequired
  • emailstringrequired
  • passwordstring
    Empty generates one (returned once).
  • usernamestringrequired
Response 201 · Created · application/json
PlatformUserChange
  • applyingbooleanrequired
    The change is being deployed (the sign-in page restarts for a few seconds).
  • generatedPasswordstring
    Shown once.
  • PlatformUserViewrequired
  • warningstring
Errors
  • 401Unauthorized
  • 403Forbidden
  • 404Not Found
  • 409Conflict
  • 422Unprocessable Entity
  • 500Internal Server Error

Errors are RFC 9457 application/problem+json with a stable code field.

DELETE/platform-services/{id}/users/{username}

Remove a person from the single sign-on provider (instance administrators)

ParameterInTypeDescription
idrequiredpathstring
usernamerequiredpathstring
Response 200 · OK · application/json
PlatformUserChange
  • applyingbooleanrequired
    The change is being deployed (the sign-in page restarts for a few seconds).
  • generatedPasswordstring
    Shown once.
  • PlatformUserViewrequired
  • warningstring
Errors
  • 401Unauthorized
  • 403Forbidden
  • 404Not Found
  • 409Conflict
  • 422Unprocessable Entity
  • 500Internal Server Error

Errors are RFC 9457 application/problem+json with a stable code field.

POST/platform-services/{id}/users/{username}/reset-password

Set a new password for a person (instance administrators)

ParameterInTypeDescription
idrequiredpathstring
usernamerequiredpathstring
Request body · application/json · required
ResetInputBody
  • passwordstring
    Empty generates one (returned once).
Response 200 · OK · application/json
PlatformUserChange
  • applyingbooleanrequired
    The change is being deployed (the sign-in page restarts for a few seconds).
  • generatedPasswordstring
    Shown once.
  • PlatformUserViewrequired
  • warningstring
Errors
  • 401Unauthorized
  • 403Forbidden
  • 404Not Found
  • 409Conflict
  • 422Unprocessable Entity
  • 500Internal Server Error

Errors are RFC 9457 application/problem+json with a stable code field.