Download OpenAPI specification:Download
Unified API for F5 Insight monitoring and analytics platform including device management, system operations, and AI-powered insights
JWT ACCESS TOKEN for authenticated requests.
IMPORTANT:
Example: Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
| Security Scheme Type | HTTP |
|---|---|
| HTTP Authorization Scheme | bearer |
| Bearer format | "JWT" |
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.
| federated | boolean Default: false When |
| username required | string Username for authentication |
| password required | string <password> User password |
Login successful
Redirect to the OIDC authorization endpoint. Returned only when federated=true and OIDC is configured.
Invalid request
Invalid credentials
Internal server error
{- "username": "admin",
- "password": "password123"
}{- "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
- "token_type": "Bearer",
- "expires_in": 900
}Refreshes the access token using the refresh token stored in httpOnly cookie. No request body required - refresh token is read from cookie.
Token refreshed successfully
Invalid or expired refresh token
Internal server error
{- "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
- "token_type": "Bearer",
- "expires_in": 900
}Logs out the user by revoking the refresh token stored in httpOnly cookie. No request body required - refresh token is read from cookie.
Logout successful
Internal server error
{- "message": "Operation successful"
}Change user password using username and password. Can be called either with or without Bearer token:
| username required | string Username |
| old_password required | string <password> Current password |
| new_password required | string <password> New password |
Password changed successfully
Invalid request
Invalid credentials or unauthorized
Internal server error
{- "username": "admin",
- "old_password": "oldpassword123",
- "new_password": "newpassword123"
}{- "message": "Operation successful"
}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.
| idp_type | string Enum: "ldap" "saml" Set to 'ldap' or 'saml' to show organization-scoped identity providers on the login page. |
Redirect to configured identity provider authorization endpoint
Invalid idp_type value or malformed request body
Internal server error
OIDC not configured
idp_type=ldap{- "error": "string"
}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.
| client_id required | string Service user client_id |
| client_secret required | string <password> Service user client_secret (surfaced at create/rotate) |
Machine authentication successful
Invalid request body
Invalid machine credentials
Internal server error
{- "client_id": "my-service-account",
- "client_secret": "FfDWHLqOGr1vdiJ3203EhwzzTac7hncm3ppgDDvfW4l8cOcChBPh4Q8zzyWsuxc7"
}{- "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
- "token_type": "Bearer",
- "expires_in": 900
}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.
| code required | string Authorization code returned by the identity provider |
| state required | string State parameter for CSRF protection |
Redirect to React SPA after successful token exchange
Missing or invalid parameters
Internal server error
OIDC not configured
{- "status": 0,
- "message": "string",
- "code": "string",
- "category": "string",
- "help": "string"
}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.
Session token retrieved successfully
No valid session cookie or session expired
Internal server error
OIDC not configured
{- "access_token": "string",
- "id_token": "string",
- "refresh_token": "string",
- "token_type": "Bearer",
- "expires_in": 0
}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.
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.
Current user permissions retrieved successfully
Unauthorized – missing or invalid JWT
Forbidden – role information missing from JWT context
Role not found
Internal server error
{- "user_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
- "role_id": "550e8400-e29b-41d4-a716-446655440001",
- "role_name": "Operator",
- "permissions": [
- "deviceManagement.get",
- "deviceManagement.post",
- "dashboards.post",
- "telemetry.get"
], - "grouped_permissions": {
- "deviceManagement": [
- "get",
- "post"
], - "dashboards": [
- "post"
], - "telemetry": [
- "get"
]
}
}| name required | string [ 1 .. 100 ] characters |
| description | string <= 500 characters |
| permissions required | Array of strings |
Role created successfully
Invalid role or permission
Admin role required
Role already exists
{- "name": "string",
- "description": "string",
- "permissions": [
- "string"
]
}{- "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": [
- "deviceManagement.get",
- "dashboards.get",
- "dashboards.post"
]
}Returns all available system roles with user counts. Used to populate the role selector when creating or updating a group mapping. Requires admin role.
| include_permissions | boolean Default: false Include permission mappings when available. |
List of roles retrieved successfully
Unauthorized – missing or invalid JWT
Caller is not an admin
Internal server error
{- "roles": [
- {
- "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"
}, - {
- "id": "550e8400-e29b-41d4-a716-446655440001",
- "name": "Operator",
- "description": "Device configuration and troubleshooting",
- "is_builtin": true,
- "user_count": 8,
- "created_at": "2026-01-01T00:00:00Z"
}
], - "total_count": 2
}| role_id required | string <uuid> |
| permissions required | Array of strings |
Role permissions replaced successfully
Invalid permission
Admin role required
Role not found
{- "permissions": [
- "string"
]
}{- "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": [
- "deviceManagement.get",
- "dashboards.get",
- "dashboards.post"
]
}| role_id required | string <uuid> |
Role deleted successfully
Admin role required or builtin role
Role not found
Role is builtin or still referenced
{- "error": "string"
}Returns a single role by its UUID, including its full permission list. Requires admin role.
| role_id required | string <uuid> UUID of the role to retrieve |
Role retrieved successfully
Unauthorized – missing or invalid JWT
Caller is not an admin
Role not found
Internal server error
{- "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": [
- "deviceManagement.get",
- "deviceManagement.post"
]
}Returns configured mappings grouped by identity provider and role. Requires admin role.
List of group mappings retrieved successfully
Unauthorized
Caller is not an admin
Internal server error
[- {
- "provider_id": "ldap-id-123",
- "role_id": "550e8400-e29b-41d4-a716-446655440000",
- "role": {
- "id": "550e8400-e29b-41d4-a716-446655440000",
- "role_name": "admin"
}, - "grouped_resource_attribute": [
- "bigip-admins",
- "network-operators"
], - "created_at": "2026-10-29T14:02:58Z",
- "updated_at": "2026-10-29T14:02:58Z",
- "created_by": "string",
- "updated_by": "string"
}
]Returns all provider-scoped grouped mappings for the given role_id. Requires admin role.
| role_id required | string <uuid> UUID of the F5 Insight role |
Group mappings retrieved successfully
Invalid role_id
Unauthorized
Caller is not an admin
Internal server error
[- {
- "provider_id": "ldap-id-123",
- "role_id": "550e8400-e29b-41d4-a716-446655440000",
- "role": {
- "id": "550e8400-e29b-41d4-a716-446655440000",
- "role_name": "admin"
}, - "grouped_resource_attribute": [
- "bigip-admins",
- "network-operators"
], - "created_at": "2026-10-29T14:02:58Z",
- "updated_at": "2026-10-29T14:02:58Z",
- "created_by": "string",
- "updated_by": "string"
}
]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.
| role_id required | string <uuid> UUID of the F5 Insight role |
| 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 |
Group mapping replaced successfully
Invalid request body or role_id not found
Unauthorized
Forbidden – admin role required
Internal server error
{- "provider_id": "ldap-id-123\"",
- "grouped_resource_attribute": [
- "bigip-admins",
- "network-operators"
]
}{- "provider_id": "ldap-id-123",
- "role_id": "550e8400-e29b-41d4-a716-446655440000",
- "role": {
- "id": "550e8400-e29b-41d4-a716-446655440000",
- "role_name": "admin"
}, - "grouped_resource_attribute": [
- "bigip-admins",
- "network-operators"
], - "created_at": "2026-10-29T14:02:58Z",
- "updated_at": "2026-10-29T14:02:58Z",
- "created_by": "string",
- "updated_by": "string"
}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.
| role_id required | string <uuid> UUID of the F5 Insight role |
| 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 |
Group mapping patched successfully
Invalid request body or role_id not found
Unauthorized
Forbidden – admin role required
Internal server error
{- "provider_id": "ldap-id-123",
- "grouped_resource_attribute": [
- "bigip-admins"
]
}{- "provider_id": "ldap-id-123",
- "role_id": "550e8400-e29b-41d4-a716-446655440000",
- "role": {
- "id": "550e8400-e29b-41d4-a716-446655440000",
- "role_name": "admin"
}, - "grouped_resource_attribute": [
- "bigip-admins",
- "network-operators"
], - "created_at": "2026-10-29T14:02:58Z",
- "updated_at": "2026-10-29T14:02:58Z",
- "created_by": "string",
- "updated_by": "string"
}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.
| role_id required | string <uuid> UUID of the F5 Insight role |
| provider_id required | string non-empty Identity provider ID |
Group mapping deleted successfully
Missing provider_id or invalid role_id
Unauthorized
Forbidden – admin role required
Group mapping not found
Internal server error
{- "provider_id": "ldap-id-123"
}{- "error": "string"
}Returns cached security insights from AIDF including alerts, calculated application scores, deductions, and device findings. Requires AIDF to be configured.
| start_time | string <date-time> |
| end_time | string <date-time> |
| devices | string Comma-separated device names to include in the scorecard |
AIDF insights retrieved successfully, grouped by application
Bad request or AIDF not configured
Internal server error
{- "fleetSecurityScore": {
- "total": 0,
- "grade": "A",
- "status": "string",
- "totalIssues": 0,
- "totalDeductions": 0,
- "appsEvaluated": 0
}, - "applications": [
- {
- "id": "string",
- "application": "string",
- "category": "string",
- "subcategory": "string",
- "confidence": 0,
- "device": "string",
- "host": "string",
- "virtualServer": "string",
- "score": 0,
- "scoringTotal": 0,
- "firstDetected": "2026-10-29T14:02:58Z",
- "deductions": [
- {
- "ruleId": "string",
- "points": 0,
- "reason": "string",
- "firstDetected": "2026-10-29T14:02:58Z"
}
], - "alerts": [
- {
- "id": "sec-001",
- "title": "Content Security Policy Missing",
- "message": "The Content-Security-Policy header is not configured for host legacy-app.corp.example.com",
- "severity": "medium",
- "category": "Header",
- "deviceName": "bigip-nyc-01.example.com",
- "host": "legacy-app.corp.example.com",
- "virtualServer": "/Common/vs_web_80",
- "firstDetected": "2026-02-02T08:09:00Z"
}
], - "deviceFindings": {
- "property1": {
- "property1": "string",
- "property2": "string"
}, - "property2": {
- "property1": "string",
- "property2": "string"
}
}
}
]
}Returns cached workload classification insights from AIDF. Classification traffic statistics are intentionally not exposed by this endpoint. Requires AIDF to be configured.
| start_time | string <date-time> |
| end_time | string <date-time> |
| devices | string Comma-separated device names to include |
AIDF classifications retrieved successfully (flattened feed items)
Bad request or AIDF not configured
Internal server error
[- {
- "id": "app-001",
- "title": "E-Commerce Application - Payment Gateway",
- "description": "High-value e-commerce application with PCI-DSS compliance requirements",
- "severity": "high",
- "status": "open",
- "category": "Application Discovery",
- "deviceName": "bigip-nyc-01.example.com",
- "host": "checkout.retailstore.example.com",
- "virtualServer": "/Common/vs_ecommerce_443",
- "firstDetected": "2026-01-15T09:15:00Z",
- "confidence": 0.97,
- "appCategory": "E-Commerce",
- "appSubcategory": "Payment Processing",
- "matchedRule": "Payment Gateway with PCI Compliance Indicators",
- "matchedRuleId": "string",
- "matchedRuleLabel": "string",
- "matchedRuleWeight": 0,
- "matchedSignals": {
- "uri": [
- "string"
], - "headers": [
- "string"
], - "cookies": [
- "string"
], - "userAgent": "string",
- "tlsVersion": "string",
- "cipherSuite": "string"
}
}
]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.
| 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 |
Paginated list of audit events
Unauthorized - authentication required or token invalid
Insufficient permissions (requires audit.read)
Internal Error
Audit storage (ClickHouse) unavailable
{- "events": [
- {
- "event_id": "550e8400-e29b-41d4-a716-446655440000",
- "session_id": "sess-abc123",
- "thread_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
- "interaction_id": "interact-xyz",
- "user_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
- "username": "admin",
- "event_type": "user_message",
- "message": "string",
- "tool_name": "list_pools",
- "tool_arguments": "{\"device_name\":\"bigip-01\"}",
- "tool_result": "string",
- "error_message": "string",
- "provider": "openai",
- "model": "gpt-4o",
- "ip_address": "192.168.1.***",
- "user_agent": "string",
- "timestamp": "2026-06-01T10:30:00Z",
- "duration_ms": 342,
- "outcome": "success",
- "extra": "string",
- "llm_usage": "string"
}
], - "pagination": {
- "page": 1,
- "pageSize": 20,
- "totalEvents": 87,
- "totalPages": 5
}
}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.
| view_sensitive | boolean Default: false Include unmasked PII in the CSV (requires audit.view_sensitive permission). |
| 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> |
Export ready for download (synchronous path, ≤10 000 rows)
Export queued for background processing (>10 000 rows)
Unauthorized - authentication required or token invalid
Insufficient permissions (requires audit.export)
Export exceeds the maximum row limit (5 000 000 rows)
Per-user concurrent export limit reached (max 5)
Internal Error
Audit storage unavailable
{- "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"
}{- "export_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
- "status": "ready",
- "download_url": "/api/audit/export/3fa85f64-5717-4562-b3fc-2c963f66afa6",
- "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
- "row_count": 42
}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.
| id required | string <uuid> Export ID returned by POST /audit/export. |
CSV file download
Unauthorized - authentication required or token invalid
Export not found or already downloaded
Export has expired (TTL exceeded)
Internal Error
{- "status": 401,
- "message": "Unauthorized"
}Returns a list of all backup and restore jobs
List of jobs
Failed to list backups
{- "success": true,
- "data": [
- {
- "id": "string",
- "name": "string",
- "operation": "backup",
- "backup_type": "full",
- "status": "pending",
- "phase": "string",
- "progress": 0,
- "message": "string",
- "file_name": "string",
- "file_size": 0,
- "storage_target_id": "string",
- "storage_target_name": "string",
- "encrypted": true,
- "error_message": "string",
- "started_at": "2026-10-29T14:02:58Z",
- "completed_at": "2026-10-29T14:02:58Z",
- "created_at": "2026-10-29T14:02:58Z"
}
]
}Triggers a backup operation. Returns a job ID to track progress.
| 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. |
Backup started
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.
Another backup/restore is in progress or the requested backup name is already taken
Failed to create the backup job
Platform manager is unavailable
{- "name": "string",
- "backup_type": "full",
- "passphrase": "stringstring",
- "storage_target": "string"
}{- "success": true,
- "data": {
- "id": "string",
- "name": "string",
- "operation": "backup",
- "backup_type": "full",
- "status": "pending",
- "phase": "string",
- "progress": 0,
- "message": "string",
- "file_name": "string",
- "file_size": 0,
- "storage_target_id": "string",
- "storage_target_name": "string",
- "encrypted": true,
- "error_message": "string",
- "started_at": "2026-10-29T14:02:58Z",
- "completed_at": "2026-10-29T14:02:58Z",
- "created_at": "2026-10-29T14:02:58Z"
}
}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).
Analysis result
Failed to calculate backup analysis
{- "success": true,
- "data": {
- "is_anomalous": false,
- "recent_size_bytes": 104857600,
- "rolling_avg_bytes": 99614720,
- "pct_of_avg": 105,
- "sample_size": 3
}
}Returns details of a specific backup job including live progress
| id required | string <uuid> |
Backup details
Backup not found
{- "success": true,
- "data": {
- "id": "string",
- "name": "string",
- "operation": "backup",
- "backup_type": "full",
- "status": "pending",
- "phase": "string",
- "progress": 0,
- "message": "string",
- "file_name": "string",
- "file_size": 0,
- "storage_target_id": "string",
- "storage_target_name": "string",
- "encrypted": true,
- "error_message": "string",
- "started_at": "2026-10-29T14:02:58Z",
- "completed_at": "2026-10-29T14:02:58Z",
- "created_at": "2026-10-29T14:02:58Z"
}
}Deletes a backup file and its job record
| id required | string <uuid> |
Backup deleted
Backup not found
Failed to delete the backup
{- "success": true,
- "data": {
- "message": "string"
}
}Downloads the backup archive file
| id required | string <uuid> |
Backup file stream
Backup not found
{- "success": false,
- "error": {
- "code": "SYSTEM-0002",
- "status": 409,
- "message": "An upgrade is already in progress",
- "help": "Wait for the current upgrade to complete or check status at /api/system/upgrade/status"
}
}Triggers a restore from the specified backup
| id required | string <uuid> |
| 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) |
Restore started
Invalid request
Backup, backup file, or referenced storage target not found
Another operation is in progress
Failed to start the restore job
Platform manager is unavailable
{- "passphrase": "string",
- "components": [
- "data"
], - "force": true
}{- "success": true,
- "data": {
- "id": "string",
- "name": "string",
- "operation": "backup",
- "backup_type": "full",
- "status": "pending",
- "phase": "string",
- "progress": 0,
- "message": "string",
- "file_name": "string",
- "file_size": 0,
- "storage_target_id": "string",
- "storage_target_name": "string",
- "encrypted": true,
- "error_message": "string",
- "started_at": "2026-10-29T14:02:58Z",
- "completed_at": "2026-10-29T14:02:58Z",
- "created_at": "2026-10-29T14:02:58Z"
}
}Upload a backup .tar file from another system without restoring
| backup required | string <binary> Backup .tar file |
Backup uploaded
Invalid request
Failed to save the uploaded backup
{- "success": true,
- "data": {
- "id": "string",
- "name": "string",
- "operation": "backup",
- "backup_type": "full",
- "status": "pending",
- "phase": "string",
- "progress": 0,
- "message": "string",
- "file_name": "string",
- "file_size": 0,
- "storage_target_id": "string",
- "storage_target_name": "string",
- "encrypted": true,
- "error_message": "string",
- "started_at": "2026-10-29T14:02:58Z",
- "completed_at": "2026-10-29T14:02:58Z",
- "created_at": "2026-10-29T14:02:58Z"
}
}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.
| 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. |
Backup imported
Invalid request or file not found
Backup already imported
Failed to import the backup
Storage target or platform manager unreachable
{- "storage_target": "string",
- "file_path": "string"
}{- "success": true,
- "data": {
- "id": "string",
- "name": "string",
- "operation": "backup",
- "backup_type": "full",
- "status": "pending",
- "phase": "string",
- "progress": 0,
- "message": "string",
- "file_name": "string",
- "file_size": 0,
- "storage_target_id": "string",
- "storage_target_name": "string",
- "encrypted": true,
- "error_message": "string",
- "started_at": "2026-10-29T14:02:58Z",
- "completed_at": "2026-10-29T14:02:58Z",
- "created_at": "2026-10-29T14:02:58Z"
}
}Lists rows from backup_restore.backup_files, independent of any specific backup/restore job. Powers the restore job's file-picker UI.
| 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 |
Paginated list of backup files
Authentication required
{- "data": [
- {
- "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
}
], - "pagination": {
- "page": 0,
- "page_size": 0,
- "total": 0,
- "total_pages": 0
}
}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.
| backupFileIds required | Array of strings <uuid> [ 1 .. 100 ] items |
Per-file deletion results, including any partial failures
Invalid request
Authentication required
{- "backupFileIds": [
- "a1b2c3d4-0000-0000-0000-000000000001",
- "a1b2c3d4-0000-0000-0000-000000000002"
]
}{- "results": [
- {
- "backupFileId": "string",
- "status": "string",
- "errorCode": "string",
- "error": "string"
}
], - "deletedCount": 0,
- "failedCount": 0
}Returns metadata for one stored backup file by its ID.
| backupFileId required | string <uuid> The backup file ID. |
Backup file metadata
Authentication required
Resource not found
Internal server error
{- "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
}Deletes an available backup artifact and its metadata. Deletion is rejected while an active restore references the backup file.
| backupFileId required | string <uuid> Backup artifact identifier |
Backup file deleted
Authentication required
Resource not found
Backup file is not available for deletion or is in use by an active restore
Internal server error
{- "error": "string",
- "code": "string"
}Streams an available backup artifact as an attachment.
| backupFileId required | string <uuid> Backup artifact identifier |
Backup file stream
Partial backup file content for a satisfiable byte range.
Authentication required
Resource not found
Backup file is not available for download
Backup file has expired
Requested byte range cannot be satisfied.
Internal server error
{- "error": "string",
- "code": "string"
}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.
| 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. |
Paginated list of backup readiness runs
Authentication required
Internal server error
{- "data": [
- {
- "run_id": "string",
- "status": "PENDING",
- "device_count": 0,
- "pass_count": 0,
- "warn_count": 0,
- "fail_count": 0,
- "error_count": 0,
- "triggered_at": "2026-10-29T14:02:58Z",
- "completed_at": "2026-10-29T14:02:58Z"
}
], - "pagination": {
- "page": 0,
- "page_size": 0,
- "total": 0,
- "total_pages": 0
}
}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.
| 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. |
Readiness checks triggered — poll GET /backup/readiness/{runId} for results
Invalid request
Authentication required
Resource not found
Internal server error
{- "context": {
- "device_targets": [
- {
- "device_id": "string"
}
], - "storage_target": {
- "type": "local"
}, - "backup_type": "ucs",
- "total_device_count": 0
}, - "checks": [
- "backup_storage_capacity"
]
}{- "run_id": "string",
- "message": "string"
}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.
| runId required | string <uuid> The backup readiness run ID returned by POST /backup/readiness |
Backup readiness check results
Authentication required
Resource not found
Internal server error
{- "run_id": "string",
- "status": "PENDING",
- "device_count": 0,
- "pass_count": 0,
- "warn_count": 0,
- "fail_count": 0,
- "error_count": 0,
- "devices": [
- {
- "device_id": "string",
- "hostname": "string",
- "device_type": "BIGIP",
- "status": "PENDING",
- "current_step": "string",
- "check_results": [
- {
- "check_name": "string",
- "severity": "HARD",
- "status": "PASS",
- "message": "string",
- "detail": "string"
}
]
}
], - "triggered_at": "2026-10-29T14:02:58Z",
- "completed_at": "2026-10-29T14:02:58Z"
}List all active (non-expired, non-deleted) conversations for the authenticated user, sorted by most recent message.
List of conversations
Unauthorized - authentication required or token invalid
Internal Error
{- "conversations": [
- {
- "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
}
]
}Create a new conversation thread. Returns 429 if the user has reached the 50-thread cap.
| title | string <= 500 characters Optional conversation title |
Conversation created
Unauthorized - authentication required or token invalid
Maximum number of active conversations reached (50)
Internal Error
{- "title": "Troubleshoot VIP latency"
}{- "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 a conversation and its full message history. Returns 410 if the conversation has expired.
| id required | string <uuid> Conversation ID |
Conversation with messages
Unauthorized - authentication required or token invalid
Conversation not found
Conversation has expired
Internal Error
{- "conversation": {
- "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
}, - "messages": [
- {
- "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
}
], - "context_summarized": true
}Soft-delete a conversation. The conversation will be retained for 30 days for audit purposes before hard-deletion.
| id required | string <uuid> Conversation ID |
Conversation deleted
Unauthorized - authentication required or token invalid
Conversation not found
Internal Error
{- "status": 401,
- "message": "Unauthorized"
}Add a message to a conversation. Resets the 24-hour TTL rolling window. Returns 410 if the conversation has expired.
| id required | string <uuid> Conversation ID |
| role required | string Enum: "user" "assistant" Message sender role |
| content required | string Message content |
Message added
Invalid request (missing role/content or invalid role)
Unauthorized - authentication required or token invalid
Conversation not found
Conversation has expired
Internal Error
{- "role": "user",
- "content": "Can you check the pool member health?"
}{- "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
}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.
| type required | string Enum: "single" "conversation"
|
| conversation_id required | string <uuid> ID of the conversation to export |
| message_id | string <uuid> Required when |
| 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. |
PDF generated successfully — binary file download
Invalid request. Possible causes: - Missing or invalid type (must be single or conversation) - Missing conversation_id - type is single but message_id is absent
Unauthorized - authentication required or token invalid
Conversation not found, not owned by the authenticated user, or no messages matched for the given message_id.
Conversation has expired (past 24-hour TTL)
Internal Error
{- "type": "conversation",
- "conversation_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
}{- "status": 400,
- "message": "message_id is required for single response export"
}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.
| 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. |
Cloud environment listed successfully
Invalid list filter
Internal server error
[- {
- "id": "string",
- "name": "string",
- "isVmwCluster": true,
- "vmwProperties": {
- "cluster": "string",
- "datacenter": "string",
- "user": "string",
- "password": "string",
- "vmImage": "string",
- "networkInterfaceMapping": [
- {
- "network": "string"
}
], - "ipPoolAliasMapping": [
- {
- "alias": "string",
- "ipPoolReference": "string"
}
]
}, - "validationStatus": "PENDING",
- "validationErrors": [
- "string"
], - "createdAt": "2026-10-29T14:02:58Z",
- "updatedAt": "2026-10-29T14:02:58Z"
}
]Creates a new VMware cloud environment for auto-scaling.
| 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) |
Cloud environment created successfully
Bad request - validation failed
Provider or device template not found
Conflict - environment with same name already exists
Internal server error
{- "name": "string",
- "isVmwCluster": true,
- "vmwProperties": {
- "cluster": "string",
- "datacenter": "string",
- "user": "string",
- "password": "pa$$word",
- "vmImage": "string",
- "networkInterfaceMapping": [
- {
- "network": "string"
}
], - "ipPoolAliasMapping": [
- {
- "alias": "string",
- "ipPoolReference": "string"
}
]
}
}{- "id": "string",
- "name": "string",
- "isVmwCluster": true,
- "vmwProperties": {
- "cluster": "string",
- "datacenter": "string",
- "user": "string",
- "password": "string",
- "vmImage": "string",
- "networkInterfaceMapping": [
- {
- "network": "string"
}
], - "ipPoolAliasMapping": [
- {
- "alias": "string",
- "ipPoolReference": "string"
}
]
}, - "validationStatus": "PENDING",
- "validationErrors": [
- "string"
], - "createdAt": "2026-10-29T14:02:58Z",
- "updatedAt": "2026-10-29T14:02:58Z"
}| environmentId required | string <uuid> UUID of the cloud environment |
Cloud environment returned successfully
Cloud environment not found
Internal server error
{- "id": "string",
- "name": "string",
- "isVmwCluster": true,
- "vmwProperties": {
- "cluster": "string",
- "datacenter": "string",
- "user": "string",
- "password": "string",
- "vmImage": "string",
- "networkInterfaceMapping": [
- {
- "network": "string"
}
], - "ipPoolAliasMapping": [
- {
- "alias": "string",
- "ipPoolReference": "string"
}
]
}, - "validationStatus": "PENDING",
- "validationErrors": [
- "string"
], - "createdAt": "2026-10-29T14:02:58Z",
- "updatedAt": "2026-10-29T14:02:58Z"
}| environmentId required | string <uuid> UUID of the cloud environment |
| name | string [ 1 .. 255 ] characters |
| isVmwCluster | boolean |
| vmwProperties | object (VMwareEnvironmentProperties) |
Cloud environment updated successfully
Bad request - validation failed
Cloud environment not found
Conflict - environment with same name already exists
Internal server error
{- "name": "string",
- "isVmwCluster": true,
- "vmwProperties": {
- "cluster": "string",
- "datacenter": "string",
- "user": "string",
- "password": "pa$$word",
- "vmImage": "string",
- "networkInterfaceMapping": [
- {
- "network": "string"
}
], - "ipPoolAliasMapping": [
- {
- "alias": "string",
- "ipPoolReference": "string"
}
]
}
}{- "id": "string",
- "name": "string",
- "isVmwCluster": true,
- "vmwProperties": {
- "cluster": "string",
- "datacenter": "string",
- "user": "string",
- "password": "string",
- "vmImage": "string",
- "networkInterfaceMapping": [
- {
- "network": "string"
}
], - "ipPoolAliasMapping": [
- {
- "alias": "string",
- "ipPoolReference": "string"
}
]
}, - "validationStatus": "PENDING",
- "validationErrors": [
- "string"
], - "createdAt": "2026-10-29T14:02:58Z",
- "updatedAt": "2026-10-29T14:02:58Z"
}Deletes an existing VMware cloud environment.
| environmentId required | string <uuid> UUID of the cloud environment |
Cloud environment deleted successfully
Bad request - environment is in use
Cloud environment not found
Internal server error
{- "code": 0,
- "message": "string",
- "details": "string",
- "timestamp": "2026-10-29T14:02:58Z"
}List cloud providers using optional exact-match filters combined with AND. Blank filter values are ignored; duplicate or invalid nonblank values return 400.
| 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. |
List of cloud providers retrieved successfully
Invalid list filter
Internal server error
[- {
- "id": "string",
- "providerType": "VMware",
- "name": "string",
- "vmwProperties": {
- "vCenterHostname": "example.com"
}, - "createdAt": "2026-10-29T14:02:58Z",
- "updatedAt": "2026-10-29T14:02:58Z"
}
]| providerType required | string Value: "VMware" Type of cloud provider |
| name required | string [ 1 .. 255 ] characters Name of the cloud provider |
| vmwProperties | object (VMwareProviderProperties) |
Cloud provider created successfully
Bad request - invalid input
Conflict - provider with same name already exists
Internal server error
{- "providerType": "VMware",
- "name": "string",
- "vmwProperties": {
- "vCenterHostname": "example.com"
}
}{- "id": "string",
- "providerType": "VMware",
- "name": "string",
- "vmwProperties": {
- "vCenterHostname": "example.com"
}, - "createdAt": "2026-10-29T14:02:58Z",
- "updatedAt": "2026-10-29T14:02:58Z"
}| providerId required | string <uuid> UUID of the cloud provider |
Cloud provider retrieved successfully
Bad request - invalid input
Resource not found
Internal server error
{- "id": "string",
- "providerType": "VMware",
- "name": "string",
- "vmwProperties": {
- "vCenterHostname": "example.com"
}, - "createdAt": "2026-10-29T14:02:58Z",
- "updatedAt": "2026-10-29T14:02:58Z"
}| providerId required | string <uuid> UUID of the cloud provider |
| name | string [ 1 .. 255 ] characters Name of the cloud provider |
| vmwProperties | object (VMwareProviderProperties) |
Cloud provider updated successfully
Bad request - invalid input
Resource not found
Conflict - provider with same name already exists
Internal server error
{- "name": "string",
- "vmwProperties": {
- "vCenterHostname": "example.com"
}
}{- "id": "string",
- "providerType": "VMware",
- "name": "string",
- "vmwProperties": {
- "vCenterHostname": "example.com"
}, - "createdAt": "2026-10-29T14:02:58Z",
- "updatedAt": "2026-10-29T14:02:58Z"
}| providerId required | string <uuid> UUID of the cloud provider |
Provider deleted successfully
Bad request - invalid input
Resource not found
Internal server error
{- "code": 0,
- "message": "string"
}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).
List of upgrade path rules
Authentication required
{- "data": [
- {
- "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"
}
], - "total": 0
}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:
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)| 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. |
Existing row updated (natural key already existed)
New row created (natural key did not previously exist)
Invalid request
Authentication required
{- "target_major_version": "21",
- "min_source_version": "14.0.0",
- "max_source_version": "string",
- "notes": "string"
}{- "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"
}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).
| compatId required | string <uuid> Unique ID of a compatibility matrix row. |
Upgrade path rule
Authentication required
Resource not found
{- "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"
}| compatId required | string <uuid> Unique ID of a compatibility matrix row. |
Row deleted
Authentication required
Resource not found
{- "error": "string",
- "code": "string"
}Current AI provider configuration
No configuration found
Internal server error
{- "provider_name": "string",
- "base_url": "string",
- "model": "string",
- "ca": "string",
- "skip_tls_verify": true
}| 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 |
Configuration saved successfully
Validation error
Internal server error
{- "provider_name": "string",
- "api_token": "string",
- "base_url": "string",
- "model": "string",
- "ca": "string",
- "skip_tls_verify": true
}{- "status": "validation_success"
}Configuration deleted successfully
Configuration not found
Internal server error
{- "status": "validation_success"
}Current AIDF configuration
No configuration found
Internal server error
{- "endpoint": "string",
- "tenant_id": "string",
- "data_types": [
- "logs"
]
}| 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. |
Configuration saved successfully
Validation error
Internal server error
{- "endpoint": "string",
- "tenant_id": "string",
- "tenant_token": "string",
- "data_types": [
- "logs",
- "metrics"
]
}{- "status": "validation_success"
}Configuration deleted successfully
Configuration not found
Internal server error
{- "status": "validation_success"
}Health probe for F5 license activation server reachability (DNS, TCP 443, TLS certificate)
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:
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.
Connectivity report (always 200; individual failures are inside the payload)
Unauthorized
{- "servers": [
- {
- "role": "prod",
- "host": "activate.f5.com",
- "reachable": true,
- "dns": {
- "ok": true,
- "addresses": [
- "107.162.235.62"
]
}, - "tcp": {
- "ok": true,
- "port": "443",
- "latencyMs": 12
}, - "cert": {
- "ok": true,
- "notAfter": "2027-06-15T23:59:59Z",
- "daysRemaining": 265
}
}, - {
- "role": "dev",
- "host": "authem.f5net.com",
- "reachable": true,
- "dns": {
- "ok": true,
- "addresses": [
- "172.23.240.12"
]
}, - "tcp": {
- "ok": true,
- "port": "443",
- "latencyMs": 5
}, - "cert": {
- "ok": true,
- "notAfter": "2027-03-01T12:00:00Z",
- "daysRemaining": 158
}
}
], - "checkedAt": "2026-09-23T16:06:12Z"
}Returns all available license pools across every pool type.
| $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 |
List of license pools
Bad request
Unauthorized
Internal server error
{- "items": [
- {
- "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:58Z",
- "expirationDate": "2026-10-29T14:02:58Z",
- "createdAt": "2026-10-29T14:02:58Z",
- "updatedAt": "2026-10-29T14:02:58Z"
}
], - "totalItems": 0,
- "tasks": [
- {
- "id": "d4e5f6a7-b8c9-0123-defg-456789abcdef",
- "type": "ASSIGN_LICENSE",
- "status": "IN_PROGRESS",
- "progress": 50,
- "resourceType": "Utility",
- "resourceId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
- "resources": [
- {
- "resourceId": "string",
- "resourceType": "LicenseMember",
- "status": "PENDING",
- "error": {
- "code": 400,
- "message": "The license U5939-99933-49705-74523-4841009 has been granted to a device",
- "details": "string",
- "timestamp": "2026-10-29T14:02:58Z"
}
}
], - "error": {
- "code": 400,
- "message": "The license U5939-99933-49705-74523-4841009 has been granted to a device",
- "details": "string",
- "timestamp": "2026-10-29T14:02:58Z"
}, - "createdAt": "2026-10-29T14:02:58Z",
- "startedAt": "2026-10-29T14:02:58Z",
- "completedAt": "2026-10-29T14:02:58Z"
}
], - "pagination": {
- "page": 1,
- "page_size": 1,
- "total": 0,
- "total_pages": 0
}
}Returns all license assignments (members) across every license pool.
| $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 |
List of license assignments
Bad request
Unauthorized
Internal server error
{- "items": [
- {
- "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
- "deviceAddress": "192.168.1.100",
- "deviceName": "bigip-ve-001.local",
- "deviceMacAddress": "00:1A:2B:3C:4D:5E",
- "deviceLicenseText": "string",
- "status": "LICENSED",
- "taskId": "d4e5f6a7-b8c9-0123-defg-456789abcdef",
- "poolId": "7dd7b971-6eb8-4b9e-995b-1dcb1287d65f",
- "poolName": "Production License Pool",
- "poolType": "regkey",
- "regKey": "L4946-10909-05786-22315-2721400",
- "offeringId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
- "assignedAt": "2026-10-29T14:02:58Z",
- "tenantName": "bigip-ve-001.local",
- "offering": "U5939-99933-49705-74523-4841009",
- "revokedAt": "2026-10-29T14:02:58Z"
}
], - "totalItems": 0,
- "pagination": {
- "page": 1,
- "page_size": 1,
- "total": 0,
- "total_pages": 0
}
}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.
| id required | string <uuid> Unique identifier of the license assignment (member) |
| $select | string Comma-separated list of fields to include in the response |
License assignment details
Bad request
Unauthorized
Assignment not found
Internal server error
{- "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
- "deviceAddress": "192.168.1.100",
- "deviceName": "bigip-ve-001.local",
- "deviceMacAddress": "00:1A:2B:3C:4D:5E",
- "deviceLicenseText": "string",
- "status": "LICENSED",
- "taskId": "d4e5f6a7-b8c9-0123-defg-456789abcdef",
- "poolId": "7dd7b971-6eb8-4b9e-995b-1dcb1287d65f",
- "poolName": "Production License Pool",
- "poolType": "regkey",
- "regKey": "L4946-10909-05786-22315-2721400",
- "offeringId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
- "assignedAt": "2026-10-29T14:02:58Z",
- "tenantName": "bigip-ve-001.local",
- "offering": "U5939-99933-49705-74523-4841009",
- "revokedAt": "2026-10-29T14:02:58Z"
}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.
| id required | string <uuid> Unique identifier of the license assignment (member) |
| force | boolean Default: false When true, skip contacting the BIG-IP device and only clear the fleet-manager record. Device credentials are not required. |
| deviceUsername | string |
| devicePassword | string <password> |
License assignment revoked
Bad request (e.g. credentials required when not forcing)
Unauthorized
Assignment not found
Internal server error
{- "deviceUsername": "string",
- "devicePassword": "pa$$word"
}{- "code": 400,
- "message": "The license U5939-99933-49705-74523-4841009 has been granted to a device",
- "details": "string",
- "timestamp": "2026-10-29T14:02:58Z"
}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.
| id required | string <uuid> Unique identifier of the license assignment (member) to move |
| 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. |
Move operation accepted and task created
Bad request (e.g. invalid target pool, same pool move)
Unauthorized
Assignment or target pool not found
Internal server error
{- "targetPoolType": "regkey",
- "targetPoolId": "123e4567-e89b-12d3-a456-426614174000",
- "targetRegKey": "ABCDE-FGHIJ-KLMNO-PQRST-UVWXYZ"
}Delete a specific data center by its ID.
| id required | string <uuid> Unique identifier of the data center to delete. |
Data center deleted successfully.
Validation error.
Data center not found.
Cannot delete data center with associated devices.
Internal server error.
{- "status": 0,
- "message": "string",
- "code": "string",
- "category": "string",
- "help": "string"
}Retrieve all data centers with their registered devices.
| deviceType | string Default: "all" Enum: "all" "bigip" "f5os" Filter by device kind. One of all, bigip, f5os. Defaults to all. |
List of all data centers with their devices.
Internal server error.
{- "data_centers": [
- {
- "id": "string",
- "name": "string",
- "devices": [
- {
- "retention": "string",
- "port": 0,
- "collection_interval": 1,
- "max_concurrent_connections": 1,
- "tls_enabled": false,
- "ca": "string",
- "modules": {
- "apm": false,
- "cgnat": false,
- "dns": false,
- "dos": false,
- "firewall": false,
- "gtm": false,
- "policy_api_protection": false,
- "policy_asm": false,
- "policy_firewall": false,
- "policy_ip_intelligence": false,
- "policy_nat": false,
- "profile_dos": false
}, - "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:02:58Z",
- "canReactivate": true
}
], - "device_count": 0
}
], - "total_data_centers": 0,
- "total_devices": 0
}| product required | string Enum: "BIG-IP" "F5OS" Product family used to select release metadata (BIG-IP or F5OS). |
| version required | string Installed product version. |
The latest newer applicable critical release, returned as a one-item array for forward compatibility.
Missing or invalid query parameter.
Release metadata is unavailable.
[- {
- "product": "string",
- "release": "string",
- "releaseType": "string",
- "newVersion": "string",
- "impactDetails": [
- {
- "product": "string",
- "dataPlane": {
- "critical": true,
- "high": true
}, - "controlManagementPlane": {
- "critical": true,
- "high": true
}
}
]
}
]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.
Migration task information retrieved successfully
No migration tasks found
Internal server error
{- "task_id": "123e4567-e89b-12d3-a456-426614174000",
- "status": "INIT",
- "message": "Migration task created successfully. Use the task_id to query status."
}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.
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) |
Migration task created successfully. Use the returned task_id to query status.
Validation error in uploaded files.
A migration task is already in progress.
Internal server error.
{- "task_id": "123e4567-e89b-12d3-a456-426614174000",
- "status": "INIT",
- "message": "Migration task created successfully. Use the task_id to query status."
}Get the status of a device migration task including overall progress and individual device status.
| task_id required | string <uuid> The task ID returned from the migration request |
| 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) |
Migration status retrieved successfully
Task not found
Internal server error
{- "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": [
- {
- "device_name": "bigip/prod-01",
- "validation_status": "SUCCESS",
- "error_message": null,
- "created_at": "2026-01-29T10:30:00Z",
- "updated_at": "2026-01-29T10:32:00Z"
}
]
}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.
| task_id required | string <uuid> The task ID returned from the migration request |
| 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) |
Device progress retrieved successfully
Invalid request parameters
Task not found
Internal server error
{- "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": [
- {
- "id": "660e8400-e29b-41d4-a716-446655440001",
- "device_name": "bigip-prod-01.example.com",
- "status": "SUCCESS",
- "error_message": "Invalid credentials",
- "last_modified": "2026-01-30T12:12:00Z"
}
]
}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.
| task_id required | string <uuid> The task ID returned from the migration request |
| page | integer >= 1 Default: 1 Page number for pagination (1-based). |
| size | integer >= 1 Number of items per page. |
CA bundle list retrieved successfully
Invalid request parameters
Task not found
Internal server error
{- "task_id": "550e8400-e29b-41d4-a716-446655440000",
- "page": 1,
- "size": 20,
- "total": 5,
- "ca_bundles": [
- {
- "id": "660e8400-e29b-41d4-a716-446655440000",
- "name": "Production Root CA",
- "description": "Root CA for production environment",
- "certificate_content": "-----BEGIN CERTIFICATE-----\nMIIDXTCCAkWgA...\n-----END CERTIFICATE-----",
- "created_at": "2026-01-30T10:00:00Z",
- "last_modified": "2026-01-30T12:00:00Z"
}
]
}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.
| task_id required | string <uuid> The task ID to clean up |
| 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. |
Cleanup completed successfully
Task not found
Internal server error
{- "task_id": "123e4567-e89b-12d3-a456-426614174000",
- "deleted_devices": 10,
- "deleted_trust_stores": 5,
- "message": "Successfully cleaned up migration task staging data"
}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:
The retry process:
| task_id required | string <uuid> The task ID to retry failed devices for |
Retry initiated successfully. Use the same task_id to query status.
No failed devices to retry
Task not found
A migration task is already running
Internal server error
{- "message": "Retry task initiated successfully",
- "task_id": "123e4567-e89b-12d3-a456-426614174000"
}Retrieve details of a specific staging device including its validation status, configuration, and error messages if any.
| staging_device_id required | string <uuid> UUID of the staging device to retrieve |
Staging device retrieved successfully
Staging device not found
Internal server error
{- "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"
}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.
| staging_device_id required | string <uuid> UUID of the staging device to update |
| 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 |
Staging device updated and committed successfully
Device validation failed or invalid request
Staging device not found
Internal server error
{- "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": {
- "apm": true,
- "cgnat": true,
- "dns": true,
- "dos": true,
- "firewall": true,
- "gtm": true,
- "profile_dos": true,
- "policy_api_protection": true,
- "policy_asm": true,
- "policy_firewall": true,
- "policy_ip_intelligence": true,
- "policy_nat": true
}
}{- "message": "Staging device updated and committed successfully",
- "staging_device_id": "string"
}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.
| staging_ca_id required | string <uuid> UUID of the staging CA bundle to update |
| name required | string <= 255 characters Name of the certificate |
| description | string Description of the certificate |
| certificate_content required | string PEM encoded certificate content |
Staging CA bundle updated and committed successfully
Invalid certificate data
Staging CA bundle not found
Internal server error
{- "name": "string",
- "description": "string",
- "certificate_content": "string"
}{- "message": "Staging CA bundle updated and committed successfully",
- "staging_ca_id": "string"
}Synchronous migration of BIG-IP devices from AST configuration files (legacy endpoint). For better experience with large migrations, use the async endpoint instead.
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) |
Migration completed with summary of results.
Validation error in uploaded files.
Internal server error.
{- "total": 10,
- "successful": 8,
- "failed": 2,
- "results": [
- {
- "device_name": "bigip-prod-01",
- "status": "success",
- "message": "Device imported successfully",
- "device_id": "123e4567-e89b-12d3-a456-426614174000"
}
]
}Import multiple devices (BIG-IP and/or F5OS) to F5 Insights in a single operation.
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) |
Bulk import completed with summary of results.
Validation error.
Internal server error.
{- "devices": [
- {
- "deviceType": "bigip",
- "retention": "string",
- "port": 1,
- "collection_interval": 1,
- "max_concurrent_connections": 1,
- "tls_enabled": false,
- "ca": "string",
- "modules": {
- "apm": false,
- "cgnat": false,
- "dns": false,
- "dos": false,
- "firewall": false,
- "gtm": false,
- "policy_api_protection": false,
- "policy_asm": false,
- "policy_firewall": false,
- "policy_ip_intelligence": false,
- "policy_nat": false,
- "profile_dos": false
}, - "id": "string",
- "alias_name": "string",
- "description": "string",
- "username": "string",
- "password": "string",
- "data_center": "string",
- "endpoint": "string"
}
]
}{- "total": 10,
- "successful": 8,
- "failed": 2,
- "results": [
- {
- "device_name": "bigip-prod-01",
- "status": "success",
- "message": "Device imported successfully",
- "device_id": "123e4567-e89b-12d3-a456-426614174000"
}
]
}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.
Import task state and per-device results.
No import tasks found.
Internal server error.
{- "task_id": "string",
- "state": "INIT",
- "status": "RUNNING",
- "progress": 0,
- "total": 0,
- "successful": 0,
- "failed": 0,
- "error_message": "string",
- "items": [
- {
- "device_type": "bigip",
- "alias_name": "string",
- "endpoint": "string",
- "status": "pending",
- "device_id": "string",
- "error_message": "string"
}
], - "created_at": "2026-10-29T14:02:58Z",
- "updated_at": "2026-10-29T14:02:58Z"
}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.
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). |
Import task accepted. Poll the status endpoint with the returned task_id.
Validation error.
Internal server error.
{- "devices": [
- {
- "deviceType": "bigip",
- "retention": "string",
- "port": 1,
- "collection_interval": 1,
- "max_concurrent_connections": 1,
- "tls_enabled": false,
- "ca": "string",
- "modules": {
- "apm": false,
- "cgnat": false,
- "dns": false,
- "dos": false,
- "firewall": false,
- "gtm": false,
- "policy_api_protection": false,
- "policy_asm": false,
- "policy_firewall": false,
- "policy_ip_intelligence": false,
- "policy_nat": false,
- "profile_dos": false
}, - "id": "string",
- "alias_name": "string",
- "description": "string",
- "username": "string",
- "password": "string",
- "data_center": "string",
- "endpoint": "string"
}
]
}{- "task_id": "string",
- "message": "Import task accepted"
}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.
| task_id required | string <uuid> The import task ID to clean up |
| 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. |
Cleanup completed successfully
Task not found
Internal server error
{- "task_id": "123e4567-e89b-12d3-a456-426614174000",
- "message": "Successfully cleaned up import task"
}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.
| task_id required | string <uuid> Task id returned by POST /device-management/devices/import. |
Task state and per-device results.
Task not found.
Internal server error.
{- "task_id": "string",
- "state": "INIT",
- "status": "RUNNING",
- "progress": 0,
- "total": 0,
- "successful": 0,
- "failed": 0,
- "error_message": "string",
- "items": [
- {
- "device_type": "bigip",
- "alias_name": "string",
- "endpoint": "string",
- "status": "pending",
- "device_id": "string",
- "error_message": "string"
}
], - "created_at": "2026-10-29T14:02:58Z",
- "updated_at": "2026-10-29T14:02:58Z"
}| 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 |
Paginated list of device backup jobs
Authentication required
{- "data": [
- {
- "id": "a1b2c3d4-0000-0000-0000-000000000001",
- "workflowId": "wf-0000-0000-0000-000000000001",
- "name": "daily-backup-prod",
- "status": "READY",
- "enabled": true,
- "deviceCount": 3,
- "createdAt": "2026-08-01T09:00:00Z",
- "updatedAt": "2026-08-01T09:05:00Z"
}
], - "pagination": {
- "page": 1,
- "page_size": 20,
- "total": 1,
- "total_pages": 1
}
}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.
| 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). |
Device backup job created
Invalid request
Authentication required
Job name already exists
{- "name": "daily-backup-prod",
- "description": "Daily UCS backup for prod devices",
- "config": {
- "batchSize": 5,
- "backupFileName": "prod-daily",
- "deviceTargets": [
- {
- "deviceId": "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
}, - {
- "deviceId": "bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb"
}
], - "instanceType": "BIG-IP",
- "validateBackup": true,
- "includePrivateKeys": true,
- "retention": {
- "retentionDays": 30
}
}
}{- "id": "string",
- "workflowId": "string",
- "workflowJobId": "string",
- "name": "string",
- "description": "string",
- "status": "DRAFT",
- "enabled": true,
- "config": {
- "instanceType": "BIG-IP",
- "validateBackup": true,
- "includePrivateKeys": true,
- "backupType": "ucs",
- "batchSize": 1,
- "backupFileName": "string",
- "deviceTargets": [
- {
- "deviceId": "string"
}
], - "encryption": {
- "passphraseSet": true
}, - "retention": {
- "doNotDelete": true,
- "retentionDays": 0,
- "retentionCount": 0
}, - "storageTarget": "string",
- "schedule": {
- "backupFrequency": "daily",
- "activeDays": [
- "MON",
- "WED",
- "FRI"
], - "dayOfMonth": 1,
- "timezone": "UTC",
- "startDateTime": "2026-10-29T14:02:58Z",
- "endDateTime": "2026-10-29T14:02:58Z"
}, - "retainMasterKey": true
}, - "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"
}Returns full job details including configuration and current lifecycle status.
| jobId required | string <uuid> |
Device backup job details
Authentication required
Resource not found
{- "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": {
- "backupType": "ucs",
- "batchSize": 5,
- "deviceTargets": [
- {
- "deviceId": "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
}, - {
- "deviceId": "bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb"
}
], - "instanceType": "BIG-IP",
- "validateBackup": true,
- "includePrivateKeys": true,
- "encryption": {
- "passphraseSet": true
}, - "retention": {
- "policyType": "copies",
- "retentionCount": 5
}
}, - "createdAt": "2026-08-01T09:00:00Z",
- "updatedAt": "2026-08-01T09:05:00Z"
}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).
| jobId required | string <uuid> |
| 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). |
Job updated
Invalid request
Authentication required
Resource not found
Job cannot be updated in its current state
{- "name": "daily-backup-prod",
- "description": "Updated description",
- "enabled": true,
- "config": {
- "batchSize": 10,
- "deviceTargets": [
- {
- "deviceId": "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
}
], - "instanceType": "F5OS-A",
- "validateBackup": false,
- "retention": {
- "retentionCount": 5
}
}
}{- "id": "string",
- "workflowId": "string",
- "workflowJobId": "string",
- "name": "string",
- "description": "string",
- "status": "DRAFT",
- "enabled": true,
- "config": {
- "instanceType": "BIG-IP",
- "validateBackup": true,
- "includePrivateKeys": true,
- "backupType": "ucs",
- "batchSize": 1,
- "backupFileName": "string",
- "deviceTargets": [
- {
- "deviceId": "string"
}
], - "encryption": {
- "passphraseSet": true
}, - "retention": {
- "doNotDelete": true,
- "retentionDays": 0,
- "retentionCount": 0
}, - "storageTarget": "string",
- "schedule": {
- "backupFrequency": "daily",
- "activeDays": [
- "MON",
- "WED",
- "FRI"
], - "dayOfMonth": 1,
- "timezone": "UTC",
- "startDateTime": "2026-10-29T14:02:58Z",
- "endDateTime": "2026-10-29T14:02:58Z"
}, - "retainMasterKey": true
}, - "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"
}Permanently deletes a device backup job. Only allowed when the job is NOT in RUNNING state. Returns 409 if the job is currently RUNNING.
| jobId required | string <uuid> |
Job deleted
Authentication required
Resource not found
Job cannot be deleted in its current state (e.g. RUNNING)
{- "error": "string",
- "code": "string"
}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.
| jobId required | string <uuid> |
| name required | string non-empty Unique name for this backup job. |
Independent device backup job created
Invalid request
Authentication required
Resource not found
Job name already exists
Failed to copy secrets or create the cloned job
{- "name": "prod-weekly-backup-clone"
}{- "id": "string",
- "workflowId": "string",
- "workflowJobId": "string",
- "name": "string",
- "description": "string",
- "status": "DRAFT",
- "enabled": true,
- "config": {
- "instanceType": "BIG-IP",
- "validateBackup": true,
- "includePrivateKeys": true,
- "backupType": "ucs",
- "batchSize": 1,
- "backupFileName": "string",
- "deviceTargets": [
- {
- "deviceId": "string"
}
], - "encryption": {
- "passphraseSet": true
}, - "retention": {
- "doNotDelete": true,
- "retentionDays": 0,
- "retentionCount": 0
}, - "storageTarget": "string",
- "schedule": {
- "backupFrequency": "daily",
- "activeDays": [
- "MON",
- "WED",
- "FRI"
], - "dayOfMonth": 1,
- "timezone": "UTC",
- "startDateTime": "2026-10-29T14:02:58Z",
- "endDateTime": "2026-10-29T14:02:58Z"
}, - "retainMasterKey": true
}, - "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"
}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.
| jobId required | string <uuid> |
| changeRequest | string Optional change-request reference recorded on the execution. |
Execution accepted and started
Invalid request
Authentication required
Resource not found
Job is not READY, is disabled, already has a RUNNING execution, or every target device is locked
{- "changeRequest": "string"
}{- "executionId": "string",
- "jobId": "string",
- "status": "RUNNING",
- "batchSize": 0,
- "totalDevices": 0,
- "skippedDevices": 0
}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.
| jobId required | string <uuid> |
Pause requested
Authentication required
Resource not found
Job is disabled or not in a pausable state
{- "error": "string",
- "code": "string"
}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).
| jobId required | string <uuid> |
Resume requested
Authentication required
Resource not found
Job is disabled, still PAUSING, or not PAUSED
{- "error": "string",
- "code": "string"
}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.
| jobId required | string <uuid> |
Cancel requested
Authentication required
Resource not found
Job is not in a cancellable state
{- "error": "string",
- "code": "string"
}| jobId required | string <uuid> |
| page | integer >= 1 Default: 1 |
| page_size | integer [ 1 .. 500 ] Default: 20 |
Paginated list of backup executions
Authentication required
Resource not found
{- "data": [
- {
- "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"
}
], - "pagination": {
- "page": 0,
- "page_size": 0,
- "total": 0,
- "total_pages": 0
}
}| jobId required | string <uuid> |
| executionId required | string <uuid> |
Backup execution details, including instanceProgress
Authentication required
Resource not found
{- "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": {
- "totalDevices": 0,
- "pending": 0,
- "running": 0,
- "completed": 0,
- "failed": 0,
- "cancelled": 0,
- "skipped": 0,
- "devices": [
- {
- "deviceId": "string",
- "deviceName": "string",
- "status": "PENDING",
- "currentState": "string",
- "progressPct": 0,
- "currentStep": "string",
- "fileName": "string",
- "backupFileId": "string",
- "errorMessage": "string",
- "startedAt": "2026-10-29T14:02:58Z",
- "completedAt": "2026-10-29T14:02:58Z",
- "steps": [
- {
- "step": "string",
- "status": "PENDING",
- "sequence": 0,
- "startedAt": "2026-10-29T14:02:58Z",
- "completedAt": "2026-10-29T14:02:58Z",
- "durationMs": 0,
- "retryCount": 0,
- "errorCode": "string",
- "errorMessage": "string"
}
]
}
]
}
}| jobId required | string <uuid> |
| executionId required | string <uuid> |
Per-device backup state for this execution
Authentication required
Resource not found
[- {
- "deviceId": "string",
- "deviceName": "string",
- "status": "PENDING",
- "currentState": "string",
- "progressPct": 0,
- "currentStep": "string",
- "fileName": "string",
- "backupFileId": "string",
- "errorMessage": "string",
- "startedAt": "2026-10-29T14:02:58Z",
- "completedAt": "2026-10-29T14:02:58Z",
- "steps": [
- {
- "step": "string",
- "status": "PENDING",
- "sequence": 0,
- "startedAt": "2026-10-29T14:02:58Z",
- "completedAt": "2026-10-29T14:02:58Z",
- "durationMs": 0,
- "retryCount": 0,
- "errorCode": "string",
- "errorMessage": "string"
}
]
}
]| 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 |
Paginated list of device restore jobs
Authentication required
{- "data": [
- {
- "id": "string",
- "name": "string",
- "description": "string",
- "status": "DRAFT",
- "enabled": true,
- "createdBy": "string",
- "modifiedBy": "string",
- "createdAt": "2026-10-29T14:02:58Z",
- "updatedAt": "2026-10-29T14:02:58Z"
}
], - "pagination": {
- "page": 0,
- "page_size": 0,
- "total": 0,
- "total_pages": 0
}
}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.
| 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. |
Device restore job created (in DRAFT or READY state)
Invalid request
Authentication required
Job name already exists
{- "name": "restore-bigip-prod-01",
- "description": "Restore after upgrade failure",
- "config": {
- "restoreItems": [
- {
- "backupFileName": "bigip-prod-01-backup-2026-08-01",
- "deviceTargets": [
- {
- "deviceId": "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
}
], - "passphrase": "MyS3cur3P@ssphrase"
}
]
}
}{- "id": "string",
- "workflowJobId": "string",
- "workflowId": "string",
- "type": "DEVICE_RESTORE",
- "name": "string",
- "description": "string",
- "status": "DRAFT",
- "executionMode": "ON_DEMAND",
- "enabled": true,
- "config": {
- "instanceType": "BIG-IP",
- "restoreItems": [
- {
- "cleanReset": false
}
]
}, - "warnings": [
- {
- "code": "HA_DEVICES_IN_RESTORE_JOB",
- "message": "Device is part of an HA pair; restore sequencing is advisory only.",
- "severity": "INFO"
}
], - "createdBy": "string",
- "modifiedBy": "string",
- "createdAt": "2026-10-29T14:02:58Z",
- "updatedAt": "2026-10-29T14:02:58Z"
}Returns full job details. HA warnings are included when applicable.
| jobId required | string <uuid> |
Device restore job details
Authentication required
Resource not found
{- "id": "string",
- "workflowJobId": "string",
- "workflowId": "string",
- "type": "DEVICE_RESTORE",
- "name": "string",
- "description": "string",
- "status": "DRAFT",
- "executionMode": "ON_DEMAND",
- "enabled": true,
- "config": {
- "instanceType": "BIG-IP",
- "restoreItems": [
- {
- "cleanReset": false
}
]
}, - "warnings": [
- {
- "code": "HA_DEVICES_IN_RESTORE_JOB",
- "message": "Device is part of an HA pair; restore sequencing is advisory only.",
- "severity": "INFO"
}
], - "createdBy": "string",
- "modifiedBy": "string",
- "createdAt": "2026-10-29T14:02:58Z",
- "updatedAt": "2026-10-29T14:02:58Z"
}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.
| jobId required | string <uuid> |
| 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. |
Updated device restore job
Invalid request
Authentication required
Resource not found
Job is not in a mutable state or name already exists
{- "name": "string",
- "description": "string",
- "enabled": true,
- "config": {
- "instanceType": "BIG-IP",
- "restoreItems": [
- {
- "cleanReset": false
}
]
}
}{- "id": "string",
- "workflowJobId": "string",
- "workflowId": "string",
- "type": "DEVICE_RESTORE",
- "name": "string",
- "description": "string",
- "status": "DRAFT",
- "executionMode": "ON_DEMAND",
- "enabled": true,
- "config": {
- "instanceType": "BIG-IP",
- "restoreItems": [
- {
- "cleanReset": false
}
]
}, - "warnings": [
- {
- "code": "HA_DEVICES_IN_RESTORE_JOB",
- "message": "Device is part of an HA pair; restore sequencing is advisory only.",
- "severity": "INFO"
}
], - "createdBy": "string",
- "modifiedBy": "string",
- "createdAt": "2026-10-29T14:02:58Z",
- "updatedAt": "2026-10-29T14:02:58Z"
}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.
| jobId required | string <uuid> |
Job deleted
Authentication required
Resource not found
Job is in a non-deletable state (e.g. RUNNING)
{- "error": "string",
- "code": "string"
}Starts a new execution for a READY device restore job.
| jobId required | string <uuid> |
| batchSize | integer Number of devices processed in parallel for this execution. Defaults to 1. |
| changeRequest | string Optional change-request reference recorded on the execution. |
Execution accepted and started
Invalid request
Authentication required
Resource not found
Job is not READY, already has a RUNNING execution, or a target device is locked
{- "batchSize": 0,
- "changeRequest": "string"
}{- "executionId": "string",
- "status": "RUNNING"
}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.
| jobId required | string <uuid> |
Cancel accepted
Authentication required
Resource not found
Job has no active execution to cancel (RUNNING, PAUSING, PAUSED or CANCELLING)
{- "jobId": "string",
- "message": "string",
- "runningDevices": 0
}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.
| jobId required | string <uuid> |
Pause requested
Authentication required
Resource not found
Job is disabled or execution is not in a pausable state
{- "error": "string",
- "code": "string"
}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).
| jobId required | string <uuid> |
Resume requested
Authentication required
Resource not found
Job is disabled or execution is still PAUSING / not PAUSED
{- "error": "string",
- "code": "string"
}| jobId required | string <uuid> |
| page | integer >= 1 Default: 1 |
| page_size | integer [ 1 .. 500 ] Default: 20 |
Paginated list of restore executions
Authentication required
Resource not found
{- "data": [
- {
- "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"
}
], - "pagination": {
- "page": 0,
- "page_size": 0,
- "total": 0,
- "total_pages": 0
}
}| jobId required | string <uuid> |
| executionId required | string <uuid> |
Restore execution details, including instanceProgress
Authentication required
Resource not found
{- "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": {
- "totalDevices": 0,
- "pending": 0,
- "running": 0,
- "completed": 0,
- "failed": 0,
- "cancelled": 0,
- "skipped": 0,
- "devices": [
- {
- "deviceId": "string",
- "deviceName": "string",
- "status": "PENDING",
- "currentState": "string",
- "progressPct": 0,
- "retryCount": 0,
- "errorMessage": "string",
- "startedAt": "2026-10-29T14:02:58Z",
- "updatedAt": "2026-10-29T14:02:58Z",
- "endedAt": "2026-10-29T14:02:58Z",
- "steps": [
- {
- "step": "string",
- "status": "PENDING",
- "sequence": 0,
- "startedAt": "2026-10-29T14:02:58Z",
- "completedAt": "2026-10-29T14:02:58Z",
- "durationMs": 0,
- "retryCount": 0,
- "errorCode": "string",
- "errorMessage": "string"
}
]
}
]
}
}Runs validation and connectivity checks without persisting the destination.
Omitted or null ca means no custom CA; a UUID selects a trust-store CA.
| 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.
|
| 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.
|
| credentials_token | string Secret material. Required unless |
| enabled | boolean Default: true Enable streaming for this destination. Defaults to true when omitted. |
| tls_verify | boolean Default: true Verify server certificate. Default |
| 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. |
Test executed (see response body for result)
Invalid request or connection test failed
{- "name": "splunk-prod-hec",
- "platform_type": "splunk",
- "authentication_type": "bearer_token",
- "credentials_token": "string",
- "enabled": true,
- "tls_verify": true,
- "ca": "string",
- "log_types": [
- "sslo_logs",
- "otel_logs"
], - "request_timeout_ms": 60000,
- "batch_size": 500,
- "compression": "gzip",
- "retry_max_attempts": 3,
- "clickhouse_database": "otel",
- "clickhouse_logs_table": "otel_logs",
- "clickhouse_username": "otel"
}{- "success": true,
- "reachable": true,
- "authenticated": true,
- "message": "string",
- "latency": "125ms"
}{- "count": 0,
- "destinations": [
- {
- "id": "string",
- "name": "string",
- "platform_type": "splunk",
- "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": [
- "string"
]
}
]
}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.
| 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.
|
| 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.
|
| credentials_token | string Secret material. Required unless |
| enabled | boolean Default: true Enable streaming for this destination. Defaults to true when omitted. |
| tls_verify | boolean Default: true Verify server certificate. Default |
| 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. |
Destination accepted for asynchronous validation and collector reconciliation. Poll the Location URL until a terminal deployment_status is returned.
Validation failed (name/URL/auth/TLS pre-flight)
Destination with the same name already exists
Internal server error
{- "name": "splunk-prod-hec",
- "platform_type": "splunk",
- "authentication_type": "bearer_token",
- "credentials_token": "string",
- "enabled": true,
- "tls_verify": true,
- "ca": "string",
- "log_types": [
- "sslo_logs",
- "otel_logs"
], - "request_timeout_ms": 60000,
- "batch_size": 500,
- "compression": "gzip",
- "retry_max_attempts": 3,
- "clickhouse_database": "otel",
- "clickhouse_logs_table": "otel_logs",
- "clickhouse_username": "otel"
}{- "id": "string",
- "name": "string",
- "platform_type": "splunk",
- "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": [
- "string"
]
}| id required | string <uuid> Export destination UUID |
Destination details
Destination not found
Internal server error
{- "id": "string",
- "name": "string",
- "platform_type": "splunk",
- "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": [
- "string"
]
}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.
| id required | string <uuid> Export destination UUID |
| 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.
|
| 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. |
Update processing completed; inspect deployment_status and last_error. Kubernetes rollout completion and telemetry delivery are not confirmed.
Validation failed
Destination not found
Name conflict on rename
Connection validation failed; the saved destination is unchanged
Internal server error
{- "name": "string",
- "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": [
- "sslo_logs"
]
}{- "id": "string",
- "name": "string",
- "platform_type": "splunk",
- "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": [
- "string"
]
}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.
| id required | string <uuid> Export destination UUID |
Destination was removed from the database and Vault, but the collector restart failed. Retry collector reconciliation with apply-all.
Destination deleted
Destination not found
Internal server error
{- "error": "string",
- "message": "string",
- "details": "string",
- "status": "string"
}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.
| id required | string <uuid> Export destination UUID |
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.
|
| endpoint_url | string <uri> |
| authentication_type | string (ExportAuthenticationType) Enum: "bearer_token" "hec_token" "api_key" "basic_auth" "none" Authentication mechanism used against the destination.
|
| 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 |
Test executed (may be success or failure — see response body)
Destination not found
Internal server error
{- "name": "string",
- "platform_type": "splunk",
- "authentication_type": "bearer_token",
- "credentials_token": "string",
- "enabled": true,
- "tls_verify": true,
- "ca": "string",
- "log_types": [
- "sslo_logs"
], - "request_timeout_ms": 1000,
- "batch_size": 1,
- "compression": "gzip",
- "retry_max_attempts": 0,
- "clickhouse_database": "string",
- "clickhouse_logs_table": "string",
- "clickhouse_username": "string"
}{- "success": true,
- "reachable": true,
- "authenticated": true,
- "message": "string",
- "latency": "125ms"
}Batch reconciliation — merges all active destination tokens into export-credentials and restarts the collector once.
Reconciliation initiated
Internal server error
{- "status": "validation_success"
}Get the currently configured canonical external URL used by F5 Insight and the identity provider.
Current FQDN configuration retrieved successfully
Internal server error
{- "configured": true,
}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.
| target required | string External FQDN target. May include https scheme and port. |
FQDN configuration task submitted
Invalid FQDN target
Another FQDN configuration task is already running
Internal server error
{- "target": "f5insights.example.com"
}{- "task_id": "123e4567-e89b-12d3-a456-426614174000",
- "status": "submitted"
}Query the progress of an FQDN configuration task by task_id.
| task_id required | string <uuid> Example: 123e4567-e89b-12d3-a456-426614174000 UUID of the FQDN configuration task |
FQDN configuration status retrieved successfully
Invalid task_id format
Task not found
Internal server error
{- "task_id": "123e4567-e89b-12d3-a456-426614174000",
- "state": "APPLY",
- "status": "RUNNING",
- "progress": 60,
- "error_message": "FQDN configuration failed: helm upgrade failed"
}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.
| target required | string External FQDN target. May include https scheme and port. |
FQDN configuration task submitted
Invalid FQDN target
Another FQDN configuration task is already running
Internal server error
{- "target": "f5insights.example.com"
}{- "task_id": "123e4567-e89b-12d3-a456-426614174000",
- "status": "submitted"
}Query the progress of an FQDN configuration task by task_id.
| task_id required | string <uuid> Example: 123e4567-e89b-12d3-a456-426614174000 UUID of the FQDN configuration task |
FQDN configuration status retrieved successfully
Invalid task_id format
Task not found
Internal server error
{- "task_id": "123e4567-e89b-12d3-a456-426614174000",
- "state": "APPLY",
- "status": "RUNNING",
- "progress": 60,
- "error_message": "FQDN configuration failed: helm upgrade failed"
}{- "property1": {
- "name": "string",
- "enabled": true,
- "description": "string"
}, - "property2": {
- "name": "string",
- "enabled": true,
- "description": "string"
}
}| name required | string |
| enabled required | boolean |
Feature flag updated successfully
Bad request
Internal server error
{- "name": "string",
- "enabled": true
}{ }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).
| 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). |
Paginated list of flight-check snapshots
Authentication required
{- "data": [
- {
- "id": "string",
- "jobId": "string",
- "deviceId": "string",
- "phase": "PRE",
- "capturedAt": "2026-10-29T14:02:58Z",
- "trunkStatus": {
- "status": "OK",
- "details": { },
- "error": "string"
}, - "interfaceStatus": {
- "status": "OK",
- "details": { },
- "error": "string"
}, - "virtualServerState": {
- "status": "OK",
- "details": { },
- "error": "string"
}, - "poolHealth": {
- "status": "OK",
- "details": { },
- "error": "string"
}, - "poolMemberHealth": {
- "status": "OK",
- "details": { },
- "error": "string"
}, - "performanceAllStats": {
- "status": "OK",
- "details": { },
- "error": "string"
}, - "lagStatus": {
- "status": "OK",
- "details": { },
- "error": "string"
}, - "alarms": {
- "status": "OK",
- "details": { },
- "error": "string"
}, - "healthSummary": {
- "status": "OK",
- "details": { },
- "error": "string"
}, - "cluster": {
- "status": "OK",
- "details": { },
- "error": "string"
}, - "firmwareStatus": {
- "status": "OK",
- "details": { },
- "error": "string"
}, - "fpgaStatus": {
- "status": "OK",
- "details": { },
- "error": "string"
}, - "cores": {
- "status": "OK",
- "details": { },
- "error": "string"
}, - "tenantStatus": {
- "status": "OK",
- "details": { },
- "error": "string"
}, - "servicePods": {
- "status": "OK",
- "details": { },
- "error": "string"
}
}
], - "pagination": {
- "page": 0,
- "page_size": 0,
- "total": 0,
- "total_pages": 0
}
}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.
| snapshotId required | string <uuid> Unique ID of a flight-check snapshot. |
Flight-check snapshot
Authentication required
Resource not found
{- "id": "string",
- "jobId": "string",
- "deviceId": "string",
- "phase": "PRE",
- "capturedAt": "2026-10-29T14:02:58Z",
- "trunkStatus": {
- "status": "OK",
- "details": { },
- "error": "string"
}, - "interfaceStatus": {
- "status": "OK",
- "details": { },
- "error": "string"
}, - "virtualServerState": {
- "status": "OK",
- "details": { },
- "error": "string"
}, - "poolHealth": {
- "status": "OK",
- "details": { },
- "error": "string"
}, - "poolMemberHealth": {
- "status": "OK",
- "details": { },
- "error": "string"
}, - "performanceAllStats": {
- "status": "OK",
- "details": { },
- "error": "string"
}, - "lagStatus": {
- "status": "OK",
- "details": { },
- "error": "string"
}, - "alarms": {
- "status": "OK",
- "details": { },
- "error": "string"
}, - "healthSummary": {
- "status": "OK",
- "details": { },
- "error": "string"
}, - "cluster": {
- "status": "OK",
- "details": { },
- "error": "string"
}, - "firmwareStatus": {
- "status": "OK",
- "details": { },
- "error": "string"
}, - "fpgaStatus": {
- "status": "OK",
- "details": { },
- "error": "string"
}, - "cores": {
- "status": "OK",
- "details": { },
- "error": "string"
}, - "tenantStatus": {
- "status": "OK",
- "details": { },
- "error": "string"
}, - "servicePods": {
- "status": "OK",
- "details": { },
- "error": "string"
}
}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).
| 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. |
Paginated list of flight-check diffs
Authentication required
{- "data": [
- {
- "id": "string",
- "jobId": "string",
- "deviceId": "string",
- "degraded": true,
- "preSnapshotUrl": "string",
- "postSnapshotUrl": "string",
- "computedAt": "2026-10-29T14:02:58Z",
- "entries": [
- {
- "check": "string",
- "outcome": "SAME",
- "before": { },
- "after": { },
- "details": "string"
}
]
}
], - "pagination": {
- "page": 0,
- "page_size": 0,
- "total": 0,
- "total_pages": 0
}
}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}).
| diffId required | string <uuid> Unique ID of a flight-check diff. |
Flight-check diff
Authentication required
Resource not found
{- "id": "string",
- "jobId": "string",
- "deviceId": "string",
- "degraded": true,
- "preSnapshotUrl": "string",
- "postSnapshotUrl": "string",
- "computedAt": "2026-10-29T14:02:58Z",
- "entries": [
- {
- "check": "string",
- "outcome": "SAME",
- "before": { },
- "after": { },
- "details": "string"
}
]
}Returns the health status of the system manager service
Service is healthy
{- "success": true,
- "data": {
- "status": "healthy",
- "platform_manager": "available"
}
}Returns the current F5 Insight version information
Version information retrieved successfully
{- "success": true,
- "data": {
- "version": "1.2.0",
- "build_date": "2025-01-14",
- "git_commit": "abc1234"
}
}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.
Success
Internal Error
{- "providers": [
- {
- "id": "string",
- "name": "string",
- "provider_type": "ldap",
- "enabled": true,
- "ldap_config": {
- "servers": [
- "ldaps://ldap.company.com:636"
], - "start_tls": false,
- "base_dn": "dc=company,dc=com",
- "bind_dn": "cn=readonly,dc=company,dc=com",
- "bind_password": "secret123",
- "user_base": "ou=people",
- "user_object_classes": [
- "inetOrgPerson"
], - "user_unique_attribute": "uid",
- "user_filters": [
- "uid",
- "objectClass=inetOrgPerson"
], - "attributes": {
- "id": "uid",
- "username": "uid",
- "email": "mail",
- "first_name": "givenName",
- "last_name": "sn",
- "display_name": "displayName"
}, - "timeout": 0,
- "ca_certificate_id": "string"
}, - "saml_config": {
- "metadata_xml": "string",
- "binding": "post",
- "with_signed_request": true,
}, - "created_at": "2026-10-29T14:02:58Z",
- "updated_at": "2026-10-29T14:02:58Z",
- "last_sync": "2026-10-29T14:02:58Z"
}
], - "local_login_enabled": true,
- "total_count": 0
}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.
| 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) |
LDAP provider created inactive.
Bad Request
Provider name already exists
Internal Error
External identity provider management is not configured
{- "name": "Corporate LDAP",
- "enabled": true,
- "ldap_config": {
- "servers": [
- "ldaps://ldap.company.com:636"
], - "start_tls": false,
- "base_dn": "dc=company,dc=com",
- "bind_dn": "cn=readonly,dc=company,dc=com",
- "bind_password": "secret123",
- "user_base": "ou=people",
- "user_object_classes": [
- "inetOrgPerson"
], - "user_unique_attribute": "uid",
- "user_filters": [
- "uid",
- "objectClass=inetOrgPerson"
], - "attributes": {
- "id": "uid",
- "username": "uid",
- "email": "mail",
- "first_name": "givenName",
- "last_name": "sn",
- "display_name": "displayName"
}, - "timeout": 0,
- "ca_certificate_id": "string"
}
}{- "id": "string",
- "name": "string",
- "provider_type": "ldap",
- "enabled": true,
- "ldap_config": {
- "servers": [
- "ldaps://ldap.company.com:636"
], - "start_tls": false,
- "base_dn": "dc=company,dc=com",
- "bind_dn": "cn=readonly,dc=company,dc=com",
- "bind_password": "secret123",
- "user_base": "ou=people",
- "user_object_classes": [
- "inetOrgPerson"
], - "user_unique_attribute": "uid",
- "user_filters": [
- "uid",
- "objectClass=inetOrgPerson"
], - "attributes": {
- "id": "uid",
- "username": "uid",
- "email": "mail",
- "first_name": "givenName",
- "last_name": "sn",
- "display_name": "displayName"
}, - "timeout": 0,
- "ca_certificate_id": "string"
}, - "saml_config": {
- "metadata_xml": "string",
- "binding": "post",
- "with_signed_request": true,
}, - "created_at": "2026-10-29T14:02:58Z",
- "updated_at": "2026-10-29T14:02:58Z",
- "last_sync": "2026-10-29T14:02:58Z"
}| name required | string |
| enabled | boolean Default: true |
| saml_config required | object (SAMLConfig) |
SAML provider created
Bad Request
Provider name already exists
Internal Error
{- "name": "string",
- "enabled": true,
- "saml_config": {
- "metadata_source": "url",
- "metadata_url": "string",
- "metadata_xml": "string",
- "binding": "post",
- "with_signed_request": true
}
}{- "id": "string",
- "name": "string",
- "provider_type": "ldap",
- "enabled": true,
- "ldap_config": {
- "servers": [
- "ldaps://ldap.company.com:636"
], - "start_tls": false,
- "base_dn": "dc=company,dc=com",
- "bind_dn": "cn=readonly,dc=company,dc=com",
- "bind_password": "secret123",
- "user_base": "ou=people",
- "user_object_classes": [
- "inetOrgPerson"
], - "user_unique_attribute": "uid",
- "user_filters": [
- "uid",
- "objectClass=inetOrgPerson"
], - "attributes": {
- "id": "uid",
- "username": "uid",
- "email": "mail",
- "first_name": "givenName",
- "last_name": "sn",
- "display_name": "displayName"
}, - "timeout": 0,
- "ca_certificate_id": "string"
}, - "saml_config": {
- "metadata_xml": "string",
- "binding": "post",
- "with_signed_request": true,
}, - "created_at": "2026-10-29T14:02:58Z",
- "updated_at": "2026-10-29T14:02:58Z",
- "last_sync": "2026-10-29T14:02:58Z"
}| id required | string |
| name required | string [ 1 .. 200 ] characters 1-200 characters. Must be unique. |
| enabled | boolean |
| ldap_config required | object (LDAPConfig) |
Success
Bad Request
Not Found
Internal Error
{- "name": "Corporate LDAP",
- "enabled": true,
- "ldap_config": {
- "servers": [
- "ldaps://ldap.company.com:636"
], - "start_tls": false,
- "base_dn": "dc=company,dc=com",
- "bind_dn": "cn=readonly,dc=company,dc=com",
- "bind_password": "secret123",
- "user_base": "ou=people",
- "user_object_classes": [
- "inetOrgPerson"
], - "user_unique_attribute": "uid",
- "user_filters": [
- "uid",
- "objectClass=inetOrgPerson"
], - "attributes": {
- "id": "uid",
- "username": "uid",
- "email": "mail",
- "first_name": "givenName",
- "last_name": "sn",
- "display_name": "displayName"
}, - "timeout": 0,
- "ca_certificate_id": "string"
}
}{- "id": "string",
- "name": "string",
- "provider_type": "ldap",
- "enabled": true,
- "ldap_config": {
- "servers": [
- "ldaps://ldap.company.com:636"
], - "start_tls": false,
- "base_dn": "dc=company,dc=com",
- "bind_dn": "cn=readonly,dc=company,dc=com",
- "bind_password": "secret123",
- "user_base": "ou=people",
- "user_object_classes": [
- "inetOrgPerson"
], - "user_unique_attribute": "uid",
- "user_filters": [
- "uid",
- "objectClass=inetOrgPerson"
], - "attributes": {
- "id": "uid",
- "username": "uid",
- "email": "mail",
- "first_name": "givenName",
- "last_name": "sn",
- "display_name": "displayName"
}, - "timeout": 0,
- "ca_certificate_id": "string"
}, - "saml_config": {
- "metadata_xml": "string",
- "binding": "post",
- "with_signed_request": true,
}, - "created_at": "2026-10-29T14:02:58Z",
- "updated_at": "2026-10-29T14:02:58Z",
- "last_sync": "2026-10-29T14:02:58Z"
}| id required | string |
| name required | string |
| enabled | boolean |
| saml_config required | object (SAMLConfig) |
Success
Bad Request
Not Found
Internal Error
{- "name": "string",
- "enabled": true,
- "saml_config": {
- "metadata_source": "url",
- "metadata_url": "string",
- "metadata_xml": "string",
- "binding": "post",
- "with_signed_request": true
}
}{- "id": "string",
- "name": "string",
- "provider_type": "ldap",
- "enabled": true,
- "ldap_config": {
- "servers": [
- "ldaps://ldap.company.com:636"
], - "start_tls": false,
- "base_dn": "dc=company,dc=com",
- "bind_dn": "cn=readonly,dc=company,dc=com",
- "bind_password": "secret123",
- "user_base": "ou=people",
- "user_object_classes": [
- "inetOrgPerson"
], - "user_unique_attribute": "uid",
- "user_filters": [
- "uid",
- "objectClass=inetOrgPerson"
], - "attributes": {
- "id": "uid",
- "username": "uid",
- "email": "mail",
- "first_name": "givenName",
- "last_name": "sn",
- "display_name": "displayName"
}, - "timeout": 0,
- "ca_certificate_id": "string"
}, - "saml_config": {
- "metadata_xml": "string",
- "binding": "post",
- "with_signed_request": true,
}, - "created_at": "2026-10-29T14:02:58Z",
- "updated_at": "2026-10-29T14:02:58Z",
- "last_sync": "2026-10-29T14:02:58Z"
}| 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) |
Validation successful
Validation failed
Internal Error
{- "provider_type": "ldap",
- "provider_id": "string",
- "ldap_config": {
- "servers": [
- "ldaps://ldap.company.com:636"
], - "start_tls": false,
- "base_dn": "dc=company,dc=com",
- "bind_dn": "cn=readonly,dc=company,dc=com",
- "bind_password": "secret123",
- "user_base": "ou=people",
- "user_object_classes": [
- "inetOrgPerson"
], - "user_unique_attribute": "uid",
- "user_filters": [
- "uid",
- "objectClass=inetOrgPerson"
], - "attributes": {
- "id": "uid",
- "username": "uid",
- "email": "mail",
- "first_name": "givenName",
- "last_name": "sn",
- "display_name": "displayName"
}, - "timeout": 0,
- "ca_certificate_id": "string"
}
}{- "status": "validation_success",
- "error": "string",
- "details": {
- "connection_successful": true,
- "bind_successful": true,
- "user_search_successful": true,
- "users_found": 0,
- "group_search_successful": true,
- "group_search_base": "string",
- "groups_found": 0,
- "groups": [
- "string"
]
}
}Performs a live per-user validation against an LDAP directory, mirroring the BIG-IP APM "Test User Credentials" panel:
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).memberOf values. If memberOf
is absent, searches ou=groups,<base_dn> for member or memberUid
references to support OpenLDAP directories without the memberOf overlay.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.
| ldap_config required | object (ValidateUserDetailsLDAPConfig) Minimal LDAP configuration used by |
Validation completed (per-step results are inside the payload)
Malformed request or missing required fields
Internal Error
{- "ldap_config": {
- "servers": [
- "ldaps://ldap.company.com:636"
], - "start_tls": false,
- "base_dn": "dc=example,dc=com",
- "bind_dn": "cn=admin,dc=example,dc=com",
- "bind_password": "admin123",
- "user_base": "string",
- "user_filters": [
- "uid",
- "objectClass=inetOrgPerson"
], - "test_username": "string",
- "test_password": "string",
- "ca_certificate_id": "string",
- "timeout": 0
}
}{- "status": "success",
- "message": "string",
- "user_information": {
- "user_dn": "string",
- "attributes": { },
- "member_of": [
- "string"
], - "groups": [
- "string"
]
}, - "resolved_ldap_groups": [
- {
- "group_dn": "string",
- "group_name": "string"
}
], - "group_mapping_test": [
- {
- "ldap_group": "string",
- "role_name": "string",
- "access": "permit"
}
], - "authentication_test": {
- "user_lookup": "pass",
- "password_bind": "pass",
- "group_lookup": "pass",
- "message": "string"
}
}| id required | string |
Success
Not Found
Internal Error
{- "id": "string",
- "name": "string",
- "provider_type": "ldap",
- "enabled": true,
- "ldap_config": {
- "servers": [
- "ldaps://ldap.company.com:636"
], - "start_tls": false,
- "base_dn": "dc=company,dc=com",
- "bind_dn": "cn=readonly,dc=company,dc=com",
- "bind_password": "secret123",
- "user_base": "ou=people",
- "user_object_classes": [
- "inetOrgPerson"
], - "user_unique_attribute": "uid",
- "user_filters": [
- "uid",
- "objectClass=inetOrgPerson"
], - "attributes": {
- "id": "uid",
- "username": "uid",
- "email": "mail",
- "first_name": "givenName",
- "last_name": "sn",
- "display_name": "displayName"
}, - "timeout": 0,
- "ca_certificate_id": "string"
}, - "saml_config": {
- "metadata_xml": "string",
- "binding": "post",
- "with_signed_request": true,
}, - "created_at": "2026-10-29T14:02:58Z",
- "updated_at": "2026-10-29T14:02:58Z",
- "last_sync": "2026-10-29T14:02:58Z"
}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).
| id required | string |
Provider deleted successfully
Not Found
Provider is still referenced by role mappings
Internal Error
Unable to validate provider role mapping usage
{- "status": "success",
- "message": "Identity provider 'corp-ldap' deleted successfully",
- "id": "string"
}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.
| id required | string |
Provider activated
Not Found
Another LDAP provider is already active
Internal Error
External identity provider management is not configured
{- "id": "string",
- "name": "string",
- "provider_type": "ldap",
- "enabled": true,
- "ldap_config": {
- "servers": [
- "ldaps://ldap.company.com:636"
], - "start_tls": false,
- "base_dn": "dc=company,dc=com",
- "bind_dn": "cn=readonly,dc=company,dc=com",
- "bind_password": "secret123",
- "user_base": "ou=people",
- "user_object_classes": [
- "inetOrgPerson"
], - "user_unique_attribute": "uid",
- "user_filters": [
- "uid",
- "objectClass=inetOrgPerson"
], - "attributes": {
- "id": "uid",
- "username": "uid",
- "email": "mail",
- "first_name": "givenName",
- "last_name": "sn",
- "display_name": "displayName"
}, - "timeout": 0,
- "ca_certificate_id": "string"
}, - "saml_config": {
- "metadata_xml": "string",
- "binding": "post",
- "with_signed_request": true,
}, - "created_at": "2026-10-29T14:02:58Z",
- "updated_at": "2026-10-29T14:02:58Z",
- "last_sync": "2026-10-29T14:02:58Z"
}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.
| id required | string |
Provider deactivated successfully
Not Found
Internal Error
External identity provider management is not configured
{- "id": "string",
- "name": "string",
- "provider_type": "ldap",
- "enabled": true,
- "ldap_config": {
- "servers": [
- "ldaps://ldap.company.com:636"
], - "start_tls": false,
- "base_dn": "dc=company,dc=com",
- "bind_dn": "cn=readonly,dc=company,dc=com",
- "bind_password": "secret123",
- "user_base": "ou=people",
- "user_object_classes": [
- "inetOrgPerson"
], - "user_unique_attribute": "uid",
- "user_filters": [
- "uid",
- "objectClass=inetOrgPerson"
], - "attributes": {
- "id": "uid",
- "username": "uid",
- "email": "mail",
- "first_name": "givenName",
- "last_name": "sn",
- "display_name": "displayName"
}, - "timeout": 0,
- "ca_certificate_id": "string"
}, - "saml_config": {
- "metadata_xml": "string",
- "binding": "post",
- "with_signed_request": true,
}, - "created_at": "2026-10-29T14:02:58Z",
- "updated_at": "2026-10-29T14:02:58Z",
- "last_sync": "2026-10-29T14:02:58Z"
}| 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. |
List of software images
Authentication required
{- "data": [
- {
- "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"
}
], - "pagination": {
- "page": 0,
- "page_size": 0,
- "total": 0,
- "total_pages": 0
}
}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.
| file required | string <binary> Software image file (ISO, bin, etc.) |
Upload accepted for asynchronous processing
Invalid request
Authentication required
Duplicate filename
{- "success": true,
- "data": {
- "image_id": "string",
- "file_name": "string",
- "status": "UPLOADING",
- "message": "File upload received. Processing will continue in the background."
}
}| imageId required | string <uuid> |
Software image details
Resource not found
{- "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"
}| imageId required | string <uuid> |
Image deleted
Resource not found
Image is associated with one or more upgrade jobs and cannot be deleted. The error message lists the offending job types and names.
{- "error": "string",
- "code": "string"
}| image_ids required | Array of strings <uuid> [ 1 .. 100 ] items |
Per-image deletion results
Invalid request
Authentication required
{- "image_ids": [
- "string"
]
}{- "results": [
- {
- "image_id": "string",
- "status": "DELETED",
- "error": {
- "error": "string",
- "code": "string"
}
}
]
}Establishes a connection to vSphere using provider credentials. Returns a connection ID that can be used for subsequent discovery API calls.
| 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. |
Connection established successfully
Bad request - missing required parameters
Provider not found
Internal server error or connection failed
{- "username": "string",
- "password": "string",
- "providerName": "string",
- "cloudEnvReferenceId": "string"
}{- "connId": "string",
- "message": "string"
}Lists all available datacenters in the vSphere environment.
| connId required | string Connection ID from /cloud/connect endpoint |
List of datacenters
Bad request - missing required parameters
Environment not found
Internal server error
[- {
- "name": "string",
- "datacenter": "string"
}
]Lists all clusters in a datacenter.
| connId required | string Connection ID from /cloud/connect endpoint |
| datacenter required | string Name of the datacenter |
List of clusters
Bad request - missing required parameters
Environment or datacenter not found
Internal server error
[- {
- "name": "string",
- "cluster": "string"
}
]Returns the current CPU, memory, and storage capacity and usage for a cluster.
| datacenterName required | string Name of the datacenter |
| clusterName required | string Name of the cluster |
| connId required | string Connection ID from /cloud/connect endpoint |
Cluster resource capacity and current usage
Bad request - missing required parameters
Invalid or expired connection
Datacenter or cluster not found
Internal server error
{- "collectedAt": "2026-10-29T14:02:58Z",
- "cpu": {
- "capacityMHz": 0,
- "usedMHz": 0,
- "usedPercent": 0
}, - "memory": {
- "capacityBytes": 0,
- "usedBytes": 0,
- "usedPercent": 0
}, - "storage": {
- "capacityBytes": 0,
- "usedBytes": 0,
- "freeBytes": 0,
- "usedPercent": 0
}
}Lists hosts in a datacenter or cluster. If cluster is provided, lists only hosts in that cluster; otherwise lists all hosts in the datacenter.
| 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) |
List of hosts
Bad request - missing required parameters
Environment, datacenter, or cluster not found
Internal server error
[- {
- "name": "string",
- "host": "string"
}
]Lists all networks in a datacenter.
| connId required | string Connection ID from /cloud/connect endpoint |
| datacenter required | string Name of the datacenter |
List of networks
Bad request - missing required parameters
Environment or datacenter not found
Internal server error
[- {
- "name": "string",
- "network": "string"
}
]Lists all datastores in a datacenter.
| connId required | string Connection ID from /cloud/connect endpoint |
| datacenter required | string Name of the datacenter |
List of datastores
Bad request - missing required parameters
Environment or datacenter not found
Internal server error
[- {
- "datastore": "string",
- "name": "string"
}
]Lists all VM images (templates) available in a datacenter.
| connId required | string Connection ID from /cloud/connect endpoint |
| datacenter required | string Name of the datacenter |
List of VM images
Bad request - missing required parameters
Environment or datacenter not found
Internal server error
[- {
- "vm": "string",
- "name": "string"
}
]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.
| 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 |
Paginated list of instance templates
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.
Internal Server Error
{- "status": 200,
- "count": 2,
- "totalItems": 2,
- "items": [
- {
- "id": "550e8400-e29b-41d4-a716-446655440000",
- "name": "BIG-IP Standard Template",
- "provider": "VMware",
- "description": "Standard VMware configuration",
- "state": "DEPLOYED",
- "locked": false,
- "lockReason": "NONE",
- "createdAt": "2026-01-15T09:23:41Z",
- "updatedAt": "2026-03-22T14:45:10Z"
}, - {
- "id": "660e8400-e29b-41d4-a716-446655440001",
- "name": "BIG-IP HA Template",
- "provider": "AWS",
- "description": "High availability configuration",
- "state": "DRAFT",
- "locked": false,
- "lockReason": "NONE",
- "createdAt": "2026-02-10T11:00:00Z",
- "updatedAt": "2026-02-10T11:00:00Z"
}
], - "selfLink": "/api/instance-templates"
}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.
| 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 |
| definition required | object (InstanceTemplateDefinition) Template definition containing all BIG-IP device configuration parameters. |
OK — instance template created in NEW state (draft=false or omitted)
Created — instance template created in DRAFT state (draft=true)
Bad Request
Conflict — name already exists
Internal Server Error
{- "name": "BIG-IP Standard Template",
- "provider": "VMware",
- "description": "Standard VMware configuration for production workloads",
- "definition": {
- "rootPassword": "s3cur3P@ss!",
- "timeZone": "America/Los_Angeles",
- "defaultRoute": "10.0.0.1",
- "managementSslPort": 443,
- "hostnameComponents": [
- {
- "type": "STATIC_TEXT",
- "value": "bigip-"
}, - {
- "type": "SERIAL_NUMBER",
- "value": null
}
], - "lookupServerList": [
- "8.8.8.8",
- "8.8.4.4"
], - "ntpServerList": [
- "0.pool.ntp.org"
], - "userAccountList": [
- {
- "username": "admin",
- "password": "adminP@ss!",
- "role": "administrator",
- "shell": "bash"
}
], - "provisionedModuleList": [
- {
- "module": "LTM",
- "level": "NOMINAL"
}
], - "networkRouteList": [
- {
- "name": "default",
- "gatewayAddress": "10.0.0.1",
- "destination": "0.0.0.0/0"
}
], - "vlanList": [
- {
- "name": "external",
- "nic": "1.1",
- "mtu": 1500,
- "tag": 100
}
], - "selfIpList": [
- {
- "name": "external-self",
- "ipPoolReference": "c3d4e5f6-a7b8-4890-8bcd-ef1234567892",
- "vlanName": "external",
- "portLockdown": "default",
- "allowServices": null
}
]
}
}{- "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"
}Returns a single instance template identified by its ID.
| id required | string <uuid> Example: 550e8400-e29b-41d4-a716-446655440000 UUID of the instance template. |
Instance template returned successfully
Not Found
Internal Server Error
{- "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": {
- "rootPassword": "s3cur3P@ss!",
- "timeZone": "America/Los_Angeles",
- "defaultRoute": "10.0.0.1",
- "managementSslPort": 443,
- "hostnameComponents": [
- {
- "type": "STATIC_TEXT",
- "value": "bigip-"
}, - {
- "type": "SERIAL_NUMBER",
- "value": null
}
], - "lookupServerList": [
- "8.8.8.8",
- "8.8.4.4"
], - "ntpServerList": [
- "0.pool.ntp.org"
], - "userAccountList": [
- {
- "username": "admin",
- "password": "adminP@ss!",
- "role": "administrator",
- "shell": "bash"
}
], - "provisionedModuleList": [
- {
- "module": "LTM",
- "level": "NOMINAL"
}
], - "networkRouteList": [
- {
- "name": "default",
- "gatewayAddress": "10.0.0.1",
- "destination": "0.0.0.0/0"
}
], - "vlanList": [
- {
- "name": "external",
- "nic": "1.1",
- "mtu": 1500,
- "tag": 100
}
], - "selfIpList": [
- {
- "name": "external-self",
- "ipPoolReference": "c3d4e5f6-a7b8-4890-8bcd-ef1234567892",
- "vlanName": "external",
- "portLockdown": "default",
- "allowServices": null
}
]
}, - "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"
}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.
| id required | string <uuid> Example: 550e8400-e29b-41d4-a716-446655440000 UUID of the instance template. |
| 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 |
| definition required | object (InstanceTemplateDefinition) Template definition containing all BIG-IP device configuration parameters. |
OK — instance template updated successfully
Bad Request
Not Found
Conflict — locked, deploying, or name collision
Internal Server Error
{- "name": "BIG-IP Standard Template v2",
- "provider": "VMware",
- "description": "Updated VMware configuration with HA support",
- "definition": {
- "rootPassword": "n3wS3cur3P@ss!",
- "timeZone": "America/Los_Angeles",
- "defaultRoute": "10.0.0.1",
- "managementSslPort": 443,
- "hostnameComponents": [
- {
- "type": "STATIC_TEXT",
- "value": "bigip-"
}, - {
- "type": "SERIAL_NUMBER",
- "value": null
}
], - "lookupServerList": [
- "8.8.8.8",
- "8.8.4.4"
], - "ntpServerList": [
- "0.pool.ntp.org"
], - "userAccountList": [
- {
- "username": "admin",
- "password": "adminP@ss!",
- "role": "administrator",
- "shell": "bash"
}
], - "provisionedModuleList": [
- {
- "module": "LTM",
- "level": "NOMINAL"
}, - {
- "module": "ASM",
- "level": "NOMINAL"
}
], - "networkRouteList": [
- {
- "name": "default",
- "gatewayAddress": "10.0.0.1",
- "destination": "0.0.0.0/0"
}
], - "vlanList": [
- {
- "name": "external",
- "nic": "1.1",
- "mtu": 1500,
- "tag": 100
}, - {
- "name": "internal",
- "nic": "1.2",
- "mtu": 1500,
- "tag": 200
}
], - "selfIpList": [
- {
- "name": "external-self",
- "ipPoolReference": "c3d4e5f6-a7b8-4890-8bcd-ef1234567892",
- "vlanName": "external",
- "portLockdown": "default",
- "allowServices": null
}, - {
- "name": "internal-self",
- "ipPoolReference": "d4e5f6a7-b8c9-4890-8bcd-ef1234567893",
- "vlanName": "internal",
- "portLockdown": "none",
- "allowServices": null
}
]
}
}{- "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 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:
null are cleared.vlanList, selfIpList) are replaced wholesale.| id required | string <uuid> Example: 550e8400-e29b-41d4-a716-446655440000 UUID of the instance template. |
| 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 |
| 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 |
OK — instance template patched successfully
Bad Request
Not Found
Conflict — locked or deploying
Internal Server Error
{- "description": "Updated description with HA failover notes",
- "definition": {
- "managementSslPort": 8443
}
}{- "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"
}Deletes an instance template by ID.
Precondition: The instance template must not be locked.
Templates in DEPLOYING state cannot be deleted.
| id required | string <uuid> Example: 550e8400-e29b-41d4-a716-446655440000 UUID of the instance template. |
OK — instance template deleted
Not Found
Conflict — locked or deploying
Internal Server Error
{- "id": "550e8400-e29b-41d4-a716-446655440000",
- "status": 200,
- "deletedAt": "2026-04-10T16:00:00Z"
}Locks an instance template to prevent modifications.
Sets locked=true and lockReason=READ_ONLY.
Precondition: Template must not already be locked.
| id required | string <uuid> Example: 550e8400-e29b-41d4-a716-446655440000 UUID of the instance template. |
OK — instance template locked
Not Found
Conflict — already locked
Internal Server Error
{- "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"
}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.
| id required | string <uuid> Example: 550e8400-e29b-41d4-a716-446655440000 UUID of the instance template. |
OK — instance template unlocked
Not Found
Conflict — not locked or system-locked
Internal Server Error
{- "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"
}Triggers deployment of an instance template to target infrastructure.
Preconditions:
NEW or DEPLOYED stateReturns 202 Accepted with a task object for tracking deployment progress.
| id required | string <uuid> Example: 550e8400-e29b-41d4-a716-446655440000 UUID of the instance template. |
| 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). |
Accepted — deployment task queued
Bad Request — invalid request payload
Not Found
Conflict — locked or already deploying
Unprocessable Entity — template not in deployable state or validation failed
Internal Server Error
{- "mgmtIp": "192.168.1.100",
- "username": "admin",
- "encodedBasicAuth": "YWRtaW46YWRtaW5QYXNzd29yZDEyMw=="
}{- "status": 202,
- "instanceTemplateId": "550e8400-e29b-41d4-a716-446655440000",
- "deploymentTaskId": "c3d4e5f6-a7b8-4012-8def-123456789012",
- "selfLink": "/api/instance-templates/tasks/c3d4e5f6-a7b8-4012-8def-123456789012"
}Creates a deep copy of an existing instance template with a new name.
The clone is always created in DRAFT state, unlocked.
| id required | string <uuid> Example: 550e8400-e29b-41d4-a716-446655440000 UUID of the instance template. |
| name required | string [ 1 .. 255 ] characters Name for the cloned template. Must be unique. |
Created — clone created in DRAFT state
Bad Request
Not Found — source template not found
Conflict — clone name already exists
Internal Server Error
{- "name": "BIG-IP Standard Template (Copy)"
}{- "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"
}Retrieves a specific task by its ID. For active tasks (PENDING, RUNNING), this endpoint polls the external service for the latest status before returning.
| taskId required | string <uuid> Example: 660e8400-e29b-41d4-a716-446655440001 UUID of the task. |
OK — task retrieved successfully
Bad Request — invalid UUID format
Not Found — task not found
Internal Server Error
{- "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"
}{- "total_devices": 0,
- "bigip_count": 0,
- "f5os_count": 0,
- "version_distribution": {
- "property1": 0,
- "property2": 0
}, - "status_distribution": {
- "property1": 0,
- "property2": 0
}
}| 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: ' |
Paginated fleet device list
{- "data": [
- {
- "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": [
- {
- "name": "string",
- "version": "string",
- "build": "string",
- "status": "string"
}
], - "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
}
], - "pagination": {
- "page": 0,
- "page_size": 0,
- "total": 0,
- "total_pages": 0
}
}| deviceId required | string <uuid> |
Fleet device details
Resource not found
{- "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": [
- {
- "name": "string",
- "version": "string",
- "build": "string",
- "status": "string"
}
], - "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
}| deviceId required | string <uuid> |
Device metadata refreshed
Resource not found
{- "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": [
- {
- "name": "string",
- "version": "string",
- "build": "string",
- "status": "string"
}
], - "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
}Accepts an asynchronous reboot request and returns immediately with
202 Accepted. The request body is optional:
volume is empty), the device is rebooted into its
currently active volume (plain reboot).volume is provided, the device is rebooted into that volume
(equivalent to a rollback/roll-forward). The task performs all
validations asynchronously:ListVolumes check)In both cases, a device lock must be acquirable before reboot.
Poll GET /devices/{deviceId}/reboot/{taskId} for progress and final outcome.
| deviceId required | string <uuid> |
| 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). |
Reboot task accepted. Lock acquisition and validation happen asynchronously; check task status for errors.
Invalid request
Internal server error
{- "volume": "string",
- "install_configuration": false
}{- "task_id": "string",
- "status": "QUEUED",
- "created_at": "2026-10-29T14:02:58Z"
}| deviceId required | string <uuid> |
| taskId required | string <uuid> |
Reboot task details
Resource not found
Internal server error
{- "task_id": "string",
- "device_id": "string",
- "target_volume": "string",
- "status": "QUEUED",
- "target_version": "string",
- "previous_volume": "string",
- "previous_version": "string",
- "error": {
- "error": "string",
- "code": "string"
}, - "started_at": "2026-10-29T14:02:58Z",
- "completed_at": "2026-10-29T14:02:58Z",
- "created_at": "2026-10-29T14:02:58Z"
}| deviceId required | string <uuid> |
Current device state
Bad request (e.g. F5OS device)
Resource not found
Internal server error
{- "failover_state": "active",
- "ha_role": "ACTIVE"
}| deviceId required | string <uuid> |
| action required | string Enum: "force_offline" "release_offline" "force_standby" |
State change completed successfully
Bad request (invalid action, F5OS device, standalone device for standby)
Resource not found
Conflict (already in requested state, or device locked)
Internal server error
{- "action": "force_offline"
}{- "task_id": "string",
- "action": "force_offline",
- "status": "COMPLETED",
- "previous_state": {
- "failover_state": "active",
- "ha_role": "ACTIVE"
}, - "current_state": {
- "failover_state": "active",
- "ha_role": "ACTIVE"
}, - "error": {
- "error": "string",
- "code": "string"
}, - "created_at": "2026-10-29T14:02:58Z"
}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}.
| required_size_bytes required | integer <int64> >= 1 Required disk size per device, in bytes |
| devices required | Array of objects (DiskAnalysisBatchDeviceInput) non-empty |
Disk space analysis task accepted
Invalid request
{- "required_size_bytes": 1,
- "devices": [
- {
- "device_id": "string"
}
]
}{- "task_id": "string",
- "status": "QUEUED",
- "created_at": "2026-10-29T14:02:58Z"
}| taskId required | string <uuid> |
Disk analysis task details
Resource not found
{- "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": {
- "total_devices": 0,
- "analyzed_devices": 0,
- "sufficient_count": 0,
- "insufficient_count": 0
}, - "result": {
- "required_size_bytes": 0,
- "data": [
- {
- "device_id": "string",
- "host": "string",
- "analysis_status": "SUFFICIENT",
- "available_disk_bytes": 0,
- "has_sufficient_space": true,
- "error_message": "string"
}
], - "summary": {
- "sufficient_count": 0,
- "insufficient_count": 0
}
}, - "error": {
- "error": "string",
- "code": "string"
}
}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}.
| 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. |
Device metadata refresh task accepted
Invalid request
{- "devices": [
- {
- "device_id": "string"
}
], - "metadata_types": [
- "SYSTEM"
]
}{- "task_id": "string",
- "status": "QUEUED",
- "created_at": "2026-10-29T14:02:59Z"
}| taskId required | string <uuid> |
Device refresh task details
Resource not found
{- "task_id": "string",
- "status": "QUEUED",
- "metadata_types": [
- "SYSTEM"
], - "created_at": "2026-10-29T14:02:59Z",
- "started_at": "2026-10-29T14:02:59Z",
- "completed_at": "2026-10-29T14:02:59Z",
- "progress": {
- "total_devices": 0,
- "refreshed_devices": 0,
- "success_count": 0,
- "failed_count": 0
}, - "result": {
- "data": [
- {
- "device_id": "string",
- "status": "SUCCESS",
- "error_message": "string"
}
], - "summary": {
- "success_count": 0,
- "failed_count": 0
}
}, - "error": {
- "error": "string",
- "code": "string"
}
}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.
| job_ids required | Array of strings <uuid> [ 1 .. 100 ] items List of job IDs to delete (1–100 items) |
Bulk delete results (partial success possible)
Invalid request
{- "job_ids": [
- "550e8400-e29b-41d4-a716-446655440001",
- "550e8400-e29b-41d4-a716-446655440002"
]
}{- "results": [
- {
- "job_id": "550e8400-e29b-41d4-a716-446655440001",
- "status": "DELETED"
}, - {
- "job_id": "550e8400-e29b-41d4-a716-446655440002",
- "status": "FAILED",
- "error": "job cannot be deleted while it has live work — abort the job first"
}
]
}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.
| workflowId required | string <uuid> |
| 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" |
List of jobs
Invalid new filter or existing generated parameter (msg), or an existing application-level list rejection (error).
Resource not found
{- "items": [
- {
- "id": "114ca9f9-88a3-49e1-92f2-757d7fedde98",
- "workflowId": "b7e6a4ae-4cf9-4ad4-b8f9-9b5347300d73",
- "name": "tenant-a-autoscale",
- "status": "ACTIVE",
- "createdAt": "2026-05-18T11:00:00.000Z",
- "updatedAt": "2026-05-18T11:00:00.000Z"
}
], - "total": 1,
- "page": 1,
- "limit": 50
}Creates a new runtime Job under a workflow template.
Job-level config overrides are merged with template defaultConfig
to produce effectiveConfig used during execution.
| workflowId required | string <uuid> |
| 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 | 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) |
Job created
Invalid request
Resource not found
{- "type": "AUTO_SCALE",
- "name": "tenant-a-autoscale",
- "enabled": false,
- "config": {
- "configType": "AUTO_SCALE",
- "environmentReference": "550e8400-e29b-41d4-a716-446655440000",
- "templateReference": "550e8400-e29b-41d4-a716-446655440001",
- "licensePoolReference": "550e8400-e29b-41d4-a716-446655440003",
- "minSize": 2,
- "maxSize": 8,
- "desiredSize": 3,
- "evaluationPeriod": 300,
- "scaleInMethod": "NEWEST_FIRST",
- "scaleOutCooldownSeconds": 600,
- "scaleInCooldownSeconds": 900
}
}{- "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"
}Returns one Job including resolved configuration (effectiveConfig),
lifecycle status, and runtime/schedule state when applicable.
| workflowId required | string <uuid> |
| jobId required | string <uuid> |
Job
Resource not found
{- "id": "114ca9f9-88a3-49e1-92f2-757d7fedde98",
- "workflowId": "b7e6a4ae-4cf9-4ad4-b8f9-9b5347300d73",
- "name": "tenant-a-autoscale",
- "type": "AUTO_SCALE",
- "status": "ACTIVE",
- "config": {
- "configType": "AUTO_SCALE",
- "minSize": 2,
- "maxSize": 8,
- "desiredSize": 4,
- "scaleOutCooldownSeconds": 600,
- "scaleInCooldownSeconds": 900
}, - "runtime": {
- "currentSize": 4,
- "lastEvaluatedAt": "2026-05-18T11:09:30.000Z"
}, - "createdAt": "2026-05-18T11:00:00.000Z",
- "updatedAt": "2026-05-18T11:10:00.000Z"
}Not allowed while a CONTINUOUS job is ACTIVE or an ON_DEMAND execution is RUNNING.
| workflowId required | string <uuid> |
| jobId required | string <uuid> |
| 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 | 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) |
Updated job
Invalid request
Resource not found
Conflict with current resource state
{- "name": "tenant-a-autoscale-prod"
}{- "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"
}Terminates any running executions before deletion.
| workflowId required | string <uuid> |
| jobId required | string <uuid> |
Deleted
Resource not found
Conflict with current resource state
{- "code": "string",
- "message": "string",
- "details": [
- "string"
]
}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.
| workflowId required | string <uuid> |
| jobId required | string <uuid> |
| 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. |
Instances for the job
Invalid new filter or existing generated parameter (msg), or an existing application-level list rejection (error).
Resource not found
{- "items": [
- {
- "id": "65b1c38e-44b9-48e3-9fd3-38ffab1b6da1",
- "workflowId": "b7e6a4ae-4cf9-4ad4-b8f9-9b5347300d73",
- "jobId": "114ca9f9-88a3-49e1-92f2-757d7fedde98",
- "hostname": "bigip-tenant-a-01",
- "ip": "10.145.134.204",
- "status": "READY",
- "managementAddr": "10.145.134.204",
- "providerGuestRef": "vm-stub-65b1c38e-44b9-48e3-9fd3-38ffab1b6da1",
- "createdAt": "2026-05-18T11:20:00.000Z",
- "updatedAt": "2026-05-18T11:20:00.000Z",
- "deletedAt": null
}
], - "totalItems": 1
}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.
| workflowId required | string <uuid> |
| jobId required | string <uuid> |
| instanceId required | string <uuid> |
Instance delete accepted
Invalid request
Resource not found
Conflict with current resource state
Request is valid but cannot be applied to the target resource
{- "message": "instance delete accepted",
- "executionId": "5e77dd71-4636-42bf-a039-c2236106f9c3",
- "instanceId": "65b1c38e-44b9-48e3-9fd3-38ffab1b6da1",
- "status": "RUNNING"
}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.
| workflowId required | string <uuid> |
| jobId required | string <uuid> |
| 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. |
Devices for the job
Invalid new filter or existing generated parameter (msg), or an existing application-level list rejection (error).
Resource not found
{- "items": [
- {
- "id": "string",
- "workflowId": "string",
- "jobId": "string",
- "createdByExecutionId": "string",
- "lastUpdatedByExecutionId": "string",
- "deletedByExecutionId": "string",
- "hostname": "string",
- "ip": "string",
- "status": "PROVISIONING",
- "role": "ACTIVE",
- "trafficState": "UNKNOWN",
- "managementAddr": "string",
- "providerGuestRef": "string",
- "vmName": "string",
- "statsDeviceId": "string",
- "createdAt": "2026-10-29T14:02:59Z",
- "updatedAt": "2026-10-29T14:02:59Z",
- "deletedAt": "2026-10-29T14:02:59Z"
}
], - "totalItems": 0
}Returns the health status of the license service including activation status, storage metrics, and license information
License service is healthy
Service unavailable
{- "status": {
- "health": "green",
- "message": "Activation service healthy",
- "errors": [ ]
}, - "license": {
- "activation_timestamp": "2025-12-03T07:18:11Z",
- "license_sub_status": "Active",
- "status": "Active",
- "expiry_date": "2026-11-29T00:00:32Z",
- "telemetry_status": "Enabled",
- "telemetry_last_verified": "2025-12-10T05:12:45Z",
- "telemetry_error": "if any error while sending telemetry",
- "mode_of_operation": "connected",
- "order_type": "eval"
}, - "storage": {
- "used_percent": 15.7,
- "used_gb": 500,
- "entitled_gb": 300
}
}Activates the license for the service and returns activation status, digital asset ID, entitlements, and subscription details
| 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 |
License activated successfully
License switch accepted and in progress
Invalid activation request
Unauthorized activation attempt
A license switch is already in progress
Internal server error
Service unavailable - unable to connect to licensing server
{- "jwt": "your-jwt-token",
- "customId": "string",
- "modeOfOperation": "connected"
}{- "status": "success",
- "message": "License activated successfully",
- "digitalAssetId": "DA-12345-67890",
- "licenseStatus": "Active",
- "activatedAt": "2025-12-03T07:18:11Z",
- "hostLicense": {
- "licenseId": "LIC-12345-ABCDE",
- "subscriptionType": "trial",
- "orderType": "subscription",
- "expiryDate": "2026-11-29T00:00:32Z",
- "isActive": true
}, - "entitlements": [
- {
- "featureId": "FEAT-001",
- "featureName": "AI-Driven Forecasting",
- "featurePermitted": 1000,
- "featureRemain": 750,
- "featureUnlimited": false,
- "featureUsed": 250,
- "featureValueType": "integral",
- "uomCode": "GB",
- "uomTerm": "gigabytes",
- "uomTermStart": 0
}
], - "subscriptionType": "trial",
- "expiryDate": "2026-11-29T00:00:32Z"
}Deactivates the license for the service and returns deactivation status
License deactivated successfully
Invalid deactivation request
Unauthorized deactivation attempt
Internal server error
{- "status": "success",
- "message": "License deactivated successfully",
- "digitalAssetId": "string",
- "licenseStatus": "Terminated",
- "deactivatedAt": "2026-10-29T14:02:59Z"
}Downloads the license report in disconnected mode (base64 encoded)
License report downloaded successfully
Operation not allowed in connected mode
Internal server error
{- "report": "eyJyZXBvcnROYW1lIjoibXktcmVwb3J0IiwidGVsZW1ldHJ5UmVjb3JkcyI6W119"
}Verifies a signed license report acknowledgment from F5 TEEM in disconnected mode
| manifest required | string Base64 encoded signed report acknowledgment from F5 TEEM |
Report verification initiated successfully
Invalid request body
Operation not allowed in connected mode
Internal server error
{- "manifest": "eyJzaWduZWRBY2siOiJ0ZXN0In0="
}{- "message": "Operation successful"
}Retrieves license entitlements from llm sdk
License entitlements retrieved successfully
Internal server error
{- "entitlements": { },
- "status": "success"
}Returns the license activation, assignment, revocation, and deletion audit trail.
| 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. |
Paginated license audit events.
Invalid query parameter.
Unauthorized.
Internal server error.
{- "items": [
- {
- "id": "string",
- "eventType": "LICENSE_ACTIVATED",
- "poolType": "REGKEY_POOL",
- "poolId": "string",
- "poolName": "string",
- "offeringId": "string",
- "regKey": "string",
- "memberId": "string",
- "deviceAddress": "string",
- "deviceName": "string",
- "actor": "string",
- "details": "string",
- "occurredAt": "2026-10-29T14:02:59Z"
}
], - "totalItems": 0,
- "page": 0,
- "limit": 0,
- "totalPages": 0
}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.
| deviceAddress required | string IP address of the BIG-IP device |
| hostname required | string Hostname of the BIG-IP device |
Hostname updated successfully
Bad request - missing or invalid fields
Unauthorized
License member not found for the given device address
Internal server error
{- "deviceAddress": "192.168.1.100",
- "hostname": "bigip-ve-001.local"
}{- "code": 400,
- "message": "The license U5939-99933-49705-74523-4841009 has been granted to a device",
- "details": "string",
- "timestamp": "2026-10-29T14:02:59Z"
}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.
| workflowId required | string <uuid> |
| jobId required | string <uuid> |
| executionId required | string <uuid> |
| reason | string Operator-provided reason for cancelling the execution. |
Cancellation accepted
Resource not found
Conflict with current resource state
{- "reason": "Operator cancelled runaway scale-out"
}{- "executionId": "string",
- "jobId": "string",
- "status": "CANCELLING",
- "message": "Cancellation requested. Resource compensation cleanup in progress."
}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).
| workflowId required | string <uuid> |
| jobId required | string <uuid> |
Job activated
Invalid request
Resource not found
Conflict with current resource state
{- "id": "220f0b6b-87e7-4e5f-bcc2-9f2d26786ac6",
- "workflowId": "b7e6a4ae-4cf9-4ad4-b8f9-9b5347300d73",
- "status": "ACTIVE",
- "enabled": true
}Halts automatic evaluation for CONTINUOUS execution. No new activities are triggered while paused. In-flight activity processing may complete before full pause takes effect.
| workflowId required | string <uuid> |
| jobId required | string <uuid> |
Job paused
Resource not found
Conflict with current resource state
{- "message": "job paused"
}Resumes automatic evaluation for a previously paused CONTINUOUS job. New activities can be generated again based on policy/signal conditions.
| workflowId required | string <uuid> |
| jobId required | string <uuid> |
Job resumed
Resource not found
Conflict with current resource state
{- "message": "job resumed"
}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.
Success
Caller is not an admin
Internal Error
{- "users": [
- {
- "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"
}
], - "total_count": 0
}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.
| 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. |
User created
Bad Request
Caller is not an admin
A user with this username already exists
Internal Error
{- "username": "string",
- "email": "user@example.com",
- "display_name": "string",
- "password": "string",
- "role": "string"
}{- "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"
}| id required | string |
Success
Caller is not an admin
Not Found
Internal Error
{- "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"
}Updates a local user's display name, email, and/or role. Only the supplied fields are changed. Admin only.
| id required | string |
| display_name | string Nullable |
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. |
User updated
Bad Request
Caller is not an admin
Not Found
Internal Error
{- "display_name": "string",
- "email": "user@example.com",
- "role": "string"
}{- "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"
}Removes the local user from the identity provider and the F5 Insights database. Admin only.
| id required | string |
User deleted
Caller is not an admin
Not Found
Internal Error
{- "status": "success",
- "message": "User 'jdoe' deleted successfully",
- "id": "string"
}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.
| id required | string |
| 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. |
Role updated
Bad Request
Caller is not an admin
Not Found
Internal Error
{- "role": "string"
}{- "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"
}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.
| id required | string |
| 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. |
Password reset initiated
Caller is not an admin
Not Found
Internal Error
{- "send_email": false
}{- "message": "string",
- "temp_password": "string"
}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.
| current_password required | string non-empty |
| new_password required | string non-empty |
Password changed
Bad Request
Current password is incorrect or caller is not authenticated
Not Found
Internal Error
{- "current_password": "string",
- "new_password": "string"
}{- "message": "Operation successful"
}Switch F5 Insight between lite and full modes.
Mode Descriptions:
Constraints:
| target_mode required | string Enum: "lite" "full" Target mode to switch to |
Mode switch initiated successfully
Invalid request (same mode, full→lite not allowed, invalid mode)
License validation failed (lite→full requires valid license)
Internal server error
{- "target_mode": "full"
}{- "task_id": "123e4567-e89b-12d3-a456-426614174000",
- "target_mode": "full",
- "status": "submitted"
}Query the progress of a mode switch task by task_id.
FSM States:
| task_id required | string <uuid> Example: 123e4567-e89b-12d3-a456-426614174000 UUID of the mode switch task |
Mode switch status retrieved successfully
Invalid task_id format
Task not found
Internal server error
{- "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"
}Returns information about the current system mode (lite/full).
Mode capabilities retrieved successfully
Internal server error
{- "current_mode": "lite",
- "message": ""
}Returns the currently running (non-terminal) mode switch task. Returns 404 when no mode switch is in progress.
Active mode switch task found
No mode switch task in progress
Internal server error
{- "task_id": "123e4567-e89b-12d3-a456-426614174000",
- "state": "HELM_UPGRADE",
- "status": "running",
- "progress": 50,
- "error_message": "Helm upgrade failed"
}Get the current global metrics collection configuration for OTEL collector
Current metrics configuration
Internal server error
{- "metrics_enabled": true,
- "updated_at": "2026-07-28T10:30:00Z"
}Update the global metrics collection configuration. When disabled, OTEL collector skips all BigIP receiver creation. Triggers OTEL collector restart.
| metrics_enabled required | boolean Set to false to disable all metrics collection system-wide |
Configuration updated successfully
Invalid request
Internal server error
{- "metrics_enabled": true
}{- "metrics_enabled": true,
- "updated_at": "2026-07-28T10:30:00Z"
}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.
| 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 |
| 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 |
List of jobs
Invalid new filter or existing generated parameter (msg), or an existing application-level list rejection (error).
{- "items": [
- {
- "id": "220f0b6b-87e7-4e5f-bcc2-9f2d26786ac6",
- "workflowId": "b7e6a4ae-4cf9-4ad4-b8f9-9b5347300d73",
- "name": "tenant-a-autoscale",
- "status": "ACTIVE",
- "createdAt": "2026-05-18T12:00:00.000Z",
- "updatedAt": "2026-05-18T14:45:00.000Z"
}
], - "pagination": {
- "page": 1,
- "page_size": 50,
- "total": 1,
- "total_pages": 1
}
}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.
| 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. |
List of executions (common fields only)
Invalid new filter or existing generated parameter (msg), or an existing application-level list rejection (error).
{- "items": [
- {
- "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"
}, - {
- "id": "7d8f5576-6414-410f-8f5a-0c34f95df3b0",
- "jobId": "114ca9f9-88a3-49e1-92f2-757d7fedde98",
- "workflowId": "b7e6a4ae-4cf9-4ad4-b8f9-9b5347300d73",
- "status": "COMPLETED",
- "executionUrl": "/v1/workflows/b7e6a4ae-4cf9-4ad4-b8f9-9b5347300d73/jobs/114ca9f9-88a3-49e1-92f2-757d7fedde98/executions/7d8f5576-6414-410f-8f5a-0c34f95df3b0",
- "startedAt": "2026-05-18T12:10:00.000Z",
- "endedAt": "2026-05-18T12:17:00.000Z"
}
], - "totalItems": 2
}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.
| workflowId required | string <uuid> |
| jobId required | string <uuid> |
| 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. |
List of executions merged with AUTO_SCALE detail when present
Invalid new filter or existing generated parameter (msg), or an existing application-level list rejection (error).
Resource not found
{- "items": [
- {
- "id": "2f2f8b64-91d2-4d4f-9aa8-03b8a9238ea1",
- "jobId": "b4b9a9a0-4ecb-4f9a-b9ab-8a25fdca0db8",
- "workflowId": "5f0c5a8a-2f2f-4a0a-9a4a-8a25fdca0db8",
- "status": "RUNNING",
- "executionUrl": "/v1/workflows/5f0c5a8a-2f2f-4a0a-9a4a-8a25fdca0db8/jobs/b4b9a9a0-4ecb-4f9a-b9ab-8a25fdca0db8/executions/2f2f8b64-91d2-4d4f-9aa8-03b8a9238ea1",
- "startedAt": "2026-05-18T08:10:00.000Z",
- "direction": "SCALE_OUT",
- "strategy": "STANDBY_PROMOTION",
- "reason": "desired vs actual delta: 1",
- "currentStep": "REGISTER_INSTANCE"
}, - {
- "id": "7d8f5576-6414-410f-8f5a-0c34f95df3b0",
- "jobId": "b4b9a9a0-4ecb-4f9a-b9ab-8a25fdca0db8",
- "workflowId": "5f0c5a8a-2f2f-4a0a-9a4a-8a25fdca0db8",
- "status": "COMPLETED",
- "executionUrl": "/v1/workflows/5f0c5a8a-2f2f-4a0a-9a4a-8a25fdca0db8/jobs/b4b9a9a0-4ecb-4f9a-b9ab-8a25fdca0db8/executions/7d8f5576-6414-410f-8f5a-0c34f95df3b0",
- "startedAt": "2026-05-18T10:00:00.000Z",
- "endedAt": "2026-05-18T10:07:31.000Z",
- "direction": "SCALE_IN",
- "reason": "desired vs actual delta: -1"
}
]
}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.
| workflowId required | string <uuid> |
| jobId required | string <uuid> |
| executionId required | string <uuid> |
Execution detail with steps
Resource not found
{- "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": [
- {
- "id": "0c4208f9-f7bf-4891-a2a3-df08eb7720d8",
- "executionId": "2f2f8b64-91d2-4d4f-9aa8-03b8a9238ea1",
- "stepName": "CREATE_VM",
- "sequence": 1,
- "status": "Completed",
- "attempt": 0,
- "durationMs": 4210
}
]
}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.
| workflowId required | string <uuid> |
| jobId required | string <uuid> |
| executionId required | string <uuid> |
| 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> |
List of activities
Resource not found
{- "items": [
- {
- "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,
- "stepCount": 4
}, - {
- "id": "2729938f-ae9c-4d6b-8d93-2852fc7f4c8c",
- "executionId": "2f2f8b64-91d2-4d4f-9aa8-03b8a9238ea1",
- "activityType": "SCALE_IN",
- "status": "RUNNING",
- "trigger": "SYSTEM",
- "reason": "low utilization evaluation",
- "startedAt": "2026-05-18T12:30:00.000Z",
- "stepCount": 3
}
], - "total": 2,
- "page": 1,
- "limit": 50
}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.
| workflowId required | string <uuid> |
| jobId required | string <uuid> |
| executionId required | string <uuid> |
| activityId required | string <uuid> |
Activity with steps
Resource not found
{- "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": [
- {
- "id": "67b5f8ad-a992-46da-af82-38f5d9a0a4ee",
- "activityId": "0c4208f9-f7bf-4891-a2a3-df08eb7720d8",
- "stepName": "validate-pools",
- "sequence": 1,
- "status": "COMPLETED",
- "startedAt": "2026-05-18T12:20:00.000Z",
- "completedAt": "2026-05-18T12:20:10.000Z",
- "durationMs": 10000
}, - {
- "id": "94aab872-52a5-4b8a-8a95-ffcb2ac5d41a",
- "activityId": "0c4208f9-f7bf-4891-a2a3-df08eb7720d8",
- "stepName": "provision-instance",
- "sequence": 2,
- "status": "COMPLETED",
- "startedAt": "2026-05-18T12:20:10.000Z",
- "completedAt": "2026-05-18T12:20:55.000Z",
- "durationMs": 45000
}, - {
- "id": "20f06e25-48ca-41a9-b6bd-ef517f4ca886",
- "activityId": "0c4208f9-f7bf-4891-a2a3-df08eb7720d8",
- "stepName": "register-instance",
- "sequence": 3,
- "status": "COMPLETED",
- "startedAt": "2026-05-18T12:20:55.000Z",
- "completedAt": "2026-05-18T12:21:05.000Z",
- "durationMs": 10000
}, - {
- "id": "2969654c-f790-4a60-8e0f-cfb75a97f6c8",
- "activityId": "0c4208f9-f7bf-4891-a2a3-df08eb7720d8",
- "stepName": "post-check",
- "sequence": 4,
- "status": "COMPLETED",
- "startedAt": "2026-05-18T12:21:05.000Z",
- "completedAt": "2026-05-18T12:21:15.000Z",
- "durationMs": 10000
}
]
}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.
| workflowId required | string <uuid> |
| jobId required | string <uuid> |
| 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. |
List of autoscale scaling events
Invalid new filter or existing generated parameter (msg), or an existing application-level list rejection (error).
Resource not found
{- "items": [
- {
- "id": "dfee47f7-5e66-4ff2-91ea-e7f7052d6d76",
- "workflowId": "b7e6a4ae-4cf9-4ad4-b8f9-9b5347300d73",
- "jobId": "220f0b6b-87e7-4e5f-bcc2-9f2d26786ac6",
- "source": "ALERT",
- "eventType": "METRIC_ALERT",
- "eventStatus": "PROCESSING",
- "outcome": "APPROVED",
- "direction": "SCALE_OUT",
- "reason": "CPU threshold exceeded",
- "metricName": "cpu_utilization",
- "metricValue": 91.5,
- "threshold": 80,
- "desiredBefore": 1,
- "desiredAfter": 3,
- "delta": 2,
- "executionCount": 2,
- "correlationId": "9f7224ff-f108-4284-a80e-5f31135606fe"
}
], - "totalItems": 1
}Returns one autoscale scaling event with the child autoscale executions created from that decision.
| workflowId required | string <uuid> |
| jobId required | string <uuid> |
| eventId required | string <uuid> |
Autoscale scaling event with child executions
Resource not found
{- "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": [
- {
- "id": "string",
- "jobId": "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",
- "strategy": "FULL_PROVISIONING",
- "instanceId": "string",
- "instanceName": "string",
- "instanceAddress": "string",
- "lastError": "string",
- "correlationId": "string",
- "scalingEventId": "string"
}
]
}Returns the status of components including license, AI integrations, and device onboarding
Onboarding status retrieved successfully
Internal server error
{- "license_status": "ACTIVE",
- "custom_llm_integration": "NOT_CONFIGURED",
- "f5_aidf_integration": "NOT_CONFIGURED",
- "devices_onboarded": "NOT_CONFIGURED"
}Update onboarding status fields. All fields are optional - only provided fields will be updated.
| 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 |
Onboarding status updated successfully
Invalid request body
Internal server error
{- "license_status": "ACTIVE",
- "custom_llm_integration": "NOT_CONFIGURED",
- "f5_aidf_integration": "NOT_CONFIGURED",
- "devices_onboarded": "NOT_CONFIGURED"
}{- "license_status": "ACTIVE",
- "custom_llm_integration": "NOT_CONFIGURED",
- "f5_aidf_integration": "NOT_CONFIGURED",
- "devices_onboarded": "NOT_CONFIGURED"
}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.
| 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. |
Paginated list of readiness runs
Authentication required
{- "data": [
- {
- "run_id": "string",
- "status": "PENDING",
- "device_count": 0,
- "pass_count": 0,
- "warn_count": 0,
- "fail_count": 0,
- "error_count": 0,
- "can_proceed": true,
- "triggered_at": "2026-10-29T14:02:59Z",
- "completed_at": "2026-10-29T14:02:59Z"
}
], - "pagination": {
- "page": 0,
- "page_size": 0,
- "total": 0,
- "total_pages": 0
}
}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.
| 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 |
Check interface.ReadinessDescriptor in DefaultReadinessRegistry.No API envelope changes are required.
| 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. |
Readiness checks triggered — poll GET /readiness/{runId} for results
Invalid request
Authentication required
{- "context": {
- "device_targets": [
- {
- "device_id": "string"
}
], - "image_ids": [
- "string"
], - "delete_other_images": false
}, - "checks": [
- {
- "type": "base_image_presence"
}
]
}{- "run_id": "string",
- "message": "readiness checks triggered"
}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.
| runId required | string <uuid> The readiness run ID returned by POST /readiness |
Readiness check results
Authentication required
Resource not found
{- "run_id": "string",
- "status": "PENDING",
- "device_count": 0,
- "pass_count": 0,
- "warn_count": 0,
- "fail_count": 0,
- "error_count": 0,
- "can_proceed": true,
- "devices": [
- {
- "id": "string",
- "run_id": "string",
- "device_id": "string",
- "hostname": "string",
- "device_type": "string",
- "ha_state": "string",
- "ha_pair_id": "string",
- "ha_peer_device_id": "string",
- "current_step": "string",
- "status": "PENDING",
- "check_results": [
- {
- "check_name": "string",
- "severity": "SOFT",
- "status": "PASS",
- "message": "string",
- "detail": { }
}
], - "started_at": "2026-10-29T14:02:59Z",
- "completed_at": "2026-10-29T14:02:59Z"
}
], - "triggered_at": "2026-10-29T14:02:59Z",
- "completed_at": "2026-10-29T14:02:59Z"
}Bulk import licenses into the specified regkey license pool. Keys are activated by default with Automatic mode.
| poolId required | string <uuid> Example: 7dd7b971-6eb8-4b9e-995b-1dcb1287d65f UUID of the license pool |
| regKeys required | Array of strings List of registration keys to import into the pool |
Bulk import accepted and started asynchronously. Poll the GET endpoint to track per-key status.
Bad request - invalid input
Unauthorized
License pool not found
Internal server error
{- "regKeys": [
- "U5939-99933-49705-74523-4841009",
- "M5969-99933-49705-74523-4841010"
]
}{- "taskId": "string",
- "status": "string",
- "overallStatus": "in-progress"
}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.
| poolId required | string <uuid> Example: 7dd7b971-6eb8-4b9e-995b-1dcb1287d65f UUID of the license pool |
The latest bulk import task for this pool.
No bulk import task found for this pool
Unauthorized
Internal server error
{- "taskId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
- "overallStatus": "completed-with-errors"
}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.
| 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 |
Current status of the bulk import task.
Unauthorized
Task or license pool not found
Internal server error
{- "items": [
- {
- "regKey": "U5939-99933-49705-74523-4841009",
- "status": "success",
}, - {
- "regKey": "M5969-99933-49705-74523-4841010",
- "status": "in-progress",
}, - {
- "regKey": "N5939-99933-49705-74523-4841011",
- "status": "error",
- "error": "Registration key already exists in the pool",
- "selfLink": ""
}
]
}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.
| poolId required | string <uuid> Example: 7dd7b971-6eb8-4b9e-995b-1dcb1287d65f UUID of the license pool |
| 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 |
License offering activation initiated (async operation)
Bad request - invalid registration key or activation failure
Unauthorized
License pool not found
Conflict - registration key already exists in this pool or in another regkey pool
Internal server error
{- "regKey": "U5939-99933-49705-74523-4841009",
- "status": "ACTIVATING_AUTOMATIC",
- "addOnKeys": [ ],
- "name": "",
- "description": ""
}Retrieves all license offerings associated with a specific license pool
| poolId required | string <uuid> Example: 7dd7b971-6eb8-4b9e-995b-1dcb1287d65f UUID of the license pool |
| $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:
|
| $page | integer >= 1 Default: 1 1-based page number |
| $pageSize | integer [ 1 .. 500 ] Default: 50 Number of items per page |
List of license offerings retrieved successfully
Unauthorized
License pool not found
Internal server error
{- "items": [
- {
- "id": "string",
- "name": "string",
- "description": "string",
- "regKey": "string",
- "status": "READY",
- "isAssigned": true,
- "activatedAt": "2026-10-29T14:02:59Z",
- "licenseStartDateTime": "2026-10-29T14:02:59Z",
- "licenseEndDateTime": "2026-10-29T14:02:59Z",
- "serviceCheckDateTime": "2026-10-29T14:02:59Z",
- "deviceIp": "192.168.0.1",
- "deviceName": "string",
- "deviceLicenseStatus": "string",
- "deviceMacAddress": "string"
}
], - "totalItems": 0,
- "tasks": [
- {
- "id": "d4e5f6a7-b8c9-0123-defg-456789abcdef",
- "type": "ASSIGN_LICENSE",
- "status": "IN_PROGRESS",
- "progress": 50,
- "resourceType": "Utility",
- "resourceId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
- "resources": [
- {
- "resourceId": "string",
- "resourceType": "LicenseMember",
- "status": "PENDING",
- "error": {
- "code": 400,
- "message": "The license U5939-99933-49705-74523-4841009 has been granted to a device",
- "details": "string",
- "timestamp": "2026-10-29T14:02:59Z"
}
}
], - "error": {
- "code": 400,
- "message": "The license U5939-99933-49705-74523-4841009 has been granted to a device",
- "details": "string",
- "timestamp": "2026-10-29T14:02:59Z"
}, - "createdAt": "2026-10-29T14:02:59Z",
- "startedAt": "2026-10-29T14:02:59Z",
- "completedAt": "2026-10-29T14:02:59Z"
}
], - "pagination": {
- "page": 1,
- "page_size": 1,
- "total": 0,
- "total_pages": 0
}
}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):
regKeys in the request body to delete only those keys.selectAll=true to delete every offering in the pool.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.regKeys or selectAll must be provided.| poolId required | string <uuid> Example: 7dd7b971-6eb8-4b9e-995b-1dcb1287d65f UUID of the license pool |
| selectAll | boolean Default: false Example: selectAll=true When true, targets all offerings in the pool for deletion. Mutually exclusive with |
| regKeys | Array of strings List of specific registration keys to delete. Mutually exclusive with |
| excludeKeys | Array of strings List of registration keys to exclude from deletion. Only valid when |
All targeted keys deleted successfully. Returns per-key confirmation.
Bad request — invalid input (e.g. both regKeys body field and ?selectAll=true query param provided, or excludeKeys used without ?selectAll=true).
Unauthorized
License pool not found
Conflict — one or more targeted keys are currently assigned to a device. No keys were deleted. Revoke the assignments first and retry.
Internal server error
{- "regKeys": [
- "U5939-99933-49705-74523-4841009",
- "M5969-99933-49705-74523-4841010"
]
}{- "totalDeleted": 2,
- "items": [
- {
- "regKey": "M5969-99933-49705-74523-4841010",
- "status": "deleted"
}, - {
- "regKey": "N5939-99933-49705-74523-4841011",
- "status": "deleted"
}
]
}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.
| 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 |
License offering retrieved successfully
Unauthorized
License pool or offering not found
Internal server error
{- "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": {
- "usage": "F5 Internal Product Development",
- "vendor": "F5 Networks, Inc.",
- "dossier": "1a6806020f683204a3bbb8f3b0cf93c8f61be328908e76b0a570d2b992b0fb300e0c",
- "authVers": "5b",
- "generation": 0,
- "platformId": "Z100",
- "skipLicense": false,
- "featureFlags": [
- {
- "featureName": "perf_SSL_Mbps",
- "featureValue": "2000"
}
], - "activeModules": [
- "BIG-IP, LAB (LTM,APM,ASM,AM, GTM), VE|D826541-4208201|IPV6 Gateway|Rate Shaping",
- "CGN, VE (LAB)|T172156-2328256|Routing Bundle, VE",
- "DNSSEC|M275558-6506420"
], - "authorization": "string",
- "serviceStatus": "As of 2026-05-14 there is no active service contract.",
- "licensedVersion": "8.4.1",
- "optionalModules": [
- "App Mode (TMSH Only, No Root/Bash)",
- "BIG-IP VE, Multicast Routing",
- "PEM, VE",
- "Routing Bundle, VE"
], - "registrationKey": "W5778-33088-84412-26046-5913991",
- "lastUpdateMicros": 0,
- "licensedDateTime": "2026-10-29T14:02:59Z",
- "exclusivePlatform": [
- "Z100",
- "Z100A",
- "Z100H",
- "Z100K",
- "Z100x"
], - "licenseEndDateTime": "2026-10-29T14:02:59Z",
- "licenseStartDateTime": "2026-10-29T14:02:59Z",
- "serviceCheckDateTime": "2026-10-29T14:02:59Z",
- "evaluationEndDateTime": "2026-10-29T14:02:59Z",
- "evaluationStartDateTime": "2026-10-29T14:02:59Z"
}, - "activeModules": [
- "string"
], - "dossier": "1ac56379204d679f59524f2e64300d03b91b4b9ff08225ce0087d91b6cf061227610",
- "publicKey": [
- 0
], - "encryptedPrivateKey": [
- 0
], - "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": {
- "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
- "deviceAddress": "192.168.1.100",
- "deviceName": "bigip-ve-001.local",
- "deviceMacAddress": "00:1A:2B:3C:4D:5E",
- "deviceLicenseText": "string",
- "status": "LICENSED",
- "taskId": "d4e5f6a7-b8c9-0123-defg-456789abcdef",
- "poolId": "7dd7b971-6eb8-4b9e-995b-1dcb1287d65f",
- "poolName": "Production License Pool",
- "poolType": "regkey",
- "regKey": "L4946-10909-05786-22315-2721400",
- "offeringId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
- "assignedAt": "2026-10-29T14:02:59Z",
- "tenantName": "bigip-ve-001.local",
- "offering": "U5939-99933-49705-74523-4841009",
- "revokedAt": "2026-10-29T14:02:59Z"
},
}Updates an existing license offering in the pool. This endpoint supports three distinct operations
based on the status field in the request body:
Request: {"status": "ACTIVATING_AUTOMATIC"}
Response: 202 Accepted with TaskReference
Triggers automatic reactivation via F5 license server. This is an asynchronous operation.
Steps:
Poll the returned task link to check completion status.
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:
User should then submit the dossier to F5 license server UI to obtain license text.
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:
| 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 |
| status required | string Enum: "ACTIVATING_AUTOMATIC" "ACTIVATING_MANUAL" "ACTIVATING_MANUAL_LICENSE_TEXT_PROVIDED" The operation to perform:
|
| licenseText | string License text obtained from F5 license server.
Required when status is |
| 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 |
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)License offering reactivation initiated. Returned for asynchronous operation:
ACTIVATING_AUTOMATIC: Returns task reference for pollingPoll the taskLink to check the status of the reactivation operation.
Bad request - invalid status, missing license text, or operation not allowed
Unauthorized
License pool or offering not found
Internal server error
{- "status": "ACTIVATING_AUTOMATIC"
}{- "id": "f1e2d3c4-b5a6-7890-cdef-123456789abc",
- "regKey": "U5939-99933-49705-74523-4841009",
- "name": "",
- "status": "ACTIVATING_MANUAL_NEED_LICENSE_TEXT",
- "dossier": "1ac56379204d679f59524f2e64300d03b91b4b9ff08225ce0087d91b6cf061227610",
- "message": "Dossier generated. Submit this dossier to F5 license server to obtain license text, then call this endpoint with status ACTIVATING_MANUAL_LICENSE_TEXT_PROVIDED.",
- "createdAt": "2024-01-15T10:30:00Z"
}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.409 Conflict and leaves the offering unchanged.If the license is assigned (isAssigned is true) or granted to a member, returns 400 error.
| 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 |
READY or DEACTIVATION_FAILED license deactivation initiated (async operation)
ACTIVATION_FAILED or ACTIVATING_MANUAL_NEED_LICENSE_TEXT offering deleted locally without contacting the F5 license server
Bad request - license has been granted to a device
Unauthorized
License offering not found
Conflict - offering is already being revoked or its current status does not allow deletion
Internal server error
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.
| 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 |
| targetPoolName required | string Name of the target license pool to move the offering to |
License offering moved successfully to the new pool
Bad request - offering is assigned, same-pool move attempted, or invalid parameters
Unauthorized
License pool or offering not found
Internal server error
{- "targetPoolName": "New Pool Name"
}{- "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": {
- "usage": "F5 Internal Product Development",
- "vendor": "F5 Networks, Inc.",
- "dossier": "1a6806020f683204a3bbb8f3b0cf93c8f61be328908e76b0a570d2b992b0fb300e0c",
- "authVers": "5b",
- "generation": 0,
- "platformId": "Z100",
- "skipLicense": false,
- "featureFlags": [
- {
- "featureName": "perf_SSL_Mbps",
- "featureValue": "2000"
}
], - "activeModules": [
- "BIG-IP, LAB (LTM,APM,ASM,AM, GTM), VE|D826541-4208201|IPV6 Gateway|Rate Shaping",
- "CGN, VE (LAB)|T172156-2328256|Routing Bundle, VE",
- "DNSSEC|M275558-6506420"
], - "authorization": "string",
- "serviceStatus": "As of 2026-05-14 there is no active service contract.",
- "licensedVersion": "8.4.1",
- "optionalModules": [
- "App Mode (TMSH Only, No Root/Bash)",
- "BIG-IP VE, Multicast Routing",
- "PEM, VE",
- "Routing Bundle, VE"
], - "registrationKey": "W5778-33088-84412-26046-5913991",
- "lastUpdateMicros": 0,
- "licensedDateTime": "2026-08-17T06:19:15.673Z",
- "exclusivePlatform": [
- "Z100",
- "Z100A",
- "Z100H",
- "Z100K",
- "Z100x"
], - "licenseEndDateTime": "2026-08-17T06:19:15.673Z",
- "licenseStartDateTime": "2026-08-17T06:19:15.673Z",
- "serviceCheckDateTime": "2026-08-17T06:19:15.673Z",
- "evaluationEndDateTime": "2026-08-17T06:19:15.673Z",
- "evaluationStartDateTime": "2026-08-17T06:19:15.673Z"
}, - "dossier": "1ac56379204d679f59524f2e64300d03b91b4b9ff08225ce0087d91b6cf061227610",
- "publicKey": [
- 0
], - "encryptedPrivateKey": [
- 0
], - "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": {
- "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
- "deviceAddress": "192.168.1.100",
- "deviceName": "bigip-ve-001.local",
- "deviceMacAddress": "00:1A:2B:3C:4D:5E",
- "deviceLicenseText": "string",
- "status": "LICENSED",
- "taskId": "d4e5f6a7-b8c9-0123-defg-456789abcdef",
- "assignedAt": "2026-08-17T06:19:15.673Z",
- "revokedAt": "2026-08-17T06:19:15.673Z"
}
}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):
offerings in the request body to move only those offerings.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.offerings or selectAll must be provided.targetPoolName is required in the request body and cannot be the current pool.| poolId required | string <uuid> Example: 7dd7b971-6eb8-4b9e-995b-1dcb1287d65f UUID of the current license pool |
| selectAll | boolean Default: false When true, targets all offerings in the pool to move. Mutually exclusive with |
| 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 |
License offerings moved successfully to the target pool
Bad request - invalid selection, same-pool move attempted, or target pool duplicate
Unauthorized
Current license pool or target license pool not found
Conflict - one or more targeted offerings are assigned to devices
Internal server error
{- "targetPoolName": "Target Pool Name",
- "offerings": [
- "U5939-99933-49705-74523-4841009",
- "M5969-99933-49705-74523-4841010"
]
}{- "total": 2,
- "items": [
- {
- "regKey": "U5939-99933-49705-74523-4841009",
- "status": "moved",
- "selfLink": "/api/v1/fleet/licensing/tmos/pool/regkey/licenses/7dd7b971-6eb8-4b9e-995b-1dcb1287d65f/offerings/U5939-99933-49705-74523-4841009"
}
]
}Operations for managing license offering assignments to BIG-IP devices
Assign a license from the pool to a specific BIG-IP device member
| 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 |
| deviceId required | string <uuid> Managed-device ID to assign the license to |
License assignment initiated (async operation)
Bad request - invalid parameters, no available licenses, or license already granted
Unauthorized
License pool or offering not found
Conflict - device already has a regkey license assignment
Internal server error
{- "deviceId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
}Retrieves all members (BIG-IP devices) that have been assigned licenses from a specific offering
| 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 |
| $page | integer >= 1 Default: 1 1-based page number |
| $pageSize | integer [ 1 .. 500 ] Default: 50 Number of items per page |
List of license members retrieved successfully
Unauthorized
License pool or offering not found
Internal server error
{- "items": [
- {
- "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
- "deviceAddress": "192.168.1.100",
- "deviceName": "bigip-ve-001.local",
- "deviceMacAddress": "00:1A:2B:3C:4D:5E",
- "deviceLicenseText": "string",
- "status": "LICENSED",
- "taskId": "d4e5f6a7-b8c9-0123-defg-456789abcdef",
- "poolId": "7dd7b971-6eb8-4b9e-995b-1dcb1287d65f",
- "poolName": "Production License Pool",
- "poolType": "regkey",
- "regKey": "L4946-10909-05786-22315-2721400",
- "offeringId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
- "assignedAt": "2026-10-29T14:02:59Z",
- "tenantName": "bigip-ve-001.local",
- "offering": "U5939-99933-49705-74523-4841009",
- "revokedAt": "2026-10-29T14:02:59Z"
}
], - "totalItems": 0,
- "pagination": {
- "page": 1,
- "page_size": 1,
- "total": 0,
- "total_pages": 0
}
}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.
| 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 |
| 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. |
License successfully revoked from the device
Bad request - revocation failed
Unauthorized
License member not found
Internal server error
{- "code": 400,
- "message": "The license U5939-99933-49705-74523-4841009 has been granted to a device",
- "details": "string",
- "timestamp": "2026-10-29T14:02:59Z"
}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.
| 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 |
License member reactivation initiated (async operation)
License pool, offering, or member not found
Internal server error
Fetches all available license pools in the system.
| $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 |
returns list of all License pools successfully
Bad request - invalid input
Unauthorized
Internal server error
{- "items": [
- {
- "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"
}
], - "totalItems": 0,
- "pagination": {
- "page": 1,
- "page_size": 1,
- "total": 0,
- "total_pages": 0
}
}Creates a new license pool that can hold multiple license offerings
| name required | string Name of the license pool |
| description | string Description of the license pool |
License pool created successfully
Bad request - invalid input
Unauthorized
Internal server error
{- "name": "test",
- "description": ""
}{- "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 given ID in the path parameter
| poolId required | string <uuid> Example: 7dd7b971-6eb8-4b9e-995b-1dcb1287d65f UUID of the license pool |
Returns the License pool successfully
Bad request - invalid input
Unauthorized
License pool not found
Internal server error
{- "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"
}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.
| poolId required | string <uuid> Example: 7dd7b971-6eb8-4b9e-995b-1dcb1287d65f UUID of the license pool |
License pool deleted successfully
Bad request - pool has outstanding grants
Unauthorized
License pool not found
Internal server error
{- "code": 400,
- "message": "Found 1 outstanding grant(s). They must be removed before this license can be deleted."
}Updates the name and/or description of a license pool.
| poolId required | string <uuid> Example: 7dd7b971-6eb8-4b9e-995b-1dcb1287d65f UUID of the license pool |
| name | string Updated name for the license pool |
| description | string Updated description for the license pool |
License pool updated successfully
Bad request - invalid input
Unauthorized
License pool not found
Conflict - a pool with the given name already exists
Internal server error
{- "name": "my-pool",
- "description": "My updated pool description"
}{- "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"
}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).
| deviceId required | string <uuid> Unique identifier of the onboarded device |
Device license status retrieved successfully
Unauthorized to retrieve device details
Device not found
Internal server error
{- "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",
- "licenseType": "Evaluation",
- "licensedDate": "2026-09-16",
- "licenseExpirationDate": "2026-10-17",
- "activeModules": [
- {
- "module": "Advanced Firewall Manager, VE-3G",
- "key": "D111111-2222222",
- "subModules": [
- "APM-VE, 250 VPN Users"
]
}
], - "optionalModules": [
- "Advanced Web Application Firewall, VE-3G"
], - "addOnKeys": [
- "A111111-2222222",
- "B333333-4444444"
], - "eulaText": "string",
- "message": "string",
- "updatedAt": "2026-10-29T14:02:59Z",
- "canReactivate": true,
- "task": {
- "taskId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
- "taskUrl": "/api/v1/fleet/licensing/reactivate/tasks?taskId=d4e5f6a7-b8c9-4123-8abc-456789abcdef"
}
}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.| deviceId required | string <uuid> Unique identifier of the onboarded device |
Reactivation mode configuration.
| mode required | string Enum: "ACTIVATING_AUTOMATIC" "ACTIVATING_MANUAL" Reactivation mode for the device. |
Phase 1 manual re-activation initiated successfully. Returns the generated dossier awaiting license text.
Automatic re-activation task accepted and running asynchronously
Bad request during device license re-activation
Unauthorized to perform device license re-activation
Device not found during device license re-activation
Conflict occurred during device license re-activation
Internal server error
{- "mode": "ACTIVATING_MANUAL"
}{- "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",
- "licenseType": "Evaluation",
- "licensedDate": "2026-09-16",
- "licenseExpirationDate": "2026-10-17",
- "activeModules": [
- {
- "module": "Advanced Firewall Manager, VE-3G",
- "key": "D111111-2222222",
- "subModules": [
- "APM-VE, 250 VPN Users"
]
}
], - "optionalModules": [
- "Advanced Web Application Firewall, VE-3G"
], - "addOnKeys": [
- "A111111-2222222",
- "B333333-4444444"
], - "eulaText": "string",
- "message": "string",
- "updatedAt": "2026-10-29T14:02:59Z",
- "canReactivate": true,
- "task": {
- "taskId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
- "taskUrl": "/api/v1/fleet/licensing/reactivate/tasks?taskId=d4e5f6a7-b8c9-4123-8abc-456789abcdef"
}
}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.
reactivationStatus: ACTIVATING_AUTOMATIC_NEED_EULA_ACCEPT), call this endpoint with reactivationStatus: EULA_ACCEPTED
and the matching eulaText to resume.| deviceId required | string <uuid> Unique identifier of the onboarded device |
| 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). |
Re-activation task running asynchronously
Bad request during device license re-activation
Unauthorized to perform device license re-activation
Device not found during device license re-activation
Conflict occurred during device license re-activation
Internal server error
{- "reactivationStatus": "ACTIVATING_MANUAL_LICENSE_TEXT_PROVIDED",
- "licenseText": "-----BEGIN CERTIFICATE-----\nMIID5TCCAs2gAwIBAgIJAPk3R4qG...\n-----END CERTIFICATE-----"
}{- "taskId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
- "taskUrl": "/api/v1/fleet/licensing/reactivate/tasks?taskId=d4e5f6a7-b8c9-4123-8abc-456789abcdef"
}Connects live to the device, refreshes its licensing and system inventory, updates the database cache, and returns the refreshed device.
| deviceId required | string <uuid> Unique identifier of the onboarded device |
Device licensing metadata successfully refreshed
Bad request
Unauthorized
Device not found
Internal server error
Device is unreachable
{- "id": "string",
- "device_type": "BIGIP",
- "device_name": "bigip/bigip.com",
- "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"
}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}).
| jobId required | string <uuid> UUID of the relicense job |
| executionId required | string <uuid> UUID of the relicense execution |
| 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) |
Complete execution device progress
Unauthorized
Execution not found
Internal server error
{- "devices": [
- {
- "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": [
- {
- "step": "Validation",
- "sequence": 1,
- "status": "RUNNING",
- "retryCount": 0,
- "startedAt": "2026-10-29T14:02:59Z",
- "completedAt": "2026-10-29T14:02:59Z",
- "durationMs": 0,
- "errorCode": "string",
- "errorMessage": "string"
}
]
}
], - "totalItems": 0,
- "pagination": {
- "page": 0,
- "page_size": 0,
- "total": 0,
- "total_pages": 0
}
}Returns one per-device state row for a relicense execution.
| 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 |
Execution device state retrieved successfully
Unauthorized
Execution device state not found
Internal server error
{- "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": [
- {
- "step": "Validation",
- "sequence": 1,
- "status": "RUNNING",
- "retryCount": 0,
- "startedAt": "2026-10-29T14:02:59Z",
- "completedAt": "2026-10-29T14:02:59Z",
- "durationMs": 0,
- "errorCode": "string",
- "errorMessage": "string"
}
]
}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.
| 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 |
EULA text retrieved successfully
Unauthorized
Execution or device not found
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.
Internal server error
{- "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"
}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.
| 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 |
| eulaText required | string The EULA text previously returned by |
| acceptAll | boolean Default: false When |
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.
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.
Unauthorized
Execution or device state not found
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}.
Internal server error
{- "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
}{- "accepted": true,
- "autoAcceptRemainingDevices": false,
- "deviceId": "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa",
- "executionId": "bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb",
- "message": "license reactivation EULA accepted"
}Creates a new execution for a DRAFT or READY relicense job and starts batch processing.
| jobId required | string <uuid> UUID of the relicense job |
| changeRequest | string Nullable Optional change-control ticket reference for this execution |
Relicense execution accepted
Bad request - invalid input
Unauthorized
Job not found
Conflict - job is not activatable or already has an active execution
Internal server error
{- "changeRequest": "CHG0012345"
}{- "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": {
- "pending": 0,
- "running": 0,
- "awaitingUser": 0,
- "completed": 0,
- "failed": 0,
- "cancelled": 0
}
}Returns a paginated list of execution records for a relicense job.
| jobId required | string <uuid> UUID of the relicense job |
| $page | integer >= 1 Default: 1 Page number (1-based) |
| $pageSize | integer [ 1 .. 200 ] Default: 50 Number of items per page (1-200) |
Paginated list of relicense executions
Unauthorized
Job not found
Internal server error
{- "items": [
- {
- "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": {
- "pending": 0,
- "running": 0,
- "awaitingUser": 0,
- "completed": 0,
- "failed": 0,
- "cancelled": 0
}
}
], - "pagination": {
- "page": 0,
- "page_size": 0,
- "total": 0,
- "total_pages": 0
}
}Returns one execution record with job metadata and status. Per-device detail and status counts are available via GET …/executions/{executionId}/devices.
| jobId required | string <uuid> UUID of the relicense job |
| executionId required | string <uuid> UUID of the relicense execution |
Relicense execution retrieved successfully
Unauthorized
Execution not found
Internal server error
{- "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": {
- "pending": 0,
- "running": 0,
- "awaitingUser": 0,
- "completed": 0,
- "failed": 0,
- "cancelled": 0
}
}Returns a paginated list of relicense jobs, optionally filtered by a search term.
| $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 |
Paginated list of relicense jobs
Unauthorized
Internal server error
{- "items": [
- {
- "id": "string",
- "workflowJobId": "string",
- "workflowId": "string",
- "type": "RELICENSE",
- "name": "string",
- "description": "string",
- "enabled": true,
- "status": "DRAFT",
- "jobUrl": "string",
- "config": {
- "deviceType": "BIGIP",
- "deviceIds": [
- "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
], - "batchSize": 10,
- "deviceCount": 1
}, - "createdBy": "string",
- "modifiedBy": "string",
- "createdAt": "2026-10-29T14:02:59Z",
- "updatedAt": "2026-10-29T14:02:59Z"
}
], - "pagination": {
- "page": 0,
- "page_size": 0,
- "total": 0,
- "total_pages": 0
}
}Creates a new relicense job in DRAFT status.
| 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) |
Relicense job created successfully
Bad request - invalid input
Unauthorized
Conflict - duplicate job name
Internal server error
{- "name": "Q1 Relicense Batch",
- "description": "",
- "enabled": true,
- "config": {
- "deviceType": "BIGIP",
- "deviceIds": [
- "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
], - "batchSize": 10
}
}{- "id": "string",
- "workflowJobId": "string",
- "workflowId": "string",
- "type": "RELICENSE",
- "name": "string",
- "description": "string",
- "enabled": true,
- "status": "DRAFT",
- "jobUrl": "string",
- "config": {
- "deviceType": "BIGIP",
- "deviceIds": [
- "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
], - "batchSize": 10,
- "deviceCount": 1
}, - "createdBy": "string",
- "modifiedBy": "string",
- "createdAt": "2026-10-29T14:02:59Z",
- "updatedAt": "2026-10-29T14:02:59Z"
}| jobId required | string <uuid> UUID of the relicense job |
Relicense job retrieved successfully
Unauthorized
Job not found
Internal server error
{- "id": "string",
- "workflowJobId": "string",
- "workflowId": "string",
- "type": "RELICENSE",
- "name": "string",
- "description": "string",
- "enabled": true,
- "status": "DRAFT",
- "jobUrl": "string",
- "config": {
- "deviceType": "BIGIP",
- "deviceIds": [
- "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
], - "batchSize": 10,
- "deviceCount": 1
}, - "createdBy": "string",
- "modifiedBy": "string",
- "createdAt": "2026-10-29T14:02:59Z",
- "updatedAt": "2026-10-29T14:02:59Z"
}Partially updates a relicense job. Only allowed when status is DRAFT or READY.
| jobId required | string <uuid> UUID of the relicense job |
| 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 |
Relicense job updated successfully
Bad request - invalid input
Unauthorized
Job not found
Conflict - job is not editable in its current status
Internal server error
{- "name": "string",
- "description": "string",
- "config": {
- "deviceType": "BIGIP",
- "deviceIds": [
- "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
], - "batchSize": 10
}, - "enabled": true
}{- "id": "string",
- "workflowJobId": "string",
- "workflowId": "string",
- "type": "RELICENSE",
- "name": "string",
- "description": "string",
- "enabled": true,
- "status": "DRAFT",
- "jobUrl": "string",
- "config": {
- "deviceType": "BIGIP",
- "deviceIds": [
- "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
], - "batchSize": 10,
- "deviceCount": 1
}, - "createdBy": "string",
- "modifiedBy": "string",
- "createdAt": "2026-10-29T14:02:59Z",
- "updatedAt": "2026-10-29T14:02:59Z"
}Deletes a relicense job. Not allowed when status is RUNNING.
| jobId required | string <uuid> UUID of the relicense job |
Relicense job deleted successfully
Unauthorized
Job not found
Conflict - cannot delete a RUNNING job
Internal server error
{- "code": 400,
- "message": "Bad request",
- "details": "string",
- "timestamp": "2026-10-29T14:02:59Z"
}Returns a paginated list of devices configured for a specific relicense job, enriched with live licensing details.
| jobId required | string <uuid> Example: 3fa85f64-5717-4562-b3fc-2c963f66afa6 UUID of the relicense job |
| $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) |
Paginated list of devices configured in the relicense job
Bad request (invalid UUID or invalid pagination parameters)
Unauthorized
Job not found
Internal server error
{- "items": [
- {
- "id": "string",
- "device_type": "BIGIP",
- "device_name": "bigip/bigip.com",
- "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"
}
], - "totalItems": 125,
- "pagination": {
- "page": 1,
- "pageSize": 50,
- "total": 125,
- "totalPages": 3
}
}Returns a paginated list of onboarded devices that can undergo license reactivation filtered by device type (BIGIP or F5OS), enriched with live licensing information.
| 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) |
Paginated list of devices eligible for license re-activation
Bad request (invalid device type or invalid pagination parameters)
Unauthorized
Internal server error
{- "items": [
- {
- "id": "string",
- "device_type": "BIGIP",
- "device_name": "bigip/bigip.com",
- "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"
}
], - "totalItems": 125,
- "pagination": {
- "page": 1,
- "pageSize": 50,
- "total": 125,
- "totalPages": 3
}
}Requests the active execution for the job to pause after its current batch completes.
| jobId required | string <uuid> UUID of the relicense job |
Pause request accepted
Unauthorized
Job or active execution not found
Conflict - job has no running execution
Internal server error
{- "jobId": "string",
- "executionId": "string",
- "message": "string"
}Resumes the active paused execution for the job.
| jobId required | string <uuid> UUID of the relicense job |
Resume request accepted
Unauthorized
Job or active execution not found
Conflict - job has no paused execution
Internal server error
{- "jobId": "string",
- "executionId": "string",
- "message": "string"
}Requests cancellation of the active execution for the job.
| jobId required | string <uuid> UUID of the relicense job |
Cancel request accepted
Unauthorized
Job or active execution not found
Conflict - job has no cancellable execution
Internal server error
{- "jobId": "string",
- "executionId": "string",
- "message": "string"
}Returns the status of an asynchronous device re-activation task.
| taskId required | string <uuid> Unique identifier returned when re-activation is accepted |
Task status retrieved successfully
Bad request during automatic device license re-activation
Unauthorized to perform automatic device license re-activation
Automatic device license re-activation task not found
Internal server error
{- "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"
}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.
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.
| 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).
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.
| 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. |
Validation triggered — poll GET /licensing/reactivate/validate/{runId}
Bad request — deviceIds missing or empty
Unauthorized
Internal server error
{- "deviceIds": [
- "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa",
- "bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb"
], - "deviceType": "BIGIP"
}{- "validation_run_id": "d4e5f6a7-0000-0000-0000-000000000001",
- "message": "validation triggered"
}| runId required | string <uuid> |
| status | Array of strings Items Enum: "PENDING" "PASSED" "FAILED" |
| $page | integer >= 1 Default: 1 |
| $pageSize | integer [ 1 .. 200 ] Default: 50 |
Paginated validation device results
Invalid status or pagination parameter
Validation run not found
{- "devices": [
- {
- "device_id": "string",
- "hostname": "string",
- "ha_state": "string",
- "device_type": "string",
- "status": "PENDING",
- "current_step": "string",
- "blocking_check": "string",
- "check_results": [
- {
- "check_name": "Instance Supported",
- "severity": "HARD",
- "status": "PASS",
- "message": "string",
- "detail": { }
}
], - "started_at": "2026-10-29T14:02:59Z",
- "completed_at": "2026-10-29T14:02:59Z"
}
], - "totalItems": 0,
- "pagination": {
- "page": 0,
- "page_size": 0,
- "total": 0,
- "total_pages": 0
}
}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).
| runId required | string <uuid> UUID returned by POST /licensing/reactivate/validate |
Validation run results
Unauthorized
Validation run not found
Internal server error
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
{- "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": [
- {
- "device_id": "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa",
- "hostname": "bigip-prod-01.example.com",
- "device_type": "BIGIP",
- "status": "RUNNING",
- "current_step": "CHECKING_DEVICE_SUPPORTED",
- "blocking_check": "",
- "started_at": "2026-09-18T10:00:02Z",
- "completed_at": null,
- "check_results": [
- {
- "check_name": "License Server Reachable",
- "severity": "HARD",
- "status": "PASS",
}, - {
- "check_name": "Instance Supported",
- "severity": "HARD",
- "status": "PASS",
- "detail": {
- "device_type": "BIGIP",
- "version": "16.1.4",
- "min_supported_version": "14.1.0"
}
}
]
}, - {
- "device_id": "bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb",
- "hostname": "bigip-prod-02.example.com",
- "device_type": "BIGIP",
- "status": "PENDING",
- "current_step": "PENDING",
- "blocking_check": "",
- "started_at": null,
- "completed_at": null,
- "check_results": [ ]
}
]
}Returns a paginated list of restore readiness check runs with rollup summaries.
Use GET /restore/readiness/{runId} for the detailed per-device breakdown.
| 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. |
Paginated list of restore readiness runs
Authentication required
Internal server error
{- "data": [
- {
- "run_id": "string",
- "status": "PENDING",
- "device_count": 0,
- "pass_count": 0,
- "warn_count": 0,
- "fail_count": 0,
- "error_count": 0,
- "triggered_at": "2026-10-29T14:02:59Z",
- "completed_at": "2026-10-29T14:02:59Z"
}
], - "pagination": {
- "page": 0,
- "page_size": 0,
- "total": 0,
- "total_pages": 0
}
}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.
| 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. |
Readiness checks triggered — poll GET /restore/readiness/{runId} for results
Invalid request
Authentication required
Resource not found
Internal server error
{- "context": {
- "device_targets": [
- {
- "device_id": "string"
}
], - "backup_file_id": "string"
}, - "passphrase": "string",
- "checks": [
- "backup_integrity"
]
}{- "run_id": "string",
- "message": "string"
}Returns persisted per-device restore readiness results for a run.
Poll until status is no longer PENDING or RUNNING.
| runId required | string <uuid> The restore readiness run ID returned by POST /restore/readiness |
Restore readiness check results
Authentication required
Resource not found
Internal server error
{- "run_id": "string",
- "status": "PENDING",
- "device_count": 0,
- "pass_count": 0,
- "warn_count": 0,
- "fail_count": 0,
- "error_count": 0,
- "devices": [
- {
- "device_id": "string",
- "hostname": "string",
- "device_type": "BIGIP",
- "status": "PENDING",
- "current_step": "string",
- "check_results": [
- {
- "check_name": "string",
- "severity": "HARD",
- "status": "PASS",
- "message": "string",
- "detail": "string"
}
]
}
], - "triggered_at": "2026-10-29T14:02:59Z",
- "completed_at": "2026-10-29T14:02:59Z"
}Returns all configured backup schedules. Multiple schedules are allowed (one per backup type).
Configured schedules
Failed to list backup schedules
Scheduler is unavailable
{- "success": true,
- "data": [
- {
- "id": "string",
- "name": "string",
- "task_type": "string",
- "cron_expression": "string",
- "enabled": true,
- "last_run_at": "2026-10-29T14:02:59Z",
- "last_status": "success",
- "next_run_at": "2026-10-29T14:02:59Z",
- "created_at": "2026-10-29T14:02:59Z",
- "warning": "string"
}
]
}Create a named backup schedule. Multiple schedules allowed. Duplicate names rejected.
| 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. |
Schedule created
Invalid request, e.g. a full backup schedule without a remote storage target
Schedule already exists
Failed to create the backup schedule
Scheduler or Vault is unavailable
{- "name": "string",
- "cron": "0 2 * * *",
- "backup_type": "full",
- "storage_target": "string",
- "passphrase": "stringstring"
}{- "success": true,
- "data": {
- "id": "string",
- "name": "string",
- "task_type": "string",
- "cron_expression": "string",
- "enabled": true,
- "last_run_at": "2026-10-29T14:02:59Z",
- "last_status": "success",
- "next_run_at": "2026-10-29T14:02:59Z",
- "created_at": "2026-10-29T14:02:59Z",
- "warning": "string"
}
}| id required | string <uuid> |
Schedule details
Schedule not found
Scheduler is unavailable
{- "success": true,
- "data": {
- "id": "string",
- "name": "string",
- "task_type": "string",
- "cron_expression": "string",
- "enabled": true,
- "last_run_at": "2026-10-29T14:02:59Z",
- "last_status": "success",
- "next_run_at": "2026-10-29T14:02:59Z",
- "created_at": "2026-10-29T14:02:59Z",
- "warning": "string"
}
}| id required | string <uuid> |
Schedule updated
Invalid request
Schedule not found
Conflicting schedule for this backup type
Failed to update the backup schedule
Scheduler is unavailable
{ }{- "success": true,
- "data": {
- "id": "string",
- "name": "string",
- "task_type": "string",
- "cron_expression": "string",
- "enabled": true,
- "last_run_at": "2026-10-29T14:02:59Z",
- "last_status": "success",
- "next_run_at": "2026-10-29T14:02:59Z",
- "created_at": "2026-10-29T14:02:59Z",
- "warning": "string"
}
}| id required | string <uuid> |
Schedule deleted
Schedule not found
Scheduler is unavailable
{- "success": true,
- "data": {
- "message": "string"
}
}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.
Success
Caller is not an admin
Internal Error
{- "service_users": [
- {
- "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"
}
], - "total_count": 0
}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.
| 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. |
Service user created
Bad Request
Caller is not an admin
A service user with this name already exists
Internal Error
{- "name": "string",
- "description": "string",
- "role": "string",
- "owner": "string",
- "purpose": "string",
- "expiry": "2026-10-29T14:02:59Z"
}{- "service_user": {
- "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"
}, - "client_id": "string",
- "client_secret": "string"
}| id required | string |
Success
Caller is not an admin
Not Found
Internal Error
{- "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"
}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.
| id required | string |
| 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 |
Service user updated
Bad Request
Caller is not an admin
Not Found
Internal Error
{- "description": "string",
- "role": "string",
- "owner": "string",
- "purpose": "string",
- "expiry": "2026-10-29T14:02:59Z"
}{- "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"
}Removes the machine user from the identity provider, revoking its credentials, and stamps the lifecycle metadata as revoked. Admin only.
| id required | string |
Service user deleted
Caller is not an admin
Not Found
Internal Error
{- "status": "success",
- "message": "Service user 'ci-bot' deleted successfully",
- "id": "string"
}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.
| id required | string |
Secret rotated
Caller is not an admin
Not Found
Internal Error
{- "service_user": {
- "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"
}, - "client_id": "string",
- "client_secret": "string"
}Returns current backup settings (retention count, default storage target)
Current settings
Failed to load backup settings
{- "success": true,
- "data": {
- "default_storage_target": "string",
- "retention_count": 0
}
}Update backup settings
| default_storage_target | string Name of the default storage target |
| retention_count | integer [ 1 .. 100 ] Maximum number of backups to retain |
Settings updated
Invalid request
Failed to update backup settings
{- "default_storage_target": "string",
- "retention_count": 1
}{- "success": true,
- "data": {
- "default_storage_target": "string",
- "retention_count": 0
}
}Generic signal endpoint for job-level signaling.
Examples:
| workflowId required | string <uuid> |
| jobId required | string <uuid> |
| 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) |
Signal accepted and processing enqueued
Invalid request
Resource not found
Conflict with current resource state
{- "signalId": "sig-20260518-001",
- "signalType": "METRIC_ALERT",
- "source": "monitoring-pipeline",
- "reason": "CPU threshold exceeded",
- "labels": {
- "cluster": "prod-a",
- "environment": "production"
}, - "payload": {
- "metricName": "cpu_utilization",
- "metricValue": 91,
- "threshold": 80,
- "timestamp": "2026-05-18T14:30:00.000Z"
}
}{- "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"
}| 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 |
Paginated list of software distribution jobs
Authentication required
{- "data": [
- {
- "id": "a1b2c3d4-0000-0000-0000-000000000001",
- "workflowId": "wf-0000-0000-0000-000000000001",
- "name": "distribute-bigip-17.1.2-to-prod",
- "status": "COMPLETED",
- "deviceCount": 3,
- "createdAt": "2026-05-29T09:00:00Z",
- "updatedAt": "2026-05-29T09:30:00Z"
}
], - "pagination": {
- "page": 1,
- "page_size": 20,
- "total": 1,
- "total_pages": 1
}
}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.
| 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). |
Software distribution job created (in DRAFT state)
Invalid request
Authentication required
Job name already exists
{- "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": {
- "images": [
- {
- "imageId": "11111111-1111-1111-1111-111111111111",
- "imageFileName": "BIGIP-17.1.2-0.0.13.iso"
}
], - "batchSize": 10,
- "deviceTargets": [
- {
- "deviceId": "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
}, - {
- "deviceId": "bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb"
}, - {
- "deviceId": "cccccccc-cccc-cccc-cccc-cccccccccccc"
}
]
}
}{- "id": "string",
- "workflowId": "string",
- "name": "string",
- "description": "string",
- "status": "DRAFT",
- "enabled": true,
- "config": {
- "images": [
- {
- "imageId": "string",
- "imageFileName": "string"
}
], - "batchSize": 1,
- "deviceTargets": [
- {
- "deviceId": "string"
}
], - "deleteOtherImages": false
}, - "execution": {
- "executionId": "string",
- "status": "RUNNING",
- "startedAt": "2026-10-29T14:02:59Z",
- "endedAt": "2026-10-29T14:02:59Z",
- "currentBatch": 0,
- "totalBatches": 0,
- "batches": [
- {
- "batchNumber": 0,
- "status": "PENDING",
- "currentStep": "PENDING",
- "deviceIds": [
- "string"
], - "startedAt": "2026-10-29T14:02:59Z",
- "endedAt": "2026-10-29T14:02:59Z"
}
]
}, - "createdBy": "string",
- "modifiedBy": "string",
- "createdAt": "2026-10-29T14:02:59Z",
- "updatedAt": "2026-10-29T14:02:59Z",
- "warnings": [
- {
- "code": "HA_DEVICES_IN_STANDALONE_JOB",
- "message": "Device bigip/10.0.0.1.bigip is the active node of an HA pair but will be installed independently without automatic failover sequencing.",
- "severity": "INFO"
}
]
}Returns full job details including configuration, current lifecycle status, and execution state.
| jobId required | string <uuid> |
Software distribution job details
Authentication required
Resource not found
{- "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": {
- "images": [
- {
- "imageId": "11111111-1111-1111-1111-111111111111",
- "imageFileName": "BIGIP-17.1.2-0.0.13.iso"
}
], - "batchSize": 10,
- "deviceTargets": [
- {
- "deviceId": "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
}, - {
- "deviceId": "bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb"
}, - {
- "deviceId": "cccccccc-cccc-cccc-cccc-cccccccccccc"
}
]
}, - "execution": {
- "executionId": "exec-0000-0000-0000-000000000001",
- "status": "COMPLETED",
- "startedAt": "2026-05-29T09:00:00Z",
- "endedAt": "2026-05-29T09:28:00Z",
- "currentBatch": 1,
- "totalBatches": 1,
- "batches": [
- {
- "batchNumber": 1,
- "status": "COMPLETED",
- "currentStep": "COMPLETE",
- "deviceIds": [
- "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa",
- "bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb",
- "cccccccc-cccc-cccc-cccc-cccccccccccc"
]
}
]
}, - "createdAt": "2026-05-29T08:55:00Z",
- "updatedAt": "2026-05-29T09:28:00Z"
}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).
| jobId required | string <uuid> |
| 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). |
Job updated
Invalid request
Authentication required
Resource not found
Job name already exists, or enabled changed outside DRAFT/READY
{- "name": "distribute-bigip-17.1.2-to-prod-v2",
- "description": "Updated device list",
- "config": {
- "images": [
- {
- "imageId": "11111111-1111-1111-1111-111111111111",
- "imageFileName": "BIGIP-17.1.2-0.0.13.iso"
}
], - "batchSize": 5,
- "deviceTargets": [
- {
- "deviceId": "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
}, - {
- "deviceId": "bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb"
}
]
}
}{- "id": "string",
- "workflowId": "string",
- "name": "string",
- "description": "string",
- "status": "DRAFT",
- "enabled": true,
- "config": {
- "images": [
- {
- "imageId": "string",
- "imageFileName": "string"
}
], - "batchSize": 1,
- "deviceTargets": [
- {
- "deviceId": "string"
}
], - "deleteOtherImages": false
}, - "execution": {
- "executionId": "string",
- "status": "RUNNING",
- "startedAt": "2026-10-29T14:02:59Z",
- "endedAt": "2026-10-29T14:02:59Z",
- "currentBatch": 0,
- "totalBatches": 0,
- "batches": [
- {
- "batchNumber": 0,
- "status": "PENDING",
- "currentStep": "PENDING",
- "deviceIds": [
- "string"
], - "startedAt": "2026-10-29T14:02:59Z",
- "endedAt": "2026-10-29T14:02:59Z"
}
]
}, - "createdBy": "string",
- "modifiedBy": "string",
- "createdAt": "2026-10-29T14:02:59Z",
- "updatedAt": "2026-10-29T14:02:59Z",
- "warnings": [
- {
- "code": "HA_DEVICES_IN_STANDALONE_JOB",
- "message": "Device bigip/10.0.0.1.bigip is the active node of an HA pair but will be installed independently without automatic failover sequencing.",
- "severity": "INFO"
}
]
}Permanently deletes a software distribution job. Only allowed when the job is not in RUNNING state. Terminates any in-progress execution before deletion.
| jobId required | string <uuid> |
Job deleted
Authentication required
Resource not found
Job cannot be deleted in its current state (e.g. RUNNING)
{- "error": "string",
- "code": "string"
}Transitions a software distribution job from DRAFT/READY → RUNNING and begins distributing the image to target devices in batches.
Pre-execution checks:
| jobId required | string <uuid> |
| 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. |
Job activated and distribution started
Invalid request
Authentication required
Resource not found
Job cannot be activated (wrong state or image not accessible)
{- "changeRequest": "string"
}{- "id": "string",
- "workflowId": "string",
- "name": "string",
- "jobType": "SOFTWARE_DISTRIBUTION",
- "status": "DRAFT",
- "updatedAt": "2026-10-29T14:02:59Z"
}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.
| jobId required | string <uuid> |
Pause accepted — job is PAUSING (draining in-flight)
Authentication required
Resource not found
Job is not in a pausable state
{- "error": "string",
- "code": "string"
}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.
| jobId required | string <uuid> |
Resume accepted — job is back to RUNNING
Authentication required
Resource not found
Job is not in a resumable state
{- "error": "string",
- "code": "string"
}Durably signals job cancellation by transitioning to CANCELLING.
| jobId required | string <uuid> |
Cancel accepted — job is CANCELLING; converges to READY at the job level (CANCELLED on the execution row)
Authentication required
Resource not found
Job is not in a cancellable state (e.g. already COMPLETED or in a non-cancellable lifecycle state)
{- "error": "string",
- "code": "string"
}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.
| jobId required | string <uuid> |
Per-device + roll-up status
Authentication required
Resource not found
{- "jobId": "string",
- "status": "RUNNING",
- "totalDevices": 0,
- "pending": 0,
- "transferring": 0,
- "verifying": 0,
- "completed": 0,
- "failed": 0,
- "cancelled": 0,
- "skipped": 0,
- "overallPercent": 0,
- "devices": [
- {
- "deviceId": "string",
- "deviceName": "string",
- "deviceKind": "BIGIP",
- "haRole": "ACTIVE",
- "status": "PENDING",
- "currentStep": "RESOLVE_DEVICE",
- "steps": [
- {
- "step": "RESOLVE_DEVICE",
- "status": "PENDING",
- "sequence": 0,
- "startedAt": "2026-10-29T14:02:59Z",
- "completedAt": "2026-10-29T14:02:59Z",
- "durationMs": 0,
- "retryCount": 0,
- "errorCode": "string",
- "errorMessage": "string"
}
], - "images": [
- {
- "imageId": "string",
- "imageFileName": "string",
- "status": "PENDING",
- "currentStep": "RESOLVE_DEVICE",
- "steps": [
- {
- "step": "RESOLVE_DEVICE",
- "status": "PENDING",
- "sequence": 0,
- "startedAt": "2026-10-29T14:02:59Z",
- "completedAt": "2026-10-29T14:02:59Z",
- "durationMs": 0,
- "retryCount": 0,
- "errorCode": "string",
- "errorMessage": "string"
}
], - "transferProgress": 0,
- "retryCount": 0,
- "checksumVerified": true,
- "errorMessage": "string",
- "startedAt": "2026-10-29T14:02:59Z",
- "completedAt": "2026-10-29T14:02:59Z"
}
], - "transferProgress": 0,
- "retryCount": 0,
- "checksumVerified": true,
- "errorMessage": "string",
- "startedAt": "2026-10-29T14:02:59Z",
- "completedAt": "2026-10-29T14:02:59Z"
}
]
}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.
| jobId required | string <uuid> |
List of executions
Authentication required
Resource not found
{- "items": [
- {
- "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": {
- "totalDevices": 0,
- "pending": 0,
- "transferring": 0,
- "verifying": 0,
- "completed": 0,
- "failed": 0,
- "cancelled": 0,
- "skipped": 0,
- "overallPercent": 0,
- "devices": [
- {
- "deviceId": "string",
- "deviceName": "string",
- "deviceKind": "BIGIP",
- "haRole": "ACTIVE",
- "status": "PENDING",
- "currentStep": "RESOLVE_DEVICE",
- "steps": [
- {
- "step": "RESOLVE_DEVICE",
- "status": "PENDING",
- "sequence": 0,
- "startedAt": "2026-10-29T14:02:59Z",
- "completedAt": "2026-10-29T14:02:59Z",
- "durationMs": 0,
- "retryCount": 0,
- "errorCode": "string",
- "errorMessage": "string"
}
], - "images": [
- {
- "imageId": "string",
- "imageFileName": "string",
- "status": "PENDING",
- "currentStep": "RESOLVE_DEVICE",
- "steps": [
- {
- "step": "RESOLVE_DEVICE",
- "status": "PENDING",
- "sequence": 0,
- "startedAt": "2026-10-29T14:02:59Z",
- "completedAt": "2026-10-29T14:02:59Z",
- "durationMs": 0,
- "retryCount": 0,
- "errorCode": "string",
- "errorMessage": "string"
}
], - "transferProgress": 0,
- "retryCount": 0,
- "checksumVerified": true,
- "errorMessage": "string",
- "startedAt": "2026-10-29T14:02:59Z",
- "completedAt": "2026-10-29T14:02:59Z"
}
], - "transferProgress": 0,
- "retryCount": 0,
- "checksumVerified": true,
- "errorMessage": "string",
- "startedAt": "2026-10-29T14:02:59Z",
- "completedAt": "2026-10-29T14:02:59Z"
}
]
}
}
], - "totalItems": 0
}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.
| jobId required | string <uuid> |
| executionId required | string <uuid> |
Execution detail
Authentication required
Resource not found
{- "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": {
- "totalDevices": 0,
- "pending": 0,
- "transferring": 0,
- "verifying": 0,
- "completed": 0,
- "failed": 0,
- "cancelled": 0,
- "skipped": 0,
- "overallPercent": 0,
- "devices": [
- {
- "deviceId": "string",
- "deviceName": "string",
- "deviceKind": "BIGIP",
- "haRole": "ACTIVE",
- "status": "PENDING",
- "currentStep": "RESOLVE_DEVICE",
- "steps": [
- {
- "step": "RESOLVE_DEVICE",
- "status": "PENDING",
- "sequence": 0,
- "startedAt": "2026-10-29T14:02:59Z",
- "completedAt": "2026-10-29T14:02:59Z",
- "durationMs": 0,
- "retryCount": 0,
- "errorCode": "string",
- "errorMessage": "string"
}
], - "images": [
- {
- "imageId": "string",
- "imageFileName": "string",
- "status": "PENDING",
- "currentStep": "RESOLVE_DEVICE",
- "steps": [
- {
- "step": "RESOLVE_DEVICE",
- "status": "PENDING",
- "sequence": 0,
- "startedAt": "2026-10-29T14:02:59Z",
- "completedAt": "2026-10-29T14:02:59Z",
- "durationMs": 0,
- "retryCount": 0,
- "errorCode": "string",
- "errorMessage": "string"
}
], - "transferProgress": 0,
- "retryCount": 0,
- "checksumVerified": true,
- "errorMessage": "string",
- "startedAt": "2026-10-29T14:02:59Z",
- "completedAt": "2026-10-29T14:02:59Z"
}
], - "transferProgress": 0,
- "retryCount": 0,
- "checksumVerified": true,
- "errorMessage": "string",
- "startedAt": "2026-10-29T14:02:59Z",
- "completedAt": "2026-10-29T14:02:59Z"
}
]
}
}Cancels in-flight distribution for a single device within a running job. Orthogonal to the job-level cancel — the rest of the job continues.
| jobId required | string <uuid> |
| deviceId required | string <uuid> |
Per-target cancel accepted
Authentication required
Resource not found
Device is already in a terminal state for this job (COMPLETED / FAILED / CANCELLED / SKIPPED)
{- "error": "string",
- "code": "string"
}| 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 |
Paginated list of software installation jobs
Authentication required
{- "data": [
- {
- "id": "b2c3d4e5-0000-0000-0000-000000000002",
- "workflowId": "wf-0000-0000-0000-000000000001",
- "name": "install-bigip-17.1.2-standalone-batch",
- "status": "RUNNING",
- "installationType": "STANDALONE",
- "batchSize": 10,
- "deviceCount": 5,
- "createdAt": "2026-05-29T10:00:00Z",
- "updatedAt": "2026-05-29T10:45:00Z"
}
], - "pagination": {
- "page": 1,
- "page_size": 20,
- "total": 1,
- "total_pages": 1
}
}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 devicesHA — upgrades HA pairs, maintaining service continuitybatchSize controls serial vs batch execution:
batchSize=1 — serial: upgrades one device (or HA pair) at a timebatchSize>1 — batch: upgrades multiple devices (or HA pairs) in parallelConfig 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.
| 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:
Volume selection is job-level via |
Software installation job created (in DRAFT state)
Invalid request
Authentication required
Job name already exists
{- "name": "install-bigip-17.1.2-standalone-serial",
- "description": "Upgrade 3 devices one at a time",
- "config": {
- "imageId": "11111111-1111-1111-1111-111111111111",
- "imageFileName": "BIGIP-17.1.2-0.0.13.iso",
- "installationType": "STANDALONE",
- "batchSize": 1,
- "volumeStrategy": "NEXT_SEQUENTIAL_NEW",
- "licenseReactivationPreference": "REACTIVATE_ALL",
- "execution": {
- "hitlPauseBetweenBatches": true,
- "hitlPauseBeforeReboot": true,
- "reboot": true
}, - "flightChecks": {
- "enabled": true
}, - "deviceTargets": [
- {
- "deviceId": "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
}, - {
- "deviceId": "bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb"
}, - {
- "deviceId": "cccccccc-cccc-cccc-cccc-cccccccccccc",
- "volumeOverride": "HD1.3"
}
]
}
}{- "id": "string",
- "workflowId": "string",
- "name": "string",
- "description": "string",
- "status": "DRAFT",
- "enabled": true,
- "config": {
- "imageId": "string",
- "imageFileName": "string",
- "installationType": "STANDALONE",
- "batchSize": 1,
- "volumeStrategy": "NEXT_INACTIVE",
- "licenseReactivationPreference": "REACTIVATE_ON_LCD_FAILURE",
- "execution": {
- "hitlPauseBetweenBatches": true,
- "hitlPauseAfterStandbyInstallBeforeReboot": true,
- "hitlPauseAfterStandbyRebootBeforeFailover": true,
- "hitlPauseAfterFailoverBeforeSecondInstall": true,
- "hitlPauseAfterSecondInstallBeforeReboot": true,
- "automaticFailback": true,
- "hitlPauseBeforeFailback": false,
- "disableAutoConfigSync": false,
- "reboot": true
}, - "installConfig": true,
- "deviceTargets": [
- {
- "deviceId": "string",
- "volumeOverride": "string",
- "strategyOverride": "NEXT_INACTIVE",
- "configSourceVolume": "string"
}
], - "flightChecks": {
- "enabled": true,
- "coreChecks": {
- "trunkStatus": true,
- "interfaceStatus": true,
- "virtualServerState": true,
- "poolHealth": true,
- "poolMemberHealth": true,
- "performanceAllStats": true,
- "lagStatus": true,
- "alarms": true,
- "healthSummary": true,
- "cluster": true,
- "firmwareStatus": true,
- "fpgaStatus": true,
- "cores": true,
- "tenantStatus": true,
- "servicePods": true
}
}, - "backupConfig": {
- "enabled": false,
- "backupFileName": "string",
- "includePrivateKeys": false,
- "encryption": {
- "enabled": false
}, - "retainMasterKey": false,
- "storageTarget": "string",
- "retention": {
- "doNotDelete": true,
- "retentionDays": 1
}
}
}, - "execution": {
- "executionId": "string",
- "status": "RUNNING",
- "startedAt": "2026-10-29T14:02:59Z",
- "endedAt": "2026-10-29T14:02:59Z",
- "currentBatch": 0,
- "totalBatches": 0,
- "batches": [
- {
- "batchNumber": 0,
- "status": "PENDING",
- "currentStep": "PENDING",
- "deviceIds": [
- "string"
], - "startedAt": "2026-10-29T14:02:59Z",
- "endedAt": "2026-10-29T14:02:59Z"
}
]
}, - "deviceInstallStates": [
- {
- "deviceId": "string",
- "device_name": "string",
- "currentVersion": "string",
- "targetVersion": "string",
- "plannedVolume": "string",
- "haRole": "ACTIVE",
- "currentStep": "PENDING",
- "status": "PENDING",
- "errorMessage": "string",
- "errorCategory": "CONNECTIVITY",
- "preSnapshotUrl": "string",
- "postSnapshotUrl": "string",
- "diffUrl": "string",
- "startedAt": "2026-10-29T14:02:59Z",
- "completedAt": "2026-10-29T14:02:59Z"
}
], - "createdBy": "string",
- "modifiedBy": "string",
- "createdAt": "2026-10-29T14:02:59Z",
- "updatedAt": "2026-10-29T14:02:59Z",
- "warnings": [
- {
- "code": "HA_DEVICES_IN_STANDALONE_JOB",
- "message": "Device bigip/10.0.0.1.bigip is the active node of an HA pair but will be installed independently without automatic failover sequencing.",
- "severity": "INFO"
}
]
}Returns full job details including configuration, current lifecycle status, and per-device install state for any devices that have started execution.
| jobId required | string <uuid> |
Software installation job details
Authentication required
Resource not found
{- "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": {
- "imageId": "11111111-1111-1111-1111-111111111111",
- "imageFileName": "BIGIP-17.1.2-0.0.13.iso",
- "installationType": "STANDALONE",
- "batchSize": 10,
- "volumeStrategy": "NEXT_SEQUENTIAL_NEW",
- "licenseReactivationPreference": "REACTIVATE_ON_LCD_FAILURE",
- "execution": {
- "hitlPauseBetweenBatches": true,
- "hitlPauseBeforeReboot": true,
- "reboot": true
}, - "deviceTargets": [
- {
- "deviceId": "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
}, - {
- "deviceId": "bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb"
}, - {
- "deviceId": "cccccccc-cccc-cccc-cccc-cccccccccccc",
- "volumeOverride": "HD1.3"
}
]
}, - "execution": {
- "executionId": "exec-0000-0000-0000-000000000002",
- "status": "RUNNING",
- "startedAt": "2026-05-29T10:00:00Z",
- "currentBatch": 2,
- "totalBatches": 3,
- "batches": [
- {
- "batchNumber": 1,
- "status": "COMPLETED",
- "currentStep": "COMPLETE",
- "deviceIds": [
- "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa",
- "bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb"
]
}
]
}, - "deviceInstallStates": [
- {
- "deviceId": "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa",
- "hostname": "bigip-prod-01",
- "currentVersion": "17.1.1",
- "targetVersion": "17.1.2",
- "plannedVolume": "HD1.2",
- "status": "COMPLETED",
- "currentStep": "COMPLETE",
- "startedAt": "2026-05-29T10:00:00Z",
- "completedAt": "2026-05-29T10:44:30Z"
}
], - "createdAt": "2026-05-29T09:55:00Z",
- "updatedAt": "2026-05-29T10:45:00Z"
}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).
| jobId required | string <uuid> |
| 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:
Volume selection is job-level via |
Job updated
Invalid request
Authentication required
Resource not found
Job name already exists, or enabled changed outside DRAFT/READY
{- "name": "install-bigip-17.1.2-batch-v2",
- "description": "Updated batch size",
- "config": {
- "imageId": "11111111-1111-1111-1111-111111111111",
- "imageFileName": "BIGIP-17.1.2-0.0.13.iso",
- "installationType": "STANDALONE",
- "batchSize": 10,
- "volumeStrategy": "NEXT_SEQUENTIAL_NEW",
- "licenseReactivationPreference": "REACTIVATE_ON_LCD_FAILURE",
- "execution": {
- "hitlPauseBetweenBatches": false,
- "hitlPauseBeforeReboot": false,
- "reboot": true
}, - "flightChecks": {
- "enabled": true,
- "coreChecks": {
- "trunkStatus": true,
- "interfaceStatus": true,
- "virtualServerState": true,
- "poolHealth": true,
- "poolMemberHealth": false
}
}, - "deviceTargets": [
- {
- "deviceId": "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
}, - {
- "deviceId": "bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb",
- "volumeOverride": "HD1.2"
}
]
}
}{- "id": "string",
- "workflowId": "string",
- "name": "string",
- "description": "string",
- "status": "DRAFT",
- "enabled": true,
- "config": {
- "imageId": "string",
- "imageFileName": "string",
- "installationType": "STANDALONE",
- "batchSize": 1,
- "volumeStrategy": "NEXT_INACTIVE",
- "licenseReactivationPreference": "REACTIVATE_ON_LCD_FAILURE",
- "execution": {
- "hitlPauseBetweenBatches": true,
- "hitlPauseAfterStandbyInstallBeforeReboot": true,
- "hitlPauseAfterStandbyRebootBeforeFailover": true,
- "hitlPauseAfterFailoverBeforeSecondInstall": true,
- "hitlPauseAfterSecondInstallBeforeReboot": true,
- "automaticFailback": true,
- "hitlPauseBeforeFailback": false,
- "disableAutoConfigSync": false,
- "reboot": true
}, - "installConfig": true,
- "deviceTargets": [
- {
- "deviceId": "string",
- "volumeOverride": "string",
- "strategyOverride": "NEXT_INACTIVE",
- "configSourceVolume": "string"
}
], - "flightChecks": {
- "enabled": true,
- "coreChecks": {
- "trunkStatus": true,
- "interfaceStatus": true,
- "virtualServerState": true,
- "poolHealth": true,
- "poolMemberHealth": true,
- "performanceAllStats": true,
- "lagStatus": true,
- "alarms": true,
- "healthSummary": true,
- "cluster": true,
- "firmwareStatus": true,
- "fpgaStatus": true,
- "cores": true,
- "tenantStatus": true,
- "servicePods": true
}
}, - "backupConfig": {
- "enabled": false,
- "backupFileName": "string",
- "includePrivateKeys": false,
- "encryption": {
- "enabled": false
}, - "retainMasterKey": false,
- "storageTarget": "string",
- "retention": {
- "doNotDelete": true,
- "retentionDays": 1
}
}
}, - "execution": {
- "executionId": "string",
- "status": "RUNNING",
- "startedAt": "2026-10-29T14:02:59Z",
- "endedAt": "2026-10-29T14:02:59Z",
- "currentBatch": 0,
- "totalBatches": 0,
- "batches": [
- {
- "batchNumber": 0,
- "status": "PENDING",
- "currentStep": "PENDING",
- "deviceIds": [
- "string"
], - "startedAt": "2026-10-29T14:02:59Z",
- "endedAt": "2026-10-29T14:02:59Z"
}
]
}, - "deviceInstallStates": [
- {
- "deviceId": "string",
- "device_name": "string",
- "currentVersion": "string",
- "targetVersion": "string",
- "plannedVolume": "string",
- "haRole": "ACTIVE",
- "currentStep": "PENDING",
- "status": "PENDING",
- "errorMessage": "string",
- "errorCategory": "CONNECTIVITY",
- "preSnapshotUrl": "string",
- "postSnapshotUrl": "string",
- "diffUrl": "string",
- "startedAt": "2026-10-29T14:02:59Z",
- "completedAt": "2026-10-29T14:02:59Z"
}
], - "createdBy": "string",
- "modifiedBy": "string",
- "createdAt": "2026-10-29T14:02:59Z",
- "updatedAt": "2026-10-29T14:02:59Z",
- "warnings": [
- {
- "code": "HA_DEVICES_IN_STANDALONE_JOB",
- "message": "Device bigip/10.0.0.1.bigip is the active node of an HA pair but will be installed independently without automatic failover sequencing.",
- "severity": "INFO"
}
]
}Permanently deletes a software installation job. Only allowed when the job is not in RUNNING state. Terminates any in-progress execution before deletion.
| jobId required | string <uuid> |
Job deleted
Authentication required
Resource not found
Job cannot be deleted in its current state (e.g. RUNNING)
{- "error": "string",
- "code": "string"
}Transitions a software installation job from DRAFT/READY → RUNNING and begins the installation pipeline.
Pre-execution checks:
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.
| jobId required | string <uuid> |
| 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. |
Job activated and installation started
Invalid request
Authentication required
Resource not found
Job cannot be activated (wrong state, image not verified, device locked, or max concurrent jobs reached)
{- "changeRequest": "string"
}{- "executionId": "string",
- "jobId": "string",
- "executionType": "INSTALLATION",
- "targetExecutionId": "string",
- "status": "PENDING",
- "batchSize": 1,
- "totalDevices": 0,
- "changeRequest": "string"
}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.
| jobId required | string <uuid> |
Pause requested — job will pause at the next batch boundary
Authentication required
Resource not found
Job is not in a pausable state
{- "id": "string",
- "workflowId": "string",
- "name": "string",
- "jobType": "SOFTWARE_DISTRIBUTION",
- "status": "DRAFT",
- "updatedAt": "2026-10-29T14:02:59Z"
}Resumes a PAUSED software installation job. Execution continues with the next pending batch. Job transitions back to RUNNING state.
| jobId required | string <uuid> |
Job resumed
Authentication required
Resource not found
Job is not in a resumable state
{- "id": "string",
- "workflowId": "string",
- "name": "string",
- "jobType": "SOFTWARE_DISTRIBUTION",
- "status": "DRAFT",
- "updatedAt": "2026-10-29T14:02:59Z"
}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:
Returns 400 if any deviceTargets are outside the eligible set.
| jobId required | string <uuid> |
| 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
This is deliberately the rollback-applicable subset of the install
execution controls: only the HITL gates, the failback controls, and
|
| changeRequest | string <= 255 characters Nullable Optional change-request identifier (e.g. "CHG0012345") associated with this rollback. Persisted on the ROLLBACK execution record. |
Rollback accepted — ROLLBACK execution created
Invalid deviceTargets (one or more devices not in the eligible set)
Authentication required
Resource not found
Rollback not allowed. Either:
{- "deviceTargets": [
- {
- "deviceId": "string"
}
], - "execution": {
- "hitlPauseBetweenBatches": true,
- "hitlPauseAfterStandbyInstallBeforeReboot": true,
- "hitlPauseAfterStandbyRebootBeforeFailover": true,
- "hitlPauseAfterFailoverBeforeSecondInstall": true,
- "hitlPauseAfterSecondInstallBeforeReboot": true,
- "hitlPauseBeforeFailback": true,
- "automaticFailback": true,
- "batchSize": 1
}, - "changeRequest": "string"
}{- "executionId": "string",
- "jobId": "string",
- "executionType": "INSTALLATION",
- "targetExecutionId": "string",
- "status": "PENDING",
- "batchSize": 1,
- "totalDevices": 0,
- "changeRequest": "string"
}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.
| jobId required | string <uuid> |
List of executions
Authentication required
Resource not found
{- "items": [
- {
- "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": {
- "totalDevices": 0,
- "pending": 0,
- "running": 0,
- "awaitingUser": 0,
- "completed": 0,
- "failed": 0,
- "cancelled": 0,
- "devices": [
- {
- "deviceId": "string",
- "deviceName": "string",
- "deviceKind": "BIGIP",
- "haRole": "ACTIVE",
- "haPeerId": "string",
- "status": "PENDING",
- "currentStep": "PENDING",
- "steps": [
- {
- "step": "PENDING",
- "status": "PENDING",
- "sequence": 0,
- "startedAt": "2026-10-29T14:02:59Z",
- "completedAt": "2026-10-29T14:02:59Z",
- "durationMs": 0,
- "retryCount": 0,
- "errorCode": "string",
- "errorMessage": "string"
}
], - "retryCount": 0,
- "progressPct": 0,
- "lastError": "string",
- "startedAt": "2026-10-29T14:02:59Z",
- "completedAt": "2026-10-29T14:02:59Z",
- "preSnapshotUrl": "string",
- "postSnapshotUrl": "string",
- "diffUrl": "string",
- "readinessWarnings": [
- {
- "check": "string",
- "level": "INFO",
- "message": "string"
}
], - "previousActiveVolume": "string",
- "previousActiveVersion": "string",
- "newActiveVolume": "string",
- "newActiveVersion": "string",
- "rollbackEligible": true,
- "backupFileId": "string"
}
]
}, - "configSnapshot": {
- "imageId": "string",
- "imageFileName": "string",
- "installationType": "STANDALONE",
- "batchSize": 1,
- "volumeStrategy": "NEXT_INACTIVE",
- "licenseReactivationPreference": "REACTIVATE_ON_LCD_FAILURE",
- "execution": {
- "hitlPauseBetweenBatches": true,
- "hitlPauseAfterStandbyInstallBeforeReboot": true,
- "hitlPauseAfterStandbyRebootBeforeFailover": true,
- "hitlPauseAfterFailoverBeforeSecondInstall": true,
- "hitlPauseAfterSecondInstallBeforeReboot": true,
- "automaticFailback": true,
- "hitlPauseBeforeFailback": false,
- "disableAutoConfigSync": false,
- "reboot": true
}, - "installConfig": true,
- "deviceTargets": [
- {
- "deviceId": "string",
- "volumeOverride": "string",
- "strategyOverride": "NEXT_INACTIVE",
- "configSourceVolume": "string"
}
], - "flightChecks": {
- "enabled": true,
- "coreChecks": {
- "trunkStatus": true,
- "interfaceStatus": true,
- "virtualServerState": true,
- "poolHealth": true,
- "poolMemberHealth": true,
- "performanceAllStats": true,
- "lagStatus": true,
- "alarms": true,
- "healthSummary": true,
- "cluster": true,
- "firmwareStatus": true,
- "fpgaStatus": true,
- "cores": true,
- "tenantStatus": true,
- "servicePods": true
}
}, - "backupConfig": {
- "enabled": false,
- "backupFileName": "string",
- "includePrivateKeys": false,
- "encryption": {
- "enabled": false
}, - "retainMasterKey": false,
- "storageTarget": "string",
- "retention": {
- "doNotDelete": true,
- "retentionDays": 1
}
}
}, - "readinessWarnDeviceCount": 0,
- "readinessCriticalDeviceCount": 0,
- "haCoordination": {
- "pairs": [
- {
- "pairId": "string",
- "standbyDeviceId": "string",
- "standbyDeviceName": "string",
- "activeDeviceId": "string",
- "activeDeviceName": "string",
- "currentPhase": "VALIDATE_PAIR",
- "lastError": "string",
- "phases": [
- {
- "phase": "VALIDATE_PAIR",
- "status": "PENDING",
- "sequence": 0
}
]
}
]
}, - "isRollbackTarget": true
}
], - "totalItems": 0
}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.
| jobId required | string <uuid> |
| executionId required | string <uuid> |
Execution detail
Authentication required
Resource not found
{- "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": {
- "totalDevices": 0,
- "pending": 0,
- "running": 0,
- "awaitingUser": 0,
- "completed": 0,
- "failed": 0,
- "cancelled": 0,
- "devices": [
- {
- "deviceId": "string",
- "deviceName": "string",
- "deviceKind": "BIGIP",
- "haRole": "ACTIVE",
- "haPeerId": "string",
- "status": "PENDING",
- "currentStep": "PENDING",
- "steps": [
- {
- "step": "PENDING",
- "status": "PENDING",
- "sequence": 0,
- "startedAt": "2026-10-29T14:02:59Z",
- "completedAt": "2026-10-29T14:02:59Z",
- "durationMs": 0,
- "retryCount": 0,
- "errorCode": "string",
- "errorMessage": "string"
}
], - "retryCount": 0,
- "progressPct": 0,
- "lastError": "string",
- "startedAt": "2026-10-29T14:02:59Z",
- "completedAt": "2026-10-29T14:02:59Z",
- "preSnapshotUrl": "string",
- "postSnapshotUrl": "string",
- "diffUrl": "string",
- "readinessWarnings": [
- {
- "check": "string",
- "level": "INFO",
- "message": "string"
}
], - "previousActiveVolume": "string",
- "previousActiveVersion": "string",
- "newActiveVolume": "string",
- "newActiveVersion": "string",
- "rollbackEligible": true,
- "backupFileId": "string"
}
]
}, - "configSnapshot": {
- "imageId": "string",
- "imageFileName": "string",
- "installationType": "STANDALONE",
- "batchSize": 1,
- "volumeStrategy": "NEXT_INACTIVE",
- "licenseReactivationPreference": "REACTIVATE_ON_LCD_FAILURE",
- "execution": {
- "hitlPauseBetweenBatches": true,
- "hitlPauseAfterStandbyInstallBeforeReboot": true,
- "hitlPauseAfterStandbyRebootBeforeFailover": true,
- "hitlPauseAfterFailoverBeforeSecondInstall": true,
- "hitlPauseAfterSecondInstallBeforeReboot": true,
- "automaticFailback": true,
- "hitlPauseBeforeFailback": false,
- "disableAutoConfigSync": false,
- "reboot": true
}, - "installConfig": true,
- "deviceTargets": [
- {
- "deviceId": "string",
- "volumeOverride": "string",
- "strategyOverride": "NEXT_INACTIVE",
- "configSourceVolume": "string"
}
], - "flightChecks": {
- "enabled": true,
- "coreChecks": {
- "trunkStatus": true,
- "interfaceStatus": true,
- "virtualServerState": true,
- "poolHealth": true,
- "poolMemberHealth": true,
- "performanceAllStats": true,
- "lagStatus": true,
- "alarms": true,
- "healthSummary": true,
- "cluster": true,
- "firmwareStatus": true,
- "fpgaStatus": true,
- "cores": true,
- "tenantStatus": true,
- "servicePods": true
}
}, - "backupConfig": {
- "enabled": false,
- "backupFileName": "string",
- "includePrivateKeys": false,
- "encryption": {
- "enabled": false
}, - "retainMasterKey": false,
- "storageTarget": "string",
- "retention": {
- "doNotDelete": true,
- "retentionDays": 1
}
}
}, - "readinessWarnDeviceCount": 0,
- "readinessCriticalDeviceCount": 0,
- "haCoordination": {
- "pairs": [
- {
- "pairId": "string",
- "standbyDeviceId": "string",
- "standbyDeviceName": "string",
- "activeDeviceId": "string",
- "activeDeviceName": "string",
- "currentPhase": "VALIDATE_PAIR",
- "lastError": "string",
- "phases": [
- {
- "phase": "VALIDATE_PAIR",
- "status": "PENDING",
- "sequence": 0
}
]
}
]
}, - "isRollbackTarget": true
}Returns the pending license reactivation EULA text for a device in a
software installation execution paused with pauseReason=AWAITING_USER.
| jobId required | string <uuid> |
| executionId required | string <uuid> |
| deviceId required | string <uuid> |
Pending EULA text
Authentication required
Resource not found
Execution or device is not waiting for EULA acceptance
{- "executionId": "string",
- "deviceId": "string",
- "eulaText": "string",
- "eulaAcceptanceRequired": true,
- "autoAcceptRemainingDevices": true
}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.
| jobId required | string <uuid> |
| executionId required | string <uuid> |
| deviceId required | string <uuid> |
| eulaText required | string non-empty |
| acceptAll | boolean Default: false |
EULA accepted and execution resumed
Invalid request
Authentication required
Resource not found
Execution or device is not waiting for EULA acceptance
{- "eulaText": "string",
- "acceptAll": false
}{- "executionId": "string",
- "deviceId": "string",
- "accepted": true,
- "autoAcceptRemainingDevices": true,
- "message": "string"
}Cancels the installation job gracefully.
| jobId required | string <uuid> |
Job cancelled
Authentication required
Resource not found
Job is not in a cancellable state (e.g. already COMPLETED or in a non-cancellable lifecycle state)
{- "id": "string",
- "workflowId": "string",
- "name": "string",
- "jobType": "SOFTWARE_DISTRIBUTION",
- "status": "DRAFT",
- "updatedAt": "2026-10-29T14:02:59Z"
}Retrieve the current storage allocation configuration including percentages, TTL settings, and cleanup thresholds
Storage configuration retrieved successfully
Internal server error
{- "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 percentages, TTL settings, and cleanup thresholds
| 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. |
Storage configuration updated successfully
Invalid request
Internal server error
{- "clickhouse_allocation_percent": 70.5,
- "victoriametrics_allocation_percent": 29.5,
- "cleanup_threshold_percent": 80,
- "cleanup_data_percent": 70
}{- "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"
}Returns all configured storage targets
List of storage targets
Failed to list storage targets
{- "success": true,
- "data": [
- {
- "id": "string",
- "name": "string",
- "storage_type": "local",
- "server": "string",
- "share_path": "string",
- "mount_options": "string",
- "username": "string",
- "is_default": true,
- "status": "active",
- "last_checked_at": "2026-10-29T14:02:59Z",
- "latency": "string",
- "created_at": "2026-10-29T14:02:59Z",
- "last_modified": "2026-10-29T14:02:59Z"
}
]
}Create a new NFS or SMB storage target
| 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) |
Storage target created
Invalid request
Failed to create the storage target
Vault is unavailable and the credential could not be stored
{- "name": "string",
- "storage_type": "nfs",
- "server": "string",
- "share_path": "string",
- "mount_options": "string",
- "username": "string",
- "password": "string"
}{- "success": true,
- "data": {
- "id": "string",
- "name": "string",
- "storage_type": "local",
- "server": "string",
- "share_path": "string",
- "mount_options": "string",
- "username": "string",
- "is_default": true,
- "status": "active",
- "last_checked_at": "2026-10-29T14:02:59Z",
- "latency": "string",
- "created_at": "2026-10-29T14:02:59Z",
- "last_modified": "2026-10-29T14:02:59Z"
}
}| id required | string <uuid> |
Storage target details
Not found
{- "success": true,
- "data": {
- "id": "string",
- "name": "string",
- "storage_type": "local",
- "server": "string",
- "share_path": "string",
- "mount_options": "string",
- "username": "string",
- "is_default": true,
- "status": "active",
- "last_checked_at": "2026-10-29T14:02:59Z",
- "latency": "string",
- "created_at": "2026-10-29T14:02:59Z",
- "last_modified": "2026-10-29T14:02:59Z"
}
}| id required | string <uuid> |
| 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. |
Storage target updated
Invalid request
Storage target not found
Failed to update the storage target
Vault is unavailable and the credential could not be updated
{- "name": "string",
- "storage_type": "nfs",
- "server": "string",
- "share_path": "string",
- "mount_options": "string",
- "username": "string",
- "password": "string",
- "is_default": true
}{- "success": true,
- "data": {
- "id": "string",
- "name": "string",
- "storage_type": "local",
- "server": "string",
- "share_path": "string",
- "mount_options": "string",
- "username": "string",
- "is_default": true,
- "status": "active",
- "last_checked_at": "2026-10-29T14:02:59Z",
- "latency": "string",
- "created_at": "2026-10-29T14:02:59Z",
- "last_modified": "2026-10-29T14:02:59Z"
}
}| id required | string <uuid> |
Storage target deleted
Cannot delete default local target
Storage target not found
Failed to delete the storage target
{- "success": true,
- "data": {
- "message": "string"
}
}Mount, write test file, unmount. Returns success with latency.
| id required | string <uuid> |
Test result
Storage target not found
Platform manager is unavailable
{- "success": true,
- "data": {
- "success": true,
- "message": "string",
- "latency": "string"
}
}Tests connectivity to a storage target using the provided config. Does not save anything.
| 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) |
Test result
Invalid request
Platform manager is unavailable
{- "storage_type": "local",
- "server": "string",
- "share_path": "string",
- "mount_options": "string",
- "username": "string",
- "password": "string"
}{- "success": true,
- "data": {
- "success": true,
- "message": "string",
- "latency": "string"
}
}Returns whether the current device is running in primary or standby mode based on environment variables
System role information retrieved successfully
Internal server error
{- "node_id": "standby-node-uuid",
- "node_name": "node-2",
- "status": "active",
- "role": "primary"
}Retrieves a paginated list of all async tasks with optional filtering. Useful for monitoring and debugging async operations.
| 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 |
List of tasks retrieved successfully
Bad request - invalid filter parameters
Unauthorized
Internal server error
{- "items": [
- {
- "id": "d4e5f6a7-b8c9-0123-defg-456789abcdef",
- "type": "ASSIGN_LICENSE",
- "status": "IN_PROGRESS",
- "progress": 50,
- "resourceType": "Utility",
- "resourceId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
- "resources": [
- {
- "resourceId": "string",
- "resourceType": "LicenseMember",
- "status": "PENDING",
- "error": {
- "code": 400,
- "message": "The license U5939-99933-49705-74523-4841009 has been granted to a device",
- "details": "string",
- "timestamp": "2026-10-29T14:02:59Z"
}
}
], - "error": {
- "code": 400,
- "message": "The license U5939-99933-49705-74523-4841009 has been granted to a device",
- "details": "string",
- "timestamp": "2026-10-29T14:02:59Z"
}, - "createdAt": "2026-10-29T14:02:59Z",
- "startedAt": "2026-10-29T14:02:59Z",
- "completedAt": "2026-10-29T14:02:59Z"
}
], - "totalItems": 42,
- "page": 1,
- "size": 20,
- "totalPages": 3
}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.
| taskId required | string <uuid> Example: d4e5f6a7-b8c9-0123-defg-456789abcdef UUID of the task to retrieve |
Task status retrieved successfully
Unauthorized
Task not found
Internal server error
{- "id": "d4e5f6a7-b8c9-0123-defg-456789abcdef",
- "type": "ASSIGN_LICENSE",
- "status": "PENDING",
- "progress": 0,
- "resourceType": "LicenseMember",
- "resourceId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
- "createdAt": "2024-01-15T10:30:00Z"
}Get all available telemetry types and their enabled status for AIDF forwarding
List of all telemetry types with their configuration
Internal server error
{- "types": [
- {
- "name": "API_Discovery",
- "enabled": true,
- "description": "API discovery telemetry from iRule",
- "updated_at": "2026-05-13T10:30:00Z"
}
]
}Bulk update which telemetry types are enabled for AIDF forwarding. Triggers OTEL configuration reload.
| 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) |
Telemetry types updated successfully
Validation error - invalid telemetry type names
Internal server error
{- "enabled_types": [
- "API_Discovery",
- "Application_Telemetry"
]
}{- "status": "validation_success"
}Get the configuration for a specific telemetry type
| type required | string Enum: "API_Discovery" "Application_Telemetry" Telemetry type name (API_Discovery or Application_Telemetry) |
Telemetry type configuration
Invalid telemetry type name
Telemetry type not found
Internal server error
{- "name": "API_Discovery",
- "enabled": true,
- "description": "API discovery telemetry from iRule",
- "updated_at": "2026-05-13T10:30:00Z"
}Returns information about the currently uploaded bundle, if any
Bundle info retrieved successfully
{- "data": {
- "available": true,
- "name": "f5insight-1.1.0-11-bundle.tar.gz",
- "version": "1.1.0-11",
- "size": 1073741824,
- "message": "Bundle ready for upgrade"
}
}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.
| 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 |
Uploaded bundle deleted
No matching uploaded bundle found
Upgrade operation already in progress
Failed to delete uploaded bundle
{- "success": true,
- "data": {
- "message": "string"
}
}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.
| bundle required | string <binary> Upgrade bundle .tar.gz file (max 8 GB) |
Bundle uploaded and validated
Invalid request or bundle
Another operation is in progress
File exceeds 8 GB limit
Invalid archive format or missing required structure
{- "status": "201",
- "data": {
- "version": "f5-insight-patch-3.20",
- "size_bytes": 41943040
}
}Not supported since F5 Insight 1.2.0. Use POST /api/system/upgrade/apply instead.
Endpoint is not supported
{- "success": false,
- "error": {
- "code": "SYSTEM-0002",
- "status": 409,
- "message": "An upgrade is already in progress",
- "help": "Wait for the current upgrade to complete or check status at /api/system/upgrade/status"
}
}Returns the current status of the upgrade operation
Status retrieved successfully
{- "success": true,
- "data": {
- "status": "idle",
- "message": "no action in progress"
}
}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.
| mode required | string Enum: "online" "offline" Catalog source filter. |
Catalog retrieved successfully
Missing or invalid mode query parameter
{- "status": "200",
- "data": {
- "latest_patch": "f5insight-1.1.2-62",
- "latest_full_upgrade": "f5insight-1.2.0-1",
- "patches": [
- {
- "version": "f5-insight-patch-1.2.1",
- "base_version": "f5-insight-1.2.0",
- "minimum_supported_version": "1.1.0",
- "kind": "patch",
- "is_latest": true,
- "built_at": "2026-05-15T10:30:00Z",
- "release_date": "2026-05-15",
- "services": [
- "backend",
- "frontend",
- "auth-service"
], - "filename": "f5insight-patch-1.2.1.tar.gz",
- "size_bytes": 41943040,
- "sha256": "abc123def456...",
- "cosign_signature": "MEUCIQD...",
- "download_url": "",
- "security_fix": true,
- "severity": "high",
- "mrs": [
- {
- "id": "!847",
- "title": "Fix authentication timeout issue"
}
], - "cumulative_mrs": [
- {
- "id": "!847",
- "title": "Fix authentication timeout issue"
}
]
}
], - "full_upgrades": [
- {
- "version": "f5-insight-patch-1.2.1",
- "base_version": "f5-insight-1.2.0",
- "minimum_supported_version": "1.1.0",
- "kind": "patch",
- "is_latest": true,
- "built_at": "2026-05-15T10:30:00Z",
- "release_date": "2026-05-15",
- "services": [
- "backend",
- "frontend",
- "auth-service"
], - "filename": "f5insight-patch-1.2.1.tar.gz",
- "size_bytes": 41943040,
- "sha256": "abc123def456...",
- "cosign_signature": "MEUCIQD...",
- "download_url": "",
- "security_fix": true,
- "severity": "high",
- "mrs": [
- {
- "id": "!847",
- "title": "Fix authentication timeout issue"
}
], - "cumulative_mrs": [
- {
- "id": "!847",
- "title": "Fix authentication timeout issue"
}
]
}
]
}
}Returns the APP_VERSION environment variable from the running system-manager pod.
Current version returned
{- "status": "200",
- "data": {
- "version": "f5-insight-patch-3.19"
}
}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.
| 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) |
Preflight checks completed
Invalid version parameter
Version not found in catalog
{- "status": "200",
- "data": {
- "can_proceed": true,
- "checks": [
- {
- "name": "no_active_job",
- "status": "pass",
- "message": "No active patch job running",
- "bypass_allowed": false
}
]
}
}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.
| 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. |
Upgrade initiated successfully
Invalid request or validation failed
Upgrade already in progress or preflight checks failed
Platform manager unavailable
{- "version": "3.2.1",
- "kind": "patch",
- "skip_backup": false,
- "backup_passphrase": "MyStr0ng!Pass",
- "backup_type": "full",
- "storage_target": "local",
- "bypass_preflight_checks": false
}{- "status": "202",
- "data": {
- "id": "d4e5f6a7-b8c9-4000-8000-000000000001",
- "status": "pending"
}
}Unified polling endpoint for upgrade status, rollback state, rollback job status, and postflight checks.
| job_id required | string <uuid> Example: 550e8400-e29b-41d4-a716-446655440000 Upgrade history record ID |
Job status retrieved successfully
Job not found
Internal server error
{- "status": "200",
- "data": {
- "id": "d4e5f6a7-0000-4000-8000-000000000001",
- "version": "3.2.1",
- "kind": "patch",
- "status": "done",
- "progress": 100,
- "rollback_available": true,
- "current_step": "deployments_ready",
- "started_at": "2026-10-29T14:02:59Z",
- "started_by": "admin@f5.com",
- "finished_at": "2026-10-29T14:02:59Z",
- "platform_job_id": "string",
- "download": {
- "bytes": 26214400,
- "total": 41943040,
- "pct": 62,
- "speed_bps": 5242880,
- "eta_sec": 3
}, - "error_message": "string",
- "log": [
- {
- "ts": "2026-10-29T14:02:59Z",
- "level": "info",
- "message": "Starting patch job for f5-insight-patch-3.20"
}
]
}
}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.
| job_id required | string <uuid> Upgrade history record ID |
Cancel accepted
Cancel is only supported for patch upgrade jobs
Job not found
No active job to cancel
{- "success": false,
- "error": {
- "code": "SYSTEM-0002",
- "status": 409,
- "message": "An upgrade is already in progress",
- "help": "Wait for the current upgrade to complete or check status at /api/system/upgrade/status"
}
}Runs post-deployment health checks for a completed upgrade job.
| job_id required | string <uuid> Upgrade history record ID |
Post-flight results
Job not found
{- "status": "200",
- "data": {
- "checks": [
- {
- "name": "deployments_ready",
- "status": "pass",
- "message": "All deployments are Ready"
}
]
}
}Manually starts rollback for the latest successful patch job within 72 hours of completion. Failed patch jobs trigger automatic rollback when deployment has started.
| job_id required | string <uuid> Upgrade history record ID |
Rollback started
Rollback is not available for this job
Job not found
Another operation is already in progress
{- "status": "202",
- "data": {
- "rollback_id": "770e8400-e29b-41d4-a716-446655440007"
}
}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.
| job_id required | string <uuid> Upgrade history record ID |
Rollback state checked
Job not found
{- "status": "200",
- "data": {
- "available": true,
- "prev_images": {
- "backend": "f5-insight-patch/backend:3.19",
- "system-manager": "f5-insight-patch/system-manager:3.19",
- "frontend": "f5-insight-patch/frontend:3.19"
}
}
}Returns rollback status, progress, and structured log lines.
| rollback_id required | string <uuid> Rollback history record ID |
Rollback status
Rollback job not found
{- "status": "200",
- "data": {
- "id": "770e8400-e29b-41d4-a716-446655440007",
- "status": "done",
- "progress": 100,
- "log": [
- {
- "ts": "2026-05-11T14:30:00Z",
- "level": "success",
- "message": "Rolled back backend to f5-insight-patch/backend:3.19"
}
]
}
}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.
| job_id required | string <uuid> Upgrade history record ID |
Dirty state cleared
Admin role required
Job not found
Job is already clean or is not an unresolved failed upgrade
{- "success": false,
- "error": {
- "code": "SYSTEM-0002",
- "status": 409,
- "message": "An upgrade is already in progress",
- "help": "Wait for the current upgrade to complete or check status at /api/system/upgrade/status"
}
}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.
Active job result
{- "status": "200",
- "dirty_state": false,
- "data": {
- "id": "string",
- "status": "pending",
- "progress": 0
}
}Returns the last 50 upgrade jobs, newest first, with top-level dirty_state.
Patch history
{- "status": "200",
- "dirty_state": false,
- "data": [
- {
- "job_id": "d4e5f6a7-b8c9-4000-8000-000000000001",
- "version": "f5-insight-patch-3.19",
- "kind": "patch",
- "status": "done",
- "started_by": "admin@f5.com",
- "started_at": "2026-10-29T14:02:59Z",
- "finished_at": "2026-10-29T14:02:59Z",
- "services": [
- "string"
], - "security_fix": false,
- "rollback_available": true
}
]
}Returns aggregate statistics across all historical upgrade jobs.
Aggregate stats
{- "status": "200",
- "data": {
- "total_applied": 19,
- "total_failed": 2,
- "total_rollbacks": 2,
- "avg_duration_sec": 514,
- "security_patches": 3
}
}Returns all scheduled upgrade jobs with status pending.
Scheduled jobs list
{- "status": "200",
- "data": [
- {
- "id": "770e8400-e29b-41d4-a716-446655440010",
- "version": "f5-insight-patch-3.20",
- "kind": "patch",
- "scheduled_at": "2026-05-12T02:00:00Z",
- "skip_backup": false,
- "status": "pending",
- "upgrade_job_id": "string"
}
]
}Schedules a patch or full_upgrade to run at a future UTC timestamp.
| 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. |
Schedule created
scheduled_at must be a future timestamp
{- "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
}{- "status": "201",
- "data": {
- "id": "770e8400-e29b-41d4-a716-446655440010",
- "status": "pending",
- "scheduled_at": "2026-05-12T02:00:00Z"
}
}Cancels a pending scheduled job. Has no effect on jobs already triggered.
| sched_id required | string <uuid> Scheduled upgrade job ID |
Scheduled job cancelled
Scheduled job not found
{- "success": false,
- "error": {
- "code": "SYSTEM-0002",
- "status": 409,
- "message": "An upgrade is already in progress",
- "help": "Wait for the current upgrade to complete or check status at /api/system/upgrade/status"
}
}Returns scheduled jobs in terminal states done, failed, and cancelled. Pending jobs are excluded.
Scheduled job history
{- "status": "200",
- "data": [
- {
- "id": "770e8400-e29b-41d4-a716-446655440010",
- "version": "f5-insight-patch-3.20",
- "kind": "patch",
- "scheduled_at": "2026-05-12T02:00:00Z",
- "skip_backup": false,
- "status": "pending",
- "upgrade_job_id": "string"
}
]
}Analyses upgrade history to find the best 2-hour UTC scheduling window.
Recommendation
{- "status": "200",
- "data": {
- "has_data": true,
- "best_dow": "Sunday",
- "best_hour": 2,
- "best_hour_end": 4,
- "window_label": "Sunday 02:00-04:00 UTC",
- "avg_duration_sec": 487,
- "sample_size": 7,
- "message": "Lowest failure rate (0%) across 7 historical patches."
}
}Kicks off an asynchronous VM creation task in the referenced cloud environment. Returns 202 Accepted with task tracking info.
| 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. |
VM creation task accepted
Bad request - validation failed
Referenced environment not found
Internal server error
{- "envReference": "string",
- "vmName": "string",
- "vmIP": "string",
- "vmUuid": "string"
}{- "taskId": "string",
- "status": "PENDING",
- "envReference": "string",
- "taskType": "CREATE_VM",
- "message": "string",
- "vmName": "string",
- "vmUuid": "string",
- "vmIP": "string",
- "createdAt": "2026-10-29T14:02:59Z",
- "updatedAt": "2026-10-29T14:02:59Z"
}Kicks off an asynchronous VM deletion task in the referenced cloud environment. Returns 202 Accepted with task tracking info.
| 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. |
VM deletion task accepted
Bad request - validation failed
Referenced environment not found
Internal server error
{- "envReference": "string",
- "vmName": "string",
- "vmIP": "string",
- "vmUuid": "string"
}{- "taskId": "string",
- "status": "PENDING",
- "envReference": "string",
- "taskType": "CREATE_VM",
- "message": "string",
- "vmName": "string",
- "vmUuid": "string",
- "vmIP": "string",
- "createdAt": "2026-10-29T14:02:59Z",
- "updatedAt": "2026-10-29T14:02:59Z"
}Kicks off an asynchronous VM power-on task in the referenced cloud environment. Returns 202 Accepted with task tracking info.
| 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. |
VM power-on task accepted
Bad request - validation failed
Referenced environment not found
Internal server error
{- "envReference": "string",
- "vmName": "string",
- "vmIP": "string",
- "vmUuid": "string"
}{- "taskId": "string",
- "status": "PENDING",
- "envReference": "string",
- "taskType": "CREATE_VM",
- "message": "string",
- "vmName": "string",
- "vmUuid": "string",
- "vmIP": "string",
- "createdAt": "2026-10-29T14:02:59Z",
- "updatedAt": "2026-10-29T14:02:59Z"
}Kicks off an asynchronous VM power-off task in the referenced cloud environment. Returns 202 Accepted with task tracking info.
| 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. |
VM power-off task accepted
Bad request - validation failed
Referenced environment not found
Internal server error
{- "envReference": "string",
- "vmName": "string",
- "vmIP": "string",
- "vmUuid": "string"
}{- "taskId": "string",
- "status": "PENDING",
- "envReference": "string",
- "taskType": "CREATE_VM",
- "message": "string",
- "vmName": "string",
- "vmUuid": "string",
- "vmIP": "string",
- "createdAt": "2026-10-29T14:02:59Z",
- "updatedAt": "2026-10-29T14:02:59Z"
}| taskId required | string <uuid> UUID of the VM task |
Task status returned
Task not found
Internal server error
{- "taskId": "string",
- "status": "PENDING",
- "envReference": "string",
- "taskType": "CREATE_VM",
- "message": "string",
- "vmName": "string",
- "vmUuid": "string",
- "vmIP": "string",
- "createdAt": "2026-10-29T14:02:59Z",
- "updatedAt": "2026-10-29T14:02:59Z"
}| taskId required | string <uuid> UUID of the VM task |
Task status returned
Task not found
Internal server error
{- "taskId": "string",
- "status": "PENDING",
- "envReference": "string",
- "taskType": "CREATE_VM",
- "message": "string",
- "vmName": "string",
- "vmUuid": "string",
- "vmIP": "string",
- "createdAt": "2026-10-29T14:02:59Z",
- "updatedAt": "2026-10-29T14:02:59Z"
}| taskId required | string <uuid> UUID of the VM task |
Task status returned
Task not found
Internal server error
{- "taskId": "string",
- "status": "PENDING",
- "envReference": "string",
- "taskType": "CREATE_VM",
- "message": "string",
- "vmName": "string",
- "vmUuid": "string",
- "vmIP": "string",
- "createdAt": "2026-10-29T14:02:59Z",
- "updatedAt": "2026-10-29T14:02:59Z"
}| taskId required | string <uuid> UUID of the VM task |
Task status returned
Task not found
Internal server error
{- "taskId": "string",
- "status": "PENDING",
- "envReference": "string",
- "taskType": "CREATE_VM",
- "message": "string",
- "vmName": "string",
- "vmUuid": "string",
- "vmIP": "string",
- "createdAt": "2026-10-29T14:02:59Z",
- "updatedAt": "2026-10-29T14:02:59Z"
}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.
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 |
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)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:
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.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.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).
| 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.
|
| 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.
|
Validation triggered — poll GET /validate/{validationRunId} for results
Invalid request
Authentication required
{- "backupEnabled": false,
- "device_targets": [
- {
- "device_id": "string",
- "volume_override": "string"
}
], - "image_id": "string",
- "volume_strategy": "NEXT_INACTIVE",
- "install_config": true,
- "licenseReactivationPreference": "REACTIVATE_ON_LCD_FAILURE"
}{- "validation_run_id": "string",
- "message": "validation triggered"
}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.
| validationRunId required | string <uuid> The validation run ID returned by POST /validate |
Validation results
Authentication required
Resource not found
{- "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": [
- {
- "device_id": "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa",
- "hostname": "bigip-prod-01",
- "status": "PASSED",
- "current_step": "COMPLETE",
- "blocking_check": "",
- "check_results": [
- {
- "check_name": "disk_space",
- "severity": "SOFT",
- "status": "PASS"
}, - {
- "check_name": "cpu_utilization",
- "severity": "SOFT",
- "status": "SKIP",
- "message": "CPU check not yet implemented (Stage 2)"
}, - {
- "check_name": "memory_utilization",
- "severity": "SOFT",
- "status": "SKIP",
- "message": "Memory check not yet implemented (Stage 2)"
}, - {
- "check_name": "upgrade_path",
- "severity": "HARD",
- "status": "PASS"
}, - {
- "check_name": "license_compatibility",
- "severity": "HARD",
- "status": "PASS"
}, - {
- "check_name": "license_reactivation",
- "severity": "SOFT",
- "status": "PASS"
}
]
}, - {
- "device_id": "bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb",
- "hostname": "bigip-prod-02",
- "status": "WARNING",
- "current_step": "COMPLETE",
- "blocking_check": "",
- "check_results": [
- {
- "check_name": "disk_space",
- "severity": "SOFT",
- "status": "WARN",
- "message": "VG free space 1.50 GB is below the 2 GB recommended buffer for in-place upgrade of \"HD1.2\" - the upgrade may fail if LVM needs to expand existing logical volumes (logical disk \"HD1\")",
- "detail": {
- "target_volume": "HD1.2",
- "volume_exists": true,
- "logical_disk": "HD1",
- "vg_free_gb": 1.5,
- "threshold_gb": 2
}
}, - {
- "check_name": "upgrade_path",
- "severity": "HARD",
- "status": "PASS"
}, - {
- "check_name": "license_compatibility",
- "severity": "HARD",
- "status": "PASS"
}, - {
- "check_name": "license_reactivation",
- "severity": "SOFT",
- "status": "PASS"
}
]
}, - {
- "device_id": "cccccccc-cccc-cccc-cccc-cccccccccccc",
- "hostname": "bigip-prod-03",
- "status": "FAILED",
- "current_step": "COMPLETE",
- "blocking_check": "upgrade_path",
- "check_results": [
- {
- "check_name": "disk_space",
- "severity": "SOFT",
- "status": "PASS"
}, - {
- "check_name": "upgrade_path",
- "severity": "HARD",
- "status": "FAIL",
- "message": "Current version 15.1.2 is not compatible with target image BIGIP-17.1.5. Minimum source version required: 16.1.0",
- "detail": {
- "current_version": "15.1.2",
- "target_version": "17.1.5",
- "min_source_version": "16.1.0"
}
}
]
}
]
}| 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 |
Validation successful
Validation failed
Internal server error
{- "provider_name": "string",
- "api_token": "string",
- "base_url": "string",
- "model": "string",
- "ca": "string",
- "skip_tls_verify": true
}{- "status": "validation_success",
- "error": "string"
}| endpoint required | string |
| tenant_id required | string |
| tenant_token required | string |
Validation successful
Validation failed
Internal server error
{- "endpoint": "string",
- "tenant_id": "string",
- "tenant_token": "string"
}{- "status": "validation_success",
- "error": "string"
}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.
| 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. |
List of workflow templates
Invalid new filter or existing generated parameter (msg), or an existing application-level list rejection (error).
{- "items": [
- {
- "id": "b7e6a4ae-4cf9-4ad4-b8f9-9b5347300d73",
- "name": "autoscale-default",
- "description": "Autoscale default template",
- "type": "AUTO_SCALE",
- "executionMode": "CONTINUOUS",
- "createdAt": "2026-05-18T10:00:00.000Z"
}
], - "total": 1,
- "page": 1,
- "limit": 50
}Returns a single workflow template by ID including type, execution mode, versioning metadata, and default configuration.
| workflowId required | string <uuid> |
Workflow template
Resource not found
{- "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"
}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.
Returns all telemetry iRules that are currently sending HTTP/HTTPS sample data.
| 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. |
List of telemetry iRules
Internal Error
{- "irules": [
- {
- "name": "string",
- "virtual_servers": [
- "string"
], - "device": "string",
- "last_seen_at": "2026-10-29T14:03:00Z"
}
]
}Returns top-level metrics for the iRule dashboard header (RPS, error rate, latency percentiles, severity).
| name required | string Name of the telemetry source. When reading from ClickHouse this maps to the BIG-IP hostname that produced the samples. |
| 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). |
iRule summary
Bad Request
Internal Error
{- "irule_name": "string",
- "time_range": {
- "from": "2026-10-29T14:03:00Z",
- "to": "2026-10-29T14:03:00Z"
}, - "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": [
- {
- "code_class": "string",
- "count": 0,
- "percent": 0,
- "color": "string"
}
], - "fingerprints": [
- {
- "category": "string",
- "count": 0,
- "percent": 0,
- "color": "string"
}
]
}Returns time-series traffic data broken down by outcome classification.
| name required | string Name of the telemetry source. When reading from ClickHouse this maps to the BIG-IP hostname that produced the samples. |
| 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). |
Traffic time-series
Bad Request
Internal Error
{- "irule_name": "string",
- "time_range": {
- "from": "2026-10-29T14:03:00Z",
- "to": "2026-10-29T14:03:00Z"
}, - "bucket_size_seconds": 0,
- "series": [
- {
- "outcome": "SUCCESS",
- "points": [
- {
- "timestamp": "2026-10-29T14:03:00Z",
- "value": 0
}
]
}
]
}Returns ranked URL patterns with RPS, latency, and error rate for the selected iRule.
| name required | string Name of the telemetry source. When reading from ClickHouse this maps to the BIG-IP hostname that produced the samples. |
| 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). |
Top routes table
Bad Request
Internal Error
{- "irule_name": "string",
- "time_range": {
- "from": "2026-10-29T14:03:00Z",
- "to": "2026-10-29T14:03:00Z"
}, - "routes": [
- {
- "url_pattern": "string",
- "rps": 0,
- "avg_latency_ms": 0,
- "p99_latency_ms": 0,
- "error_rate": 0,
- "severity": "NORMAL"
}
]
}Returns detailed breakdown for a specific time bucket including outcome split, latency split, top URLs, and highlights.
| 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. |
| 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). |
Bucket drilldown
Bad Request
Internal Error
{- "irule_name": "string",
- "bucket_time": "2026-10-29T14:03:00Z",
- "bucket_size_seconds": 0,
- "total_requests": 0,
- "outcome_split": [
- {
- "outcome": "SUCCESS",
- "count": 0,
- "percent": 0
}
], - "latency_split": [
- {
- "band": "FAST",
- "count": 0,
- "percent": 0
}
], - "top_urls": [
- {
- "url": "string",
- "count": 0
}
], - "highlights": [
- {
- "timestamp": "2026-10-29T14:03:00Z",
- "url": "string",
- "method": "string",
- "status_code": 0,
- "latency_ms": 0,
- "outcome": "SUCCESS",
- "severity": "NORMAL",
- "client_ip": "string"
}
]
}Returns paginated raw sample rows for on-demand drilldown.
| name required | string Name of the telemetry source. When reading from ClickHouse this maps to the BIG-IP hostname that produced the samples. |
| 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). |
Raw samples
Bad Request
Internal Error
{- "irule_name": "string",
- "time_range": {
- "from": "2026-10-29T14:03:00Z",
- "to": "2026-10-29T14:03:00Z"
}, - "total": 0,
- "samples": [
- {
- "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": {
- "total_ms": 0,
- "ssl_ms": 0,
- "server_ms": 0,
- "ttfb_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,
- "events": [
- {
- "name": "string",
- "time_ms": 0,
- "side": "string"
}
]
}, - "client_port": 0,
- "user_agent": "string",
- "irule_fired": true,
- "significance": "string"
}
], - "next_cursor": "string"
}Returns the full per-request detail for a single sampled request. Used by the right-hand-side request detail panel.
| 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. |
| device | Array of strings Filter by BIG-IP device hostname. Repeat or comma-separate for multiple devices. |
Sample detail
Bad Request
Not Found
Internal Error
{- "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": {
- "total_ms": 0,
- "ssl_ms": 0,
- "server_ms": 0,
- "ttfb_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,
- "events": [
- {
- "name": "string",
- "time_ms": 0,
- "side": "string"
}
]
}, - "client_port": 0,
- "user_agent": "string",
- "irule_fired": true,
- "significance": "string"
}Returns canonical filter values and time range options for the iRule telemetry UI.
Filter metadata
Internal Error
{- "outcomes": [
- "SUCCESS"
], - "latency_bands": [
- "FAST"
], - "severities": [
- "NORMAL"
], - "http_methods": [
- "GET"
], - "time_ranges": [
- {
- "label": "string",
- "value": "string",
- "seconds": 0,
- "default_bucket_size_seconds": 0
}
], - "devices": [
- "string"
], - "virtual_servers": [
- "string"
]
}Add a new data center to F5 Insights fleet.
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. |
Data center added successfully.
Validation error.
Internal server error.
{- "id": "string",
- "name": "string"
}{- "message": "Data center added successfully",
- "id": "string"
}Retrieve all Data Centers.
List of all data centers.
Validation error.
Internal server error.
{- "data_centers": [
- {
- "id": "string",
- "name": "string"
}
]
}certificate for TLS connections.
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 |
Certificate uploaded successfully.
Validation error.
Internal server error.
{- "name": "string",
- "description": "string",
- "certificate_content": "string"
}{- "id": "string",
- "name": "string",
- "description": "string",
- "created_at": "2026-10-29T14:03:00Z"
}Retrieve all certificates from trust store.
List of certificates.
Internal server error.
{- "trust_stores": [
- {
- "id": "string",
- "name": "string",
- "description": "string",
- "certificate_content": "string",
- "created_at": "2026-10-29T14:03:00Z",
- "last_modified": "2026-10-29T14:03:00Z"
}
]
}Retrieve a specific certificate by ID from trust store.
| id required | string <uuid> Certificate ID |
Certificate details.
Certificate not found.
Internal server error.
{- "id": "string",
- "name": "string",
- "description": "string",
- "certificate_content": "string",
- "created_at": "2026-10-29T14:03:00Z",
- "last_modified": "2026-10-29T14:03:00Z"
}Delete a certificate from trust store.
| id required | string <uuid> Certificate ID |
Certificate deleted successfully.
Certificate not found.
Certificate is in use by devices.
Internal server error.
{- "message": "Operation successful"
}Onboard a device (BIG-IP or F5OS) to F5 Insights fleet. The deviceType field selects the kind; defaults to bigip.
Details of the device to be added (BIG-IP or F5OS).
| deviceType required | string Default: "bigip" 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). |
Device added successfully.
Validation error.
Internal server error.
{- "deviceType": "bigip",
- "retention": "string",
- "port": 1,
- "collection_interval": 1,
- "max_concurrent_connections": 1,
- "tls_enabled": false,
- "ca": "string",
- "modules": {
- "apm": false,
- "cgnat": false,
- "dns": false,
- "dos": false,
- "firewall": false,
- "gtm": false,
- "policy_api_protection": false,
- "policy_asm": false,
- "policy_firewall": false,
- "policy_ip_intelligence": false,
- "policy_nat": false,
- "profile_dos": false
}, - "id": "string",
- "alias_name": "string",
- "description": "string",
- "username": "string",
- "password": "string",
- "data_center": "string",
- "endpoint": "string"
}{- "message": "Device added successfully",
- "id": "string"
}Retrieve all devices (BIG-IP and F5OS) onboarded to F5 Insights with pagination and filtering support. Use deviceType to filter by kind.
| 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. |
List of devices (BIG-IP and F5OS) with pagination metadata.
Validation error.
Internal server error.
{- "devices": [
- {
- "retention": "string",
- "port": 0,
- "collection_interval": 1,
- "max_concurrent_connections": 1,
- "tls_enabled": false,
- "ca": "string",
- "modules": {
- "apm": false,
- "cgnat": false,
- "dns": false,
- "dos": false,
- "firewall": false,
- "gtm": false,
- "policy_api_protection": false,
- "policy_asm": false,
- "policy_firewall": false,
- "policy_ip_intelligence": false,
- "policy_nat": false,
- "profile_dos": false
}, - "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
}
], - "pagination": {
- "page": 1,
- "pageSize": 1,
- "totalDevices": 0,
- "totalPages": 0
}
}Updates configuration of a device (BIG-IP or F5OS). The device kind is auto-detected from the id.
| id required | string Unique identifier of the device to update (BIG-IP or F5OS). |
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). |
Device updated successfully.
Validation error.
Internal server error.
{- "retention": "string",
- "port": 1,
- "collection_interval": 1,
- "max_concurrent_connections": 1,
- "tls_enabled": false,
- "ca": "string",
- "modules": {
- "apm": false,
- "cgnat": false,
- "dns": false,
- "dos": false,
- "firewall": false,
- "gtm": false,
- "policy_api_protection": false,
- "policy_asm": false,
- "policy_firewall": false,
- "policy_ip_intelligence": false,
- "policy_nat": false,
- "profile_dos": false
}, - "id": "string",
- "alias_name": "string",
- "description": "string",
- "username": "string",
- "password": "string",
- "data_center": "string",
- "endpoint": "string"
}{- "message": "Device updated successfully",
- "id": "string"
}Partially updates configuration of a device (BIG-IP or F5OS). Only provided fields are updated. The device kind is auto-detected from the id.
| id required | string Unique identifier of the device to update (BIG-IP or F5OS). |
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 |
Device partially updated successfully.
Validation error.
Device not found.
Internal server error.
{- "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": {
- "apm": true,
- "cgnat": true,
- "dns": true,
- "dos": true,
- "firewall": true,
- "gtm": true,
- "profile_dos": true,
- "policy_api_protection": true,
- "policy_asm": true,
- "policy_firewall": true,
- "policy_ip_intelligence": true,
- "policy_nat": true
}
}{- "retention": "string",
- "port": 0,
- "collection_interval": 1,
- "max_concurrent_connections": 1,
- "tls_enabled": false,
- "ca": "string",
- "modules": {
- "apm": false,
- "cgnat": false,
- "dns": false,
- "dos": false,
- "firewall": false,
- "gtm": false,
- "policy_api_protection": false,
- "policy_asm": false,
- "policy_firewall": false,
- "policy_ip_intelligence": false,
- "policy_nat": false,
- "profile_dos": false
}, - "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
}Fetch details of a specific device (BIG-IP or F5OS). The device kind is auto-detected from the id.
| id required | string Unique identifier of the device (BIG-IP or F5OS). |
Device fetched successfully.
Validation error.
Internal server error.
{- "retention": "string",
- "port": 0,
- "collection_interval": 1,
- "max_concurrent_connections": 1,
- "tls_enabled": false,
- "ca": "string",
- "modules": {
- "apm": false,
- "cgnat": false,
- "dns": false,
- "dos": false,
- "firewall": false,
- "gtm": false,
- "policy_api_protection": false,
- "policy_asm": false,
- "policy_firewall": false,
- "policy_ip_intelligence": false,
- "policy_nat": false,
- "profile_dos": false
}, - "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
}Delete a specific device (BIG-IP or F5OS). The device kind is auto-detected from the id.
| id required | string Unique identifier of the device (BIG-IP or F5OS). |
Device deleted successfully.
Validation error.
Internal server error.
{- "retention": "string",
- "port": 1,
- "collection_interval": 1,
- "max_concurrent_connections": 1,
- "tls_enabled": false,
- "ca": "string",
- "modules": {
- "apm": false,
- "cgnat": false,
- "dns": false,
- "dos": false,
- "firewall": false,
- "gtm": false,
- "policy_api_protection": false,
- "policy_asm": false,
- "policy_firewall": false,
- "policy_ip_intelligence": false,
- "policy_nat": false,
- "profile_dos": false
}, - "id": "string",
- "alias_name": "string",
- "description": "string",
- "username": "string",
- "password": "string",
- "data_center": "string",
- "endpoint": "string"
}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.
| id required | string Unique identifier of the device to refresh (F5OS). |
Device refreshed successfully.
Validation error (e.g. refresh not supported for BIG-IP devices).
Device not found.
Internal server error.
{- "retention": "string",
- "port": 0,
- "collection_interval": 1,
- "max_concurrent_connections": 1,
- "tls_enabled": false,
- "ca": "string",
- "modules": {
- "apm": false,
- "cgnat": false,
- "dns": false,
- "dos": false,
- "firewall": false,
- "gtm": false,
- "policy_api_protection": false,
- "policy_asm": false,
- "policy_firewall": false,
- "policy_ip_intelligence": false,
- "policy_nat": false,
- "profile_dos": false
}, - "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
}Retrieve all the devices that belong to a specific auto-scale group.
| autoScaleGroupId required | string <uuid> Unique identifier of the auto-scale group. |
| 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) |
List of devices belonging to the specified auto-scale group.
Validation error.
Auto-scale group not found.
Internal server error.
{- "devices": [
- {
- "id": "123e4567-e89b-12d3-a456-426614174000",
- "alias_name": "bigip-prod-01",
- "description": "Production BIG-IP device",
- "username": "admin",
- "data_center": "US-EAST-1",
- "endpoint": "192.168.1.100:443",
- "tls_enabled": true,
- "collection_interval": 60,
- "max_concurrent_connections": 5,
- "deviceName": "bigip1.example.com",
- "retention": "30D",
- "modules": {
- "apm": false,
- "cgnat": false,
- "dns": false,
- "dos": false,
- "firewall": false,
- "gtm": false,
- "policy_api_protection": false,
- "policy_asm": false,
- "policy_firewall": false,
- "policy_ip_intelligence": false,
- "policy_nat": false,
- "profile_dos": false
}
}, - {
- "id": "223e4567-e89b-12d3-a456-426614174001",
- "alias_name": "bigip-prod-02",
- "description": "Production BIG-IP device 2",
- "username": "admin",
- "data_center": "US-EAST-1",
- "endpoint": "192.168.1.101:443",
- "tls_enabled": true,
- "collection_interval": 60,
- "max_concurrent_connections": 5,
- "deviceName": "bigip2.example.com",
- "retention": "30D",
- "modules": {
- "apm": false,
- "cgnat": false,
- "dns": false,
- "dos": false,
- "firewall": false,
- "gtm": false,
- "policy_api_protection": false,
- "policy_asm": false,
- "policy_firewall": false,
- "policy_ip_intelligence": false,
- "policy_nat": false,
- "profile_dos": false
}
}
], - "pagination": {
- "page": 1,
- "pageSize": 20,
- "totalDevices": 2,
- "totalPages": 1
}
}Validate connectivity from F5 Insights to a BIG-IP device using provided credentials.
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). |
Connection validation result.
Validation error.
Internal server error.
{- "retention": "string",
- "port": 1,
- "collection_interval": 1,
- "max_concurrent_connections": 1,
- "tls_enabled": false,
- "ca": "string",
- "modules": {
- "apm": false,
- "cgnat": false,
- "dns": false,
- "dos": false,
- "firewall": false,
- "gtm": false,
- "policy_api_protection": false,
- "policy_asm": false,
- "policy_firewall": false,
- "policy_ip_intelligence": false,
- "policy_nat": false,
- "profile_dos": false
}, - "id": "string",
- "alias_name": "string",
- "description": "string",
- "username": "string",
- "password": "string",
- "data_center": "string",
- "endpoint": "string"
}{- "reachable": true,
- "authenticated": true,
- "message": "string"
}Retrieve operational alerts with filtering by job, resource, status, severity, category, alertCode, and page/limit pagination.
| 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. |
Paginated collection of system alerts.
Internal server error.
{- "items": [
- {
- "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": {
- "availableLicenses": 0,
- "licensePoolRef": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
- "currentCount": 4
}, - "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"
}, - {
- "id": "b2c3d4e5-f6a7-8901-bcde-f12345678901",
- "fingerprint": "6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b",
- "status": "ACTIVE",
- "severity": "CRITICAL",
- "category": "AUTOSCALE",
- "alertCode": "JOB_AUTO_PAUSED",
- "title": "Job 'api-gateway-autoscale' auto-paused due to repeated scaling failures",
- "message": "Job auto-paused after 3 consecutive SCALE_OUT failures. Last error: VMware host unreachable",
- "sourceModule": "workflow/autoscale",
- "resourceType": "JOB",
- "resourceId": "5cb73e12-4512-42fe-b892-3d84f88e1a23",
- "resourceName": "api-gateway-autoscale",
- "details": {
- "consecutiveFailures": 3,
- "maxConsecutiveFailures": 3,
- "direction": "SCALE_OUT",
- "lastError": "VMware host unreachable",
- "workflowId": "89a3f241-789a-4cde-a123-ef456789abcd"
}, - "remediation": "Resolve underlying infrastructure failure and resume the job via the UI or POST /resume.",
- "occurrenceCount": 1,
- "firstSeenAt": "2026-09-28T07:45:00Z",
- "lastSeenAt": "2026-09-28T07:45:00Z",
- "createdAt": "2026-09-28T07:45:00Z",
- "updatedAt": "2026-09-28T07:45:00Z"
}
], - "pagination": {
- "page": 1,
- "page_size": 20,
- "total": 2,
- "total_pages": 1
}
}Returns aggregated active alert counts grouped by severity level for UI badges and dashboards.
| 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. |
Active alert counts breakdown.
Internal server error.
{- "activeCritical": 1,
- "activeHigh": 0,
- "activeWarning": 3,
- "activeInfo": 2,
- "totalActive": 6
}| id required | string <uuid> Example: a1b2c3d4-e5f6-7890-abcd-ef1234567890 UUID of the alert. |
Full alert details.
Invalid alert ID format.
Alert not found.
Internal server error.
{- "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": {
- "availableLicenses": 0,
- "licensePoolRef": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
- "currentCount": 4
}, - "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"
}| id required | string <uuid> Example: a1b2c3d4-e5f6-7890-abcd-ef1234567890 UUID of the alert. |
| acknowledgedBy | string Username or email of the acknowledging operator. |
Alert acknowledged successfully.
Invalid request payload or alert already resolved.
Alert not found.
Internal server error.
{- "acknowledgedBy": "admin@f5.com"
}{- "message": "alert acknowledged successfully"
}| id required | string <uuid> Example: a1b2c3d4-e5f6-7890-abcd-ef1234567890 UUID of the alert. |
| resolvedBy | string Username or email of the resolving operator. |
| reason | string Freeform description of the resolution action taken. |
Alert resolved successfully.
Invalid request payload.
Alert not found.
Internal server error.
{- "resolvedBy": "admin@f5.com",
- "reason": "Procured 5 additional BIG-IP VE registration keys and verified capacity in license pool."
}{- "message": "alert resolved successfully"
}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.
| 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. |
A paginated collection of IP pools.
Invalid list filters and control/path binding failures return a single msg. Existing application validation errors retain their structured response.
An unexpected error occurred.
{- "items": [
- {
- "id": "string",
- "name": "string",
- "description": "string",
- "addressFamily": "IPv4",
- "address": "10.0.0.0/24",
- "gateway": "10.0.0.1",
- "addressRanges": [
- {
- "firstAddress": "10.0.0.10",
- "lastAddress": "10.0.0.100"
}
], - "totalAddressCount": 0,
- "createdAt": "2026-10-29T14:03:00Z",
- "updatedAt": "2026-10-29T14:03:00Z",
- "deletedAt": "2026-10-29T14:03:00Z"
}
], - "totalItems": 0
}Create a new IP pool with CIDR definition and address ranges.
| name required | string [ 1 .. 255 ] characters ^[a-zA-Z_][a-zA-Z0-9_.\-]*$ Pool name. Rules:
|
| 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 |
IP pool created successfully.
The request payload or parameters were invalid.
An unexpected error occurred.
{- "name": "string",
- "description": "string",
- "addressFamily": "IPv4",
- "address": "10.0.0.0/24",
- "gateway": "string",
- "addressRanges": [
- {
- "firstAddress": "10.0.0.10",
- "lastAddress": "10.0.0.100"
}
]
}{- "id": "string",
- "name": "string",
- "description": "string",
- "addressFamily": "IPv4",
- "address": "10.0.0.0/24",
- "gateway": "10.0.0.1",
- "addressRanges": [
- {
- "firstAddress": "10.0.0.10",
- "lastAddress": "10.0.0.100"
}
], - "totalAddressCount": 0,
- "createdAt": "2026-10-29T14:03:00Z",
- "updatedAt": "2026-10-29T14:03:00Z",
- "deletedAt": "2026-10-29T14:03:00Z"
}Fetch an IP pool by its identifier.
| poolId required | string <uuid> UUID of the IP pool. |
IP pool details.
The request payload or parameters were invalid.
Requested resource was not found.
An unexpected error occurred.
{- "id": "string",
- "name": "string",
- "description": "string",
- "addressFamily": "IPv4",
- "address": "10.0.0.0/24",
- "gateway": "10.0.0.1",
- "addressRanges": [
- {
- "firstAddress": "10.0.0.10",
- "lastAddress": "10.0.0.100"
}
], - "totalAddressCount": 0,
- "createdAt": "2026-10-29T14:03:00Z",
- "updatedAt": "2026-10-29T14:03:00Z",
- "deletedAt": "2026-10-29T14:03:00Z"
}Replace the configuration of an existing IP pool.
| poolId required | string <uuid> UUID of the IP pool. |
| 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:
|
| 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 |
Updated IP pool.
The request payload or parameters were invalid.
Requested resource was not found.
An unexpected error occurred.
{- "id": "string",
- "name": "string",
- "description": "string",
- "addressFamily": "IPv4",
- "address": "10.0.0.0/24",
- "gateway": "string",
- "addressRanges": [
- {
- "firstAddress": "10.0.0.10",
- "lastAddress": "10.0.0.100"
}
]
}{- "id": "string",
- "name": "string",
- "description": "string",
- "addressFamily": "IPv4",
- "address": "10.0.0.0/24",
- "gateway": "10.0.0.1",
- "addressRanges": [
- {
- "firstAddress": "10.0.0.10",
- "lastAddress": "10.0.0.100"
}
], - "totalAddressCount": 0,
- "createdAt": "2026-10-29T14:03:00Z",
- "updatedAt": "2026-10-29T14:03:00Z",
- "deletedAt": "2026-10-29T14:03:00Z"
}Permanently remove an IP pool. The operation fails if the pool still has active leases.
| poolId required | string <uuid> UUID of the IP pool. |
Pool deleted successfully.
The request payload or parameters were invalid.
Pool cannot be deleted because of active leases or validation errors.
An unexpected error occurred.
{- "error": "string"
}Allocate an IP address from the specified pool. The request is idempotent on allocationId.
| poolId required | string <uuid> UUID of the IP pool. |
| allocationId required | string Identifier used to make allocation idempotent. |
| leaseTags | Array of objects (Tag) Optional labels applied to the resulting lease. |
Allocation succeeded and returns the resulting lease.
The request payload or parameters were invalid.
Allocation failed due to conflicts such as exhausted address space.
An unexpected error occurred.
{- "allocationId": "string",
- "leaseTags": [
- {
- "name": "string",
- "value": "string"
}
]
}{- "lease": {
- "id": "string",
- "poolId": "string",
- "address": "10.0.0.10",
- "gateway": "string",
- "allocationId": "string",
- "deviceId": "string",
- "leaseTags": [
- {
- "name": "string",
- "value": "string"
}
], - "metadata": { },
- "createdAt": "2026-10-29T14:03:00Z",
- "updatedAt": "2026-10-29T14:03:00Z",
- "deletedAt": "2026-10-29T14:03:00Z"
}, - "poolId": "string",
- "allocationId": "string"
}Release one or more leases that match the provided criteria (allocation ID, address, or tags).
| poolId required | string <uuid> UUID of the IP pool. |
| allocationId required | string Nullable |
| address | string Nullable |
| leaseTags | Array of objects (Tag) |
Leases successfully released (if any matched the filters).
The request payload or parameters were invalid.
An unexpected error occurred.
{- "allocationId": "string",
- "address": "10.0.0.10",
- "leaseTags": [
- {
- "name": "string",
- "value": "string"
}
]
}{- "items": [
- {
- "id": "string",
- "poolId": "string",
- "address": "10.0.0.10",
- "gateway": "string",
- "allocationId": "string",
- "deviceId": "string",
- "leaseTags": [
- {
- "name": "string",
- "value": "string"
}
], - "metadata": { },
- "createdAt": "2026-10-29T14:03:00Z",
- "updatedAt": "2026-10-29T14:03:00Z",
- "deletedAt": "2026-10-29T14:03:00Z"
}
], - "totalItems": 0
}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.
| poolId required | string <uuid> UUID of the IP pool. |
| 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. |
Collection of leases for the pool.
Invalid list filters and control/path binding failures return a single msg. Existing application validation errors retain their structured response.
An unexpected error occurred.
{- "items": [
- {
- "id": "string",
- "poolId": "string",
- "address": "10.0.0.10",
- "gateway": "string",
- "allocationId": "string",
- "deviceId": "string",
- "leaseTags": [
- {
- "name": "string",
- "value": "string"
}
], - "metadata": { },
- "createdAt": "2026-10-29T14:03:00Z",
- "updatedAt": "2026-10-29T14:03:00Z",
- "deletedAt": "2026-10-29T14:03:00Z"
}
], - "totalItems": 0
}Retrieve a specific lease by its identifier.
| poolId required | string <uuid> UUID of the IP pool. |
| leaseId required | string <uuid> UUID of the IP lease. |
Lease details.
The request payload or parameters were invalid.
Requested resource was not found.
An unexpected error occurred.
{- "id": "string",
- "poolId": "string",
- "address": "10.0.0.10",
- "gateway": "string",
- "allocationId": "string",
- "deviceId": "string",
- "leaseTags": [
- {
- "name": "string",
- "value": "string"
}
], - "metadata": { },
- "createdAt": "2026-10-29T14:03:00Z",
- "updatedAt": "2026-10-29T14:03:00Z",
- "deletedAt": "2026-10-29T14:03:00Z"
}Release one or more leases across all IP pools that match the provided allocation ID and optional lease tags.
| 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. |
Leases successfully released (if any matched the criteria).
The request payload or parameters were invalid.
An unexpected error occurred.
{- "allocationId": "string",
- "leaseTags": [
- {
- "name": "string",
- "value": "string"
}
]
}{- "items": [
- {
- "id": "string",
- "poolId": "string",
- "address": "10.0.0.10",
- "gateway": "string",
- "allocationId": "string",
- "deviceId": "string",
- "leaseTags": [
- {
- "name": "string",
- "value": "string"
}
], - "metadata": { },
- "createdAt": "2026-10-29T14:03:00Z",
- "updatedAt": "2026-10-29T14:03:00Z",
- "deletedAt": "2026-10-29T14:03:00Z"
}
], - "totalItems": 0
}Manually create a lease for a specific address in a pool. Validates address belongs to pool ranges and enforces uniqueness.
| 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 |
Lease created successfully.
The request payload or parameters were invalid.
Lease creation failed due to conflicts (address already allocated or allocationId in use).
An unexpected error occurred.
{- "id": "string",
- "poolId": "string",
- "address": "10.0.0.10",
- "gateway": "string",
- "allocationId": "string",
- "deviceId": "string",
- "leaseTags": [
- {
- "name": "string",
- "value": "string"
}
], - "metadata": { },
- "createdAt": "2026-10-29T14:03:00Z",
- "updatedAt": "2026-10-29T14:03:00Z",
- "deletedAt": "2026-10-29T14:03:00Z"
}{- "id": "string",
- "poolId": "string",
- "address": "10.0.0.10",
- "gateway": "string",
- "allocationId": "string",
- "deviceId": "string",
- "leaseTags": [
- {
- "name": "string",
- "value": "string"
}
], - "metadata": { },
- "createdAt": "2026-10-29T14:03:00Z",
- "updatedAt": "2026-10-29T14:03:00Z",
- "deletedAt": "2026-10-29T14:03:00Z"
}