curl --request POST \
--url https://api.erdo.ai/v1/pages/restore/{pageID} \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.erdo.ai/v1/pages/restore/{pageID}"
headers = {"Authorization": "Bearer <token>"}
response = requests.post(url, headers=headers)
print(response.text)const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.erdo.ai/v1/pages/restore/{pageID}', 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.erdo.ai/v1/pages/restore/{pageID}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$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.erdo.ai/v1/pages/restore/{pageID}"
req, _ := http.NewRequest("POST", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
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.erdo.ai/v1/pages/restore/{pageID}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.erdo.ai/v1/pages/restore/{pageID}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"cloned_pipelines": [
{
"id": "<string>",
"purpose": "<string>",
"slug": "<string>",
"source_id": "<string>"
}
],
"id": "<string>",
"meta_description": "<string>",
"meta_icon_asset_id": "<string>",
"meta_image_asset_id": "<string>",
"meta_title": "<string>",
"notes": [
"<string>"
],
"public": true,
"public_url": "<string>",
"review": {
"issues": [
{
"category": "<string>",
"description": "<string>",
"id": "<string>",
"judge_slug": "<string>",
"severity": "<string>",
"suggestion": "<string>"
}
],
"judges": [
"<string>"
],
"lighthouse": {
"accessibility": 123,
"best_practices": 123,
"fetched_at": "2023-11-07T05:31:56Z",
"performance": 123,
"seo": 123
},
"reason": "<string>",
"reviewed": true,
"summary": "<string>"
},
"rewrites": {},
"source_page_id": "<string>",
"thread_id": "<string>",
"title": "<string>",
"url": "<string>",
"validation": {
"errors": [
{
"column": 123,
"context": "<string>",
"field": "<string>",
"line": 123,
"message": "<string>",
"severity": "<string>"
}
],
"valid": true
},
"warning": "<string>"
}{
"code": "not_found",
"details": {},
"message": "<string>"
}RestorePageAPI mirrors the erdo_restore_page MCP tool.
The path is /v1/pages/restore/:pageID rather than /v1/pages/:pageID/restore because Encore forbids a parameterized segment (:pageID) at the same position as the existing static /v1/pages/validate route under POST. A static “restore” sibling to “validate” sidesteps that; delete stays RESTful (DELETE /v1/pages/:pageID) since DELETE has no static sibling at that position.
curl --request POST \
--url https://api.erdo.ai/v1/pages/restore/{pageID} \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.erdo.ai/v1/pages/restore/{pageID}"
headers = {"Authorization": "Bearer <token>"}
response = requests.post(url, headers=headers)
print(response.text)const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.erdo.ai/v1/pages/restore/{pageID}', 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.erdo.ai/v1/pages/restore/{pageID}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$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.erdo.ai/v1/pages/restore/{pageID}"
req, _ := http.NewRequest("POST", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
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.erdo.ai/v1/pages/restore/{pageID}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.erdo.ai/v1/pages/restore/{pageID}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"cloned_pipelines": [
{
"id": "<string>",
"purpose": "<string>",
"slug": "<string>",
"source_id": "<string>"
}
],
"id": "<string>",
"meta_description": "<string>",
"meta_icon_asset_id": "<string>",
"meta_image_asset_id": "<string>",
"meta_title": "<string>",
"notes": [
"<string>"
],
"public": true,
"public_url": "<string>",
"review": {
"issues": [
{
"category": "<string>",
"description": "<string>",
"id": "<string>",
"judge_slug": "<string>",
"severity": "<string>",
"suggestion": "<string>"
}
],
"judges": [
"<string>"
],
"lighthouse": {
"accessibility": 123,
"best_practices": 123,
"fetched_at": "2023-11-07T05:31:56Z",
"performance": 123,
"seo": 123
},
"reason": "<string>",
"reviewed": true,
"summary": "<string>"
},
"rewrites": {},
"source_page_id": "<string>",
"thread_id": "<string>",
"title": "<string>",
"url": "<string>",
"validation": {
"errors": [
{
"column": 123,
"context": "<string>",
"field": "<string>",
"line": 123,
"message": "<string>",
"severity": "<string>"
}
],
"valid": true
},
"warning": "<string>"
}{
"code": "not_found",
"details": {},
"message": "<string>"
}Authorizations
An Erdo API key (erdo_api_...) or scoped token (erdo_token_...).
Path Parameters
Response
Success response
Show child attributes
Show child attributes
ids (favicon / share image), nil when unset.
(nil when unset), so a caller can confirm what it just deployed/updated without a separate read.
request_review. Structured rather than prose so the tool result can carry it without a second formatting layer inventing its own vocabulary.
Show child attributes
Show child attributes
Show child attributes
Show child attributes
clone_from_page_id deploy: the page the copy was made from, the lead-capture pipelines duplicated onto it, every id substitution applied to the copied content, and anything the caller still has to act on.
share link and is only present while the page is public. Use these values verbatim — hosts differ across prod/staging/local.
action callers can reference it without importing the validator implementation.
Show child attributes
Show child attributes
successful content deploy/update). The page exists and is usable; the calling agent should surface this to the user and retry the failing op.

