Logo
Search
Docs

Duplicate tool

POST https://app.sulus.ai/api/tools/{id}/duplicate

Duplicate as a local draft copy

Authentication

Send a bearer token created on your dashboard's Developer page:

Authorization: Bearer <YOUR_API_KEY>

Path parameters

id string Required

The tool's public id.

Validation: the tool's external_tool_id (UUID, or draft_… slug for drafts)
Stored in tools.external_tool_id

Errors

StatusMeaningBody
404 Tool not found, or outside your account scope {"success":false,"message":"Tool not found"}
403 Global tool mutation attempted by a non-super-admin {"success":false,"message":"Global tools are read-only and cannot be edited or deleted."}
403 Workspace permission denied
500 Copy failed {"success":false,"message":"Failed to duplicate tool: <detail>"}
401 Missing or invalid bearer token
403 Feature tools not enabled for the account

Notes

  • Always a draft, regardless of whether the source is draft or published; the name is "<original> (Copy)" capped at 100 characters; the live platform is never contacted.
  • coreData is always null — the copy never contacts the live platform.
curl --request POST \
  --url https://app.sulus.ai/api/tools/{id}/duplicate \
  --header 'Authorization: Bearer <YOUR_API_KEY>'
import requests

url = "https://app.sulus.ai/api/tools/{id}/duplicate"
headers = {"Authorization": "Bearer <YOUR_API_KEY>"}

response = requests.post(url, headers=headers)
print(response.json())
package main

import (
	"fmt"
	"io"
	"net/http"
)

func main() {
	url := "https://app.sulus.ai/api/tools/{id}/duplicate"
	req, _ := http.NewRequest("POST", url, nil)
	req.Header.Add("Authorization", "Bearer <YOUR_API_KEY>")
	res, _ := http.DefaultClient.Do(req)
	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)
	fmt.Println(string(body))
}
Response 201
{
    "success": true,
    "data": {
        "name": "Check Order Status (Copy)",
        "user_id": 42,
        "external_tool_id": "draft_Gh78Ij90Kl12",
        "status": "draft",
        "created_by": 42,
        "reseller_id": "f1e2d3c4-b5a6-4978-8901-234567890abc",
        "workspace_id": "9a8b7c6d-5e4f-4a3b-9c8d-7e6f5a4b3c2d",
        "type": "apiRequest",
        "description": "Looks up an order by ID and returns its current status.",
        "function_def": {
            "name": "check_order_status"
        },
        "server": {
            "url": "https://api.example-business.com/orders/lookup",
            "method": "POST",
            "timeoutSeconds": 20,
            "credentialId": "3f9c2a10-6b4e-4a2d-9f0a-1c2d3e4f5a6b"
        },
        "variable_extraction_plan": {
            "properties": [
                {
                    "name": "orderStatus",
                    "type": "string",
                    "description": "Current status of the order",
                    "required": false
                }
            ]
        },
        "destinations": null,
        "rejection_plan": null,
        "messages": [
            {
                "type": "request-start",
                "content": "Let me check on that order for you."
            }
        ],
        "metadata": {
            "category": "orders"
        },
        "async": false,
        "created_at": "2026-07-30T14:35:19+00:00",
        "updated_at": "2026-07-30T14:35:19+00:00",
        "user": {
            "id": 42,
            "name": "Jane Cooper",
            "email": "[email protected]"
        },
        "creator": {
            "id": 42,
            "name": "Jane Cooper",
            "email": "[email protected]"
        },
        "read_only": false,
        "coreData": null
    }
}