Bootstrap

First-run setup of a fresh control plane.

10 endpoints · Plakar Control Plane v0.18 · Base URL, authentication and errors

Get the bootstrap account

GET /api/v1/bootstrap/account
No authentication

Response 200 OK application/json

  • account string
  • auth_provider string
  • avatar_url string
  • email string
  • must_reset_password boolean nullable
  • name string
  • organization_id string<uuid>
  • user_id string<uuid>

Errors

  • 400 Bad Request (validation or deserialization error)
  • 500 Internal Server Error (panics)

Every error returns the standard error body.

Request

curl 'https://pcp.example.com/api/v1/bootstrap/account'

Response 200

{
  "account": "string",
  "auth_provider": "string",
  "avatar_url": "string",
  "email": "string",
  "must_reset_password": true,
  "name": "string",
  "organization_id": "3f1e4a2c-9b7d-4e0f-8a11-2c5d6e7f8a90",
  "user_id": "3f1e4a2c-9b7d-4e0f-8a11-2c5d6e7f8a90"
}

Enroll the control plane

POST /api/v1/bootstrap/enroll
No authentication

Request body application/json required

  • email string required
  • name string required
  • organization_id string<uuid>
  • password string required

Response 200 OK application/json

  • token string

Errors

  • 400 Bad Request (validation or deserialization error)
  • 500 Internal Server Error (panics)

Every error returns the standard error body.

Request

curl -X POST 'https://pcp.example.com/api/v1/bootstrap/enroll' \
  -H 'Content-Type: application/json' \
  -d '{
  "email": "string",
  "name": "string",
  "organization_id": "3f1e4a2c-9b7d-4e0f-8a11-2c5d6e7f8a90",
  "password": "string"
}'

Response 200

{
  "token": "string"
}

Enroll the control plane from a license

POST /api/v1/bootstrap/enroll/license
No authentication

Request body application/json required

  • email string required
  • license string required
  • name string required
  • organization_name string nullable
  • password string required

Response 200 OK application/json

  • token string

Errors

  • 400 Bad Request (validation or deserialization error)
  • 500 Internal Server Error (panics)

Every error returns the standard error body.

Request

curl -X POST 'https://pcp.example.com/api/v1/bootstrap/enroll/license' \
  -H 'Content-Type: application/json' \
  -d '{
  "email": "string",
  "license": "string",
  "name": "string",
  "organization_name": "string",
  "password": "string"
}'

Response 200

{
  "token": "string"
}

Preview a license

POST /api/v1/bootstrap/enroll/license/preview
No authentication
Verifies a license and reports what it describes. Nothing is persisted.

Request body application/json required

  • license string required

Response 200 OK application/json

  • expires_at string<date-time>
  • mode string
  • organization_id string<uuid>
  • organization_name string
  • plan string

Errors

  • 400 Bad Request (validation or deserialization error)
  • 500 Internal Server Error (panics)

Every error returns the standard error body.

Request

curl -X POST 'https://pcp.example.com/api/v1/bootstrap/enroll/license/preview' \
  -H 'Content-Type: application/json' \
  -d '{
  "license": "string"
}'

Response 200

{
  "expires_at": "2026-01-01T00:00:00Z",
  "mode": "string",
  "organization_id": "3f1e4a2c-9b7d-4e0f-8a11-2c5d6e7f8a90",
  "organization_name": "string",
  "plan": "string"
}

Enroll the control plane offline

POST /api/v1/bootstrap/enroll/offline
No authentication

Request body application/json required

  • email string required
  • license string required
  • name string required
  • organization_name string required
  • password string required

Response 200 OK application/json

  • token string

Errors

  • 400 Bad Request (validation or deserialization error)
  • 500 Internal Server Error (panics)

Every error returns the standard error body.

Request

curl -X POST 'https://pcp.example.com/api/v1/bootstrap/enroll/offline' \
  -H 'Content-Type: application/json' \
  -d '{
  "email": "string",
  "license": "string",
  "name": "string",
  "organization_name": "string",
  "password": "string"
}'

Response 200

{
  "token": "string"
}

Preview an offline enrollment

POST /api/v1/bootstrap/enroll/offline/preview
No authentication
Runs the offline enrollment validation and reports what it would create. Nothing is persisted.

Request body application/json required

  • email string required
  • license string required
  • name string required
  • organization_name string required
  • password string required

Response 200 OK application/json

  • admin_email string
  • admin_name string
  • expires_at string<date-time>
  • identity_id string<uuid>
  • issued_at string<date-time>
  • mode string
  • organization_id string<uuid>
  • organization_name string
  • plan string
  • valid boolean

