Skip to content

Settings API

Endpoints for managing instance-level configuration.

Get Artifact Storage Settings

GET /v1/settings/artifact-storage

Authentication: User session (Bearer, read access to instance_settings)

Response 200 OK

Returns ArtifactStorageSettingsResponse.


Update Artifact Storage Settings

PUT /v1/settings/artifact-storage

Authentication: User session (Bearer, write access to instance_settings)

Request body

Uses UpdateArtifactStorageSettingsRequest.

Error responses

StatusCodeDescription
400invalid_local_base_dir / invalid_s3_bucket / invalid_s3_endpoint / missing_s3_credentialsProvider-specific validation failed
403insufficient_roleCaller lacks write permission

Get Instance Preferences

GET /v1/settings/preferences

Authentication: User session (Bearer, read access to instance_settings)

Response 200 OK

json
{
  "preferences": {
    "key_storage_mode": "file",
    "runtime_mode": "local",
    "restart_required": true,
    "updated_at": 1738886400
  }
}

Get External Access Network Settings

GET /v1/settings/external-access/network

Returns the effective External Access network configuration used by runtime auth and preflight checks.

Authentication: User session (Bearer, read access to instance_settings)

Response 200 OK

json
{
  "settings": {
    "public_url": "https://ci.example.com",
    "allowed_origins": [
      "http://localhost:3000",
      "http://127.0.0.1:3000",
      "https://ci.example.com"
    ],
    "source": "database",
    "updated_at": 1738886400
  }
}

Update External Access Network Settings

PUT /v1/settings/external-access/network

Owner-only endpoint to update External Access network settings (public_url, allowed_origins).

Authentication: User session (Bearer, write access to instance_settings, role owner)

Request body

json
{
  "public_url": "https://ci.example.com",
  "allowed_origins": [
    "http://localhost:3000",
    "http://127.0.0.1:3000",
    "https://ci.example.com"
  ]
}

Error responses

StatusCodeDescription
400invalid_inputPublic URL/origin format is invalid
400external_access_https_requiredPublic URL is not HTTPS
400external_access_origin_not_allowedPublic URL origin missing from allowed_origins
403external_access_owner_requiredNon-owner attempted update
403external_access_loopback_requiredIn local mode, update attempted from non-loopback client

External Access Preflight

GET /v1/settings/external-access/preflight

Returns check-by-check readiness required before enabling External Access (runtime_mode=remote).

Authentication: User session (Bearer, read access to instance_settings)

Response 200 OK

json
{
  "ready": false,
  "checks": [
    {
      "id": "public_url_https",
      "label": "Public URL is configured with HTTPS",
      "ok": false,
      "message": "Public URL must use https for External Access.",
      "failure_code": "external_access_https_required"
    }
  ]
}

Configure External Access OIDC

PUT /v1/settings/external-access/oidc

Owner-only endpoint for configuring OIDC after setup is already complete. This enables local-first instances to satisfy External Access readiness without re-running setup.

Authentication: User session (Bearer, write access to instance_settings, role owner)

Request body

json
{
  "issuer_url": "https://accounts.google.com",
  "client_id": "your-client-id",
  "client_secret": "optional-client-secret"
}

Response 200 OK

json
{
  "discovered_issuer": "https://accounts.google.com",
  "has_client_secret": true,
  "configured_at": 1738886400
}

Error responses

StatusCodeDescription
400invalid_inputIssuer/client values are invalid
400oidc_discovery_failedProvider discovery failed
403external_access_owner_requiredNon-owner attempted update
409invalid_stateSetup is not yet ready

Update Instance Preferences

PUT /v1/settings/preferences

Authentication: User session (Bearer, write access to instance_settings)

Request body

json
{
  "key_storage_mode": "file",
  "runtime_mode": "remote"
}

Runtime mode mutation rules

  • Changing runtime_mode is owner-only.
  • Enabling runtime_mode=remote runs hard External Access preflight and fails closed if any required check fails.
  • Any runtime mode change revokes all active sessions.

Error responses

StatusCodeDescription
400unsupported_key_storage_modeOnly file mode is allowed in this release
400external_access_preflight_failedGeneric preflight failure
400external_access_public_url_missingPublic URL is missing/invalid/loopback
400external_access_https_requiredPublic URL is not HTTPS
400external_access_origin_not_allowedPublic origin not allowlisted in CORS
403external_access_owner_requiredNon-owner attempted runtime mode change

Self-hosted mobile CI, built for Flutter.