curl --request POST \
--url https://openapi.enginy.ai/v1/campaign/{campaignId}/clone \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"identityId": 123,
"identityIds": [
123
],
"name": "<string>"
}
'import requests
url = "https://openapi.enginy.ai/v1/campaign/{campaignId}/clone"
payload = {
"identityId": 123,
"identityIds": [123],
"name": "<string>"
}
headers = {
"x-api-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'x-api-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({identityId: 123, identityIds: [123], name: '<string>'})
};
fetch('https://openapi.enginy.ai/v1/campaign/{campaignId}/clone', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://openapi.enginy.ai/v1/campaign/{campaignId}/clone",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'identityId' => 123,
'identityIds' => [
123
],
'name' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-api-key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://openapi.enginy.ai/v1/campaign/{campaignId}/clone"
payload := strings.NewReader("{\n \"identityId\": 123,\n \"identityIds\": [\n 123\n ],\n \"name\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-api-key", "<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))
}HttpResponse<String> response = Unirest.post("https://openapi.enginy.ai/v1/campaign/{campaignId}/clone")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"identityId\": 123,\n \"identityIds\": [\n 123\n ],\n \"name\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://openapi.enginy.ai/v1/campaign/{campaignId}/clone")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-api-key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"identityId\": 123,\n \"identityIds\": [\n 123\n ],\n \"name\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"status": "success",
"message": "<string>",
"data": {
"id": 123,
"appUrl": "<string>",
"name": "<string>",
"status": "<string>",
"identityId": 123,
"identityIds": [
123
]
}
}Clone a campaign
Clone a campaign onto new sender identities (identityId, or identityIds for several senders, primary first), preserving workflow, messages, tasks, tags, and folder.
Responses include direct Enginy app URLs when available. Responses include an appUrl that opens the cloned campaign in Enginy. MCP agents should return those URLs to users whenever they are present in the response.
Required scope:
CAMPAIGNS_WRITERate limit: 30 requests per minute
curl --request POST \
--url https://openapi.enginy.ai/v1/campaign/{campaignId}/clone \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"identityId": 123,
"identityIds": [
123
],
"name": "<string>"
}
'import requests
url = "https://openapi.enginy.ai/v1/campaign/{campaignId}/clone"
payload = {
"identityId": 123,
"identityIds": [123],
"name": "<string>"
}
headers = {
"x-api-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'x-api-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({identityId: 123, identityIds: [123], name: '<string>'})
};
fetch('https://openapi.enginy.ai/v1/campaign/{campaignId}/clone', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://openapi.enginy.ai/v1/campaign/{campaignId}/clone",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'identityId' => 123,
'identityIds' => [
123
],
'name' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-api-key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://openapi.enginy.ai/v1/campaign/{campaignId}/clone"
payload := strings.NewReader("{\n \"identityId\": 123,\n \"identityIds\": [\n 123\n ],\n \"name\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-api-key", "<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))
}HttpResponse<String> response = Unirest.post("https://openapi.enginy.ai/v1/campaign/{campaignId}/clone")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"identityId\": 123,\n \"identityIds\": [\n 123\n ],\n \"name\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://openapi.enginy.ai/v1/campaign/{campaignId}/clone")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-api-key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"identityId\": 123,\n \"identityIds\": [\n 123\n ],\n \"name\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"status": "success",
"message": "<string>",
"data": {
"id": 123,
"appUrl": "<string>",
"name": "<string>",
"status": "<string>",
"identityId": 123,
"identityIds": [
123
]
}
}Authorizations
Path Parameters
The campaign ID to clone
Body
Sender identity ID for the cloned campaign — shorthand for identityIds: [identityId]. Send this or identityIds.
Sender identity IDs, primary first (repeats are ignored). The campaign spreads its contacts across these senders. More than one sender requires the multi-identity campaigns beta on the workspace. When identityId is also sent it must equal the first entry.
100Optional name. Defaults to "Copy of {original}"
255