Install
openclaw skills install runcloudQuery Runcloud servers, databases, web apps, services, cronjobs, deployments, and health via the Runcloud API v3. Trigger when the user mentions Runcloud, wants server stats/health, lists databases or web apps, or triggers a non-destructive action like a deployment or service restart on a managed server.
openclaw skills install runcloudQuery and monitor Runcloud-managed servers via the Runcloud API v3.
export RUNCLOUD_API_TOKEN="your-api-token"
export RC="https://manage.runcloud.io/api/v3"
export AUTH="Authorization: Bearer $RUNCLOUD_API_TOKEN"
All requests go to $RC and include the bearer token header $AUTH.
All commands use curl to hit the Runcloud API v3 and pipe through jq for
readable output. Replace {serverId}, {webappId}, {databaseId}, and
{cronjobId} with real IDs (fetch them from the corresponding list endpoint).
curl -s -H "$AUTH" "$RC/ping" | jq
curl -s -H "$AUTH" "$RC/servers?page=1&perPage=40" | jq '.data[] | {id, name, ipAddress, provider, online}'
curl -s -H "$AUTH" "$RC/servers/{serverId}" | jq
curl -s -H "$AUTH" "$RC/servers/{serverId}/stats" | jq
# -> { "stats": { "webApplication": n, "database": n, "cronJob": n, "supervisor": n }, "country": "..." }
curl -s -H "$AUTH" "$RC/servers/{serverId}/hardwareinfo" | jq
# -> kernel, processor, cpu cores, memory, disk, load average, uptime
curl -s -H "$AUTH" "$RC/servers/{serverId}/health/latest" | jq
# -> { totalMemory, availableMemory, usedMemory, totalDiskSpace, availableDiskSpace, usedDiskSpace, loadAverage, updated_at }
curl -s -H "$AUTH" "$RC/servers/{serverId}/services" | jq
# -> { beanstalk, httpd, mariadb, memcached, nginx, redis, supervisor } each with { realName, name, memory, cpu, running, version }
curl -s -H "$AUTH" "$RC/servers/{serverId}/webapps?page=1&perPage=40" | jq '.data[] | {id, name, rootPath, publicPath, phpVersion}'
curl -s -H "$AUTH" "$RC/servers/{serverId}/webapps/{webappId}" | jq
curl -s -H "$AUTH" "$RC/servers/{serverId}/databases?page=1&perPage=40" | jq '.data[] | {id, name, collation, created_at}'
curl -s -H "$AUTH" "$RC/servers/{serverId}/databases/{databaseId}" | jq
curl -s -H "$AUTH" "$RC/servers/{serverId}/databaseusers?page=1&perPage=40" | jq '.data[] | {id, username, created_at}'
curl -s -H "$AUTH" "$RC/servers/{serverId}/users?page=1&perPage=40" | jq '.data[] | {id, username, created_at}'
curl -s -H "$AUTH" "$RC/servers/{serverId}/cronjobs?page=1&perPage=40" | jq '.data[] | {id, label, username, time, command, enabled}'
curl -s -H "$AUTH" "$RC/servers/{serverId}/cronjobs/{cronjobId}" | jq
curl -s -H "$AUTH" "$RC/servers/{serverId}/supervisors?page=1&perPage=40" | jq '.data[] | {id, name, command, user, running}'
curl -s -H "$AUTH" "$RC/servers/{serverId}/webapps/{webappId}/ssl" | jq
curl -s -H "$AUTH" "$RC/servers/{serverId}/webapps/{webappId}/domains" | jq '.data[] | {id, name, type}'
curl -s -H "$AUTH" "$RC/servers/{serverId}/webapps/{webappId}/git/deployments?page=1&perPage=40" | jq '.data[] | {id, status, commit_hash, created_at}'
These endpoints trigger safe actions — they do not create billable resources or delete anything. Still, confirm with the operator before running them on a production server.
curl -s -X POST -H "$AUTH" -H "Content-Type: application/json" \
"$RC/servers/{serverId}/webapps/{webappId}/git/deployments" | jq
curl -s -X POST -H "$AUTH" -H "Content-Type: application/json" \
"$RC/servers/{serverId}/cronjobs/{cronjobId}/test" | jq
curl -s -X POST -H "$AUTH" -H "Content-Type: application/json" \
-d '{"action":"restart"}' \
"$RC/servers/{serverId}/services/{serviceRealName}/action" | jq
# serviceRealName examples: nginx-rc, apache2-rc, mysql, redis-server, supervisor
curl -s -X POST -H "$AUTH" -H "Content-Type: application/json" \
-d '{"provider":"letsencrypt","enableHttp":true,"enableHsts":false,"ssl_protocol_id":1}' \
"$RC/servers/{serverId}/webapps/{webappId}/ssl" | jq
Authorization: Bearer $RUNCLOUD_API_TOKEN. The token grants full workspace access — treat it like a password.?page=N&perPage=M (max perPage=40). Responses wrap data in { "data": [...], "meta": { "pagination": {...} } }.X-RateLimit-Limit and X-RateLimit-Remaining headers on every response; a 429 means back off and retry later.serverId, webappId, databaseId, cronjobId all come from the matching list endpoint — always list first if you don't know the ID.https://manage.runcloud.io/api/v2 usually mirrors it one-to-one. Docs index: https://runcloud.io/docs/api/v3/doc-625011# Health snapshot of every server (one-liner)
curl -s -H "$AUTH" "$RC/servers?perPage=40" \
| jq -r '.data[].id' \
| while read id; do
echo "=== server $id ==="
curl -s -H "$AUTH" "$RC/servers/$id/health/latest" \
| jq '{loadAverage, usedMemory, availableMemory, usedDiskSpace}'
done
# Find a specific server by name
curl -s -H "$AUTH" "$RC/servers?perPage=40" \
| jq '.data[] | select(.name | contains("prod"))'
# Flag servers whose load average is above 1.0
curl -s -H "$AUTH" "$RC/servers?perPage=40" \
| jq -r '.data[].id' \
| while read id; do
load=$(curl -s -H "$AUTH" "$RC/servers/$id/health/latest" | jq '.loadAverage')
awk -v l="$load" -v i="$id" 'BEGIN{ if (l+0 > 1.0) print "HOT:", i, l }'
done
# Count web apps, databases, and cronjobs on a server
curl -s -H "$AUTH" "$RC/servers/{serverId}/stats" \
| jq '.stats'