Restore campaigns
curl --request POST \
--url https://panel.metricanic.com/api/v1/campaigns/restore \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"ids": [
"1a2b3c4d-5e6f-4a7b-8c9d-0e1f2a3b4c5d"
]
}
'import requests
url = "https://panel.metricanic.com/api/v1/campaigns/restore"
payload = { "ids": ["1a2b3c4d-5e6f-4a7b-8c9d-0e1f2a3b4c5d"] }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({ids: ['1a2b3c4d-5e6f-4a7b-8c9d-0e1f2a3b4c5d']})
};
fetch('https://panel.metricanic.com/api/v1/campaigns/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://panel.metricanic.com/api/v1/campaigns/restore",
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([
'ids' => [
'1a2b3c4d-5e6f-4a7b-8c9d-0e1f2a3b4c5d'
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$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://panel.metricanic.com/api/v1/campaigns/restore"
payload := strings.NewReader("{\n \"ids\": [\n \"1a2b3c4d-5e6f-4a7b-8c9d-0e1f2a3b4c5d\"\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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://panel.metricanic.com/api/v1/campaigns/restore")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"ids\": [\n \"1a2b3c4d-5e6f-4a7b-8c9d-0e1f2a3b4c5d\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://panel.metricanic.com/api/v1/campaigns/restore")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"ids\": [\n \"1a2b3c4d-5e6f-4a7b-8c9d-0e1f2a3b4c5d\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"ok": true,
"data": {
"restored": 1,
"runtimePendingIds": [
"1a2b3c4d-5e6f-4a7b-8c9d-0e1f2a3b4c5d"
],
"runtimePublishedIds": []
}
}{
"ok": false,
"error": {
"code": "<string>",
"message": "<string>",
"details": {}
},
"requestId": "<string>"
}{
"ok": false,
"error": {
"code": "<string>",
"message": "<string>",
"details": {}
},
"requestId": "<string>"
}{
"ok": false,
"error": {
"code": "<string>",
"message": "<string>",
"details": {}
},
"requestId": "<string>"
}{
"ok": false,
"error": {
"code": "<string>",
"message": "<string>",
"details": {}
},
"requestId": "<string>"
}{
"ok": false,
"error": {
"code": "DOMAIN_NOT_ACTIVE",
"message": "Choose an active tracking domain and save the campaign before restoring it.",
"details": {
"blockedCampaignIds": [
"1a2b3c4d-5e6f-4a7b-8c9d-0e1f2a3b4c5d"
]
}
}
}{
"ok": false,
"error": {
"code": "<string>",
"message": "<string>",
"details": {}
},
"requestId": "<string>"
}{
"ok": false,
"error": {
"code": "<string>",
"message": "<string>",
"details": {}
},
"requestId": "<string>"
}{
"ok": false,
"error": {
"code": "<string>",
"message": "<string>",
"details": {}
},
"requestId": "<string>"
}Campaigns
Restore campaigns
Restores the selected campaigns with their campaign-only rotators. Use an active shared rotator and published hosted landings. Removed tracking domains are cleared. Tracking resumes after the restoration takes effect.
POST
/
api
/
v1
/
campaigns
/
restore
Restore campaigns
curl --request POST \
--url https://panel.metricanic.com/api/v1/campaigns/restore \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"ids": [
"1a2b3c4d-5e6f-4a7b-8c9d-0e1f2a3b4c5d"
]
}
'import requests
url = "https://panel.metricanic.com/api/v1/campaigns/restore"
payload = { "ids": ["1a2b3c4d-5e6f-4a7b-8c9d-0e1f2a3b4c5d"] }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({ids: ['1a2b3c4d-5e6f-4a7b-8c9d-0e1f2a3b4c5d']})
};
fetch('https://panel.metricanic.com/api/v1/campaigns/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://panel.metricanic.com/api/v1/campaigns/restore",
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([
'ids' => [
'1a2b3c4d-5e6f-4a7b-8c9d-0e1f2a3b4c5d'
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$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://panel.metricanic.com/api/v1/campaigns/restore"
payload := strings.NewReader("{\n \"ids\": [\n \"1a2b3c4d-5e6f-4a7b-8c9d-0e1f2a3b4c5d\"\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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://panel.metricanic.com/api/v1/campaigns/restore")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"ids\": [\n \"1a2b3c4d-5e6f-4a7b-8c9d-0e1f2a3b4c5d\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://panel.metricanic.com/api/v1/campaigns/restore")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"ids\": [\n \"1a2b3c4d-5e6f-4a7b-8c9d-0e1f2a3b4c5d\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"ok": true,
"data": {
"restored": 1,
"runtimePendingIds": [
"1a2b3c4d-5e6f-4a7b-8c9d-0e1f2a3b4c5d"
],
"runtimePublishedIds": []
}
}{
"ok": false,
"error": {
"code": "<string>",
"message": "<string>",
"details": {}
},
"requestId": "<string>"
}{
"ok": false,
"error": {
"code": "<string>",
"message": "<string>",
"details": {}
},
"requestId": "<string>"
}{
"ok": false,
"error": {
"code": "<string>",
"message": "<string>",
"details": {}
},
"requestId": "<string>"
}{
"ok": false,
"error": {
"code": "<string>",
"message": "<string>",
"details": {}
},
"requestId": "<string>"
}{
"ok": false,
"error": {
"code": "DOMAIN_NOT_ACTIVE",
"message": "Choose an active tracking domain and save the campaign before restoring it.",
"details": {
"blockedCampaignIds": [
"1a2b3c4d-5e6f-4a7b-8c9d-0e1f2a3b4c5d"
]
}
}
}{
"ok": false,
"error": {
"code": "<string>",
"message": "<string>",
"details": {}
},
"requestId": "<string>"
}{
"ok": false,
"error": {
"code": "<string>",
"message": "<string>",
"details": {}
},
"requestId": "<string>"
}{
"ok": false,
"error": {
"code": "<string>",
"message": "<string>",
"details": {}
},
"requestId": "<string>"
}Authorizations
Workspace-scoped token sent in the Authorization header as Bearer . Access depends on the credential's allowed operations, read or write scope, and workspace subscription. Use an API key issued in the tracker for Public API v1. MCP uses separate OAuth credentials.
Body
application/json
1 to 200 input IDs before deduplication. IDs are trimmed and blank values are dropped. At least one nonblank ID is required. Unknown object fields are ignored.
Required array length:
1 - 200 elements