curl --request POST \
--url https://app.sandywp.com/api/app/blueprints/validate \
--header 'Content-Type: application/json' \
--data '
{
"source": "<string>",
"sourceJson": "<string>",
"sourceUrl": "<string>",
"adapt": false,
"blueprintId": "<string>"
}
'import requests
url = "https://app.sandywp.com/api/app/blueprints/validate"
payload = {
"source": "<string>",
"sourceJson": "<string>",
"sourceUrl": "<string>",
"adapt": False,
"blueprintId": "<string>"
}
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({
source: '<string>',
sourceJson: '<string>',
sourceUrl: '<string>',
adapt: false,
blueprintId: '<string>'
})
};
fetch('https://app.sandywp.com/api/app/blueprints/validate', 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://app.sandywp.com/api/app/blueprints/validate",
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([
'source' => '<string>',
'sourceJson' => '<string>',
'sourceUrl' => '<string>',
'adapt' => false,
'blueprintId' => '<string>'
]),
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://app.sandywp.com/api/app/blueprints/validate"
payload := strings.NewReader("{\n \"source\": \"<string>\",\n \"sourceJson\": \"<string>\",\n \"sourceUrl\": \"<string>\",\n \"adapt\": false,\n \"blueprintId\": \"<string>\"\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://app.sandywp.com/api/app/blueprints/validate")
.header("Content-Type", "application/json")
.body("{\n \"source\": \"<string>\",\n \"sourceJson\": \"<string>\",\n \"sourceUrl\": \"<string>\",\n \"adapt\": false,\n \"blueprintId\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.sandywp.com/api/app/blueprints/validate")
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 \"source\": \"<string>\",\n \"sourceJson\": \"<string>\",\n \"sourceUrl\": \"<string>\",\n \"adapt\": false,\n \"blueprintId\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"valid": true,
"schemaVersion": 1,
"stepCount": 1,
"hoisted": {
"phpVersion": "<string>",
"requestedPhpVersion": "<string>",
"wordpressVersion": "<string>",
"requestedWordpressVersion": "<string>",
"multisite": true
},
"findings": [
{
"severity": "error",
"path": "<string>",
"code": "<string>",
"message": "<string>"
}
],
"source": {
"preferredVersions": {
"php": "8.3",
"wp": "latest"
},
"steps": [
{
"step": "setSiteOptions",
"options": {
"blogname": "My Sandbox"
}
}
]
},
"changes": [
{
"path": "<string>",
"code": "field_removed",
"message": "<string>",
"subject": "<string>"
}
],
"manifestDirectory": "<string>"
}{
"error": {
"code": "invalid_request",
"message": "<string>",
"details": {}
}
}{
"error": {
"code": "invalid_request",
"message": "<string>",
"details": {}
}
}{
"error": {
"code": "invalid_request",
"message": "<string>",
"details": {}
}
}Validate or adapt a Blueprint
Validation without blueprintId is public, including requests with adapt: true; it returns findings and, when adapting, an adapted source. Supplying blueprintId always requires a bearer token so the server can inspect a saved bundle. This conditional authentication cannot be expressed per request shape, so this operation declares no OpenAPI security requirement.
curl --request POST \
--url https://app.sandywp.com/api/app/blueprints/validate \
--header 'Content-Type: application/json' \
--data '
{
"source": "<string>",
"sourceJson": "<string>",
"sourceUrl": "<string>",
"adapt": false,
"blueprintId": "<string>"
}
'import requests
url = "https://app.sandywp.com/api/app/blueprints/validate"
payload = {
"source": "<string>",
"sourceJson": "<string>",
"sourceUrl": "<string>",
"adapt": False,
"blueprintId": "<string>"
}
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({
source: '<string>',
sourceJson: '<string>',
sourceUrl: '<string>',
adapt: false,
blueprintId: '<string>'
})
};
fetch('https://app.sandywp.com/api/app/blueprints/validate', 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://app.sandywp.com/api/app/blueprints/validate",
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([
'source' => '<string>',
'sourceJson' => '<string>',
'sourceUrl' => '<string>',
'adapt' => false,
'blueprintId' => '<string>'
]),
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://app.sandywp.com/api/app/blueprints/validate"
payload := strings.NewReader("{\n \"source\": \"<string>\",\n \"sourceJson\": \"<string>\",\n \"sourceUrl\": \"<string>\",\n \"adapt\": false,\n \"blueprintId\": \"<string>\"\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://app.sandywp.com/api/app/blueprints/validate")
.header("Content-Type", "application/json")
.body("{\n \"source\": \"<string>\",\n \"sourceJson\": \"<string>\",\n \"sourceUrl\": \"<string>\",\n \"adapt\": false,\n \"blueprintId\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.sandywp.com/api/app/blueprints/validate")
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 \"source\": \"<string>\",\n \"sourceJson\": \"<string>\",\n \"sourceUrl\": \"<string>\",\n \"adapt\": false,\n \"blueprintId\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"valid": true,
"schemaVersion": 1,
"stepCount": 1,
"hoisted": {
"phpVersion": "<string>",
"requestedPhpVersion": "<string>",
"wordpressVersion": "<string>",
"requestedWordpressVersion": "<string>",
"multisite": true
},
"findings": [
{
"severity": "error",
"path": "<string>",
"code": "<string>",
"message": "<string>"
}
],
"source": {
"preferredVersions": {
"php": "8.3",
"wp": "latest"
},
"steps": [
{
"step": "setSiteOptions",
"options": {
"blogname": "My Sandbox"
}
}
]
},
"changes": [
{
"path": "<string>",
"code": "field_removed",
"message": "<string>",
"subject": "<string>"
}
],
"manifestDirectory": "<string>"
}{
"error": {
"code": "invalid_request",
"message": "<string>",
"details": {}
}
}{
"error": {
"code": "invalid_request",
"message": "<string>",
"details": {}
}
}{
"error": {
"code": "invalid_request",
"message": "<string>",
"details": {}
}
}Body
- Option 1
- Option 2
Supply source or its legacy sourceJson alias.
Optional base URL used while adapting external Blueprint resources.
Return a SandyWP-adapted source and adaptation changes.
Saved Blueprint id. Its presence requires bearer authentication.
Response
Compatibility findings and optional adapted source.
Validation output. source and changes are present only for adaptation responses or bundle previews.
False when one or more compatibility findings have severity: error.
1, 2 x >= 0Show child attributes
Show child attributes
Show child attributes
Show child attributes
A WordPress Playground Blueprint document. SandyWP accepts schema version 1 or 2 and validates its supported steps and resources before saving or running it.
{
"preferredVersions": { "php": "8.3", "wp": "latest" },
"steps": [
{
"step": "setSiteOptions",
"options": { "blogname": "My Sandbox" }
}
]
}
Show child attributes
Show child attributes
Present for a ZIP bundle preview.

