Server
Control the development server and inspect both log streams.
These endpoints manage your project's development server. Starting the server is asynchronous. All endpoints require the api-key header.
#Start or Restart Server
/api/v1/vcaas/projects/:projectId/agent/server/start-or-restartUses creditsStart or restart the development server for your project. This endpoint is asynchronous — it returns immediately with status "starting" and the server startup continues in the background for 2 to 4 minutes.
Poll GET /projects/:projectId every 10–15 seconds until agentServerStatus is "Active".
Path parameters
| Parameter | Type | Description |
|---|---|---|
projectId | string | The project ID |
Response fields
| Field | Type | Description |
|---|---|---|
data.message | string | Status message |
data.status | string | Always "starting" |
Example request
curl -X POST -H "api-key: tlm_sk_your_key" \
https://api-accounts.totalum.app/api/v1/vcaas/projects/my-app/agent/server/start-or-restart{
"errors": null,
"data": {
"message": "Server start/restart initiated",
"status": "starting"
}
}{
"errors": {
"errorCode": "AGENT_RUNNING",
"errorMessage": "Cannot restart server while agent is running"
},
"data": null
}Error codes
| Code | HTTP | Meaning |
|---|---|---|
MISSING_PROJECT_ID | 400 | projectId is required |
PROJECT_NOT_FOUND | 404 | Project does not exist or you don't own it |
AGENT_RUNNING | 409 | Cannot restart server while agent is running |
DEPLOYMENT_RUNNING | 409 | Cannot restart server while deployment is in progress |
RECOVERY_RUNNING | 409 | Cannot restart server while version recovery is in progress |
INSUFFICIENT_CREDITS | 402 | Not enough credits for server start |
#Get Dev Server Logs
/api/v1/vcaas/projects/:projectId/backend/dev/logsFreeRetrieve backend development server stdout/stderr output — literally the dev server's log file on the project's sandbox VM.
This endpoint returns the development server's output only. A published project runs on Cloudflare, not on the sandbox, so its request logs exist nowhere in this response — use Get Production Logs when you are debugging the live site.
Path parameters
| Parameter | Type | Description |
|---|---|---|
projectId | string | The project ID |
Response fields
| Field | Type | Description |
|---|---|---|
data.logs | string | Development server stdout/stderr output |
Example request
curl -H "api-key: tlm_sk_your_key" \
https://api-accounts.totalum.app/api/v1/vcaas/projects/my-app/backend/dev/logs{
"errors": null,
"data": { "logs": "Server running on port 3000\n..." }
}{
"errors": {
"errorCode": "PROJECT_NOT_FOUND",
"errorMessage": "Project does not exist or you don't own it"
},
"data": null
}Error codes
| Code | HTTP | Meaning |
|---|---|---|
MISSING_PROJECT_ID | 400 | projectId is required |
PROJECT_NOT_FOUND | 404 | Project does not exist or you don't own it |
#Get Production Logs
/api/v1/vcaas/projects/:projectId/backend/prod/logsFreeQuery the request logs of the published project — the one running on Cloudflare at your production URL. Each record is one request, with the console output and exceptions that happened while serving it.
These logs come from the production runtime, so they exist only after a successful deployment. A project that has never been deployed simply has no records. For the preview you are iterating on, use Get Dev Server Logs instead.
Records older than 3 days are gone. from and to must fall inside that window (to may reach into tomorrow so that all of today is covered).
Path parameters
| Parameter | Type | Description |
|---|---|---|
projectId | string | The project ID |
Query parameters
| Field | Type | Required | Description |
|---|---|---|---|
getOnlyLastLogs | boolean | No | true returns only the most recent records. Default false |
from | string | No | Start of the range, ISO 8601 (e.g. 2026-08-01T00:00:00Z). Must be within the last 3 days |
to | string | No | End of the range, ISO 8601. Must be within the last 3 days |
regexSearch | string | No | Regex or plain string to filter by. Returns the matching entries plus nearby lines — the fastest way to find a specific log |
Filtering with regexSearch is far more effective than paging a broad window: a wide query can quietly hit the plan's log-request limit or bury the entry you are after. If the first search misses, retry with a more specific pattern and a tighter from/to rather than a wider one.
Response fields
| Field | Type | Description |
|---|---|---|
data | object | array | Passthrough from the log pipeline. Read the records from data.records when present, otherwise data is itself the array of records |
data.records | array | The matching request records |
data.records[].EventTimestampMs | number | When the request was served, epoch milliseconds |
data.records[].Outcome | string | How the request ended, e.g. ok, exception, canceled |
data.records[].WallTimeMs | number | Wall-clock duration of the request |
data.records[].CPUTimeMs | number | CPU time consumed by the request |
data.records[].Event.Request.URL | string | The requested URL |
data.records[].Event.Request.Method | string | HTTP method |
data.records[].Event.Response.Status | number | HTTP status returned |
data.records[].Logs | array | Console output produced while serving this request |
data.records[].Logs[].Level | string | log, info, warn, error or debug |
data.records[].Logs[].Message | array | The logged values |
data.records[].Logs[].TimestampMs | number | When the line was written, epoch milliseconds |
data.records[].Exceptions | array | Uncaught exceptions thrown while serving this request |
data.records[].Exceptions[].Name | string | Exception class, e.g. TypeError |
data.records[].Exceptions[].Message | string | Exception message |
data.records[].Exceptions[].TimestampMs | number | When it was thrown, epoch milliseconds |
The payload is forwarded verbatim from the production log pipeline, so its exact shape is not one this API guarantees. Read defensively: accept the records under data.records or as a bare array, and render a record that is missing fields rather than throwing.
Example request
curl -H "api-key: tlm_sk_your_key" \
"https://api-accounts.totalum.app/api/v1/vcaas/projects/my-app/backend/prod/logs?regexSearch=checkout&from=2026-08-03T00:00:00Z&to=2026-08-04T23:59:59Z"Just the most recent activity:
curl -H "api-key: tlm_sk_your_key" \
"https://api-accounts.totalum.app/api/v1/vcaas/projects/my-app/backend/prod/logs?getOnlyLastLogs=true"{
"errors": null,
"data": {
"records": [
{
"EventTimestampMs": 1785840843120,
"Outcome": "ok",
"WallTimeMs": 128,
"CPUTimeMs": 14,
"Event": {
"Request": { "URL": "https://my-app.totalum-project.com/api/orders", "Method": "GET" },
"Response": { "Status": 500 }
},
"Logs": [
{ "Level": "error", "Message": ["Cannot read properties of undefined"], "TimestampMs": 1785840843118 }
],
"Exceptions": [
{ "Name": "TypeError", "Message": "Cannot read properties of undefined", "TimestampMs": 1785840843119 }
]
}
]
}
}{
"errors": {
"errorCode": "PLAN_LIMIT_REACHED",
"errorMessage": "Production logs request limit reached for your plan. Please upgrade or wait for the limit to reset."
},
"data": null
}Error codes
| Code | HTTP | Meaning |
|---|---|---|
MISSING_PROJECT_ID | 400 | projectId is required |
PROJECT_NOT_FOUND | 404 | Project does not exist or you don't own it |
PLAN_LIMIT_REACHED | 429 | Your plan's production-log request limit was reached. Wait for the reset or upgrade |
PROD_LOGS_WORKER_ERROR | 400 | The production log pipeline could not serve the query |
