JX Deploy

Developer documentation

JXHQ Deploy API

Create sites, upload ZIP files, and track deployments from scripts, CI/CD, or your own application.

Base URL

https://deploy.jxhq.net/api/v1

Authentication

Verify your email address and enable 2FA first. Then create a key under API keys. A key is shown in full only once.

Send the key as a Bearer token. Never place it in browser code, a repository, or a public ZIP file.

Authorization: Bearer jxhq_live_YOUR_API_KEY
Content-Type: application/json
sites:read

View sites and deployments.

sites:write

Create and delete sites.

deployments:create

Start new ZIP deployments.

Sites

GET/sites

Returns every non-deleted site owned by the account. Requires sites:read.

curl https://deploy.jxhq.net/api/v1/sites \
  -H "Authorization: Bearer $JXHQ_API_KEY"
POST/sites

Creates an empty site with an automatically generated *.jxhq.page address. Requires sites:write.

curl -X POST https://deploy.jxhq.net/api/v1/sites \
  -H "Authorization: Bearer $JXHQ_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"My documentation"}'

Response: 201 Created. Save data.id for subsequent requests.

GET/sites/:id

Returns one site and its deployment history. Requires sites:read.

curl https://deploy.jxhq.net/api/v1/sites/$SITE_ID \
  -H "Authorization: Bearer $JXHQ_API_KEY"
DELETE/sites/:id

Deletes the site and makes it unavailable. Requires sites:write. This action cannot be undone through the API.

curl -X DELETE https://deploy.jxhq.net/api/v1/sites/$SITE_ID \
  -H "Authorization: Bearer $JXHQ_API_KEY"

Response: 204 No Content.

Upload a deployment

Upload one ZIP using the multipart field site. The ZIP may be up to 25 MB and must contain an index.html file. Requires deployments:create.

POST/sites/:id/deployments
curl -X POST https://deploy.jxhq.net/api/v1/sites/$SITE_ID/deployments \
  -H "Authorization: Bearer $JXHQ_API_KEY" \
  -F "site=@website.zip;type=application/zip"
{
  "data": {
    "id": "deployment-uuid",
    "status": "queued"
  }
}

Response: 202 Accepted. Then request GET /sites/:id to track progress.

Statuses

StatusMeaning
emptyThe site exists but has no deployment yet.
scanningFiles are being extracted and scanned.
deployingApproved files are being published.
deployedThe site is live.
suspendedThe site has been disabled by an administrator.
failedScanning or publishing failed.
deletedThe site has been deleted.

Errors and limits

Errors are returned as JSON, for example {"error":"site_not_found"}. The API is limited to 120 requests per minute per IP address.

400 Bad Request

The ZIP is missing or invalid.

401 Unauthorized

The key is missing, expired, or invalid.

403 Forbidden

The API key is missing the required scope.

404 Not Found

The site does not exist or belongs to another account.

429 Too Many Requests

The rate limit has been exceeded.

500 Internal Server Error

Unexpected server error; try again later.