# SandyWP Documentation ## Docs - [API Reference overview](https://docs.sandywp.com/api-reference.md): Use SandyWP's complete supported customer API for sandbox, reusable, import, workspace, account, and OAuth automation. - [Blueprint API guidance](https://docs.sandywp.com/api-reference/blueprints.md): Workflow guidance for the generated Blueprint API endpoints. - [Add an account SSH public key](https://docs.sandywp.com/api-reference/endpoints/account/add-an-account-ssh-public-key.md): Registers an Ed25519 or sufficiently strong RSA public key for account sandbox access. - [Create a personal API token](https://docs.sandywp.com/api-reference/endpoints/account/create-a-personal-api-token.md): Creates a full-access personal token. The plaintext `token` is returned exactly once; store it safely. - [Get plan usage](https://docs.sandywp.com/api-reference/endpoints/account/get-plan-usage.md): Returns the caller's plan, effective sandbox limit, and active sandbox count. - [Get the current account identity](https://docs.sandywp.com/api-reference/endpoints/account/get-the-current-account-identity.md): Returns the caller and available workspaces. Scoped OAuth tokens may call this endpoint. - [List account SSH public keys](https://docs.sandywp.com/api-reference/endpoints/account/list-account-ssh-public-keys.md): Lists active account-owned public keys. Private keys are never stored or returned. - [List personal API tokens](https://docs.sandywp.com/api-reference/endpoints/account/list-personal-api-tokens.md): Lists tokens in the selected workspace without their plaintext values. - [Revoke a personal API token](https://docs.sandywp.com/api-reference/endpoints/account/revoke-a-personal-api-token.md): Revokes a token in the selected workspace. Set `id` to `self` to revoke the bearer token used for this request; `self` requires an actual Bearer credential, not only a browser session. - [Revoke an account SSH key](https://docs.sandywp.com/api-reference/endpoints/account/revoke-an-account-ssh-key.md): Soft-revokes a registered public key. Future gateway connections with that key are denied immediately. - [Bake a Blueprint into a Template](https://docs.sandywp.com/api-reference/endpoints/blueprints/bake-a-blueprint-into-a-template.md): Creates a scratch sandbox, runs the Blueprint, and snapshots the result as a Template. The response is asynchronous; poll the run and Template until they settle. Pass `templateId` only to rebake a Template already backed by this Blueprint. - [Create a sandbox from a Blueprint](https://docs.sandywp.com/api-reference/endpoints/blueprints/create-a-sandbox-from-a-blueprint.md): Creates a sandbox and queues a Blueprint run. Poll the returned run and Site until they reach a terminal state. - [Delete a Blueprint](https://docs.sandywp.com/api-reference/endpoints/blueprints/delete-a-blueprint.md): Permanently deletes a saved Blueprint. Deletion is blocked while a run is pending or running. - [Fetch a Blueprint from a URL](https://docs.sandywp.com/api-reference/endpoints/blueprints/fetch-a-blueprint-from-a-url.md): Downloads a JSON Blueprint from an HTTP(S) URL without saving it. ZIP bundles must use the bundle upload endpoint instead. - [Get a Blueprint](https://docs.sandywp.com/api-reference/endpoints/blueprints/get-a-blueprint.md): Returns one saved Blueprint with its current compatibility report. - [Get a Blueprint run](https://docs.sandywp.com/api-reference/endpoints/blueprints/get-a-blueprint-run.md): Returns per-step status, log output, and final failure detail for one run. - [List Blueprint runs](https://docs.sandywp.com/api-reference/endpoints/blueprints/list-blueprint-runs.md): Returns up to 50 recent create, apply, and bake runs for a Blueprint. - [List saved Blueprints](https://docs.sandywp.com/api-reference/endpoints/blueprints/list-saved-blueprints.md): Lists the Blueprints visible in the selected workspace. - [Save a Blueprint](https://docs.sandywp.com/api-reference/endpoints/blueprints/save-a-blueprint.md): Parses and saves a JSON Blueprint in the selected workspace. Compatibility findings are stored with it. - [Update a Blueprint](https://docs.sandywp.com/api-reference/endpoints/blueprints/update-a-blueprint.md): Updates metadata or source. Replacing source increments the Blueprint revision and is blocked while a run is active. - [Upload a Blueprint ZIP bundle](https://docs.sandywp.com/api-reference/endpoints/blueprints/upload-a-blueprint-zip-bundle.md): Uploads one ZIP bundle containing `blueprint.json`. Set `preview=1` to inspect compatibility and adaptations without saving; otherwise incompatible or unaccepted review-required changes are rejected. - [Validate or adapt a Blueprint](https://docs.sandywp.com/api-reference/endpoints/blueprints/validate-or-adapt-a-blueprint.md): 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 reque… - [Abort multipart upload](https://docs.sandywp.com/api-reference/endpoints/imports/abort-multipart-upload.md): Aborts in-progress multipart uploads, removes uploaded archive objects, and marks the import failed. - [Append an import archive chunk](https://docs.sandywp.com/api-reference/endpoints/imports/append-an-import-archive-chunk.md): Appends raw archive bytes at the contiguous `x-sandywp-offset`. Use this simpler upload protocol when direct multipart storage is unavailable. Scoped OAuth tokens need `import:write`. - [Cancel or remove an import](https://docs.sandywp.com/api-reference/endpoints/imports/cancel-or-remove-an-import.md): Without `action`, cancels an unfinished import and retains its failed row. Set `action=delete` to permanently remove the history row; a linked Site is not deleted. Scoped OAuth tokens need `import:write`. - [Complete a multipart upload](https://docs.sandywp.com/api-reference/endpoints/imports/complete-a-multipart-upload.md): Completes a direct upload. A single-archive upload starts restore immediately; completing a named streamed object only seals that object, so call multipart finalization after all objects. - [Finalize a streamed import](https://docs.sandywp.com/api-reference/endpoints/imports/finalize-a-streamed-import.md): Validates uploaded `manifest.json` and every streamed object, then starts the asynchronous restore. - [Get a multipart part upload URL](https://docs.sandywp.com/api-reference/endpoints/imports/get-a-multipart-part-upload-url.md): Returns a short-lived URL for a direct storage PUT of one initialized multipart part. - [Get import status](https://docs.sandywp.com/api-reference/endpoints/imports/get-import-status.md): Returns an import, its linked Site when one exists, ready-site login information, and live restore progress while it is creating. Scoped OAuth tokens need `import:read`. - [Initialize direct multipart upload](https://docs.sandywp.com/api-reference/endpoints/imports/initialize-direct-multipart-upload.md): Starts an object-storage multipart upload. Omit `object` for a single archive, or name a streamed object such as `database.sql.gz`, `files-001.tar`, or `manifest.json`. A `local` response means use the chunked upload endpoint instead. - [List imports](https://docs.sandywp.com/api-reference/endpoints/imports/list-imports.md): Lists imports in the selected workspace. Full-access bearer tokens work normally; scoped OAuth tokens need `import:read` and can use this family even though they cannot use other `/api/app` endpoints. - [Seal a chunked import upload](https://docs.sandywp.com/api-reference/endpoints/imports/seal-a-chunked-import-upload.md): Seals the uploaded archive and starts its asynchronous restore. Scoped OAuth tokens need `import:write`. - [Start an import upload](https://docs.sandywp.com/api-reference/endpoints/imports/start-an-import-upload.md): Creates an `awaiting_upload` import. Send `siteId` to overwrite an existing ready sandbox instead of creating one after restore. Scoped OAuth tokens need `import:write`. - [Dynamically register a public OAuth client](https://docs.sandywp.com/api-reference/endpoints/oauth/dynamically-register-a-public-oauth-client.md): RFC 7591 Dynamic Client Registration for public PKCE clients. It has no bearer or client-secret authentication; registration is rate-limited and user consent at the authorization endpoint is the security boundary. Only `token_endpoint_auth_method: none` is supported. - [Exchange an authorization code for an access token](https://docs.sandywp.com/api-reference/endpoints/oauth/exchange-an-authorization-code-for-an-access-token.md): RFC 6749 authorization-code exchange with required S256 PKCE verification. It authenticates the request with the code, registered client, redirect URI, and verifier rather than a bearer token or client secret. Send either JSON or `application/x-www-form-urlencoded` with the same fields. - [Apply a blueprint to an existing sandbox](https://docs.sandywp.com/api-reference/endpoints/sites/apply-a-blueprint-to-an-existing-sandbox.md): Applies a saved Blueprint to an **existing ready sandbox** in `"apply"` mode. **Requires a paid plan.** Fails with `409` if the sandbox already has another mutation in progress. **Async** — poll `GET /api/app/blueprints/{blueprintId}/runs/{runId}` until it reaches `"succeeded"` or `"failed"`. - [Clear the captured email log](https://docs.sandywp.com/api-reference/endpoints/sites/clear-the-captured-email-log.md): Clears the captured outgoing-email log. - [Clear the debug log](https://docs.sandywp.com/api-reference/endpoints/sites/clear-the-debug-log.md): Truncates `wp-content/debug.log`. A missing log is already "clear" and counts as success. - [Connect a Git repository for deploys](https://docs.sandywp.com/api-reference/endpoints/sites/connect-a-git-repository-for-deploys.md): Connects a Git repository to a sandbox for deploys. Private repos need an SSH URL; add the returned `deployKeyPublic` as a deploy key on the git host. A sandbox may have only one connected repository at a time (`409 repository_limit`). Only available on account-owned (not guest) sandboxes. - [Create a sandbox (or restore one from a template)](https://docs.sandywp.com/api-reference/endpoints/sites/create-a-sandbox-or-restore-one-from-a-template.md): Creates a sandbox. All fields are optional; sensible defaults are used (latest WordPress, PHP 8.3, standard preset, auto-selected worker). - [Delete a sandbox](https://docs.sandywp.com/api-reference/endpoints/sites/delete-a-sandbox.md): Deletes a sandbox. Marks it `pending_delete` and enqueues cleanup; returns the sandbox record in that transitional state. Irreversible. - [Disconnect a repository](https://docs.sandywp.com/api-reference/endpoints/sites/disconnect-a-repository.md): Disconnects the repository (soft-delete). Returns the removed repository record. - [File manager — read operations](https://docs.sandywp.com/api-reference/endpoints/sites/file-manager-—-read-operations.md): One route handles every read-only file-manager operation; `op` selects it. This app authenticates the caller and proxies the request to the sandbox's own file-manager REST API (including streamed downloads) — the response body/shape for a given `op` is whatever that sandbox-side API returns, and is… - [File manager — write operations](https://docs.sandywp.com/api-reference/endpoints/sites/file-manager-—-write-operations.md): One route handles every mutating file-manager operation; `op` selects it. Proxied verbatim to the sandbox's own file-manager REST API like the `GET` operation above — the exact response shape per `op` is not independently validated by this app. Irreversible for `delete`. - [Get a sandbox](https://docs.sandywp.com/api-reference/endpoints/sites/get-a-sandbox.md): 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. - [Get captured outgoing email](https://docs.sandywp.com/api-reference/endpoints/sites/get-captured-outgoing-email.md): Returns captured outgoing `wp_mail` messages for the sandbox. By default a sandbox holds (never delivers) outgoing mail; `delivery` on each message reflects the actual outcome once a custom SMTP relay is configured. - [Get PHP ini configuration](https://docs.sandywp.com/api-reference/endpoints/sites/get-php-ini-configuration.md): Returns the sandbox's current PHP ini values, defaults, memory-limit ceiling, PHP version, and any pending change. - [Get sandbox status, events, and jobs](https://docs.sandywp.com/api-reference/endpoints/sites/get-sandbox-status-events-and-jobs.md): 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. - [Get SSH connection details](https://docs.sandywp.com/api-reference/endpoints/sites/get-ssh-connection-details.md): Reads the sandbox's SSH connection details (host, port, a ready-to-copy `ssh` command, and how many of the caller's registered keys could connect). SSH is off by default per sandbox; only available on account-owned (not guest) sandboxes. - [Get WordPress debug settings](https://docs.sandywp.com/api-reference/endpoints/sites/get-wordpress-debug-settings.md): Returns the sandbox's WordPress debug settings, defaults, and any pending change. - [Install or deploy a plugin](https://docs.sandywp.com/api-reference/endpoints/sites/install-or-deploy-a-plugin.md): Installs & activates a plugin on a `ready`, account-owned sandbox (async `deploy_plugin` job — poll with the returned `jobId` via the `GET` operation below). Accepts **one of three** request shapes: a `multipart/form-data` upload of a plugin ZIP, a JSON body naming a `pluginSlug` to install from wor… - [Issue a database (Adminer) access URL](https://docs.sandywp.com/api-reference/endpoints/sites/issue-a-database-adminer-access-url.md): Issues a short-lived Adminer URL to browse and edit the sandbox's database directly. The sandbox must be `ready`. The URL embeds a scoped, time-boxed token — treat it as sensitive and do not store or share it beyond `expiresAt`. - [Issue a one-time login link](https://docs.sandywp.com/api-reference/endpoints/sites/issue-a-one-time-login-link.md): Issues a one-time login link that opens the sandbox already signed in to wp-admin. - [List a repository's remote branches and tags](https://docs.sandywp.com/api-reference/endpoints/sites/list-a-repositorys-remote-branches-and-tags.md): Lists the branch and tag names on the repository's remote via `git ls-remote`, run live from the server. Read-only; the dashboard's branch/tag picker falls back to a free-text input when this fails, so a slow/unreachable remote never blocks a deploy. - [List a sandbox's connected Git repositories](https://docs.sandywp.com/api-reference/endpoints/sites/list-a-sandboxs-connected-git-repositories.md): Lists the Git repositories connected to a sandbox (currently at most one per site), each with its recent deployment history. - [List sandboxes](https://docs.sandywp.com/api-reference/endpoints/sites/list-sandboxes.md): Lists the caller's sandboxes. List items omit the plaintext admin password (see `SiteListItem`) — fetch `GET /api/app/sites/{id}` for a single sandbox to get it, or use `magicLoginUrl` for passwordless access. - [Poll a plugin deploy job](https://docs.sandywp.com/api-reference/endpoints/sites/poll-a-plugin-deploy-job.md): Polls a `deploy_plugin` job's status. `jobId` is scoped to this sandbox and the caller. - [Replace PHP ini configuration](https://docs.sandywp.com/api-reference/endpoints/sites/replace-php-ini-configuration.md): Sets the sandbox's PHP ini values (async `apply_php_config` job). **Every field below is required on every call** — the server validates and rewrites the complete configuration object each time; a request missing any field is rejected with `400 invalid_php_config` naming the missing/invalid field. (… - [Replace WordPress debug settings](https://docs.sandywp.com/api-reference/endpoints/sites/replace-wordpress-debug-settings.md): **Replaces** the debug settings (async `apply_debug_options` job) — every field is optional, but any field you omit is treated as `false` (this is a full replace, not a patch). `wpDebugLog` / `wpDebugDisplay` only take effect while `wpDebug` is `true`; the server forces them off when `wpDebug` is `f… - [Reset a sandbox to a clean install](https://docs.sandywp.com/api-reference/endpoints/sites/reset-a-sandbox-to-a-clean-install.md): Resets a `ready` sandbox back to a clean WordPress install in place — same site record, URL, and admin login, but every plugin, theme, upload, and post is wiped. Not supported for multisite sandboxes. **Irreversible.** Async — the sandbox comes back `"creating"` while the worker rebuilds it; poll `G… - [Restore an expired sandbox](https://docs.sandywp.com/api-reference/endpoints/sites/restore-an-expired-sandbox.md): Restores an `expired` sandbox (its data is retained until the retention window ends). The only accepted body is `{"action": "restore"}`; this is the only action this endpoint currently supports. Async — the sandbox comes back `"creating"` while the worker restarts the container; poll `GET /api/app/s… - [Set whether a sandbox is permanent](https://docs.sandywp.com/api-reference/endpoints/sites/set-whether-a-sandbox-is-permanent.md): Sets whether a sandbox is permanent (never expires). Setting `true` requires a paid plan. Setting `false` on a currently-permanent sandbox reverts it to the default temporary lifespan starting now. A no-op call (value already matches) succeeds without changing `expiresAt`. - [Switch the PHP runtime version](https://docs.sandywp.com/api-reference/endpoints/sites/switch-the-php-runtime-version.md): Switches the sandbox's PHP runtime (async `switch_php_version` job; the worker recreates the container on the new image and rolls back to the previous version if the new one fails to come up healthy — the site record's `phpVersion` is only updated on success). The sandbox must be `ready`. - [Tail the debug log](https://docs.sandywp.com/api-reference/endpoints/sites/tail-the-debug-log.md): Tails `wp-content/debug.log`. Returns `exists: false` with empty `content` when logging has not produced a log yet (enable `wpDebug` + `wpDebugLog` via `PUT /api/app/sites/{id}/debug` first). Reads over the sandbox's own file-manager HTTP API, not a direct filesystem call, so it works even when the… - [Trigger a deployment](https://docs.sandywp.com/api-reference/endpoints/sites/trigger-a-deployment.md): Triggers a deployment of the connected repository (async `git_deploy` job; poll the returned deployment's `status` via `GET /api/app/sites/{id}/repositories`). An optional body deploys a specific ref **for this run only**, without changing the repository's configured `branch`. The sandbox must be `r… - [Turn email capture on or off](https://docs.sandywp.com/api-reference/endpoints/sites/turn-email-capture-on-or-off.md): Turns outgoing-email capture on or off for the sandbox. - [Turn SSH on/off, or issue a one-click ephemeral key](https://docs.sandywp.com/api-reference/endpoints/sites/turn-ssh-onoff-or-issue-a-one-click-ephemeral-key.md): One endpoint, two actions selected by `action`. `set-access` turns SSH on or off for the sandbox; `issue-ephemeral` mints a short-lived keypair for a one-click session (SSH must already be enabled). The generated private key is returned **once** and never stored server-side. - [Update a connected repository](https://docs.sandywp.com/api-reference/endpoints/sites/update-a-connected-repository.md): Updates `branch`, `folderName`, and/or `autoDeploy` on a connected repository. Unlike most write endpoints in this API, this one rejects unrecognized body fields outright (for example `repoUrl` or `destination`, which cannot be changed after connecting — disconnect and reconnect instead). - [Configure the template's public launch link](https://docs.sandywp.com/api-reference/endpoints/templates/configure-the-templates-public-launch-link.md): Manages the Template's public "launch this demo" link at `/launch/`. One endpoint, four actions selected by `action`: - [Delete a template](https://docs.sandywp.com/api-reference/endpoints/templates/delete-a-template.md): Deletes a Template and its snapshot artifact. Irreversible. A Template id that doesn't exist — or one owned by someone else — returns `404 template_not_found` either way: the two cases are deliberately indistinguishable so a Template id cannot be probed for existence. - [Get a template](https://docs.sandywp.com/api-reference/endpoints/templates/get-a-template.md): Returns one Template, including its launch-link settings. - [List a template's captured launch leads](https://docs.sandywp.com/api-reference/endpoints/templates/list-a-templates-captured-launch-leads.md): Lists the email leads captured by a Template's public launcher when its `entryMode` is `email`. - [List templates](https://docs.sandywp.com/api-reference/endpoints/templates/list-templates.md): Lists the caller's Templates in their current workspace. - [Snapshot a sandbox into a new template](https://docs.sandywp.com/api-reference/endpoints/templates/snapshot-a-sandbox-into-a-new-template.md): Snapshots a `ready` sandbox the caller owns into a new Template. **Async** — this call returns immediately with the Template in status `"building"` and enqueues a `template_snapshot` job on the sandbox's worker; poll `GET /api/app/templates/{id}` until `status` becomes `"ready"` (or `"failed"`, see… - [Assign a member role](https://docs.sandywp.com/api-reference/endpoints/workspaces/assign-a-member-role.md): Assigns a custom role or clears it with `roleId: null`. The caller needs the `manage` capability. - [Create a workspace role](https://docs.sandywp.com/api-reference/endpoints/workspaces/create-a-workspace-role.md): Creates a role with an explicit value for every capability. Only the workspace owner can change roles. - [Delete a workspace role](https://docs.sandywp.com/api-reference/endpoints/workspaces/delete-a-workspace-role.md): Deletes an unused custom role. Only the workspace owner can change roles. - [Invite a workspace member](https://docs.sandywp.com/api-reference/endpoints/workspaces/invite-a-workspace-member.md): Emails an invitation. The caller needs the `manage` capability and may only grant a role it can grant. - [List available workspaces](https://docs.sandywp.com/api-reference/endpoints/workspaces/list-available-workspaces.md): Lists workspaces the authenticated caller belongs to. Select one on later requests with `X-SandyWP-Workspace`. - [List workspace members](https://docs.sandywp.com/api-reference/endpoints/workspaces/list-workspace-members.md): Lists current members. The workspace header must select the same workspace as `{id}`. - [List workspace roles](https://docs.sandywp.com/api-reference/endpoints/workspaces/list-workspace-roles.md): Lists custom roles in the selected workspace. - [Remove a workspace member](https://docs.sandywp.com/api-reference/endpoints/workspaces/remove-a-workspace-member.md): Removes a member. A member may remove themself; removing someone else requires the `manage` capability. - [Update a workspace role](https://docs.sandywp.com/api-reference/endpoints/workspaces/update-a-workspace-role.md): Updates one or more role fields. Only the workspace owner can change roles. - [Imports API guidance](https://docs.sandywp.com/api-reference/imports.md): Workflow guidance for the generated import and archive-upload endpoints. - [OAuth connector flow](https://docs.sandywp.com/api-reference/oauth.md): Register a public PKCE client and exchange a SandyWP authorization code for a scoped bearer token. - [Workspace API guidance](https://docs.sandywp.com/api-reference/workspaces.md): Workflow guidance for generated workspace, member, and role endpoints. - [CLI](https://docs.sandywp.com/cli.md): Install the SandyWP CLI, authenticate once, and manage WordPress sandboxes from your terminal. - [Core concepts](https://docs.sandywp.com/concepts.md): Understand SandyWP sandboxes, URLs, stacks, lifecycles, plans, templates, regions, and API keys. - [API keys](https://docs.sandywp.com/guides/api-keys.md): Create, use, and revoke personal API keys for the SandyWP CLI and full HTTP API. - [Blueprints](https://docs.sandywp.com/guides/blueprints.md): Create, validate, import, run, and bake reviewable WordPress setup recipes as JSON Blueprints. - [Clone a site](https://docs.sandywp.com/guides/clone-a-site.md): Copy a WordPress site you control into a new SandyWP sandbox with the SandyWP Cloner plugin. - [Create a sandbox](https://docs.sandywp.com/guides/create-a-sandbox.md): Create a WordPress sandbox and choose its name, stack, region, lifespan, and debugging options. - [Database](https://docs.sandywp.com/guides/database.md): Open a ready sandbox's WordPress database in a short-lived, web-based database manager. - [File Manager](https://docs.sandywp.com/guides/file-manager.md): Browse, edit, upload, download, and manage files in a ready SandyWP sandbox from the browser. - [Git deployment](https://docs.sandywp.com/guides/git-deployment.md): Deploy a plugin, theme, or wp-content folder from a Git repository into a SandyWP sandbox. - [GitHub pull request previews](https://docs.sandywp.com/guides/github.md): Create temporary WordPress previews from the exact head commit of a trusted GitHub pull request. - [Mount a sandbox](https://docs.sandywp.com/guides/mount-a-sandbox.md): Mount a ready SandyWP sandbox as a local folder with the SandyWP CLI. - [Open wp-admin](https://docs.sandywp.com/guides/open-wp-admin.md): Open a SandyWP sandbox's WordPress admin with a magic login link or copied credentials. - [PHP settings](https://docs.sandywp.com/guides/php.md): Switch PHP versions and tune supported php.ini settings for a ready SandyWP sandbox. - [Plans and limits](https://docs.sandywp.com/guides/plans.md): Review SandyWP active-sandbox limits, storage allowances, permanent-sandbox access, and billing controls. - [Push a local site](https://docs.sandywp.com/guides/push-local-site.md): Push a local WordPress installation into a public SandyWP sandbox from the command line. - [Lifespan and permanence](https://docs.sandywp.com/guides/site-lifespan.md): Choose when a SandyWP sandbox expires, make it permanent, and understand retention after expiry. - [Slack app](https://docs.sandywp.com/guides/slack.md): Install SandyWP for Slack, link your account, and deploy plugins or Git branches by mentioning the bot. - [SSH access](https://docs.sandywp.com/guides/ssh-access.md): Use the SandyWP CLI or dashboard to access a ready sandbox with account-scoped SSH. - [Templates](https://docs.sandywp.com/guides/templates.md): Save a finished sandbox as a reusable snapshot and create new sandboxes from it. - [Welcome to SandyWP](https://docs.sandywp.com/index.md): Create disposable WordPress sandboxes for plugin testing, debugging, demos, and experiments. ## OpenAPI Specs - [openapi](https://docs.sandywp.com/openapi.yaml)