Migrate Content
curl --request POST \
--url https://api.example.com/app/v1/organizations/{organizationId}/projects/{projectId}/content/{id}/migrate \
--header 'Content-Type: application/json' \
--data '
{
"targetTypeVersion": 123
}
'import requests
url = "https://api.example.com/app/v1/organizations/{organizationId}/projects/{projectId}/content/{id}/migrate"
payload = { "targetTypeVersion": 123 }
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({targetTypeVersion: 123})
};
fetch('https://api.example.com/app/v1/organizations/{organizationId}/projects/{projectId}/content/{id}/migrate', 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.example.com/app/v1/organizations/{organizationId}/projects/{projectId}/content/{id}/migrate",
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([
'targetTypeVersion' => 123
]),
CURLOPT_HTTPHEADER => [
"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://api.example.com/app/v1/organizations/{organizationId}/projects/{projectId}/content/{id}/migrate"
payload := strings.NewReader("{\n \"targetTypeVersion\": 123\n}")
req, _ := http.NewRequest("POST", url, payload)
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.example.com/app/v1/organizations/{organizationId}/projects/{projectId}/content/{id}/migrate")
.header("Content-Type", "application/json")
.body("{\n \"targetTypeVersion\": 123\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/app/v1/organizations/{organizationId}/projects/{projectId}/content/{id}/migrate")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"targetTypeVersion\": 123\n}"
response = http.request(request)
puts response.read_bodyContent
Migrate Content
Migrate content to a new ContentType version
POST
/
app
/
v1
/
organizations
/
{organizationId}
/
projects
/
{projectId}
/
content
/
{id}
/
migrate
Migrate Content
curl --request POST \
--url https://api.example.com/app/v1/organizations/{organizationId}/projects/{projectId}/content/{id}/migrate \
--header 'Content-Type: application/json' \
--data '
{
"targetTypeVersion": 123
}
'import requests
url = "https://api.example.com/app/v1/organizations/{organizationId}/projects/{projectId}/content/{id}/migrate"
payload = { "targetTypeVersion": 123 }
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({targetTypeVersion: 123})
};
fetch('https://api.example.com/app/v1/organizations/{organizationId}/projects/{projectId}/content/{id}/migrate', 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.example.com/app/v1/organizations/{organizationId}/projects/{projectId}/content/{id}/migrate",
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([
'targetTypeVersion' => 123
]),
CURLOPT_HTTPHEADER => [
"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://api.example.com/app/v1/organizations/{organizationId}/projects/{projectId}/content/{id}/migrate"
payload := strings.NewReader("{\n \"targetTypeVersion\": 123\n}")
req, _ := http.NewRequest("POST", url, payload)
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.example.com/app/v1/organizations/{organizationId}/projects/{projectId}/content/{id}/migrate")
.header("Content-Type", "application/json")
.body("{\n \"targetTypeVersion\": 123\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/app/v1/organizations/{organizationId}/projects/{projectId}/content/{id}/migrate")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"targetTypeVersion\": 123\n}"
response = http.request(request)
puts response.read_bodyUpdates content to use a newer ContentType version, updating the derived
packageVersion and validating against the new schema.
Path Parameters
Organization ID
Project ID
Content ID
Request Body
The ContentType version to migrate to
Example Request
{
"targetTypeVersion": 3
}
Response
Returns the updated Content object with the newtypeVersion and derived packageVersion.
{
"id": "cont123",
"typeId": "ct123",
"typeVersion": 3,
"version": 2,
"lastPublishedVersion": 2,
"packageVersion": "2.0.0",
"name": "Getting Started Guide",
"status": "modified",
"isTemplate": false,
"content": { ... },
"compiled": "const body = () => { ... }",
"tags": ["Tutorial"],
"metadata": { ... },
"createdAt": "2024-03-20T10:00:00Z",
"updatedAt": "2024-03-23T10:00:00Z"
}
Migration changes the
typeVersion and packageVersion. The content’s status changes to modified and must be published to make the migration live. Ensure the content is compatible with the new schema before publishing.Error Responses
ContentType Version Not Found
{
"error": {
"code": "TYPE_VERSION_NOT_FOUND",
"message": "ContentType version 3 not found"
}
}
Validation Failed
If the content doesn’t match the new schema:{
"error": {
"code": "VALIDATION_FAILED",
"message": "Content does not match target ContentType schema",
"details": {
"errors": [
{
"path": "/content/components/0/type",
"message": "Component type 'OldComponent' not allowed in version 3"
}
]
}
}
}
Cannot Downgrade
{
"error": {
"code": "INVALID_MIGRATION",
"message": "Cannot migrate to an older ContentType version",
"details": {
"currentVersion": 3,
"targetVersion": 2
}
}
}
Code Examples
curl -X POST "https://api.metabind.ai/app/v1/organizations/org123/projects/proj456/content/cont123/migrate" \
-H "Authorization: Bearer YOUR_JWT" \
-H "Content-Type: application/json" \
-d '{
"targetTypeVersion": 3
}'
const response = await fetch(
'https://api.metabind.ai/app/v1/organizations/org123/projects/proj456/content/cont123/migrate',
{
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR_JWT',
'Content-Type': 'application/json'
},
body: JSON.stringify({
targetTypeVersion: 3
})
}
);
const content = await response.json();
console.log(`Migrated to type version ${content.typeVersion}, package ${content.packageVersion}`);
⌘I