Skip to content
Home
Business OS Blog How it works Hosting Compare
Language
العربية Coming soon
বাংলা Coming soon
Dansk Coming soon
Deutsch Coming soon
Español Coming soon
Suomi Coming soon
Français Coming soon
עברית Coming soon
हिन्दी Coming soon
Magyar Coming soon
Bahasa Indonesia Coming soon
Italiano Coming soon
한국어 Coming soon
Latviešu Coming soon
Nederlands Coming soon
Norsk Coming soon
Polski Coming soon
Português Coming soon
Српски Coming soon
Svenska Coming soon
Türkçe Coming soon
Українська Coming soon
中文 Coming soon
Currency

Files and commands

Read and change the files on a business's server, find files, read its logs and run commands. Paths are relative to the site's home folder.

List a folder

GET/businesses/{business}/files

The entries in one folder.

Needs the files:read scope.

Parameters

business integer, in path, required
The business id, from GET /businesses.
path string, in query
The folder. Defaults to /.
curl "https://helstify.com/api/v1/businesses/60/files?path=%2Fpublic" \
  -H "Authorization: Bearer $HELSTIFY_KEY"
const res = await fetch("https://helstify.com/api/v1/businesses/60/files?path=%2Fpublic", {
  method: "GET",
  headers: {
    Authorization: `Bearer ${process.env.HELSTIFY_KEY}`,
  },
});
const data = await res.json();
import os, requests

res = requests.get(
    "https://helstify.com/api/v1/businesses/60/files",
    headers={"Authorization": f"Bearer {os.environ['HELSTIFY_KEY']}"},
    params={"path":"/public"},
)
print(res.json())
Response200
{
    "ok": true,
    "business": "Northwind Coffee",
    "entries": [
        {
            "name": "public",
            "type": "dir",
            "size": 4096,
            "modified": 1794172440,
            "mode": "drwxr-xr-x"
        },
        {
            "name": "composer.json",
            "type": "file",
            "size": 1874,
            "modified": 1793525412,
            "mode": "-rw-r--r--"
        }
    ]
}

Read a file

GET/businesses/{business}/file

One text file's contents.

Needs the files:read scope.

Parameters

business integer, in path, required
The business id, from GET /businesses.
path string, in query, required
The file to read.
curl "https://helstify.com/api/v1/businesses/60/file?path=%2Fpublic" \
  -H "Authorization: Bearer $HELSTIFY_KEY"
const res = await fetch("https://helstify.com/api/v1/businesses/60/file?path=%2Fpublic", {
  method: "GET",
  headers: {
    Authorization: `Bearer ${process.env.HELSTIFY_KEY}`,
  },
});
const data = await res.json();
import os, requests

res = requests.get(
    "https://helstify.com/api/v1/businesses/60/file",
    headers={"Authorization": f"Bearer {os.environ['HELSTIFY_KEY']}"},
    params={"path":"/public"},
)
print(res.json())
Response200
{
    "ok": true,
    "business": "Northwind Coffee",
    "contents": "<!doctype html>\n<html lang=\"en\">…",
    "truncated": false
}

Write a file

PUT/businesses/{business}/file

Create or replace one text file. Folders that do not exist yet are made. For binaries, upload an archive with /copy or a command.

Needs the files:write scope.

Parameters

business integer, in path, required
The business id, from GET /businesses.

Body

path string
For example /public/hello.html
contents string
For example <h1>Hello</h1>
curl -X PUT "https://helstify.com/api/v1/businesses/60/file" \
  -H "Authorization: Bearer $HELSTIFY_KEY" \
  -H "Content-Type: application/json" \
  -d '{"path":"/public/hello.html","contents":"<h1>Hello</h1>"}'
