curl --request GET \
--url https://app.sandywp.com/api/sites/{id}/status \
--header 'Authorization: Bearer <token>'import requests
url = "https://app.sandywp.com/api/sites/{id}/status"
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/sites/{id}/status', 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/sites/{id}/status",
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/sites/{id}/status"
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/sites/{id}/status")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.sandywp.com/api/sites/{id}/status")
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 sandbox status, events, and jobs
Returns a sandbox with its recent provisioning events and jobs — useful for showing live progress while polling a create/restore/reset/deploy. Identical response shape to GET /api/app/sites/{id}; this path predates the /api/app namespace and is kept for backward compatibility.
curl --request GET \
--url https://app.sandywp.com/api/sites/{id}/status \
--header 'Authorization: Bearer <token>'import requests
url = "https://app.sandywp.com/api/sites/{id}/status"
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/sites/{id}/status', 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/sites/{id}/status",
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/sites/{id}/status"
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/sites/{id}/status")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.sandywp.com/api/sites/{id}/status")
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

