curl --request GET \
--url https://app.sandywp.com/api/app/sites/{id} \
--header 'Authorization: Bearer <token>'import requests
url = "https://app.sandywp.com/api/app/sites/{id}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://app.sandywp.com/api/app/sites/{id}', 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/sites/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
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://app.sandywp.com/api/app/sites/{id}"
req, _ := http.NewRequest("GET", 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.get("https://app.sandywp.com/api/app/sites/{id}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.sandywp.com/api/app/sites/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"site": {
"id": "site_abc123",
"name": "my-sandbox",
"slug": "my-sandbox",
"status": "creating",
"publicUrl": "https://my-sandbox.sandywp.dev",
"wordpressVersion": "<string>",
"phpVersion": "<string>",
"workerCode": "eu1",
"adminUsername": "admin",
"adminPassword": "<string>",
"magicLoginUrl": "<string>",
"permanent": true,
"expiresAt": "2023-11-07T05:31:56Z",
"expirationMode": "fixed",
"idleTimeoutMinutes": 123,
"createdAt": "2023-11-07T05:31:56Z",
"readyAt": "2023-11-07T05:31:56Z",
"failureReason": "<string>"
},
"events": [
{
"id": "<string>",
"siteId": "<string>",
"jobId": "<string>",
"workerCode": "<string>",
"kind": "site.created",
"message": "<string>",
"metadata": {},
"createdAt": "2023-11-07T05:31:56Z"
}
],
"jobs": [
{
"id": "<string>",
"type": "provision_site",
"status": "pending",
"siteId": "<string>",
"workerCode": "<string>",
"payload": {},
"attempts": 123,
"maxAttempts": 123,
"runAfter": "2023-11-07T05:31:56Z",
"lockedAt": "2023-11-07T05:31:56Z",
"lastError": "<string>",
"createdAt": "2023-11-07T05:31:56Z",
"updatedAt": "2023-11-07T05:31:56Z"
}
]
}{
"error": {
"code": "auth_required",
"message": "A logged-in user is required.",
"details": {}
}
}{
"error": {
"code": "site_not_found",
"message": "Site not found.",
"details": {}
}
}Get a sandbox
Returns one sandbox with its recent provisioning events and jobs — useful for showing live progress. Same response shape as GET /api/sites/{id}/status, addressed under the /api/app namespace.
curl --request GET \
--url https://app.sandywp.com/api/app/sites/{id} \
--header 'Authorization: Bearer <token>'import requests
url = "https://app.sandywp.com/api/app/sites/{id}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://app.sandywp.com/api/app/sites/{id}', 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/sites/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
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://app.sandywp.com/api/app/sites/{id}"
req, _ := http.NewRequest("GET", 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.get("https://app.sandywp.com/api/app/sites/{id}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.sandywp.com/api/app/sites/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"site": {
"id": "site_abc123",
"name": "my-sandbox",
"slug": "my-sandbox",
"status": "creating",
"publicUrl": "https://my-sandbox.sandywp.dev",
"wordpressVersion": "<string>",
"phpVersion": "<string>",
"workerCode": "eu1",
"adminUsername": "admin",
"adminPassword": "<string>",
"magicLoginUrl": "<string>",
"permanent": true,
"expiresAt": "2023-11-07T05:31:56Z",
"expirationMode": "fixed",
"idleTimeoutMinutes": 123,
"createdAt": "2023-11-07T05:31:56Z",
"readyAt": "2023-11-07T05:31:56Z",
"failureReason": "<string>"
},
"events": [
{
"id": "<string>",
"siteId": "<string>",
"jobId": "<string>",
"workerCode": "<string>",
"kind": "site.created",
"message": "<string>",
"metadata": {},
"createdAt": "2023-11-07T05:31:56Z"
}
],
"jobs": [
{
"id": "<string>",
"type": "provision_site",
"status": "pending",
"siteId": "<string>",
"workerCode": "<string>",
"payload": {},
"attempts": 123,
"maxAttempts": 123,
"runAfter": "2023-11-07T05:31:56Z",
"lockedAt": "2023-11-07T05:31:56Z",
"lastError": "<string>",
"createdAt": "2023-11-07T05:31:56Z",
"updatedAt": "2023-11-07T05:31:56Z"
}
]
}{
"error": {
"code": "auth_required",
"message": "A logged-in user is required.",
"details": {}
}
}{
"error": {
"code": "site_not_found",
"message": "Site not found.",
"details": {}
}
}Authorizations
Personal API token, sent as Authorization: Bearer <SANDYWP_API_KEY>. Obtain one from the dashboard account menu (API keys), sandywp auth login, or POST /api/account/tokens. A missing or invalid token returns 401 auth_required. Scoped OAuth tokens are limited to the Imports family and GET /api/account/me; see the top-level conventions.
Headers
Selects which of the caller's workspaces to act in, for accounts belonging to more than one (legacy alias: X-SandyWP-Organization). Defaults to the caller's own personal workspace when omitted. Every id in this API (sandboxes, Templates, repositories) is scoped to a single workspace, so this header changes which set of resources is visible.
Path Parameters
The sandbox id.
Response
The sandbox, its recent provisioning events, and its recent jobs.
The owner-facing view of a sandbox. Strips internal provisioning details (container/DB names, password hash, warm-pool ids, routing) and keeps only what a caller needs to use and log into the sandbox.
Show child attributes
Show child attributes
Most recent events first, capped at 30.
Show child attributes
Show child attributes
Most recent jobs first, capped at 10.
Show child attributes
Show child attributes