const res = await fetch("https://helstify.com/api/v1/businesses/60/file", {
  method: "PUT",
  headers: {
    Authorization: `Bearer ${process.env.HELSTIFY_KEY}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
      "path": "/public/hello.html",
      "contents": "<h1>Hello</h1>"
  }),
});
const data = await res.json();
import os, requests

res = requests.put(
    "https://helstify.com/api/v1/businesses/60/file",
    headers={"Authorization": f"Bearer {os.environ['HELSTIFY_KEY']}"},
    json={
        "path": "/public/hello.html",
        "contents": "<h1>Hello</h1>"
    },
)
print(res.json())
Response200
{
    "ok": true,
    "business": "Northwind Coffee",
    "written": "/public/hello.html",
    "bytes": 14
}

Copy from another business

POST/businesses/{business}/copy

Copy one file into this business from another business on the same account. Binary-safe, streamed server to server. Both businesses must be within the key's reach.

Needs the files:write scope.

Parameters

business integer, in path, required
The business id, from GET /businesses.

Body

from integer
For example 61
from_path string
For example /backups/site.tgz
to_path string
For example /tmp/site.tgz
curl -X POST "https://helstify.com/api/v1/businesses/60/copy" \
  -H "Authorization: Bearer $HELSTIFY_KEY" \
  -H "Content-Type: application/json" \
  -d '{"from":61,"from_path":"/backups/site.tgz","to_path":"/tmp/site.tgz"}'
const res = await fetch("https://helstify.com/api/v1/businesses/60/copy", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.HELSTIFY_KEY}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
      "from": 61,
      "from_path": "/backups/site.tgz",
      "to_path": "/tmp/site.tgz"
  }),
});
const data = await res.json();
import os, requests

res = requests.post(
    "https://helstify.com/api/v1/businesses/60/copy",
    headers={"Authorization": f"Bearer {os.environ['HELSTIFY_KEY']}"},
    json={
        "from": 61,
        "from_path": "/backups/site.tgz",
        "to_path": "/tmp/site.tgz"
    },
)
print(res.json())
Response200
{
    "ok": true,
    "business": "Northwind Coffee",
    "copied": "/tmp/site.tgz",
    "from_business": "Northwind Staging",
    "bytes": 18874368
}

Unpack an archive

POST/businesses/{business}/extract

Unpack a .zip, .tar or .tgz on the server.

Needs the files:write scope.

Parameters

business integer, in path, required
The business id, from GET /businesses.

Body

path string
For example /tmp/site.tgz
to string
For example /tmp/site
curl -X POST "https://helstify.com/api/v1/businesses/60/extract" \
  -H "Authorization: Bearer $HELSTIFY_KEY" \
  -H "Content-Type: application/json" \
  -d '{"path":"/tmp/site.tgz","to":"/tmp/site"}'
const res = await fetch("https://helstify.com/api/v1/businesses/60/extract", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.HELSTIFY_KEY}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
      "path": "/tmp/site.tgz",
      "to": "/tmp/site"
  }),
});
const data = await res.json();
import os, requests

res = requests.post(
    "https://helstify.com/api/v1/businesses/60/extract",
    headers={"Authorization": f"Bearer {os.environ['HELSTIFY_KEY']}"},
    json={
        "path": "/tmp/site.tgz",
        "to": "/tmp/site"
    },
)
print(res.json())
Response200
{
    "ok": true,
    "business": "Northwind Coffee",
    "extracted": "/tmp/site.tgz",
    "into": "/tmp/site"
}

Run a command

POST/businesses/{business}/exec

Run one shell command inside the business's server. Up to 600 seconds. Refused on game servers; use /console there.

Needs the commands:run scope.

Parameters

business integer, in path, required
The business id, from GET /businesses.

Body

command string
For example php artisan migrate --force
cwd string
For example
timeout integer
For example 120
curl -X POST "https://helstify.com/api/v1/businesses/60/exec" \
  -H "Authorization: Bearer $HELSTIFY_KEY" \
  -H "Content-Type: application/json" \
  -d '{"command":"php artisan migrate --force","cwd":"","timeout":120}'
const res = await fetch("https://helstify.com/api/v1/businesses/60/exec", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.HELSTIFY_KEY}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
      "command": "php artisan migrate --force",
      "cwd": "",
      "timeout": 120
  }),
});
const data = await res.json();
import os, requests

res = requests.post(
    "https://helstify.com/api/v1/businesses/60/exec",
    headers={"Authorization": f"Bearer {os.environ['HELSTIFY_KEY']}"},
    json={
        "command": "php artisan migrate --force",
        "cwd": "",
        "timeout": 120
    },
)
print(res.json())
Response200
{
    "ok": true,
    "business": "Northwind Coffee",
    "exit_code": 0,
    "stdout": "INFO  Nothing to migrate.\n",
    "stderr": ""
}

Read server logs

GET/businesses/{business}/logs

The tail of one log.

Needs the files:read scope.

Parameters

business integer, in path, required
The business id, from GET /businesses.
type string, in query
nginx-error (default), nginx-access, php or laravel.
lines integer, in query
How many lines. Default 200.
curl "https://helstify.com/api/v1/businesses/60/logs" \
  -H "Authorization: Bearer $HELSTIFY_KEY"
const res = await fetch("https://helstify.com/api/v1/businesses/60/logs", {
  method: "GET",
  headers: {
    Authorization: `Bearer ${process.env.HELSTIFY_KEY}`,
  },
});
const data = await res.json();
import os, requests

res = requests.get(
    "https://helstify.com/api/v1/businesses/60/logs",
    headers={"Authorization": f"Bearer {os.environ['HELSTIFY_KEY']}"},
)
print(res.json())
Response200
{
    "ok": true,
    "business": "Northwind Coffee",
    "type": "nginx-error",
    "lines": [
        "2026/11/09 08:12:44 [error] 41#41: *9 FastCGI sent in stderr: …"
    ]
}