Deploy Configuration Group
Once a Configuration Group has been created (see Create a Configuration Group), you can:
- Associate one or more devices to it
- Discover the variables expected by the attached Feature Profiles
- Assign per-device variable values
- Deploy the configuration
- Track the deployment task
This page covers all related endpoints and ends with an end-to-end walkthrough that mirrors the deploy-config-group n8n workflow and the matching Bruno collection.
Associate Devices
Section titled “Associate Devices”Bind one or more devices to the configuration group.
POST /v1/config-group/{configGroupId}/device/associateX-XSRF-TOKEN: <X-XSRF-TOKEN>Authorization: Bearer <APIKEY>Content-Type: application/jsonRequest Body:
{ "devices": [ { "id": "device-uuid-aaaa-1111" }, { "id": "device-uuid-bbbb-2222" } ]}Response — 200 OK: Empty body or acknowledgement.
Disassociate Devices
Section titled “Disassociate Devices”Remove devices from the configuration group.
DELETE /v1/config-group/{configGroupId}/device/associateX-XSRF-TOKEN: <X-XSRF-TOKEN>Authorization: Bearer <APIKEY>Content-Type: application/jsonRequest Body:
{ "devices": [ { "id": "device-uuid-aaaa-1111" } ]}Response — 200 OK
Get Associated Devices
Section titled “Get Associated Devices”GET /v1/config-group/{configGroupId}/device/associateX-XSRF-TOKEN: <X-XSRF-TOKEN>Authorization: Bearer <APIKEY>Content-Type: application/jsonResponse — 200 OK:
{ "devices": [ { "id": "device-uuid-aaaa-1111", "hostname": "branch-router-01", "status": "associated" }, { "id": "device-uuid-bbbb-2222", "hostname": "branch-router-02", "status": "associated" } ]}Device Variables — Fetch, Get, Assign, Schema
Section titled “Device Variables — Fetch, Get, Assign, Schema”Device variables are per-device values that fill in template placeholders (e.g., <system_ip>, <hostname>).
Fetch Variables (Discover What’s Needed)
Section titled “Fetch Variables (Discover What’s Needed)”POST /v1/config-group/{configGroupId}/device/variablesX-XSRF-TOKEN: <X-XSRF-TOKEN>Authorization: Bearer <APIKEY>Content-Type: application/jsonRequest Body:
{ "devices": [ { "id": "device-uuid-aaaa-1111" } ]}Response — 200 OK: Returns the list of required variables for the associated devices.
Get Current Variable Values
Section titled “Get Current Variable Values”GET /v1/config-group/{configGroupId}/device/variablesX-XSRF-TOKEN: <X-XSRF-TOKEN>Authorization: Bearer <APIKEY>Content-Type: application/jsonResponse — 200 OK:
{ "solution": "sdwan", "devices": [ { "device-id": "device-uuid-aaaa-1111", "variables": [ { "name": "system_ip", "value": "10.0.0.1" }, { "name": "hostname", "value": "branch-01" }, { "name": "site_id", "value": "100" } ] } ], "groups": []}Assign Variable Values
Section titled “Assign Variable Values”PUT /v1/config-group/{configGroupId}/device/variablesX-XSRF-TOKEN: <X-XSRF-TOKEN>Authorization: Bearer <APIKEY>Content-Type: application/jsonRequest Body:
{ "solution": "sdwan", "devices": [ { "device-id": "device-uuid-aaaa-1111", "variables": [ { "name": "system_ip", "value": "10.0.0.1" }, { "name": "hostname", "value": "branch-01" }, { "name": "site_id", "value": "100" } ] }, { "device-id": "device-uuid-bbbb-2222", "variables": [ { "name": "system_ip", "value": "10.0.0.2" }, { "name": "hostname", "value": "branch-02" }, { "name": "site_id", "value": "200" } ] } ], "groups": [ { "name": "vpn-group-1", "group-variables": [ { "name": "vpn_name", "value": "Corporate" } ] } ]}Response — 200 OK
Get Variable Schema
Section titled “Get Variable Schema”GET /v1/config-group/{configGroupId}/device/variables/schemaX-XSRF-TOKEN: <X-XSRF-TOKEN>Authorization: Bearer <APIKEY>Content-Type: application/jsonResponse — 200 OK: Returns the JSON schema describing all available variable definitions and their types/constraints.
Preview Configuration
Section titled “Preview Configuration”Generate a rendered configuration preview for a specific device before deploying.
POST /v1/config-group/{configGroupId}/device/{deviceId}/previewX-XSRF-TOKEN: <X-XSRF-TOKEN>Authorization: Bearer <APIKEY>Content-Type: application/jsonPath Parameters:
| Parameter | Type | Description |
|---|---|---|
configGroupId |
uuid | Configuration group ID |
deviceId |
uuid | Target device ID |
Request Body: Empty {} or with optional parameters.
Response — 200 OK: Returns the rendered device configuration (CLI or structured).
Deploy Configuration Group
Section titled “Deploy Configuration Group”Push the configuration to all associated devices.
POST /v1/config-group/{configGroupId}/device/deployX-XSRF-TOKEN: <X-XSRF-TOKEN>Authorization: Bearer <APIKEY>Content-Type: application/jsonRequest Body: Empty {} or with optional deployment parameters.
Response — 200 OK:
{ "parentTaskId": "task-uuid-xxxx-yyyy-zzzz"}📌 Important: Use the
parentTaskIdto track deployment progress. See Deployment Tracking.
Deployment Tracking
Section titled “Deployment Tracking”All deploy operations return a parentTaskId. Use existing SD-WAN Manager task APIs to track progress:
GET /dataservice/device/action/status/{parentTaskId}X-XSRF-TOKEN: <X-XSRF-TOKEN>Authorization: Bearer <APIKEY>Content-Type: application/jsonResponse:
{ "id": "task-uuid-xxxx-yyyy-zzzz", "status": "in_progress", "activity": [ { "deviceId": "device-uuid-aaaa-1111", "status": "success", "statusId": "success" }, { "deviceId": "device-uuid-bbbb-2222", "status": "in_progress", "statusId": "in_progress" } ]}Common status values:
| Status | Meaning |
|---|---|
scheduled |
Deployment is queued |
in_progress |
Deployment is actively pushing config |
success |
Deployment completed successfully |
failure |
Deployment failed — check activity details |
End-to-End Deployment Workflow
Section titled “End-to-End Deployment Workflow”The following walkthrough mirrors the deploy-config-group n8n workflow and the Bruno collection. It assumes a Configuration Group has already been created (see Create a Configuration Group) and that all required Feature Profiles are attached.
Step 1 — Resolve the Config Group ID by name
Section titled “Step 1 — Resolve the Config Group ID by name”GET /v1/config-group?solution=sdwanFilter the array client-side and pick the entry whose name matches your group (e.g. bruno_edge_basic). Capture its id as configGroupId.
Step 2 — Associate the device(s)
Section titled “Step 2 — Associate the device(s)”POST /v1/config-group/{configGroupId}/device/associate{ "devices": [ { "id": "C8K-4A88C7BA-BC26-2009-F933-641392D21AB5" } ]}Step 3 — Discover required variables
Section titled “Step 3 — Discover required variables”GET /v1/config-group/{configGroupId}/device/variables?device-id={deviceId}&suggestions=trueThe response lists every deploy-time variable the attached profiles expect for this device (e.g. host_name, system_ip, site_id, pseudo_commit_timer).
Values sent as optionType: "global" when creating parcels, such as the Bruno lab AAA password and interface IP addresses, are already part of the created parcel payloads. Do not include those Bruno environment variable names in this PUT request unless they also appear in the discovery response.
Step 4 — Assign variable values
Section titled “Step 4 — Assign variable values”PUT /v1/config-group/{configGroupId}/device/variables{ "solution": "sdwan", "devices": [ { "device-id": "C8K-4A88C7BA-BC26-2009-F933-641392D21AB5", "variables": [ { "name": "host_name", "value": "edge-20" }, { "name": "system_ip", "value": "10.0.0.20" }, { "name": "site_id", "value": 20 }, { "name": "pseudo_commit_timer", "value": 300 }, { "name": "ipv6_strict_control", "value": false } ] } ]}💡 Tip:
site_idandpseudo_commit_timermust be sent as numbers, not strings. Booleans (e.g.ipv6_strict_control) must be real JSON booleans.
Step 5 — Deploy
Section titled “Step 5 — Deploy”POST /v1/config-group/{configGroupId}/device/deploy{ "devices": [ { "id": "C8K-4A88C7BA-BC26-2009-F933-641392D21AB5" } ]}Response:
{ "parentTaskId": "task-uuid-xxxx-yyyy-zzzz" }Step 6 — Track the deployment
Section titled “Step 6 — Track the deployment”GET /dataservice/device/action/status/{parentTaskId}Poll until status becomes success or failure (see Deployment Tracking).
Quick-Reference: Deploy Endpoints
Section titled “Quick-Reference: Deploy Endpoints”| # | Method | Endpoint | Description |
|---|---|---|---|
| 1 | POST |
/v1/config-group/{id}/device/associate |
Associate devices |
| 2 | PUT |
/v1/config-group/{id}/device/associate |
Move devices |
| 3 | DELETE |
/v1/config-group/{id}/device/associate |
Disassociate devices |
| 4 | GET |
/v1/config-group/{id}/device/associate |
Get associated devices |
| 5 | POST |
/v1/config-group/{id}/device/variables |
Fetch variables |
| 6 | GET |
/v1/config-group/{id}/device/variables |
Get variable values |
| 7 | PUT |
/v1/config-group/{id}/device/variables |
Assign variable values |
| 8 | GET |
/v1/config-group/{id}/device/variables/schema |
Get variable schema |
| 9 | POST |
/v1/config-group/{id}/device/{deviceId}/preview |
Preview config |
| 10 | POST |
/v1/config-group/{id}/device/deploy |
Deploy config group |
| 11 | GET |
/dataservice/device/action/status/{taskId} |
Track deployment task |
Common Error Codes
Section titled “Common Error Codes”| HTTP Code | Meaning | Common Cause |
|---|---|---|
200 |
Success | Operation completed |
400 |
Bad Request | Invalid JSON, missing required fields |
401 |
Unauthorized | Session expired or missing auth |
403 |
Forbidden | Insufficient RBAC permissions |
404 |
Not Found | Invalid group ID, profile ID, or device ID |
409 |
Conflict | Device already associated elsewhere |
412 |
Precondition Failed | Dependency not met |
500 |
Internal Server Error | Server-side issue — retry or check logs |