curl --request POST \
--url https://api.parallellabs.app/api/v0/lists/{listId}/duplicate \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"name": "<string>",
"companyId": "<string>"
}
'import requests
url = "https://api.parallellabs.app/api/v0/lists/{listId}/duplicate"
payload = {
"name": "<string>",
"companyId": "<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({name: '<string>', companyId: '<string>'})
};
fetch('https://api.parallellabs.app/api/v0/lists/{listId}/duplicate', 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://api.parallellabs.app/api/v0/lists/{listId}/duplicate",
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([
'name' => '<string>',
'companyId' => '<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://api.parallellabs.app/api/v0/lists/{listId}/duplicate"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"companyId\": \"<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://api.parallellabs.app/api/v0/lists/{listId}/duplicate")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"companyId\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.parallellabs.app/api/v0/lists/{listId}/duplicate")
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 \"name\": \"<string>\",\n \"companyId\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"id": "<string>",
"name": "<string>",
"type": "<string>",
"headers": [
{
"id": "<string>",
"listId": "<string>",
"name": "<string>",
"type": "<string>",
"dataType": "<string>",
"order": 123,
"actionParameters": {},
"autoRunEnabled": true,
"autoRunEnabledDate": "<string>",
"conditions": {},
"loading": true,
"created_date": "<string>",
"updated_date": "<string>",
"deleted_date": "<string>"
}
],
"count": 123,
"sharing": "<string>",
"departmentIds": [
"<string>"
]
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}Duplicate a smart list and all its active row data.
Copies every active row, column definition, cell value, cell research and timestamp, and table action configuration/results. New list, header, and row IDs make the copy independent. Deleted rows/columns are excluded. The caller owns the copy; sharing and department restrictions are retained. Copied automations start disabled. Running jobs, execution history, campaign recipients, and sequence memberships remain attached to the original list. Computed lookup columns recalculate for the new list. The entire copy is committed atomically; an error leaves no partial list.
curl --request POST \
--url https://api.parallellabs.app/api/v0/lists/{listId}/duplicate \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"name": "<string>",
"companyId": "<string>"
}
'import requests
url = "https://api.parallellabs.app/api/v0/lists/{listId}/duplicate"
payload = {
"name": "<string>",
"companyId": "<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({name: '<string>', companyId: '<string>'})
};
fetch('https://api.parallellabs.app/api/v0/lists/{listId}/duplicate', 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://api.parallellabs.app/api/v0/lists/{listId}/duplicate",
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([
'name' => '<string>',
'companyId' => '<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://api.parallellabs.app/api/v0/lists/{listId}/duplicate"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"companyId\": \"<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://api.parallellabs.app/api/v0/lists/{listId}/duplicate")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"companyId\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.parallellabs.app/api/v0/lists/{listId}/duplicate")
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 \"name\": \"<string>\",\n \"companyId\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"id": "<string>",
"name": "<string>",
"type": "<string>",
"headers": [
{
"id": "<string>",
"listId": "<string>",
"name": "<string>",
"type": "<string>",
"dataType": "<string>",
"order": 123,
"actionParameters": {},
"autoRunEnabled": true,
"autoRunEnabledDate": "<string>",
"conditions": {},
"loading": true,
"created_date": "<string>",
"updated_date": "<string>",
"deleted_date": "<string>"
}
],
"count": 123,
"sharing": "<string>",
"departmentIds": [
"<string>"
]
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}Authorizations
Company API key - scoped to a specific company. Generate from the Integrations page in your dashboard.
Path Parameters
Query Parameters
Company ID that owns the list. Required when authenticating with a personal access key (pak_…) — the key is not tied to a specific company so the server cannot infer it. Required when authenticating with a company API key only if the key belongs to a user who has access to multiple companies; otherwise it defaults to the key's company. Optional for JWT (dashboard) auth — defaults to the user's active company.
Body
Optional copy name; send {} to use the default
Name of the copy (1–100 characters). Defaults to the source name followed by " (copy)".
Company ID that owns the list. Required when authenticating with a personal access key (pak_…) — the key is not tied to a specific company so the server cannot infer it. Required when authenticating with a company API key only if the key belongs to a user who has access to multiple companies; otherwise it defaults to the key's company. Optional for JWT (dashboard) auth — defaults to the user's active company.
Response
Independent list copy with headers and copied row count
Response returned after creating a list. Includes the list's column headers so callers know the exact column names/types to read or write rows against — no follow-up request is needed.
ID (UUID) of the newly created list
Name of the newly created list
List type: "leads", "companies", or "custom"
Ordered column definitions created for the list. Use these column names when adding or updating rows.
Show child attributes
Show child attributes
Number of active rows copied, including rows with empty cells.
Sharing visibility retained from the source list.
Department restrictions retained from the source list.

