F5 Insight API (v2.0.0)

Download OpenAPI specification:Download

Unified API for F5 Insight monitoring and analytics platform including device management, system operations, and AI-powered insights

Authentication

BearerAuth

JWT ACCESS TOKEN for authenticated requests.

IMPORTANT:

  • Use ACCESS TOKEN (short-lived, 5 min) in Authorization header: "Bearer "
  • Use REFRESH TOKEN (long-lived, 10 hrs) ONLY in request body for /auth/refresh endpoint
  • DO NOT use refresh token in Authorization header - it will fail!

Example: Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...

Security Scheme Type HTTP
HTTP Authorization Scheme bearer
Bearer format "JWT"

bearerAuth

JWT token-based authentication

Security Scheme Type HTTP
HTTP Authorization Scheme bearer
Bearer format "JWT"

basicAuth

Basic authentication

Security Scheme Type HTTP
HTTP Authorization Scheme basic

Authentication

User login

Authenticates a user.

By default (no federated query param) this validates the username and password from the request body via the local PAM/DB credential path and returns a JSON token pair. This is the historical behaviour of this endpoint and is preserved for backward compatibility.

When federated=true, the browser is instead redirected (302) through the OIDC authorization-code flow; the identity broker then routes to the local user / LDAP / SAML flow per its policy. No request body is consumed in this mode. If OIDC is not configured for the deployment, the PAM path is used even when federated=true is supplied.

query Parameters
federated
boolean
Default: false

When true, redirect (302) through the OIDC flow instead of performing a PAM credential login. Defaults to false (PAM).

Request Body schema: application/json
username
required
string

Username for authentication

password
required
string <password>

User password

Responses

200

Login successful

302

Redirect to the OIDC authorization endpoint. Returned only when federated=true and OIDC is configured.

400

Invalid request

401

Invalid credentials

500

Internal server error

post/api/auth/login
/api/auth/login

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "username": "admin",
  • "password": "password123"
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
  • "token_type": "Bearer",
  • "expires_in": 900
}

Refresh access token

Refreshes the access token using the refresh token stored in httpOnly cookie. No request body required - refresh token is read from cookie.

Responses

200

Token refreshed successfully

401

Invalid or expired refresh token

500

Internal server error

post/api/auth/refresh
/api/auth/refresh

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
  • "token_type": "Bearer",
  • "expires_in": 900
}

Logout user (revoke refresh token)

Logs out the user by revoking the refresh token stored in httpOnly cookie. No request body required - refresh token is read from cookie.

Responses

200

Logout successful

500

Internal server error

post/api/auth/logout
/api/auth/logout

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "message": "Operation successful"
}

Logout from all devices

Responses

200

Logged out from all devices successfully

401

Unauthorized

500

Internal server error

post/api/auth/logout-all
/api/auth/logout-all

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "message": "Operation successful"
}

Change user password

Change user password using username and password. Can be called either with or without Bearer token:

  • With token: User can change their own password
  • Without token: Authentication is done with username and password (for expired password scenarios)
Request Body schema: application/json
username
required
string

Username

old_password
required
string <password>

Current password

new_password
required
string <password>

New password

Responses

200

Password changed successfully

400

Invalid request

401

Invalid credentials or unauthorized

500

Internal server error

post/api/auth/change-password
/api/auth/change-password

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "username": "admin",
  • "old_password": "oldpassword123",
  • "new_password": "newpassword123"
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "message": "Operation successful"
}

Initiate OIDC login

Starts the OIDC authorization code flow with PKCE. Returns a 302 redirect to the configured identity provider authorization endpoint.

Supports two content types for the optional idp_type field:

application/x-www-form-urlencoded (recommended for browser forms): idp_type=ldap or idp_type=saml

application/json: {"idp_type": "ldap"} or {"idp_type": "saml"}

When idp_type is ldap or saml, the organization-scoped external login policy is applied so LDAP/SAML IDPs are shown on the login page. Omitting idp_type (or sending an empty body) shows the instance-level login screen.

Request Body schema:
idp_type
string
Enum: "ldap" "saml"

Set to 'ldap' or 'saml' to show organization-scoped identity providers on the login page.

Responses

302

Redirect to configured identity provider authorization endpoint

400

Invalid idp_type value or malformed request body

500

Internal server error

501

OIDC not configured

post/api/auth/login/external
/api/auth/login/external

Request samples

Content type
Copy
idp_type=ldap

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "error": "string"
}

Machine (M2M) login

Authenticates a machine-to-machine (M2M) service user using its client_id/client_secret via the OAuth2 client_credentials grant against the configured identity provider. On success the service user's F5 Insights role is resolved and an F5 Insights access token is returned as JSON.

Unlike the browser login flow, no session cookie is set: the caller supplies the returned access token via the Authorization: Bearer <token> header on subsequent API requests. Service users re-authenticate by calling this endpoint again rather than using a refresh cookie.

Request Body schema: application/json
client_id
required
string

Service user client_id

client_secret
required
string <password>

Service user client_secret (surfaced at create/rotate)

Responses

200

Machine authentication successful

400

Invalid request body

401

Invalid machine credentials

500

Internal server error

post/api/auth/login/machine
/api/auth/login/machine

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "client_id": "my-service-account",
  • "client_secret": "FfDWHLqOGr1vdiJ3203EhwzzTac7hncm3ppgDDvfW4l8cOcChBPh4Q8zzyWsuxc7"
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
  • "token_type": "Bearer",
  • "expires_in": 900
}

OIDC authorization callback

The configured identity provider redirects the browser here after successful user authentication. Exchanges the authorization code for tokens, stores them in a server-side session, sets an HttpOnly session cookie, and redirects the browser to the React SPA.

query Parameters
code
required
string

Authorization code returned by the identity provider

state
required
string

State parameter for CSRF protection

Responses

302

Redirect to React SPA after successful token exchange

400

Missing or invalid parameters

500

Internal server error

501

OIDC not configured

get/api/auth/callback
/api/auth/callback

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "status": 0,
  • "message": "string",
  • "code": "string",
  • "category": "string",
  • "help": "string"
}

Retrieve external login session token

Called by the React SPA after landing on /auth/callback. Reads the HttpOnly session cookie and returns the F5 Insight access token details needed by the SPA.

Responses

200

Session token retrieved successfully

401

No valid session cookie or session expired

500

Internal server error

501

OIDC not configured

get/api/auth/session
/api/auth/session

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "access_token": "string",
  • "id_token": "string",
  • "refresh_token": "string",
  • "token_type": "Bearer",
  • "expires_in": 0
}

Authorization

Provider group/resource attribute → Role mapping management (authZ). Admin-only APIs for configuring which LDAP/SAML group values map to which F5 Insight roles. Also includes the internal identity-provider webhook endpoint for runtime group resolution.

Get current user permissions

Returns the authenticated user's F5 Insight role and the permissions granted to that role. Used by the frontend to enable or hide role-based UI actions. Requires authentication.

Responses

200

Current user permissions retrieved successfully

401

Unauthorized – missing or invalid JWT

403

Forbidden – role information missing from JWT context

404

Role not found

500

Internal server error

get/api/auth/me/permissions
/api/auth/me/permissions

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "user_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  • "role_id": "550e8400-e29b-41d4-a716-446655440001",
  • "role_name": "Operator",
  • "permissions":
    [
    ],
  • "grouped_permissions":
    {
    }
}

Create a custom role

Request Body schema: application/json
name
required
string [ 1 .. 100 ] characters
description
string <= 500 characters
permissions
required
Array of strings

Responses

201

Role created successfully

400

Invalid role or permission

403

Admin role required

409

Role already exists

post/api/auth/roles
/api/auth/roles

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "name": "string",
  • "description": "string",
  • "permissions":
    [
    ]
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "id": "550e8400-e29b-41d4-a716-446655440000",
  • "name": "Admin",
  • "description": "Full system access including user management",
  • "is_builtin": true,
  • "user_count": 2,
  • "created_at": "2026-01-01T00:00:00Z",
  • "permissions":
    [
    ]
}

List all roles

Returns all available system roles with user counts. Used to populate the role selector when creating or updating a group mapping. Requires admin role.

query Parameters
include_permissions
boolean
Default: false

Include permission mappings when available.

Responses

200

List of roles retrieved successfully

401

Unauthorized – missing or invalid JWT

403

Caller is not an admin

500

Internal server error

get/api/auth/roles
/api/auth/roles

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "roles":
    [
    ],
  • "total_count": 2
}

Replace custom role permissions

path Parameters
role_id
required
string <uuid>
Request Body schema: application/json
permissions
required
Array of strings

Responses

200

Role permissions replaced successfully

400

Invalid permission

403

Admin role required

404

Role not found

put/api/auth/roles/{role_id}/permissions
/api/auth/roles/{role_id}/permissions

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "permissions":
    [
    ]
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "id": "550e8400-e29b-41d4-a716-446655440000",
  • "name": "Admin",
  • "description": "Full system access including user management",
  • "is_builtin": true,
  • "user_count": 2,
  • "created_at": "2026-01-01T00:00:00Z",
  • "permissions":
    [
    ]
}

Delete a custom role

path Parameters
role_id
required
string <uuid>

Responses

204

Role deleted successfully

403

Admin role required or builtin role

404

Role not found

409

Role is builtin or still referenced

delete/api/auth/roles/{role_id}
/api/auth/roles/{role_id}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "error": "string"
}

Get role by ID

Returns a single role by its UUID, including its full permission list. Requires admin role.

path Parameters
role_id
required
string <uuid>

UUID of the role to retrieve

Responses

200

Role retrieved successfully

401

Unauthorized – missing or invalid JWT

403

Caller is not an admin

404

Role not found

500

Internal server error

get/api/auth/roles/{role_id}
/api/auth/roles/{role_id}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "id": "550e8400-e29b-41d4-a716-446655440000",
  • "name": "Admin",
  • "description": "Full system access including user management",
  • "is_builtin": true,
  • "user_count": 2,
  • "created_at": "2026-01-01T00:00:00Z",
  • "permissions":
    [
    ]
}

List all provider group → role mappings

Returns configured mappings grouped by identity provider and role. Requires admin role.

Responses

200

List of group mappings retrieved successfully

401

Unauthorized

403

Caller is not an admin

500

Internal server error

get/api/auth/group-mappings
/api/auth/group-mappings

Response samples

Content type
application/json
Copy
Expand all Collapse all
[
  • {
    }
]

Get provider groups mapped to a role

Returns all provider-scoped grouped mappings for the given role_id. Requires admin role.

path Parameters
role_id
required
string <uuid>

UUID of the F5 Insight role

Responses

200

Group mappings retrieved successfully

400

Invalid role_id

401

Unauthorized

403

Caller is not an admin

500

Internal server error

get/api/auth/group-mappings/{role_id}
/api/auth/group-mappings/{role_id}

Response samples

Content type
application/json
Copy
Expand all Collapse all
[
  • {
    }
]

Replace provider groups mapped to a role

Creates or fully replaces the grouped_resource_attribute list for the given provider_id and role_id. Sending an empty grouped_resource_attribute array clears mappings for that provider/role. Requires admin role.

path Parameters
role_id
required
string <uuid>

UUID of the F5 Insight role

Request Body schema: application/json
provider_id
required
string non-empty

Identity provider ID

grouped_resource_attribute
required
Array of strings

Group/resource attribute values to map to the role in the path

Responses

200

Group mapping replaced successfully

400

Invalid request body or role_id not found

401

Unauthorized

403

Forbidden – admin role required

500

Internal server error

put/api/auth/group-mappings/{role_id}
/api/auth/group-mappings/{role_id}

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "provider_id": "ldap-id-123\"",
  • "grouped_resource_attribute":
    [
    ]
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "provider_id": "ldap-id-123",
  • "role_id": "550e8400-e29b-41d4-a716-446655440000",
  • "role":
    {
    },
  • "grouped_resource_attribute":
    [
    ],
  • "created_at": "2026-10-29T14:02:58Z",
  • "updated_at": "2026-10-29T14:02:58Z",
  • "created_by": "string",
  • "updated_by": "string"
}

Add provider groups to a role

Adds or moves the provided grouped_resource_attribute values to the given provider_id and role_id without removing other values already mapped to that role. Requires admin role.

path Parameters
role_id
required
string <uuid>

UUID of the F5 Insight role

Request Body schema: application/json
provider_id
required
string non-empty

Identity provider ID

grouped_resource_attribute
required
Array of strings

Group/resource attribute values to map to the role in the path

Responses

200

Group mapping patched successfully

400

Invalid request body or role_id not found

401

Unauthorized

403

Forbidden – admin role required

500

Internal server error

patch/api/auth/group-mappings/{role_id}
/api/auth/group-mappings/{role_id}

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "provider_id": "ldap-id-123",
  • "grouped_resource_attribute":
    [
    ]
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "provider_id": "ldap-id-123",
  • "role_id": "550e8400-e29b-41d4-a716-446655440000",
  • "role":
    {
    },
  • "grouped_resource_attribute":
    [
    ],
  • "created_at": "2026-10-29T14:02:58Z",
  • "updated_at": "2026-10-29T14:02:58Z",
  • "created_by": "string",
  • "updated_by": "string"
}

Delete provider groups mapped to a role

Deletes the grouped mapping for the given provider_id and role_id. This removes all grouped_resource_attribute values currently mapped to that provider/role pair. Requires admin role.

path Parameters
role_id
required
string <uuid>

UUID of the F5 Insight role

Request Body schema: application/json
provider_id
required
string non-empty

Identity provider ID

Responses

204

Group mapping deleted successfully

400

Missing provider_id or invalid role_id

401

Unauthorized

403

Forbidden – admin role required

404

Group mapping not found

500

Internal server error

delete/api/auth/group-mappings/{role_id}
/api/auth/group-mappings/{role_id}

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "provider_id": "ldap-id-123"
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "error": "string"
}

AIDF Insights

Get AIDF security insights

Returns cached security insights from AIDF including alerts, calculated application scores, deductions, and device findings. Requires AIDF to be configured.

query Parameters
start_time
string <date-time>
end_time
string <date-time>
devices
string

Comma-separated device names to include in the scorecard

Responses

200

AIDF insights retrieved successfully, grouped by application

400

Bad request or AIDF not configured

500

Internal server error

get/api/ai-integrations/aidf/insights
/api/ai-integrations/aidf/insights

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "fleetSecurityScore":
    {
    },
  • "applications":
    [
    ]
}

Get AIDF workload classifications

Returns cached workload classification insights from AIDF. Classification traffic statistics are intentionally not exposed by this endpoint. Requires AIDF to be configured.

query Parameters
start_time
string <date-time>
end_time
string <date-time>
devices
string

Comma-separated device names to include

Responses

200

AIDF classifications retrieved successfully (flattened feed items)

400

Bad request or AIDF not configured

500

Internal server error

get/api/ai-integrations/aidf/classifications
/api/ai-integrations/aidf/classifications

Response samples

Content type
application/json
Copy
Expand all Collapse all
[
  • {
    }
]

AuditConsole

List AI assistant audit events

Returns a paginated, filterable list of AI assistant audit events from ClickHouse. Each row represents one agent action (user message, assistant response, tool call, tool result, error, data access, or PDF export). Requires the audit.read permission. PII fields (ip_address, user_agent, message, tool_arguments, tool_result) are masked unless the caller also holds the audit.view_sensitive permission and passes view_sensitive=true.

query Parameters
page
integer >= 1
Default: 1

Page number (1-based).

size
integer [ 1 .. 100 ]
Default: 20

Results per page (max 100).

username
string

Case-insensitive substring match on the username field.

event_type
string
Enum: "user_message" "assistant_response" "tool_call" "tool_result" "error" "data_access" "pdf_export"

Exact match on event_type.

tool
string

Case-insensitive substring match on tool_name.

keyword
string

Case-insensitive substring match on message OR tool_name.

thread_id
string

Exact match on thread_id (conversation ID).

interaction_id
string

Exact match on interaction_id.

session_id
string

Exact match on session_id.

date_from
string <date-time>

Return events at or after this timestamp (RFC 3339).

date_to
string <date-time>

Return events at or before this timestamp (RFC 3339).

view_sensitive
boolean
Default: false

When true (and the caller has audit.view_sensitive permission), PII fields are returned unmasked.

Responses

200

Paginated list of audit events

401

Unauthorized - authentication required or token invalid

403

Insufficient permissions (requires audit.read)

500

Internal Error

503

Audit storage (ClickHouse) unavailable

get/api/audit/events
/api/audit/events

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "events":
    [
    ],
  • "pagination":
    {
    }
}

Request an audit export (CSV)

Generates a CSV export of audit events matching the supplied filters. For ≤10 000 matching rows the export is generated synchronously and the response includes a download_url. For >10 000 rows the job is queued asynchronously; the response is 202 Accepted with status: processing and a status_url to poll. Exports are cached on disk for 30 minutes and deleted after download. A per-user limit of 5 concurrent exports is enforced.

query Parameters
view_sensitive
boolean
Default: false

Include unmasked PII in the CSV (requires audit.view_sensitive permission).

Request Body schema: application/json
username
string
event_type
string
Enum: "user_message" "assistant_response" "tool_call" "tool_result" "error" "data_access" "pdf_export"
tool
string
keyword
string
thread_id
string
session_id
string
date_from
string <date-time>
date_to
string <date-time>

Responses

200

Export ready for download (synchronous path, ≤10 000 rows)

202

Export queued for background processing (>10 000 rows)

401

Unauthorized - authentication required or token invalid

403

Insufficient permissions (requires audit.export)

413

Export exceeds the maximum row limit (5 000 000 rows)

429

Per-user concurrent export limit reached (max 5)

500

Internal Error

503

Audit storage unavailable

post/api/audit/export
/api/audit/export

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "username": "string",
  • "event_type": "user_message",
  • "tool": "string",
  • "keyword": "string",
  • "thread_id": "string",
  • "session_id": "string",
  • "date_from": "2026-10-29T14:02:58Z",
  • "date_to": "2026-10-29T14:02:58Z"
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "export_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
  • "status": "ready",
  • "download_url": "/api/audit/export/3fa85f64-5717-4562-b3fc-2c963f66afa6",
  • "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
  • "row_count": 42
}

Download an audit export CSV

Streams the CSV file for the given export ID. The file is deleted from the server after a successful download. If the export is still being processed, returns 202. If the export has expired (TTL 30 min), returns 410 Gone.

path Parameters
id
required
string <uuid>

Export ID returned by POST /audit/export.

Responses

200

CSV file download

401

Unauthorized - authentication required or token invalid

404

Export not found or already downloaded

410

Export has expired (TTL exceeded)

500

Internal Error

get/api/audit/export/{id}
/api/audit/export/{id}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "status": 401,
  • "message": "Unauthorized"
}

Backup

List backups

Returns a list of all backup and restore jobs

Responses

200

List of jobs

500

Failed to list backups

get/api/system/backups
/api/system/backups

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "success": true,
  • "data":
    [
    ]
}

Create a backup

Triggers a backup operation. Returns a job ID to track progress.

Request Body schema: application/json
name
string

Optional backup name. If omitted, auto-generated as backup-YYYYMMDD-HHMMSS.

backup_type
string
Default: "full"
Enum: "full" "config"

Type of backup to create. Full backups require a remote storage target and are not supported on local storage; config backups may be stored locally.

passphrase
required
string >= 12 characters

Encryption passphrase. Must be at least 12 characters with uppercase, lowercase, digit, and special character. Max 2 consecutive identical characters.

storage_target
string

Name of the storage target to associate with this backup. Required for full backups (must be a remote target). If omitted, a config backup is stored locally.

Responses

202

Backup started

400

Invalid request. Includes SYSTEM-0003 when a full backup is requested without a remote storage target (full backups are not supported on local storage), an invalid backup name/passphrase, or an unknown storage target.

409

Another backup/restore is in progress or the requested backup name is already taken

500

Failed to create the backup job

503

Platform manager is unavailable

post/api/system/backups
/api/system/backups

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "name": "string",
  • "backup_type": "full",
  • "passphrase": "stringstring",
  • "storage_target": "string"
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "success": true,
  • "data":
    {
    }
}

Backup size anomaly analysis

Compares the most recent completed backup size against the rolling average of the previous 3 completed backups. Returns is_anomalous=true when the latest backup is more than 30% smaller than the rolling average (pct_of_avg < 70).

Responses

200

Analysis result

500

Failed to calculate backup analysis

get/api/system/backups/analysis
/api/system/backups/analysis

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "success": true,
  • "data":
    {
    }
}

Get backup details

Returns details of a specific backup job including live progress

path Parameters
id
required
string <uuid>

Responses

200

Backup details

404

Backup not found

get/api/system/backups/{id}
/api/system/backups/{id}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "success": true,
  • "data":
    {
    }
}

Delete a backup

Deletes a backup file and its job record

path Parameters
id
required
string <uuid>

Responses

200

Backup deleted

404

Backup not found

500

Failed to delete the backup

delete/api/system/backups/{id}
/api/system/backups/{id}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "success": true,
  • "data":
    {
    }
}

Download backup file

Downloads the backup archive file

path Parameters
id
required
string <uuid>

Responses

200

Backup file stream

404

Backup not found

get/api/system/backups/{id}/download
/api/system/backups/{id}/download

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "success": false,
  • "error":
    {
    }
}

Restore from backup

Triggers a restore from the specified backup

path Parameters
id
required
string <uuid>
Request Body schema: application/json
passphrase
required
string

Encryption passphrase used when backup was created

components
Array of strings
Items Enum: "data" "config" "network" "dns" "hostname" "ntp" "proxy" "ssh"

Components to restore. Valid values data, config, network, dns, hostname, ntp, proxy, ssh. 'data' covers databases, 'config' covers configuration; system settings (dns, ntp, proxy, ssh, network, hostname) must be selected individually.

force
boolean

Skip pre-restore state preservation (no rollback possible)

Responses

202

Restore started

400

Invalid request

404

Backup, backup file, or referenced storage target not found

409

Another operation is in progress

500

Failed to start the restore job

503

Platform manager is unavailable

post/api/system/backups/{id}/restore
/api/system/backups/{id}/restore

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "passphrase": "string",
  • "components":
    [
    ],
  • "force": true
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "success": true,
  • "data":
    {
    }
}

Upload backup file

Upload a backup .tar file from another system without restoring

Request Body schema: multipart/form-data
backup
required
string <binary>

Backup .tar file

Responses

201

Backup uploaded

400

Invalid request

500

Failed to save the uploaded backup

post/api/system/backups/upload
/api/system/backups/upload

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "success": true,
  • "data":
    {
    }
}

Import backup from path

Import a backup file from a local path or remote storage target. Reads the manifest via platform-manager to validate and extract metadata. Creates a DB record referencing the file location without copying.

Request Body schema: application/json
storage_target
string

Name of the storage target where the file resides. If omitted, looks in local backup directory.

file_path
required
string

Filename on the remote share, or filename in local backup directory.

Responses

201

Backup imported

400

Invalid request or file not found

409

Backup already imported

500

Failed to import the backup

503

Storage target or platform manager unreachable

post/api/system/backups/import
/api/system/backups/import

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "storage_target": "string",
  • "file_path": "string"
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "success": true,
  • "data":
    {
    }
}

BackupFiles

List backup files

Lists rows from backup_restore.backup_files, independent of any specific backup/restore job. Powers the restore job's file-picker UI.

query Parameters
page
integer >= 1
Default: 1
page_size
integer [ 1 .. 500 ]
Default: 20
deviceId
string <uuid>

Filter by source device

status
string (BackupFileStatus)
Enum: "PENDING" "AVAILABLE" "FAILED"

Filter by backup file status

fileName
string

Filter by exact file name match

Responses

200

Paginated list of backup files

401

Authentication required

get/api/v1/fleet/backup-restore/backup-files
/api/v1/fleet/backup-restore/backup-files

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "data":
    [
    ],
  • "pagination":
    {
    }
}

Delete multiple backup files

Deletes each requested backup artifact independently. Files that cannot be deleted (for example, because an active restore references them) are returned as failed results without preventing other deletions.

Request Body schema: application/json
backupFileIds
required
Array of strings <uuid> [ 1 .. 100 ] items

Responses

200

Per-file deletion results, including any partial failures

400

Invalid request

401

Authentication required

post/api/v1/fleet/backup-restore/backup-files/bulk-delete
/api/v1/fleet/backup-restore/backup-files/bulk-delete

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "backupFileIds":
    [
    ]
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "results":
    [
    ],
  • "deletedCount": 0,
  • "failedCount": 0
}

Get a backup file by ID

Returns metadata for one stored backup file by its ID.

path Parameters
backupFileId
required
string <uuid>

The backup file ID.

Responses

200

Backup file metadata

401

Authentication required

404

Resource not found

500

Internal server error

get/api/v1/fleet/backup-restore/backup-files/{backupFileId}
/api/v1/fleet/backup-restore/backup-files/{backupFileId}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "id": "string",
  • "fileName": "string",
  • "status": "PENDING",
  • "storageType": "string",
  • "storageKey": "string",
  • "storageServer": "string",
  • "storageShare": "string",
  • "fileSizeBytes": 0,
  • "checksum": "string",
  • "encrypted": true,
  • "deviceId": "string",
  • "backupType": "string",
  • "jobId": "string",
  • "executionId": "string",
  • "sourceVersion": "string",
  • "createdAt": "2026-10-29T14:02:58Z",
  • "expiresAt": "2026-10-29T14:02:58Z",
  • "masterKeyAvailable": true
}

Delete a backup file

Deletes an available backup artifact and its metadata. Deletion is rejected while an active restore references the backup file.

path Parameters
backupFileId
required
string <uuid>

Backup artifact identifier

Responses

204

Backup file deleted

401

Authentication required

404

Resource not found

409

Backup file is not available for deletion or is in use by an active restore

500

Internal server error

delete/api/v1/fleet/backup-restore/backup-files/{backupFileId}
/api/v1/fleet/backup-restore/backup-files/{backupFileId}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "error": "string",
  • "code": "string"
}

Download a backup file

Streams an available backup artifact as an attachment.

path Parameters
backupFileId
required
string <uuid>

Backup artifact identifier

Responses

200

Backup file stream

206

Partial backup file content for a satisfiable byte range.

401

Authentication required

404

Resource not found

409

Backup file is not available for download

410

Backup file has expired

416

Requested byte range cannot be satisfied.

500

Internal server error

get/api/v1/fleet/backup-restore/backup-files/{backupFileId}/download
/api/v1/fleet/backup-restore/backup-files/{backupFileId}/download

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "error": "string",
  • "code": "string"
}

BackupReadiness

List backup readiness check runs

Returns a paginated list of backup readiness check runs with rollup summaries. Each item contains the run status, device counts, and timestamps — but not the full per-device results. Use GET /backup/readiness/{runId} for the detailed per-device breakdown.

query Parameters
page
integer >= 1
Default: 1
page_size
integer [ 1 .. 500 ]
Default: 20
status
string
Enum: "PENDING" "RUNNING" "PASSED" "WARNING" "FAILED" "ERROR"

Filter runs by rolled-up status.

Responses

200

Paginated list of backup readiness runs

401

Authentication required

500

Internal server error

get/api/v1/fleet/backup-restore/backup/readiness
/api/v1/fleet/backup-restore/backup/readiness

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "data":
    [
    ],
  • "pagination":
    {
    }
}

Trigger async backup readiness checks for target devices

Runs readiness checks against the specified target devices before backup. Every device has adjacent backup_storage_capacity (device backup filesystem) and f5_insight_storage_capacity (local backup store) checks. Both always run and are SOFT (PASS or WARN, never FAIL), so warnings do not block backup. F5 Insight free space is snapshotted once before device checks. Every device receives the same local-store result: WARN when available space is below the total estimate for the entire selection, otherwise PASS (including equality). Devices are ordered by hostname, then device_id; this does not affect storage results. All warnings use the total required for the entire selection, for example: "F5 Insight has 8.00 GB available, but 10.00 GB is required to retain backup files for all the selected instances". Estimates are 2 GiB per BIG-IP and 500 KiB per F5OS-A. Messages use base-1024 GB for BIG-IP and MB for F5OS-A, with two decimals. PASS has no message. A local-space probe failure warns every device with "Unable to determine free space in F5 Insight", with the error in detail. Both results remain present even when device checks fail or error. If local storage setup fails before device checks start, every device completes with status ERROR and only a WARN f5_insight_storage_capacity entry. Device type is inferred from inventory: all targets must be BIGIP or all RSERIES. Mixed or unsupported types, missing devices, and unknown checks return 400. VELOS targets return 400 with "VELOS is not supported". Remote capacity is not checked; backups are always stored locally first.

Request Body schema: application/json
context
required
object

Shared context for all checks.

checks
Array of strings Nullable
Items Enum: "backup_storage_capacity" "device_reachability"

If omitted, defaults to device_reachability and backup_storage_capacity. Both backup_storage_capacity and f5_insight_storage_capacity always run, even when omitted; the F5 Insight check is not request-selectable. Both return SOFT PASS or WARN outcomes.

Responses

202

Readiness checks triggered — poll GET /backup/readiness/{runId} for results

400

Invalid request

401

Authentication required

404

Resource not found

500

Internal server error

post/api/v1/fleet/backup-restore/backup/readiness
/api/v1/fleet/backup-restore/backup/readiness

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "context":
    {
    },
  • "checks":
    [
    ]
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "run_id": "string",
  • "message": "string"
}

Get results for a backup readiness check run

Returns persisted backup readiness results for a run. devices contains only selected devices, ordered by hostname then device_id. Each device includes backup_storage_capacity and f5_insight_storage_capacity in check_results. Poll until status is no longer PENDING or RUNNING.

path Parameters
runId
required
string <uuid>

The backup readiness run ID returned by POST /backup/readiness

Responses

200

Backup readiness check results

401

Authentication required

404

Resource not found

500

Internal server error

get/api/v1/fleet/backup-restore/backup/readiness/{runId}
/api/v1/fleet/backup-restore/backup/readiness/{runId}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "run_id": "string",
  • "status": "PENDING",
  • "device_count": 0,
  • "pass_count": 0,
  • "warn_count": 0,
  • "fail_count": 0,
  • "error_count": 0,
  • "devices":
    [
    ],
  • "triggered_at": "2026-10-29T14:02:58Z",
  • "completed_at": "2026-10-29T14:02:58Z"
}

ChatHistory

List conversations

List all active (non-expired, non-deleted) conversations for the authenticated user, sorted by most recent message.

Responses

200

List of conversations

401

Unauthorized - authentication required or token invalid

500

Internal Error

get/api/chat/history/conversations
/api/chat/history/conversations

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "conversations":
    [
    ]
}

Create conversation

Create a new conversation thread. Returns 429 if the user has reached the 50-thread cap.

Request Body schema: application/json
title
string <= 500 characters

Optional conversation title

Responses

201

Conversation created

401

Unauthorized - authentication required or token invalid

429

Maximum number of active conversations reached (50)

500

Internal Error

post/api/chat/history/conversations
/api/chat/history/conversations

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "title": "Troubleshoot VIP latency"
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "id": "550e8400-e29b-41d4-a716-446655440000",
  • "user_id": "user-123",
  • "title": "Deploy failure on prod-cluster-3",
  • "created_at": "2026-10-29T14:02:58Z",
  • "last_msg_at": "2026-10-29T14:02:58Z",
  • "expires_at": "2026-10-29T14:02:58Z",
  • "deleted_at": "2026-10-29T14:02:58Z",
  • "message_count": 14
}

Get conversation with messages

Get a conversation and its full message history. Returns 410 if the conversation has expired.

path Parameters
id
required
string <uuid>

Conversation ID

Responses

200

Conversation with messages

401

Unauthorized - authentication required or token invalid

404

Conversation not found

410

Conversation has expired

500

Internal Error

get/api/chat/history/conversations/{id}
/api/chat/history/conversations/{id}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "conversation":
    {
    },
  • "messages":
    [
    ],
  • "context_summarized": true
}

Delete conversation

Soft-delete a conversation. The conversation will be retained for 30 days for audit purposes before hard-deletion.

path Parameters
id
required
string <uuid>

Conversation ID

Responses

204

Conversation deleted

401

Unauthorized - authentication required or token invalid

404

Conversation not found

500

Internal Error

delete/api/chat/history/conversations/{id}
/api/chat/history/conversations/{id}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "status": 401,
  • "message": "Unauthorized"
}

Add message to conversation

Add a message to a conversation. Resets the 24-hour TTL rolling window. Returns 410 if the conversation has expired.

path Parameters
id
required
string <uuid>

Conversation ID

Request Body schema: application/json
role
required
string
Enum: "user" "assistant"

Message sender role

content
required
string

Message content

Responses

201

Message added

400

Invalid request (missing role/content or invalid role)

401

Unauthorized - authentication required or token invalid

404

Conversation not found

410

Conversation has expired

500

Internal Error

post/api/chat/history/conversations/{id}/messages
/api/chat/history/conversations/{id}/messages

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "role": "user",
  • "content": "Can you check the pool member health?"
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "id": "string",
  • "conversation_id": "string",
  • "user_id": "string",
  • "role": "user",
  • "content": "What's the current pool status on prod-cluster-3?",
  • "created_at": "2026-10-29T14:02:58Z",
  • "is_summarized": false
}

Export conversation or single response as PDF

Generates and downloads a PDF of either an entire conversation (all turns) or a single assistant response (including its preceding user prompt). PDF is generated server-side using pure-Go rendering (go-pdf/fpdf). Conversations are capped at 200 live messages due to the summarization policy; the export reflects the live message window at time of request. User identity is resolved from the Bearer token — no user_id in the body. The conversation ownership is validated server-side; a conversation belonging to another user returns 404 (not 403) to avoid ID enumeration.

Request Body schema: application/json
type
required
string
Enum: "single" "conversation"

conversation — export all messages in the thread (up to 200). single — export one assistant response and its preceding user prompt.

conversation_id
required
string <uuid>

ID of the conversation to export

message_id
string <uuid>

Required when type is single. ID of the target assistant message. The preceding user prompt is automatically included in the PDF.

session_id
string

Browser/session identifier from the chat session that triggered the export. Used to correlate the PDF export audit event with the originating chat session.

Responses

200

PDF generated successfully — binary file download

400

Invalid request. Possible causes: - Missing or invalid type (must be single or conversation) - Missing conversation_id - type is single but message_id is absent

401

Unauthorized - authentication required or token invalid

404

Conversation not found, not owned by the authenticated user, or no messages matched for the given message_id.

410

Conversation has expired (past 24-hour TTL)

500

Internal Error

post/api/chat/export/pdf
/api/chat/export/pdf

Request samples

Content type
application/json
Example
Copy
Expand all Collapse all
{
  • "type": "conversation",
  • "conversation_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "status": 400,
  • "message": "message_id is required for single response export"
}

Cloud Environments

List all VMware environments

List VMware cloud environments using optional exact-match filters combined with AND. isVmwCluster=false is an active filter. Blank filter values are ignored; duplicate or invalid nonblank values return 400.

query Parameters
id
string <uuid>

Exact environment UUID.

name
string

Exact case-sensitive environment name; empty or whitespace-only values are ignored, and nonblank values are matched without trimming.

providerId
string <uuid>

Exact UUID of the referenced provider.

isVmwCluster
boolean

Exact cluster flag. Accepts lowercase true or false; omission adds no restriction.

validationStatus
string
Enum: "PENDING" "VALIDATED" "FAILED"

Exact validation status with the documented casing.

Responses

200

Cloud environment listed successfully

400

Invalid list filter

500

Internal server error

get/api/provisioning/v1/cloud/environments
/api/provisioning/v1/cloud/environments

Response samples

Content type
application/json
Copy
Expand all Collapse all
[
  • {
    }
]

Create VMware environment

Creates a new VMware cloud environment for auto-scaling.

Request Body schema: application/json
name
required
string [ 1 .. 255 ] characters

Name of the cloud environment

providerReference
required
object (Reference)
deviceTemplateReference
required
object (Reference)
isVmwCluster
boolean
Default: true

Indicates if VMware cluster is being used

vmwProperties
required
object (VMwareEnvironmentProperties)

Responses

201

Cloud environment created successfully

400

Bad request - validation failed

404

Provider or device template not found

409

Conflict - environment with same name already exists

500

Internal server error

post/api/provisioning/v1/cloud/environments
/api/provisioning/v1/cloud/environments

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "name": "string",
  • "providerReference":
    {},
  • "deviceTemplateReference":
    {},
  • "isVmwCluster": true,
  • "vmwProperties":
    {
    }
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "id": "string",
  • "name": "string",
  • "providerReference":
    {},
  • "deviceTemplateReference":
    {},
  • "isVmwCluster": true,
  • "vmwProperties":
    {
    },
  • "validationStatus": "PENDING",
  • "validationErrors":
    [
    ],
  • "selfLink": "http://example.com",
  • "createdAt": "2026-10-29T14:02:58Z",
  • "updatedAt": "2026-10-29T14:02:58Z"
}

Get VMware environment by ID

path Parameters
environmentId
required
string <uuid>

UUID of the cloud environment

Responses

200

Cloud environment returned successfully

404

Cloud environment not found

500

Internal server error

get/api/provisioning/v1/cloud/environments/{environmentId}
/api/provisioning/v1/cloud/environments/{environmentId}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "id": "string",
  • "name": "string",
  • "providerReference":
    {},
  • "deviceTemplateReference":
    {},
  • "isVmwCluster": true,
  • "vmwProperties":
    {
    },
  • "validationStatus": "PENDING",
  • "validationErrors":
    [
    ],
  • "selfLink": "http://example.com",
  • "createdAt": "2026-10-29T14:02:58Z",
  • "updatedAt": "2026-10-29T14:02:58Z"
}

Edit VMware environment

path Parameters
environmentId
required
string <uuid>

UUID of the cloud environment

Request Body schema: application/json
name
string [ 1 .. 255 ] characters
isVmwCluster
boolean
vmwProperties
object (VMwareEnvironmentProperties)

Responses

200

Cloud environment updated successfully

400

Bad request - validation failed

404

Cloud environment not found

409

Conflict - environment with same name already exists

500

Internal server error

patch/api/provisioning/v1/cloud/environments/{environmentId}
/api/provisioning/v1/cloud/environments/{environmentId}

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "name": "string",
  • "isVmwCluster": true,
  • "vmwProperties":
    {
    }
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "id": "string",
  • "name": "string",
  • "providerReference":
    {},
  • "deviceTemplateReference":
    {},
  • "isVmwCluster": true,
  • "vmwProperties":
    {
    },
  • "validationStatus": "PENDING",
  • "validationErrors":
    [
    ],
  • "selfLink": "http://example.com",
  • "createdAt": "2026-10-29T14:02:58Z",
  • "updatedAt": "2026-10-29T14:02:58Z"
}

Delete VMware environment

Deletes an existing VMware cloud environment.

path Parameters
environmentId
required
string <uuid>

UUID of the cloud environment

Responses

204

Cloud environment deleted successfully

400

Bad request - environment is in use

404

Cloud environment not found

500

Internal server error

delete/api/provisioning/v1/cloud/environments/{environmentId}
/api/provisioning/v1/cloud/environments/{environmentId}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "code": 0,
  • "message": "string",
  • "details": "string",
  • "timestamp": "2026-10-29T14:02:58Z"
}

Cloud Providers

Operations for managing cloud provider configurations

List all cloud providers

List cloud providers using optional exact-match filters combined with AND. Blank filter values are ignored; duplicate or invalid nonblank values return 400.

query Parameters
id
string <uuid>

Exact provider UUID.

name
string

Exact case-sensitive provider name; empty or whitespace-only values are ignored, and nonblank values are matched without trimming.

providerType
string
Value: "VMware"

Exact provider type with the documented casing.

Responses

200

List of cloud providers retrieved successfully

400

Invalid list filter

500

Internal server error

get/api/provisioning/v1/cloud/providers
/api/provisioning/v1/cloud/providers

Response samples

Content type
application/json
Copy
Expand all Collapse all
[
  • {
    }
]

Create a cloud provider

Request Body schema: application/json
providerType
required
string
Value: "VMware"

Type of cloud provider

name
required
string [ 1 .. 255 ] characters

Name of the cloud provider

vmwProperties
object (VMwareProviderProperties)

Responses

201

Cloud provider created successfully

400

Bad request - invalid input

409

Conflict - provider with same name already exists

500

Internal server error

post/api/provisioning/v1/cloud/providers
/api/provisioning/v1/cloud/providers

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "providerType": "VMware",
  • "name": "string",
  • "vmwProperties":
    {
    }
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "id": "string",
  • "providerType": "VMware",
  • "name": "string",
  • "vmwProperties":
    {
    },
  • "selfLink": "http://example.com",
  • "createdAt": "2026-10-29T14:02:58Z",
  • "updatedAt": "2026-10-29T14:02:58Z"
}

Get cloud provider by ID

path Parameters
providerId
required
string <uuid>

UUID of the cloud provider

Responses

200

Cloud provider retrieved successfully

400

Bad request - invalid input

404

Resource not found

500

Internal server error

get/api/provisioning/v1/cloud/providers/{providerId}
/api/provisioning/v1/cloud/providers/{providerId}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "id": "string",
  • "providerType": "VMware",
  • "name": "string",
  • "vmwProperties":
    {
    },
  • "selfLink": "http://example.com",
  • "createdAt": "2026-10-29T14:02:58Z",
  • "updatedAt": "2026-10-29T14:02:58Z"
}

Edit cloud provider

path Parameters
providerId
required
string <uuid>

UUID of the cloud provider

Request Body schema: application/json
name
string [ 1 .. 255 ] characters

Name of the cloud provider

vmwProperties
object (VMwareProviderProperties)

Responses

200

Cloud provider updated successfully

400

Bad request - invalid input

404

Resource not found

409

Conflict - provider with same name already exists

500

Internal server error

patch/api/provisioning/v1/cloud/providers/{providerId}
/api/provisioning/v1/cloud/providers/{providerId}

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "name": "string",
  • "vmwProperties":
    {
    }
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "id": "string",
  • "providerType": "VMware",
  • "name": "string",
  • "vmwProperties":
    {
    },
  • "selfLink": "http://example.com",
  • "createdAt": "2026-10-29T14:02:58Z",
  • "updatedAt": "2026-10-29T14:02:58Z"
}

Delete cloud provider

path Parameters
providerId
required
string <uuid>

UUID of the cloud provider

Responses

204

Provider deleted successfully

400

Bad request - invalid input

404

Resource not found

500

Internal server error

delete/api/provisioning/v1/cloud/providers/{providerId}
/api/provisioning/v1/cloud/providers/{providerId}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "code": 0,
  • "message": "string"
}

CompatMatrix

List BIG-IP upgrade path rules (K13845)

Returns all rows in upgrade.bigip_upgrade_paths. Includes both YAML-seeded rows (is_operator_override=false) and operator-managed rows (is_operator_override=true).

Responses

200

List of upgrade path rules

401

Authentication required

get/api/v1/fleet/upgrade/compat/upgrade-paths
/api/v1/fleet/upgrade/compat/upgrade-paths

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "data":
    [
    ],
  • "total": 0
}

Add or update a BIG-IP upgrade path rule (K13845 operator override)

Inserts or updates a row in upgrade.bigip_upgrade_paths using the natural key (target_major_version, min_source_version). The row is always marked is_operator_override=true — the CompatSeeder will never overwrite it on service restart.

Why upsert (not separate POST/PATCH)? The natural business key is (target_major_version, min_source_version), not the UUID. Operators think in terms of rules, not opaque IDs. The upsert pattern lets operators:

  • Add a new rule without checking whether it already exists
  • Update an existing rule (including YAML-seeded rows) without needing to look up its UUID first
  • Use the same idempotent script to enforce desired state across environments

Response codes:

  • 201 Created — a new row was inserted (the natural key did not previously exist)
  • 200 OK — an existing row was updated (the natural key already existed)
Request Body schema: application/json
target_major_version
required
string non-empty

Target BIG-IP major version, e.g. "17" or "21".

min_source_version
required
string non-empty

Minimum source version required (inclusive), e.g. "17.1.0".

max_source_version
string Nullable

Maximum source version (inclusive). Omit or null for no upper bound.

notes
string Nullable

Optional human-readable note.

Responses

200

Existing row updated (natural key already existed)

201

New row created (natural key did not previously exist)

400

Invalid request

401

Authentication required

post/api/v1/fleet/upgrade/compat/upgrade-paths
/api/v1/fleet/upgrade/compat/upgrade-paths

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "target_major_version": "21",
  • "min_source_version": "14.0.0",
  • "max_source_version": "string",
  • "notes": "string"
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "id": "string",
  • "target_major_version": "21",
  • "min_source_version": "17.1.0",
  • "max_source_version": "string",
  • "notes": "string",
  • "source_kbase": "K13845",
  • "is_operator_override": true,
  • "created_at": "2026-10-29T14:02:58Z",
  • "updated_at": "2026-10-29T14:02:58Z"
}

Get a BIG-IP upgrade path rule by ID

Returns a single row from upgrade.bigip_upgrade_paths addressed by its UUID. Includes both YAML-seeded rows (is_operator_override=false) and operator-managed rows (is_operator_override=true).

path Parameters
compatId
required
string <uuid>

Unique ID of a compatibility matrix row.

Responses

200

Upgrade path rule

401

Authentication required

404

Resource not found

get/api/v1/fleet/upgrade/compat/upgrade-paths/{compatId}
/api/v1/fleet/upgrade/compat/upgrade-paths/{compatId}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "id": "string",
  • "target_major_version": "21",
  • "min_source_version": "17.1.0",
  • "max_source_version": "string",
  • "notes": "string",
  • "source_kbase": "K13845",
  • "is_operator_override": true,
  • "created_at": "2026-10-29T14:02:58Z",
  • "updated_at": "2026-10-29T14:02:58Z"
}

Delete a BIG-IP upgrade path rule by ID

path Parameters
compatId
required
string <uuid>

Unique ID of a compatibility matrix row.

Responses

204

Row deleted

401

Authentication required

404

Resource not found

delete/api/v1/fleet/upgrade/compat/upgrade-paths/{compatId}
/api/v1/fleet/upgrade/compat/upgrade-paths/{compatId}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "error": "string",
  • "code": "string"
}

Configuration

Get current AI provider configuration

Responses

200

Current AI provider configuration

204

No configuration found

500

Internal server error

get/api/ai-integrations/llm-provider
/api/ai-integrations/llm-provider

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "provider_name": "string",
  • "base_url": "string",
  • "model": "string",
  • "ca": "string",
  • "skip_tls_verify": true
}

Save AI provider configuration

Request Body schema: application/json
provider_name
required
string

AI provider name (e.g., openai, anthropic, local)

api_token
string

API token for the provider. Required for 'openai' and 'claude' providers, optional for 'local' provider.

base_url
string

Base URL for the provider. Required for 'local' provider, optional for 'openai' and 'claude'.

model
string

Model name to use. Required for 'local' provider, optional for others.

ca
string <uuid>

Optional CA certificate UUID from trust store for custom SSL/TLS connections

skip_tls_verify
boolean

Indicates if TLS verification should be skipped for this provider

Responses

200

Configuration saved successfully

400

Validation error

500

Internal server error

post/api/ai-integrations/llm-provider
/api/ai-integrations/llm-provider

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "provider_name": "string",
  • "api_token": "string",
  • "base_url": "string",
  • "model": "string",
  • "ca": "string",
  • "skip_tls_verify": true
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "status": "validation_success"
}

Delete AI provider configuration

Responses

200

Configuration deleted successfully

404

Configuration not found

500

Internal server error

delete/api/ai-integrations/llm-provider
/api/ai-integrations/llm-provider

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "status": "validation_success"
}

Get current AIDF configuration

Responses

200

Current AIDF configuration

204

No configuration found

500

Internal server error

get/api/ai-integrations/aidf
/api/ai-integrations/aidf

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "endpoint": "string",
  • "tenant_id": "string",
  • "data_types":
    [
    ]
}

Save AIDF configuration

Request Body schema: application/json
endpoint
required
string

AIDF endpoint URL

tenant_id
required
string

Tenant ID

tenant_token
required
string

Tenant authentication token

data_types
Array of strings non-empty
Default: ["logs","metrics"]
Items Enum: "logs" "metrics"

Data types to send to AIDF (logs, metrics, or both). Defaults to ["logs", "metrics"] if not specified. Cannot be an empty array.

Responses

200

Configuration saved successfully

400

Validation error

500

Internal server error

post/api/ai-integrations/aidf
/api/ai-integrations/aidf

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "endpoint": "string",
  • "tenant_id": "string",
  • "tenant_token": "string",
  • "data_types":
    [
    ]
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "status": "validation_success"
}

Delete AIDF configuration

Responses

200

Configuration deleted successfully

404

Configuration not found

500

Internal server error

delete/api/ai-integrations/aidf
/api/ai-integrations/aidf

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "status": "validation_success"
}

Connectivity

Health probe for F5 license activation server reachability (DNS, TCP 443, TLS certificate)

Check connectivity to F5 license activation servers

Probes the F5 license activation servers (activate.f5.com for production, authem.f5net.com for development) and returns a per-server report with three independent checks:

  1. DNS — can the hostname be resolved from the F5 Insight instance?
  2. TCP — can an outbound connection be opened to port 443?
  3. Cert — does a strict TLS handshake succeed (chain + hostname + expiry)?

A server is marked reachable: true (Green) only when all three checks pass. Otherwise it is reachable: false (Red) and each failing check includes a hint with remediation steps.

The endpoint always returns HTTP 200. Individual probe failures are represented inside the JSON payload (ok: false + hint), not as HTTP errors, so the UI always receives a structured Green/Red result.

Authorizations:

Responses

200

Connectivity report (always 200; individual failures are inside the payload)

401

Unauthorized

get/api/v1/fleet/licensing/connectivity
/api/v1/fleet/licensing/connectivity

Response samples

Content type
application/json
Example
Copy
Expand all Collapse all
{
  • "servers":
    [
    ],
  • "checkedAt": "2026-09-23T16:06:12Z"
}

Cross Pool

List all license pools

Returns all available license pools across every pool type.

Authorizations:
query Parameters
$select
string

Comma-separated list of fields to include in the response

name
string

Exact-match filter on pool name. Combined with other filters using AND.

status
string

Exact-match filter on pool status (ACTIVE, EXPIRED, PENDING, FAILED). Combined with other filters using AND.

type
string

Exact-match filter on pool type (Registration Key Pool, Utility, Volume). Combined with other filters using AND.

$search
string

Comma-separated list of free-text search words. Matches are case-insensitive substring matches against name/description. Release 1.3 supports AND/EQ semantics only; additional operators will be introduced in future releases.

$page
integer >= 1
Default: 1

1-based page number

$pageSize
integer [ 1 .. 500 ]
Default: 50

Number of items per page

Responses

200

List of license pools

400

Bad request

401

Unauthorized

500

Internal server error

get/api/v1/fleet/licensing/tmos/pool/licenses
/api/v1/fleet/licensing/tmos/pool/licenses

Response samples

Content type
application/json
Copy
Expand all Collapse all
{}

List all license assignments

Returns all license assignments (members) across every license pool.

Authorizations:
query Parameters
$select
string

Comma-separated list of fields to include in the response

deviceAddress
string

Exact-match filter on device address. Combined with other filters using AND.

status
string

Exact-match filter on member status (INSTALLING, INSTALLATION_FAILED, LICENSED). Combined with other filters using AND.

poolId
string <uuid>

Exact-match filter on the owning pool id. Combined with other filters using AND.

offeringId
string <uuid>

Exact-match filter on the owning registration-key offering id. Combined with other filters using AND.

$search
string

Comma-separated list of free-text search words. Matches are case-insensitive substring matches against deviceAddress/deviceName. Release 1.3 supports AND/EQ semantics only; additional operators will be introduced in future releases.

$page
integer >= 1
Default: 1

1-based page number

$pageSize
integer [ 1 .. 500 ]
Default: 50

Number of items per page

Responses

200

List of license assignments

400

Bad request

401

Unauthorized

500

Internal server error

get/api/v1/fleet/licensing/tmos/pool/licenses/assignments
/api/v1/fleet/licensing/tmos/pool/licenses/assignments

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "items":
    [],
  • "totalItems": 0,
  • "pagination":
    {
    }
}

Get license assignment by ID

Returns a single license assignment (member) by its globally unique ID. The lookup spans every license pool type — the caller does not need to know which pool or offering owns the member.

Authorizations:
path Parameters
id
required
string <uuid>

Unique identifier of the license assignment (member)

query Parameters
$select
string

Comma-separated list of fields to include in the response

Responses

200

License assignment details

400

Bad request

401

Unauthorized

404

Assignment not found

500

Internal server error

get/api/v1/fleet/licensing/tmos/pool/licenses/assignments/{id}
/api/v1/fleet/licensing/tmos/pool/licenses/assignments/{id}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{}

Revoke license assignment by ID

Revokes a license assignment (member) by its globally unique ID. The endpoint spans every license pool type and dispatches to the owning pool internally. Device credentials must be supplied in the request body unless force=true is set, in which case the device is not contacted and only the fleet-manager record is cleared.

Authorizations:
path Parameters
id
required
string <uuid>

Unique identifier of the license assignment (member)

query Parameters
force
boolean
Default: false

When true, skip contacting the BIG-IP device and only clear the fleet-manager record. Device credentials are not required.

Request Body schema: application/json
deviceUsername
string
devicePassword
string <password>

Responses

204

License assignment revoked

400

Bad request (e.g. credentials required when not forcing)

401

Unauthorized

404

Assignment not found

500

Internal server error

delete/api/v1/fleet/licensing/tmos/pool/licenses/assignments/{id}/revoke
/api/v1/fleet/licensing/tmos/pool/licenses/assignments/{id}/revoke

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "deviceUsername": "string",
  • "devicePassword": "pa$$word"
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "code": 400,
  • "message": "The license U5939-99933-49705-74523-4841009 has been granted to a device",
  • "details": "string",
  • "timestamp": "2026-10-29T14:02:58Z"
}

Move license assignment to a different pool

Moves a license assignment (member) from its current pool to a different pool by revoking the license from the source pool and assigning it to the target pool. The operation is asynchronous and returns a task reference.

The device must be managed by fleet-manager and credentials are resolved server-side. The source pool is determined automatically from the member ID.

Authorizations:
path Parameters
id
required
string <uuid>

Unique identifier of the license assignment (member) to move

Request Body schema: application/json
targetPoolType
required
string
Value: "regkey"

Target pool type

targetPoolId
string <uuid>

Required for regkey pools. The UUID of the target registration key pool.

targetRegKey
string

Required. The offering key within the target registration key pool.

Responses

202

Move operation accepted and task created

400

Bad request (e.g. invalid target pool, same pool move)

401

Unauthorized

404

Assignment or target pool not found

500

Internal server error

patch/api/v1/fleet/licensing/tmos/pool/licenses/assignments/{id}/move
/api/v1/fleet/licensing/tmos/pool/licenses/assignments/{id}/move

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "targetPoolType": "regkey",
  • "targetPoolId": "123e4567-e89b-12d3-a456-426614174000",
  • "targetRegKey": "ABCDE-FGHIJ-KLMNO-PQRST-UVWXYZ"
}

Response samples

Content type
application/json

Device Management

DeleteDataCenter

Delete a specific data center by its ID.

path Parameters
id
required
string <uuid>

Unique identifier of the data center to delete.

Responses

200

Data center deleted successfully.

400

Validation error.

404

Data center not found.

409

Cannot delete data center with associated devices.

500

Internal server error.

delete/api/device-management/data-centers/{id}
/api/device-management/data-centers/{id}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "status": 0,
  • "message": "string",
  • "code": "string",
  • "category": "string",
  • "help": "string"
}

GetDataCentersRegisteredDevices

Retrieve all data centers with their registered devices.

query Parameters
deviceType
string
Default: "all"
Enum: "all" "bigip" "f5os"

Filter by device kind. One of all, bigip, f5os. Defaults to all.

Responses

200

List of all data centers with their devices.

500

Internal server error.

get/api/device-management/data-centers/devices
/api/device-management/data-centers/devices

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "data_centers":
    [
    ],
  • "total_data_centers": 0,
  • "total_devices": 0
}

Get the latest newer applicable critical release

query Parameters
product
required
string
Enum: "BIG-IP" "F5OS"

Product family used to select release metadata (BIG-IP or F5OS).

version
required
string

Installed product version.

Responses

200

The latest newer applicable critical release, returned as a one-item array for forward compatibility.

400

Missing or invalid query parameter.

503

Release metadata is unavailable.

get/api/device-management/next-available-versions
/api/device-management/next-available-versions

Response samples

Content type
application/json
Copy
Expand all Collapse all
[
  • {
    }
]

GetCurrentMigrationTask

Get the currently running or most recent migration task. Returns the active migration task if one is in progress, otherwise returns the most recent completed/failed task.

Responses

200

Migration task information retrieved successfully

404

No migration tasks found

500

Internal server error

get/api/device-management/devices/migrate-ast
/api/device-management/devices/migrate-ast

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "task_id": "123e4567-e89b-12d3-a456-426614174000",
  • "status": "INIT",
  • "message": "Migration task created successfully. Use the task_id to query status."
}

StartMigrationTask

Start an asynchronous migration task for BIG-IP devices from AST (Application Study Tool) configuration files. Returns a task ID that can be used to query migration status. Only one migration task can be running at a time - attempting to start a second task will return an error.

Request Body schema: multipart/form-data

AST configuration files containing device information.

defaults_file
required
string <binary>

ast_defaults.yaml file containing default settings (YAML format)

receivers_file
required
string <binary>

ast_receivers.yml file containing receiver configurations (YAML format)

Responses

202

Migration task created successfully. Use the returned task_id to query status.

400

Validation error in uploaded files.

409

A migration task is already in progress.

500

Internal server error.

post/api/device-management/devices/migrate-ast
/api/device-management/devices/migrate-ast

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "task_id": "123e4567-e89b-12d3-a456-426614174000",
  • "status": "INIT",
  • "message": "Migration task created successfully. Use the task_id to query status."
}

GetMigrationStatus

Get the status of a device migration task including overall progress and individual device status.

path Parameters
task_id
required
string <uuid>

The task ID returned from the migration request

query Parameters
include_devices
boolean
Default: true

Include individual device status details

limit
integer [ 1 .. 1000 ]
Default: 100

Maximum number of device details to return

offset
integer >= 0
Default: 0

Offset for pagination of device details

updated_since
string <date-time>

Filter devices updated since this timestamp (ISO 8601 format, e.g., 2026-01-30T08:00:00Z)

Responses

200

Migration status retrieved successfully

404

Task not found

500

Internal server error

get/api/device-management/devices/migrate-ast/status/{task_id}
/api/device-management/devices/migrate-ast/status/{task_id}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "task_id": "123e4567-e89b-12d3-a456-426614174000",
  • "task_type": "MIGRATION",
  • "state": "IN_PROGRESS",
  • "status": "RUNNING",
  • "progress": 45,
  • "total_devices": 100,
  • "pending_devices": 55,
  • "validated_devices": 40,
  • "failed_devices": 5,
  • "error_message": null,
  • "created_at": "2026-01-29T10:30:00Z",
  • "updated_at": "2026-01-29T10:35:00Z",
  • "devices":
    [
    ]
}

GetDeviceProgress

Get paginated device-level progress for a migration task with delta update support. Use this for live UI updates showing per-device status (Connected/Failed/In Progress). Supports polling with 'since' parameter to fetch only recently updated devices.

path Parameters
task_id
required
string <uuid>

The task ID returned from the migration request

query Parameters
page
integer >= 1
Default: 1

Page number for pagination (1-based).

size
integer >= 1

Number of items per page.

since
string <date-time>

Return only devices updated after this timestamp (ISO 8601 format). Use the lastSync value from previous response for delta updates.

search
string

Search term to filter devices by name, alias, or endpoint

sort
string

Sort order, e.g. 'name,-created_at' (prefix '-' for descending)

Responses

200

Device progress retrieved successfully

400

Invalid request parameters

404

Task not found

500

Internal server error

get/api/device-management/devices/migrate-ast/status/{task_id}/devices
/api/device-management/devices/migrate-ast/status/{task_id}/devices

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "task_id": "550e8400-e29b-41d4-a716-446655440000",
  • "task_status": "RUNNING",
  • "task_progress": 45,
  • "page": 1,
  • "size": 20,
  • "total": 45,
  • "last_sync": "2026-01-30T12:12:30Z",
  • "devices":
    [
    ]
}

Get staging CA certificates for a migration task

Retrieve all staging CA certificates associated with a migration task. Returns the list of CA bundles that were extracted during the migration process and are available for validation and commit operations.

path Parameters
task_id
required
string <uuid>

The task ID returned from the migration request

query Parameters
page
integer >= 1
Default: 1

Page number for pagination (1-based).

size
integer >= 1

Number of items per page.

Responses

200

CA bundle list retrieved successfully

400

Invalid request parameters

404

Task not found

500

Internal server error

get/api/device-management/devices/migrate-ast/status/{task_id}/ca-bundles
/api/device-management/devices/migrate-ast/status/{task_id}/ca-bundles

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "task_id": "550e8400-e29b-41d4-a716-446655440000",
  • "page": 1,
  • "size": 20,
  • "total": 5,
  • "ca_bundles":
    [
    ]
}

CleanupMigrationTask

Clean up all staging data associated with a migration task. This removes all staging devices and trust store entries that have not been committed. Successfully committed devices and trust stores remain intact.

path Parameters
task_id
required
string <uuid>

The task ID to clean up

query Parameters
force
boolean
Default: false

Force cleanup even if task is still running. WARNING: Use with extreme caution - only when a task is stuck for a very long time. Forcing cleanup of a running task may lead to inconsistent state.

Responses

200

Cleanup completed successfully

404

Task not found

500

Internal server error

delete/api/device-management/devices/migrate-ast/cleanup/{task_id}
/api/device-management/devices/migrate-ast/cleanup/{task_id}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "task_id": "123e4567-e89b-12d3-a456-426614174000",
  • "deleted_devices": 10,
  • "deleted_trust_stores": 5,
  • "message": "Successfully cleaned up migration task staging data"
}

RetryFailedMigrationDevices

Retry failed devices from an existing migration task. This endpoint reuses the same task ID and only retries devices with validation_status = 'FAILED'. Failed devices are reset to 'PENDING' and the task state is reset to 'IN_PROGRESS'.

Requirements:

  • Task must exist and be a MIGRATION task
  • No other migration task can be currently running
  • Task must have at least one failed device

The retry process:

  1. Validates the task exists and is a migration task
  2. Checks no concurrent migration tasks are running
  3. Resets failed devices to PENDING status
  4. Resets task state to IN_PROGRESS
  5. Reprocesses only the failed devices through the validation workflow
path Parameters
task_id
required
string <uuid>

The task ID to retry failed devices for

Responses

202

Retry initiated successfully. Use the same task_id to query status.

400

No failed devices to retry

404

Task not found

409

A migration task is already running

500

Internal server error

post/api/device-management/devices/migrate-ast/retry/{task_id}
/api/device-management/devices/migrate-ast/retry/{task_id}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "message": "Retry task initiated successfully",
  • "task_id": "123e4567-e89b-12d3-a456-426614174000"
}

Get a staging device by ID

Retrieve details of a specific staging device including its validation status, configuration, and error messages if any.

path Parameters
staging_device_id
required
string <uuid>

UUID of the staging device to retrieve

Responses

200

Staging device retrieved successfully

404

Staging device not found

500

Internal server error

get/api/device-management/devices/migrate-ast/staging-devices/{staging_device_id}
/api/device-management/devices/migrate-ast/staging-devices/{staging_device_id}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "id": "660e8400-e29b-41d4-a716-446655440001",
  • "task_id": "550e8400-e29b-41d4-a716-446655440000",
  • "device_name": "bigip-prod-01.example.com",
  • "username": "admin",
  • "data_center": "US-EAST-1",
  • "tls_enabled": true,
  • "ca_bundle_id": "660e8400-e29b-41d4-a716-446655440002",
  • "collection_interval": 60,
  • "max_concurrent_connections": 5,
  • "validation_status": "SUCCESS",
  • "error_message": "Connection timeout",
  • "created_at": "2026-01-30T10:00:00Z",
  • "last_modified": "2026-01-30T12:00:00Z"
}

Update and commit a staging device

Updates a single staging device with provided fields, validates connectivity, and commits the device to the main devices table. If a device with the same endpoint exists, it will be updated instead of creating a new one.

path Parameters
staging_device_id
required
string <uuid>

UUID of the staging device to update

Request Body schema: application/json
alias_name
string <= 100 characters
description
string <= 500 characters
username
string <= 255 characters
password
string <= 255 characters
endpoint
string
data_center
string <= 255 characters
retention
string (Retention) ^P(\d+Y)?(\d+M)?(\d+D)?(T(\d+H)?(\d+M)?(\d+S)?)?$

ISO 8601 duration (e.g., P1Y for 1 year, P30D for 30 days).Supported units are Y (years), M (months), D (days), H (hours), M (minutes), S (seconds). Internally converted and rounded up to whole days. Maximum allowed retention is 1 year (P1Y).

collection_interval
integer >= 1
max_concurrent_connections
integer [ 1 .. 20 ]

Maximum concurrent HTTP connections per device

tls_enabled
boolean
ca
string <uuid>
modules
object

Responses

200

Staging device updated and committed successfully

400

Device validation failed or invalid request

404

Staging device not found

500

Internal server error

patch/api/device-management/devices/migrate-ast/staging-devices/{staging_device_id}
/api/device-management/devices/migrate-ast/staging-devices/{staging_device_id}

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "alias_name": "string",
  • "description": "string",
  • "username": "string",
  • "password": "string",
  • "endpoint": "string",
  • "data_center": "string",
  • "retention": "string",
  • "collection_interval": 1,
  • "max_concurrent_connections": 1,
  • "tls_enabled": true,
  • "ca": "string",
  • "modules":
    {
    }
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "message": "Staging device updated and committed successfully",
  • "staging_device_id": "string"
}

Update and commit a staging CA bundle

Updates a single staging CA bundle with provided fields, validates certificate format, and commits the certificate to the trust_store table. If a certificate with the same content already exists, it will be linked instead of creating a duplicate.

path Parameters
staging_ca_id
required
string <uuid>

UUID of the staging CA bundle to update

Request Body schema: application/json
name
required
string <= 255 characters

Name of the certificate

description
string

Description of the certificate

certificate_content
required
string

PEM encoded certificate content

Responses

200

Staging CA bundle updated and committed successfully

400

Invalid certificate data

404

Staging CA bundle not found

500

Internal server error

patch/api/device-management/devices/migrate-ast/staging-ca-bundles/{staging_ca_id}
/api/device-management/devices/migrate-ast/staging-ca-bundles/{staging_ca_id}

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "name": "string",
  • "description": "string",
  • "certificate_content": "string"
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "message": "Staging CA bundle updated and committed successfully",
  • "staging_ca_id": "string"
}

MigrateASTDevicesSync

Synchronous migration of BIG-IP devices from AST configuration files (legacy endpoint). For better experience with large migrations, use the async endpoint instead.

Request Body schema: multipart/form-data

AST configuration files containing device information.

defaults_file
required
string <binary>

ast_defaults.yaml file containing default settings (YAML format)

receivers_file
required
string <binary>

ast_receivers.yml file containing receiver configurations (YAML format)

Responses

200

Migration completed with summary of results.

400

Validation error in uploaded files.

500

Internal server error.

post/api/device-management/devices/migrate-ast-sync
/api/device-management/devices/migrate-ast-sync

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "total": 10,
  • "successful": 8,
  • "failed": 2,
  • "results":
    [
    ]
}

BulkImportDevices

Import multiple devices (BIG-IP and/or F5OS) to F5 Insights in a single operation.

Request Body schema: application/json

Array of devices to be imported (mixed BIG-IP and F5OS allowed).

devices
required
Array of any (AddDeviceRequest) non-empty

List of devices to import (BIG-IP or F5OS per item)

Responses

200

Bulk import completed with summary of results.

400

Validation error.

500

Internal server error.

post/api/device-management/devices/bulk-import
/api/device-management/devices/bulk-import

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "devices":
    [
    ]
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "total": 10,
  • "successful": 8,
  • "failed": 2,
  • "results":
    [
    ]
}

GetCurrentImportTask

Get the currently running or most recent import task. Returns the active import task if one is in progress, otherwise returns the most recent completed/failed task.

Responses

200

Import task state and per-device results.

404

No import tasks found.

500

Internal server error.

get/api/device-management/devices/import
/api/device-management/devices/import

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "task_id": "string",
  • "state": "INIT",
  • "status": "RUNNING",
  • "progress": 0,
  • "total": 0,
  • "successful": 0,
  • "failed": 0,
  • "error_message": "string",
  • "items":
    [
    ],
  • "created_at": "2026-10-29T14:02:58Z",
  • "updated_at": "2026-10-29T14:02:58Z"
}

ImportDevicesAsync

Asynchronously import a batch of devices (BIG-IP and/or F5OS) and track the result as a task. Accepts the same devices[] body as bulk-import; in addition Content-Type: application/yaml is supported so a YAML file from disk can be POSTed directly. Returns a task id immediately; poll the status endpoint for per-device outcomes once items start completing.

Request Body schema:

Array of devices to import (mixed BIG-IP and F5OS allowed).

devices
required
Array of any (AddDeviceRequest) [ 1 .. 1000 ] items

List of devices to import (BIG-IP or F5OS per item).

Responses

202

Import task accepted. Poll the status endpoint with the returned task_id.

400

Validation error.

500

Internal server error.

post/api/device-management/devices/import
/api/device-management/devices/import

Request samples

Content type
Copy
Expand all Collapse all
{
  • "devices":
    [
    ]
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "task_id": "string",
  • "message": "Import task accepted"
}

CleanupImportTask

Clean up an async import task and its tracked results. Removes the task record (including the per-device results stored in status_json). Devices that were successfully onboarded remain intact in the main tables.

path Parameters
task_id
required
string <uuid>

The import task ID to clean up

query Parameters
force
boolean
Default: false

Force cleanup even if the task is still running. WARNING: Use with extreme caution - only when a task is stuck for a very long time. Forcing cleanup of a running task may lead to inconsistent state.

Responses

200

Cleanup completed successfully

404

Task not found

500

Internal server error

delete/api/device-management/devices/import/cleanup/{task_id}
/api/device-management/devices/import/cleanup/{task_id}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "task_id": "123e4567-e89b-12d3-a456-426614174000",
  • "message": "Successfully cleaned up import task"
}

GetImportTaskStatus

Returns the current state of an async import task plus the full per-device result list. items[] is updated as workers finish each device, so polling shows progress without a separate per-device endpoint.

path Parameters
task_id
required
string <uuid>

Task id returned by POST /device-management/devices/import.

Responses

200

Task state and per-device results.

404

Task not found.

500

Internal server error.

get/api/device-management/devices/import/status/{task_id}
/api/device-management/devices/import/status/{task_id}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "task_id": "string",
  • "state": "INIT",
  • "status": "RUNNING",
  • "progress": 0,
  • "total": 0,
  • "successful": 0,
  • "failed": 0,
  • "error_message": "string",
  • "items":
    [
    ],
  • "created_at": "2026-10-29T14:02:58Z",
  • "updated_at": "2026-10-29T14:02:58Z"
}

DeviceBackup

List device backup jobs

query Parameters
page
integer >= 1
Default: 1
page_size
integer [ 1 .. 500 ]
Default: 20
status
string (BackupJobStatus)
Enum: "DRAFT" "READY" "RUNNING" "PAUSING" "PAUSED" "CANCELLING" "COMPLETED" "FAILED"

Filter by job lifecycle status

Responses

200

Paginated list of device backup jobs

401

Authentication required

get/api/v1/fleet/backup-restore/jobs/device-backup
/api/v1/fleet/backup-restore/jobs/device-backup

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "data":
    [
    ],
  • "pagination":
    {
    }
}

Create a device backup job

Creates a new device backup job. The job starts in DRAFT state if the config is incomplete, or READY state if the config is fully specified.

Config requires for READY: deviceTargets (non-empty). backupType defaults to ucs. Config optional: batchSize (default 5), backupFileName (custom filename prefix), encryption, retention, storageTarget. Backups are staged locally before an optional upload to the named remote storage target.

Request Body schema: application/json
name
required
string non-empty

Unique name for this backup job.

description
string

Optional human-readable description.

executionMode
string
Enum: "SCHEDULED" "ON_DEMAND"

Job execution mode: "SCHEDULED" or "ON_DEMAND". On create: if omitted, defaults to SCHEDULED if config.schedule is present, otherwise ON_DEMAND.

enabled
boolean

Whether this job is enabled. Defaults to true on creation.

config
object (BackupJobConfig)

Configuration for a device backup job. Creates BIG-IP UCS or F5OS-A rSeries chassis configuration backups for target devices. Omit instanceType for legacy BIG-IP jobs. F5OS-A targets are rSeries provider UUIDs; backupType must be omitted for F5OS-A jobs. batchSize controls how many devices are backed up in parallel (default 5).

Responses

201

Device backup job created

400

Invalid request

401

Authentication required

409

Job name already exists

post/api/v1/fleet/backup-restore/jobs/device-backup
/api/v1/fleet/backup-restore/jobs/device-backup

Request samples

Content type
application/json
Example
Copy
Expand all Collapse all
{
  • "name": "daily-backup-prod",
  • "description": "Daily UCS backup for prod devices",
  • "config":
    {
    }
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "id": "string",
  • "workflowId": "string",
  • "workflowJobId": "string",
  • "name": "string",
  • "description": "string",
  • "status": "DRAFT",
  • "enabled": true,
  • "config":
    {
    },
  • "schedulerTaskId": "string",
  • "nextRunAt": "2026-10-29T14:02:58Z",
  • "lastRunAt": "2026-10-29T14:02:58Z",
  • "createdBy": "string",
  • "modifiedBy": "string",
  • "createdAt": "2026-10-29T14:02:58Z",
  • "updatedAt": "2026-10-29T14:02:58Z"
}

Get device backup job details

Returns full job details including configuration and current lifecycle status.

path Parameters
jobId
required
string <uuid>

Responses

200

Device backup job details

401

Authentication required

404

Resource not found

get/api/v1/fleet/backup-restore/jobs/device-backup/{jobId}
/api/v1/fleet/backup-restore/jobs/device-backup/{jobId}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "id": "a1b2c3d4-0000-0000-0000-000000000001",
  • "workflowId": "wf-0000-0000-0000-000000000001",
  • "workflowJobId": "wfj-0000-0000-0000-000000000001",
  • "name": "daily-backup-prod",
  • "description": "Daily UCS backup for prod devices",
  • "status": "READY",
  • "enabled": true,
  • "config":
    {
    },
  • "createdAt": "2026-08-01T09:00:00Z",
  • "updatedAt": "2026-08-01T09:05:00Z"
}

Replace device backup job configuration

Replaces the mutable fields of a device backup job. The request must include name, description, enabled, and the complete config object. When config.encryption is present but passphrase is omitted, the stored passphrase is retained. Omit config.encryption to disable encryption. Only allowed when the job is in DRAFT or READY state. Returns 409 if the job is in a non-mutable state (e.g. RUNNING).

path Parameters
jobId
required
string <uuid>
Request Body schema: application/json
name
required
string non-empty
description
required
string
enabled
required
boolean
config
required
object (BackupJobConfig)

Configuration for a device backup job. Creates BIG-IP UCS or F5OS-A rSeries chassis configuration backups for target devices. Omit instanceType for legacy BIG-IP jobs. F5OS-A targets are rSeries provider UUIDs; backupType must be omitted for F5OS-A jobs. batchSize controls how many devices are backed up in parallel (default 5).

Responses

200

Job updated

400

Invalid request

401

Authentication required

404

Resource not found

409

Job cannot be updated in its current state

put/api/v1/fleet/backup-restore/jobs/device-backup/{jobId}
/api/v1/fleet/backup-restore/jobs/device-backup/{jobId}

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "name": "daily-backup-prod",
  • "description": "Updated description",
  • "enabled": true,
  • "config":
    {
    }
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "id": "string",
  • "workflowId": "string",
  • "workflowJobId": "string",
  • "name": "string",
  • "description": "string",
  • "status": "DRAFT",
  • "enabled": true,
  • "config":
    {
    },
  • "schedulerTaskId": "string",
  • "nextRunAt": "2026-10-29T14:02:58Z",
  • "lastRunAt": "2026-10-29T14:02:58Z",
  • "createdBy": "string",
  • "modifiedBy": "string",
  • "createdAt": "2026-10-29T14:02:58Z",
  • "updatedAt": "2026-10-29T14:02:58Z"
}

Delete a device backup job

Permanently deletes a device backup job. Only allowed when the job is NOT in RUNNING state. Returns 409 if the job is currently RUNNING.

path Parameters
jobId
required
string <uuid>

Responses

204

Job deleted

401

Authentication required

404

Resource not found

409

Job cannot be deleted in its current state (e.g. RUNNING)

delete/api/v1/fleet/backup-restore/jobs/device-backup/{jobId}
/api/v1/fleet/backup-restore/jobs/device-backup/{jobId}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "error": "string",
  • "code": "string"
}

Clone a device backup job

Creates an independent backup job from the source job's configuration using the supplied unique name. Copies description and enabled state; recalculates DRAFT or READY status and derives executionMode from schedule. The clone has a new ID and workflowJobId, new audit fields, and its own Vault entry for any encryption passphrase. retainMasterKey is copied as an option; existing backup files and their secrets are not cloned. Enabled scheduled clones get their own scheduler task when the copied schedule has a valid next run. Scheduled clones can also be activated manually. Execution history is not copied.

path Parameters
jobId
required
string <uuid>
Request Body schema: application/json
name
required
string non-empty

Unique name for this backup job.

Responses

201

Independent device backup job created

400

Invalid request

401

Authentication required

404

Resource not found

409

Job name already exists

500

Failed to copy secrets or create the cloned job

post/api/v1/fleet/backup-restore/jobs/device-backup/{jobId}/clone
/api/v1/fleet/backup-restore/jobs/device-backup/{jobId}/clone

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "name": "prod-weekly-backup-clone"
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "id": "string",
  • "workflowId": "string",
  • "workflowJobId": "string",
  • "name": "string",
  • "description": "string",
  • "status": "DRAFT",
  • "enabled": true,
  • "config":
    {
    },
  • "schedulerTaskId": "string",
  • "nextRunAt": "2026-10-29T14:02:58Z",
  • "lastRunAt": "2026-10-29T14:02:58Z",
  • "createdBy": "string",
  • "modifiedBy": "string",
  • "createdAt": "2026-10-29T14:02:58Z",
  • "updatedAt": "2026-10-29T14:02:58Z"
}

Activate a device backup job

Starts a new execution for a READY device backup job, including jobs that have a schedule. Manual activation does not require an on-demand job. Devices whose BACKUP lock cannot be acquired (locked by another job) are seeded as SKIPPED and the job proceeds with the remaining devices. Activation only fails with 409 when every target device is locked.

path Parameters
jobId
required
string <uuid>
Request Body schema: application/json
changeRequest
string

Optional change-request reference recorded on the execution.

Responses

202

Execution accepted and started

400

Invalid request

401

Authentication required

404

Resource not found

409

Job is not READY, is disabled, already has a RUNNING execution, or every target device is locked

post/api/v1/fleet/backup-restore/jobs/device-backup/{jobId}/activate
/api/v1/fleet/backup-restore/jobs/device-backup/{jobId}/activate

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "changeRequest": "string"
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "executionId": "string",
  • "jobId": "string",
  • "status": "RUNNING",
  • "batchSize": 0,
  • "totalDevices": 0,
  • "skippedDevices": 0
}

Pause a running device backup job

Requests a drain: in-flight devices finish their current step, no new devices are claimed, then the execution and job transition to PAUSED. Device locks are retained while paused. Rejected for disabled jobs.

path Parameters
jobId
required
string <uuid>

Responses

202

Pause requested

401

Authentication required

404

Resource not found

409

Job is disabled or not in a pausable state

post/api/v1/fleet/backup-restore/jobs/device-backup/{jobId}/pause
/api/v1/fleet/backup-restore/jobs/device-backup/{jobId}/pause

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "error": "string",
  • "code": "string"
}

Resume a paused device backup job

Flips the job back to RUNNING and spawns a fresh worker pool over the remaining non-terminal devices. Rejected for disabled jobs and while the job is still draining (PAUSING).

path Parameters
jobId
required
string <uuid>

Responses

202

Resume requested

401

Authentication required

404

Resource not found

409

Job is disabled, still PAUSING, or not PAUSED

post/api/v1/fleet/backup-restore/jobs/device-backup/{jobId}/resume
/api/v1/fleet/backup-restore/jobs/device-backup/{jobId}/resume

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "error": "string",
  • "code": "string"
}

Cancel a device backup job

Requests a drain identical to pause, but remaining non-terminal devices are marked CANCELLED and all device locks are released. Idempotent while CANCELLING; allowed for disabled jobs.

path Parameters
jobId
required
string <uuid>

Responses

202

Cancel requested

401

Authentication required

404

Resource not found

409

Job is not in a cancellable state

post/api/v1/fleet/backup-restore/jobs/device-backup/{jobId}/cancel
/api/v1/fleet/backup-restore/jobs/device-backup/{jobId}/cancel

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "error": "string",
  • "code": "string"
}

List executions for a device backup job

path Parameters
jobId
required
string <uuid>
query Parameters
page
integer >= 1
Default: 1
page_size
integer [ 1 .. 500 ]
Default: 20

Responses

200

Paginated list of backup executions

401

Authentication required

404

Resource not found

get/api/v1/fleet/backup-restore/jobs/device-backup/{jobId}/executions
/api/v1/fleet/backup-restore/jobs/device-backup/{jobId}/executions

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "data":
    [
    ],
  • "pagination":
    {
    }
}

Get a device backup job execution

path Parameters
jobId
required
string <uuid>
executionId
required
string <uuid>

Responses

200

Backup execution details, including instanceProgress

401

Authentication required

404

Resource not found

get/api/v1/fleet/backup-restore/jobs/device-backup/{jobId}/executions/{executionId}
/api/v1/fleet/backup-restore/jobs/device-backup/{jobId}/executions/{executionId}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "id": "string",
  • "jobId": "string",
  • "status": "RUNNING",
  • "changeRequest": "string",
  • "batchSize": 0,
  • "totalDevices": 0,
  • "completedDevices": 0,
  • "failedDevices": 0,
  • "skippedDevices": 0,
  • "createdBy": "string",
  • "modifiedBy": "string",
  • "startedAt": "2026-10-29T14:02:58Z",
  • "endedAt": "2026-10-29T14:02:58Z",
  • "createdAt": "2026-10-29T14:02:58Z",
  • "updatedAt": "2026-10-29T14:02:58Z",
  • "instanceProgress":
    {
    }
}

List per-device state for a backup execution

path Parameters
jobId
required
string <uuid>
executionId
required
string <uuid>

Responses

200

Per-device backup state for this execution

401

Authentication required

404

Resource not found

get/api/v1/fleet/backup-restore/jobs/device-backup/{jobId}/executions/{executionId}/devices
/api/v1/fleet/backup-restore/jobs/device-backup/{jobId}/executions/{executionId}/devices

Response samples

Content type
application/json
Copy
Expand all Collapse all
[
  • {
    }
]

DeviceRestore

List device restore jobs

query Parameters
page
integer >= 1
Default: 1
page_size
integer [ 1 .. 500 ]
Default: 20
status
string (RestoreJobStatus)
Enum: "DRAFT" "READY" "RUNNING" "PAUSING" "PAUSED" "CANCELLING" "COMPLETED" "FAILED" "CANCELLED"
Example: status=DRAFT

Filter by job lifecycle status

Responses

200

Paginated list of device restore jobs

401

Authentication required

get/api/v1/fleet/backup-restore/jobs/device-restore
/api/v1/fleet/backup-restore/jobs/device-restore

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "data":
    [
    ],
  • "pagination":
    {
    }
}

Create a device restore job

Creates a new device restore job in DRAFT state.

Each entry in restoreItems identifies a completed backup file and the devices it should be restored onto. The source device is resolved automatically from backupFileName.

Jobs start in DRAFT. Once all required fields are present and every backup file resolves unambiguously, the job transitions to READY.

Request Body schema: application/json
name
required
string [ 1 .. 255 ] characters
description
string
enabled
boolean
config
object (RestoreJobConfig)

Omit instanceType for legacy BIG-IP UCS restore. F5OS-A restores select only AVAILABLE F5OS artifacts with verified byte count and checksum; targets are rSeries provider UUIDs. F5OS-A restore items must explicitly set cleanReset to true. F5OS-A restores always perform a clean reset: fleet-manager resets and reboots the chassis, restores its admin password to the Vault value and applies the supplied primary key and salt. Clean reset deletes tenant and user configuration; management IP is preserved.

Responses

201

Device restore job created (in DRAFT or READY state)

400

Invalid request

401

Authentication required

409

Job name already exists

post/api/v1/fleet/backup-restore/jobs/device-restore
/api/v1/fleet/backup-restore/jobs/device-restore

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "name": "restore-bigip-prod-01",
  • "description": "Restore after upgrade failure",
  • "config":
    {
    }
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "id": "string",
  • "workflowJobId": "string",
  • "workflowId": "string",
  • "type": "DEVICE_RESTORE",
  • "name": "string",
  • "description": "string",
  • "status": "DRAFT",
  • "executionMode": "ON_DEMAND",
  • "enabled": true,
  • "config":
    {
    },
  • "warnings":
    [
    ],
  • "createdBy": "string",
  • "modifiedBy": "string",
  • "createdAt": "2026-10-29T14:02:58Z",
  • "updatedAt": "2026-10-29T14:02:58Z"
}

Get device restore job details

Returns full job details. HA warnings are included when applicable.

path Parameters
jobId
required
string <uuid>

Responses

200

Device restore job details

401

Authentication required

404

Resource not found

get/api/v1/fleet/backup-restore/jobs/device-restore/{jobId}
/api/v1/fleet/backup-restore/jobs/device-restore/{jobId}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "id": "string",
  • "workflowJobId": "string",
  • "workflowId": "string",
  • "type": "DEVICE_RESTORE",
  • "name": "string",
  • "description": "string",
  • "status": "DRAFT",
  • "executionMode": "ON_DEMAND",
  • "enabled": true,
  • "config":
    {
    },
  • "warnings":
    [
    ],
  • "createdBy": "string",
  • "modifiedBy": "string",
  • "createdAt": "2026-10-29T14:02:58Z",
  • "updatedAt": "2026-10-29T14:02:58Z"
}

Update a device restore job

Updates mutable fields of a device restore job. Only allowed when the job is in DRAFT or READY state. Config is re-validated and the job status is recalculated after update.

path Parameters
jobId
required
string <uuid>
Request Body schema: application/json
name
string [ 1 .. 255 ] characters
description
string
enabled
boolean
config
object (RestoreJobConfig)

Omit instanceType for legacy BIG-IP UCS restore. F5OS-A restores select only AVAILABLE F5OS artifacts with verified byte count and checksum; targets are rSeries provider UUIDs. F5OS-A restore items must explicitly set cleanReset to true. F5OS-A restores always perform a clean reset: fleet-manager resets and reboots the chassis, restores its admin password to the Vault value and applies the supplied primary key and salt. Clean reset deletes tenant and user configuration; management IP is preserved.

Responses

200

Updated device restore job

400

Invalid request

401

Authentication required

404

Resource not found

409

Job is not in a mutable state or name already exists

put/api/v1/fleet/backup-restore/jobs/device-restore/{jobId}
/api/v1/fleet/backup-restore/jobs/device-restore/{jobId}

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "name": "string",
  • "description": "string",
  • "enabled": true,
  • "config":
    {
    }
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "id": "string",
  • "workflowJobId": "string",
  • "workflowId": "string",
  • "type": "DEVICE_RESTORE",
  • "name": "string",
  • "description": "string",
  • "status": "DRAFT",
  • "executionMode": "ON_DEMAND",
  • "enabled": true,
  • "config":
    {
    },
  • "warnings":
    [
    ],
  • "createdBy": "string",
  • "modifiedBy": "string",
  • "createdAt": "2026-10-29T14:02:58Z",
  • "updatedAt": "2026-10-29T14:02:58Z"
}

Delete a device restore job

Soft-deletes the restore job and hard-deletes its workflow_jobs row. Only allowed when the job is in DRAFT, READY, COMPLETED, FAILED, or CANCELLED state.

path Parameters
jobId
required
string <uuid>

Responses

204

Job deleted

401

Authentication required

404

Resource not found

409

Job is in a non-deletable state (e.g. RUNNING)

delete/api/v1/fleet/backup-restore/jobs/device-restore/{jobId}
/api/v1/fleet/backup-restore/jobs/device-restore/{jobId}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "error": "string",
  • "code": "string"
}

Activate a device restore job

Starts a new execution for a READY device restore job.

path Parameters
jobId
required
string <uuid>
Request Body schema: application/json
batchSize
integer

Number of devices processed in parallel for this execution. Defaults to 1.

changeRequest
string

Optional change-request reference recorded on the execution.

Responses

202

Execution accepted and started

400

Invalid request

401

Authentication required

404

Resource not found

409

Job is not READY, already has a RUNNING execution, or a target device is locked

post/api/v1/fleet/backup-restore/jobs/device-restore/{jobId}/activate
/api/v1/fleet/backup-restore/jobs/device-restore/{jobId}/activate

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "batchSize": 0,
  • "changeRequest": "string"
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "executionId": "string",
  • "status": "RUNNING"
}

Cancel a device restore job

Requests cancellation of the job's active execution. The execution and job move to CANCELLING and cancellable devices are marked CANCELLED immediately. Clean-reset devices become non-cancellable when reset preparation starts. Devices already inside RESTORE or RECOVERY are not interrupted and run to completion; once they finish the execution becomes CANCELLED and the job returns to READY. Idempotent while CANCELLING.

path Parameters
jobId
required
string <uuid>

Responses

200

Cancel accepted

401

Authentication required

404

Resource not found

409

Job has no active execution to cancel (RUNNING, PAUSING, PAUSED or CANCELLING)

post/api/v1/fleet/backup-restore/jobs/device-restore/{jobId}/cancel
/api/v1/fleet/backup-restore/jobs/device-restore/{jobId}/cancel

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "jobId": "string",
  • "message": "string",
  • "runningDevices": 0
}

Pause the running restore execution for a job (HITL)

Requests a pause of the job's in-progress restore execution. In-flight devices checkpoint at the safe point immediately before the irreversible RESTORE step (LoadUCS) for BIG-IP, or before CLEAN_RESET for F5OS-A, instead of proceeding; devices not yet started park at the next batch boundary. Rejected for disabled jobs.

path Parameters
jobId
required
string <uuid>

Responses

202

Pause requested

401

Authentication required

404

Resource not found

409

Job is disabled or execution is not in a pausable state

post/api/v1/fleet/backup-restore/jobs/device-restore/{jobId}/pause
/api/v1/fleet/backup-restore/jobs/device-restore/{jobId}/pause

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "error": "string",
  • "code": "string"
}

Resume a paused restore execution

Resumes a PAUSED restore execution. Checkpointed devices continue from where they were parked. Rejected for disabled jobs and while the execution is still draining (PAUSING).

path Parameters
jobId
required
string <uuid>

Responses

202

Resume requested

401

Authentication required

404

Resource not found

409

Job is disabled or execution is still PAUSING / not PAUSED

post/api/v1/fleet/backup-restore/jobs/device-restore/{jobId}/resume
/api/v1/fleet/backup-restore/jobs/device-restore/{jobId}/resume

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "error": "string",
  • "code": "string"
}

List executions for a device restore job

path Parameters
jobId
required
string <uuid>
query Parameters
page
integer >= 1
Default: 1
page_size
integer [ 1 .. 500 ]
Default: 20

Responses

200

Paginated list of restore executions

401

Authentication required

404

Resource not found

get/api/v1/fleet/backup-restore/jobs/device-restore/{jobId}/executions
/api/v1/fleet/backup-restore/jobs/device-restore/{jobId}/executions

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "data":
    [
    ],
  • "pagination":
    {
    }
}

Get a device restore job execution

path Parameters
jobId
required
string <uuid>
executionId
required
string <uuid>

Responses

200

Restore execution details, including instanceProgress

401

Authentication required

404

Resource not found

get/api/v1/fleet/backup-restore/jobs/device-restore/{jobId}/executions/{executionId}
/api/v1/fleet/backup-restore/jobs/device-restore/{jobId}/executions/{executionId}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "id": "string",
  • "jobId": "string",
  • "status": "RUNNING",
  • "changeRequest": "string",
  • "batchSize": 0,
  • "currentBatch": 0,
  • "totalDevices": 0,
  • "createdBy": "string",
  • "modifiedBy": "string",
  • "startedAt": "2026-10-29T14:02:58Z",
  • "endedAt": "2026-10-29T14:02:58Z",
  • "createdAt": "2026-10-29T14:02:58Z",
  • "updatedAt": "2026-10-29T14:02:58Z",
  • "instanceProgress":
    {
    }
}

Export Management

Test connectivity to a new export destination

Runs validation and connectivity checks without persisting the destination. Omitted or null ca means no custom CA; a UUID selects a trust-store CA.

Request Body schema: application/json
name
required
string [ 1 .. 255 ] characters

Unique identifier for the destination (used in UI + audit log).

platform_type
required
string (ExportPlatformType)
Enum: "splunk" "datadog" "elk" "newrelic" "clickhouse" "custom"

Supported platform types for export destinations. clickhouse is documented for the forthcoming external ClickHouse logs-only exporter tile — backend support pending.

endpoint_url
required
string <uri>

HTTPS endpoint (SSRF-validated). Splunk HEC uses port 8088.

authentication_type
required
string (ExportAuthenticationType)
Enum: "bearer_token" "hec_token" "api_key" "basic_auth" "none"

Authentication mechanism used against the destination. hec_token sends Authorization: Splunk <token> and is aliased with bearer_token for the splunk_hec exporter.

credentials_token
string

Secret material. Required unless authentication_type=none. Stored only in Vault and the K8s export-credentials secret — never returned by any API.

enabled
boolean
Default: true

Enable streaming for this destination. Defaults to true when omitted.

tls_verify
boolean
Default: true

Verify server certificate. Default true. Set false for self-signed endpoints.

ca
string <uuid> Nullable

Optional trust-store CA identifier. Omitted or null means no custom CA; a UUID is resolved from the trust store.

log_types
Array of strings
Items Enum: "sslo_logs" "irule_logs" "otel_logs"

Array of log types to export to ClickHouse. Only applicable when platform_type=clickhouse. If omitted or empty, no logs are exported. Multiple types can be selected for simultaneous streaming.

request_timeout_ms
integer [ 1000 .. 300000 ]
Default: 60000
batch_size
integer [ 1 .. 10000 ]
Default: 500
compression
string (ExportCompressionType)
Enum: "gzip" "deflate" "none"
retry_max_attempts
integer [ 0 .. 10 ]
Default: 3
clickhouse_database
string

ClickHouse database name. Required when platform_type=clickhouse.

clickhouse_logs_table
string

ClickHouse target table for logs. Required when platform_type=clickhouse.

clickhouse_username
string

ClickHouse username. Required when platform_type=clickhouse. Password goes via credentials_token.

Responses

200

Test executed (see response body for result)

400

Invalid request or connection test failed

post/api/export-management/destinations/test
/api/export-management/destinations/test

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "name": "splunk-prod-hec",
  • "platform_type": "splunk",
  • "authentication_type": "bearer_token",
  • "credentials_token": "string",
  • "enabled": true,
  • "tls_verify": true,
  • "ca": "string",
  • "log_types":
    [
    ],
  • "request_timeout_ms": 60000,
  • "batch_size": 500,
  • "compression": "gzip",
  • "retry_max_attempts": 3,
  • "clickhouse_database": "otel",
  • "clickhouse_logs_table": "otel_logs",
  • "clickhouse_username": "otel"
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "success": true,
  • "reachable": true,
  • "authenticated": true,
  • "message": "string",
  • "latency": "125ms"
}

List all export destinations

Responses

200

List of export destinations

500

Internal server error

get/api/export-management/destinations
/api/export-management/destinations

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "count": 0,
  • "destinations":
    [
    ]
}

Create a new export destination

Creates an OTEL export destination for streaming telemetry to an external observability platform. Omitted or null ca means no custom CA; a UUID selects a trust-store CA. Fast validation and persistence complete synchronously; destination connectivity testing and OTEL Collector reconciliation run asynchronously. Poll GET /export-management/destinations/{id} until deployment_status is active, inactive, or error.

Request Body schema: application/json
name
required
string [ 1 .. 255 ] characters

Unique identifier for the destination (used in UI + audit log).

platform_type
required
string (ExportPlatformType)
Enum: "splunk" "datadog" "elk" "newrelic" "clickhouse" "custom"

Supported platform types for export destinations. clickhouse is documented for the forthcoming external ClickHouse logs-only exporter tile — backend support pending.

endpoint_url
required
string <uri>

HTTPS endpoint (SSRF-validated). Splunk HEC uses port 8088.

authentication_type
required
string (ExportAuthenticationType)
Enum: "bearer_token" "hec_token" "api_key" "basic_auth" "none"

Authentication mechanism used against the destination. hec_token sends Authorization: Splunk <token> and is aliased with bearer_token for the splunk_hec exporter.

credentials_token
string

Secret material. Required unless authentication_type=none. Stored only in Vault and the K8s export-credentials secret — never returned by any API.

enabled
boolean
Default: true

Enable streaming for this destination. Defaults to true when omitted.

tls_verify
boolean
Default: true

Verify server certificate. Default true. Set false for self-signed endpoints.

ca
string <uuid> Nullable

Optional trust-store CA identifier. Omitted or null means no custom CA; a UUID is resolved from the trust store.

log_types
Array of strings
Items Enum: "sslo_logs" "irule_logs" "otel_logs"

Array of log types to export to ClickHouse. Only applicable when platform_type=clickhouse. If omitted or empty, no logs are exported. Multiple types can be selected for simultaneous streaming.

request_timeout_ms
integer [ 1000 .. 300000 ]
Default: 60000
batch_size
integer [ 1 .. 10000 ]
Default: 500
compression
string (ExportCompressionType)
Enum: "gzip" "deflate" "none"
retry_max_attempts
integer [ 0 .. 10 ]
Default: 3
clickhouse_database
string

ClickHouse database name. Required when platform_type=clickhouse.

clickhouse_logs_table
string

ClickHouse target table for logs. Required when platform_type=clickhouse.

clickhouse_username
string

ClickHouse username. Required when platform_type=clickhouse. Password goes via credentials_token.

Responses

202

Destination accepted for asynchronous validation and collector reconciliation. Poll the Location URL until a terminal deployment_status is returned.

400

Validation failed (name/URL/auth/TLS pre-flight)

409

Destination with the same name already exists

500

Internal server error

post/api/export-management/destinations
/api/export-management/destinations

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "name": "splunk-prod-hec",
  • "platform_type": "splunk",
  • "authentication_type": "bearer_token",
  • "credentials_token": "string",
  • "enabled": true,
  • "tls_verify": true,
  • "ca": "string",
  • "log_types":
    [
    ],
  • "request_timeout_ms": 60000,
  • "batch_size": 500,
  • "compression": "gzip",
  • "retry_max_attempts": 3,
  • "clickhouse_database": "otel",
  • "clickhouse_logs_table": "otel_logs",
  • "clickhouse_username": "otel"
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "id": "string",
  • "name": "string",
  • "platform_type": "splunk",
  • "endpoint_url": "http://example.com",
  • "enabled": true,
  • "authentication_type": "bearer_token",
  • "tls_verify": true,
  • "ca": "string",
  • "request_timeout_ms": 0,
  • "batch_size": 0,
  • "compression": "gzip",
  • "retry_max_attempts": 0,
  • "deployment_status": "pending",
  • "tested_at": "2026-10-29T14:02:58Z",
  • "last_error": "string",
  • "created_at": "2026-10-29T14:02:58Z",
  • "updated_at": "2026-10-29T14:02:58Z",
  • "status_message": "string",
  • "clickhouse_database": "string",
  • "clickhouse_logs_table": "string",
  • "clickhouse_username": "string",
  • "log_types":
    [
    ]
}

Get a single export destination

path Parameters
id
required
string <uuid>

Export destination UUID

Responses

200

Destination details

404

Destination not found

500

Internal server error

get/api/export-management/destinations/{id}
/api/export-management/destinations/{id}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "id": "string",
  • "name": "string",
  • "platform_type": "splunk",
  • "endpoint_url": "http://example.com",
  • "enabled": true,
  • "authentication_type": "bearer_token",
  • "tls_verify": true,
  • "ca": "string",
  • "request_timeout_ms": 0,
  • "batch_size": 0,
  • "compression": "gzip",
  • "retry_max_attempts": 0,
  • "deployment_status": "pending",
  • "tested_at": "2026-10-29T14:02:58Z",
  • "last_error": "string",
  • "created_at": "2026-10-29T14:02:58Z",
  • "updated_at": "2026-10-29T14:02:58Z",
  • "status_message": "string",
  • "clickhouse_database": "string",
  • "clickhouse_logs_table": "string",
  • "clickhouse_username": "string",
  • "log_types":
    [
    ]
}

Update an export destination

Partially updates mutable fields on an existing destination. Omitted fields, including ca and tls_verify, retain their saved values. ca: null clears the custom CA; a CA UUID replaces it. tls_verify: false explicitly disables certificate verification. Name-only updates are synchronous and do not restart the collector. Configuration-changing updates are validated, including connection checks, before persistence; failed validation leaves the saved destination unchanged. When collector reconciliation is needed, orchestration and restart requests run inline before the response. The subsequent Kubernetes rollout is asynchronous. deployment_status: active does not confirm rollout completion or telemetry delivery.

path Parameters
id
required
string <uuid>

Export destination UUID

Request Body schema: application/json
name
string [ 1 .. 255 ] characters
endpoint_url
string <uri>
authentication_type
string (ExportAuthenticationType)
Enum: "bearer_token" "hec_token" "api_key" "basic_auth" "none"

Authentication mechanism used against the destination. hec_token sends Authorization: Splunk <token> and is aliased with bearer_token for the splunk_hec exporter.

credentials_token
string
enabled
boolean
tls_verify
boolean
ca
string <uuid> Nullable

Trust-store CA identifier. Omitted retains the saved CA, null clears it, and a UUID replaces it.

request_timeout_ms
integer [ 1000 .. 300000 ]
batch_size
integer [ 1 .. 10000 ]
clickhouse_database
string

ClickHouse database name.

clickhouse_logs_table
string

ClickHouse target table for logs.

clickhouse_username
string

ClickHouse username.

compression
string (ExportCompressionType)
Enum: "gzip" "deflate" "none"
retry_max_attempts
integer [ 0 .. 10 ]
log_types
Array of strings
Items Enum: "sslo_logs" "irule_logs" "otel_logs"

Array of log types to export. Only applicable when platform_type=clickhouse.

Responses

200

Update processing completed; inspect deployment_status and last_error. Kubernetes rollout completion and telemetry delivery are not confirmed.

400

Validation failed

404

Destination not found

409

Name conflict on rename

422

Connection validation failed; the saved destination is unchanged

500

Internal server error

put/api/export-management/destinations/{id}
/api/export-management/destinations/{id}

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "name": "string",
  • "endpoint_url": "http://example.com",
  • "authentication_type": "bearer_token",
  • "credentials_token": "string",
  • "enabled": true,
  • "tls_verify": true,
  • "ca": "string",
  • "request_timeout_ms": 1000,
  • "batch_size": 1,
  • "clickhouse_database": "string",
  • "clickhouse_logs_table": "string",
  • "clickhouse_username": "string",
  • "compression": "gzip",
  • "retry_max_attempts": 0,
  • "log_types":
    [
    ]
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "id": "string",
  • "name": "string",
  • "platform_type": "splunk",
  • "endpoint_url": "http://example.com",
  • "enabled": true,
  • "authentication_type": "bearer_token",
  • "tls_verify": true,
  • "ca": "string",
  • "request_timeout_ms": 0,
  • "batch_size": 0,
  • "compression": "gzip",
  • "retry_max_attempts": 0,
  • "deployment_status": "pending",
  • "tested_at": "2026-10-29T14:02:58Z",
  • "last_error": "string",
  • "created_at": "2026-10-29T14:02:58Z",
  • "updated_at": "2026-10-29T14:02:58Z",
  • "status_message": "string",
  • "clickhouse_database": "string",
  • "clickhouse_logs_table": "string",
  • "clickhouse_username": "string",
  • "log_types":
    [
    ]
}

Delete an export destination

Deletes the destination and detaches the exporter from the running collector: removes the token from the export-credentials secret and restarts the collector so config-builder regenerates config without this row.

path Parameters
id
required
string <uuid>

Export destination UUID

Responses

202

Destination was removed from the database and Vault, but the collector restart failed. Retry collector reconciliation with apply-all.

204

Destination deleted

404

Destination not found

500

Internal server error

delete/api/export-management/destinations/{id}
/api/export-management/destinations/{id}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "error": "string",
  • "message": "string",
  • "details": "string",
  • "status": "string"
}

Test connectivity to an export destination

Runs validation and connectivity checks against the destination endpoint. With no request body, tests the saved configuration, including its CA and TLS settings, and records the test result. With an explicit candidate body, tests unsaved fields without modifying the saved destination or its test status. In a candidate body, omitted or null ca means no custom CA; a UUID selects a trust-store CA. Unlike a partial PUT update, an explicit candidate body never inherits the saved CA. Omitted tls_verify retains the saved setting.

path Parameters
id
required
string <uuid>

Export destination UUID

Request Body schema: application/json

Optional unsaved candidate fields, with no create-time defaults. Omit the body to test the saved configuration. Omit credentials_token to reuse the stored credential.

name
string [ 1 .. 255 ] characters
platform_type
string (ExportPlatformType)
Enum: "splunk" "datadog" "elk" "newrelic" "clickhouse" "custom"

Supported platform types for export destinations. clickhouse is documented for the forthcoming external ClickHouse logs-only exporter tile — backend support pending.

endpoint_url
string <uri>
authentication_type
string (ExportAuthenticationType)
Enum: "bearer_token" "hec_token" "api_key" "basic_auth" "none"

Authentication mechanism used against the destination. hec_token sends Authorization: Splunk <token> and is aliased with bearer_token for the splunk_hec exporter.

credentials_token
string

Candidate credential. Omit to reuse the stored credential.

enabled
boolean

Accepted for request compatibility; connection testing does not enable or disable streaming.

tls_verify
boolean

Verify the server certificate. Omitted retains the saved setting, including false.

ca
string <uuid> Nullable

Trust-store CA identifier. Omitted or null means no custom CA; a UUID selects a trust-store CA.

log_types
Array of strings
Items Enum: "sslo_logs" "irule_logs" "otel_logs"
request_timeout_ms
integer [ 1000 .. 300000 ]

Candidate timeout. Omitted retains the saved timeout.

batch_size
integer [ 1 .. 10000 ]
compression
string (ExportCompressionType)
Enum: "gzip" "deflate" "none"
retry_max_attempts
integer [ 0 .. 10 ]
clickhouse_database
string
clickhouse_logs_table
string
clickhouse_username
string

Responses

200

Test executed (may be success or failure — see response body)

404

Destination not found

500

Internal server error

post/api/export-management/destinations/{id}/test
/api/export-management/destinations/{id}/test

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "name": "string",
  • "platform_type": "splunk",
  • "endpoint_url": "http://example.com",
  • "authentication_type": "bearer_token",
  • "credentials_token": "string",
  • "enabled": true,
  • "tls_verify": true,
  • "ca": "string",
  • "log_types":
    [
    ],
  • "request_timeout_ms": 1000,
  • "batch_size": 1,
  • "compression": "gzip",
  • "retry_max_attempts": 0,
  • "clickhouse_database": "string",
  • "clickhouse_logs_table": "string",
  • "clickhouse_username": "string"
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "success": true,
  • "reachable": true,
  • "authenticated": true,
  • "message": "string",
  • "latency": "125ms"
}

Apply all active destinations to the OTEL collector

Batch reconciliation — merges all active destination tokens into export-credentials and restarts the collector once.

Responses

200

Reconciliation initiated

500

Internal server error

post/api/export-management/apply-all
/api/export-management/apply-all

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "status": "validation_success"
}

ExternalAuth

Get current external FQDN

Get the currently configured canonical external URL used by F5 Insight and the identity provider.

Responses

200

Current FQDN configuration retrieved successfully

500

Internal server error

get/api/auth/fqdn
/api/auth/fqdn

Response samples

Content type
application/json
Copy
Expand all Collapse all
{}

Configure external FQDN

Configure the canonical external FQDN used by F5 Insight and the identity provider. The operation runs asynchronously because it performs a Helm upgrade and reruns identity provider bootstrap to refresh the registered OIDC callback URL.

Request Body schema: application/json
target
required
string

External FQDN target. May include https scheme and port.

Responses

202

FQDN configuration task submitted

400

Invalid FQDN target

409

Another FQDN configuration task is already running

500

Internal server error

post/api/auth/fqdn
/api/auth/fqdn

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "target": "f5insights.example.com"
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{}

Get FQDN configuration status

Query the progress of an FQDN configuration task by task_id.

path Parameters
task_id
required
string <uuid>
Example: 123e4567-e89b-12d3-a456-426614174000

UUID of the FQDN configuration task

Responses

200

FQDN configuration status retrieved successfully

400

Invalid task_id format

404

Task not found

500

Internal server error

get/api/auth/fqdn/status/{task_id}
/api/auth/fqdn/status/{task_id}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "task_id": "123e4567-e89b-12d3-a456-426614174000",
  • "state": "APPLY",
  • "status": "RUNNING",
  • "progress": 60,
  • "error_message": "FQDN configuration failed: helm upgrade failed"
}

FQDN Configuration

Configure external FQDN

Configure the canonical external FQDN used by F5 Insight and Zitadel. The operation runs asynchronously because it performs a Helm upgrade and reruns Zitadel bootstrap to refresh the registered OIDC callback URL.

Request Body schema: application/json
target
required
string

External FQDN target. May include https scheme and port.

Responses

202

FQDN configuration task submitted

400

Invalid FQDN target

409

Another FQDN configuration task is already running

500

Internal server error

post/api/system/fqdn
/api/system/fqdn

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "target": "f5insights.example.com"
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{}

Get FQDN configuration status

Query the progress of an FQDN configuration task by task_id.

path Parameters
task_id
required
string <uuid>
Example: 123e4567-e89b-12d3-a456-426614174000

UUID of the FQDN configuration task

Responses

200

FQDN configuration status retrieved successfully

400

Invalid task_id format

404

Task not found

500

Internal server error

get/api/system/fqdn/status/{task_id}
/api/system/fqdn/status/{task_id}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "task_id": "123e4567-e89b-12d3-a456-426614174000",
  • "state": "APPLY",
  • "status": "RUNNING",
  • "progress": 60,
  • "error_message": "FQDN configuration failed: helm upgrade failed"
}

Feature Flags

Get all feature flags

Responses

200

List of all feature flags

500

Internal server error

get/api/featureflags/list
/api/featureflags/list

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "property1":
    {
    },
  • "property2":
    {
    }
}

Update feature flag

Request Body schema: application/json
name
required
string
enabled
required
boolean

Responses

200

Feature flag updated successfully

400

Bad request

500

Internal server error

post/api/featureflags/update
/api/featureflags/update

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "name": "string",
  • "enabled": true
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{ }

FlightChecks

List flight-check snapshots

Returns a paginated list of flight-check snapshots. Because a fleet accumulates many snapshots over time, callers should scope the query with the jobId, deviceId and/or phase filters (e.g. all snapshots for a given installation job, or both phases for one device in one job).

query Parameters
page
integer >= 1
Default: 1
page_size
integer [ 1 .. 500 ]
Default: 20
jobId
string <uuid>

Filter to snapshots captured under this installation job.

deviceId
string <uuid>

Filter to snapshots captured from this device.

phase
string
Enum: "PRE" "POST"

Filter to a single phase (PRE or POST).

Responses

200

Paginated list of flight-check snapshots

401

Authentication required

get/api/v1/fleet/upgrade/flight-checks/snapshots
/api/v1/fleet/upgrade/flight-checks/snapshots

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "data":
    [
    ],
  • "pagination":
    {
    }
}

Get a single flight-check snapshot by ID

Returns one PRE or POST flight-check snapshot, addressed by its own ID. The response includes the captured core-check results plus the snapshot's deviceId, jobId, phase (PRE/POST) and capturedAt timestamp.

path Parameters
snapshotId
required
string <uuid>

Unique ID of a flight-check snapshot.

Responses

200

Flight-check snapshot

401

Authentication required

404

Resource not found

get/api/v1/fleet/upgrade/flight-checks/snapshots/{snapshotId}
/api/v1/fleet/upgrade/flight-checks/snapshots/{snapshotId}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "id": "string",
  • "jobId": "string",
  • "deviceId": "string",
  • "phase": "PRE",
  • "capturedAt": "2026-10-29T14:02:58Z",
  • "trunkStatus":
    {
    },
  • "interfaceStatus":
    {
    },
  • "virtualServerState":
    {
    },
  • "poolHealth":
    {
    },
  • "poolMemberHealth":
    {
    },
  • "performanceAllStats":
    {
    },
  • "lagStatus":
    {
    },
  • "alarms":
    {
    },
  • "healthSummary":
    {
    },
  • "cluster":
    {
    },
  • "firmwareStatus":
    {
    },
  • "fpgaStatus":
    {
    },
  • "cores":
    {
    },
  • "tenantStatus":
    {
    },
  • "servicePods":
    {
    }
}

List PRE-vs-POST flight-check diffs

Returns a paginated list of PRE-vs-POST flight-check diffs. Because a fleet accumulates many diffs over time, callers should scope the query with the jobId and/or deviceId filters (e.g. all diffs for a given installation job, or the diff history for one device).

query Parameters
page
integer >= 1
Default: 1
page_size
integer [ 1 .. 500 ]
Default: 20
jobId
string <uuid>

Filter to diffs computed under this installation job.

deviceId
string <uuid>

Filter to diffs computed for this device.

Responses

200

Paginated list of flight-check diffs

401

Authentication required

get/api/v1/fleet/upgrade/flight-checks/diffs
/api/v1/fleet/upgrade/flight-checks/diffs

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "data":
    [
    ],
  • "pagination":
    {
    }
}

Get a single PRE-vs-POST flight-check diff by ID

Returns one PRE-vs-POST flight-check diff, addressed by its own ID. The response includes the per-check diff entries plus the diff's deviceId, jobId, computedAt timestamp, and back-links to the PRE and POST snapshots it was computed from (preSnapshotUrl / postSnapshotUrl — each resolvable via GET /api/v1/fleet/upgrade/flight-checks/snapshots/{snapshotId}).

path Parameters
diffId
required
string <uuid>

Unique ID of a flight-check diff.

Responses

200

Flight-check diff

401

Authentication required

404

Resource not found

get/api/v1/fleet/upgrade/flight-checks/diffs/{diffId}
/api/v1/fleet/upgrade/flight-checks/diffs/{diffId}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "id": "string",
  • "jobId": "string",
  • "deviceId": "string",
  • "degraded": true,
  • "preSnapshotUrl": "string",
  • "postSnapshotUrl": "string",
  • "computedAt": "2026-10-29T14:02:58Z",
  • "entries":
    [
    ]
}

Health

Health check endpoint

Returns the health status of the system manager service

Responses

200

Service is healthy

get/api/system/health
/api/system/health

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "success": true,
  • "data":
    {
    }
}

Get system version

Returns the current F5 Insight version information

Responses

200

Version information retrieved successfully

get/api/system/version
/api/system/version

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "success": true,
  • "data":
    {
    }
}

IdentityProviders

List identity providers

Returns all configured providers (LDAP, SAML).

Authenticated callers receive the full provider configuration. Unauthenticated callers receive the public login-page shape, which intentionally omits provider configuration details.

Responses

200

Success

500

Internal Error

get/api/auth/identity-providers
/api/auth/identity-providers

Response samples

Content type
application/json
Example
Copy
Expand all Collapse all
{
  • "providers":
    [
    ],
  • "local_login_enabled": true,
  • "total_count": 0
}

Create LDAP provider

Creates a new LDAP identity provider.

Create only provisions the provider. It does not activate or deactivate any provider. Use POST /auth/identity-providers/{id}/activate to enable a provider for login. The enabled field in the request body is ignored.

Request Body schema: application/json
name
required
string [ 1 .. 200 ] characters

1-200 characters. Must be unique.

enabled
boolean

Ignored by the server. New LDAP providers are created inactive. Use the activate endpoint to enable a provider for login.

ldap_config
required
object (LDAPConfig)

Responses

201

LDAP provider created inactive.

400

Bad Request

409

Provider name already exists

500

Internal Error

503

External identity provider management is not configured

post/api/auth/identity-providers/ldap
/api/auth/identity-providers/ldap

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "name": "Corporate LDAP",
  • "enabled": true,
  • "ldap_config":
    {
    }
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "id": "string",
  • "name": "string",
  • "provider_type": "ldap",
  • "enabled": true,
  • "ldap_config":
    {
    },
  • "saml_config":
    {},
  • "created_at": "2026-10-29T14:02:58Z",
  • "updated_at": "2026-10-29T14:02:58Z",
  • "last_sync": "2026-10-29T14:02:58Z"
}

Create SAML provider

Request Body schema: application/json
name
required
string
enabled
boolean
Default: true
saml_config
required
object (SAMLConfig)

Responses

201

SAML provider created

400

Bad Request

409

Provider name already exists

500

Internal Error

post/api/auth/identity-providers/saml
/api/auth/identity-providers/saml

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "name": "string",
  • "enabled": true,
  • "saml_config":
    {
    }
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "id": "string",
  • "name": "string",
  • "provider_type": "ldap",
  • "enabled": true,
  • "ldap_config":
    {
    },
  • "saml_config":
    {},
  • "created_at": "2026-10-29T14:02:58Z",
  • "updated_at": "2026-10-29T14:02:58Z",
  • "last_sync": "2026-10-29T14:02:58Z"
}

Update LDAP provider (full replace)

path Parameters
id
required
string
Request Body schema: application/json
name
required
string [ 1 .. 200 ] characters

1-200 characters. Must be unique.

enabled
boolean
ldap_config
required
object (LDAPConfig)

Responses

200

Success

400

Bad Request

404

Not Found

500

Internal Error

put/api/auth/identity-providers/ldap/{id}
/api/auth/identity-providers/ldap/{id}

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "name": "Corporate LDAP",
  • "enabled": true,
  • "ldap_config":
    {
    }
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "id": "string",
  • "name": "string",
  • "provider_type": "ldap",
  • "enabled": true,
  • "ldap_config":
    {
    },
  • "saml_config":
    {},
  • "created_at": "2026-10-29T14:02:58Z",
  • "updated_at": "2026-10-29T14:02:58Z",
  • "last_sync": "2026-10-29T14:02:58Z"
}

Update SAML provider (full replace)

path Parameters
id
required
string
Request Body schema: application/json
name
required
string
enabled
boolean
saml_config
required
object (SAMLConfig)

Responses

200

Success

400

Bad Request

404

Not Found

500

Internal Error

put/api/auth/identity-providers/saml/{id}
/api/auth/identity-providers/saml/{id}

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "name": "string",
  • "enabled": true,
  • "saml_config":
    {
    }
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "id": "string",
  • "name": "string",
  • "provider_type": "ldap",
  • "enabled": true,
  • "ldap_config":
    {
    },
  • "saml_config":
    {},
  • "created_at": "2026-10-29T14:02:58Z",
  • "updated_at": "2026-10-29T14:02:58Z",
  • "last_sync": "2026-10-29T14:02:58Z"
}

Validate provider config (without saving)

Request Body schema: application/json
provider_type
required
string
Enum: "ldap" "saml"
provider_id
string

Optional. Set when validating an existing provider (edit / "Check Connection" flow). When provider_id is set and bind_password is omitted, the API returns a clear error because stored passwords are never returned; the user must re-enter bind_password.

ldap_config
object (LDAPConfig)

Responses

200

Validation successful

400

Validation failed

500

Internal Error

post/api/auth/identity-providers/validate
/api/auth/identity-providers/validate

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "provider_type": "ldap",
  • "provider_id": "string",
  • "ldap_config":
    {
    }
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "status": "validation_success",
  • "error": "string",
  • "details":
    {
    }
}

Validate an LDAP user's credentials, attributes, and role mapping (Test User)

Performs a live per-user validation against an LDAP directory, mirroring the BIG-IP APM "Test User Credentials" panel:

  1. Connects and binds with the supplied service-account credentials.
  2. Locates the test user via the login attribute derived from user_filters (the first user_filters entry that does not contain = is treated as the login attribute; the remaining entries are ANDed into the search filter).
    1. Reads the test user's attributes and memberOf values. If memberOf is absent, searches ou=groups,<base_dn> for member or memberUid references to support OpenLDAP directories without the memberOf overlay.
    2. Resolves each resulting group DN to a group name via a base-scope read.
  3. Rebinds on the same connection as the test user to verify the password.
  4. Applies the currently-active LDAP identity provider's saved group-to-role mappings against the resolved groups and returns the group_mapping_test table (permit/deny per LDAP group). When no LDAP provider is active, every row is deny.

The submitted bind_password and test_password are used only for this request and are never logged, persisted, or echoed in the response.

Request Body schema: application/json
ldap_config
required
object (ValidateUserDetailsLDAPConfig)

Minimal LDAP configuration used by POST /auth/identity-providers/validate-user. Only the fields needed to bind, locate a test user, and read attributes are accepted here — the fields required by LDAPConfig for a saved provider (such as user_object_classes, user_unique_attribute, attributes) are intentionally omitted so admins can run a lightweight Test User check without filling out the full provider form.

Responses

200

Validation completed (per-step results are inside the payload)

400

Malformed request or missing required fields

500

Internal Error

post/api/auth/identity-providers/validate-user
/api/auth/identity-providers/validate-user

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "ldap_config":
    {
    }
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "status": "success",
  • "message": "string",
  • "user_information":
    {
    },
  • "resolved_ldap_groups":
    [
    ],
  • "group_mapping_test":
    [
    ],
  • "authentication_test":
    {
    }
}

Get identity provider by ID

path Parameters
id
required
string

Responses

200

Success

404

Not Found

500

Internal Error

get/api/auth/identity-providers/{id}
/api/auth/identity-providers/{id}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "id": "string",
  • "name": "string",
  • "provider_type": "ldap",
  • "enabled": true,
  • "ldap_config":
    {
    },
  • "saml_config":
    {},
  • "created_at": "2026-10-29T14:02:58Z",
  • "updated_at": "2026-10-29T14:02:58Z",
  • "last_sync": "2026-10-29T14:02:58Z"
}

Delete identity provider

Permanently deletes the identity provider.

Deletion is always allowed, including active providers and the last remaining provider. Deleting an active provider leaves the system with 0 active providers (local login still works).

path Parameters
id
required
string

Responses

200

Provider deleted successfully

404

Not Found

409

Provider is still referenced by role mappings

500

Internal Error

503

Unable to validate provider role mapping usage

delete/api/auth/identity-providers/{id}
/api/auth/identity-providers/{id}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "status": "success",
  • "message": "Identity provider 'corp-ldap' deleted successfully",
  • "id": "string"
}

Activate identity provider

Activates the provider so it appears on the login page.

If another LDAP provider is active, activation fails with 409 Conflict. Deactivate the currently active LDAP provider before activating a different one.

Idempotent: if the provider is already active, returns its current state without making any changes.

path Parameters
id
required
string

Responses

200

Provider activated

404

Not Found

409

Another LDAP provider is already active

500

Internal Error

503

External identity provider management is not configured

post/api/auth/identity-providers/{id}/activate
/api/auth/identity-providers/{id}/activate

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "id": "string",
  • "name": "string",
  • "provider_type": "ldap",
  • "enabled": true,
  • "ldap_config":
    {
    },
  • "saml_config":
    {},
  • "created_at": "2026-10-29T14:02:58Z",
  • "updated_at": "2026-10-29T14:02:58Z",
  • "last_sync": "2026-10-29T14:02:58Z"
}

Deactivate identity provider

Deactivates the provider for external login. It will no longer appear on the login page.

Deactivation is always allowed, including when this is the only active provider. Deactivating the last active provider leaves the system with 0 active providers, which is valid (local login still works; LDAP login becomes unavailable until a provider is re-activated).

Idempotent: if the provider is already inactive, returns its current state without changes.

path Parameters
id
required
string

Responses

200

Provider deactivated successfully

404

Not Found

500

Internal Error

503

External identity provider management is not configured

post/api/auth/identity-providers/{id}/deactivate
/api/auth/identity-providers/{id}/deactivate

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "id": "string",
  • "name": "string",
  • "provider_type": "ldap",
  • "enabled": true,
  • "ldap_config":
    {
    },
  • "saml_config":
    {},
  • "created_at": "2026-10-29T14:02:58Z",
  • "updated_at": "2026-10-29T14:02:58Z",
  • "last_sync": "2026-10-29T14:02:58Z"
}

Images

List software images

query Parameters
page
integer >= 1
Default: 1
page_size
integer [ 1 .. 500 ]
Default: 20
product_family
string (ProductFamily)
Enum: "BIG-IP" "F5OS-C" "F5OS-A"
sort_by
string (SortByImages)
Value: "version"

Field to sort images by

sort_order
string (UpgradeSortOrder)
Enum: "asc" "desc"

Sort direction; only applied when sort_by is also provided.

Responses

200

List of software images

401

Authentication required

get/api/v1/fleet/upgrade/images
/api/v1/fleet/upgrade/images

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "data":
    [
    ],
  • "pagination":
    {
    }
}

Upload a software image

Accepts a single multipart file upload and offloads the file to shared storage for asynchronous ingestion.

Only the file form field is used by the active upload path. Metadata such as product_family, image_type, version, and build is not read from multipart form fields; it is derived later by the upgrade feature from the uploaded filename and, where applicable, from metadata.xml inside the image during verification.

The request is intercepted by the backend file-offload middleware, so this operation returns 202 Accepted after the file is persisted and the image record is reserved for background processing.

Request Body schema: multipart/form-data
file
required
string <binary>

Software image file (ISO, bin, etc.)

Responses

202

Upload accepted for asynchronous processing

400

Invalid request

401

Authentication required

409

Duplicate filename

post/api/v1/fleet/upgrade/images
/api/v1/fleet/upgrade/images

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "success": true,
  • "data":
    {
    }
}

Get a software image by ID

path Parameters
imageId
required
string <uuid>

Responses

200

Software image details

404

Resource not found

get/api/v1/fleet/upgrade/images/{imageId}
/api/v1/fleet/upgrade/images/{imageId}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "id": "string",
  • "file_name": "string",
  • "product_family": "BIG-IP",
  • "image_type": "FULL_ISO",
  • "status": "UPLOADING",
  • "version": "string",
  • "build": "string",
  • "base_build": "string",
  • "f5os_platform": "string",
  • "file_size_bytes": 0,
  • "storage_path": "string",
  • "md5_checksum": "string",
  • "md5_verified": true,
  • "sig_pem_verified": true,
  • "md5_expected": "string",
  • "md5_actual": "string",
  • "verification_output": "string",
  • "verified_at": "2026-10-29T14:02:58Z",
  • "uploaded_by": "string",
  • "uploaded_at": "2026-10-29T14:02:58Z",
  • "build_date": "2026-10-29T14:02:58Z",
  • "created_at": "2026-10-29T14:02:58Z"
}

Delete a software image

path Parameters
imageId
required
string <uuid>

Responses

204

Image deleted

404

Resource not found

409

Image is associated with one or more upgrade jobs and cannot be deleted. The error message lists the offending job types and names.

delete/api/v1/fleet/upgrade/images/{imageId}
/api/v1/fleet/upgrade/images/{imageId}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "error": "string",
  • "code": "string"
}

Delete multiple software images in a single request

Request Body schema: application/json
image_ids
required
Array of strings <uuid> [ 1 .. 100 ] items

Responses

200

Per-image deletion results

400

Invalid request

401

Authentication required

post/api/v1/fleet/upgrade/images/bulk-delete
/api/v1/fleet/upgrade/images/bulk-delete

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "image_ids":
    [
    ]
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "results":
    [
    ]
}

Infrastructure Discovery

Establish vSphere connection

Establishes a connection to vSphere using provider credentials. Returns a connection ID that can be used for subsequent discovery API calls.

Request Body schema: application/json
username
string

vSphere username

password
string

vSphere password

providerName
required
string

Name of the provider (used to resolve vSphere hostname)

cloudEnvReferenceId
string

UUID of the cloud environment to use for this connection. If provided, will be given priority and used to resolve username and password from the referenced cloud environment.

Responses

200

Connection established successfully

400

Bad request - missing required parameters

404

Provider not found

500

Internal server error or connection failed

post/api/provisioning/v1/cloud/connect
/api/provisioning/v1/cloud/connect

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "username": "string",
  • "password": "string",
  • "providerName": "string",
  • "cloudEnvReferenceId": "string"
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "connId": "string",
  • "message": "string"
}

List datacenters

Lists all available datacenters in the vSphere environment.

query Parameters
connId
required
string

Connection ID from /cloud/connect endpoint

Responses

200

List of datacenters

400

Bad request - missing required parameters

404

Environment not found

500

Internal server error

get/api/provisioning/v1/cloud/datacenters
/api/provisioning/v1/cloud/datacenters

Response samples

Content type
application/json
Copy
Expand all Collapse all
[
  • {
    }
]

List clusters

Lists all clusters in a datacenter.

query Parameters
connId
required
string

Connection ID from /cloud/connect endpoint

datacenter
required
string

Name of the datacenter

Responses

200

List of clusters

400

Bad request - missing required parameters

404

Environment or datacenter not found

500

Internal server error

get/api/provisioning/v1/cloud/clusters
/api/provisioning/v1/cloud/clusters

Response samples

Content type
application/json
Copy
Expand all Collapse all
[
  • {
    }
]

Get cluster resource usage

Returns the current CPU, memory, and storage capacity and usage for a cluster.

path Parameters
datacenterName
required
string

Name of the datacenter

clusterName
required
string

Name of the cluster

query Parameters
connId
required
string

Connection ID from /cloud/connect endpoint

Responses

200

Cluster resource capacity and current usage

400

Bad request - missing required parameters

401

Invalid or expired connection

404

Datacenter or cluster not found

500

Internal server error

get/api/provisioning/v1/cloud/datacenters/{datacenterName}/clusters/{clusterName}/resource-usage
/api/provisioning/v1/cloud/datacenters/{datacenterName}/clusters/{clusterName}/resource-usage

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "collectedAt": "2026-10-29T14:02:58Z",
  • "cpu":
    {
    },
  • "memory":
    {
    },
  • "storage":
    {
    }
}

List hosts

Lists hosts in a datacenter or cluster. If cluster is provided, lists only hosts in that cluster; otherwise lists all hosts in the datacenter.

query Parameters
connId
required
string

Connection ID from /cloud/connect endpoint

datacenter
required
string

Name of the datacenter

cluster
string

Name of the cluster (optional - if omitted, lists all hosts in datacenter)

Responses

200

List of hosts

400

Bad request - missing required parameters

404

Environment, datacenter, or cluster not found

500

Internal server error

get/api/provisioning/v1/cloud/hosts
/api/provisioning/v1/cloud/hosts

Response samples

Content type
application/json
Copy
Expand all Collapse all
[
  • {
    }
]

List networks

Lists all networks in a datacenter.

query Parameters
connId
required
string

Connection ID from /cloud/connect endpoint

datacenter
required
string

Name of the datacenter

Responses

200

List of networks

400

Bad request - missing required parameters

404

Environment or datacenter not found

500

Internal server error

get/api/provisioning/v1/cloud/networks
/api/provisioning/v1/cloud/networks

Response samples

Content type
application/json
Copy
Expand all Collapse all
[
  • {
    }
]

List datastores

Lists all datastores in a datacenter.

query Parameters
connId
required
string

Connection ID from /cloud/connect endpoint

datacenter
required
string

Name of the datacenter

Responses

200

List of datastores

400

Bad request - missing required parameters

404

Environment or datacenter not found

500

Internal server error

get/api/provisioning/v1/cloud/datastores
/api/provisioning/v1/cloud/datastores

Response samples

Content type
application/json
Copy
Expand all Collapse all
[
  • {
    }
]

List VM images

Lists all VM images (templates) available in a datacenter.

query Parameters
connId
required
string

Connection ID from /cloud/connect endpoint

datacenter
required
string

Name of the datacenter

Responses

200

List of VM images

400

Bad request - missing required parameters

404

Environment or datacenter not found

500

Internal server error

get/api/provisioning/v1/cloud/vm-images
/api/provisioning/v1/cloud/vm-images

Response samples

Content type
application/json
Copy
Expand all Collapse all
[
  • {
    }
]

Instance Templates

Operations on instance template configurations.

List instance templates

Returns a paginated list of instance templates.

Lists instance templates with optional id, name, provider, state, and locked filters. Filters use exact matching and combine with AND; blank values are ignored, while duplicate or invalid nonblank values return 400.

$top limits the page size (default 20, maximum 100), and $skip skips that many items (default 0). The count field is the number of returned items. With $count=true, totalItems is the unfiltered database total, regardless of pagination.

query Parameters
id
string <uuid>

Match the parsed template UUID.

name
string

Exact case-sensitive name; whitespace in nonblank values is preserved. Zero-length and whitespace-only values are ignored.

provider
string
Enum: "VMware" "AWS" "Azure"

Exact provider value, case-sensitive.

state
string
Enum: "DRAFT" "NEW" "DEPLOYING" "DEPLOYED"

Exact template state, case-sensitive.

locked
boolean

Accepts only true or false; omission adds no lock-state restriction.

$top
integer [ 1 .. 100 ]
Default: 20
Example: $top=10

Maximum number of items to return (page size). Default 20, max 100.

$skip
integer >= 0
Default: 0

Number of items to skip for pagination. Default 0.

$count
boolean
Default: false
Example: $count=true

When true, includes totalItems with the total number of instance templates in the database, regardless of filters or pagination.

Responses

200

Paginated list of instance templates

400

Invalid declared filter or existing pagination control returns a msg response. Filter messages omit invalid input values, and pagination errors preserve the original generated error text. Application errors retain status, message, and details.

500

Internal Server Error

get/api/provisioning/v1/instance-templates
/api/provisioning/v1/instance-templates

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "status": 200,
  • "count": 2,
  • "totalItems": 2,
  • "items":
    [
    ],
  • "selfLink": "/api/instance-templates"
}

Create an instance template

Creates a new instance template.

The optional draft flag controls the initial state:

draft Initial state Response
true DRAFT 201 Created
false / omitted NEW 200 OK

To deploy a template, use the separate POST /instance-templates/{id}/deploy endpoint.

Request Body schema: application/json
name
required
string [ 1 .. 255 ] characters

Human-readable name for the instance template. Must be unique.

provider
required
string [ 1 .. 255 ] characters

Provider or vendor (e.g. VMware, AWS, Azure).

description
string <= 1000 characters Nullable

Optional human-readable description.

draft
boolean
Default: false

When true, the template is created/kept in DRAFT state. When false or omitted, a DRAFT template is promoted to NEW.

definition
required
object (InstanceTemplateDefinition)

Template definition containing all BIG-IP device configuration parameters.

Responses

200

OK — instance template created in NEW state (draft=false or omitted)

201

Created — instance template created in DRAFT state (draft=true)

400

Bad Request

409

Conflict — name already exists

500

Internal Server Error

post/api/provisioning/v1/instance-templates
/api/provisioning/v1/instance-templates

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "name": "BIG-IP Standard Template",
  • "provider": "VMware",
  • "description": "Standard VMware configuration for production workloads",
  • "definition":
    {
    }
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "id": "550e8400-e29b-41d4-a716-446655440000",
  • "state": "NEW",
  • "status": 200,
  • "selfLink": "/api/instance-templates/550e8400-e29b-41d4-a716-446655440000",
  • "createdAt": "2026-01-15T09:23:41Z",
  • "updatedAt": "2026-01-15T09:23:41Z"
}

Get an instance template by ID

Returns a single instance template identified by its ID.

path Parameters
id
required
string <uuid>
Example: 550e8400-e29b-41d4-a716-446655440000

UUID of the instance template.

Responses

200

Instance template returned successfully

404

Not Found

500

Internal Server Error

get/api/provisioning/v1/instance-templates/{id}
/api/provisioning/v1/instance-templates/{id}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "status": 200,
  • "id": "550e8400-e29b-41d4-a716-446655440000",
  • "name": "BIG-IP Standard Template",
  • "provider": "VMware",
  • "description": "Standard VMware configuration for production workloads",
  • "state": "DEPLOYED",
  • "locked": true,
  • "lockReason": "READ_ONLY",
  • "definition":
    {
    },
  • "lastValidatedAt": "2026-03-10T08:00:00Z",
  • "validatedAgainstLiveVm": false,
  • "lastDeployedVersion": null,
  • "selfLink": "/api/instance-templates/550e8400-e29b-41d4-a716-446655440000",
  • "createdAt": "2026-01-15T09:23:41Z",
  • "updatedAt": "2026-04-01T14:30:00Z"
}

Update an instance template (full replace)

Replaces all fields of an existing instance template.

Precondition: The instance template must not be locked (locked=true → 409). Templates in DEPLOYING state are system-locked and cannot be modified.

The optional draft flag controls state transitions:

Current state draft New state Response
DRAFT true DRAFT 200 OK
DRAFT false / omitted NEW 200 OK
NEW — NEW 200 OK
DEPLOYED — DEPLOYED 200 OK
DEPLOYING any — 409 Conflict
Any (locked) any — 409 Conflict

To deploy a template, use the separate POST /instance-templates/{id}/deploy endpoint.

path Parameters
id
required
string <uuid>
Example: 550e8400-e29b-41d4-a716-446655440000

UUID of the instance template.

Request Body schema: application/json
name
required
string [ 1 .. 255 ] characters

Human-readable name for the instance template. Must be unique.

provider
required
string [ 1 .. 255 ] characters

Provider or vendor (e.g. VMware, AWS, Azure).

description
string <= 1000 characters Nullable

Optional human-readable description.

draft
boolean
Default: false

When true, the template is created/kept in DRAFT state. When false or omitted, a DRAFT template is promoted to NEW.

definition
required
object (InstanceTemplateDefinition)

Template definition containing all BIG-IP device configuration parameters.

Responses

200

OK — instance template updated successfully

400

Bad Request

404

Not Found

409

Conflict — locked, deploying, or name collision

500

Internal Server Error

put/api/provisioning/v1/instance-templates/{id}
/api/provisioning/v1/instance-templates/{id}

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "name": "BIG-IP Standard Template v2",
  • "provider": "VMware",
  • "description": "Updated VMware configuration with HA support",
  • "definition":
    {
    }
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "id": "550e8400-e29b-41d4-a716-446655440000",
  • "state": "NEW",
  • "status": 200,
  • "selfLink": "/api/instance-templates/550e8400-e29b-41d4-a716-446655440000",
  • "createdAt": "2026-01-15T09:23:41Z",
  • "updatedAt": "2026-03-22T14:45:10Z"
}

Partially update an instance template

Partially updates an existing instance template. Only the provided fields are modified; omitted fields retain their current values.

Precondition: The instance template must not be locked. Templates in DEPLOYING state cannot be patched.

For the definition object, merge-patch semantics apply:

  • Provided keys are updated.
  • Omitted keys are left unchanged.
  • Keys set to null are cleared.
  • Array fields (e.g. vlanList, selfIpList) are replaced wholesale.
path Parameters
id
required
string <uuid>
Example: 550e8400-e29b-41d4-a716-446655440000

UUID of the instance template.

Request Body schema: application/json
name
string [ 1 .. 255 ] characters

Human-readable name. Must be unique.

provider
string [ 1 .. 255 ] characters

Provider or vendor.

description
string <= 1000 characters Nullable

Optional description. Set to null to clear.

draft
boolean

Controls DRAFT state on partial update.

definition
object (PatchInstanceTemplateDefinition)

Partial template definition for merge-patching (used by PATCH). All fields are optional — only provided fields are updated. Omitted fields retain their current values. To explicitly clear a nullable field, set it to null.

Responses

200

OK — instance template patched successfully

400

Bad Request

404

Not Found

409

Conflict — locked or deploying

500

Internal Server Error

patch/api/provisioning/v1/instance-templates/{id}
/api/provisioning/v1/instance-templates/{id}

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "description": "Updated description with HA failover notes",
  • "definition":
    {
    }
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "id": "550e8400-e29b-41d4-a716-446655440000",
  • "state": "NEW",
  • "status": 200,
  • "selfLink": "/api/instance-templates/550e8400-e29b-41d4-a716-446655440000",
  • "createdAt": "2026-01-15T09:23:41Z",
  • "updatedAt": "2026-04-01T16:20:00Z"
}

Delete an instance template

Deletes an instance template by ID.

Precondition: The instance template must not be locked. Templates in DEPLOYING state cannot be deleted.

path Parameters
id
required
string <uuid>
Example: 550e8400-e29b-41d4-a716-446655440000

UUID of the instance template.

Responses

200

OK — instance template deleted

404

Not Found

409

Conflict — locked or deploying

500

Internal Server Error

delete/api/provisioning/v1/instance-templates/{id}
/api/provisioning/v1/instance-templates/{id}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "id": "550e8400-e29b-41d4-a716-446655440000",
  • "status": 200,
  • "deletedAt": "2026-04-10T16:00:00Z"
}

Lock an instance template

Locks an instance template to prevent modifications. Sets locked=true and lockReason=READ_ONLY.

Precondition: Template must not already be locked.

path Parameters
id
required
string <uuid>
Example: 550e8400-e29b-41d4-a716-446655440000

UUID of the instance template.

Responses

200

OK — instance template locked

404

Not Found

409

Conflict — already locked

500

Internal Server Error

post/api/provisioning/v1/instance-templates/{id}/lock
/api/provisioning/v1/instance-templates/{id}/lock

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "id": "550e8400-e29b-41d4-a716-446655440000",
  • "locked": true,
  • "lockReason": "READ_ONLY",
  • "status": 200,
  • "selfLink": "/api/instance-templates/550e8400-e29b-41d4-a716-446655440000",
  • "updatedAt": "2026-04-15T08:20:00Z"
}

Unlock an instance template

Unlocks an instance template to allow modifications. Sets locked=false and lockReason=NONE.

Precondition: Template must be locked with lockReason=READ_ONLY. System locks (DEPLOYMENT) cannot be manually unlocked.

path Parameters
id
required
string <uuid>
Example: 550e8400-e29b-41d4-a716-446655440000

UUID of the instance template.

Responses

200

OK — instance template unlocked

404

Not Found

409

Conflict — not locked or system-locked

500

Internal Server Error

delete/api/provisioning/v1/instance-templates/{id}/lock
/api/provisioning/v1/instance-templates/{id}/lock

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "id": "550e8400-e29b-41d4-a716-446655440000",
  • "locked": false,
  • "lockReason": "NONE",
  • "status": 200,
  • "selfLink": "/api/instance-templates/550e8400-e29b-41d4-a716-446655440000",
  • "updatedAt": "2026-04-15T09:00:00Z"
}

Deploy an instance template

Triggers deployment of an instance template to target infrastructure.

Preconditions:

  • Template must be in NEW or DEPLOYED state
  • Template must not be locked
  • Template must pass validation

Returns 202 Accepted with a task object for tracking deployment progress.

path Parameters
id
required
string <uuid>
Example: 550e8400-e29b-41d4-a716-446655440000

UUID of the instance template.

Request Body schema: application/json
mgmtIp
required
string <ipv4>

Management IP address of the target BIG-IP device.

username
string [ 1 .. 255 ] characters

Username for the BIG-IP device (optional, for display/logging purposes).

encodedBasicAuth
required
string non-empty

Base64-encoded basic authentication credentials (username:password).

Responses

202

Accepted — deployment task queued

400

Bad Request — invalid request payload

404

Not Found

409

Conflict — locked or already deploying

422

Unprocessable Entity — template not in deployable state or validation failed

500

Internal Server Error

post/api/provisioning/v1/instance-templates/{id}/deploy
/api/provisioning/v1/instance-templates/{id}/deploy

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "mgmtIp": "192.168.1.100",
  • "username": "admin",
  • "encodedBasicAuth": "YWRtaW46YWRtaW5QYXNzd29yZDEyMw=="
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "status": 202,
  • "instanceTemplateId": "550e8400-e29b-41d4-a716-446655440000",
  • "deploymentTaskId": "c3d4e5f6-a7b8-4012-8def-123456789012",
  • "selfLink": "/api/instance-templates/tasks/c3d4e5f6-a7b8-4012-8def-123456789012"
}

Clone an instance template

Creates a deep copy of an existing instance template with a new name. The clone is always created in DRAFT state, unlocked.

path Parameters
id
required
string <uuid>
Example: 550e8400-e29b-41d4-a716-446655440000

UUID of the instance template.

Request Body schema: application/json
name
required
string [ 1 .. 255 ] characters

Name for the cloned template. Must be unique.

Responses

201

Created — clone created in DRAFT state

400

Bad Request

404

Not Found — source template not found

409

Conflict — clone name already exists

500

Internal Server Error

post/api/provisioning/v1/instance-templates/{id}/clone
/api/provisioning/v1/instance-templates/{id}/clone

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "name": "BIG-IP Standard Template (Copy)"
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "id": "770e8400-e29b-41d4-a716-446655440002",
  • "state": "DRAFT",
  • "status": 201,
  • "selfLink": "/api/instance-templates/770e8400-e29b-41d4-a716-446655440002",
  • "createdAt": "2026-04-20T12:00:00Z",
  • "updatedAt": "2026-04-20T12:00:00Z"
}

Get an instance template task by ID

Retrieves a specific task by its ID. For active tasks (PENDING, RUNNING), this endpoint polls the external service for the latest status before returning.

path Parameters
taskId
required
string <uuid>
Example: 660e8400-e29b-41d4-a716-446655440001

UUID of the task.

Responses

200

OK — task retrieved successfully

400

Bad Request — invalid UUID format

404

Not Found — task not found

500

Internal Server Error

get/api/provisioning/v1/instance-templates/tasks/{taskId}
/api/provisioning/v1/instance-templates/tasks/{taskId}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "id": "660e8400-e29b-41d4-a716-446655440001",
  • "instanceTemplateId": "550e8400-e29b-41d4-a716-446655440000",
  • "externalTaskId": "ext-task-12345",
  • "type": "DEPLOYMENT",
  • "status": 200,
  • "taskStatus": "RUNNING",
  • "state": "onboarding",
  • "createdAt": "2026-04-20T12:00:00Z",
  • "updatedAt": "2026-04-20T12:05:00Z",
  • "selfLink": "/api/instance-templates/tasks/660e8400-e29b-41d4-a716-446655440001"
}

Inventory

Get fleet summary (device counts by type, version, status)

Responses

200

Fleet summary

get/api/v1/fleet/upgrade/summary
/api/v1/fleet/upgrade/summary

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "total_devices": 0,
  • "bigip_count": 0,
  • "f5os_count": 0,
  • "version_distribution":
    {
    },
  • "status_distribution":
    {
    }
}

List all fleet devices (BIG-IP + F5OS)

query Parameters
page
integer >= 1
Default: 1
page_size
integer [ 1 .. 500 ]
Default: 20
type
string
Enum: "BIGIP" "RSERIES" "VELOS"
search
string

Search by hostname, IP, version

$filter
string

OData-style filter expression. Supported fields and operators: endpoint eq 'https://10.145.135.45' hostname eq 'rseries-lab-01' device_type eq 'BIGIP' Combine with 'and': endpoint eq '...' and device_type eq 'BIGIP'

$orderby
string

OData-style ordering expression. Supported fields: hostname, endpoint, current_version, last_refresh_at, device_type Format: ' asc' or ' desc' (default: hostname asc)

Responses

200

Paginated fleet device list

get/api/v1/fleet/upgrade/devices
/api/v1/fleet/upgrade/devices

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "data":
    [
    ],
  • "pagination":
    {
    }
}

Get fleet device details

path Parameters
deviceId
required
string <uuid>

Responses

200

Fleet device details

404

Resource not found

get/api/v1/fleet/upgrade/devices/{deviceId}
/api/v1/fleet/upgrade/devices/{deviceId}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "id": "string",
  • "device_type": "BIGIP",
  • "name": "string",
  • "device_name": "string",
  • "endpoint": "string",
  • "data_center_id": "string",
  • "current_version": "17.1.2",
  • "current_build": "0.0.13",
  • "edition": "Final",
  • "platform": "Z100",
  • "marketing_name": "BIG-IP i5800",
  • "chassis_serial": "string",
  • "ha_pair_id": "string",
  • "ha_peer_device_id": "string",
  • "ha_state": "ACTIVE",
  • "device_group": "string",
  • "sync_status": "In Sync",
  • "hosted_on_provider_id": "string",
  • "active_volume": "HD1.1",
  • "inactive_volumes":
    [
    ],
  • "disk_available_gb": 42.5,
  • "license_edition": "string",
  • "license_check_date": "2026-10-29",
  • "service_check_date": "2026-10-29",
  • "last_seen_at": "2026-10-29T14:02:58Z",
  • "last_refresh_at": "2026-10-29T14:02:58Z",
  • "eligibility_status": "ELIGIBLE",
  • "recommended_version": "17.1.3",
  • "is_payg_license": true
}

Trigger on-demand metadata refresh for a device

path Parameters
deviceId
required
string <uuid>

Responses

200

Device metadata refreshed

404

Resource not found

post/api/v1/fleet/upgrade/devices/{deviceId}/refresh
/api/v1/fleet/upgrade/devices/{deviceId}/refresh

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "id": "string",
  • "device_type": "BIGIP",
  • "name": "string",
  • "device_name": "string",
  • "endpoint": "string",
  • "data_center_id": "string",
  • "current_version": "17.1.2",
  • "current_build": "0.0.13",
  • "edition": "Final",
  • "platform": "Z100",
  • "marketing_name": "BIG-IP i5800",
  • "chassis_serial": "string",
  • "ha_pair_id": "string",
  • "ha_peer_device_id": "string",
  • "ha_state": "ACTIVE",
  • "device_group": "string",
  • "sync_status": "In Sync",
  • "hosted_on_provider_id": "string",
  • "active_volume": "HD1.1",
  • "inactive_volumes":
    [
    ],
  • "disk_available_gb": 42.5,
  • "license_edition": "string",
  • "license_check_date": "2026-10-29",
  • "service_check_date": "2026-10-29",
  • "last_seen_at": "2026-10-29T14:02:58Z",
  • "last_refresh_at": "2026-10-29T14:02:58Z",
  • "eligibility_status": "ELIGIBLE",
  • "recommended_version": "17.1.3",
  • "is_payg_license": true
}

Create asynchronous reboot task, optionally booting into another volume

Accepts an asynchronous reboot request and returns immediately with 202 Accepted. The request body is optional:

  • If omitted (or volume is empty), the device is rebooted into its currently active volume (plain reboot).
  • If volume is provided, the device is rebooted into that volume (equivalent to a rollback/roll-forward). The task performs all validations asynchronously:
    • Device must be BIG-IP (F5OS tasks fail during validation)
    • Target volume must exist on the device (live ListVolumes check)
    • Target volume must not be the currently active volume
    • Target volume status must be complete

In both cases, a device lock must be acquirable before reboot.

Poll GET /devices/{deviceId}/reboot/{taskId} for progress and final outcome.

path Parameters
deviceId
required
string <uuid>
Request Body schema: application/json
volume
string non-empty

Target BIG-IP boot volume name (e.g. HD1.2). If omitted or empty, the device is rebooted into its currently active volume (plain reboot).

install_configuration
boolean
Default: false

When true and a target volume is set, copy the active volume's configuration onto the target volume (cpcfg) before rebooting. Ignored for plain reboots (no target volume).

Responses

202

Reboot task accepted. Lock acquisition and validation happen asynchronously; check task status for errors.

400

Invalid request

500

Internal server error

post/api/v1/fleet/upgrade/devices/{deviceId}/reboot
/api/v1/fleet/upgrade/devices/{deviceId}/reboot

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "volume": "string",
  • "install_configuration": false
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "task_id": "string",
  • "status": "QUEUED",
  • "created_at": "2026-10-29T14:02:58Z"
}

Get asynchronous reboot task status and result

path Parameters
deviceId
required
string <uuid>
taskId
required
string <uuid>

Responses

200

Reboot task details

404

Resource not found

500

Internal server error

get/api/v1/fleet/upgrade/devices/{deviceId}/reboot/{taskId}
/api/v1/fleet/upgrade/devices/{deviceId}/reboot/{taskId}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "task_id": "string",
  • "device_id": "string",
  • "target_volume": "string",
  • "status": "QUEUED",
  • "target_version": "string",
  • "previous_volume": "string",
  • "previous_version": "string",
  • "error":
    {
    },
  • "started_at": "2026-10-29T14:02:58Z",
  • "completed_at": "2026-10-29T14:02:58Z",
  • "created_at": "2026-10-29T14:02:58Z"
}

Get the live failover state of a device

path Parameters
deviceId
required
string <uuid>

Responses

200

Current device state

400

Bad request (e.g. F5OS device)

404

Resource not found

500

Internal server error

get/api/v1/fleet/upgrade/devices/{deviceId}/state
/api/v1/fleet/upgrade/devices/{deviceId}/state

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "failover_state": "active",
  • "ha_role": "ACTIVE"
}

Change the failover state of a device

path Parameters
deviceId
required
string <uuid>
Request Body schema: application/json
action
required
string
Enum: "force_offline" "release_offline" "force_standby"

Responses

200

State change completed successfully

400

Bad request (invalid action, F5OS device, standalone device for standby)

404

Resource not found

409

Conflict (already in requested state, or device locked)

500

Internal server error

post/api/v1/fleet/upgrade/devices/{deviceId}/state
/api/v1/fleet/upgrade/devices/{deviceId}/state

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "action": "force_offline"
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "task_id": "string",
  • "action": "force_offline",
  • "status": "COMPLETED",
  • "previous_state":
    {
    },
  • "current_state":
    {
    },
  • "error":
    {
    },
  • "created_at": "2026-10-29T14:02:58Z"
}

Create asynchronous disk space analysis task for multiple devices

Starts a background task that checks available disk space on each device and compares it against the requested required_size_bytes threshold.

BIG-IP devices — calls the iControl REST bash endpoint (POST /mgmt/tm/util/bash) to run df -k /shared/images directly on the device. The reported available_disk_bytes reflects free space on the /shared/images filesystem, which is where software images are staged before installation.

F5OS devices (RSERIES / VELOS) — queries the F5OS platform REST API for storage metrics.

Results are returned via GET /devices/disk-analysis/{taskId}.

Request Body schema: application/json
required_size_bytes
required
integer <int64> >= 1

Required disk size per device, in bytes

devices
required
Array of objects (DiskAnalysisBatchDeviceInput) non-empty

Responses

202

Disk space analysis task accepted

400

Invalid request

post/api/v1/fleet/upgrade/devices/disk-analysis
/api/v1/fleet/upgrade/devices/disk-analysis

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "required_size_bytes": 1,
  • "devices":
    [
    ]
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "task_id": "string",
  • "status": "QUEUED",
  • "created_at": "2026-10-29T14:02:58Z"
}

Get asynchronous disk space analysis task status and results

path Parameters
taskId
required
string <uuid>

Responses

200

Disk analysis task details

404

Resource not found

get/api/v1/fleet/upgrade/devices/disk-analysis/{taskId}
/api/v1/fleet/upgrade/devices/disk-analysis/{taskId}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "task_id": "string",
  • "status": "QUEUED",
  • "created_at": "2026-10-29T14:02:58Z",
  • "started_at": "2026-10-29T14:02:58Z",
  • "completed_at": "2026-10-29T14:02:58Z",
  • "progress":
    {
    },
  • "result":
    {
    },
  • "error":
    {
    }
}

Create asynchronous bulk metadata refresh task for multiple devices

Starts a background task that triggers a live metadata refresh for each specified device. Optionally, the request can specify which metadata types to refresh (SYSTEM, VOLUMES, LICENSE). When metadata_types is omitted or empty, all available metadata types are refreshed.

Results are returned via GET /devices/refresh/{taskId}.

Request Body schema: application/json
devices
required
Array of objects (DeviceRefreshBatchDeviceInput) [ 1 .. 1000 ] items
metadata_types
Array of strings (DeviceMetadataType)
Items Enum: "SYSTEM" "VOLUMES" "LICENSE"

Optional list of metadata to refresh. If omitted or empty, all metadata types (SYSTEM, VOLUMES, LICENSE) are refreshed.

Responses

202

Device metadata refresh task accepted

400

Invalid request

post/api/v1/fleet/upgrade/devices/refresh
/api/v1/fleet/upgrade/devices/refresh

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "devices":
    [
    ],
  • "metadata_types":
    [
    ]
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "task_id": "string",
  • "status": "QUEUED",
  • "created_at": "2026-10-29T14:02:59Z"
}

Get asynchronous bulk metadata refresh task status and results

path Parameters
taskId
required
string <uuid>

Responses

200

Device refresh task details

404

Resource not found

get/api/v1/fleet/upgrade/devices/refresh/{taskId}
/api/v1/fleet/upgrade/devices/refresh/{taskId}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "task_id": "string",
  • "status": "QUEUED",
  • "metadata_types":
    [
    ],
  • "created_at": "2026-10-29T14:02:59Z",
  • "started_at": "2026-10-29T14:02:59Z",
  • "completed_at": "2026-10-29T14:02:59Z",
  • "progress":
    {
    },
  • "result":
    {
    },
  • "error":
    {
    }
}

Jobs

Configured runtime instances of a Workflow

Bulk delete jobs

Delete multiple jobs in a single request. Each job is processed independently — partial success is possible. Jobs that are in an active lifecycle state (RUNNING, ACTIVE, PAUSING, PAUSED, CANCELLING) cannot be deleted and will be reported as FAILED in the response. The deletion propagates to feature-specific tables (software installation, software distribution) via the pg_notify mechanism.

Request Body schema: application/json
job_ids
required
Array of strings <uuid> [ 1 .. 100 ] items

List of job IDs to delete (1–100 items)

Responses

200

Bulk delete results (partial success possible)

400

Invalid request

post/api/provisioning/v1/jobs/bulk-delete
/api/provisioning/v1/jobs/bulk-delete

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "job_ids":
    [
    ]
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "results":
    [
    ]
}

List jobs for a workflow

Distinct filters combine with AND. Parameter names and exact string/enum values are case-sensitive. Unknown query names are ignored. Newly introduced filters ignore empty or whitespace-only values; repeated nonblank or invalid values return 400. The pre-existing status scalar retains its historical permissive binding and a blank status adds no predicate. Lists runtime Jobs created from a workflow template. Jobs represent environment- or tenant-specific instantiations of the template. Supports exact field filters and search within the path workflow.

path Parameters
workflowId
required
string <uuid>
query Parameters
page
integer >= 1
Default: 1
limit
integer [ 1 .. 200 ]
Default: 50
id
string <uuid>

Exact UUID equality. Empty or whitespace-only values are ignored; invalid or repeated nonblank values return 400.

name
string

Exact case-sensitive equality. Empty or whitespace-only values are ignored. Whitespace in nonblank names is preserved; repeated nonblank values return 400.

type
string
Enum: "AUTO_SCALE" "UPGRADE" "SOFTWARE_DISTRIBUTION" "SOFTWARE_INSTALLATION" "BACKUP" "DEVICE_BACKUP" "DEVICE_RESTORE" "RELICENSE"

Exact, case-sensitive equality. Empty or whitespace-only values are ignored; repeated nonblank values return 400.

executionMode
string
Enum: "CONTINUOUS" "ON_DEMAND" "SCHEDULED"

Exact, case-sensitive equality. Empty or whitespace-only values are ignored; repeated nonblank values return 400.

enabled
boolean

Exact Boolean equality; empty or whitespace-only values are ignored, otherwise only lowercase true or false are accepted. False applies a filter.

modifiedBy
string

Exact case-sensitive modifier identity. Empty or whitespace-only values are ignored; repeated nonblank values return 400.

search
string

Case-insensitive pattern search across job name, type and workflow name. Empty or whitespace-only values are ignored; repeated nonblank values return 400. Nonblank values are trimmed. Combined with other filters using AND.

sortBy
string (JobSortBy)
Enum: "name" "description" "createdAt" "updatedAt" "executionsCount" "executing" "workflow" "status"

Field to sort by. Omitted, empty or whitespace-only values keep the default order (createdAt descending). Ties are broken by job id. Repeated nonblank or unknown values return 400.

sortOrder
string (SortOrder)
Enum: "asc" "desc"

Sort direction. Requires sortBy to also be set; a nonblank sortOrder without sortBy returns 400. Defaults to asc, except createdAt which defaults to desc to match the default (sortBy omitted) order. Repeated nonblank or unknown values return 400.

status
string
Enum: "PENDING" "READY" "ACTIVE" "RUNNING" "PAUSING" "PAUSED" "CANCELLING" "INACTIVE" "ERROR" "COMPLETED" "FAILED" "CANCELLED" "DELETING" "DRAFT"

Responses

200

List of jobs

400

Invalid new filter or existing generated parameter (msg), or an existing application-level list rejection (error).

404

Resource not found

get/api/provisioning/v1/workflows/{workflowId}/jobs
/api/provisioning/v1/workflows/{workflowId}/jobs

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "items":
    [
    ],
  • "total": 1,
  • "page": 1,
  • "limit": 50
}

Create a job (runtime instance of a workflow)

Creates a new runtime Job under a workflow template. Job-level config overrides are merged with template defaultConfig to produce effectiveConfig used during execution.

path Parameters
workflowId
required
string <uuid>
Request Body schema: application/json
type
required
string
Enum: "AUTO_SCALE" "UPGRADE" "SOFTWARE_DISTRIBUTION" "SOFTWARE_INSTALLATION" "BACKUP"
name
required
string
description
string

Optional human-readable job description

status
string
Enum: "PENDING" "READY" "ACTIVE" "RUNNING" "PAUSING" "PAUSED" "CANCELLING" "INACTIVE" "ERROR" "COMPLETED" "FAILED" "CANCELLED" "DELETING"

Not accepted for AUTO_SCALE jobs; lifecycle status is system-managed. Use enabled instead.

enabled
boolean
Default: false

Whether the job can be activated, paused, or resumed. For AUTO_SCALE, omitted or false creates a READY disabled job; true creates and activates the job.

config
required
object (JobConfig)

Job configuration (discriminated by workflow type - use AutoScaleConfig, UpgradeConfig, or BackupConfig)

schedule
object (Schedule)

Responses

201

Job created

400

Invalid request

404

Resource not found

post/api/provisioning/v1/workflows/{workflowId}/jobs
/api/provisioning/v1/workflows/{workflowId}/jobs

Request samples

Content type
application/json
Example
Copy
Expand all Collapse all
{
  • "type": "AUTO_SCALE",
  • "name": "tenant-a-autoscale",
  • "enabled": false,
  • "config":
    {
    }
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "id": "114ca9f9-88a3-49e1-92f2-757d7fedde98",
  • "workflowId": "b7e6a4ae-4cf9-4ad4-b8f9-9b5347300d73",
  • "name": "tenant-a-autoscale",
  • "type": "AUTO_SCALE",
  • "status": "READY",
  • "version": "v1",
  • "createdAt": "2026-05-18T11:00:00.000Z",
  • "updatedAt": "2026-05-18T11:00:00.000Z"
}

Get a job

Returns one Job including resolved configuration (effectiveConfig), lifecycle status, and runtime/schedule state when applicable.

path Parameters
workflowId
required
string <uuid>
jobId
required
string <uuid>

Responses

200

Job

404

Resource not found

get/api/provisioning/v1/workflows/{workflowId}/jobs/{jobId}
/api/provisioning/v1/workflows/{workflowId}/jobs/{jobId}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "id": "114ca9f9-88a3-49e1-92f2-757d7fedde98",
  • "workflowId": "b7e6a4ae-4cf9-4ad4-b8f9-9b5347300d73",
  • "name": "tenant-a-autoscale",
  • "type": "AUTO_SCALE",
  • "status": "ACTIVE",
  • "config":
    {
    },
  • "runtime":
    {
    },
  • "createdAt": "2026-05-18T11:00:00.000Z",
  • "updatedAt": "2026-05-18T11:10:00.000Z"
}

Partially update a job config

Not allowed while a CONTINUOUS job is ACTIVE or an ON_DEMAND execution is RUNNING.

path Parameters
workflowId
required
string <uuid>
jobId
required
string <uuid>
Request Body schema: application/json
type
string
Enum: "AUTO_SCALE" "UPGRADE" "SOFTWARE_DISTRIBUTION" "SOFTWARE_INSTALLATION" "BACKUP"
name
string
description
string

Optional human-readable job description. Set to empty string to clear.

status
string
Enum: "PENDING" "READY" "ACTIVE" "RUNNING" "PAUSING" "PAUSED" "CANCELLING" "INACTIVE" "ERROR" "COMPLETED" "FAILED" "CANCELLED" "DELETING"

Not accepted for AUTO_SCALE jobs; lifecycle status is system-managed. Use enabled instead.

enabled
boolean

Whether the job can be activated, paused, or resumed. For AUTO_SCALE, true activates/resumes and false pauses.

config
object (JobConfig)

Job configuration (discriminated by workflow type - use AutoScaleConfig, UpgradeConfig, or BackupConfig)

schedule
object (Schedule)

Responses

200

Updated job

400

Invalid request

404

Resource not found

409

Conflict with current resource state

patch/api/provisioning/v1/workflows/{workflowId}/jobs/{jobId}
/api/provisioning/v1/workflows/{workflowId}/jobs/{jobId}

Request samples

Content type
application/json
Example
Copy
Expand all Collapse all
{
  • "name": "tenant-a-autoscale-prod"
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "id": "114ca9f9-88a3-49e1-92f2-757d7fedde98",
  • "workflowId": "b7e6a4ae-4cf9-4ad4-b8f9-9b5347300d73",
  • "name": "tenant-a-autoscale-prod",
  • "type": "AUTO_SCALE",
  • "status": "ACTIVE",
  • "updatedAt": "2026-05-18T11:20:00.000Z"
}

Delete a job

Terminates any running executions before deletion.

path Parameters
workflowId
required
string <uuid>
jobId
required
string <uuid>

Responses

204

Deleted

404

Resource not found

409

Conflict with current resource state

delete/api/provisioning/v1/workflows/{workflowId}/jobs/{jobId}
/api/provisioning/v1/workflows/{workflowId}/jobs/{jobId}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "code": "string",
  • "message": "string",
  • "details":
    [
    ]
}

List autoscale instances for a job

Distinct filters combine with AND. Parameter names and exact string/enum values are case-sensitive. Unknown query names are ignored. All documented filters on this operation are newly introduced. Empty or whitespace-only values are ignored; repeated nonblank or invalid values return 400. Returns matching autoscale instances associated with the path job.

path Parameters
workflowId
required
string <uuid>
jobId
required
string <uuid>
query Parameters
id
string <uuid>

Exact UUID equality. Empty or whitespace-only values are ignored; invalid or repeated nonblank values return 400.

hostname
string

Exact, case-sensitive equality. Empty or whitespace-only values are ignored; repeated nonblank values return 400.

ip
string

Exact textual IP address; must be a valid IPv4 or IPv6 address.

status
string
Enum: "PROVISIONING" "READY" "ERROR" "DEPROVISIONING" "UNKNOWN" "CHECKING_DEPENDENCIES_HEADROOM" "SPAWNING_VM" "POWERING_ON_VM" "POWERING_OFF_VM" "INITIALIZING_DEVICE" "APPLYING_LICENSE" "APPLYING_TEMPLATE" "SYNCING_FULL_CONFIG" "ADDING_TO_AUTO_CONFIG_SYNC" "ENSURING_TRAFFIC_ADVERTISED" "ENSURING_TRAFFIC_NOT_ADVERTISED" "REGISTERING_DEVICE" "REMOVING_FROM_CONFIG_SYNC" "WAITING_FOR_CONNECTION_DRAIN" "REVOKING_LICENSE" "DELETING_VM" "DEREGISTERING_DEVICE"

Exact, case-sensitive equality. Empty or whitespace-only values are ignored; repeated nonblank values return 400.

role
string
Enum: "ACTIVE" "STANDBY"

Exact, case-sensitive equality. Empty or whitespace-only values are ignored; repeated nonblank values return 400.

trafficState
string
Enum: "UNKNOWN" "OUT_OF_TRAFFIC" "JOINING" "IN_TRAFFIC" "DRAINING"

Exact, case-sensitive equality. Empty or whitespace-only values are ignored; repeated nonblank values return 400.

vmName
string

Exact, case-sensitive equality. Empty or whitespace-only values are ignored; repeated nonblank values return 400.

statsDeviceId
string <uuid>

Exact UUID equality.

Responses

200

Instances for the job

400

Invalid new filter or existing generated parameter (msg), or an existing application-level list rejection (error).

404

Resource not found

get/api/provisioning/v1/workflows/{workflowId}/jobs/{jobId}/instances
/api/provisioning/v1/workflows/{workflowId}/jobs/{jobId}/instances

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "items":
    [
    ],
  • "totalItems": 1
}

Delete a specific autoscale instance from a job

Starts a targeted scale-in execution for one autoscale instance without changing the job desired size. If the job remains active and actual capacity falls below desired size, the reconciler can create a replacement instance in a later cycle.

path Parameters
workflowId
required
string <uuid>
jobId
required
string <uuid>
instanceId
required
string <uuid>

Responses

202

Instance delete accepted

400

Invalid request

404

Resource not found

409

Conflict with current resource state

422

Request is valid but cannot be applied to the target resource

delete/api/provisioning/v1/workflows/{workflowId}/jobs/{jobId}/instances/{instanceId}
/api/provisioning/v1/workflows/{workflowId}/jobs/{jobId}/instances/{instanceId}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "message": "instance delete accepted",
  • "executionId": "5e77dd71-4636-42bf-a039-c2236106f9c3",
  • "instanceId": "65b1c38e-44b9-48e3-9fd3-38ffab1b6da1",
  • "status": "RUNNING"
}

List autoscale devices for a job Deprecated

Distinct filters combine with AND. Parameter names and exact string/enum values are case-sensitive. Unknown query names are ignored. All documented filters on this operation are newly introduced. Empty or whitespace-only values are ignored; repeated nonblank or invalid values return 400. Deprecated alias for /workflows/{workflowId}/jobs/{jobId}/instances.

path Parameters
workflowId
required
string <uuid>
jobId
required
string <uuid>
query Parameters
id
string <uuid>

Exact UUID equality. Empty or whitespace-only values are ignored; invalid or repeated nonblank values return 400.

hostname
string

Exact, case-sensitive equality. Empty or whitespace-only values are ignored; repeated nonblank values return 400.

ip
string

Exact textual IP address; must be a valid IPv4 or IPv6 address.

status
string
Enum: "PROVISIONING" "READY" "ERROR" "DEPROVISIONING" "UNKNOWN" "CHECKING_DEPENDENCIES_HEADROOM" "SPAWNING_VM" "POWERING_ON_VM" "POWERING_OFF_VM" "INITIALIZING_DEVICE" "APPLYING_LICENSE" "APPLYING_TEMPLATE" "SYNCING_FULL_CONFIG" "ADDING_TO_AUTO_CONFIG_SYNC" "ENSURING_TRAFFIC_ADVERTISED" "ENSURING_TRAFFIC_NOT_ADVERTISED" "REGISTERING_DEVICE" "REMOVING_FROM_CONFIG_SYNC" "WAITING_FOR_CONNECTION_DRAIN" "REVOKING_LICENSE" "DELETING_VM" "DEREGISTERING_DEVICE"

Exact, case-sensitive equality. Empty or whitespace-only values are ignored; repeated nonblank values return 400.

role
string
Enum: "ACTIVE" "STANDBY"

Exact, case-sensitive equality. Empty or whitespace-only values are ignored; repeated nonblank values return 400.

trafficState
string
Enum: "UNKNOWN" "OUT_OF_TRAFFIC" "JOINING" "IN_TRAFFIC" "DRAINING"

Exact, case-sensitive equality. Empty or whitespace-only values are ignored; repeated nonblank values return 400.

vmName
string

Exact, case-sensitive equality. Empty or whitespace-only values are ignored; repeated nonblank values return 400.

statsDeviceId
string <uuid>

Exact UUID equality.

Responses

200

Devices for the job

400

Invalid new filter or existing generated parameter (msg), or an existing application-level list rejection (error).

404

Resource not found

get/api/provisioning/v1/workflows/{workflowId}/jobs/{jobId}/devices
/api/provisioning/v1/workflows/{workflowId}/jobs/{jobId}/devices

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "items":
    [
    ],
  • "totalItems": 0
}

License

Check license service health status

Returns the health status of the license service including activation status, storage metrics, and license information

Responses

200

License service is healthy

503

Service unavailable

get/api/license/health
/api/license/health

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "status":
    {
    },
  • "license":
    {
    },
  • "storage":
    {
    }
}

Activate license

Activates the license for the service and returns activation status, digital asset ID, entitlements, and subscription details

Request Body schema: application/json
jwt
required
string

JWT token for license activation

customId
string

Optional custom identifier for the device

modeOfOperation
required
string
Enum: "connected" "disconnected"

Mode of operation for license activation

Responses

200

License activated successfully

202

License switch accepted and in progress

400

Invalid activation request

401

Unauthorized activation attempt

409

A license switch is already in progress

500

Internal server error

503

Service unavailable - unable to connect to licensing server

post/api/license/activate
/api/license/activate

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "jwt": "your-jwt-token",
  • "customId": "string",
  • "modeOfOperation": "connected"
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "status": "success",
  • "message": "License activated successfully",
  • "digitalAssetId": "DA-12345-67890",
  • "licenseStatus": "Active",
  • "activatedAt": "2025-12-03T07:18:11Z",
  • "hostLicense":
    {
    },
  • "entitlements":
    [
    ],
  • "subscriptionType": "trial",
  • "expiryDate": "2026-11-29T00:00:32Z"
}

Deactivate license

Deactivates the license for the service and returns deactivation status

Responses

200

License deactivated successfully

400

Invalid deactivation request

401

Unauthorized deactivation attempt

500

Internal server error

post/api/license/deactivate
/api/license/deactivate

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "status": "success",
  • "message": "License deactivated successfully",
  • "digitalAssetId": "string",
  • "licenseStatus": "Terminated",
  • "deactivatedAt": "2026-10-29T14:02:59Z"
}

Download license report

Downloads the license report in disconnected mode (base64 encoded)

Responses

200

License report downloaded successfully

403

Operation not allowed in connected mode

500

Internal server error

get/api/license/report
/api/license/report

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "report": "eyJyZXBvcnROYW1lIjoibXktcmVwb3J0IiwidGVsZW1ldHJ5UmVjb3JkcyI6W119"
}

Verify license report

Verifies a signed license report acknowledgment from F5 TEEM in disconnected mode

Request Body schema: application/json
manifest
required
string

Base64 encoded signed report acknowledgment from F5 TEEM

Responses

200

Report verification initiated successfully

400

Invalid request body

403

Operation not allowed in connected mode

500

Internal server error

put/api/license/report
/api/license/report

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "manifest": "eyJzaWduZWRBY2siOiJ0ZXN0In0="
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "message": "Operation successful"
}

Get license entitlements

Retrieves license entitlements from llm sdk

Responses

200

License entitlements retrieved successfully

500

Internal server error

get/api/license/entitlements
/api/license/entitlements

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "entitlements": { },
  • "status": "success"
}

License Audit

List license audit events

Returns the license activation, assignment, revocation, and deletion audit trail.

Authorizations:
query Parameters
page
integer >= 1
Default: 1

1-based page number.

limit
integer [ 1 .. 500 ]
Default: 50

Number of events per page (maximum 500).

$filter
string
Example: $filter=eventType eq 'LICENSE_ACTIVATED' and poolType eq 'REGKEY_POOL'

OData expression filtering eventType, poolType, poolId, deviceAddress, regKey, or occurredAt.

Responses

200

Paginated license audit events.

400

Invalid query parameter.

401

Unauthorized.

500

Internal server error.

get/api/v1/fleet/licensing/audit
/api/v1/fleet/licensing/audit

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "items":
    [
    ],
  • "totalItems": 0,
  • "page": 0,
  • "limit": 0,
  • "totalPages": 0
}

License Members

Update license member hostname

Updates the hostname of a licensed member device based on its IP/device address. This is a synchronous operation used by other services (like autoscaling) to update device metadata.

Authorizations:
Request Body schema: application/json
deviceAddress
required
string

IP address of the BIG-IP device

hostname
required
string

Hostname of the BIG-IP device

Responses

204

Hostname updated successfully

400

Bad request - missing or invalid fields

401

Unauthorized

404

License member not found for the given device address

500

Internal server error

put/api/v1/fleet/licensing/pool/regkey/members/hostname
/api/v1/fleet/licensing/pool/regkey/members/hostname

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "deviceAddress": "192.168.1.100",
  • "hostname": "bigip-ve-001.local"
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "code": 400,
  • "message": "The license U5939-99933-49705-74523-4841009 has been granted to a device",
  • "details": "string",
  • "timestamp": "2026-10-29T14:02:59Z"
}

Lifecycle

Cancel a running execution

Requests cooperative cancellation of a running execution. Signals the active worker to halt forward steps, executes rollback/compensation cleanup under a detached context to reclaim half-provisioned resources (VMs, IP leases, licenses), and transitions the execution state to CANCELLING then CANCELLED.

path Parameters
workflowId
required
string <uuid>
jobId
required
string <uuid>
executionId
required
string <uuid>
Request Body schema: application/json
reason
string

Operator-provided reason for cancelling the execution.

Responses

202

Cancellation accepted

404

Resource not found

409

Conflict with current resource state

post/api/provisioning/v1/workflows/{workflowId}/jobs/{jobId}/executions/{executionId}/cancel
/api/provisioning/v1/workflows/{workflowId}/jobs/{jobId}/executions/{executionId}/cancel

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "reason": "Operator cancelled runaway scale-out"
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "executionId": "string",
  • "jobId": "string",
  • "status": "CANCELLING",
  • "message": "Cancellation requested. Resource compensation cleanup in progress."
}

Lifecycle - Continuous

Lifecycle control for CONTINUOUS jobs (activate / pause / resume)

Activate a CONTINUOUS job

Transitions job from READY/PAUSED → ACTIVE and enables it. Only valid for jobs whose parent Workflow has executionMode=CONTINUOUS. Enables the job's examine/evaluation worker; each scale-out/scale-in the worker triggers is its own execution (no long-lived execution container is created by activation itself).

path Parameters
workflowId
required
string <uuid>
jobId
required
string <uuid>

Responses

200

Job activated

400

Invalid request

404

Resource not found

409

Conflict with current resource state

post/api/provisioning/v1/workflows/{workflowId}/jobs/{jobId}/activate
/api/provisioning/v1/workflows/{workflowId}/jobs/{jobId}/activate

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "id": "220f0b6b-87e7-4e5f-bcc2-9f2d26786ac6",
  • "workflowId": "b7e6a4ae-4cf9-4ad4-b8f9-9b5347300d73",
  • "status": "ACTIVE",
  • "enabled": true
}

Pause a CONTINUOUS job

Halts automatic evaluation for CONTINUOUS execution. No new activities are triggered while paused. In-flight activity processing may complete before full pause takes effect.

path Parameters
workflowId
required
string <uuid>
jobId
required
string <uuid>

Responses

200

Job paused

404

Resource not found

409

Conflict with current resource state

post/api/provisioning/v1/workflows/{workflowId}/jobs/{jobId}/pause
/api/provisioning/v1/workflows/{workflowId}/jobs/{jobId}/pause

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "message": "job paused"
}

Resume a paused CONTINUOUS job

Resumes automatic evaluation for a previously paused CONTINUOUS job. New activities can be generated again based on policy/signal conditions.

path Parameters
workflowId
required
string <uuid>
jobId
required
string <uuid>

Responses

200

Job resumed

404

Resource not found

409

Conflict with current resource state

post/api/provisioning/v1/workflows/{workflowId}/jobs/{jobId}/resume
/api/provisioning/v1/workflows/{workflowId}/jobs/{jobId}/resume

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "message": "job resumed"
}

LocalUsers

List local users

Lists F5 Insights local users (users created directly in the identity provider with a password, not federated from an external LDAP/SAML identity provider). Admin only.

Responses

200

Success

403

Caller is not an admin

500

Internal Error

get/api/auth/users
/api/auth/users

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "users":
    [
    ],
  • "total_count": 0
}

Create local user

Creates a new F5 Insights local user in the identity provider (Human user type) inside the F5 Insights organization, assigns the requested role, and mirrors the user + role into the F5 Insights database. Admin only.

Request Body schema: application/json
username
required
string non-empty

Unique login name for the user.

email
required
string <email>

User's email address.

display_name
string

Human-friendly display name.

password
string Nullable

Optional initial password. If omitted, the server generates a secure random initial password. In all cases the user must change the password on first login.

role
required
string (LocalUserRole) non-empty

F5 Insights authorization role. May be a built-in role (admin, operator, viewer) or the name of a custom role. The value is validated against the roles defined in the database at request time, so the set of valid roles is not fixed by this schema.

Responses

201

User created

400

Bad Request

403

Caller is not an admin

409

A user with this username already exists

500

Internal Error

post/api/auth/users
/api/auth/users

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "username": "string",
  • "email": "user@example.com",
  • "display_name": "string",
  • "password": "string",
  • "role": "string"
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "id": "string",
  • "username": "string",
  • "display_name": "string",
  • "email": "user@example.com",
  • "role": "string",
  • "state": "string",
  • "created_at": "2026-10-29T14:02:59Z",
  • "last_modified": "2026-10-29T14:02:59Z",
  • "temp_password": "string"
}

Get local user by ID

path Parameters
id
required
string

Responses

200

Success

403

Caller is not an admin

404

Not Found

500

Internal Error

get/api/auth/users/{id}
/api/auth/users/{id}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "id": "string",
  • "username": "string",
  • "display_name": "string",
  • "email": "user@example.com",
  • "role": "string",
  • "state": "string",
  • "created_at": "2026-10-29T14:02:59Z",
  • "last_modified": "2026-10-29T14:02:59Z"
}

Update local user

Updates a local user's display name, email, and/or role. Only the supplied fields are changed. Admin only.

path Parameters
id
required
string
Request Body schema: application/json
display_name
string Nullable
email
string <email> Nullable
role
string (LocalUserRole) non-empty

F5 Insights authorization role. May be a built-in role (admin, operator, viewer) or the name of a custom role. The value is validated against the roles defined in the database at request time, so the set of valid roles is not fixed by this schema.

Responses

200

User updated

400

Bad Request

403

Caller is not an admin

404

Not Found

500

Internal Error

put/api/auth/users/{id}
/api/auth/users/{id}

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "display_name": "string",
  • "email": "user@example.com",
  • "role": "string"
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "id": "string",
  • "username": "string",
  • "display_name": "string",
  • "email": "user@example.com",
  • "role": "string",
  • "state": "string",
  • "created_at": "2026-10-29T14:02:59Z",
  • "last_modified": "2026-10-29T14:02:59Z"
}

Delete local user

Removes the local user from the identity provider and the F5 Insights database. Admin only.

path Parameters
id
required
string

Responses

200

User deleted

403

Caller is not an admin

404

Not Found

500

Internal Error

delete/api/auth/users/{id}
/api/auth/users/{id}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "status": "success",
  • "message": "User 'jdoe' deleted successfully",
  • "id": "string"
}

Assign or update a local user's role

Assigns (or replaces) the role for a local user. The role is updated in both the identity provider (as a project role grant) and the F5 Insights database. Admin only.

path Parameters
id
required
string
Request Body schema: application/json
role
required
string (LocalUserRole) non-empty

F5 Insights authorization role. May be a built-in role (admin, operator, viewer) or the name of a custom role. The value is validated against the roles defined in the database at request time, so the set of valid roles is not fixed by this schema.

Responses

200

Role updated

400

Bad Request

403

Caller is not an admin

404

Not Found

500

Internal Error

post/api/auth/users/{id}/roles
/api/auth/users/{id}/roles

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "role": "string"
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "id": "string",
  • "username": "string",
  • "display_name": "string",
  • "email": "user@example.com",
  • "role": "string",
  • "state": "string",
  • "created_at": "2026-10-29T14:02:59Z",
  • "last_modified": "2026-10-29T14:02:59Z"
}

Reset a local user's password (admin)

Admin-initiated password reset for a local user. When send_email is true, the identity provider sends the user a one-time password reset link by email. Otherwise a temporary password is generated and returned in the response; the user is required to change it on first login. Admin only.

path Parameters
id
required
string
Request Body schema: application/json
send_email
boolean
Default: false

When true, the identity provider emails the user a one-time reset link and no temporary password is returned. When false (default), a temporary password is generated and returned.

Responses

200

Password reset initiated

403

Caller is not an admin

404

Not Found

500

Internal Error

post/api/auth/users/{id}/password-reset
/api/auth/users/{id}/password-reset

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "send_email": false
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "message": "string",
  • "temp_password": "string"
}

Change your own password (self-service)

Authenticated local user changes their own password. Requires the current password (verified against the identity provider) and a new password that satisfies the configured password policy. Available to any authenticated role.

Request Body schema: application/json
current_password
required
string non-empty
new_password
required
string non-empty

Responses

200

Password changed

400

Bad Request

401

Current password is incorrect or caller is not authenticated

404

Not Found

500

Internal Error

post/api/auth/users/me/change-password
/api/auth/users/me/change-password

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "current_password": "string",
  • "new_password": "string"
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "message": "Operation successful"
}

Mode Management

Initiate system mode switch

Switch F5 Insight between lite and full modes.

Mode Descriptions:

  • lite: Minimal mode with otel-collector, clickhouse, backend, frontend, postgres, vault, zitadel, platform-manager
  • full: Full observability mode with additional services: victoriametrics, vmagent, vmalert, system-manager

Constraints:

  • Cannot switch from full → lite (downgrade blocked)
  • Cannot switch to same mode
  • License validation required for lite → full upgrade
  • Returns 202 with task_id for async tracking
Request Body schema: application/json
target_mode
required
string
Enum: "lite" "full"

Target mode to switch to

Responses

202

Mode switch initiated successfully

400

Invalid request (same mode, full→lite not allowed, invalid mode)

403

License validation failed (lite→full requires valid license)

500

Internal server error

post/api/system/mode
/api/system/mode

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "target_mode": "full"
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "task_id": "123e4567-e89b-12d3-a456-426614174000",
  • "target_mode": "full",
  • "status": "submitted"
}

Get mode switch status

Query the progress of a mode switch task by task_id.

FSM States:

  • INIT: Task initialized
  • IN_PROGRESS: Running (VALIDATE → SAVE_STATE → SCALE → WAIT_READY → HEALTH_CHECK)
  • COMPLETED: Successfully finished
  • FAILED: Error occurred
path Parameters
task_id
required
string <uuid>
Example: 123e4567-e89b-12d3-a456-426614174000

UUID of the mode switch task

Responses

200

Mode switch status retrieved successfully

400

Invalid task_id format

404

Task not found

500

Internal server error

get/api/system/mode/status/{task_id}
/api/system/mode/status/{task_id}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "task_id": "123e4567-e89b-12d3-a456-426614174000",
  • "current_mode": "lite",
  • "target_mode": "full",
  • "state": "IN_PROGRESS",
  • "status": "RUNNING",
  • "progress": 60,
  • "error_message": "Failed to scale deployment: timeout"
}

Get available system modes and capabilities

Returns information about the current system mode (lite/full).

Responses

200

Mode capabilities retrieved successfully

500

Internal server error

get/api/system/mode/capabilities
/api/system/mode/capabilities

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "current_mode": "lite",
  • "message": ""
}

Get active mode switch task

Returns the currently running (non-terminal) mode switch task. Returns 404 when no mode switch is in progress.

Responses

200

Active mode switch task found

404

No mode switch task in progress

500

Internal server error

get/api/system/mode/active-task
/api/system/mode/active-task

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "task_id": "123e4567-e89b-12d3-a456-426614174000",
  • "state": "HELM_UPGRADE",
  • "status": "running",
  • "progress": 50,
  • "error_message": "Helm upgrade failed"
}

OTEL Configuration

Get global OTEL metrics configuration

Get the current global metrics collection configuration for OTEL collector

Responses

200

Current metrics configuration

500

Internal server error

get/api/otel/metrics/config
/api/otel/metrics/config

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "metrics_enabled": true,
  • "updated_at": "2026-07-28T10:30:00Z"
}

Update global OTEL metrics configuration

Update the global metrics collection configuration. When disabled, OTEL collector skips all BigIP receiver creation. Triggers OTEL collector restart.

Request Body schema: application/json
metrics_enabled
required
boolean

Set to false to disable all metrics collection system-wide

Responses

200

Configuration updated successfully

400

Invalid request

500

Internal server error

put/api/otel/metrics/config
/api/otel/metrics/config

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "metrics_enabled": true
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "metrics_enabled": true,
  • "updated_at": "2026-07-28T10:30:00Z"
}

Observability

Executions, activities, activity steps, and audit events

List jobs across all workflows

Distinct filters combine with AND. Parameter names and exact string/enum values are case-sensitive. Unknown query names are ignored. The new name, enabled, and modifiedBy filters ignore empty or whitespace-only values; repeated nonblank or invalid values return 400. Existing id, workflowId, type, executionMode, status, search, page, and limit parameters retain their historical generated-binding and blank-string behavior. Global jobs listing endpoint across workflow templates. Useful for platform views, tenant operations dashboards, and central search.

query Parameters
page
integer >= 1
Default: 1
limit
integer [ 1 .. 200 ]
Default: 50
name
string

Exact case-sensitive equality. Empty or whitespace-only values are ignored. Whitespace in nonblank names is preserved; repeated nonblank values return 400.

enabled
boolean

Exact Boolean equality; empty or whitespace-only values are ignored, otherwise only lowercase true or false are accepted. False applies a filter.

modifiedBy
string

Exact case-sensitive modifier identity. Empty or whitespace-only values are ignored; repeated nonblank values return 400.

sortBy
string (JobSortBy)
Enum: "name" "description" "createdAt" "updatedAt" "executionsCount" "executing" "workflow" "status"

Field to sort by. Omitted, empty or whitespace-only values keep the default order (createdAt descending). Ties are broken by job id. Repeated nonblank or unknown values return 400.

sortOrder
string (SortOrder)
Enum: "asc" "desc"

Sort direction. Requires sortBy to also be set; a nonblank sortOrder without sortBy returns 400. Defaults to asc, except createdAt which defaults to desc to match the default (sortBy omitted) order. Repeated nonblank or unknown values return 400.

id
string <uuid>

Optional exact-match filter on a job's UUID. Use this to look up a specific job by its id; the free-text search filter intentionally does not match on ids.

workflowId
string <uuid>
type
string
Enum: "AUTO_SCALE" "UPGRADE" "SOFTWARE_DISTRIBUTION" "SOFTWARE_INSTALLATION" "BACKUP" "DEVICE_BACKUP" "DEVICE_RESTORE" "RELICENSE"
executionMode
string
Enum: "CONTINUOUS" "ON_DEMAND" "SCHEDULED"
status
string
Enum: "PENDING" "READY" "ACTIVE" "RUNNING" "PAUSING" "PAUSED" "CANCELLING" "INACTIVE" "ERROR" "COMPLETED" "FAILED" "CANCELLED" "DELETING" "DRAFT"
search
string

Optional free-text filter. Matches jobs whose name, type, or parent workflow name contains this value (case-insensitive), across the whole dataset. Ids are intentionally excluded; use the id filter to look up a job by its UUID. Composes (AND) with the other filters. Pagination totals reflect the filtered set. A single character is a valid search; empty or whitespace-only search adds no search restriction.

Responses

200

List of jobs

400

Invalid new filter or existing generated parameter (msg), or an existing application-level list rejection (error).

get/api/provisioning/v1/jobs
/api/provisioning/v1/jobs

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "items":
    [
    ],
  • "pagination":
    {
    }
}

List executions across all workflows and jobs

Distinct filters combine with AND. Parameter names and exact string/enum values are case-sensitive. Unknown query names are ignored. The new id filter ignores empty or whitespace-only values; repeated nonblank or invalid values return 400. Existing workflowId, jobId, type, executionMode, status, since, until, page, and limit parameters retain their historical generated-binding behavior, including permissive enum strings. Existing date-time inputs accept RFC 3339, YYYY-MM-DD, and historically accepted generated-binding forms. Repeated time bounds use the first value; explicitly blank bounds retain their zero-time value. Bounds apply independently without new range validation. Common matching retains original database/driver precision, which can collapse sub-microsecond reversed bounds to one stored instant. New-filter errors use the msg envelope with safe validation details; legacy generated-binding failures retain their original msg messages and parameter ordering. The existing trigger rejection keeps its error envelope. Global execution timeline across the entire platform. Returns only the fields common to every execution type (id, jobId, workflowId, status, executionUrl, startedAt, endedAt) — job-type-specific detail (e.g. AUTO_SCALE's direction/reason/currentStep) is not included here. Follow executionUrl, or use the job-scoped executions endpoints, for type-specific detail. Supports exact id, workflow, job, type and execution-mode filters, status and time bounds. The legacy page_size query parameter is accepted and ignored, including empty, arbitrary and repeated values. It is not a filter and does not affect pagination. The trigger parameter remains unsupported and returns 400.

query Parameters
page
integer >= 1
Default: 1
limit
integer [ 1 .. 200 ]
Default: 50
id
string <uuid>

Exact UUID equality. Empty or whitespace-only values are ignored; invalid or repeated nonblank values return 400.

workflowId
string <uuid>
jobId
string <uuid>
type
string
Enum: "AUTO_SCALE" "UPGRADE" "SOFTWARE_DISTRIBUTION" "SOFTWARE_INSTALLATION" "BACKUP" "DEVICE_BACKUP" "DEVICE_RESTORE" "RELICENSE"
executionMode
string
Enum: "CONTINUOUS" "ON_DEMAND" "SCHEDULED"
status
string
Enum: "RUNNING" "PAUSING" "PAUSED" "CANCELLING" "COMPLETED" "FAILED" "CANCELLED" "TIMEOUT"

RUNNING also includes PAUSING, PAUSED and CANCELLING; other nonblank statuses match exactly. Legacy string values remain accepted; a blank value adds no predicate.

trigger
string
Deprecated
Enum: "USER" "ALERT" "SYSTEM" "SCHEDULE"

Unsupported; supplied values return 400.

since
string <date-time>

Inclusive startedAt lower bound with historical generated date-time parsing; the first repeated value is used and an explicitly blank value retains zero-time behavior.

until
string <date-time>

Inclusive startedAt upper bound with historical generated date-time parsing; the first repeated value is used and an explicitly blank value retains zero-time behavior.

Responses

200

List of executions (common fields only)

400

Invalid new filter or existing generated parameter (msg), or an existing application-level list rejection (error).

get/api/provisioning/v1/executions
/api/provisioning/v1/executions

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "items":
    [
    ],
  • "totalItems": 2
}

List executions for a job

Distinct filters combine with AND. Parameter names and exact string/enum values are case-sensitive. Unknown query names are ignored. The new id filter ignores empty or whitespace-only values; repeated nonblank or invalid values return 400. Existing status retains historical scalar input acceptance while now filtering results. Legacy status strings remain permissive; blank status adds no predicate. The legacy since, until, and trigger parameters remain accepted and ignored. Date-time inputs retain historical generated-binding validation, accepting RFC 3339, YYYY-MM-DD, and historically accepted forms. Repeated date-time parameters use the first value; valid values never restrict the result. New-filter errors use the msg envelope with safe validation details; legacy generated-binding failures retain their original msg messages and parameter ordering. Existing application errors retain their original format. Each scale-out/scale-in action is its own execution. Rows include the common execution fields plus AUTO_SCALE-specific detail merged in (direction, strategy, reason, taskRef, currentStep, keepAliveAt, retryCount, lastError, correlationId) when the job is AUTO_SCALE; those fields are omitted for job types with no matching detail row. Use filters (id, status) for timeline and troubleshooting use-cases.

path Parameters
workflowId
required
string <uuid>
jobId
required
string <uuid>
query Parameters
page
integer >= 1
Default: 1
limit
integer [ 1 .. 200 ]
Default: 50
id
string <uuid>

Exact UUID equality. Empty or whitespace-only values are ignored; invalid or repeated nonblank values return 400.

status
string
Enum: "RUNNING" "PAUSING" "PAUSED" "CANCELLING" "COMPLETED" "FAILED" "CANCELLED" "TIMEOUT"

Exact status equality within the path job; RUNNING is not expanded. Legacy string values remain accepted; a blank value adds no predicate.

trigger
string
Deprecated
Enum: "USER" "ALERT" "SYSTEM" "SCHEDULE"

Legacy compatibility parameter; accepted with its historical scalar binding but ignored.

since
string <date-time>

Legacy compatibility parameter; accepted with historical generated date-time parsing but ignored. Repeated values use the first value.

until
string <date-time>

Legacy compatibility parameter; accepted with historical generated date-time parsing but ignored. Repeated values use the first value.

Responses

200

List of executions merged with AUTO_SCALE detail when present

400

Invalid new filter or existing generated parameter (msg), or an existing application-level list rejection (error).

404

Resource not found

get/api/provisioning/v1/workflows/{workflowId}/jobs/{jobId}/executions
/api/provisioning/v1/workflows/{workflowId}/jobs/{jobId}/executions

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "items":
    [
    ]
}

Get execution detail including steps

Returns the full detail for one execution: common execution fields + AUTO_SCALE-specific detail (direction, strategy, reason, taskRef, currentStep, keepAliveAt, retryCount, lastError, correlationId) + its steps — the same content previously only available via the nested .../activities/{activityId} endpoint.

path Parameters
workflowId
required
string <uuid>
jobId
required
string <uuid>
executionId
required
string <uuid>

Responses

200

Execution detail with steps

404

Resource not found

get/api/provisioning/v1/workflows/{workflowId}/jobs/{jobId}/executions/{executionId}
/api/provisioning/v1/workflows/{workflowId}/jobs/{jobId}/executions/{executionId}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "id": "2f2f8b64-91d2-4d4f-9aa8-03b8a9238ea1",
  • "jobId": "220f0b6b-87e7-4e5f-bcc2-9f2d26786ac6",
  • "workflowId": "b7e6a4ae-4cf9-4ad4-b8f9-9b5347300d73",
  • "status": "RUNNING",
  • "executionUrl": "/v1/workflows/b7e6a4ae-4cf9-4ad4-b8f9-9b5347300d73/jobs/220f0b6b-87e7-4e5f-bcc2-9f2d26786ac6/executions/2f2f8b64-91d2-4d4f-9aa8-03b8a9238ea1",
  • "startedAt": "2026-05-18T08:10:00.000Z",
  • "direction": "SCALE_OUT",
  • "strategy": "FULL_PROVISIONING",
  • "reason": "desired vs actual delta: 1",
  • "currentStep": "REGISTER_INSTANCE",
  • "retryCount": 0,
  • "steps":
    [
    ]
}

List activities for an execution Deprecated

Deprecated: for AUTO_SCALE jobs an execution has at most one activity (itself), so this always returns 0 or 1 items. Use GET .../executions/{executionId} instead, which already includes direction/reason/currentStep and steps in one call.

Activities are action units inside an execution. Examples: SCALE_OUT, SCALE_IN, STANDBY_CREATE, STANDBY_DELETE, UPGRADE, PRECHECK, POSTCHECK.

  • CONTINUOUS: this list grows over the life of the single execution.
  • ON_DEMAND: this list typically contains one or a small fixed set of activities. Use this endpoint to inspect action-level outcomes before drilling into step-level detail.
path Parameters
workflowId
required
string <uuid>
jobId
required
string <uuid>
executionId
required
string <uuid>
query Parameters
page
integer >= 1
Default: 1
limit
integer [ 1 .. 200 ]
Default: 50
activityType
string
status
string
Enum: "PENDING" "RUNNING" "COMPLETED" "FAILED" "SKIPPED" "CANCELLED"
since
string <date-time>

Responses

200

List of activities

404

Resource not found

get/api/provisioning/v1/workflows/{workflowId}/jobs/{jobId}/executions/{executionId}/activities
/api/provisioning/v1/workflows/{workflowId}/jobs/{jobId}/executions/{executionId}/activities

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "items":
    [
    ],
  • "total": 2,
  • "page": 1,
  • "limit": 50
}

Get activity detail including steps Deprecated

Deprecated: activityId must equal executionId (there is no separate activity entity anymore). Use GET .../executions/{executionId} instead, which returns the same detail + steps directly.

Returns one activity with full step breakdown, retries, timing, and error details. Use this as the primary endpoint for root-cause analysis of a failed activity.

path Parameters
workflowId
required
string <uuid>
jobId
required
string <uuid>
executionId
required
string <uuid>
activityId
required
string <uuid>

Responses

200

Activity with steps

404

Resource not found

get/api/provisioning/v1/workflows/{workflowId}/jobs/{jobId}/executions/{executionId}/activities/{activityId}
/api/provisioning/v1/workflows/{workflowId}/jobs/{jobId}/executions/{executionId}/activities/{activityId}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "id": "0c4208f9-f7bf-4891-a2a3-df08eb7720d8",
  • "executionId": "2f2f8b64-91d2-4d4f-9aa8-03b8a9238ea1",
  • "activityType": "SCALE_OUT",
  • "status": "COMPLETED",
  • "trigger": "ALERT",
  • "reason": "cpu_utilization > 90",
  • "startedAt": "2026-05-18T12:20:00.000Z",
  • "completedAt": "2026-05-18T12:21:15.000Z",
  • "durationMs": 75000,
  • "currentStep": "FINISHED",
  • "stepCount": 4,
  • "steps":
    [
    ]
}

List autoscale scaling events for a job

Distinct filters combine with AND. Parameter names and exact string/enum values are case-sensitive. Unknown query names are ignored. All documented event filters are newly introduced. Empty or whitespace-only values are ignored; repeated nonblank or invalid values return 400. Returns autoscale decision history for a job. Each event records why capacity was evaluated, whether scaling was approved, skipped, suppressed, rejected, or superseded, and how many executions were created from that decision.

path Parameters
workflowId
required
string <uuid>
jobId
required
string <uuid>
query Parameters
page
integer >= 1
Default: 1
limit
integer [ 1 .. 200 ]
Default: 50
id
string <uuid>

Exact UUID equality. Empty or whitespace-only values are ignored; invalid or repeated nonblank values return 400.

source
string
Enum: "USER" "ALERT" "SYSTEM" "SCHEDULE"

Exact, case-sensitive equality. Empty or whitespace-only values are ignored; repeated nonblank values return 400.

eventType
string
Enum: "DESIRED_SIZE_CHANGED" "METRIC_ALERT" "INITIAL_RECONCILE" "PERIODIC_RECONCILE" "DELETE_CLEANUP" "TARGETED_INSTANCE_DELETE"

Exact, case-sensitive equality. Empty or whitespace-only values are ignored; repeated nonblank values return 400.

eventStatus
string
Enum: "RECEIVED" "PROCESSING" "PROCESSED" "FAILED" "CANCELLED"

Exact, case-sensitive equality. Empty or whitespace-only values are ignored; repeated nonblank values return 400.

outcome
string
Enum: "APPROVED" "NO_OP" "SUPPRESSED" "REJECTED" "SUPERSEDED"

Exact, case-sensitive equality. Empty or whitespace-only values are ignored; repeated nonblank values return 400.

direction
string
Enum: "SCALE_OUT" "SCALE_IN"

Exact, case-sensitive equality. Empty or whitespace-only values are ignored; repeated nonblank values return 400.

handlingId
string <uuid>

Exact UUID equality.

Responses

200

List of autoscale scaling events

400

Invalid new filter or existing generated parameter (msg), or an existing application-level list rejection (error).

404

Resource not found

get/api/provisioning/v1/workflows/{workflowId}/jobs/{jobId}/events
/api/provisioning/v1/workflows/{workflowId}/jobs/{jobId}/events

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "items":
    [
    ],
  • "totalItems": 1
}

Get autoscale scaling event detail

Returns one autoscale scaling event with the child autoscale executions created from that decision.

path Parameters
workflowId
required
string <uuid>
jobId
required
string <uuid>
eventId
required
string <uuid>

Responses

200

Autoscale scaling event with child executions

404

Resource not found

get/api/provisioning/v1/workflows/{workflowId}/jobs/{jobId}/events/{eventId}
/api/provisioning/v1/workflows/{workflowId}/jobs/{jobId}/events/{eventId}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "id": "string",
  • "workflowId": "string",
  • "jobId": "string",
  • "source": "USER",
  • "eventType": "DESIRED_SIZE_CHANGED",
  • "eventStatus": "RECEIVED",
  • "outcome": "APPROVED",
  • "direction": "SCALE_OUT",
  • "reason": "string",
  • "handlingId": "string",
  • "alertId": "string",
  • "policyName": "string",
  • "metricName": "string",
  • "metricValue": 0,
  • "threshold": 0,
  • "desiredBefore": 0,
  • "desiredAfter": 0,
  • "delta": 0,
  • "executionCount": 0,
  • "completedExecutionCount": 0,
  • "failedExecutionCount": 0,
  • "occurrenceCount": 0,
  • "lastSeenAt": "2026-10-29T14:02:59Z",
  • "processedAt": "2026-10-29T14:02:59Z",
  • "completedAt": "2026-10-29T14:02:59Z",
  • "metadata": { },
  • "createdAt": "2026-10-29T14:02:59Z",
  • "updatedAt": "2026-10-29T14:02:59Z",
  • "executions":
    [
    ]
}

Onboarding

Get onboarding status

Returns the status of components including license, AI integrations, and device onboarding

Responses

200

Onboarding status retrieved successfully

500

Internal server error

get/api/onboarding/status
/api/onboarding/status

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "license_status": "ACTIVE",
  • "custom_llm_integration": "NOT_CONFIGURED",
  • "f5_aidf_integration": "NOT_CONFIGURED",
  • "devices_onboarded": "NOT_CONFIGURED"
}

Update onboarding status

Update onboarding status fields. All fields are optional - only provided fields will be updated.

Request Body schema: application/json
license_status
string
Enum: "ACTIVE" "INACTIVE"

Current license status

custom_llm_integration
string
Enum: "NOT_CONFIGURED" "CONFIGURED" "SKIPPED"

Custom LLM integration status

f5_aidf_integration
string
Enum: "NOT_CONFIGURED" "CONFIGURED" "SKIPPED"

F5 AIDF integration status

devices_onboarded
string
Enum: "NOT_CONFIGURED" "CONFIGURED" "SKIPPED"

Device onboarding status

Responses

200

Onboarding status updated successfully

400

Invalid request body

500

Internal server error

patch/api/onboarding/status
/api/onboarding/status

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "license_status": "ACTIVE",
  • "custom_llm_integration": "NOT_CONFIGURED",
  • "f5_aidf_integration": "NOT_CONFIGURED",
  • "devices_onboarded": "NOT_CONFIGURED"
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "license_status": "ACTIVE",
  • "custom_llm_integration": "NOT_CONFIGURED",
  • "f5_aidf_integration": "NOT_CONFIGURED",
  • "devices_onboarded": "NOT_CONFIGURED"
}

Readiness

List readiness check runs

Returns a paginated list of readiness check runs with rollup summaries. Each item contains the run status, device counts, and timestamps — but not the full per-device results. Use GET /readiness/{runId} for the detailed per-device breakdown.

query Parameters
page
integer >= 1
Default: 1
page_size
integer [ 1 .. 500 ]
Default: 20
status
string
Enum: "PENDING" "RUNNING" "PASSED" "WARNING" "FAILED" "ERROR"

Filter runs by rolled-up status.

Responses

200

Paginated list of readiness runs

401

Authentication required

get/api/v1/fleet/upgrade/readiness
/api/v1/fleet/upgrade/readiness

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "data":
    [
    ],
  • "pagination":
    {
    }
}

Trigger async pre-distribution readiness checks for target devices

Runs the requested readiness checks against the specified target devices. This is a pre-distribution gate — call before distributing images to verify that target devices are ready to receive the distribution.

The request envelope holds shared context (device targets and image IDs) and a list of check types to run. Image metadata is resolved once and shared across all checks.

Returns 202 Accepted with a run_id. Poll GET /readiness/{runId} until status is no longer PENDING or RUNNING.


Supported check types

Type What it checks Severity
base_image_presence For each hotfix image, verifies the required base OS image is present on the device's image catalog (or co-distributed). SOFT/WARN
disk_space Sums image file sizes and verifies the device has enough free space in its image filesystem. Also updates disk_available_gb in device metadata. SOFT/WARN
image_compatibility Verifies each image's product family is compatible with the target device type (e.g. BIG-IP images cannot target F5OS devices and vice versa). HARD/FAIL
deletable_images When deleteOtherImages is enabled, previews the catalog images that distribution cleanup would delete. It protects the running image and all requested distribution targets, and returns the candidate identities and reclaimable bytes. BIG-IP base ISOs/hotfixes and rSeries F5OS catalog images are supported; VELOS is not. SOFT/WARN

Adding a new check type (internal)

  1. Implement the Check interface.
  2. Register a ReadinessDescriptor in DefaultReadinessRegistry.
  3. Add the type to the enum in this schema.

No API envelope changes are required.

Request Body schema: application/json
context
required
object (ReadinessContext)

Shared context for all readiness checks in a single run.

checks
required
Array of objects (ReadinessCheckEntry) non-empty

List of readiness check types to run.

Responses

202

Readiness checks triggered — poll GET /readiness/{runId} for results

400

Invalid request

401

Authentication required

post/api/v1/fleet/upgrade/readiness
/api/v1/fleet/upgrade/readiness

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "context":
    {
    },
  • "checks":
    [
    ]
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "run_id": "string",
  • "message": "readiness checks triggered"
}

Get results for a readiness check run

Returns persisted per-device readiness results for a run. Poll until status is no longer PENDING or RUNNING. can_proceed: true means no hard-blocking failures exist.

path Parameters
runId
required
string <uuid>

The readiness run ID returned by POST /readiness

Responses

200

Readiness check results

401

Authentication required

404

Resource not found

get/api/v1/fleet/upgrade/readiness/{runId}
/api/v1/fleet/upgrade/readiness/{runId}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "run_id": "string",
  • "status": "PENDING",
  • "device_count": 0,
  • "pass_count": 0,
  • "warn_count": 0,
  • "fail_count": 0,
  • "error_count": 0,
  • "can_proceed": true,
  • "devices":
    [
    ],
  • "triggered_at": "2026-10-29T14:02:59Z",
  • "completed_at": "2026-10-29T14:02:59Z"
}

Regkey License Offering

Operations for managing license offerings within pools

Bulk import licenses into the regkey pool

Bulk import licenses into the specified regkey license pool. Keys are activated by default with Automatic mode.

Authorizations:
path Parameters
poolId
required
string <uuid>
Example: 7dd7b971-6eb8-4b9e-995b-1dcb1287d65f

UUID of the license pool

Request Body schema:
regKeys
required
Array of strings

List of registration keys to import into the pool

Responses

202

Bulk import accepted and started asynchronously. Poll the GET endpoint to track per-key status.

400

Bad request - invalid input

401

Unauthorized

404

License pool not found

500

Internal server error

post/api/v1/fleet/licensing/tmos/pool/regkey/licenses/{poolId}/offerings/bulk-import
/api/v1/fleet/licensing/tmos/pool/regkey/licenses/{poolId}/offerings/bulk-import

Request samples

Content type
Copy
Expand all Collapse all
{
  • "regKeys":
    [
    ]
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "taskId": "string",
  • "status": "string",
  • "selfLink": "http://example.com",
  • "overallStatus": "in-progress"
}

Get current bulk import status for the pool

Returns the latest bulk import task for the specified pool.

Use this endpoint when the taskId is not available — for example after a page refresh or when the UI navigates back to the import screen. Since only one task record exists per pool at a time (upserted on each new import), this always returns the most recent import status.

Returns 204 if no bulk import has ever been initiated for this pool, or if the task record has been cleaned up after TTL expiry.

Authorizations:
path Parameters
poolId
required
string <uuid>
Example: 7dd7b971-6eb8-4b9e-995b-1dcb1287d65f

UUID of the license pool

Responses

200

The latest bulk import task for this pool.

204

No bulk import task found for this pool

401

Unauthorized

500

Internal server error

get/api/v1/fleet/licensing/tmos/pool/regkey/licenses/{poolId}/offerings/bulk-import
/api/v1/fleet/licensing/tmos/pool/regkey/licenses/{poolId}/offerings/bulk-import

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "taskId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  • "overallStatus": "completed-with-errors"
}

Get bulk import status by task ID

Returns the status of a specific bulk import task by its ID.

Use this endpoint when the taskId is available — i.e., the UI stored the taskId returned in the 202 response from POST /bulk-import and is actively polling. Prefer this over the no-taskId variant when the ID is in hand, as it is an exact lookup.

Keep polling until overallStatus is completed or completed-with-errors.

Authorizations:
path Parameters
poolId
required
string <uuid>
Example: 7dd7b971-6eb8-4b9e-995b-1dcb1287d65f

UUID of the license pool

taskId
required
string <uuid>
Example: a1b2c3d4-e5f6-7890-abcd-ef1234567890

UUID of the bulk import task returned by the POST response

Responses

200

Current status of the bulk import task.

401

Unauthorized

404

Task or license pool not found

500

Internal server error

get/api/v1/fleet/licensing/tmos/pool/regkey/licenses/{poolId}/offerings/bulk-import/{taskId}
/api/v1/fleet/licensing/tmos/pool/regkey/licenses/{poolId}/offerings/bulk-import/{taskId}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{}

Add license offering to the pool

Adds a license offering to an existing pool by activating a registration key. Steps - 1. Generate public/private keys and dossier. 2. Check the MODE of activation (AUTOMATIC, MANUAL, CCN) and trigger corresponding flow. 3. Contact F5 License Server at https://authem.f5net.com/license/services/. 4. F5 License server returns license_text if activation is successful.

Authorizations:
path Parameters
poolId
required
string <uuid>
Example: 7dd7b971-6eb8-4b9e-995b-1dcb1287d65f

UUID of the license pool

Request Body schema: application/json
regKey
required
string

F5 registration key

status
required
string
Enum: "ACTIVATING_AUTOMATIC" "ACTIVATING_MANUAL"

Activation mode to use when adding the offering. ACTIVATING_AUTOMATIC - contacts F5 license server automatically. ACTIVATING_MANUAL - begins manual activation flow.

addOnKeys
Array of strings

Optional add-on registration keys to include in the activation dossier.

name
string

Optional name for the license offering

description
string

Optional description for the license offering

Responses

202

License offering activation initiated (async operation)

400

Bad request - invalid registration key or activation failure

401

Unauthorized

404

License pool not found

409

Conflict - registration key already exists in this pool or in another regkey pool

500

Internal server error

post/api/v1/fleet/licensing/tmos/pool/regkey/licenses/{poolId}/offerings
/api/v1/fleet/licensing/tmos/pool/regkey/licenses/{poolId}/offerings

Request samples

Content type
application/json
Example
Copy
Expand all Collapse all
{
  • "regKey": "U5939-99933-49705-74523-4841009",
  • "status": "ACTIVATING_AUTOMATIC",
  • "addOnKeys": [ ],
  • "name": "",
  • "description": ""
}

Response samples

Content type
application/json

Get all license offerings in the pool

Retrieves all license offerings associated with a specific license pool

Authorizations:
path Parameters
poolId
required
string <uuid>
Example: 7dd7b971-6eb8-4b9e-995b-1dcb1287d65f

UUID of the license pool

query Parameters
$select
string
Example: $select=selfLink

Fields to select in the response

$filter
string

OData filter expression to filter offerings. Supported fields: status, isAssigned, regKey Examples:

  • isAssigned eq false - Get only available (unassigned) offerings
  • isAssigned eq true - Get only assigned offerings
  • status eq 'READY' - Get only offerings with READY status
  • status eq 'READY' and isAssigned eq false - Get available READY offerings
$page
integer >= 1
Default: 1

1-based page number

$pageSize
integer [ 1 .. 500 ]
Default: 50

Number of items per page

Responses

200

List of license offerings retrieved successfully

401

Unauthorized

404

License pool not found

500

Internal server error

get/api/v1/fleet/licensing/tmos/pool/regkey/licenses/{poolId}/offerings
/api/v1/fleet/licensing/tmos/pool/regkey/licenses/{poolId}/offerings

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "items":
    [
    ],
  • "totalItems": 0,
  • "tasks":
    [],
  • "pagination":
    {
    }
}

Bulk delete licenses from the pool

Synchronously deletes registration keys from the specified license pool. The result is returned directly in the response — no polling required.

Supported deletion modes (mutually exclusive):

  1. Specific keys — provide regKeys in the request body to delete only those keys.
  2. All keys — set query param selectAll=true to delete every offering in the pool.
  3. All except exclusions — set selectAll=true and provide excludeKeys in the request body to delete all keys except the listed ones.

Assignment guard: If any key targeted for deletion is currently assigned to a device, the entire operation is rejected with 409 Conflict. No keys are deleted. Revoke the assignment first before retrying.

Validation rules:

  • regKeys (body) and selectAll=true (query) are mutually exclusive.
  • excludeKeys (body) is only valid when selectAll=true.
  • At least one of regKeys or selectAll must be provided.
Authorizations:
path Parameters
poolId
required
string <uuid>
Example: 7dd7b971-6eb8-4b9e-995b-1dcb1287d65f

UUID of the license pool

query Parameters
selectAll
boolean
Default: false
Example: selectAll=true

When true, targets all offerings in the pool for deletion. Mutually exclusive with regKeys in the request body. Can be combined with excludeKeys in the request body to preserve specific keys.

Request Body schema: application/json
regKeys
Array of strings

List of specific registration keys to delete. Mutually exclusive with selectAll query parameter.

excludeKeys
Array of strings

List of registration keys to exclude from deletion. Only valid when selectAll=true query parameter is set. Keys in this list are preserved; all others are deleted.

Responses

200

All targeted keys deleted successfully. Returns per-key confirmation.

400

Bad request — invalid input (e.g. both regKeys body field and ?selectAll=true query param provided, or excludeKeys used without ?selectAll=true).

401

Unauthorized

404

License pool not found

409

Conflict — one or more targeted keys are currently assigned to a device. No keys were deleted. Revoke the assignments first and retry.

500

Internal server error

delete/api/v1/fleet/licensing/tmos/pool/regkey/licenses/{poolId}/offerings
/api/v1/fleet/licensing/tmos/pool/regkey/licenses/{poolId}/offerings

Request samples

Content type
application/json
Example
Copy
Expand all Collapse all
{
  • "regKeys":
    [
    ]
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "totalDeleted": 2,
  • "items":
    [
    ]
}

Get license offering by registration key

Retrieves a specific license offering from the pool by its registration key. Returns the full offering details including activation status, license text, and license count information.

Authorizations:
path Parameters
poolId
required
string <uuid>
Example: 7dd7b971-6eb8-4b9e-995b-1dcb1287d65f

UUID of the license pool

regKey
required
string
Example: U5939-99933-49705-74523-4841009

Registration key of the license offering

Responses

200

License offering retrieved successfully

401

Unauthorized

404

License pool or offering not found

500

Internal server error

get/api/v1/fleet/licensing/tmos/pool/regkey/licenses/{poolId}/offerings/{regKey}
/api/v1/fleet/licensing/tmos/pool/regkey/licenses/{poolId}/offerings/{regKey}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "id": "f1e2d3c4-b5a6-7890-cdef-123456789abc",
  • "regKey": "U5939-99933-49705-74523-4841009",
  • "name": "",
  • "description": "",
  • "status": "READY",
  • "taskId": "d4e5f6a7-b8c9-0123-defg-456789abcdef",
  • "licenseText": "string",
  • "licenseState":
    {
    },
  • "activeModules":
    [
    ],
  • "dossier": "1ac56379204d679f59524f2e64300d03b91b4b9ff08225ce0087d91b6cf061227610",
  • "publicKey":
    [
    ],
  • "encryptedPrivateKey":
    [
    ],
  • "message": "You must obtain license text and supply it here",
  • "createdAt": "2026-10-29T14:02:59Z",
  • "activatedAt": "2026-10-29T14:02:59Z",
  • "isAssigned": false,
  • "assignedMember":
    {},
  • "licenseServerUrl": "https://activate.f5.com/license/"
}

Update or reactivate a license offering

Updates an existing license offering in the pool. This endpoint supports three distinct operations based on the status field in the request body:


Operation 1: Automatic Reactivation (Async)

Request: {"status": "ACTIVATING_AUTOMATIC"} Response: 202 Accepted with TaskReference

Triggers automatic reactivation via F5 license server. This is an asynchronous operation.

Steps:

  1. Validate the offering exists and belongs to the specified pool.
  2. Generate a new dossier for the existing registration key.
  3. Contact F5 License Server at https://authem.f5net.com/license/services/ for reactivation.
  4. F5 License Server returns updated license_text if reactivation is successful.
  5. Update the offering status to READY upon successful reactivation.

Poll the returned task link to check completion status.


Operation 2: Manual Reactivation - Get New Dossier (Sync)

Request: {"status": "ACTIVATING_MANUAL"} Response: 200 OK with LicenseOffering (containing new dossier)

Triggers manual reactivation flow. This is a synchronous operation that returns immediately with a new dossier. The offering status will be set to ACTIVATING_MANUAL_NEED_LICENSE_TEXT.

Steps:

  1. Validate the offering exists and belongs to the specified pool.
  2. Regenerate dossier (reuses existing keys).
  3. Return the updated offering with the new dossier.

User should then submit the dossier to F5 license server UI to obtain license text.


Operation 3: Complete Manual Activation with License Text (Sync)

Request: {"status": "ACTIVATING_MANUAL_LICENSE_TEXT_PROVIDED", "licenseText": "..."} Response: 200 OK with LicenseOffering

Completes manual activation by providing the license text. This is a synchronous operation. The offering must be in ACTIVATING_MANUAL_NEED_LICENSE_TEXT status.

Steps:

  1. Validate the offering exists and is in ACTIVATING_MANUAL_NEED_LICENSE_TEXT status.
  2. Validate the provided license text format.
  3. Store the license text and parse license state.
  4. Update the offering status to READY.
Authorizations:
path Parameters
poolId
required
string <uuid>
Example: 7dd7b971-6eb8-4b9e-995b-1dcb1287d65f

UUID of the license pool

regKey
required
string
Example: U5939-99933-49705-74523-4841009

Registration key of the license offering to update

Request Body schema: application/json
status
required
string
Enum: "ACTIVATING_AUTOMATIC" "ACTIVATING_MANUAL" "ACTIVATING_MANUAL_LICENSE_TEXT_PROVIDED"

The operation to perform:

  • ACTIVATING_AUTOMATIC: Trigger automatic reactivation via F5 license server (async)
  • ACTIVATING_MANUAL: Trigger manual reactivation, regenerates dossier (sync)
  • ACTIVATING_MANUAL_LICENSE_TEXT_PROVIDED: Complete manual activation with provided license text (sync)
licenseText
string

License text obtained from F5 license server. Required when status is ACTIVATING_MANUAL_LICENSE_TEXT_PROVIDED. The user obtains this by submitting the dossier to the F5 license server UI.

addOnKeys
Array of strings

Complete list of add-on registration keys to use when starting automatic or manual reactivation. When omitted, the offering's stored add-on keys are preserved. When provided, this list replaces the stored add-on keys; provide an empty list to remove all add-on keys. Not supported with ACTIVATING_MANUAL_LICENSE_TEXT_PROVIDED.

Responses

200

License offering updated successfully. Returned for synchronous operations:

  • ACTIVATING_MANUAL: Returns offering with new dossier (status: ACTIVATING_MANUAL_NEED_LICENSE_TEXT)
  • ACTIVATING_MANUAL_LICENSE_TEXT_PROVIDED: Returns fully activated offering (status: READY)
202

License offering reactivation initiated. Returned for asynchronous operation:

  • ACTIVATING_AUTOMATIC: Returns task reference for polling

Poll the taskLink to check the status of the reactivation operation.

400

Bad request - invalid status, missing license text, or operation not allowed

401

Unauthorized

404

License pool or offering not found

500

Internal server error

patch/api/v1/fleet/licensing/tmos/pool/regkey/licenses/{poolId}/offerings/{regKey}
/api/v1/fleet/licensing/tmos/pool/regkey/licenses/{poolId}/offerings/{regKey}

Request samples

Content type
application/json
Example
Copy
Expand all Collapse all
{
  • "status": "ACTIVATING_AUTOMATIC"
}

Response samples

Content type
application/json
Example
Copy
Expand all Collapse all
{}

Delete license offering from the pool

Deletes a specific license offering using behavior based on its current status:

  • READY (shown as Active in the UI) or DEACTIVATION_FAILED: initiates asynchronous deactivation. A revocation dossier (with revoke=yes) is sent to the F5 license server and the offering record is deleted. Returns 202 Accepted with a task reference. If revocation fails, only the status changes to DEACTIVATION_FAILED; all other offering fields are preserved and the DELETE can be retried.
  • ACTIVATION_FAILED: deletes the local offering record synchronously without contacting the F5 license server. Returns 204 No Content. If the offering holds an issued license (e.g. failed reactivation), it is revoked asynchronously like READY.
  • ACTIVATING_MANUAL_NEED_LICENSE_TEXT: deletes the local offering record synchronously without contacting the F5 license server. Returns 204 No Content.
  • Any other status: rejects the request with 409 Conflict and leaves the offering unchanged.

If the license is assigned (isAssigned is true) or granted to a member, returns 400 error.

Authorizations:
path Parameters
poolId
required
string <uuid>
Example: 7dd7b971-6eb8-4b9e-995b-1dcb1287d65f

UUID of the license pool

regKey
required
string
Example: U5939-99933-49705-74523-4841009

Registration key of the license offering

Responses

202

READY or DEACTIVATION_FAILED license deactivation initiated (async operation)

204

ACTIVATION_FAILED or ACTIVATING_MANUAL_NEED_LICENSE_TEXT offering deleted locally without contacting the F5 license server

400

Bad request - license has been granted to a device

401

Unauthorized

404

License offering not found

409

Conflict - offering is already being revoked or its current status does not allow deletion

500

Internal server error

delete/api/v1/fleet/licensing/tmos/pool/regkey/licenses/{poolId}/offerings/{regKey}
/api/v1/fleet/licensing/tmos/pool/regkey/licenses/{poolId}/offerings/{regKey}

Response samples

Content type
application/json

Move license offering to another pool

Moves a license offering from one pool to another. The offering must not be assigned to any member. This operation is useful for reorganizing license offerings across different pools.

Authorizations:
path Parameters
poolId
required
string <uuid>
Example: 7dd7b971-6eb8-4b9e-995b-1dcb1287d65f

UUID of the current license pool

regKey
required
string
Example: U5939-99933-49705-74523-4841009

Registration key of the license offering to move

Request Body schema: application/json
targetPoolName
required
string

Name of the target license pool to move the offering to

Responses

200

License offering moved successfully to the new pool

400

Bad request - offering is assigned, same-pool move attempted, or invalid parameters

401

Unauthorized

404

License pool or offering not found

500

Internal server error

post/api/v1/fleet/licensing/tmos/pool/regkey/licenses/{poolId}/offerings/{regKey}/changePool
/api/v1/fleet/licensing/tmos/pool/regkey/licenses/{poolId}/offerings/{regKey}/changePool

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "targetPoolName": "New Pool Name"
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "id": "f1e2d3c4-b5a6-7890-cdef-123456789abc",
  • "regKey": "U5939-99933-49705-74523-4841009",
  • "name": "",
  • "description": "",
  • "status": "READY",
  • "taskId": "d4e5f6a7-b8c9-0123-defg-456789abcdef",
  • "licenseText": "string",
  • "licenseState":
    {
    },
  • "dossier": "1ac56379204d679f59524f2e64300d03b91b4b9ff08225ce0087d91b6cf061227610",
  • "publicKey":
    [
    ],
  • "encryptedPrivateKey":
    [
    ],
  • "message": "You must obtain license text and supply it here",
  • "createdAt": "2026-08-17T06:19:15.673Z",
  • "activatedAt": "2026-08-17T06:19:15.673Z",
  • "isAssigned": false,
  • "assignedMember":
    {}
}

Bulk change pool for license offerings

Synchronously moves multiple registration key offerings from the specified license pool to another target license pool within an atomic database transaction.

Supported selection modes (mutually exclusive):

  1. Specific offerings — provide offerings in the request body to move only those offerings.
  2. All offerings — set query param selectAll=true to move every offering in the pool.

Assignment guard: If any offering targeted for moving is currently assigned to a device, the entire operation is rejected with 409 Conflict. No offerings are moved. Revoke the assignment first before retrying.

Validation rules:

  • offerings (body) and selectAll=true (query) are mutually exclusive.
  • At least one of offerings or selectAll must be provided.
  • targetPoolName is required in the request body and cannot be the current pool.
Authorizations:
path Parameters
poolId
required
string <uuid>
Example: 7dd7b971-6eb8-4b9e-995b-1dcb1287d65f

UUID of the current license pool

query Parameters
selectAll
boolean
Default: false

When true, targets all offerings in the pool to move. Mutually exclusive with offerings in the request body.

Request Body schema: application/json
targetPoolName
required
string

Name of the target license pool to move the offerings to

offerings
Array of strings

List of specific license offerings (registration keys) to move. Mutually exclusive with selectAll query parameter.

Responses

200

License offerings moved successfully to the target pool

400

Bad request - invalid selection, same-pool move attempted, or target pool duplicate

401

Unauthorized

404

Current license pool or target license pool not found

409

Conflict - one or more targeted offerings are assigned to devices

500

Internal server error

post/api/v1/fleet/licensing/tmos/pool/regkey/licenses/{poolId}/offerings/changePool
/api/v1/fleet/licensing/tmos/pool/regkey/licenses/{poolId}/offerings/changePool

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "targetPoolName": "Target Pool Name",
  • "offerings":
    [
    ]
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "total": 2,
  • "items":
    [
    ]
}

Regkey License Offering Members

Operations for managing license offering assignments to BIG-IP devices

Assign license offering to member

Assign a license from the pool to a specific BIG-IP device member

Authorizations:
path Parameters
poolId
required
string <uuid>
Example: 7dd7b971-6eb8-4b9e-995b-1dcb1287d65f

UUID of the license pool

regKey
required
string
Example: U5939-99933-49705-74523-4841009

Registration key of the license offering

Request Body schema: application/json
deviceId
required
string <uuid>

Managed-device ID to assign the license to

Responses

202

License assignment initiated (async operation)

400

Bad request - invalid parameters, no available licenses, or license already granted

401

Unauthorized

404

License pool or offering not found

409

Conflict - device already has a regkey license assignment

500

Internal server error

post/api/v1/fleet/licensing/tmos/pool/regkey/licenses/{poolId}/offerings/{regKey}/members
/api/v1/fleet/licensing/tmos/pool/regkey/licenses/{poolId}/offerings/{regKey}/members

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "deviceId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
}

Response samples

Content type
application/json

Get all license offering members

Retrieves all members (BIG-IP devices) that have been assigned licenses from a specific offering

Authorizations:
path Parameters
poolId
required
string <uuid>
Example: 7dd7b971-6eb8-4b9e-995b-1dcb1287d65f

UUID of the license pool

regKey
required
string
Example: U5939-99933-49705-74523-4841009

Registration key of the license offering

query Parameters
$page
integer >= 1
Default: 1

1-based page number

$pageSize
integer [ 1 .. 500 ]
Default: 50

Number of items per page

Responses

200

List of license members retrieved successfully

401

Unauthorized

404

License pool or offering not found

500

Internal server error

get/api/v1/fleet/licensing/tmos/pool/regkey/licenses/{poolId}/offerings/{regKey}/members
/api/v1/fleet/licensing/tmos/pool/regkey/licenses/{poolId}/offerings/{regKey}/members

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "items":
    [],
  • "totalItems": 0,
  • "pagination":
    {
    }
}

Revoke license from member

Revokes a license assignment from a specific BIG-IP device member and returns the license to the pool. This is a synchronous operation that contacts the device to deactivate the license. If force=true is specified, the license will be revoked from the pool without contacting the device.

Authorizations:
path Parameters
poolId
required
string <uuid>
Example: 7dd7b971-6eb8-4b9e-995b-1dcb1287d65f

UUID of the license pool

regKey
required
string
Example: U5939-99933-49705-74523-4841009

Registration key of the license offering

memberId
required
string <uuid>
Example: a1b2c3d4-e5f6-7890-abcd-ef1234567890

UUID of the license member

query Parameters
force
boolean
Default: false
Example: force=true

If true, skip device reachability check and delete the license assignment from the pool without contacting the BIG-IP device. Useful when the device is unreachable or destroyed.

Responses

204

License successfully revoked from the device

400

Bad request - revocation failed

401

Unauthorized

404

License member not found

500

Internal server error

delete/api/v1/fleet/licensing/tmos/pool/regkey/licenses/{poolId}/offerings/{regKey}/members/{memberId}
/api/v1/fleet/licensing/tmos/pool/regkey/licenses/{poolId}/offerings/{regKey}/members/{memberId}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "code": 400,
  • "message": "The license U5939-99933-49705-74523-4841009 has been granted to a device",
  • "details": "string",
  • "timestamp": "2026-10-29T14:02:59Z"
}

Reactivate license key on member

Reactivates the license on a BIG-IP device member. Device credentials are resolved internally from the managed-device store using the memberId — no credentials need to be supplied in the request body. No request body is required.

Authorizations:
path Parameters
poolId
required
string <uuid>
Example: 7dd7b971-6eb8-4b9e-995b-1dcb1287d65f

UUID of the license pool

regKey
required
string
Example: U5939-99933-49705-74523-4841009

Registration key of the license offering

memberId
required
string <uuid>
Example: a1b2c3d4-e5f6-7890-abcd-ef1234567890

UUID of the license member to reactivate

Responses

202

License member reactivation initiated (async operation)

404

License pool, offering, or member not found

500

Internal server error

patch/api/v1/fleet/licensing/tmos/pool/regkey/licenses/{poolId}/offerings/{regKey}/members/{memberId}
/api/v1/fleet/licensing/tmos/pool/regkey/licenses/{poolId}/offerings/{regKey}/members/{memberId}

Response samples

Content type
application/json

Regkey License Pool

Operations for managing license pools

Fetches all available license pools

Fetches all available license pools in the system.

Authorizations:
query Parameters
$select
string
Example: $select=id

Fields to select in the response

$page
integer >= 1
Default: 1

1-based page number

$pageSize
integer [ 1 .. 500 ]
Default: 50

Number of items per page

Responses

200

returns list of all License pools successfully

400

Bad request - invalid input

401

Unauthorized

500

Internal server error

get/api/v1/fleet/licensing/tmos/pool/regkey/licenses
/api/v1/fleet/licensing/tmos/pool/regkey/licenses

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "items":
    [
    ],
  • "totalItems": 0,
  • "pagination":
    {
    }
}

Create a new license pool

Creates a new license pool that can hold multiple license offerings

Authorizations:
Request Body schema: application/json
name
required
string

Name of the license pool

description
string

Description of the license pool

Responses

201

License pool created successfully

400

Bad request - invalid input

401

Unauthorized

500

Internal server error

post/api/v1/fleet/licensing/tmos/pool/regkey/licenses
/api/v1/fleet/licensing/tmos/pool/regkey/licenses

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "name": "test",
  • "description": ""
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "id": "7dd7b971-6eb8-4b9e-995b-1dcb1287d65f",
  • "name": "test",
  • "description": "",
  • "type": "Registration Key Pool",
  • "baseKey": "U5939-99933-49705-74523-4841009",
  • "status": "ACTIVE",
  • "assignedUnits": 2,
  • "totalUnits": 10,
  • "activationDate": "2026-10-29T14:02:59Z",
  • "expirationDate": "2026-10-29T14:02:59Z",
  • "createdAt": "2026-10-29T14:02:59Z",
  • "updatedAt": "2026-10-29T14:02:59Z"
}

Get license pool by ID

Get license pool by given ID in the path parameter

Authorizations:
path Parameters
poolId
required
string <uuid>
Example: 7dd7b971-6eb8-4b9e-995b-1dcb1287d65f

UUID of the license pool

Responses

200

Returns the License pool successfully

400

Bad request - invalid input

401

Unauthorized

404

License pool not found

500

Internal server error

get/api/v1/fleet/licensing/tmos/pool/regkey/licenses/{poolId}
/api/v1/fleet/licensing/tmos/pool/regkey/licenses/{poolId}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "id": "7dd7b971-6eb8-4b9e-995b-1dcb1287d65f",
  • "name": "test",
  • "description": "",
  • "type": "Registration Key Pool",
  • "baseKey": "U5939-99933-49705-74523-4841009",
  • "status": "ACTIVE",
  • "assignedUnits": 2,
  • "totalUnits": 10,
  • "activationDate": "2026-10-29T14:02:59Z",
  • "expirationDate": "2026-10-29T14:02:59Z",
  • "createdAt": "2026-10-29T14:02:59Z",
  • "updatedAt": "2026-10-29T14:02:59Z"
}

Delete a license pool

Deletes a license pool. If licenses are added and activated but not assigned to any device, deleting the pool will invalidate all associated registration keys. If any license from the pool is already assigned to a member, returns 400 error.

Authorizations:
path Parameters
poolId
required
string <uuid>
Example: 7dd7b971-6eb8-4b9e-995b-1dcb1287d65f

UUID of the license pool

Responses

204

License pool deleted successfully

400

Bad request - pool has outstanding grants

401

Unauthorized

404

License pool not found

500

Internal server error

delete/api/v1/fleet/licensing/tmos/pool/regkey/licenses/{poolId}
/api/v1/fleet/licensing/tmos/pool/regkey/licenses/{poolId}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "code": 400,
  • "message": "Found 1 outstanding grant(s). They must be removed before this license can be deleted."
}

Update a license pool

Updates the name and/or description of a license pool.

Authorizations:
path Parameters
poolId
required
string <uuid>
Example: 7dd7b971-6eb8-4b9e-995b-1dcb1287d65f

UUID of the license pool

Request Body schema: application/json
name
string

Updated name for the license pool

description
string

Updated description for the license pool

Responses

200

License pool updated successfully

400

Bad request - invalid input

401

Unauthorized

404

License pool not found

409

Conflict - a pool with the given name already exists

500

Internal server error

patch/api/v1/fleet/licensing/tmos/pool/regkey/licenses/{poolId}
/api/v1/fleet/licensing/tmos/pool/regkey/licenses/{poolId}

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "name": "my-pool",
  • "description": "My updated pool description"
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "id": "7dd7b971-6eb8-4b9e-995b-1dcb1287d65f",
  • "name": "test",
  • "description": "",
  • "type": "Registration Key Pool",
  • "baseKey": "U5939-99933-49705-74523-4841009",
  • "status": "ACTIVE",
  • "assignedUnits": 2,
  • "totalUnits": 10,
  • "activationDate": "2026-10-29T14:02:59Z",
  • "expirationDate": "2026-10-29T14:02:59Z",
  • "createdAt": "2026-10-29T14:02:59Z",
  • "updatedAt": "2026-10-29T14:02:59Z"
}

Relicense Devices

Operations for managing standalone device re-activation

Get device license re-activation status

Returns the latest persisted license re-activation status for an onboarded device. When manual re-activation is awaiting license text (reactivationStatus: ACTIVATING_MANUAL_NEED_LICENSE_TEXT), this endpoint surfaces the generated dossier so the user can obtain license text from the F5 licensing portal (https://activate.f5.com).

Authorizations:
path Parameters
deviceId
required
string <uuid>

Unique identifier of the onboarded device

Responses

200

Device license status retrieved successfully

401

Unauthorized to retrieve device details

404

Device not found

500

Internal server error

get/api/v1/fleet/licensing/reactivate/devices/{deviceId}
/api/v1/fleet/licensing/reactivate/devices/{deviceId}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "deviceId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
  • "deviceName": "bigip-01.corp.example.com",
  • "reactivationStatus": "ACTIVATING_AUTOMATIC",
  • "deviceLicenseStatus": "ACTIVE",
  • "dossier": "2b93081c7e0f224971c26b91c1ff79...",
  • "baseKey": "A1111-22222-33333-44444-5555555",
  • "licenseServerUrl": "https://activate.f5.com",
  • "licenseType": "Evaluation",
  • "licensedDate": "2026-09-16",
  • "licenseExpirationDate": "2026-10-17",
  • "activeModules":
    [
    ],
  • "optionalModules":
    [
    ],
  • "addOnKeys":
    [
    ],
  • "eulaText": "string",
  • "message": "string",
  • "updatedAt": "2026-10-29T14:02:59Z",
  • "canReactivate": true,
  • "task":
    {
    }
}

Re-activate device license

Starts device license re-activation in either AUTOMATIC or MANUAL mode. - ACTIVATING_AUTOMATIC: Starts an asynchronous re-activation operation that contacts the F5 license server automatically. Returns 202 Accepted with a task reference.

  • ACTIVATING_MANUAL (Phase 1): Queries device keys and generates dossier synchronously on the device without contacting the F5 license server. Returns 200 OK with the generated dossier and reactivationStatus: ACTIVATING_MANUAL_NEED_LICENSE_TEXT.
Authorizations:
path Parameters
deviceId
required
string <uuid>

Unique identifier of the onboarded device

Request Body schema: application/json

Reactivation mode configuration.

mode
required
string
Enum: "ACTIVATING_AUTOMATIC" "ACTIVATING_MANUAL"

Reactivation mode for the device.

Responses

200

Phase 1 manual re-activation initiated successfully. Returns the generated dossier awaiting license text.

202

Automatic re-activation task accepted and running asynchronously

400

Bad request during device license re-activation

401

Unauthorized to perform device license re-activation

404

Device not found during device license re-activation

409

Conflict occurred during device license re-activation

500

Internal server error

post/api/v1/fleet/licensing/reactivate/devices/{deviceId}
/api/v1/fleet/licensing/reactivate/devices/{deviceId}

Request samples

Content type
application/json
Example
Copy
Expand all Collapse all
{
  • "mode": "ACTIVATING_MANUAL"
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "deviceId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
  • "deviceName": "bigip-01.corp.example.com",
  • "reactivationStatus": "ACTIVATING_AUTOMATIC",
  • "deviceLicenseStatus": "ACTIVE",
  • "dossier": "2b93081c7e0f224971c26b91c1ff79...",
  • "baseKey": "A1111-22222-33333-44444-5555555",
  • "licenseServerUrl": "https://activate.f5.com",
  • "licenseType": "Evaluation",
  • "licensedDate": "2026-09-16",
  • "licenseExpirationDate": "2026-10-17",
  • "activeModules":
    [
    ],
  • "optionalModules":
    [
    ],
  • "addOnKeys":
    [
    ],
  • "eulaText": "string",
  • "message": "string",
  • "updatedAt": "2026-10-29T14:02:59Z",
  • "canReactivate": true,
  • "task":
    {
    }
}

Continue device license re-activation

Continues an existing re-activation run: - Phase 2 (Manual License Text Flow): When a manual re-activation is waiting for license text (reactivationStatus: ACTIVATING_MANUAL_NEED_LICENSE_TEXT), call this endpoint with reactivationStatus: ACTIVATING_MANUAL_LICENSE_TEXT_PROVIDED and the licenseText obtained from the F5 licensing portal. Fleet Manager installs the license text onto the device.

  • Automatic EULA Flow: When an automatic re-activation pauses waiting for EULA acceptance (reactivationStatus: ACTIVATING_AUTOMATIC_NEED_EULA_ACCEPT), call this endpoint with reactivationStatus: EULA_ACCEPTED and the matching eulaText to resume.
Authorizations:
path Parameters
deviceId
required
string <uuid>

Unique identifier of the onboarded device

Request Body schema: application/json
reactivationStatus
required
string
Enum: "ACTIVATING_MANUAL_LICENSE_TEXT_PROVIDED" "EULA_ACCEPTED"

Flow continuation discriminator.

licenseText
string

The license text obtained from the F5 licensing portal (required when reactivationStatus is ACTIVATING_MANUAL_LICENSE_TEXT_PROVIDED).

eulaText
string

The EULA text previously returned by this device's re-activation (required when reactivationStatus is EULA_ACCEPTED).

Responses

200

Re-activation task running asynchronously

400

Bad request during device license re-activation

401

Unauthorized to perform device license re-activation

404

Device not found during device license re-activation

409

Conflict occurred during device license re-activation

500

Internal server error

patch/api/v1/fleet/licensing/reactivate/devices/{deviceId}
/api/v1/fleet/licensing/reactivate/devices/{deviceId}

Request samples

Content type
application/json
Example
Copy
Expand all Collapse all
{
  • "reactivationStatus": "ACTIVATING_MANUAL_LICENSE_TEXT_PROVIDED",
  • "licenseText": "-----BEGIN CERTIFICATE-----\nMIID5TCCAs2gAwIBAgIJAPk3R4qG...\n-----END CERTIFICATE-----"
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "taskId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
  • "taskUrl": "/api/v1/fleet/licensing/reactivate/tasks?taskId=d4e5f6a7-b8c9-4123-8abc-456789abcdef"
}

Refresh device metadata and licensing information

Connects live to the device, refreshes its licensing and system inventory, updates the database cache, and returns the refreshed device.

Authorizations:
path Parameters
deviceId
required
string <uuid>

Unique identifier of the onboarded device

Responses

200

Device licensing metadata successfully refreshed

400

Bad request

401

Unauthorized

404

Device not found

500

Internal server error

502

Device is unreachable

post/api/v1/fleet/licensing/reactivate/devices/{deviceId}/refresh
/api/v1/fleet/licensing/reactivate/devices/{deviceId}/refresh

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "id": "string",
  • "device_type": "BIGIP",
  • "device_name": "bigip/bigip.com",
  • "endpoint": "https://10.145.134.193",
  • "data_center_id": "string",
  • "current_version": "21.1.0",
  • "current_build": "0.0.38",
  • "edition": "Final",
  • "platform": "Z100",
  • "marketing_name": "BIG-IP Virtual Edition",
  • "chassis_serial": "4229b84e-c835-4820-535fedc7afcc",
  • "ha_state": "STANDALONE",
  • "sync_status": "Standalone",
  • "disk_available_gb": 440.5,
  • "active_volume": "HD1.1",
  • "inactive_volumes":
    [
    ],
  • "is_payg_license": false,
  • "last_refresh_at": "2026-10-29T14:02:59Z",
  • "license_check_date": "2026-04-15",
  • "service_check_date": "2026-09-15",
  • "license_type": "Evaluation",
  • "licensed_on": "2026-09-12",
  • "license_end_date": "2026-09-12"
}

Relicense Execution Devices

Operations for inspecting per-device relicense execution state

List device progress for a relicense execution

Returns a paginated list of per-device progress and ordered step history for a relicense execution. Aggregate status counts live on the parent execution (GET …/executions/{executionId}).

Authorizations:
path Parameters
jobId
required
string <uuid>

UUID of the relicense job

executionId
required
string <uuid>

UUID of the relicense execution

query Parameters
status
Array of strings
Items Enum: "PENDING" "RUNNING" "AWAITING_USER" "COMPLETED" "FAILED" "CANCELLED"

Comma-separated device execution statuses to include

$page
integer >= 1
Default: 1

Page number (1-based)

$pageSize
integer [ 1 .. 200 ]
Default: 50

Number of devices per page (1-200)

Responses

200

Complete execution device progress

401

Unauthorized

404

Execution not found

500

Internal server error

get/api/v1/fleet/licensing/reactivate/jobs/{jobId}/executions/{executionId}/devices
/api/v1/fleet/licensing/reactivate/jobs/{jobId}/executions/{executionId}/devices

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "devices":
    [
    ],
  • "totalItems": 0,
  • "pagination":
    {
    }
}

Get device state in a relicense execution

Returns one per-device state row for a relicense execution.

Authorizations:
path Parameters
jobId
required
string <uuid>

UUID of the relicense job

executionId
required
string <uuid>

UUID of the relicense execution

deviceId
required
string <uuid>

UUID of the device in the execution

Responses

200

Execution device state retrieved successfully

401

Unauthorized

404

Execution device state not found

500

Internal server error

get/api/v1/fleet/licensing/reactivate/jobs/{jobId}/executions/{executionId}/devices/{deviceId}
/api/v1/fleet/licensing/reactivate/jobs/{jobId}/executions/{executionId}/devices/{deviceId}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "deviceId": "string",
  • "deviceName": "string",
  • "deviceType": "BIGIP",
  • "haRole": "string",
  • "status": "PENDING",
  • "currentStep": "Validation",
  • "progressPct": 0,
  • "retryCount": 0,
  • "lastError": "string",
  • "startedAt": "2026-10-29T14:02:59Z",
  • "completedAt": "2026-10-29T14:02:59Z",
  • "steps":
    [
    ]
}

Get EULA text for a device paused in a relicense execution

Returns the EULA text the license server requires the user to accept before re-activation can continue. Only call this when the device's status is AWAITING_USER and currentStep is EULA_ACCEPTANCE (visible on GET .../executions/{executionId}/devices).

This is Step 6 of the end-to-end relicense workflow. The end-to-end sequence (Steps 1–7) is documented in POST /licensing/reactivate/validate.

Pass the returned eulaText verbatim to PATCH .../devices/{deviceId}/eula to accept the EULA and resume processing. Pass acceptAll: true in the PATCH body to unblock every device in the execution awaiting EULA in a single call.

Authorizations:
path Parameters
jobId
required
string <uuid>

UUID of the relicense job

executionId
required
string <uuid>

UUID of the relicense execution

deviceId
required
string <uuid>

UUID of the device in the execution whose EULA is required

Responses

200

EULA text retrieved successfully

401

Unauthorized

404

Execution or device not found

409

Conflict — device is not currently awaiting EULA acceptance. Check that the device's status is AWAITING_USER and currentStep is EULA_ACCEPTANCE before calling this endpoint.

500

Internal server error

get/api/v1/fleet/licensing/reactivate/jobs/{jobId}/executions/{executionId}/devices/{deviceId}/eula
/api/v1/fleet/licensing/reactivate/jobs/{jobId}/executions/{executionId}/devices/{deviceId}/eula

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "deviceId": "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa",
  • "executionId": "eeeeeeee-eeee-eeee-eeee-eeeeeeeeeeee",
  • "eulaAcceptanceRequired": true,
  • "eulaText": "F5 Networks, Inc. End User License Agreement\n\nIMPORTANT — READ CAREFULLY: This End User License Agreement\n(\"Agreement\") is a legal agreement between you (either an\nindividual or a single entity, \"Licensee\") and F5 Networks,\nInc. (\"F5\") for the F5 software product(s) identified above,\nwhich include computer software and may include associated\nmedia, printed materials, and online or electronic\ndocumentation (collectively \"Software\").\n\nBy installing, copying, or otherwise using the Software, you\nagree to be bound by the terms of this Agreement. If you do\nnot agree to the terms of this Agreement, do not install or\nuse the Software.\n\n[...full EULA text from activate.f5.com...]\n"
}

Accept EULA for a device (or all awaiting devices) in a relicense execution

Accepts the EULA for a device paused at the EULA_ACCEPTANCE step (status=AWAITING_USER, currentStep=EULA_ACCEPTANCE), resuming its processing within the relicense execution.

This is Step 7 of the end-to-end relicense workflow. The end-to-end sequence (Steps 1–7) is documented in POST /licensing/reactivate/validate.

acceptAll Effect
false (default) Only the {deviceId} in the URL is unblocked
true Every device in this execution currently at EULA_ACCEPTANCE is unblocked in one call

The eulaText field must match exactly the text returned by GET .../devices/{deviceId}/eula — this confirms the operator read the terms. A mismatch returns 400.

A 409 is returned if the device is not currently in status=AWAITING_USER / currentStep=EULA_ACCEPTANCE.

Authorizations:
path Parameters
jobId
required
string <uuid>

UUID of the relicense job

executionId
required
string <uuid>

UUID of the relicense execution

deviceId
required
string <uuid>

UUID of the device whose EULA is being accepted

Request Body schema: application/json
eulaText
required
string

The EULA text previously returned by GET .../devices/{deviceId}/eula. Must match exactly to confirm the user has read and accepted the terms.

acceptAll
boolean
Default: false

When true, accept the EULA for all devices in this execution that are currently awaiting EULA acceptance (status=AWAITING_USER, currentStep=EULA_ACCEPTANCE). When false (default), only the device identified by {deviceId} in the path is unblocked.

Responses

200

EULA accepted. The addressed device (or all awaiting devices when acceptAll=true) is unblocked and execution resumed. Returns a single acknowledgement object for the device in the URL path.

400

Bad request — eulaText is missing or does not match the EULA text on record for this device. Fetch the current EULA text via GET .../devices/{deviceId}/eula and retry with the exact value.

401

Unauthorized

404

Execution or device state not found

409

Conflict — device is not currently awaiting EULA acceptance. The device's status must be AWAITING_USER and currentStep must be EULA_ACCEPTANCE. Verify device state via GET .../executions/{executionId}/devices/{deviceId}.

500

Internal server error

patch/api/v1/fleet/licensing/reactivate/jobs/{jobId}/executions/{executionId}/devices/{deviceId}/eula
/api/v1/fleet/licensing/reactivate/jobs/{jobId}/executions/{executionId}/devices/{deviceId}/eula

Request samples

Content type
application/json
Example
Copy
Expand all Collapse all
{
  • "eulaText": "F5 Networks, Inc. End User License Agreement\n\nIMPORTANT — READ CAREFULLY: This End User License Agreement\n(\"Agreement\") is a legal agreement between you (either an\nindividual or a single entity, \"Licensee\") and F5 Networks,\nInc. (\"F5\") for the F5 software product(s) identified above,\nwhich include computer software and may include associated\nmedia, printed materials, and online or electronic\ndocumentation (collectively \"Software\").\n\nBy installing, copying, or otherwise using the Software, you\nagree to be bound by the terms of this Agreement. If you do\nnot agree to the terms of this Agreement, do not install or\nuse the Software.\n\n[...full EULA text from activate.f5.com...]\n",
  • "acceptAll": false
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "accepted": true,
  • "autoAcceptRemainingDevices": false,
  • "deviceId": "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa",
  • "executionId": "bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb",
  • "message": "license reactivation EULA accepted"
}

Relicense Executions

Operations for activating and controlling relicense job executions

Activate a relicense job

Creates a new execution for a DRAFT or READY relicense job and starts batch processing.

Authorizations:
path Parameters
jobId
required
string <uuid>

UUID of the relicense job

Request Body schema: application/json
changeRequest
string Nullable

Optional change-control ticket reference for this execution

Responses

202

Relicense execution accepted

400

Bad request - invalid input

401

Unauthorized

404

Job not found

409

Conflict - job is not activatable or already has an active execution

500

Internal server error

post/api/v1/fleet/licensing/reactivate/jobs/{jobId}/activate
/api/v1/fleet/licensing/reactivate/jobs/{jobId}/activate

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "changeRequest": "CHG0012345"
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "id": "string",
  • "jobId": "string",
  • "jobName": "string",
  • "jobDescription": "string",
  • "trigger": "USER",
  • "deviceType": "BIGIP",
  • "batchSize": 20,
  • "status": "RUNNING",
  • "pauseReason": "MANUAL",
  • "totalDevices": 0,
  • "currentBatch": 0,
  • "configSnapshot": { },
  • "changeRequest": "string",
  • "createdBy": "string",
  • "modifiedBy": "string",
  • "startedAt": "2026-10-29T14:02:59Z",
  • "completedAt": "2026-10-29T14:02:59Z",
  • "createdAt": "2026-10-29T14:02:59Z",
  • "updatedAt": "2026-10-29T14:02:59Z",
  • "durationMs": 0,
  • "activityCount": 0,
  • "retryCount": 0,
  • "instanceProgress":
    {
    }
}

List relicense job executions

Returns a paginated list of execution records for a relicense job.

Authorizations:
path Parameters
jobId
required
string <uuid>

UUID of the relicense job

query Parameters
$page
integer >= 1
Default: 1

Page number (1-based)

$pageSize
integer [ 1 .. 200 ]
Default: 50

Number of items per page (1-200)

Responses

200

Paginated list of relicense executions

401

Unauthorized

404

Job not found

500

Internal server error

get/api/v1/fleet/licensing/reactivate/jobs/{jobId}/executions
/api/v1/fleet/licensing/reactivate/jobs/{jobId}/executions

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "items":
    [
    ],
  • "pagination":
    {
    }
}

Get a relicense execution

Returns one execution record with job metadata and status. Per-device detail and status counts are available via GET …/executions/{executionId}/devices.

Authorizations:
path Parameters
jobId
required
string <uuid>

UUID of the relicense job

executionId
required
string <uuid>

UUID of the relicense execution

Responses

200

Relicense execution retrieved successfully

401

Unauthorized

404

Execution not found

500

Internal server error

get/api/v1/fleet/licensing/reactivate/jobs/{jobId}/executions/{executionId}
/api/v1/fleet/licensing/reactivate/jobs/{jobId}/executions/{executionId}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "id": "string",
  • "jobId": "string",
  • "jobName": "string",
  • "jobDescription": "string",
  • "trigger": "USER",
  • "deviceType": "BIGIP",
  • "batchSize": 20,
  • "status": "RUNNING",
  • "pauseReason": "MANUAL",
  • "totalDevices": 0,
  • "currentBatch": 0,
  • "configSnapshot": { },
  • "changeRequest": "string",
  • "createdBy": "string",
  • "modifiedBy": "string",
  • "startedAt": "2026-10-29T14:02:59Z",
  • "completedAt": "2026-10-29T14:02:59Z",
  • "createdAt": "2026-10-29T14:02:59Z",
  • "updatedAt": "2026-10-29T14:02:59Z",
  • "durationMs": 0,
  • "activityCount": 0,
  • "retryCount": 0,
  • "instanceProgress":
    {
    }
}

Relicense Jobs

Operations for managing relicense jobs

List relicense jobs

Returns a paginated list of relicense jobs, optionally filtered by a search term.

Authorizations:
query Parameters
$page
integer >= 1
Default: 1

Page number (1-based)

$pageSize
integer [ 1 .. 200 ]
Default: 50

Number of items per page (1-200)

$search
string

Free-text search across job name and description

status
string
Enum: "DRAFT" "READY" "RUNNING" "PAUSING" "PAUSED" "CANCELLING" "COMPLETED" "FAILED"

Filter by job lifecycle status

Responses

200

Paginated list of relicense jobs

401

Unauthorized

500

Internal server error

get/api/v1/fleet/licensing/reactivate/jobs
/api/v1/fleet/licensing/reactivate/jobs

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "items":
    [
    ],
  • "pagination":
    {
    }
}

Create a relicense job

Creates a new relicense job in DRAFT status.

Authorizations:
Request Body schema: application/json
name
required
string

Human-readable name for the relicense job

description
string

Optional description

enabled
boolean

Whether the corresponding workflow job is enabled. Defaults to true when omitted.

config
required
object (RelicenseJobConfig)

Responses

201

Relicense job created successfully

400

Bad request - invalid input

401

Unauthorized

409

Conflict - duplicate job name

500

Internal server error

post/api/v1/fleet/licensing/reactivate/jobs
/api/v1/fleet/licensing/reactivate/jobs

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "name": "Q1 Relicense Batch",
  • "description": "",
  • "enabled": true,
  • "config":
    {
    }
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "id": "string",
  • "workflowJobId": "string",
  • "workflowId": "string",
  • "type": "RELICENSE",
  • "name": "string",
  • "description": "string",
  • "enabled": true,
  • "status": "DRAFT",
  • "jobUrl": "string",
  • "config":
    {
    },
  • "createdBy": "string",
  • "modifiedBy": "string",
  • "createdAt": "2026-10-29T14:02:59Z",
  • "updatedAt": "2026-10-29T14:02:59Z"
}

Get a relicense job by ID

Authorizations:
path Parameters
jobId
required
string <uuid>

UUID of the relicense job

Responses

200

Relicense job retrieved successfully

401

Unauthorized

404

Job not found

500

Internal server error

get/api/v1/fleet/licensing/reactivate/jobs/{jobId}
/api/v1/fleet/licensing/reactivate/jobs/{jobId}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "id": "string",
  • "workflowJobId": "string",
  • "workflowId": "string",
  • "type": "RELICENSE",
  • "name": "string",
  • "description": "string",
  • "enabled": true,
  • "status": "DRAFT",
  • "jobUrl": "string",
  • "config":
    {
    },
  • "createdBy": "string",
  • "modifiedBy": "string",
  • "createdAt": "2026-10-29T14:02:59Z",
  • "updatedAt": "2026-10-29T14:02:59Z"
}

Update a relicense job

Partially updates a relicense job. Only allowed when status is DRAFT or READY.

Authorizations:
path Parameters
jobId
required
string <uuid>

UUID of the relicense job

Request Body schema: application/json
name
string

New name for the relicense job

description
string

New description for the relicense job

config
object (RelicenseJobConfig)
enabled
boolean

Whether the corresponding workflow job is enabled

Responses

200

Relicense job updated successfully

400

Bad request - invalid input

401

Unauthorized

404

Job not found

409

Conflict - job is not editable in its current status

500

Internal server error

patch/api/v1/fleet/licensing/reactivate/jobs/{jobId}
/api/v1/fleet/licensing/reactivate/jobs/{jobId}

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "name": "string",
  • "description": "string",
  • "config":
    {
    },
  • "enabled": true
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "id": "string",
  • "workflowJobId": "string",
  • "workflowId": "string",
  • "type": "RELICENSE",
  • "name": "string",
  • "description": "string",
  • "enabled": true,
  • "status": "DRAFT",
  • "jobUrl": "string",
  • "config":
    {
    },
  • "createdBy": "string",
  • "modifiedBy": "string",
  • "createdAt": "2026-10-29T14:02:59Z",
  • "updatedAt": "2026-10-29T14:02:59Z"
}

Delete a relicense job

Deletes a relicense job. Not allowed when status is RUNNING.

Authorizations:
path Parameters
jobId
required
string <uuid>

UUID of the relicense job

Responses

204

Relicense job deleted successfully

401

Unauthorized

404

Job not found

409

Conflict - cannot delete a RUNNING job

500

Internal server error

delete/api/v1/fleet/licensing/reactivate/jobs/{jobId}
/api/v1/fleet/licensing/reactivate/jobs/{jobId}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "code": 400,
  • "message": "Bad request",
  • "details": "string",
  • "timestamp": "2026-10-29T14:02:59Z"
}

List devices associated with a relicense job

Returns a paginated list of devices configured for a specific relicense job, enriched with live licensing details.

Authorizations:
path Parameters
jobId
required
string <uuid>
Example: 3fa85f64-5717-4562-b3fc-2c963f66afa6

UUID of the relicense job

query Parameters
$page
integer >= 1
Default: 1
Example: $page=1

Page number (1-based, default 1)

$pageSize
integer [ 1 .. 200 ]
Default: 50
Example: $pageSize=50

Number of items per page (1-200, default 50)

Responses

200

Paginated list of devices configured in the relicense job

400

Bad request (invalid UUID or invalid pagination parameters)

401

Unauthorized

404

Job not found

500

Internal server error

get/api/v1/fleet/licensing/reactivate/jobs/{jobId}/devices
/api/v1/fleet/licensing/reactivate/jobs/{jobId}/devices

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "items":
    [
    ],
  • "totalItems": 125,
  • "pagination":
    {
    }
}

List all devices eligible for license re-activation

Returns a paginated list of onboarded devices that can undergo license reactivation filtered by device type (BIGIP or F5OS), enriched with live licensing information.

Authorizations:
query Parameters
type
required
string
Enum: "BIGIP" "F5OS"
Example: type=BIGIP

Device type filter

$page
integer >= 1
Default: 1
Example: $page=1

Page number (1-based, default 1)

$pageSize
integer [ 1 .. 200 ]
Default: 50
Example: $pageSize=50

Number of items per page (1-200, default 50)

Responses

200

Paginated list of devices eligible for license re-activation

400

Bad request (invalid device type or invalid pagination parameters)

401

Unauthorized

500

Internal server error

get/api/v1/fleet/licensing/reactivate/jobs/devices
/api/v1/fleet/licensing/reactivate/jobs/devices

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "items":
    [
    ],
  • "totalItems": 125,
  • "pagination":
    {
    }
}

Pause a relicense job

Requests the active execution for the job to pause after its current batch completes.

Authorizations:
path Parameters
jobId
required
string <uuid>

UUID of the relicense job

Responses

200

Pause request accepted

401

Unauthorized

404

Job or active execution not found

409

Conflict - job has no running execution

500

Internal server error

post/api/v1/fleet/licensing/reactivate/jobs/{jobId}/pause
/api/v1/fleet/licensing/reactivate/jobs/{jobId}/pause

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "jobId": "string",
  • "executionId": "string",
  • "message": "string"
}

Resume a relicense job

Resumes the active paused execution for the job.

Authorizations:
path Parameters
jobId
required
string <uuid>

UUID of the relicense job

Responses

200

Resume request accepted

401

Unauthorized

404

Job or active execution not found

409

Conflict - job has no paused execution

500

Internal server error

post/api/v1/fleet/licensing/reactivate/jobs/{jobId}/resume
/api/v1/fleet/licensing/reactivate/jobs/{jobId}/resume

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "jobId": "string",
  • "executionId": "string",
  • "message": "string"
}

Cancel a relicense job

Requests cancellation of the active execution for the job.

Authorizations:
path Parameters
jobId
required
string <uuid>

UUID of the relicense job

Responses

200

Cancel request accepted

401

Unauthorized

404

Job or active execution not found

409

Conflict - job has no cancellable execution

500

Internal server error

post/api/v1/fleet/licensing/reactivate/jobs/{jobId}/cancel
/api/v1/fleet/licensing/reactivate/jobs/{jobId}/cancel

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "jobId": "string",
  • "executionId": "string",
  • "message": "string"
}

Relicense Tasks

Returns the status of an asynchronous device re-activation task

Returns the status of an asynchronous device re-activation task.

Authorizations:
query Parameters
taskId
required
string <uuid>

Unique identifier returned when re-activation is accepted

Responses

200

Task status retrieved successfully

400

Bad request during automatic device license re-activation

401

Unauthorized to perform automatic device license re-activation

404

Automatic device license re-activation task not found

500

Internal server error

get/api/v1/fleet/licensing/reactivate/tasks
/api/v1/fleet/licensing/reactivate/tasks

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "taskId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
  • "deviceId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
  • "reactivationStatus": "ACTIVATING_AUTOMATIC",
  • "status": "PENDING",
  • "deviceLicenseStatus": "ACTIVE",
  • "message": "Device dossier generated. Paste this dossier into activate.f5.com to obtain license text, then submit via PATCH.",
  • "dossier": "string",
  • "eulaText": "string",
  • "errorMessage": "string",
  • "createdAt": "2026-09-09T09:24:08.334Z",
  • "updatedAt": "2026-09-09T09:24:08.334Z"
}

Relicense Validation

Pre-flight readiness checks for relicensing. Run before activating a job to confirm every target device is eligible. Returns immediately (202) with a validation_run_id; poll GET /licensing/reactivate/validate/{runId} until status is no longer PENDING or RUNNING.

Trigger async pre-flight validation for a list of devices

Runs the six relicense readiness checks against every supplied device in parallel. No job needs to exist — call this before creating or activating a relicense job.

Returns 202 Accepted immediately with a validation_run_id. Poll GET /licensing/reactivate/validate/{runId} until status is no longer PENDING or RUNNING.

Checks (all HARD — any failure blocks activation)

Check name What it verifies
License Server Reachable F5 license server (activate.f5.com) is reachable from the management plane
Instance Supported Device platform and software version are eligible for relicensing via F5 Insights
Instance Reachable Device management endpoint is reachable
License Available A base license is currently installed on the device
License Not Managed by F5 Insight BIG-IP license is not currently managed by F5 Insights
License Not Managed by BIG-IQ BIG-IP license is not currently managed by BIG-IQ

Re-triggering with the same inputs creates a fresh run (a new validation_run_id is returned each time).


End-to-end relicense workflow

The complete flow from readiness check through EULA acceptance is shown below. All UUIDs are consistent across examples in this spec.

Step 1 — Validate devices (this endpoint)

POST /licensing/reactivate/validate
{ "deviceIds": ["aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa",
                  "bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb"],
  "deviceType": "BIGIP" }
→ 202  { "validation_run_id": "d4e5f6a7-0000-0000-0000-000000000001" }

Step 2 — Poll until all checks complete

GET /licensing/reactivate/validate/d4e5f6a7-0000-0000-0000-000000000001
→ 200  { "status": "PASSED", "can_proceed": true, ... }

If can_proceed is false fix the failing devices and re-trigger.

Step 3 — Create a relicense job

POST /licensing/reactivate/jobs
{ "name": "Q3 Relicense",
  "config": { "deviceType": "BIGIP",
              "deviceIds": ["aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa",
                            "bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb"],
              "batchSize": 2 } }
→ 201  { "id": "11111111-1111-1111-1111-111111111111", "status": "DRAFT" }

Step 4 — Activate the job (creates an execution)

POST /licensing/reactivate/jobs/11111111-1111-1111-1111-111111111111/activate
→ 202  { "id": "eeeeeeee-eeee-eeee-eeee-eeeeeeeeeeee",
          "status": "RUNNING", "totalDevices": 2, ... }

Step 5 — Monitor per-device progress

GET /licensing/reactivate/jobs/11111111-1111-1111-1111-111111111111
    /executions/eeeeeeee-eeee-eeee-eeee-eeeeeeeeeeee/devices
→ 200  { "devices": [
    { "deviceId": "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa",
      "status": "AWAITING_USER", "currentStep": "EULA_ACCEPTANCE" },
    { "deviceId": "bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb",
      "status": "COMPLETED" }
  ]}

When a device shows status=AWAITING_USER and currentStep=EULA_ACCEPTANCE the license server returned a EULA the user must explicitly accept before processing can continue — proceed to Step 6.

Step 6 — Fetch the EULA text for the blocked device

GET /licensing/reactivate/jobs/11111111-1111-1111-1111-111111111111
    /executions/eeeeeeee-eeee-eeee-eeee-eeeeeeeeeeee
    /devices/aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa/eula
→ 200  { "deviceId": "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa",
          "executionId": "eeeeeeee-eeee-eeee-eeee-eeeeeeeeeeee",
          "eulaText": "F5 Networks EULA ...",
          "eulaAcceptanceRequired": true }

Step 7a — Accept EULA for this device only

PATCH /licensing/reactivate/jobs/11111111-1111-1111-1111-111111111111
      /executions/eeeeeeee-eeee-eeee-eeee-eeeeeeeeeeee
      /devices/aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa/eula
{ "eulaText": "F5 Networks EULA ...", "acceptAll": false }
→ 200  { "deviceId": "aaaaaaaa-...", "status": "RUNNING",
          "currentStep": "REACTIVATION_RESULT", ... }

Step 7b — OR accept EULA for ALL awaiting devices at once

PATCH /licensing/reactivate/jobs/11111111-1111-1111-1111-111111111111
      /executions/eeeeeeee-eeee-eeee-eeee-eeeeeeeeeeee
      /devices/aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa/eula
{ "eulaText": "F5 Networks EULA ...", "acceptAll": true }
→ 200  { "deviceId": "aaaaaaaa-...", "status": "RUNNING", ... }

With acceptAll: true every device in the execution currently paused at EULA_ACCEPTANCE is unblocked in a single call.

Authorizations:
Request Body schema: application/json
deviceIds
required
Array of strings <uuid> non-empty

UUIDs of the devices to run pre-flight checks against.

deviceType
required
string
Enum: "BIGIP" "F5OS"

Device family supplied in the request body. It must be BIGIP or F5OS and determines which inventory and readiness checks are used; it is not inferred from device inventory.

Responses

202

Validation triggered — poll GET /licensing/reactivate/validate/{runId}

400

Bad request — deviceIds missing or empty

401

Unauthorized

500

Internal server error

post/api/v1/fleet/licensing/reactivate/validate
/api/v1/fleet/licensing/reactivate/validate

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "deviceIds":
    [
    ],
  • "deviceType": "BIGIP"
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "validation_run_id": "d4e5f6a7-0000-0000-0000-000000000001",
  • "message": "validation triggered"
}

List validation devices for a run

Authorizations:
path Parameters
runId
required
string <uuid>
query Parameters
status
Array of strings
Items Enum: "PENDING" "PASSED" "FAILED"
$page
integer >= 1
Default: 1
$pageSize
integer [ 1 .. 200 ]
Default: 50

Responses

200

Paginated validation device results

400

Invalid status or pagination parameter

404

Validation run not found

get/api/v1/fleet/licensing/reactivate/validate/{runId}/devices
/api/v1/fleet/licensing/reactivate/validate/{runId}/devices

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "devices":
    [
    ],
  • "totalItems": 0,
  • "pagination":
    {
    }
}

Poll relicense pre-flight validation results

Returns the aggregated results for a validation run. Poll until status is no longer PENDING or RUNNING. can_proceed: true means every device passed all four HARD checks and the job can be safely activated. See the end-to-end workflow in POST /licensing/reactivate/validate for the full sequence including EULA acceptance (Steps 1–7).

Authorizations:
path Parameters
runId
required
string <uuid>

UUID returned by POST /licensing/reactivate/validate

Responses

200

Validation run results

401

Unauthorized

404

Validation run not found

500

Internal server error

get/api/v1/fleet/licensing/reactivate/validate/{runId}
/api/v1/fleet/licensing/reactivate/validate/{runId}

Response samples

Content type
application/json
Example

A mid-run snapshot. can_proceed is always false — do not activate yet.

device-01 (RUNNING, current_step: CHECKING_DEVICE_SUPPORTED): Two checks are already done and appear in check_results. The management checks have not run yet so they are absent from check_results — it will appear on the next poll. device-02 (PENDING, current_step: PENDING): Not started yet — check_results is empty and started_at is null.

current_step values while running: PENDING → CHECKING_LICENSE_SERVER → CHECKING_DEVICE_SUPPORTED → CHECKING_LICENSE_NOT_MANAGED → COMPLETE

Copy
Expand all Collapse all
{
  • "validation_run_id": "d4e5f6a7-0000-0000-0000-000000000001",
  • "status": "RUNNING",
  • "device_count": 2,
  • "pass_count": 0,
  • "fail_count": 0,
  • "error_count": 0,
  • "can_proceed": false,
  • "triggered_at": "2026-09-18T10:00:00Z",
  • "completed_at": null,
  • "devices":
    [
    ]
}

RestoreReadiness

List restore readiness check runs

Returns a paginated list of restore readiness check runs with rollup summaries. Use GET /restore/readiness/{runId} for the detailed per-device breakdown.

query Parameters
page
integer >= 1
Default: 1
page_size
integer [ 1 .. 500 ]
Default: 20
status
string
Enum: "PENDING" "RUNNING" "PASSED" "WARNING" "FAILED" "ERROR"

Filter runs by rolled-up status.

Responses

200

Paginated list of restore readiness runs

401

Authentication required

500

Internal server error

get/api/v1/fleet/backup-restore/restore/readiness
/api/v1/fleet/backup-restore/restore/readiness

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "data":
    [
    ],
  • "pagination":
    {
    }
}

Trigger async restore readiness checks for target devices

Runs readiness checks against the specified target devices before restore. This validates backup integrity, device reachability, backup-to-device compatibility, and (for encrypted backups) passphrase resolution.

Request Body schema: application/json
context
required
object

Shared context for all checks.

passphrase
string Nullable

Passphrase compared with the value stored for the backup. Required for encrypted backups to pass passphrase verification; missing or incorrect values report FAIL. Ignored for unencrypted backups.

checks
Array of strings Nullable
Items Enum: "backup_integrity" "target_device_reachability" "backup_compatibility" "backup_passphrase_verification"

List of check types to run. If omitted, defaults to all checks.

Responses

202

Readiness checks triggered — poll GET /restore/readiness/{runId} for results

400

Invalid request

401

Authentication required

404

Resource not found

500

Internal server error

post/api/v1/fleet/backup-restore/restore/readiness
/api/v1/fleet/backup-restore/restore/readiness

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "context":
    {
    },
  • "passphrase": "string",
  • "checks":
    [
    ]
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "run_id": "string",
  • "message": "string"
}

Get results for a restore readiness check run

Returns persisted per-device restore readiness results for a run. Poll until status is no longer PENDING or RUNNING.

path Parameters
runId
required
string <uuid>

The restore readiness run ID returned by POST /restore/readiness

Responses

200

Restore readiness check results

401

Authentication required

404

Resource not found

500

Internal server error

get/api/v1/fleet/backup-restore/restore/readiness/{runId}
/api/v1/fleet/backup-restore/restore/readiness/{runId}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "run_id": "string",
  • "status": "PENDING",
  • "device_count": 0,
  • "pass_count": 0,
  • "warn_count": 0,
  • "fail_count": 0,
  • "error_count": 0,
  • "devices":
    [
    ],
  • "triggered_at": "2026-10-29T14:02:59Z",
  • "completed_at": "2026-10-29T14:02:59Z"
}

Schedule

List backup schedules

Returns all configured backup schedules. Multiple schedules are allowed (one per backup type).

Responses

200

Configured schedules

500

Failed to list backup schedules

503

Scheduler is unavailable

get/api/system/backup-schedules
/api/system/backup-schedules

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "success": true,
  • "data":
    [
    ]
}

Create backup schedule

Create a named backup schedule. Multiple schedules allowed. Duplicate names rejected.

Request Body schema: application/json
name
required
string

Schedule name (e.g., "daily-config", "weekly-full")

cron
required
string

Standard 5-field cron expression

backup_type
string
Default: "full"
Enum: "full" "config"
storage_target
string
passphrase
required
string >= 12 characters

Encryption passphrase (stored in Vault). Must be at least 12 characters with uppercase, lowercase, digit, and special character. Max 2 consecutive identical characters.

Responses

201

Schedule created

400

Invalid request, e.g. a full backup schedule without a remote storage target

409

Schedule already exists

500

Failed to create the backup schedule

503

Scheduler or Vault is unavailable

post/api/system/backup-schedules
/api/system/backup-schedules

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "name": "string",
  • "cron": "0 2 * * *",
  • "backup_type": "full",
  • "storage_target": "string",
  • "passphrase": "stringstring"
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "success": true,
  • "data":
    {
    }
}

Get backup schedule by ID

path Parameters
id
required
string <uuid>

Responses

200

Schedule details

404

Schedule not found

503

Scheduler is unavailable

get/api/system/backup-schedules/{id}
/api/system/backup-schedules/{id}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "success": true,
  • "data":
    {
    }
}

Update backup schedule

path Parameters
id
required
string <uuid>
Request Body schema: application/json

Responses

200

Schedule updated

400

Invalid request

404

Schedule not found

409

Conflicting schedule for this backup type

500

Failed to update the backup schedule

503

Scheduler is unavailable

put/api/system/backup-schedules/{id}
/api/system/backup-schedules/{id}

Request samples

Content type
application/json
Copy
Expand all Collapse all
{ }

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "success": true,
  • "data":
    {
    }
}

Delete backup schedule

path Parameters
id
required
string <uuid>

Responses

200

Schedule deleted

404

Schedule not found

503

Scheduler is unavailable

delete/api/system/backup-schedules/{id}
/api/system/backup-schedules/{id}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "success": true,
  • "data":
    {
    }
}

ServiceUsers

List service (machine-to-machine) users

Lists F5 Insights service users (machine users used for machine-to-machine access via the OAuth2 client_credentials grant). Client secrets are never returned. Admin only.

Responses

200

Success

403

Caller is not an admin

500

Internal Error

get/api/auth/service-users
/api/auth/service-users

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "service_users":
    [
    ],
  • "total_count": 0
}

Create service (machine-to-machine) user

Creates a machine user in the F5 Insights organization, grants the requested role, and generates its OAuth2 client_credentials secret. The client_id and client_secret are returned exactly once in this response and are never stored or retrievable again. Admin only.

Request Body schema: application/json
name
required
string

Machine user login name, unique within the organization.

description
string Nullable

Human-friendly description of the service user.

role
required
string (LocalUserRole) non-empty

F5 Insights authorization role. May be a built-in role (admin, operator, viewer) or the name of a custom role. The value is validated against the roles defined in the database at request time, so the set of valid roles is not fixed by this schema.

owner
string Nullable

Free-form owner of the credential (e.g. a team or system).

purpose
string Nullable

Free-form reason the credential exists.

expiry
string <date-time> Nullable

Optional metadata-only expiry. Recorded for lifecycle reporting; the identity provider does not enforce it for client_credentials grants.

Responses

201

Service user created

400

Bad Request

403

Caller is not an admin

409

A service user with this name already exists

500

Internal Error

post/api/auth/service-users
/api/auth/service-users

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "name": "string",
  • "description": "string",
  • "role": "string",
  • "owner": "string",
  • "purpose": "string",
  • "expiry": "2026-10-29T14:02:59Z"
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "service_user":
    {
    },
  • "client_id": "string",
  • "client_secret": "string"
}

Get service user by ID

path Parameters
id
required
string

Responses

200

Success

403

Caller is not an admin

404

Not Found

500

Internal Error

get/api/auth/service-users/{id}
/api/auth/service-users/{id}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "id": "string",
  • "name": "string",
  • "description": "string",
  • "role": "string",
  • "state": "string",
  • "client_id": "string",
  • "owner": "string",
  • "purpose": "string",
  • "expiry": "2026-10-29T14:02:59Z",
  • "created_at": "2026-10-29T14:02:59Z",
  • "last_modified": "2026-10-29T14:02:59Z",
  • "revoked_at": "2026-10-29T14:02:59Z"
}

Update service user

Updates a service user's role and/or lifecycle metadata (owner, purpose, expiry). Only the supplied fields are changed. The client secret is not affected. Admin only.

path Parameters
id
required
string
Request Body schema: application/json
description
string Nullable
role
string (LocalUserRole) non-empty

F5 Insights authorization role. May be a built-in role (admin, operator, viewer) or the name of a custom role. The value is validated against the roles defined in the database at request time, so the set of valid roles is not fixed by this schema.

owner
string Nullable
purpose
string Nullable
expiry
string <date-time> Nullable

Responses

200

Service user updated

400

Bad Request

403

Caller is not an admin

404

Not Found

500

Internal Error

put/api/auth/service-users/{id}
/api/auth/service-users/{id}

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "description": "string",
  • "role": "string",
  • "owner": "string",
  • "purpose": "string",
  • "expiry": "2026-10-29T14:02:59Z"
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "id": "string",
  • "name": "string",
  • "description": "string",
  • "role": "string",
  • "state": "string",
  • "client_id": "string",
  • "owner": "string",
  • "purpose": "string",
  • "expiry": "2026-10-29T14:02:59Z",
  • "created_at": "2026-10-29T14:02:59Z",
  • "last_modified": "2026-10-29T14:02:59Z",
  • "revoked_at": "2026-10-29T14:02:59Z"
}

Delete service user

Removes the machine user from the identity provider, revoking its credentials, and stamps the lifecycle metadata as revoked. Admin only.

path Parameters
id
required
string

Responses

200

Service user deleted

403

Caller is not an admin

404

Not Found

500

Internal Error

delete/api/auth/service-users/{id}
/api/auth/service-users/{id}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "status": "success",
  • "message": "Service user 'ci-bot' deleted successfully",
  • "id": "string"
}

Rotate a service user's client secret

Invalidates the service user's current client secret and generates a new one. The new client_id and client_secret are returned exactly once in this response and are never retrievable again. Admin only.

path Parameters
id
required
string

Responses

200

Secret rotated

403

Caller is not an admin

404

Not Found

500

Internal Error

post/api/auth/service-users/{id}/rotate
/api/auth/service-users/{id}/rotate

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "service_user":
    {
    },
  • "client_id": "string",
  • "client_secret": "string"
}

Settings

Get backup settings

Returns current backup settings (retention count, default storage target)

Responses

200

Current settings

500

Failed to load backup settings

get/api/system/backup-settings
/api/system/backup-settings

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "success": true,
  • "data":
    {
    }
}

Update backup settings

Update backup settings

Request Body schema: application/json
default_storage_target
string

Name of the default storage target

retention_count
integer [ 1 .. 100 ]

Maximum number of backups to retain

Responses

200

Settings updated

400

Invalid request

500

Failed to update backup settings

put/api/system/backup-settings
/api/system/backup-settings

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "default_storage_target": "string",
  • "retention_count": 1
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "success": true,
  • "data":
    {
    }
}

Signals

External signals that trigger execution (alerts, desired-size overrides)

Send a generic signal to a job

Generic signal endpoint for job-level signaling.

Examples:

  • CONTINUOUS jobs: metric/policy signals that may trigger an activity.
  • ON_DEMAND jobs: external events that may trigger or annotate execution behavior. Signal interpretation is workflow-type specific and implemented by the corresponding handler.
path Parameters
workflowId
required
string <uuid>
jobId
required
string <uuid>
Request Body schema: application/json
signalId
string

Unique external signal identifier (e.g. alert ID from monitoring system)

signalType
required
string

Signal category (METRIC_ALERT, POLICY_EVENT, EXTERNAL_EVENT, etc.)

source
string

Signal producer component (e.g. monitoring-pipeline, slack-bot, event-engine)

reason
string

Human-readable explanation for the signal

labels
object

Key-value pairs for signal categorization and filtering

payload
object

Signal-specific data structure (interpreted by workflow type handler)

Responses

202

Signal accepted and processing enqueued

400

Invalid request

404

Resource not found

409

Conflict with current resource state

post/api/provisioning/v1/workflows/{workflowId}/jobs/{jobId}/signal
/api/provisioning/v1/workflows/{workflowId}/jobs/{jobId}/signal

Request samples

Content type
application/json
Example
Copy
Expand all Collapse all
{
  • "signalId": "sig-20260518-001",
  • "signalType": "METRIC_ALERT",
  • "source": "monitoring-pipeline",
  • "reason": "CPU threshold exceeded",
  • "labels":
    {
    },
  • "payload":
    {
    }
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "accepted": true,
  • "correlationId": "9f7224ff-f108-4284-a80e-5f31135606fe",
  • "message": "desired size updated from 3 to 4 based on metric cpu_utilization=91.00",
  • "executionId": "2f2f8b64-91d2-4d4f-9aa8-03b8a9238ea1"
}

SoftwareDistribution

List software distribution jobs

query Parameters
page
integer >= 1
Default: 1
page_size
integer [ 1 .. 500 ]
Default: 20
status
string (UpgradeJobStatus)
Enum: "DRAFT" "READY" "RUNNING" "PAUSING" "PAUSED" "CANCELLING" "COMPLETED" "FAILED"

Filter by job lifecycle status

Responses

200

Paginated list of software distribution jobs

401

Authentication required

get/api/v1/fleet/upgrade/jobs/software-distribution
/api/v1/fleet/upgrade/jobs/software-distribution

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "data":
    [
    ],
  • "pagination":
    {
    }
}

Create a software distribution job

Creates a new software distribution job. The job starts in DRAFT state and can be edited before activation.

Copies a software image to one or more target devices in parallel batches. Config requires: imageId, deviceTargets Config optional: batchSize (default 10)

Once created, activate the job with POST /jobs/{jobId}/activate.

Request Body schema: application/json
name
required
string [ 1 .. 255 ] characters

Unique name for this distribution job.

description
string

Optional human-readable description.

enabled
boolean

Whether this job is enabled. Set to false to disable the job. A disabled job cannot be activated, paused, or resumed. Omit on create to default to true.

config
object (UpgradeSoftwareDistributionConfig)

Configuration for a software distribution job. Copies one or more software images to one or more target devices in batches. batchSize controls how many devices receive the images in parallel (default 10).

Responses

201

Software distribution job created (in DRAFT state)

400

Invalid request

401

Authentication required

409

Job name already exists

post/api/v1/fleet/upgrade/jobs/software-distribution
/api/v1/fleet/upgrade/jobs/software-distribution

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "name": "distribute-bigip-17.1.2-to-prod",
  • "description": "Push BIGIP-17.1.2-0.0.13.iso to 3 production devices before install",
  • "config":
    {
    }
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "id": "string",
  • "workflowId": "string",
  • "name": "string",
  • "description": "string",
  • "status": "DRAFT",
  • "enabled": true,
  • "config":
    {
    },
  • "execution":
    {
    },
  • "createdBy": "string",
  • "modifiedBy": "string",
  • "createdAt": "2026-10-29T14:02:59Z",
  • "updatedAt": "2026-10-29T14:02:59Z",
  • "warnings":
    [
    ]
}

Get software distribution job details

Returns full job details including configuration, current lifecycle status, and execution state.

path Parameters
jobId
required
string <uuid>

Responses

200

Software distribution job details

401

Authentication required

404

Resource not found

get/api/v1/fleet/upgrade/jobs/software-distribution/{jobId}
/api/v1/fleet/upgrade/jobs/software-distribution/{jobId}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "id": "a1b2c3d4-0000-0000-0000-000000000001",
  • "workflowId": "wf-0000-0000-0000-000000000001",
  • "name": "distribute-bigip-17.1.2-to-prod",
  • "description": "Push image to prod devices",
  • "status": "COMPLETED",
  • "config":
    {
    },
  • "execution":
    {
    },
  • "createdAt": "2026-05-29T08:55:00Z",
  • "updatedAt": "2026-05-29T09:28:00Z"
}

Update software distribution job configuration

Replaces the job configuration. Allowed regardless of job state. Edits always apply to the next run; the current or past run (if any) keeps its activation-time configuration. enabled can only change while the job is DRAFT or READY (409 otherwise).

path Parameters
jobId
required
string <uuid>
Request Body schema: application/json
name
string [ 1 .. 255 ] characters

Unique name for this distribution job.

description
string

Optional human-readable description.

enabled
boolean

Whether this job is enabled. Set to false to disable the job. A disabled job cannot be activated, paused, or resumed. Omit on create to default to true.

config
object (UpgradeSoftwareDistributionConfig)

Configuration for a software distribution job. Copies one or more software images to one or more target devices in batches. batchSize controls how many devices receive the images in parallel (default 10).

Responses

200

Job updated

400

Invalid request

401

Authentication required

404

Resource not found

409

Job name already exists, or enabled changed outside DRAFT/READY

patch/api/v1/fleet/upgrade/jobs/software-distribution/{jobId}
/api/v1/fleet/upgrade/jobs/software-distribution/{jobId}

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "name": "distribute-bigip-17.1.2-to-prod-v2",
  • "description": "Updated device list",
  • "config":
    {
    }
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "id": "string",
  • "workflowId": "string",
  • "name": "string",
  • "description": "string",
  • "status": "DRAFT",
  • "enabled": true,
  • "config":
    {
    },
  • "execution":
    {
    },
  • "createdBy": "string",
  • "modifiedBy": "string",
  • "createdAt": "2026-10-29T14:02:59Z",
  • "updatedAt": "2026-10-29T14:02:59Z",
  • "warnings":
    [
    ]
}

Delete a software distribution job

Permanently deletes a software distribution job. Only allowed when the job is not in RUNNING state. Terminates any in-progress execution before deletion.

path Parameters
jobId
required
string <uuid>

Responses

204

Job deleted

401

Authentication required

404

Resource not found

409

Job cannot be deleted in its current state (e.g. RUNNING)

delete/api/v1/fleet/upgrade/jobs/software-distribution/{jobId}
/api/v1/fleet/upgrade/jobs/software-distribution/{jobId}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "error": "string",
  • "code": "string"
}

Start a software distribution job

Transitions a software distribution job from DRAFT/READY → RUNNING and begins distributing the image to target devices in batches.

Pre-execution checks:

  • Image must exist and be accessible in the image registry
  • All target devices must be reachable
path Parameters
jobId
required
string <uuid>
Request Body schema: application/json
changeRequest
string <= 255 characters Nullable

Optional change-request identifier (e.g. "CHG0012345") associated with this specific activation/run. Persisted on the execution record so the UI can display it in the execution drawer. Each activation of the same job may carry a different change request.

Responses

200

Job activated and distribution started

400

Invalid request

401

Authentication required

404

Resource not found

409

Job cannot be activated (wrong state or image not accessible)

post/api/v1/fleet/upgrade/jobs/software-distribution/{jobId}/activate
/api/v1/fleet/upgrade/jobs/software-distribution/{jobId}/activate

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "changeRequest": "string"
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "id": "string",
  • "workflowId": "string",
  • "name": "string",
  • "jobType": "SOFTWARE_DISTRIBUTION",
  • "status": "DRAFT",
  • "updatedAt": "2026-10-29T14:02:59Z"
}

Pause a running software distribution job

Pauses the distribution job at the queue level. The worker pool stops claiming new PENDING devices; devices already TRANSFERRING or VERIFYING run to completion (chunked uploads cannot be safely interrupted mid-stream). Job transitions to PAUSING immediately; once all in-flight devices finish, the service flips to PAUSED. Operator then calls /resume or /cancel.

path Parameters
jobId
required
string <uuid>

Responses

202

Pause accepted — job is PAUSING (draining in-flight)

401

Authentication required

404

Resource not found

409

Job is not in a pausable state

post/api/v1/fleet/upgrade/jobs/software-distribution/{jobId}/pause
/api/v1/fleet/upgrade/jobs/software-distribution/{jobId}/pause

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "error": "string",
  • "code": "string"
}

Resume a paused software distribution job

Resumes a PAUSED distribution job. Job transitions back to RUNNING; a fresh worker pool is spawned to pick up the PENDING devices that were held back during the pause. Devices already COMPLETED stay COMPLETED — no rework. Returns 409 if the job is still PAUSING (drain in progress); wait for PAUSED first.

path Parameters
jobId
required
string <uuid>

Responses

202

Resume accepted — job is back to RUNNING

401

Authentication required

404

Resource not found

409

Job is not in a resumable state

post/api/v1/fleet/upgrade/jobs/software-distribution/{jobId}/resume
/api/v1/fleet/upgrade/jobs/software-distribution/{jobId}/resume

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "error": "string",
  • "code": "string"
}

Cancel a running or paused software distribution job

Durably signals job cancellation by transitioning to CANCELLING.

  • The claim gate immediately stops the worker pool from picking new devices.
  • In-flight workers run to completion of their current device (no mid-stream kill — chunked uploads can't be safely interrupted).
  • When the pool drains, remaining non-terminal per-device rows are marked CANCELLED and the job returns to READY (re-activatable); the CANCELLED outcome is recorded on the EXECUTION row, not the job, because the job is a long-lived re-activatable definition.
  • Safe across pods and pod restarts: CANCELLING is durable in the DB so a different pod / a restarted pod converges to READY at the job level without operator intervention.
path Parameters
jobId
required
string <uuid>

Responses

202

Cancel accepted — job is CANCELLING; converges to READY at the job level (CANCELLED on the execution row)

401

Authentication required

404

Resource not found

409

Job is not in a cancellable state (e.g. already COMPLETED or in a non-cancellable lifecycle state)

post/api/v1/fleet/upgrade/jobs/software-distribution/{jobId}/cancel
/api/v1/fleet/upgrade/jobs/software-distribution/{jobId}/cancel

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "error": "string",
  • "code": "string"
}

Get per-device runtime status for a software distribution job Deprecated

Deprecated: use GET /jobs/software-distribution/{jobId}/executions/{executionId}, whose instanceProgress carries the same per-device rollup scoped to a single execution. This endpoint reports only the latest execution.

Returns the per-device runtime status of a software distribution job plus a rolled-up summary (counts per status + overall transfer percent). Distinct from GET /jobs/software-distribution/{jobId}, which returns the saved job record only.

path Parameters
jobId
required
string <uuid>

Responses

200

Per-device + roll-up status

401

Authentication required

404

Resource not found

get/api/v1/fleet/upgrade/jobs/software-distribution/{jobId}/status
/api/v1/fleet/upgrade/jobs/software-distribution/{jobId}/status

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "jobId": "string",
  • "status": "RUNNING",
  • "totalDevices": 0,
  • "pending": 0,
  • "transferring": 0,
  • "verifying": 0,
  • "completed": 0,
  • "failed": 0,
  • "cancelled": 0,
  • "skipped": 0,
  • "overallPercent": 0,
  • "devices":
    [
    ]
}

List executions of a software distribution job

Returns all executions of a job ordered by startedAt descending (newest first). Same item shape as the generic workflow executions list (GET /workflows/{wfId}/jobs/{jobId}/executions) so the cross-feature UI can render distribution + autoscale + installation execution lists with the same component.

path Parameters
jobId
required
string <uuid>

Responses

200

List of executions

401

Authentication required

404

Resource not found

get/api/v1/fleet/upgrade/jobs/software-distribution/{jobId}/executions
/api/v1/fleet/upgrade/jobs/software-distribution/{jobId}/executions

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "items":
    [
    ],
  • "totalItems": 0
}

Get a single execution of a software distribution job

Returns the execution record in the same shape as the generic workflows API (GET /workflows/{wfId}/jobs/{jobId}/executions/{execId}) so the cross-feature UI can render distribution executions with the same panel it uses for autoscale / installation. Per-device runtime progress is embedded inline via the instanceProgress field — only on this single-execution GET, not on the executions LIST.

path Parameters
jobId
required
string <uuid>
executionId
required
string <uuid>

Responses

200

Execution detail

401

Authentication required

404

Resource not found

get/api/v1/fleet/upgrade/jobs/software-distribution/{jobId}/executions/{executionId}
/api/v1/fleet/upgrade/jobs/software-distribution/{jobId}/executions/{executionId}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "id": "string",
  • "jobId": "string",
  • "jobName": "string",
  • "jobDescription": "string",
  • "trigger": "USER",
  • "status": "RUNNING",
  • "reason": "string",
  • "startedAt": "2026-10-29T14:02:59Z",
  • "completedAt": "2026-10-29T14:02:59Z",
  • "durationMs": 0,
  • "activityCount": 0,
  • "retryCount": 0,
  • "currentStep": "string",
  • "lastError": "string",
  • "changeRequest": "string",
  • "correlationId": "string",
  • "createdBy": "string",
  • "modifiedBy": "string",
  • "instanceProgress":
    {
    }
}

Cancel distribution for one device in a running job

Cancels in-flight distribution for a single device within a running job. Orthogonal to the job-level cancel — the rest of the job continues.

  • Device's distribution_state row transitions to CANCELLED
  • The device lock for this job is released
  • If the device is currently TRANSFERRING, the next chunk boundary observes the cancel and the goroutine returns
path Parameters
jobId
required
string <uuid>
deviceId
required
string <uuid>

Responses

202

Per-target cancel accepted

401

Authentication required

404

Resource not found

409

Device is already in a terminal state for this job (COMPLETED / FAILED / CANCELLED / SKIPPED)

delete/api/v1/fleet/upgrade/jobs/software-distribution/{jobId}/targets/{deviceId}
/api/v1/fleet/upgrade/jobs/software-distribution/{jobId}/targets/{deviceId}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "error": "string",
  • "code": "string"
}

SoftwareInstallation

List software installation jobs

query Parameters
page
integer >= 1
Default: 1
page_size
integer [ 1 .. 500 ]
Default: 20
status
string (UpgradeJobStatus)
Enum: "DRAFT" "READY" "RUNNING" "PAUSING" "PAUSED" "CANCELLING" "COMPLETED" "FAILED"

Filter by job lifecycle status

installationType
string (InstallationType)
Enum: "STANDALONE" "HA"

Filter by installation type

Responses

200

Paginated list of software installation jobs

401

Authentication required

get/api/v1/fleet/upgrade/jobs/software-installation
/api/v1/fleet/upgrade/jobs/software-installation

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "data":
    [
    ],
  • "pagination":
    {
    }
}

Create a software installation job

Creates a new software installation job. The job starts in DRAFT state and can be edited before activation.

installationType controls device targeting mode:

  • STANDALONE — upgrades independent BIG-IP or F5OS devices
  • HA — upgrades HA pairs, maintaining service continuity

batchSize controls serial vs batch execution:

  • batchSize=1 — serial: upgrades one device (or HA pair) at a time
  • batchSize>1 — batch: upgrades multiple devices (or HA pairs) in parallel

Config requires: imageId, installationType, deviceTargets Config optional: batchSize (default 10), execution controls (default true)

Volume selection is job-level via volumeStrategy; a per-device volumeOverride on a device target takes precedence for that device only.

At most 5 installation jobs may be in RUNNING state simultaneously.

Request Body schema: application/json
name
required
string [ 1 .. 255 ] characters

Unique name for this installation job.

description
string

Optional human-readable description.

enabled
boolean

Whether this job is enabled. Set to false to disable the job. A disabled job cannot be activated, paused, or resumed. Omit on create to default to true.

config
object (UpgradeSoftwareInstallationConfig)

Configuration for a software installation job. Installs a software image on one or more target devices.

installationType determines whether devices are treated as independent (STANDALONE) or as HA pairs (HA). Serial vs batch execution is controlled by batchSize:

  • batchSize=1 → serial (one device/pair at a time)
  • batchSize>1 → batch (multiple devices/pairs in parallel)

Volume selection is job-level via volumeStrategy. A per-device volumeOverride on a device target takes precedence over this field for that specific device.

Responses

201

Software installation job created (in DRAFT state)

400

Invalid request

401

Authentication required

409

Job name already exists

post/api/v1/fleet/upgrade/jobs/software-installation
/api/v1/fleet/upgrade/jobs/software-installation

Request samples

Content type
application/json
Example
Copy
Expand all Collapse all
{
  • "name": "install-bigip-17.1.2-standalone-serial",
  • "description": "Upgrade 3 devices one at a time",
  • "config":
    {
    }
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "id": "string",
  • "workflowId": "string",
  • "name": "string",
  • "description": "string",
  • "status": "DRAFT",
  • "enabled": true,
  • "config":
    {
    },
  • "execution":
    {
    },
  • "deviceInstallStates":
    [
    ],
  • "createdBy": "string",
  • "modifiedBy": "string",
  • "createdAt": "2026-10-29T14:02:59Z",
  • "updatedAt": "2026-10-29T14:02:59Z",
  • "warnings":
    [
    ]
}

Get software installation job details

Returns full job details including configuration, current lifecycle status, and per-device install state for any devices that have started execution.

path Parameters
jobId
required
string <uuid>

Responses

200

Software installation job details

401

Authentication required

404

Resource not found

get/api/v1/fleet/upgrade/jobs/software-installation/{jobId}
/api/v1/fleet/upgrade/jobs/software-installation/{jobId}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "id": "b2c3d4e5-0000-0000-0000-000000000002",
  • "workflowId": "wf-0000-0000-0000-000000000001",
  • "name": "install-bigip-17.1.2-standalone-batch",
  • "description": "Upgrade 5 production BIG-IPs in parallel batches of 2",
  • "status": "RUNNING",
  • "config":
    {
    },
  • "execution":
    {
    },
  • "deviceInstallStates":
    [
    ],
  • "createdAt": "2026-05-29T09:55:00Z",
  • "updatedAt": "2026-05-29T10:45:00Z"
}

Update software installation job configuration

Replaces the job configuration. For an enabled backupConfig, omitting backupFileName preserves its existing value; set backupFileName to an empty string to clear it. Allowed regardless of job state. Edits always apply to the next run; the current or past run (if any) keeps its activation-time configuration. enabled can only change while the job is DRAFT or READY (409 otherwise).

path Parameters
jobId
required
string <uuid>
Request Body schema: application/json
name
string [ 1 .. 255 ] characters

Unique name for this installation job.

description
string

Optional human-readable description.

enabled
boolean

Whether this job is enabled. Set to false to disable the job. A disabled job cannot be activated, paused, or resumed. Omit on create to default to true.

config
object (UpgradeSoftwareInstallationConfig)

Configuration for a software installation job. Installs a software image on one or more target devices.

installationType determines whether devices are treated as independent (STANDALONE) or as HA pairs (HA). Serial vs batch execution is controlled by batchSize:

  • batchSize=1 → serial (one device/pair at a time)
  • batchSize>1 → batch (multiple devices/pairs in parallel)

Volume selection is job-level via volumeStrategy. A per-device volumeOverride on a device target takes precedence over this field for that specific device.

Responses

200

Job updated

400

Invalid request

401

Authentication required

404

Resource not found

409

Job name already exists, or enabled changed outside DRAFT/READY

patch/api/v1/fleet/upgrade/jobs/software-installation/{jobId}
/api/v1/fleet/upgrade/jobs/software-installation/{jobId}

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "name": "install-bigip-17.1.2-batch-v2",
  • "description": "Updated batch size",
  • "config":
    {
    }
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "id": "string",
  • "workflowId": "string",
  • "name": "string",
  • "description": "string",
  • "status": "DRAFT",
  • "enabled": true,
  • "config":
    {
    },
  • "execution":
    {
    },
  • "deviceInstallStates":
    [
    ],
  • "createdBy": "string",
  • "modifiedBy": "string",
  • "createdAt": "2026-10-29T14:02:59Z",
  • "updatedAt": "2026-10-29T14:02:59Z",
  • "warnings":
    [
    ]
}

Delete a software installation job

Permanently deletes a software installation job. Only allowed when the job is not in RUNNING state. Terminates any in-progress execution before deletion.

path Parameters
jobId
required
string <uuid>

Responses

204

Job deleted

401

Authentication required

404

Resource not found

409

Job cannot be deleted in its current state (e.g. RUNNING)

delete/api/v1/fleet/upgrade/jobs/software-installation/{jobId}
/api/v1/fleet/upgrade/jobs/software-installation/{jobId}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "error": "string",
  • "code": "string"
}

Start a software installation job

Transitions a software installation job from DRAFT/READY → RUNNING and begins the installation pipeline.

Pre-execution checks:

  • Image must be in VERIFIED state
  • All target devices must be reachable
  • No target device may be locked by another running job
  • Total running software installation jobs must be fewer than 5

Execution creates batches based on batchSize and processes devices one batch at a time. If hitlPauseBetweenBatches is true, execution pauses between batches for operator confirmation.

path Parameters
jobId
required
string <uuid>
Request Body schema: application/json
changeRequest
string <= 255 characters Nullable

Optional change-request identifier (e.g. "CHG0012345") associated with this specific activation/run. Persisted on the execution record so the UI can display it in the execution drawer. Each activation of the same job may carry a different change request.

Responses

202

Job activated and installation started

400

Invalid request

401

Authentication required

404

Resource not found

409

Job cannot be activated (wrong state, image not verified, device locked, or max concurrent jobs reached)

post/api/v1/fleet/upgrade/jobs/software-installation/{jobId}/activate
/api/v1/fleet/upgrade/jobs/software-installation/{jobId}/activate

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "changeRequest": "string"
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "executionId": "string",
  • "jobId": "string",
  • "executionType": "INSTALLATION",
  • "targetExecutionId": "string",
  • "status": "PENDING",
  • "batchSize": 1,
  • "totalDevices": 0,
  • "changeRequest": "string"
}

Pause a running software installation job (HITL)

Pauses the installation job at the next available HITL checkpoint (between batches). The current batch in progress will complete before the pause takes effect. Job transitions to PAUSED state and waits for operator to call /resume or /cancel. Only applicable to software installation jobs with hitlPauseBetweenBatches=true.

path Parameters
jobId
required
string <uuid>

Responses

200

Pause requested — job will pause at the next batch boundary

401

Authentication required

404

Resource not found

409

Job is not in a pausable state

post/api/v1/fleet/upgrade/jobs/software-installation/{jobId}/pause
/api/v1/fleet/upgrade/jobs/software-installation/{jobId}/pause

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "id": "string",
  • "workflowId": "string",
  • "name": "string",
  • "jobType": "SOFTWARE_DISTRIBUTION",
  • "status": "DRAFT",
  • "updatedAt": "2026-10-29T14:02:59Z"
}

Resume a paused software installation job

Resumes a PAUSED software installation job. Execution continues with the next pending batch. Job transitions back to RUNNING state.

path Parameters
jobId
required
string <uuid>

Responses

200

Job resumed

401

Authentication required

404

Resource not found

409

Job is not in a resumable state

post/api/v1/fleet/upgrade/jobs/software-installation/{jobId}/resume
/api/v1/fleet/upgrade/jobs/software-installation/{jobId}/resume

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "id": "string",
  • "workflowId": "string",
  • "name": "string",
  • "jobType": "SOFTWARE_DISTRIBUTION",
  • "status": "DRAFT",
  • "updatedAt": "2026-10-29T14:02:59Z"
}

Initiate a rollback of a software installation job

Creates a new ROLLBACK execution that reverts devices to their previous software version by switchbooting to the volume they ran before the install (BIG-IP) or invoking f5-system-rollback (F5OS).

Rollback target: The latest terminal (COMPLETED, FAILED, or CANCELLED) INSTALLATION execution on this job. ROLLBACK executions are skipped when resolving the target — you cannot roll back a rollback (re-activate to roll forward).

Eligibility: Only devices that reached the REBOOT phase (or later) in the target execution are eligible — these are the devices that may have switchbooted to a new volume and therefore need rollback. Devices that failed before REBOOT (e.g. during INSTALL or VALIDATION) are still on the old volume and are not rollback-eligible, even if their previous volume/version was captured at VOLUME_PLAN.

Defaulting: The request body is entirely optional. If deviceTargets is omitted, all eligible devices from the target execution are rolled back. If execution is omitted, each execution-control field defaults to its value in the target execution's configSnapshot.execution (snapshot-based defaulting), so operators can "just roll back" with an empty body and get identical HA/HITL/failover behavior.

Returns 202 Accepted with the created ROLLBACK execution. Returns 409 when:

  • An execution is already running on this job (in-flight guard), or
  • No terminal INSTALLATION execution with eligible devices exists.

Returns 400 if any deviceTargets are outside the eligible set.

path Parameters
jobId
required
string <uuid>
Request Body schema: application/json
deviceTargets
Array of objects (RollbackDeviceTarget)

Subset of devices to roll back. Each deviceId must be an eligible device from the target execution (reached the REBOOT phase). Devices outside that set cause a 400 error. When omitted, all eligible devices are included.

execution
object (RollbackExecutionOverrides)

Execution-control overrides for a rollback run. Every field is optional and defaults field-by-field to the target execution's configSnapshot.execution (snapshot-based defaulting) — omit a field to inherit the original install run's behaviour.

This is deliberately the rollback-applicable subset of the install execution controls: only the HITL gates, the failback controls, and batchSize are meaningful for a rollback. Install-only controls (reboot, disableAutoConfigSync, volume/image selection, installationType) are NOT part of this schema and are not accepted — a rollback always reboots (switchboots to the previous volume) with config-copy (cpcfg) forced OFF (ADR 0005/D8). Unlike SoftwareInstallationExecution, this schema additionally carries batchSize (which lives on SoftwareInstallationConfig for installs), so the batch width can be re-chosen at rollback time.

changeRequest
string <= 255 characters Nullable

Optional change-request identifier (e.g. "CHG0012345") associated with this rollback. Persisted on the ROLLBACK execution record.

Responses

202

Rollback accepted — ROLLBACK execution created

400

Invalid deviceTargets (one or more devices not in the eligible set)

401

Authentication required

404

Resource not found

409

Rollback not allowed. Either:

  • An execution is already running on this job, or
  • No terminal INSTALLATION execution with eligible devices exists
post/api/v1/fleet/upgrade/jobs/software-installation/{jobId}/rollback
/api/v1/fleet/upgrade/jobs/software-installation/{jobId}/rollback

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "deviceTargets":
    [
    ],
  • "execution":
    {
    },
  • "changeRequest": "string"
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "executionId": "string",
  • "jobId": "string",
  • "executionType": "INSTALLATION",
  • "targetExecutionId": "string",
  • "status": "PENDING",
  • "batchSize": 1,
  • "totalDevices": 0,
  • "changeRequest": "string"
}

List executions of a software installation job

Returns all executions of a job ordered by startedAt descending (newest first). Same item shape as the generic workflow executions list (GET /workflows/{wfId}/jobs/{jobId}/executions) so the cross-feature UI can render distribution + autoscale + installation execution lists with the same component.

path Parameters
jobId
required
string <uuid>

Responses

200

List of executions

401

Authentication required

404

Resource not found

get/api/v1/fleet/upgrade/jobs/software-installation/{jobId}/executions
/api/v1/fleet/upgrade/jobs/software-installation/{jobId}/executions

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "items":
    [
    ],
  • "totalItems": 0
}

Get a single execution of a software installation job

Returns the execution record in the same shape as the generic workflows API (GET /workflows/{wfId}/jobs/{jobId}/executions/{execId}) so the cross-feature UI can render installation executions with the same panel it uses for distribution / autoscale. Per-device runtime progress is embedded inline via the instanceProgress field — only on this single-execution GET, not on the executions LIST.

path Parameters
jobId
required
string <uuid>
executionId
required
string <uuid>

Responses

200

Execution detail

401

Authentication required

404

Resource not found

get/api/v1/fleet/upgrade/jobs/software-installation/{jobId}/executions/{executionId}
/api/v1/fleet/upgrade/jobs/software-installation/{jobId}/executions/{executionId}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "id": "string",
  • "executionType": "INSTALLATION",
  • "rollsBackExecutionId": "string",
  • "jobId": "string",
  • "jobName": "string",
  • "jobDescription": "string",
  • "trigger": "USER",
  • "status": "RUNNING",
  • "reason": "string",
  • "pauseReason": "JOB_CONFIGURATION",
  • "startedAt": "2026-10-29T14:02:59Z",
  • "completedAt": "2026-10-29T14:02:59Z",
  • "durationMs": 0,
  • "activityCount": 0,
  • "retryCount": 0,
  • "currentStep": "string",
  • "lastError": "string",
  • "changeRequest": "string",
  • "correlationId": "string",
  • "createdBy": "string",
  • "modifiedBy": "string",
  • "instanceProgress":
    {
    },
  • "configSnapshot":
    {
    },
  • "readinessWarnDeviceCount": 0,
  • "readinessCriticalDeviceCount": 0,
  • "haCoordination":
    {
    },
  • "isRollbackTarget": true
}

Get license reactivation EULA for a paused install device

Returns the pending license reactivation EULA text for a device in a software installation execution paused with pauseReason=AWAITING_USER.

path Parameters
jobId
required
string <uuid>
executionId
required
string <uuid>
deviceId
required
string <uuid>

Responses

200

Pending EULA text

401

Authentication required

404

Resource not found

409

Execution or device is not waiting for EULA acceptance

get/api/v1/fleet/upgrade/jobs/software-installation/{jobId}/executions/{executionId}/devices/{deviceId}/eula
/api/v1/fleet/upgrade/jobs/software-installation/{jobId}/executions/{executionId}/devices/{deviceId}/eula

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "executionId": "string",
  • "deviceId": "string",
  • "eulaText": "string",
  • "eulaAcceptanceRequired": true,
  • "autoAcceptRemainingDevices": true
}

Accept license reactivation EULA for a paused install device

Accepts the pending license reactivation EULA for one paused install device and resumes the software installation execution. When acceptAll is true, later devices in the same execution auto-accept license reactivation EULAs.

path Parameters
jobId
required
string <uuid>
executionId
required
string <uuid>
deviceId
required
string <uuid>
Request Body schema: application/json
eulaText
required
string non-empty
acceptAll
boolean
Default: false

Responses

200

EULA accepted and execution resumed

400

Invalid request

401

Authentication required

404

Resource not found

409

Execution or device is not waiting for EULA acceptance

patch/api/v1/fleet/upgrade/jobs/software-installation/{jobId}/executions/{executionId}/devices/{deviceId}/eula
/api/v1/fleet/upgrade/jobs/software-installation/{jobId}/executions/{executionId}/devices/{deviceId}/eula

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "eulaText": "string",
  • "acceptAll": false
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "executionId": "string",
  • "deviceId": "string",
  • "accepted": true,
  • "autoAcceptRemainingDevices": true,
  • "message": "string"
}

Cancel a running or paused software installation job

Cancels the installation job gracefully.

  • Any in-progress batch is allowed to complete its current step (no mid-step kill)
  • All pending devices transition to CANCELLED state
  • Device locks are released
  • Job returns to READY (re-activatable); the CANCELLED outcome is recorded on the EXECUTION row, not the job, because the job is a long-lived re-activatable definition
path Parameters
jobId
required
string <uuid>

Responses

200

Job cancelled

401

Authentication required

404

Resource not found

409

Job is not in a cancellable state (e.g. already COMPLETED or in a non-cancellable lifecycle state)

post/api/v1/fleet/upgrade/jobs/software-installation/{jobId}/cancel
/api/v1/fleet/upgrade/jobs/software-installation/{jobId}/cancel

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "id": "string",
  • "workflowId": "string",
  • "name": "string",
  • "jobType": "SOFTWARE_DISTRIBUTION",
  • "status": "DRAFT",
  • "updatedAt": "2026-10-29T14:02:59Z"
}

Storage

Get storage allocation configuration

Retrieve the current storage allocation configuration including percentages, TTL settings, and cleanup thresholds

Responses

200

Storage configuration retrieved successfully

500

Internal server error

get/api/storage/config
/api/storage/config

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "id": "string",
  • "clickhouse_allocation_percent": 70.5,
  • "victoriametrics_allocation_percent": 29.5,
  • "cleanup_threshold_percent": 80,
  • "cleanup_data_percent": 70,
  • "sslo_logs_ttl_days": 7,
  • "irule_logs_ttl_days": 7,
  • "victoriametrics_retention": "12M",
  • "created_at": "2026-10-29T14:02:59Z",
  • "updated_at": "2026-10-29T14:02:59Z"
}

Update storage allocation configuration

Update storage allocation percentages, TTL settings, and cleanup thresholds

Request Body schema: application/json
clickhouse_allocation_percent
required
number <double> [ 0 .. 100 ]

Percentage of total storage allocated to ClickHouse (mandatory, must sum to 100 with victoriametrics_allocation_percent). Supports up to 2 decimal places.

victoriametrics_allocation_percent
required
number <double> [ 0 .. 100 ]

Percentage of total storage allocated to VictoriaMetrics (mandatory, must sum to 100 with clickhouse_allocation_percent). Supports up to 2 decimal places.

cleanup_threshold_percent
number <double> [ 0 .. 100 ]

Threshold percentage at which cleanup is triggered (optional). Supports up to 2 decimal places.

cleanup_data_percent
number <double> [ 0 .. 100 ]

Percentage of data to delete during cleanup (optional). Supports up to 2 decimal places.

Responses

200

Storage configuration updated successfully

400

Invalid request

500

Internal server error

post/api/storage/config
/api/storage/config

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "clickhouse_allocation_percent": 70.5,
  • "victoriametrics_allocation_percent": 29.5,
  • "cleanup_threshold_percent": 80,
  • "cleanup_data_percent": 70
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "id": "string",
  • "clickhouse_allocation_percent": 70.5,
  • "victoriametrics_allocation_percent": 29.5,
  • "cleanup_threshold_percent": 80,
  • "cleanup_data_percent": 70,
  • "sslo_logs_ttl_days": 7,
  • "irule_logs_ttl_days": 7,
  • "victoriametrics_retention": "12M",
  • "created_at": "2026-10-29T14:02:59Z",
  • "updated_at": "2026-10-29T14:02:59Z"
}

List storage targets

Returns all configured storage targets

Responses

200

List of storage targets

500

Failed to list storage targets

get/api/system/storage-targets
/api/system/storage-targets

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "success": true,
  • "data":
    [
    ]
}

Create storage target

Create a new NFS or SMB storage target

Request Body schema: application/json
name
required
string
storage_type
required
string
Enum: "nfs" "smb"
server
string
share_path
string
mount_options
string
username
string
password
string

SMB password (stored securely in Vault, never in DB)

Responses

201

Storage target created

400

Invalid request

500

Failed to create the storage target

503

Vault is unavailable and the credential could not be stored

post/api/system/storage-targets
/api/system/storage-targets

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "name": "string",
  • "storage_type": "nfs",
  • "server": "string",
  • "share_path": "string",
  • "mount_options": "string",
  • "username": "string",
  • "password": "string"
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "success": true,
  • "data":
    {
    }
}

Get storage target

path Parameters
id
required
string <uuid>

Responses

200

Storage target details

404

Not found

get/api/system/storage-targets/{id}
/api/system/storage-targets/{id}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "success": true,
  • "data":
    {
    }
}

Update storage target

path Parameters
id
required
string <uuid>
Request Body schema: application/json
name
string
storage_type
string
Enum: "nfs" "smb"
server
string
share_path
string
mount_options
string
username
string
password
string

SMB password (stored securely in Vault, never in DB)

is_default
boolean

When true, marks this target as the default for new backups.

Responses

200

Storage target updated

400

Invalid request

404

Storage target not found

500

Failed to update the storage target

503

Vault is unavailable and the credential could not be updated

put/api/system/storage-targets/{id}
/api/system/storage-targets/{id}

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "name": "string",
  • "storage_type": "nfs",
  • "server": "string",
  • "share_path": "string",
  • "mount_options": "string",
  • "username": "string",
  • "password": "string",
  • "is_default": true
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "success": true,
  • "data":
    {
    }
}

Delete storage target

path Parameters
id
required
string <uuid>

Responses

200

Storage target deleted

400

Cannot delete default local target

404

Storage target not found

500

Failed to delete the storage target

delete/api/system/storage-targets/{id}
/api/system/storage-targets/{id}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "success": true,
  • "data":
    {
    }
}

Test storage connectivity

Mount, write test file, unmount. Returns success with latency.

path Parameters
id
required
string <uuid>

Responses

200

Test result

404

Storage target not found

503

Platform manager is unavailable

post/api/system/storage-targets/{id}/test
/api/system/storage-targets/{id}/test

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "success": true,
  • "data":
    {
    }
}

Test storage connectivity without creating

Tests connectivity to a storage target using the provided config. Does not save anything.

Request Body schema: application/json
storage_type
required
string
Enum: "local" "nfs" "smb"
server
string
share_path
string
mount_options
string
username
string
password
string

SMB password (used only for the test, never persisted)

Responses

200

Test result

400

Invalid request

503

Platform manager is unavailable

post/api/system/storage-targets/test
/api/system/storage-targets/test

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "storage_type": "local",
  • "server": "string",
  • "share_path": "string",
  • "mount_options": "string",
  • "username": "string",
  • "password": "string"
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "success": true,
  • "data":
    {
    }
}

System

Get system role and node information

Returns whether the current device is running in primary or standby mode based on environment variables

Responses

200

System role information retrieved successfully

500

Internal server error

get/api/system/role
/api/system/role

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "node_id": "standby-node-uuid",
  • "node_name": "node-2",
  • "status": "active",
  • "role": "primary"
}

Tasks

Operations for tracking async task status

List all tasks

Retrieves a paginated list of all async tasks with optional filtering. Useful for monitoring and debugging async operations.

Authorizations:
query Parameters
status
string
Enum: "PENDING" "IN_PROGRESS" "COMPLETED" "FAILED"
Example: status=IN_PROGRESS

Filter tasks by status

type
string
Enum: "ADD_OFFERING" "REACTIVATE_OFFERING" "ASSIGN_LICENSE" "REVOKE_LICENSE"
Example: type=ASSIGN_LICENSE

Filter tasks by type

resourceType
string (PoolType)
Enum: "regkey" "utility" "volume"
Example: resourceType=regkey

Filter tasks by resource type

resourceId
string <uuid>
Example: resourceId=a1b2c3d4-e5f6-7890-abcd-ef1234567890

Filter tasks by resource ID

page
integer >= 1
Default: 1
Example: page=1

Page number for pagination (1-based)

size
integer [ 1 .. 100 ]
Default: 20
Example: size=20

Number of items per page

sort
string
Default: "createdAt:desc"
Example: sort=createdAt:desc

Sort order for results. Format: field:direction Supported fields: createdAt, startedAt, completedAt, status Direction: asc or desc

Responses

200

List of tasks retrieved successfully

400

Bad request - invalid filter parameters

401

Unauthorized

500

Internal server error

get/api/v1/fleet/licensing/tmos/pool/tasks
/api/v1/fleet/licensing/tmos/pool/tasks

Response samples

Content type
application/json
Copy
Expand all Collapse all
{}

Get task status by ID

Retrieves the current status and details of an async task. Use this endpoint to poll for task completion after initiating async operations like license activation, assignment, or revocation.

Authorizations:
path Parameters
taskId
required
string <uuid>
Example: d4e5f6a7-b8c9-0123-defg-456789abcdef

UUID of the task to retrieve

Responses

200

Task status retrieved successfully

401

Unauthorized

404

Task not found

500

Internal server error

get/api/v1/fleet/licensing/tmos/pool/tasks/{taskId}
/api/v1/fleet/licensing/tmos/pool/tasks/{taskId}

Response samples

Content type
application/json
Example
Copy
Expand all Collapse all
{}

Telemetry Configuration

List all telemetry types

Get all available telemetry types and their enabled status for AIDF forwarding

Responses

200

List of all telemetry types with their configuration

500

Internal server error

get/api/telemetry/types
/api/telemetry/types

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "types":
    [
    ]
}

Update enabled telemetry types

Bulk update which telemetry types are enabled for AIDF forwarding. Triggers OTEL configuration reload.

Request Body schema: application/json
enabled_types
required
Array of strings >= 0 items
Items Enum: "API_Discovery" "Application_Telemetry"

List of telemetry types to enable (all others will be disabled)

Responses

200

Telemetry types updated successfully

400

Validation error - invalid telemetry type names

500

Internal server error

put/api/telemetry/types
/api/telemetry/types

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "enabled_types":
    [
    ]
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "status": "validation_success"
}

Get specific telemetry type configuration

Get the configuration for a specific telemetry type

path Parameters
type
required
string
Enum: "API_Discovery" "Application_Telemetry"

Telemetry type name (API_Discovery or Application_Telemetry)

Responses

200

Telemetry type configuration

400

Invalid telemetry type name

404

Telemetry type not found

500

Internal server error

get/api/telemetry/types/{type}
/api/telemetry/types/{type}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "name": "API_Discovery",
  • "enabled": true,
  • "description": "API discovery telemetry from iRule",
  • "updated_at": "2026-05-13T10:30:00Z"
}

Upgrade

Get uploaded bundle info

Returns information about the currently uploaded bundle, if any

Responses

200

Bundle info retrieved successfully

get/api/system/upgrade/upload
/api/system/upgrade/upload

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "data":
    {
    }
}

Delete uploaded upgrade bundle

Deletes uploaded offline upgrade bundles from local bundle storage. When version and/or kind are provided, only matching bundles are removed. When no filters are provided, all uploaded offline bundles are removed.

query Parameters
version
string
Example: version=1.2.1-3

Uploaded bundle version to delete

kind
string
Enum: "patch" "full_upgrade"
Example: kind=patch

Uploaded bundle kind to delete

Responses

200

Uploaded bundle deleted

400

No matching uploaded bundle found

409

Upgrade operation already in progress

500

Failed to delete uploaded bundle

delete/api/system/upgrade/upload
/api/system/upgrade/upload

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "success": true,
  • "data":
    {
    }
}

Upload upgrade bundle

Upload an offline patch or full_upgrade bundle for offline / air-gapped deployments. Accepts a multipart/form-data upload with field name bundle. The archive must be a .tar.gz file up to 8 GB. The upgrade version and kind are auto-detected from manifest.yml/manifest.json, with legacy top-level directory detection as a fallback. After upload, the bundle appears in GET /api/system/upgrade/catalog and can be applied with POST /api/system/upgrade/apply.

Request Body schema: multipart/form-data
bundle
required
string <binary>

Upgrade bundle .tar.gz file (max 8 GB)

Responses

201

Bundle uploaded and validated

400

Invalid request or bundle

409

Another operation is in progress

413

File exceeds 8 GB limit

422

Invalid archive format or missing required structure

post/api/system/upgrade/upload
/api/system/upgrade/upload

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "status": "201",
  • "data":
    {
    }
}

Start upgrade

Not supported since F5 Insight 1.2.0. Use POST /api/system/upgrade/apply instead.

Responses

410

Endpoint is not supported

post/api/system/upgrade/start
/api/system/upgrade/start

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "success": false,
  • "error":
    {
    }
}

Get upgrade status

Returns the current status of the upgrade operation

Responses

200

Status retrieved successfully

get/api/system/upgrade/status
/api/system/upgrade/status

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "success": true,
  • "data":
    {
    }
}

Get upgrade catalog

Returns only the latest available patch and latest available full upgrade for the selected source. Use mode=online to return only F5 Downloads entries, or mode=offline to return only offline local/uploaded bundle entries. The mode query parameter is required.

query Parameters
mode
required
string
Enum: "online" "offline"

Catalog source filter.

Responses

200

Catalog retrieved successfully

400

Missing or invalid mode query parameter

get/api/system/upgrade/catalog
/api/system/upgrade/catalog

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "status": "200",
  • "data":
    {
    }
}

Get current running version

Returns the APP_VERSION environment variable from the running system-manager pod.

Responses

200

Current version returned

get/api/system/upgrade/current
/api/system/upgrade/current

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "status": "200",
  • "data":
    {
    }
}

Run preflight checks for upgrade

Runs preflight checks before a patch or full_upgrade can be applied. Checks include no_active_job, disk_space, pod_health, dr_pair, version_compatibility, and bundle_signature for online upgrades.

query Parameters
kind
required
string
Enum: "patch" "full_upgrade"
Example: kind=patch

Upgrade kind to validate preflight for

version
required
string
Example: version=f5-insight-patch-1.2.3

Target version to validate (e.g., f5-insight-patch-1.2.3)

Responses

200

Preflight checks completed

400

Invalid version parameter

404

Version not found in catalog

get/api/system/upgrade/preflight
/api/system/upgrade/preflight

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "status": "200",
  • "data":
    {
    }
}

Apply upgrade

Starts an upgrade job for an uploaded/local bundle or an online F5 Downloads catalog entry. Runs backend preflight validation before creating the upgrade job so direct API callers cannot bypass failed checks. The request is persisted in upgrade_history and handed to platform-manager over the Unix domain socket. For online entries, system-manager downloads the selected bundle to disk, verifies SHA256 and any provided signature, then applies the same local bundle path.

Request Body schema: application/json
version
required
string

Target version to upgrade to

kind
required
string
Enum: "patch" "full_upgrade"

Upgrade kind to apply

skip_backup
boolean
Default: false
backup_passphrase
string <password>

Required when skip_backup is false. Used only to create the pre-upgrade backup and never persisted in plaintext.

backup_type
string
Enum: "full" "config"

Required when skip_backup is false. Determines whether the pre-upgrade backup captures all components or config-only.

storage_target
string

Required when skip_backup is false. Use "local" for local appliance storage or a configured storage target name.

bypass_preflight_checks
boolean
Default: false

Explicit user override for failed preflight checks that have bypass_allowed=true. no_active_job, disk_space, and version_compatibility failures always block apply.

Responses

202

Upgrade initiated successfully

400

Invalid request or validation failed

409

Upgrade already in progress or preflight checks failed

503

Platform manager unavailable

post/api/system/upgrade/apply
/api/system/upgrade/apply

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "version": "3.2.1",
  • "kind": "patch",
  • "skip_backup": false,
  • "backup_passphrase": "MyStr0ng!Pass",
  • "backup_type": "full",
  • "storage_target": "local",
  • "bypass_preflight_checks": false
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "status": "202",
  • "data":
    {
    }
}

Get upgrade job status

Unified polling endpoint for upgrade status, rollback state, rollback job status, and postflight checks.

path Parameters
job_id
required
string <uuid>
Example: 550e8400-e29b-41d4-a716-446655440000

Upgrade history record ID

Responses

200

Job status retrieved successfully

404

Job not found

500

Internal server error

get/api/system/upgrade/jobs/{job_id}
/api/system/upgrade/jobs/{job_id}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "status": "200",
  • "data":
    {
    }
}

Cancel patch upgrade job

Cancels a pending/running patch job. Full upgrade jobs cannot be cancelled. If patch deployment has already started, automatic rollback is triggered; jobs cancelled before deployment are marked clean.

path Parameters
job_id
required
string <uuid>

Upgrade history record ID

Responses

202

Cancel accepted

400

Cancel is only supported for patch upgrade jobs

404

Job not found

409

No active job to cancel

post/api/system/upgrade/jobs/{job_id}/cancel
/api/system/upgrade/jobs/{job_id}/cancel

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "success": false,
  • "error":
    {
    }
}

Run post-flight health checks

Runs post-deployment health checks for a completed upgrade job.

path Parameters
job_id
required
string <uuid>

Upgrade history record ID

Responses

200

Post-flight results

404

Job not found

get/api/system/upgrade/jobs/{job_id}/postflight
/api/system/upgrade/jobs/{job_id}/postflight

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "status": "200",
  • "data":
    {
    }
}

Roll back upgrade job

Manually starts rollback for the latest successful patch job within 72 hours of completion. Failed patch jobs trigger automatic rollback when deployment has started.

path Parameters
job_id
required
string <uuid>

Upgrade history record ID

Responses

202

Rollback started

400

Rollback is not available for this job

404

Job not found

409

Another operation is already in progress

post/api/system/upgrade/jobs/{job_id}/rollback
/api/system/upgrade/jobs/{job_id}/rollback

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "status": "202",
  • "data":
    {
    }
}

Check rollback state availability

Returns whether manual rollback is currently available for this job. Manual rollback is available for the latest successful patch job within 72 hours of completion; failed patch jobs use automatic rollback.

path Parameters
job_id
required
string <uuid>

Upgrade history record ID

Responses

200

Rollback state checked

404

Job not found

get/api/system/upgrade/jobs/{job_id}/rollback-state
/api/system/upgrade/jobs/{job_id}/rollback-state

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "status": "200",
  • "data":
    {
    }
}

Poll rollback job status

Returns rollback status, progress, and structured log lines.

path Parameters
rollback_id
required
string <uuid>

Rollback history record ID

Responses

200

Rollback status

404

Rollback job not found

get/api/system/upgrade/rollback/{rollback_id}
/api/system/upgrade/rollback/{rollback_id}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "status": "200",
  • "data":
    {
    }
}

Confirm upgrade state is clean

Admin-only override that clears unresolved dirty-state for a failed upgrade after admin review and records rollback_history status admin_confirmed. Only available when the job is failed and dirty_state is true.

path Parameters
job_id
required
string <uuid>

Upgrade history record ID

Responses

200

Dirty state cleared

403

Admin role required

404

Job not found

409

Job is already clean or is not an unresolved failed upgrade

post/api/system/upgrade/jobs/{job_id}/confirm-clean
/api/system/upgrade/jobs/{job_id}/confirm-clean

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "success": false,
  • "error":
    {
    }
}

Get active upgrade job

Returns the single pending/running job. When no active job exists, returns 200 with data set to null. Failed dirty-state jobs are available through history; patch deployment failures trigger automatic rollback.

Responses

200

Active job result

get/api/system/upgrade/active-job
/api/system/upgrade/active-job

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "status": "200",
  • "dirty_state": false,
  • "data":
    {
    }
}

Get upgrade history

Returns the last 50 upgrade jobs, newest first, with top-level dirty_state.

Responses

200

Patch history

get/api/system/upgrade/history
/api/system/upgrade/history

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "status": "200",
  • "dirty_state": false,
  • "data":
    [
    ]
}

Get all-time upgrade stats

Returns aggregate statistics across all historical upgrade jobs.

Responses

200

Aggregate stats

get/api/system/upgrade/history/stats
/api/system/upgrade/history/stats

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "status": "200",
  • "data":
    {
    }
}

List pending scheduled upgrade jobs

Returns all scheduled upgrade jobs with status pending.

Responses

200

Scheduled jobs list

get/api/system/upgrade/scheduled
/api/system/upgrade/scheduled

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "status": "200",
  • "data":
    [
    ]
}

Schedule an upgrade

Schedules a patch or full_upgrade to run at a future UTC timestamp.

Request Body schema: application/json
kind
required
string
Enum: "patch" "full_upgrade"
version
required
string
scheduled_at
required
string <date-time>

Future UTC timestamp when the upgrade should run

skip_backup
boolean
Default: false
backup_passphrase
string <password>

Required when skip_backup is false. Stored securely and used when the scheduled upgrade creates its pre-upgrade backup.

backup_type
string
Enum: "full" "config"

Required when skip_backup is false. Determines whether the scheduled pre-upgrade backup captures all components or config-only.

storage_target
string

Required when skip_backup is false. Use "local" for local appliance storage or a configured storage target name.

bypass_preflight_checks
boolean
Default: false

Explicit user override for failed preflight checks that have bypass_allowed=true. no_active_job, disk_space, and version_compatibility failures always block scheduled apply.

Responses

201

Schedule created

400

scheduled_at must be a future timestamp

post/api/system/upgrade/schedule
/api/system/upgrade/schedule

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "kind": "patch",
  • "version": "f5-insight-patch-3.20",
  • "scheduled_at": "2026-05-12T02:00:00Z",
  • "skip_backup": false,
  • "backup_passphrase": "MyStr0ng!Pass",
  • "backup_type": "full",
  • "storage_target": "local",
  • "bypass_preflight_checks": false
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "status": "201",
  • "data":
    {
    }
}

Cancel a pending scheduled upgrade job

Cancels a pending scheduled job. Has no effect on jobs already triggered.

path Parameters
sched_id
required
string <uuid>

Scheduled upgrade job ID

Responses

200

Scheduled job cancelled

404

Scheduled job not found

delete/api/system/upgrade/scheduled/{sched_id}
/api/system/upgrade/scheduled/{sched_id}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "success": false,
  • "error":
    {
    }
}

List completed scheduled upgrade jobs

Returns scheduled jobs in terminal states done, failed, and cancelled. Pending jobs are excluded.

Responses

200

Scheduled job history

get/api/system/upgrade/scheduled/history
/api/system/upgrade/scheduled/history

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "status": "200",
  • "data":
    [
    ]
}

Get recommended scheduling window

Analyses upgrade history to find the best 2-hour UTC scheduling window.

Responses

200

Recommendation

get/api/system/upgrade/schedule/recommendation
/api/system/upgrade/schedule/recommendation

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "status": "200",
  • "data":
    {
    }
}

VM Tasks

Create a VM

Kicks off an asynchronous VM creation task in the referenced cloud environment. Returns 202 Accepted with task tracking info.

Request Body schema: application/json
envReference
required
string

ID (UUID) or name of the cloud environment to use for this VM task.

vmName
string

For create-vm only: optional name for the created VM. If omitted, a name is generated automatically using the configured naming prefix (default: "autoscale-bigip-"). Ignored by existing-VM tasks.

vmIP
string

IP address of the VM. For delete-vm, power-on-vm, and power-off-vm, either vmIP or vmUuid must be supplied; vmIP takes precedence when both are present.

vmUuid
string

vCenter Managed Object Reference (MoRef) of the VM. For delete-vm, power-on-vm, and power-off-vm, either vmIP or vmUuid must be supplied. Recommended for referencing standby VMs because it remains stable when the VM is powered off.

Responses

202

VM creation task accepted

400

Bad request - validation failed

404

Referenced environment not found

500

Internal server error

post/api/provisioning/v1/cloud/tasks/create-vm
/api/provisioning/v1/cloud/tasks/create-vm

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "envReference": "string",
  • "vmName": "string",
  • "vmIP": "string",
  • "vmUuid": "string"
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "taskId": "string",
  • "status": "PENDING",
  • "envReference": "string",
  • "taskType": "CREATE_VM",
  • "message": "string",
  • "vmName": "string",
  • "vmUuid": "string",
  • "vmIP": "string",
  • "selfLink": "http://example.com",
  • "createdAt": "2026-10-29T14:02:59Z",
  • "updatedAt": "2026-10-29T14:02:59Z"
}

Delete a VM

Kicks off an asynchronous VM deletion task in the referenced cloud environment. Returns 202 Accepted with task tracking info.

Request Body schema: application/json
envReference
required
string

ID (UUID) or name of the cloud environment to use for this VM task.

vmName
string

For create-vm only: optional name for the created VM. If omitted, a name is generated automatically using the configured naming prefix (default: "autoscale-bigip-"). Ignored by existing-VM tasks.

vmIP
string

IP address of the VM. For delete-vm, power-on-vm, and power-off-vm, either vmIP or vmUuid must be supplied; vmIP takes precedence when both are present.

vmUuid
string

vCenter Managed Object Reference (MoRef) of the VM. For delete-vm, power-on-vm, and power-off-vm, either vmIP or vmUuid must be supplied. Recommended for referencing standby VMs because it remains stable when the VM is powered off.

Responses

202

VM deletion task accepted

400

Bad request - validation failed

404

Referenced environment not found

500

Internal server error

post/api/provisioning/v1/cloud/tasks/delete-vm
/api/provisioning/v1/cloud/tasks/delete-vm

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "envReference": "string",
  • "vmName": "string",
  • "vmIP": "string",
  • "vmUuid": "string"
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "taskId": "string",
  • "status": "PENDING",
  • "envReference": "string",
  • "taskType": "CREATE_VM",
  • "message": "string",
  • "vmName": "string",
  • "vmUuid": "string",
  • "vmIP": "string",
  • "selfLink": "http://example.com",
  • "createdAt": "2026-10-29T14:02:59Z",
  • "updatedAt": "2026-10-29T14:02:59Z"
}

Power on a VM

Kicks off an asynchronous VM power-on task in the referenced cloud environment. Returns 202 Accepted with task tracking info.

Request Body schema: application/json
envReference
required
string

ID (UUID) or name of the cloud environment to use for this VM task.

vmName
string

For create-vm only: optional name for the created VM. If omitted, a name is generated automatically using the configured naming prefix (default: "autoscale-bigip-"). Ignored by existing-VM tasks.

vmIP
string

IP address of the VM. For delete-vm, power-on-vm, and power-off-vm, either vmIP or vmUuid must be supplied; vmIP takes precedence when both are present.

vmUuid
string

vCenter Managed Object Reference (MoRef) of the VM. For delete-vm, power-on-vm, and power-off-vm, either vmIP or vmUuid must be supplied. Recommended for referencing standby VMs because it remains stable when the VM is powered off.

Responses

202

VM power-on task accepted

400

Bad request - validation failed

404

Referenced environment not found

500

Internal server error

post/api/provisioning/v1/cloud/tasks/power-on-vm
/api/provisioning/v1/cloud/tasks/power-on-vm

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "envReference": "string",
  • "vmName": "string",
  • "vmIP": "string",
  • "vmUuid": "string"
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "taskId": "string",
  • "status": "PENDING",
  • "envReference": "string",
  • "taskType": "CREATE_VM",
  • "message": "string",
  • "vmName": "string",
  • "vmUuid": "string",
  • "vmIP": "string",
  • "selfLink": "http://example.com",
  • "createdAt": "2026-10-29T14:02:59Z",
  • "updatedAt": "2026-10-29T14:02:59Z"
}

Power off a VM

Kicks off an asynchronous VM power-off task in the referenced cloud environment. Returns 202 Accepted with task tracking info.

Request Body schema: application/json
envReference
required
string

ID (UUID) or name of the cloud environment to use for this VM task.

vmName
string

For create-vm only: optional name for the created VM. If omitted, a name is generated automatically using the configured naming prefix (default: "autoscale-bigip-"). Ignored by existing-VM tasks.

vmIP
string

IP address of the VM. For delete-vm, power-on-vm, and power-off-vm, either vmIP or vmUuid must be supplied; vmIP takes precedence when both are present.

vmUuid
string

vCenter Managed Object Reference (MoRef) of the VM. For delete-vm, power-on-vm, and power-off-vm, either vmIP or vmUuid must be supplied. Recommended for referencing standby VMs because it remains stable when the VM is powered off.

Responses

202

VM power-off task accepted

400

Bad request - validation failed

404

Referenced environment not found

500

Internal server error

post/api/provisioning/v1/cloud/tasks/power-off-vm
/api/provisioning/v1/cloud/tasks/power-off-vm

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "envReference": "string",
  • "vmName": "string",
  • "vmIP": "string",
  • "vmUuid": "string"
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "taskId": "string",
  • "status": "PENDING",
  • "envReference": "string",
  • "taskType": "CREATE_VM",
  • "message": "string",
  • "vmName": "string",
  • "vmUuid": "string",
  • "vmIP": "string",
  • "selfLink": "http://example.com",
  • "createdAt": "2026-10-29T14:02:59Z",
  • "updatedAt": "2026-10-29T14:02:59Z"
}

Get create-vm task status

path Parameters
taskId
required
string <uuid>

UUID of the VM task

Responses

200

Task status returned

404

Task not found

500

Internal server error

get/api/provisioning/v1/cloud/tasks/create-vm/{taskId}
/api/provisioning/v1/cloud/tasks/create-vm/{taskId}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "taskId": "string",
  • "status": "PENDING",
  • "envReference": "string",
  • "taskType": "CREATE_VM",
  • "message": "string",
  • "vmName": "string",
  • "vmUuid": "string",
  • "vmIP": "string",
  • "selfLink": "http://example.com",
  • "createdAt": "2026-10-29T14:02:59Z",
  • "updatedAt": "2026-10-29T14:02:59Z"
}

Get delete-vm task status

path Parameters
taskId
required
string <uuid>

UUID of the VM task

Responses

200

Task status returned

404

Task not found

500

Internal server error

get/api/provisioning/v1/cloud/tasks/delete-vm/{taskId}
/api/provisioning/v1/cloud/tasks/delete-vm/{taskId}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "taskId": "string",
  • "status": "PENDING",
  • "envReference": "string",
  • "taskType": "CREATE_VM",
  • "message": "string",
  • "vmName": "string",
  • "vmUuid": "string",
  • "vmIP": "string",
  • "selfLink": "http://example.com",
  • "createdAt": "2026-10-29T14:02:59Z",
  • "updatedAt": "2026-10-29T14:02:59Z"
}

Get power-on-vm task status

path Parameters
taskId
required
string <uuid>

UUID of the VM task

Responses

200

Task status returned

404

Task not found

500

Internal server error

get/api/provisioning/v1/cloud/tasks/power-on-vm/{taskId}
/api/provisioning/v1/cloud/tasks/power-on-vm/{taskId}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "taskId": "string",
  • "status": "PENDING",
  • "envReference": "string",
  • "taskType": "CREATE_VM",
  • "message": "string",
  • "vmName": "string",
  • "vmUuid": "string",
  • "vmIP": "string",
  • "selfLink": "http://example.com",
  • "createdAt": "2026-10-29T14:02:59Z",
  • "updatedAt": "2026-10-29T14:02:59Z"
}

Get power-off-vm task status

path Parameters
taskId
required
string <uuid>

UUID of the VM task

Responses

200

Task status returned

404

Task not found

500

Internal server error

get/api/provisioning/v1/cloud/tasks/power-off-vm/{taskId}
/api/provisioning/v1/cloud/tasks/power-off-vm/{taskId}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "taskId": "string",
  • "status": "PENDING",
  • "envReference": "string",
  • "taskType": "CREATE_VM",
  • "message": "string",
  • "vmName": "string",
  • "vmUuid": "string",
  • "vmIP": "string",
  • "selfLink": "http://example.com",
  • "createdAt": "2026-10-29T14:02:59Z",
  • "updatedAt": "2026-10-29T14:02:59Z"
}

Validation

Trigger async pre-job validation for a list of devices against an image

Starts the pluggable validation engine for the supplied devices against the given target image. No job needs to exist — this endpoint is called before job creation to confirm all selected devices are eligible for the upgrade.

Returns 202 Accepted immediately with a validation_run_id. Poll GET /validate/{validationRunId} until status is no longer PENDING or RUNNING.

When backupEnabled: true and pre-install backup is available, BIG-IP and F5OS-A devices include adjacent SOFT backup_storage_capacity (device backup filesystem) and f5_insight_storage_capacity (local backup store) checks. Both are PASS or WARN, never FAIL; their warnings do not block can_proceed. Backup readiness requires available inventory metadata and a single supported device type. Mixed BIG-IP/rSeries selections or missing/unsupported device metadata return 400 with an actionable validation error; metadata lookup failures return 500. No validation run is created when preparation fails. When backupEnabled is omitted/false, the backup feature/seam is unavailable, or targets are VELOS, both entries are omitted entirely without a backup warning. Local storage is always checked, regardless of any remote backup target. F5 Insight free space is snapshotted once before device checks. Every device receives the same local-store result: WARN when available space is below the total estimate for all selected instances, otherwise PASS (including equality). Hostname/device_id ordering does not affect storage results. All warned devices use the total required for all selected instances, for example: "F5 Insight has 8.00 GB available, but 10.00 GB is required to retain backup files for all the selected instances". Estimates are 2 GiB per BIG-IP and 500 KiB per F5OS-A, displayed as GB and MB respectively with two decimals and base-1024 math. PASS has no message. Probe failure warns every device with "Unable to determine free space in F5 Insight" and the error in detail. On early device failures/errors, only the precomputed F5 Insight entry is retained; the device filesystem is not probed after validation aborts.

Before the validation checks run, the engine performs a live metadata refresh for each device so that all checks operate on up-to-date data (current version, service check date, license check date, available disk, etc.). The refresh result is best-effort — a refresh failure logs a warning but does not abort validation.


Soft checks — warn operator; job may still proceed (can_proceed: true)

Check Source Threshold
disk_space Live LVM vgFree of the boot logical disk (BIG-IP) Existing slot: WARN when < 2 GB. New or empty slot: provisioning-aware need = volume set (/config + /var + root//usr allowance) + per-boot-location application volumes (e.g. the 12 GB MySQL volume for AFM/APM/ASM) + unallocated module data; HARD FAIL below the need, WARN when free space is within the 1 GB safety buffer above it (HARD FAIL instead when any input was defaulted), PASS above need + buffer; HARD FAIL below 16 GB when the device layout cannot be read
cpu_utilization Stage 1: always SKIP — Stage 2: 5-min avg via iControl REST > 80%
memory_utilization Stage 1: always SKIP — Stage 2: 5-min avg via iControl REST > 90%
license_reactivation BIG-IP registration dates, live F5OS license details with cached F5OS metadata fallback, target/cached LCD, BIG-IP VE License Manager ownership, and platform eligibility WARN when reactivation is required for an eligible unmanaged device; SKIP for PAYG or unsupported platforms; managed BIG-IP VE Reactivate All fails, while conditional/do-not-reactivate pass current licenses and fail stale/expired licenses
license_server_reachable F5 production license server DNS, TCP/443 and strict TLS reachability, probed once per validation run; SKIP when license re-activation is disabled (DO_NOT_REACTIVATE), for PAYG licenses, for unsupported platforms, or when license_reactivation found no re-activation is needed for the device FAIL (HARD) when the license server is not reachable, because software installation re-activates licenses during the job

Hard checks — block upgrade; job cannot proceed (can_proceed: false)

Check Source Rule
upgrade_path upgrade.bigip_upgrade_paths table (seeded from F5 KB K13845) Current version must satisfy the minimum-source-version rule for the target major version (BIG-IP only)
license_compatibility bigip.license active-modules (fetched live or cached) License edition must not have an "Exclusive Version" ceiling below the target version (BIG-IP only)
f5os_version_support upgrade.f5os_supported_versions table (seeded from F5 KB K86001294) Target F5OS version must be explicitly listed as supported for the device's hardware platform (F5OS only)

License reactivation check detail (license_reactivation)

BIG-IP will refuse to load its configuration after booting into a newly-upgraded volume if the service check date in bigip.license predates the license check date (LCD) baked into that version's build (published in F5 KB K7727, stored in /etc/version_date on the device).

The engine reads the values as follows:

  1. BIG-IP devices use serviceCheckDateTime and licenseEndDateTime from GET /mgmt/tm/shared/licensing/registration; the target LCD is resolved from the static K7727 table in upgrade/licensedate, keyed by the target image major.minor.
  2. F5OS/rSeries devices prefer live F5OS license details from GET /api/data/openconfig-system:system/f5-system-licensing:licensing for service_check_date, license_check_date, and license_end_date_time, with cached device_upgrade_metadata dates as fallback. rSeries only requires reactivation when the license is expired; SCD/LCD drift is returned as detail but does not by itself make reactivation_required true.
  3. is_license_manager_managed is read from public.devices and enforced only for BIG-IP VE. BIG-IQ ownership is also checked only for BIG-IP VE.

A WARN result with reactivation_required: true means the device is eligible for the configured reactivation flow and the UI can show "Can Proceed" with a reactivation warning. When licenseReactivationPreference is DO_NOT_REACTIVATE, a stale/expired unmanaged license returns a hard FAIL because the workflow is not allowed to reactivate the device. BIG-IP VE management checks apply to both F5 Insight-managed and BIG-IQ-managed licenses: REACTIVATE_ALL returns a hard FAIL even when the license is current; conditional and do-not-reactivate pass current licenses but fail stale/expired licenses because SWI cannot reactivate those managed licenses. PAYG licenses return SKIP regardless of manager ownership. BIG-IP VE, iSeries, and rSeries devices are eligible for reactivation. VELOS and VIPRION devices return SKIP because the reactivation workflow is not supported for those platforms.


Re-triggering with the same inputs creates a fresh validation run (a new validation_run_id is returned each time).

Request Body schema: application/json
backupEnabled
boolean
Default: false

Request-wide opt-in to SOFT backup storage readiness checks. Both checks are omitted when false/omitted, pre-install backup is unavailable, or targets are VELOS.

device_targets
required
Array of objects (ValidationDeviceTarget) non-empty

List of device targets (with optional per-device volume_override) to validate against the target image.

image_id
required
string <uuid>

UUID of the target software image to validate against.

volume_strategy
string (VolumeStrategy)
Enum: "NEXT_INACTIVE" "LAST_INACTIVE" "NEXT_SEQUENTIAL_NEW"

Determines which boot volume to install the new software on. This is a job-level setting applied to all devices. A per-device volumeOverride takes precedence over this field for that specific device.

  • NEXT_INACTIVE: install on the next available inactive volume numerically
  • LAST_INACTIVE: install on the last available inactive volume numerically
  • NEXT_SEQUENTIAL_NEW: create a new volume with the next sequential identifier
install_config
boolean
Default: true

Controls config carry-forward (BIG-IP cpcfg) for all devices in this validation request. Mirrors SoftwareInstallationConfig.installConfig. When true (or omitted), the install_config readiness check warns if the target version is older than the active version (a downgrade causes cpcfg to skip config copy). When false, the install_config check is skipped.

licenseReactivationPreference
string (ReactivationPreference)
Default: "REACTIVATE_ON_LCD_FAILURE"
Enum: "REACTIVATE_ALL" "REACTIVATE_ON_LCD_FAILURE" "DO_NOT_REACTIVATE"

Controls whether license reactivation is attempted during the software installation workflow. When omitted, eligible targeted devices are reactivated only when their license is expired or their service check date is older than the target software license check date.

  • REACTIVATE_ALL: reactivate every eligible targeted device before installation.
  • REACTIVATE_ON_LCD_FAILURE: reactivate a device only when its service check date is older than the target software license check date or the license is expired.
  • DO_NOT_REACTIVATE: never attempt license reactivation during installation.

Responses

202

Validation triggered — poll GET /validate/{validationRunId} for results

400

Invalid request

401

Authentication required

post/api/v1/fleet/upgrade/validate
/api/v1/fleet/upgrade/validate

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "backupEnabled": false,
  • "device_targets":
    [
    ],
  • "image_id": "string",
  • "volume_strategy": "NEXT_INACTIVE",
  • "install_config": true,
  • "licenseReactivationPreference": "REACTIVATE_ON_LCD_FAILURE"
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "validation_run_id": "string",
  • "message": "validation triggered"
}

Get results for a validation run

Returns persisted per-device validation results for a run. Poll until status is no longer PENDING or RUNNING. can_proceed: true means no HARD check failures exist across any device.

path Parameters
validationRunId
required
string <uuid>

The validation run ID returned by POST /validate

Responses

200

Validation results

401

Authentication required

404

Resource not found

get/api/v1/fleet/upgrade/validate/{validationRunId}
/api/v1/fleet/upgrade/validate/{validationRunId}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "validation_run_id": "a1b2c3d4-0000-0000-0000-000000000001",
  • "image_id": "img-uuid-0000-0000-0000-000000000001",
  • "status": "WARNING",
  • "device_count": 3,
  • "pass_count": 2,
  • "warn_count": 1,
  • "fail_count": 0,
  • "error_count": 0,
  • "can_proceed": true,
  • "triggered_at": "2026-08-06T10:00:00Z",
  • "completed_at": "2026-08-06T10:00:05Z",
  • "devices":
    [
    ]
}

Validators

Validate AI provider configuration

Request Body schema: application/json
provider_name
required
string

AI provider name (e.g., openai, claude, local)

api_token
string

API token for the provider. Required for 'openai' and 'claude' providers, optional for 'local' provider.

base_url
string

Base URL for the provider. Required for 'local' provider, optional for 'openai' and 'claude'.

model
string

Model name to use. Required for 'local' provider, optional for others.

ca
string <uuid>

Optional CA certificate UUID from trust store

skip_tls_verify
boolean

Indicates if TLS verification should be skipped for this provider

Responses

200

Validation successful

400

Validation failed

500

Internal server error

post/api/validate/inference_provider
/api/validate/inference_provider

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "provider_name": "string",
  • "api_token": "string",
  • "base_url": "string",
  • "model": "string",
  • "ca": "string",
  • "skip_tls_verify": true
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "status": "validation_success",
  • "error": "string"
}

Validate AIDF configuration

Request Body schema: application/json
endpoint
required
string
tenant_id
required
string
tenant_token
required
string

Responses

200

Validation successful

400

Validation failed

500

Internal server error

post/api/validate/aidf
/api/validate/aidf

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "endpoint": "string",
  • "tenant_id": "string",
  • "tenant_token": "string"
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "status": "validation_success",
  • "error": "string"
}

Workflows

Workflow template definitions (type + executionMode + default config)

List workflow templates

Distinct filters combine with AND. Parameter names and exact string/enum values are case-sensitive. Unknown query names are ignored. The new id and name filters ignore empty or whitespace-only values; repeated nonblank or invalid values return 400. Existing type and executionMode scalars retain their historical input acceptance; blank values add no predicate. Returns workflow templates that define reusable workflow behavior. Supports exact filtering by id, name, workflow type, and execution mode. The legacy status parameter remains accepted and ignored. The legacy page_size query parameter is accepted and ignored, including empty, arbitrary and repeated values. It is not a filter and does not affect pagination. Use this endpoint for catalog/discovery before creating Jobs.

query Parameters
page
integer >= 1
Default: 1
limit
integer [ 1 .. 200 ]
Default: 50
id
string <uuid>

Exact UUID equality. Empty or whitespace-only values are ignored; invalid or repeated nonblank values return 400.

name
string

Exact case-sensitive equality. Empty or whitespace-only values are ignored. Whitespace in nonblank names is preserved; repeated nonblank values return 400.

type
string
Enum: "AUTO_SCALE" "UPGRADE" "SOFTWARE_DISTRIBUTION" "SOFTWARE_INSTALLATION" "BACKUP" "DEVICE_BACKUP" "DEVICE_RESTORE" "RELICENSE"
executionMode
string
Enum: "CONTINUOUS" "ON_DEMAND" "SCHEDULED"
status
string
Deprecated
Enum: "DRAFT" "ACTIVE" "DEPRECATED"

Legacy compatibility parameter; accepted with its historical scalar binding but ignored.

Responses

200

List of workflow templates

400

Invalid new filter or existing generated parameter (msg), or an existing application-level list rejection (error).

get/api/provisioning/v1/workflows
/api/provisioning/v1/workflows

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "items":
    [
    ],
  • "total": 1,
  • "page": 1,
  • "limit": 50
}

Get a workflow template

Returns a single workflow template by ID including type, execution mode, versioning metadata, and default configuration.

path Parameters
workflowId
required
string <uuid>

Responses

200

Workflow template

404

Resource not found

get/api/provisioning/v1/workflows/{workflowId}
/api/provisioning/v1/workflows/{workflowId}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "id": "b7e6a4ae-4cf9-4ad4-b8f9-9b5347300d73",
  • "name": "autoscale-template-prod",
  • "description": "Production autoscale template for monitoring and scaling",
  • "type": "AUTO_SCALE",
  • "executionMode": "CONTINUOUS",
  • "createdAt": "2026-05-18T10:10:00.000Z"
}

iRule Telemetry

Per-iRule HTTP/HTTPS sample reporting dashboards. Provides aggregated traffic metrics, time-series breakdowns, top routes, bucket drilldowns, and on-demand raw samples for traffic sampled via telemetry iRules.

List telemetry iRules

Returns all telemetry iRules that are currently sending HTTP/HTTPS sample data.

query Parameters
device
Array of strings

Filter by BIG-IP device hostname. Repeat or comma-separate for multiple devices.

virtual_server
Array of strings

Filter by virtual server. Repeat or comma-separate for multiple values.

Responses

200

List of telemetry iRules

500

Internal Error

get/api/irule-telemetry/irules
/api/irule-telemetry/irules

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "irules":
    [
    ]
}

Get iRule dashboard summary

Returns top-level metrics for the iRule dashboard header (RPS, error rate, latency percentiles, severity).

path Parameters
name
required
string

Name of the telemetry source. When reading from ClickHouse this maps to the BIG-IP hostname that produced the samples.

query Parameters
device
Array of strings

Filter by BIG-IP device hostname. Repeat or comma-separate for multiple devices.

from
string <date-time>

Start of the time window (RFC3339). Defaults to 15 minutes ago.

to
string <date-time>

End of the time window (RFC3339). Defaults to now.

outcome
Array of strings
Items Enum: "SUCCESS" "CLIENT_ERROR" "SLOW" "SERVER_ERROR" "TIMEOUT"

Filter by outcome classification. Repeat or comma-separate for multiple values.

latency_band
Array of strings
Items Enum: "FAST" "NORMAL" "SLOW" "VERY_SLOW"

Filter by latency band. Repeat or comma-separate for multiple values.

severity
Array of strings
Items Enum: "NORMAL" "WARNING" "CRITICAL"

Filter by severity. Repeat or comma-separate for multiple values.

method
Array of strings
Items Enum: "GET" "POST" "PUT" "DELETE" "PATCH" "HEAD" "OPTIONS"

Filter by HTTP method. Repeat or comma-separate for multiple values.

virtual_server
Array of strings

Filter by virtual server. Repeat or comma-separate for multiple values.

url_pattern
string

Filter by URL pattern substring.

status_code
string

Filter by status code. Supports exact values (e.g. 404) or ranges (e.g. 5xx).

Responses

200

iRule summary

400

Bad Request

500

Internal Error

get/api/irule-telemetry/irules/{name}/summary
/api/irule-telemetry/irules/{name}/summary

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "irule_name": "string",
  • "time_range":
    {
    },
  • "request_count": 0,
  • "rps": 0,
  • "error_rate": 0,
  • "latency_p50_ms": 0,
  • "latency_p95_ms": 0,
  • "latency_p99_ms": 0,
  • "severity": "NORMAL",
  • "clients": 0,
  • "throughput": 0,
  • "status_breakdown":
    [
    ],
  • "fingerprints":
    [
    ]
}

Get traffic over time

Returns time-series traffic data broken down by outcome classification.

path Parameters
name
required
string

Name of the telemetry source. When reading from ClickHouse this maps to the BIG-IP hostname that produced the samples.

query Parameters
device
Array of strings

Filter by BIG-IP device hostname. Repeat or comma-separate for multiple devices.

from
string <date-time>

Start of the time window (RFC3339). Defaults to 15 minutes ago.

to
string <date-time>

End of the time window (RFC3339). Defaults to now.

bucket_size
integer >= 1

Bucket size in seconds. Auto-selected based on time range when omitted.

outcome
Array of strings
Items Enum: "SUCCESS" "CLIENT_ERROR" "SLOW" "SERVER_ERROR" "TIMEOUT"

Filter by outcome classification. Repeat or comma-separate for multiple values.

latency_band
Array of strings
Items Enum: "FAST" "NORMAL" "SLOW" "VERY_SLOW"

Filter by latency band. Repeat or comma-separate for multiple values.

severity
Array of strings
Items Enum: "NORMAL" "WARNING" "CRITICAL"

Filter by severity. Repeat or comma-separate for multiple values.

method
Array of strings
Items Enum: "GET" "POST" "PUT" "DELETE" "PATCH" "HEAD" "OPTIONS"

Filter by HTTP method. Repeat or comma-separate for multiple values.

virtual_server
Array of strings

Filter by virtual server. Repeat or comma-separate for multiple values.

url_pattern
string

Filter by URL pattern substring.

status_code
string

Filter by status code. Supports exact values (e.g. 404) or ranges (e.g. 5xx).

Responses

200

Traffic time-series

400

Bad Request

500

Internal Error

get/api/irule-telemetry/irules/{name}/traffic
/api/irule-telemetry/irules/{name}/traffic

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "irule_name": "string",
  • "time_range":
    {
    },
  • "bucket_size_seconds": 0,
  • "series":
    [
    ]
}

Get top routes

Returns ranked URL patterns with RPS, latency, and error rate for the selected iRule.

path Parameters
name
required
string

Name of the telemetry source. When reading from ClickHouse this maps to the BIG-IP hostname that produced the samples.

query Parameters
device
Array of strings

Filter by BIG-IP device hostname. Repeat or comma-separate for multiple devices.

from
string <date-time>

Start of the time window (RFC3339). Defaults to 15 minutes ago.

to
string <date-time>

End of the time window (RFC3339). Defaults to now.

limit
integer [ 1 .. 1000 ]
Default: 20

Maximum number of results to return.

outcome
Array of strings
Items Enum: "SUCCESS" "CLIENT_ERROR" "SLOW" "SERVER_ERROR" "TIMEOUT"

Filter by outcome classification. Repeat or comma-separate for multiple values.

latency_band
Array of strings
Items Enum: "FAST" "NORMAL" "SLOW" "VERY_SLOW"

Filter by latency band. Repeat or comma-separate for multiple values.

severity
Array of strings
Items Enum: "NORMAL" "WARNING" "CRITICAL"

Filter by severity. Repeat or comma-separate for multiple values.

method
Array of strings
Items Enum: "GET" "POST" "PUT" "DELETE" "PATCH" "HEAD" "OPTIONS"

Filter by HTTP method. Repeat or comma-separate for multiple values.

virtual_server
Array of strings

Filter by virtual server. Repeat or comma-separate for multiple values.

url_pattern
string

Filter by URL pattern substring.

status_code
string

Filter by status code. Supports exact values (e.g. 404) or ranges (e.g. 5xx).

Responses

200

Top routes table

400

Bad Request

500

Internal Error

get/api/irule-telemetry/irules/{name}/top-routes
/api/irule-telemetry/irules/{name}/top-routes

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "irule_name": "string",
  • "time_range":
    {
    },
  • "routes":
    [
    ]
}

Get time bucket drilldown

Returns detailed breakdown for a specific time bucket including outcome split, latency split, top URLs, and highlights.

path Parameters
name
required
string

Name of the telemetry source. When reading from ClickHouse this maps to the BIG-IP hostname that produced the samples.

bucket_time
required
string <date-time>

RFC3339 timestamp of the bucket start.

query Parameters
device
Array of strings

Filter by BIG-IP device hostname. Repeat or comma-separate for multiple devices.

bucket_size
integer >= 1

Bucket size in seconds. Auto-selected based on time range when omitted.

outcome
Array of strings
Items Enum: "SUCCESS" "CLIENT_ERROR" "SLOW" "SERVER_ERROR" "TIMEOUT"

Filter by outcome classification. Repeat or comma-separate for multiple values.

latency_band
Array of strings
Items Enum: "FAST" "NORMAL" "SLOW" "VERY_SLOW"

Filter by latency band. Repeat or comma-separate for multiple values.

severity
Array of strings
Items Enum: "NORMAL" "WARNING" "CRITICAL"

Filter by severity. Repeat or comma-separate for multiple values.

method
Array of strings
Items Enum: "GET" "POST" "PUT" "DELETE" "PATCH" "HEAD" "OPTIONS"

Filter by HTTP method. Repeat or comma-separate for multiple values.

virtual_server
Array of strings

Filter by virtual server. Repeat or comma-separate for multiple values.

url_pattern
string

Filter by URL pattern substring.

status_code
string

Filter by status code. Supports exact values (e.g. 404) or ranges (e.g. 5xx).

Responses

200

Bucket drilldown

400

Bad Request

500

Internal Error

get/api/irule-telemetry/irules/{name}/buckets/{bucket_time}
/api/irule-telemetry/irules/{name}/buckets/{bucket_time}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "irule_name": "string",
  • "bucket_time": "2026-10-29T14:03:00Z",
  • "bucket_size_seconds": 0,
  • "total_requests": 0,
  • "outcome_split":
    [
    ],
  • "latency_split":
    [
    ],
  • "top_urls":
    [
    ],
  • "highlights":
    [
    ]
}

Get raw samples

Returns paginated raw sample rows for on-demand drilldown.

path Parameters
name
required
string

Name of the telemetry source. When reading from ClickHouse this maps to the BIG-IP hostname that produced the samples.

query Parameters
device
Array of strings

Filter by BIG-IP device hostname. Repeat or comma-separate for multiple devices.

from
string <date-time>

Start of the time window (RFC3339). Defaults to 15 minutes ago.

to
string <date-time>

End of the time window (RFC3339). Defaults to now.

limit
integer [ 1 .. 1000 ]
Default: 20

Maximum number of results to return.

cursor
string

Opaque cursor for paginating raw samples.

outcome
Array of strings
Items Enum: "SUCCESS" "CLIENT_ERROR" "SLOW" "SERVER_ERROR" "TIMEOUT"

Filter by outcome classification. Repeat or comma-separate for multiple values.

latency_band
Array of strings
Items Enum: "FAST" "NORMAL" "SLOW" "VERY_SLOW"

Filter by latency band. Repeat or comma-separate for multiple values.

severity
Array of strings
Items Enum: "NORMAL" "WARNING" "CRITICAL"

Filter by severity. Repeat or comma-separate for multiple values.

method
Array of strings
Items Enum: "GET" "POST" "PUT" "DELETE" "PATCH" "HEAD" "OPTIONS"

Filter by HTTP method. Repeat or comma-separate for multiple values.

virtual_server
Array of strings

Filter by virtual server. Repeat or comma-separate for multiple values.

url_pattern
string

Filter by URL pattern substring.

status_code
string

Filter by status code. Supports exact values (e.g. 404) or ranges (e.g. 5xx).

Responses

200

Raw samples

400

Bad Request

500

Internal Error

get/api/irule-telemetry/irules/{name}/samples
/api/irule-telemetry/irules/{name}/samples

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "irule_name": "string",
  • "time_range":
    {
    },
  • "total": 0,
  • "samples":
    [
    ],
  • "next_cursor": "string"
}

Get raw sample detail

Returns the full per-request detail for a single sampled request. Used by the right-hand-side request detail panel.

path Parameters
name
required
string

Name of the telemetry source. When reading from ClickHouse this maps to the BIG-IP hostname that produced the samples.

id
required
string

Stable sample identifier returned by the raw samples endpoint.

query Parameters
device
Array of strings

Filter by BIG-IP device hostname. Repeat or comma-separate for multiple devices.

Responses

200

Sample detail

400

Bad Request

404

Not Found

500

Internal Error

get/api/irule-telemetry/irules/{name}/samples/{id}
/api/irule-telemetry/irules/{name}/samples/{id}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "sample_id": "string",
  • "timestamp": "2026-10-29T14:03:00Z",
  • "method": "string",
  • "url": "string",
  • "sanitized_path": "string",
  • "status_code": 0,
  • "latency_ms": 0,
  • "server_ms": 0,
  • "ttfb_ms": 0,
  • "ssl_ms": 0,
  • "node_response_ms": 0,
  • "node_total_ms": 0,
  • "node_connect_ms": 0,
  • "node_queue_ms": 0,
  • "tcp_rtt_ms": 0,
  • "node_tcp_rtt": 0,
  • "client_ip": "string",
  • "xff_1": "string",
  • "virtual_server": "string",
  • "pool_name": "string",
  • "node_addr": "string",
  • "node_port": 0,
  • "node_name": "string",
  • "outcome": "SUCCESS",
  • "latency_band": "FAST",
  • "severity": "NORMAL",
  • "content_type": "string",
  • "tls_version": "string",
  • "tls_cipher": "string",
  • "req_size": 0,
  • "resp_size": 0,
  • "host": "string",
  • "server_header": "string",
  • "bytes": 0,
  • "pool_member": "string",
  • "trace":
    {
    },
  • "client_port": 0,
  • "user_agent": "string",
  • "irule_fired": true,
  • "significance": "string"
}

Get filter metadata

Returns canonical filter values and time range options for the iRule telemetry UI.

Responses

200

Filter metadata

500

Internal Error

get/api/irule-telemetry/filters
/api/irule-telemetry/filters

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "outcomes":
    [
    ],
  • "latency_bands":
    [
    ],
  • "severities":
    [
    ],
  • "http_methods":
    [
    ],
  • "time_ranges":
    [
    ],
  • "devices":
    [
    ],
  • "virtual_servers":
    [
    ]
}

others

Other endpoints

AddDataCenter

Add a new data center to F5 Insights fleet.

Request Body schema: application/json

Details of the data center to be added.

id
string <uuid>

Unique identifier for the data center

name
required
string <= 255 characters

Name of the Data Center.

Responses

200

Data center added successfully.

400

Validation error.

500

Internal server error.

post/api/device-management/data-centers
/api/device-management/data-centers

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "id": "string",
  • "name": "string"
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "message": "Data center added successfully",
  • "id": "string"
}

GetDataCenters

Retrieve all Data Centers.

Responses

200

List of all data centers.

400

Validation error.

500

Internal server error.

get/api/device-management/data-centers
/api/device-management/data-centers

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "data_centers":
    [
    ]
}

AddTrustStore

certificate for TLS connections.

Request Body schema: application/json

Certificate details and content.

name
required
string <= 255 characters

Name of the certificate

description
string

Description of the certificate

certificate_content
required
string

PEM encoded certificate content

Responses

201

Certificate uploaded successfully.

400

Validation error.

500

Internal server error.

post/api/device-management/trust-store
/api/device-management/trust-store

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "name": "string",
  • "description": "string",
  • "certificate_content": "string"
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "id": "string",
  • "name": "string",
  • "description": "string",
  • "created_at": "2026-10-29T14:03:00Z"
}

GetTrustStores

Retrieve all certificates from trust store.

Responses

200

List of certificates.

500

Internal server error.

get/api/device-management/trust-store
/api/device-management/trust-store

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "trust_stores":
    [
    ]
}

GetTrustStore

Retrieve a specific certificate by ID from trust store.

path Parameters
id
required
string <uuid>

Certificate ID

Responses

200

Certificate details.

404

Certificate not found.

500

Internal server error.

get/api/device-management/trust-store/{id}
/api/device-management/trust-store/{id}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "id": "string",
  • "name": "string",
  • "description": "string",
  • "certificate_content": "string",
  • "created_at": "2026-10-29T14:03:00Z",
  • "last_modified": "2026-10-29T14:03:00Z"
}

DeleteTrustStore

Delete a certificate from trust store.

path Parameters
id
required
string <uuid>

Certificate ID

Responses

200

Certificate deleted successfully.

404

Certificate not found.

409

Certificate is in use by devices.

500

Internal server error.

delete/api/device-management/trust-store/{id}
/api/device-management/trust-store/{id}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "message": "Operation successful"
}

AddDevice

Onboard a device (BIG-IP or F5OS) to F5 Insights fleet. The deviceType field selects the kind; defaults to bigip.

Request Body schema: application/json

Details of the device to be added (BIG-IP or F5OS).

deviceType
required
string
Default: "bigip"
retention
string (Retention) ^P(\d+Y)?(\d+M)?(\d+D)?(T(\d+H)?(\d+M)?(\d+S)?)?$

ISO 8601 duration (e.g., P1Y for 1 year, P30D for 30 days).Supported units are Y (years), M (months), D (days), H (hours), M (minutes), S (seconds). Internally converted and rounded up to whole days. Maximum allowed retention is 1 year (P1Y).

port
integer [ 1 .. 65535 ]
collection_interval
integer >= 1

Collection interval in seconds

max_concurrent_connections
integer [ 1 .. 20 ]

Maximum concurrent HTTP connections per device

tls_enabled
boolean
Default: false
ca
string <uuid>

CA certificate UUID from trust store

modules
object
id
string <uuid>

Unique identifier for the device

alias_name
string <= 100 characters
description
string <= 500 characters
username
required
string <= 255 characters
password
required
string <= 255 characters
data_center
required
string <= 255 characters
endpoint
required
string

Device endpoint in format ip:port or hostname:port (e.g., 192.168.1.100:443, bigip.example.com:8443).

Responses

200

Device added successfully.

400

Validation error.

500

Internal server error.

post/api/device-management/devices
/api/device-management/devices

Request samples

Content type
application/json
Example
Copy
Expand all Collapse all
{
  • "deviceType": "bigip",
  • "retention": "string",
  • "port": 1,
  • "collection_interval": 1,
  • "max_concurrent_connections": 1,
  • "tls_enabled": false,
  • "ca": "string",
  • "modules":
    {
    },
  • "id": "string",
  • "alias_name": "string",
  • "description": "string",
  • "username": "string",
  • "password": "string",
  • "data_center": "string",
  • "endpoint": "string"
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "message": "Device added successfully",
  • "id": "string"
}

GetDevices

Retrieve all devices (BIG-IP and F5OS) onboarded to F5 Insights with pagination and filtering support. Use deviceType to filter by kind.

query Parameters
page
integer >= 1
Default: 1

Page number for pagination (1-based).

size
integer >= 1

Number of items per page.

since
string <date-time>

Return only devices updated after this timestamp (ISO 8601 format). Use the lastSync value from previous response for delta updates.

search
string

Search term to filter devices by name, alias, or endpoint

sort
string

Sort order, e.g. 'name,-created_at' (prefix '-' for descending)

deviceType
string
Default: "all"
Enum: "all" "bigip" "f5os"

Filter by device kind. One of all, bigip, f5os. Defaults to all.

Responses

200

List of devices (BIG-IP and F5OS) with pagination metadata.

400

Validation error.

500

Internal server error.

get/api/device-management/devices
/api/device-management/devices

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "devices":
    [
    ],
  • "pagination":
    {
    }
}

UpdateDevice

Updates configuration of a device (BIG-IP or F5OS). The device kind is auto-detected from the id.

path Parameters
id
required
string

Unique identifier of the device to update (BIG-IP or F5OS).

Request Body schema: application/json

Updated details of the device.

retention
string (Retention) ^P(\d+Y)?(\d+M)?(\d+D)?(T(\d+H)?(\d+M)?(\d+S)?)?$

ISO 8601 duration (e.g., P1Y for 1 year, P30D for 30 days).Supported units are Y (years), M (months), D (days), H (hours), M (minutes), S (seconds). Internally converted and rounded up to whole days. Maximum allowed retention is 1 year (P1Y).

port
integer [ 1 .. 65535 ]
collection_interval
integer >= 1

Collection interval in seconds

max_concurrent_connections
integer [ 1 .. 20 ]

Maximum concurrent HTTP connections per device

tls_enabled
boolean
Default: false
ca
string <uuid>

CA certificate UUID from trust store

modules
object
id
string <uuid>

Unique identifier for the device

alias_name
string <= 100 characters
description
string <= 500 characters
username
required
string <= 255 characters
password
required
string <= 255 characters
data_center
required
string <= 255 characters
endpoint
required
string

Device endpoint in format ip:port or hostname:port (e.g., 192.168.1.100:443, bigip.example.com:8443).

Responses

200

Device updated successfully.

400

Validation error.

500

Internal server error.

put/api/device-management/devices/{id}
/api/device-management/devices/{id}

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "retention": "string",
  • "port": 1,
  • "collection_interval": 1,
  • "max_concurrent_connections": 1,
  • "tls_enabled": false,
  • "ca": "string",
  • "modules":
    {
    },
  • "id": "string",
  • "alias_name": "string",
  • "description": "string",
  • "username": "string",
  • "password": "string",
  • "data_center": "string",
  • "endpoint": "string"
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "message": "Device updated successfully",
  • "id": "string"
}

PartialUpdateDevice

Partially updates configuration of a device (BIG-IP or F5OS). Only provided fields are updated. The device kind is auto-detected from the id.

path Parameters
id
required
string

Unique identifier of the device to update (BIG-IP or F5OS).

Request Body schema: application/json

Partial device update. Only include fields that should be updated.

alias_name
string <= 100 characters
description
string <= 500 characters
username
string <= 255 characters
password
string <= 255 characters
endpoint
string
data_center
string <= 255 characters
retention
string (Retention) ^P(\d+Y)?(\d+M)?(\d+D)?(T(\d+H)?(\d+M)?(\d+S)?)?$

ISO 8601 duration (e.g., P1Y for 1 year, P30D for 30 days).Supported units are Y (years), M (months), D (days), H (hours), M (minutes), S (seconds). Internally converted and rounded up to whole days. Maximum allowed retention is 1 year (P1Y).

collection_interval
integer >= 1
max_concurrent_connections
integer [ 1 .. 20 ]

Maximum concurrent HTTP connections per device

tls_enabled
boolean
ca
string <uuid>
modules
object

Responses

200

Device partially updated successfully.

400

Validation error.

404

Device not found.

500

Internal server error.

patch/api/device-management/devices/{id}
/api/device-management/devices/{id}

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "alias_name": "string",
  • "description": "string",
  • "username": "string",
  • "password": "string",
  • "endpoint": "string",
  • "data_center": "string",
  • "retention": "string",
  • "collection_interval": 1,
  • "max_concurrent_connections": 1,
  • "tls_enabled": true,
  • "ca": "string",
  • "modules":
    {
    }
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "retention": "string",
  • "port": 0,
  • "collection_interval": 1,
  • "max_concurrent_connections": 1,
  • "tls_enabled": false,
  • "ca": "string",
  • "modules":
    {
    },
  • "id": "string",
  • "alias_name": "string",
  • "description": "string",
  • "username": "string",
  • "password": "string",
  • "data_center": "string",
  • "endpoint": "string",
  • "deviceName": "string",
  • "deviceVersion": "string",
  • "versionStatus": "AVAILABLE",
  • "devicePlatform": "string",
  • "deviceType": "bigip",
  • "schema": "http",
  • "type": "string",
  • "host": "string",
  • "status": "string",
  • "hardwareModel": "string",
  • "serialNumber": "string",
  • "osVersion": "string",
  • "osBuild": "string",
  • "lastSeenAt": "2026-10-29T14:03:00Z",
  • "canReactivate": true
}

GetDevice

Fetch details of a specific device (BIG-IP or F5OS). The device kind is auto-detected from the id.

path Parameters
id
required
string

Unique identifier of the device (BIG-IP or F5OS).

Responses

200

Device fetched successfully.

400

Validation error.

500

Internal server error.

get/api/device-management/devices/{id}
/api/device-management/devices/{id}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "retention": "string",
  • "port": 0,
  • "collection_interval": 1,
  • "max_concurrent_connections": 1,
  • "tls_enabled": false,
  • "ca": "string",
  • "modules":
    {
    },
  • "id": "string",
  • "alias_name": "string",
  • "description": "string",
  • "username": "string",
  • "password": "string",
  • "data_center": "string",
  • "endpoint": "string",
  • "deviceName": "string",
  • "deviceVersion": "string",
  • "versionStatus": "AVAILABLE",
  • "devicePlatform": "string",
  • "deviceType": "bigip",
  • "schema": "http",
  • "type": "string",
  • "host": "string",
  • "status": "string",
  • "hardwareModel": "string",
  • "serialNumber": "string",
  • "osVersion": "string",
  • "osBuild": "string",
  • "lastSeenAt": "2026-10-29T14:03:00Z",
  • "canReactivate": true
}

DeleteDevice

Delete a specific device (BIG-IP or F5OS). The device kind is auto-detected from the id.

path Parameters
id
required
string

Unique identifier of the device (BIG-IP or F5OS).

Responses

200

Device deleted successfully.

400

Validation error.

500

Internal server error.

delete/api/device-management/devices/{id}
/api/device-management/devices/{id}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "retention": "string",
  • "port": 1,
  • "collection_interval": 1,
  • "max_concurrent_connections": 1,
  • "tls_enabled": false,
  • "ca": "string",
  • "modules":
    {
    },
  • "id": "string",
  • "alias_name": "string",
  • "description": "string",
  • "username": "string",
  • "password": "string",
  • "data_center": "string",
  • "endpoint": "string"
}

RefreshDevice

Re-discover a device and refresh its inventory details (hardware model, serial number, OS version/build, status, last-seen). Supported for F5OS devices only; returns 400 for BIG-IP. The device kind is auto-detected from the id. This operation is synchronous.

path Parameters
id
required
string

Unique identifier of the device to refresh (F5OS).

Responses

200

Device refreshed successfully.

400

Validation error (e.g. refresh not supported for BIG-IP devices).

404

Device not found.

500

Internal server error.

post/api/device-management/devices/{id}/refresh
/api/device-management/devices/{id}/refresh

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "retention": "string",
  • "port": 0,
  • "collection_interval": 1,
  • "max_concurrent_connections": 1,
  • "tls_enabled": false,
  • "ca": "string",
  • "modules":
    {
    },
  • "id": "string",
  • "alias_name": "string",
  • "description": "string",
  • "username": "string",
  • "password": "string",
  • "data_center": "string",
  • "endpoint": "string",
  • "deviceName": "string",
  • "deviceVersion": "string",
  • "versionStatus": "AVAILABLE",
  • "devicePlatform": "string",
  • "deviceType": "bigip",
  • "schema": "http",
  • "type": "string",
  • "host": "string",
  • "status": "string",
  • "hardwareModel": "string",
  • "serialNumber": "string",
  • "osVersion": "string",
  • "osBuild": "string",
  • "lastSeenAt": "2026-10-29T14:03:00Z",
  • "canReactivate": true
}

GetDevicesByAutoScaleGroup

Retrieve all the devices that belong to a specific auto-scale group.

path Parameters
autoScaleGroupId
required
string <uuid>

Unique identifier of the auto-scale group.

query Parameters
page
integer >= 1
Default: 1

Page number for pagination (1-based).

size
integer >= 1

Number of items per page.

since
string <date-time>

Return only devices updated after this timestamp (ISO 8601 format). Use the lastSync value from previous response for delta updates.

sort
string

Sort order, e.g. 'name,-created_at' (prefix '-' for descending)

Responses

200

List of devices belonging to the specified auto-scale group.

400

Validation error.

404

Auto-scale group not found.

500

Internal server error.

get/api/device-management/devices/auto-scale/{autoScaleGroupId}
/api/device-management/devices/auto-scale/{autoScaleGroupId}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "devices":
    [
    ],
  • "pagination":
    {
    }
}

ValidateDeviceConnection

Validate connectivity from F5 Insights to a BIG-IP device using provided credentials.

Request Body schema: application/json

Device details required for connection validation.

retention
string (Retention) ^P(\d+Y)?(\d+M)?(\d+D)?(T(\d+H)?(\d+M)?(\d+S)?)?$

ISO 8601 duration (e.g., P1Y for 1 year, P30D for 30 days).Supported units are Y (years), M (months), D (days), H (hours), M (minutes), S (seconds). Internally converted and rounded up to whole days. Maximum allowed retention is 1 year (P1Y).

port
integer [ 1 .. 65535 ]
collection_interval
integer >= 1

Collection interval in seconds

max_concurrent_connections
integer [ 1 .. 20 ]

Maximum concurrent HTTP connections per device

tls_enabled
boolean
Default: false
ca
string <uuid>

CA certificate UUID from trust store

modules
object
id
string <uuid>

Unique identifier for the device

alias_name
string <= 100 characters
description
string <= 500 characters
username
required
string <= 255 characters
password
required
string <= 255 characters
data_center
required
string <= 255 characters
endpoint
required
string

Device endpoint in format ip:port or hostname:port (e.g., 192.168.1.100:443, bigip.example.com:8443).

Responses

200

Connection validation result.

400

Validation error.

500

Internal server error.

post/api/device-management/devices/connection/validate
/api/device-management/devices/connection/validate

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "retention": "string",
  • "port": 1,
  • "collection_interval": 1,
  • "max_concurrent_connections": 1,
  • "tls_enabled": false,
  • "ca": "string",
  • "modules":
    {
    },
  • "id": "string",
  • "alias_name": "string",
  • "description": "string",
  • "username": "string",
  • "password": "string",
  • "data_center": "string",
  • "endpoint": "string"
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "reachable": true,
  • "authenticated": true,
  • "message": "string"
}

List system alerts

Retrieve operational alerts with filtering by job, resource, status, severity, category, alertCode, and page/limit pagination.

query Parameters
page
integer >= 1
Default: 1
Example: page=1

Page number for pagination (1-based, default 1).

limit
integer [ 1 .. 100 ]
Default: 20
Example: limit=20

Number of records to return per page (default 20, max 100).

offset
integer >= 0
Default: 0
Example: offset=0

Optional offset count for pagination.

jobId
string <uuid>
Example: jobId=3fa85f64-5717-4562-b3fc-2c963f66afa6

Filter alerts for a specific autoscale job.

id
string <uuid>
Example: id=a1b2c3d4-e5f6-7890-abcd-ef1234567890

Exact lookup by alert UUID.

status
string
Enum: "ACTIVE" "ACKNOWLEDGED" "RESOLVED"
Example: status=ACTIVE

Filter by alert lifecycle status (ACTIVE, ACKNOWLEDGED, RESOLVED).

severity
string
Enum: "INFO" "WARNING" "HIGH" "CRITICAL"
Example: severity=WARNING

Filter by alert severity level (INFO, WARNING, HIGH, CRITICAL).

category
string
Example: category=LICENSING

Filter by functional category (AUTOSCALE, IP_POOL, LICENSING, INFRASTRUCTURE, GENERAL).

alertCode
string
Example: alertCode=JOB_LICENSE_POOL_DEPLETED

Filter by standardized alert code.

resourceType
string
Example: resourceType=JOB

Filter by target resource type (e.g. JOB, INSTANCE, IP_POOL).

resourceId
string
Example: resourceId=3fa85f64-5717-4562-b3fc-2c963f66afa6

Filter by target resource identifier.

sourceModule
string
Example: sourceModule=workflow/autoscale

Filter by source module emitting the alert.

Responses

200

Paginated collection of system alerts.

500

Internal server error.

get/api/provisioning/v1/alerts
/api/provisioning/v1/alerts

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "items":
    [
    ],
  • "pagination":
    {
    }
}

Get active alert counts summary

Returns aggregated active alert counts grouped by severity level for UI badges and dashboards.

query Parameters
jobId
string <uuid>
Example: jobId=3fa85f64-5717-4562-b3fc-2c963f66afa6

Filter alert summary for a specific autoscale job.

resourceType
string
Example: resourceType=JOB

Filter by target resource type.

resourceId
string
Example: resourceId=3fa85f64-5717-4562-b3fc-2c963f66afa6

Filter by target resource UUID.

category
string
Example: category=AUTOSCALE

Filter by functional category.

alertCode
string
Example: alertCode=JOB_AUTO_PAUSED

Filter summary by standardized alert code.

sourceModule
string
Example: sourceModule=workflow/autoscale

Filter summary by emitting source module.

severity
string
Enum: "INFO" "WARNING" "HIGH" "CRITICAL"
Example: severity=CRITICAL

Filter summary by alert severity.

Responses

200

Active alert counts breakdown.

500

Internal server error.

get/api/provisioning/v1/alerts/summary
/api/provisioning/v1/alerts/summary

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "activeCritical": 1,
  • "activeHigh": 0,
  • "activeWarning": 3,
  • "activeInfo": 2,
  • "totalActive": 6
}

Get alert details by ID

path Parameters
id
required
string <uuid>
Example: a1b2c3d4-e5f6-7890-abcd-ef1234567890

UUID of the alert.

Responses

200

Full alert details.

400

Invalid alert ID format.

404

Alert not found.

500

Internal server error.

get/api/provisioning/v1/alerts/{id}
/api/provisioning/v1/alerts/{id}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  • "fingerprint": "9f83c6b2aca0f1be92d4b2d354b32269a8e97f00e23812d4d8c65f80b99fa0c6",
  • "status": "ACTIVE",
  • "severity": "WARNING",
  • "category": "LICENSING",
  • "alertCode": "JOB_LICENSE_POOL_DEPLETED",
  • "title": "Job 'edge-autoscale-prod' license pool has no remaining capacity",
  • "message": "License pool 'BIG-IP-VE-Pool-1' has 0 available licenses. Next scale-out will fail.",
  • "sourceModule": "workflow/autoscale",
  • "resourceType": "JOB",
  • "resourceId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
  • "resourceName": "edge-autoscale-prod",
  • "details":
    {
    },
  • "remediation": "Procure or assign additional BIG-IP VE licenses in Fleet Manager.",
  • "occurrenceCount": 3,
  • "firstSeenAt": "2026-09-28T07:30:00Z",
  • "lastSeenAt": "2026-09-28T08:00:00Z",
  • "createdAt": "2026-09-28T07:30:00Z",
  • "updatedAt": "2026-09-28T08:00:00Z"
}

Acknowledge an active alert

path Parameters
id
required
string <uuid>
Example: a1b2c3d4-e5f6-7890-abcd-ef1234567890

UUID of the alert.

Request Body schema: application/json
acknowledgedBy
string

Username or email of the acknowledging operator.

Responses

200

Alert acknowledged successfully.

400

Invalid request payload or alert already resolved.

404

Alert not found.

500

Internal server error.

post/api/provisioning/v1/alerts/{id}/acknowledge
/api/provisioning/v1/alerts/{id}/acknowledge

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "acknowledgedBy": "admin@f5.com"
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "message": "alert acknowledged successfully"
}

Manually resolve/deactivate an alert

path Parameters
id
required
string <uuid>
Example: a1b2c3d4-e5f6-7890-abcd-ef1234567890

UUID of the alert.

Request Body schema: application/json
resolvedBy
string

Username or email of the resolving operator.

reason
string

Freeform description of the resolution action taken.

Responses

200

Alert resolved successfully.

400

Invalid request payload.

404

Alert not found.

500

Internal server error.

post/api/provisioning/v1/alerts/{id}/resolve
/api/provisioning/v1/alerts/{id}/resolve

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "resolvedBy": "admin@f5.com",
  • "reason": "Procured 5 additional BIG-IP VE registration keys and verified capacity in license pool."
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "message": "alert resolved successfully"
}

List IP pools

List IP pools using optional exact-match filters combined with AND before pagination. Blank filter values are ignored; duplicate or invalid nonblank values return 400.

query Parameters
id
string <uuid>

Match the pool UUID exactly.

name
string

Match the complete case-sensitive pool name; commas and nonblank whitespace are literal.

addressFamily
string
Enum: "IPv4" "IPv6"

Match the documented address family and casing exactly.

address
string

Valid IPv4 or IPv6 CIDR, matched as the exact stored text rather than subnet containment.

gateway
string

Valid IPv4 or IPv6 gateway address, matched as the exact stored text.

totalAddressCount
integer <int32> [ 0 .. 2147483647 ]

Exact usable address count, including zero.

$top
integer >= 1

Maximum number of records to return.

$skip
integer >= 0

Number of records to skip before returning results.

Responses

200

A paginated collection of IP pools.

400

Invalid list filters and control/path binding failures return a single msg. Existing application validation errors retain their structured response.

500

An unexpected error occurred.

get/api/provisioning/v1/ip-pools
/api/provisioning/v1/ip-pools

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "items":
    [
    ],
  • "totalItems": 0
}

Create IP pool

Create a new IP pool with CIDR definition and address ranges.

Request Body schema: application/json
name
required
string [ 1 .. 255 ] characters ^[a-zA-Z_][a-zA-Z0-9_.\-]*$

Pool name. Rules:

  • Minimum length: 1 character
  • Maximum length: 255 characters
  • First character must be a letter (a-z, A-Z) or underscore (_)
  • Remaining characters may be letters, digits, hyphens (-), underscores (_), or dots (.)
  • The following reserved words are not allowed: all, delete, disable, enable, help, list, none, show, None
description
string
addressFamily
string
Enum: "IPv4" "IPv6"

Address family of the pool. When omitted, it is inferred from the CIDR (IPv4 or IPv6).

address
required
string
gateway
string Nullable
addressRanges
required
Array of objects (AddressRange) non-empty

Responses

201

IP pool created successfully.

400

The request payload or parameters were invalid.

500

An unexpected error occurred.

post/api/provisioning/v1/ip-pools
/api/provisioning/v1/ip-pools

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "name": "string",
  • "description": "string",
  • "addressFamily": "IPv4",
  • "address": "10.0.0.0/24",
  • "gateway": "string",
  • "addressRanges":
    [
    ]
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "id": "string",
  • "name": "string",
  • "description": "string",
  • "addressFamily": "IPv4",
  • "address": "10.0.0.0/24",
  • "gateway": "10.0.0.1",
  • "addressRanges":
    [
    ],
  • "totalAddressCount": 0,
  • "createdAt": "2026-10-29T14:03:00Z",
  • "updatedAt": "2026-10-29T14:03:00Z",
  • "deletedAt": "2026-10-29T14:03:00Z"
}

Get IP pool

Fetch an IP pool by its identifier.

path Parameters
poolId
required
string <uuid>

UUID of the IP pool.

Responses

200

IP pool details.

400

The request payload or parameters were invalid.

404

Requested resource was not found.

500

An unexpected error occurred.

get/api/provisioning/v1/ip-pools/{poolId}
/api/provisioning/v1/ip-pools/{poolId}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "id": "string",
  • "name": "string",
  • "description": "string",
  • "addressFamily": "IPv4",
  • "address": "10.0.0.0/24",
  • "gateway": "10.0.0.1",
  • "addressRanges":
    [
    ],
  • "totalAddressCount": 0,
  • "createdAt": "2026-10-29T14:03:00Z",
  • "updatedAt": "2026-10-29T14:03:00Z",
  • "deletedAt": "2026-10-29T14:03:00Z"
}

Update IP pool

Replace the configuration of an existing IP pool.

path Parameters
poolId
required
string <uuid>

UUID of the IP pool.

Request Body schema: application/json
id
string <uuid>

Should match the path parameter; the server overwrites mismatched values.

name
required
string [ 1 .. 255 ] characters ^[a-zA-Z_][a-zA-Z0-9_.\-]*$

Pool name. Rules:

  • Minimum length: 1 character
  • Maximum length: 255 characters
  • First character must be a letter (a-z, A-Z) or underscore (_)
  • Remaining characters may be letters, digits, hyphens (-), underscores (_), or dots (.)
  • The following reserved words are not allowed: all, delete, disable, enable, help, list, none, show, None
description
string
addressFamily
string
Enum: "IPv4" "IPv6"

Address family of the pool. When omitted, it is inferred from the CIDR (IPv4 or IPv6).

address
required
string
gateway
string Nullable
addressRanges
required
Array of objects (AddressRange) non-empty

Responses

200

Updated IP pool.

400

The request payload or parameters were invalid.

404

Requested resource was not found.

500

An unexpected error occurred.

put/api/provisioning/v1/ip-pools/{poolId}
/api/provisioning/v1/ip-pools/{poolId}

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "id": "string",
  • "name": "string",
  • "description": "string",
  • "addressFamily": "IPv4",
  • "address": "10.0.0.0/24",
  • "gateway": "string",
  • "addressRanges":
    [
    ]
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "id": "string",
  • "name": "string",
  • "description": "string",
  • "addressFamily": "IPv4",
  • "address": "10.0.0.0/24",
  • "gateway": "10.0.0.1",
  • "addressRanges":
    [
    ],
  • "totalAddressCount": 0,
  • "createdAt": "2026-10-29T14:03:00Z",
  • "updatedAt": "2026-10-29T14:03:00Z",
  • "deletedAt": "2026-10-29T14:03:00Z"
}

Delete IP pool

Permanently remove an IP pool. The operation fails if the pool still has active leases.

path Parameters
poolId
required
string <uuid>

UUID of the IP pool.

Responses

204

Pool deleted successfully.

400

The request payload or parameters were invalid.

409

Pool cannot be deleted because of active leases or validation errors.

500

An unexpected error occurred.

delete/api/provisioning/v1/ip-pools/{poolId}
/api/provisioning/v1/ip-pools/{poolId}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "error": "string"
}

Allocate IP address

Allocate an IP address from the specified pool. The request is idempotent on allocationId.

path Parameters
poolId
required
string <uuid>

UUID of the IP pool.

Request Body schema: application/json
allocationId
required
string

Identifier used to make allocation idempotent.

leaseTags
Array of objects (Tag)

Optional labels applied to the resulting lease.

Responses

200

Allocation succeeded and returns the resulting lease.

400

The request payload or parameters were invalid.

409

Allocation failed due to conflicts such as exhausted address space.

500

An unexpected error occurred.

post/api/provisioning/v1/ip-pools/{poolId}/allocate
/api/provisioning/v1/ip-pools/{poolId}/allocate

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "allocationId": "string",
  • "leaseTags":
    [
    ]
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "lease":
    {
    },
  • "poolId": "string",
  • "allocationId": "string"
}

Release IP address(es)

Release one or more leases that match the provided criteria (allocation ID, address, or tags).

path Parameters
poolId
required
string <uuid>

UUID of the IP pool.

Request Body schema: application/json
Any of
  • object
  • object
  • object
allocationId
required
string Nullable
address
string Nullable
leaseTags
Array of objects (Tag)

Responses

200

Leases successfully released (if any matched the filters).

400

The request payload or parameters were invalid.

500

An unexpected error occurred.

post/api/provisioning/v1/ip-pools/{poolId}/release
/api/provisioning/v1/ip-pools/{poolId}/release

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "allocationId": "string",
  • "address": "10.0.0.10",
  • "leaseTags":
    [
    ]
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "items":
    [
    ],
  • "totalItems": 0
}

List leases for pool

List leases in the specified pool using optional exact-match filters combined with AND. Query parameters cannot change the pool specified in the path. Blank filter values are ignored; duplicate or invalid nonblank values return 400.

path Parameters
poolId
required
string <uuid>

UUID of the IP pool.

query Parameters
id
string <uuid>

Match the lease UUID exactly within this pool.

address
string

Valid individual IPv4 or IPv6 address, matched as the exact stored text.

gateway
string

Valid individual IPv4 or IPv6 gateway address, matched as the exact stored text.

allocationId
string

Match the complete case-sensitive allocation identifier. This is a string, not necessarily a UUID.

Responses

200

Collection of leases for the pool.

400

Invalid list filters and control/path binding failures return a single msg. Existing application validation errors retain their structured response.

500

An unexpected error occurred.

get/api/provisioning/v1/ip-pools/{poolId}/leases
/api/provisioning/v1/ip-pools/{poolId}/leases

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "items":
    [
    ],
  • "totalItems": 0
}

Get lease by ID

Retrieve a specific lease by its identifier.

path Parameters
poolId
required
string <uuid>

UUID of the IP pool.

leaseId
required
string <uuid>

UUID of the IP lease.

Responses

200

Lease details.

400

The request payload or parameters were invalid.

404

Requested resource was not found.

500

An unexpected error occurred.

get/api/provisioning/v1/ip-pools/{poolId}/leases/{leaseId}
/api/provisioning/v1/ip-pools/{poolId}/leases/{leaseId}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "id": "string",
  • "poolId": "string",
  • "address": "10.0.0.10",
  • "gateway": "string",
  • "allocationId": "string",
  • "deviceId": "string",
  • "leaseTags":
    [
    ],
  • "metadata": { },
  • "createdAt": "2026-10-29T14:03:00Z",
  • "updatedAt": "2026-10-29T14:03:00Z",
  • "deletedAt": "2026-10-29T14:03:00Z"
}

Release IP address(es) globally across all pools

Release one or more leases across all IP pools that match the provided allocation ID and optional lease tags.

Request Body schema: application/json
allocationId
required
string

Identifier of the allocation to release. This field is required and used to search across all pools.

leaseTags
Array of objects (Tag)

Optional labels to further filter leases. When provided, all tags must match (AND logic) for a lease to be released.

Responses

200

Leases successfully released (if any matched the criteria).

400

The request payload or parameters were invalid.

500

An unexpected error occurred.

post/api/provisioning/v1/ip-pools/release
/api/provisioning/v1/ip-pools/release

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "allocationId": "string",
  • "leaseTags":
    [
    ]
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "items":
    [
    ],
  • "totalItems": 0
}

Create manual lease

Manually create a lease for a specific address in a pool. Validates address belongs to pool ranges and enforces uniqueness.

Request Body schema: application/json
id
required
string <uuid>
poolId
required
string <uuid>
address
required
string
gateway
string Nullable
allocationId
string Nullable
deviceId
string <uuid> Nullable
leaseTags
Array of objects (Tag)
metadata
object
createdAt
required
string <date-time>
updatedAt
required
string <date-time>
deletedAt
string <date-time> Nullable

Responses

200

Lease created successfully.

400

The request payload or parameters were invalid.

409

Lease creation failed due to conflicts (address already allocated or allocationId in use).

500

An unexpected error occurred.

post/api/provisioning/v1/ip-pools/leases
/api/provisioning/v1/ip-pools/leases

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "id": "string",
  • "poolId": "string",
  • "address": "10.0.0.10",
  • "gateway": "string",
  • "allocationId": "string",
  • "deviceId": "string",
  • "leaseTags":
    [
    ],
  • "metadata": { },
  • "createdAt": "2026-10-29T14:03:00Z",
  • "updatedAt": "2026-10-29T14:03:00Z",
  • "deletedAt": "2026-10-29T14:03:00Z"
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "id": "string",
  • "poolId": "string",
  • "address": "10.0.0.10",
  • "gateway": "string",
  • "allocationId": "string",
  • "deviceId": "string",
  • "leaseTags":
    [
    ],
  • "metadata": { },
  • "createdAt": "2026-10-29T14:03:00Z",
  • "updatedAt": "2026-10-29T14:03:00Z",
  • "deletedAt": "2026-10-29T14:03:00Z"
}