REST API documentation

Automate a controlled Local-to-Live deployment.

Authenticate an existing account, upload a project ZIP, and follow one parent operation through Analyze, Build, and Deploy.

Base URLhttps://api.sitedropper.com

Quickstart

Deploy a ZIP in three requests.

Use an existing Sitedropper account. Public API registration is currently disabled, and REST JWTs are separate from MCP OAuth access tokens.

01

Authenticate

Log in over HTTPS, then store the returned token in a secret manager or protected environment variable.

Request a REST token
curl --fail-with-body -X POST "https://api.sitedropper.com/api/v1/auth/login" \
  -H "Content-Type: application/json" \
  -d '{"email":"[email protected]","password":"your-password"}'
Response shape
{
  "token": "<jwt>",
  "expires_at": "<ISO-8601 timestamp>",
  "user": { "email": "[email protected]" }
}
02

Upload and deploy

The one-shot multipart endpoint creates or selects a project, accepts the ZIP, and queues the complete deployment chain. Draft is the safe default; other visibility choices depend on account entitlements.

Queue Local-to-Live
export SITEDROPPER_API="https://api.sitedropper.com"
export SITEDROPPER_TOKEN="<token from login response>"

curl --fail-with-body -X POST "$SITEDROPPER_API/api/v1/local-to-live" \
  -H "Authorization: Bearer $SITEDROPPER_TOKEN" \
  -F "[email protected]" \
  -F "name=studio" \
  -F "visibility=draft"
Abbreviated 202 response
{
  "action": "local_to_live_queued",
  "project": { "url": "https://studio.apps.sitedropper.com" },
  "operation": { "id": "<operation-id>", "status": "running", "progress": 5 },
  "next_step": "poll the parent operation until it finishes"
}
03

Poll the parent operation

Retain operation.id from the deployment response. Do not start a second deployment while Analyze, Build, and Deploy are already chaining.

Read operation status
export OPERATION_ID="<operation.id from deploy response>"

curl --fail-with-body \
  -H "Authorization: Bearer $SITEDROPPER_TOKEN" \
  "$SITEDROPPER_API/api/v1/operations/$OPERATION_ID"

Authentication

Use a REST JWT only for server-side automation.

  • Send Authorization: Bearer <token> on every protected request.
  • Keep credentials and tokens out of source archives, browser JavaScript, logs, and Analytics.
  • REST tokens currently expire without a refresh-token flow; authenticate again after expiration.
  • Logout is stateless and does not revoke an issued token, so protect it for its full lifetime.
  • Never substitute an MCP OAuth token for a REST JWT.

Large uploads

Keep archive transfer separate from API authentication.

Create an authenticated upload session when an agent or external uploader should send a ZIP without receiving your REST token. The returned upload_url is short-lived, one-time, and itself a credential.

Prepare an upload session
curl --fail-with-body -X POST "$SITEDROPPER_API/api/v1/upload-sessions" \
  -H "Authorization: Bearer $SITEDROPPER_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "studio",
    "visibility": "draft",
    "filename": "site.zip",
    "runtime": "static",
    "framework": "static",
    "skip_build": true,
    "root_directory": "."
  }'
Use the one-time URL
export UPLOAD_URL="<upload_url from session response>"

curl --fail-with-body -X POST "$UPLOAD_URL" \
  -F "[email protected]"

New-project upload sessions cannot carry environment variables or an access password. Create the project first or use the authenticated Local-to-Live endpoint when those values are required.

Asynchronous work

Follow the parent operation to a terminal state.

Queued work can report queued, running, succeeded, failed, or canceled. The operation detail also includes child state, build-log context, queue information, maybe_stuck, and a recommended next step when available.

Analyze

Archive shape and runtime detection.

Build

Dependency, command, and image preparation.

Deploy

Runtime release, routing, and final URL.

Poll with bounded backoff. Stop when the parent operation reaches a terminal state; inspect its guidance before using cancel or retry.

Reference

Core endpoint map.

Every protected route is account-scoped by the JWT. Project resources additionally verify that the project belongs to the authenticated account.

Account

POST/api/v1/access-requests

Submit a public access request; no bearer token required.

POST/api/v1/auth/login

Exchange existing account credentials for a REST JWT.

GET/api/v1/me

Return the authenticated user and account identity.

GET/api/v1/billing/entitlements

Read plan limits and currently allowed capabilities.

Deploy and operate

POST/api/v1/local-to-live

Upload a ZIP and queue Analyze → Build → Deploy for a new or selected project.

POST/api/v1/projects/{projectID}/local-to-live

Run Local-to-Live against an existing project.

POST/api/v1/upload-sessions

Create a short-lived, one-time direct upload URL.

POST/api/v1/upload-sessions/{token}/upload

Send the ZIP to a prepared upload session without forwarding the JWT.

GET/api/v1/operations/{operationID}

Read parent operation progress, child state, logs summary, and next-step guidance.

POST/api/v1/operations/{operationID}/cancel

Cancel eligible queued or running work.

POST/api/v1/operations/{operationID}/retry

Retry an eligible failed or canceled parent operation.

Projects

GET · POST/api/v1/projects/

List projects or create a project. The collection route currently uses a trailing slash.

GET · PATCH · DELETE/api/v1/projects/{projectID}/

Read, update, or queue deletion of an account-owned project.

GET/api/v1/projects/{projectID}/versions

List uploaded and detected project versions.

GET/api/v1/projects/{projectID}/builds

List builds; build detail and retry routes are available below this path.

GET/api/v1/projects/{projectID}/deployments

List deployments; detail and retry routes are available below this path.

GET · POST/api/v1/projects/{projectID}/environment

List variable names/digests or set an encrypted environment value.

GET · POST/api/v1/projects/{projectID}/access-grants

List or add approved email access for a Private project.

Read the complete repository-backed endpoint reference

Errors and current limits

Handle the status before reading the body.

400Validation or service request error
401Missing, invalid, or expired authentication
403Registration, plan, or entitlement restriction
404Missing or inaccessible resource

Errors generally use {"error":"message"}. Plan restrictions can also include machine-readable code, feature, plan, required_plan, limit, and usage fields.

Archive size and runtime support depend on deployed configuration. Do not assume databases, persistent volumes, cron jobs, background workers, multi-container applications, runtime log retrieval, custom domains, or rollback controls are available.

Worked example

Need the deployment logic around these calls?

Read the REST automation guide