Update squad draft
PUT
https://app.sulus.ai/api/squads/{id}/draft
Update a draft — or demote a published squad to draft locally
Authentication
Send a bearer token created on your dashboard's Developer page:
Authorization: Bearer <YOUR_API_KEY>
Path parameters
id
string
Required
The squad's public id.
Validation:
the squad's external_squad_id (UUID, or draft_… slug for drafts)Stored in
squads.external_squad_idErrors
| Status | Meaning | Body |
|---|---|---|
404 |
Squad not found, or outside your account scope | {"success":false,"message":"Squad not found"} |
403 |
Workspace permission denied | |
401 |
Missing or invalid bearer token | |
403 |
Feature squads not enabled for the account |
Notes
- Accepts the same lenient body as draft creation; omitted fields keep their stored values — except members, which defaults to [] when absent (destructive).
- On a published squad the live routing keeps running untouched; only the local copy becomes a draft.
- coreData is always null — the live platform is never contacted.
curl --request PUT \
--url https://app.sulus.ai/api/squads/{id}/draft \
--header 'Authorization: Bearer <YOUR_API_KEY>' \
--header 'Content-Type: application/json' \
--data '{
"name": "Front desk",
"members": [
{
"assistantId": "a1b2c3d4-1e2f-4a3b-8c9d-0e1f2a3b4c5d",
"assistantOverrides": {"name": "Reception", "firstMessage": "Thanks for calling, how can I help?"},
"assistantDestinations": [
{"type": "assistant", "assistantName": "Booking", "message": "One moment, transferring you.", "description": "Caller wants to book an appointment", "transferMode": "rolling-history"}
],
"position": {"x": 120.5, "y": 240.0}
},
{
"assistantId": "b2c3d4e5-2f3a-4b4c-9d0e-1f2a3b4c5d6e",
"assistantOverrides": {"name": "Booking"},
"position": {"x": 420.0, "y": 240.0}
}
],
"membersOverrides": {"voicemailMessage": "Please leave a message after the tone."},
"variableValues": {"business_name": "Acme Dental"},
"metadata": {"template_id": 5, "personality_id": 16}
}'
import requests
url = "https://app.sulus.ai/api/squads/{id}/draft"
headers = {"Authorization": "Bearer <YOUR_API_KEY>"}
payload = {
"name": "Front desk",
"members": [
{
"assistantId": "a1b2c3d4-1e2f-4a3b-8c9d-0e1f2a3b4c5d",
"assistantOverrides": {"name": "Reception", "firstMessage": "Thanks for calling, how can I help?"},
"assistantDestinations": [
{"type": "assistant", "assistantName": "Booking", "message": "One moment, transferring you.", "description": "Caller wants to book an appointment", "transferMode": "rolling-history"}
],
"position": {"x": 120.5, "y": 240.0}
},
{
"assistantId": "b2c3d4e5-2f3a-4b4c-9d0e-1f2a3b4c5d6e",
"assistantOverrides": {"name": "Booking"},
"position": {"x": 420.0, "y": 240.0}
}
],
"membersOverrides": {"voicemailMessage": "Please leave a message after the tone."},
"variableValues": {"business_name": "Acme Dental"},
"metadata": {"template_id": 5, "personality_id": 16}
}
response = requests.put(url, json=payload, headers=headers)
print(response.json())
package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
url := "https://app.sulus.ai/api/squads/{id}/draft"
payload := strings.NewReader(`{
"name": "Front desk",
"members": [
{
"assistantId": "a1b2c3d4-1e2f-4a3b-8c9d-0e1f2a3b4c5d",
"assistantOverrides": {"name": "Reception", "firstMessage": "Thanks for calling, how can I help?"},
"assistantDestinations": [
{"type": "assistant", "assistantName": "Booking", "message": "One moment, transferring you.", "description": "Caller wants to book an appointment", "transferMode": "rolling-history"}
],
"position": {"x": 120.5, "y": 240.0}
},
{
"assistantId": "b2c3d4e5-2f3a-4b4c-9d0e-1f2a3b4c5d6e",
"assistantOverrides": {"name": "Booking"},
"position": {"x": 420.0, "y": 240.0}
}
],
"membersOverrides": {"voicemailMessage": "Please leave a message after the tone."},
"variableValues": {"business_name": "Acme Dental"},
"metadata": {"template_id": 5, "personality_id": 16}
}`)
req, _ := http.NewRequest("PUT", url, payload)
req.Header.Add("Authorization", "Bearer <YOUR_API_KEY>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}
Response
200
{
"success": true,
"data": {
"name": "Front desk",
"external_squad_id": "draft_Ab12Cd34Ef56",
"status": "draft",
"user_id": 42,
"created_by": 42,
"reseller_id": "f1e2d3c4-b5a6-4978-8901-234567890abc",
"workspace_id": 7,
"members": [
{
"assistantId": "a1b2c3d4-1e2f-4a3b-8c9d-0e1f2a3b4c5d",
"assistantOverrides": {
"name": "Reception",
"firstMessage": "Thanks for calling, how can I help?"
},
"assistantDestinations": [
{
"type": "assistant",
"assistantName": "Booking",
"message": "One moment, transferring you.",
"description": "Caller wants to book an appointment",
"transferMode": "rolling-history"
}
],
"position": {
"x": 120.5,
"y": 240
}
},
{
"assistantId": "b2c3d4e5-2f3a-4b4c-9d0e-1f2a3b4c5d6e",
"assistantOverrides": {
"name": "Booking"
},
"position": {
"x": 420,
"y": 240
}
}
],
"members_overrides": {
"voicemailMessage": "Please leave a message after the tone."
},
"variable_values": {
"business_name": "Acme Dental"
},
"metadata": {
"template_id": 5,
"personality_id": 16
},
"created_at": "2026-06-01T14:22:03+00:00",
"updated_at": "2026-07-30T14:25:11+00:00",
"user": {
"id": 42,
"name": "Jane Cooper",
"email": "[email protected]"
},
"creator": {
"id": 42,
"name": "Jane Cooper",
"email": "[email protected]"
},
"memberCount": 2,
"entryAssistantName": "Reception",
"updatedAt": "2026-07-30T14:25:11+00:00",
"createdAt": "2026-06-01T14:22:03+00:00",
"coreData": null
}
}
Response — PUT
/squads/{id}/draft
200
{
"success": true,
"data": {
"name": "Front desk",
"external_squad_id": "draft_Ab12Cd34Ef56",
"status": "draft",
"user_id": 42,
"created_by": 42,
"reseller_id": "f1e2d3c4-b5a6-4978-8901-234567890abc",
"workspace_id": 7,
"members": [
{
"assistantId": "a1b2c3d4-1e2f-4a3b-8c9d-0e1f2a3b4c5d",
"assistantOverrides": {
"name": "Reception",
"firstMessage": "Thanks for calling, how can I help?"
},
"assistantDestinations": [
{
"type": "assistant",
"assistantName": "Booking",
"message": "One moment, transferring you.",
"description": "Caller wants to book an appointment",
"transferMode": "rolling-history"
}
],
"position": {
"x": 120.5,
"y": 240
}
},
{
"assistantId": "b2c3d4e5-2f3a-4b4c-9d0e-1f2a3b4c5d6e",
"assistantOverrides": {
"name": "Booking"
},
"position": {
"x": 420,
"y": 240
}
}
],
"members_overrides": {
"voicemailMessage": "Please leave a message after the tone."
},
"variable_values": {
"business_name": "Acme Dental"
},
"metadata": {
"template_id": 5,
"personality_id": 16
},
"created_at": "2026-06-01T14:22:03+00:00",
"updated_at": "2026-07-30T14:25:11+00:00",
"user": {
"id": 42,
"name": "Jane Cooper",
"email": "[email protected]"
},
"creator": {
"id": 42,
"name": "Jane Cooper",
"email": "[email protected]"
},
"memberCount": 2,
"entryAssistantName": "Reception",
"updatedAt": "2026-07-30T14:25:11+00:00",
"createdAt": "2026-06-01T14:22:03+00:00",
"coreData": null
}
}