curl --request POST \
--url https://api.parallellabs.app/api/v0/marketing-campaign-templates/{templateId}/versions/{versionId}/restore \
--header 'X-API-Key: <api-key>'import requests
url = "https://api.parallellabs.app/api/v0/marketing-campaign-templates/{templateId}/versions/{versionId}/restore"
headers = {"X-API-Key": "<api-key>"}
response = requests.post(url, headers=headers)
print(response.text)const options = {method: 'POST', headers: {'X-API-Key': '<api-key>'}};
fetch('https://api.parallellabs.app/api/v0/marketing-campaign-templates/{templateId}/versions/{versionId}/restore', 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/marketing-campaign-templates/{templateId}/versions/{versionId}/restore",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"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"
"net/http"
"io"
)
func main() {
url := "https://api.parallellabs.app/api/v0/marketing-campaign-templates/{templateId}/versions/{versionId}/restore"
req, _ := http.NewRequest("POST", url, nil)
req.Header.Add("X-API-Key", "<api-key>")
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/marketing-campaign-templates/{templateId}/versions/{versionId}/restore")
.header("X-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.parallellabs.app/api/v0/marketing-campaign-templates/{templateId}/versions/{versionId}/restore")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-Key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"id": "<string>",
"companyId": "<string>",
"uid": "<string>",
"name": "<string>",
"description": "<string>",
"subject": "<string>",
"replyTo": "<string>",
"bodyHtml": "<string>",
"bodyDocument": "<string>",
"senderProfileId": "<string>",
"listId": "<string>",
"fieldMappings": {},
"scheduleSettings": "<string>",
"chatHistory": [
"<string>"
],
"created_date": "<string>",
"updated_date": "<string>",
"smartList": {
"id": "<string>",
"name": "<string>"
},
"senderProfile": {
"id": "<string>",
"name": "<string>",
"email": "<string>",
"integrationId": "<string>"
}
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}Restore a previous version of a template's content.
The restore is itself saved as a new version, so it can always be undone.
curl --request POST \
--url https://api.parallellabs.app/api/v0/marketing-campaign-templates/{templateId}/versions/{versionId}/restore \
--header 'X-API-Key: <api-key>'import requests
url = "https://api.parallellabs.app/api/v0/marketing-campaign-templates/{templateId}/versions/{versionId}/restore"
headers = {"X-API-Key": "<api-key>"}
response = requests.post(url, headers=headers)
print(response.text)const options = {method: 'POST', headers: {'X-API-Key': '<api-key>'}};
fetch('https://api.parallellabs.app/api/v0/marketing-campaign-templates/{templateId}/versions/{versionId}/restore', 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/marketing-campaign-templates/{templateId}/versions/{versionId}/restore",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"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"
"net/http"
"io"
)
func main() {
url := "https://api.parallellabs.app/api/v0/marketing-campaign-templates/{templateId}/versions/{versionId}/restore"
req, _ := http.NewRequest("POST", url, nil)
req.Header.Add("X-API-Key", "<api-key>")
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/marketing-campaign-templates/{templateId}/versions/{versionId}/restore")
.header("X-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.parallellabs.app/api/v0/marketing-campaign-templates/{templateId}/versions/{versionId}/restore")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-Key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"id": "<string>",
"companyId": "<string>",
"uid": "<string>",
"name": "<string>",
"description": "<string>",
"subject": "<string>",
"replyTo": "<string>",
"bodyHtml": "<string>",
"bodyDocument": "<string>",
"senderProfileId": "<string>",
"listId": "<string>",
"fieldMappings": {},
"scheduleSettings": "<string>",
"chatHistory": [
"<string>"
],
"created_date": "<string>",
"updated_date": "<string>",
"smartList": {
"id": "<string>",
"name": "<string>"
},
"senderProfile": {
"id": "<string>",
"name": "<string>",
"email": "<string>",
"integrationId": "<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.
Response
The template after restoring the selected version
A reusable marketing campaign template
Template ID
Company this template belongs to
User ID that created the template
Template name
Optional note describing when to use this template
Default email subject line
Default Reply-To email address
Email HTML rendered by the server from bodyDocument (read-only)
Visual-builder JSON document for the email body (source of truth)
Default sender profile ID
Default smart list ID
Field mapping for resolving recipient email from a list row
Optional sending-window settings
Saved AI chat history for this template (reserved for a future AI edit mode)
ISO timestamp when the template was created
ISO timestamp when the template was last updated
Summary of the default smart list
Show child attributes
Show child attributes
Summary of the default sender profile
Show child attributes
Show child attributes

