Docs
BlogHomeStart building

Legacy Projects — What Differs

Legacy projects keep working. Here is exactly what differs.


Projects created before 8 October 2026, or created without the v2 engine, run on Totalum's first engine and are called legacy projects. Nothing changes for them: every endpoint they use keeps its path, body, response and errors, with no end date and no migration to do. A project's engine is in Get Project: engineVersion: "v2" means the current engine; no engineVersion means legacy. Never infer it from the creation date.

This page is the one list of differences. The rest of the API reference describes the current engine.

#What legacy projects do not have

These endpoints answer 400 ENGINE_NOT_SUPPORTED on a legacy project:

End of What legacy projects do not haveNext sectionWhat behaves differently

#What behaves differently

EndpointOn a legacy project
Run AI AgentNo agent tiers: the legacy model parameter keeps the values it had before them. Leave it out (recommended) to run the default, most capable model; its one other value selects a faster, lower-cost model. An unknown value is ignored with a note in data.warnings and the default runs. effort (low, medium, high, xhigh) and fastMode are honoured. A prompt takes 5–40 minutes
List ProjectsproductionProjectUrl is always <projectId>.totalum-project.com: the custom domain shows only on Get Project
Get ProjectNo engineVersion and none of the v2 fields (preview, sandbox, lifecycle, currentRun, dataResidency, operations…). The preview can also be a cached snapshot: use the field named by developmentUrlFieldToUse (cachedDevelopmentUrl or temporalDevelopmentProjectUrl)
Deploy to Production / statusNo confirmDestructive; the status carries versionId instead of deploymentId, step and liveUrl
Write File ContentAnswers rebuildRequired: true: call Rebuild Project to see the change
Upload FileUp to 8 MB
Clear Agent ContextThe next prompt still receives the recent conversation
Export / ImportAn export code of a legacy project ends in .zip and imports only into a legacy project, never on a new account (409 ENGINE_LEGACY_UNAVAILABLE) (and a current-engine code only into a current-engine project: 409 ENGINE_MISMATCH)
Get Credit Costs?engine=legacy returns the legacy price list
Fixed pricesLegacy projects use the legacy price list and pay no monthly hosting fees

Request-level refusals (ROUTE_NOT_FOUND, METHOD_NOT_ALLOWED, INVALID_JSON, PAYLOAD_TOO_LARGE) answer in the JSON envelope on the current engine only. On a legacy project, and on the older host api-accounts.totalum.app, 403 VCAAS_INSUFFICIENT_CREDITS answers { "error", "code" }, a secret that fails validation { "success": false, "message", "errors": [...] }, and INVALID_WEBHOOK_EVENT lists only agent.prompt.finished and project.credit_limit.reached (every event is still accepted on the current engine).

End of What behaves differentlyNext sectionThe database endpoints

#The database endpoints

Only the database endpoints are a different set. Legacy projects keep the legacy database endpoints (a JSON query language over the legacy project database); current-engine projects use the SQL-shaped Database endpoints. Calling one set on the other engine's project answers 400 PROJECT_ENGINE_MISMATCH, and errorDetails.useEndpoint names the endpoint to call. Paths are relative to https://builder-api.totalum.app/api/v1/vcaas.

Original engine (unchanged)New engine
GET /projects/:projectId/database/tables-structureGET /projects/:projectId/database/schema
POST /projects/:projectId/database/queryPOST /projects/:projectId/database/rows
POST /projects/:projectId/database/recordsPOST /projects/:projectId/database/records
PATCH /projects/:projectId/database/records/:recordIdPATCH /projects/:projectId/database/records/:recordId
DELETE /projects/:projectId/database/records/:recordIdDELETE /projects/:projectId/database/records/:recordId
POST /projects/:projectId/database/records/:recordId/linkPOST /projects/:projectId/database/relations
DELETE /projects/:projectId/database/records/:recordId/linkPOST /projects/:projectId/database/relations
(none — new-engine only)POST /projects/:projectId/database/records/bulk
(none — new-engine only)POST /projects/:projectId/database/sql

The three records routes keep their path; on a current-engine project their body is { env, table, data }.

json
{
  "errors": {
    "errorCode": "PROJECT_ENGINE_MISMATCH",
    "errorMessage": "This project uses the new engine. Use POST /projects/:projectId/database/rows instead of POST /projects/:projectId/database/query — see https://www.totalum.app/docs/api/migration-v2",
    "errorDetails": { "engine": "v2", "useEndpoint": "POST /projects/:projectId/database/rows", "docsUrl": "https://www.totalum.app/docs/api/migration-v2" }
  },
  "data": null
}

Side by side — paid orders of 100 or more, newest first:

diff
- POST /projects/my-app/database/query
- {"tableName":"orders","queryOptions":{"_filter":{"status":"paid","total":{"gte":100}},"_sort":{"createdAt":-1},"_limit":20}}
+ POST /projects/my-app/database/rows
+ {"env":"live","table":"orders","filter":{"and":[{"column":"status","op":"eq","value":"paid"},{"column":"total","op":"gte","value":100}]},"sort":[{"column":"created_at","dir":"desc"}],"page":{"limit":20}}

#Creating a project on an engine

New projects are created on the current engine. Send "engineVersion": "v2" on Create or Launch Project to require it (a refusal creates nothing). "engineVersion": "legacy" still creates a legacy project for an integration that depends on the legacy database endpoints.

End of Creating a project on an engineNext endpointPUTChoose The Engine For New Projects

#Choose The Engine For New Projects

PUT/api/v1/vcaas/account/v2-opt-inapi-keyFree

While the current engine is offered as an opt-in, this switch makes the account's new projects use it (read it with GET /api/v1/vcaas/account/v2-opt-in: { v2OptIn, available }, where available says whether the switch decides anything right now). The account's own key only.

Body parameters

FieldTypeRequiredDescription
v2OptInbooleanYestrue = new projects on the current engine

Response fields

FieldTypeDescription
data.v2OptInbooleanThe switch now

Example request

curl -X PUT \
  -H "api-key: tlm_sk_your_key" \
  -H "Content-Type: application/json" \
  -d '{"v2OptIn":true}' \
  https://builder-api.totalum.app/api/v1/vcaas/account/v2-opt-in
Success · 200 OK
json
{ "errors": null, "data": { "v2OptIn": true } }

Error codes

CodeHTTPMeaning
INVALID_V2_OPT_IN400v2OptIn is not a boolean
API_KEY_SCOPE_FORBIDDEN403This key cannot change account settings
End of Choose The Engine For New Projects Back to top