Errors

  • 400 Bad Request (validation or deserialization error)
  • 500 Internal Server Error (panics)

Every error returns the standard error body.

Request

curl -X POST 'https://pcp.example.com/api/v1/bootstrap/enroll/offline/preview' \
  -H 'Content-Type: application/json' \
  -d '{
  "email": "string",
  "license": "string",
  "name": "string",
  "organization_name": "string",
  "password": "string"
}'

Response 200

{
  "admin_email": "string",
  "admin_name": "string",
  "expires_at": "2026-01-01T00:00:00Z",
  "identity_id": "3f1e4a2c-9b7d-4e0f-8a11-2c5d6e7f8a90",
  "issued_at": "2026-01-01T00:00:00Z",
  "mode": "string",
  "organization_id": "3f1e4a2c-9b7d-4e0f-8a11-2c5d6e7f8a90",
  "organization_name": "string",
  "plan": "string",
  "valid": true
}

Start a bootstrap login

POST /api/v1/bootstrap/login
No authentication

Request body application/json required

  • email string required
  • redirect boolean

Response 200 OK application/json

  • URL string nullable
  • poll_id string
  • token string nullable

Errors

  • 400 Bad Request (validation or deserialization error)
  • 500 Internal Server Error (panics)

Every error returns the standard error body.

Request

curl -X POST 'https://pcp.example.com/api/v1/bootstrap/login' \
  -H 'Content-Type: application/json' \
  -d '{
  "email": "string",
  "redirect": true
}'

Response 200

{
  "URL": "string",
  "poll_id": "string",
  "token": "string"
}

Poll a bootstrap login

POST /api/v1/bootstrap/login/poll
No authentication

Request body application/json required

  • completion_code string nullable
  • poll_id string required

Response 200 OK application/json

  • token string

Response 202 The login is still pending

No response body.

Errors

  • 400 Bad Request (validation or deserialization error)
  • 500 Internal Server Error (panics)

Every error returns the standard error body.

Request

curl -X POST 'https://pcp.example.com/api/v1/bootstrap/login/poll' \
  -H 'Content-Type: application/json' \
  -d '{
  "completion_code": "string",
  "poll_id": "string"
}'

Response 200

{
  "token": "string"
}

List the organizations available to enroll

GET /api/v1/bootstrap/organizations
No authentication

Response 200 OK application/json

  • created_at string<date-time>
  • id string<uuid>
  • info map[string]
  • name string
  • parent_id string<uuid>
  • revision integer
  • type string
  • updated_at string<date-time>

Errors

  • 400 Bad Request (validation or deserialization error)
  • 500 Internal Server Error (panics)

Every error returns the standard error body.

Request

curl 'https://pcp.example.com/api/v1/bootstrap/organizations'

Response 200

[
  {
    "created_at": "2026-01-01T00:00:00Z",
    "id": "3f1e4a2c-9b7d-4e0f-8a11-2c5d6e7f8a90",
    "info": {
      "key": "string"
    },
    "name": "string",
    "parent_id": "3f1e4a2c-9b7d-4e0f-8a11-2c5d6e7f8a90",
    "revision": 0,
    "type": "string",
    "updated_at": "2026-01-01T00:00:00Z"
  }
]

Create an organization to enroll

POST /api/v1/bootstrap/organizations
No authentication

Request body application/json required

  • info map[string]
  • name string required

Response 200 OK application/json

  • created_at string<date-time>
  • id string<uuid>
  • info map[string]
  • name string
  • parent_id string<uuid>
  • revision integer
  • type string
  • updated_at string<date-time>

Errors

  • 400 Bad Request (validation or deserialization error)
  • 500 Internal Server Error (panics)

Every error returns the standard error body.

Request

curl -X POST 'https://pcp.example.com/api/v1/bootstrap/organizations' \
  -H 'Content-Type: application/json' \
  -d '{
  "info": {
    "key": "string"
  },
  "name": "string"
}'

Response 200

{
  "created_at": "2026-01-01T00:00:00Z",
  "id": "3f1e4a2c-9b7d-4e0f-8a11-2c5d6e7f8a90",
  "info": {
    "key": "string"
  },
  "name": "string",
  "parent_id": "3f1e4a2c-9b7d-4e0f-8a11-2c5d6e7f8a90",
  "revision": 0,
  "type": "string",
  "updated_at": "2026-01-01T00:00:00Z"
}