/healthPublicHealth check
Response · 200
okrequiredversionrequiredtimerequiredstoragerequiredErrors
curl -X GET "https://techart.tools/api/v1/health"
API reference · v1
Everything the web app does with workspaces, assets and conversions is available over HTTPS. Use it from build scripts, CI, or DCC plugins (Maya, Blender, Unreal, Unity). Base URL:
https://techart.tools/api/v1
Machine-readable description: /api/v1/openapi.json (OpenAPI 3.1; import into Postman, Insomnia or a client generator).
Send credentials as a bearer token. Two kinds are accepted:
tau_…): created by an admin under Workspace settings → API keys. Scoped to one workspace; read keys act as a viewer, write keys as an editor. Keys can’t manage members, invites or other keys. API key access depends on the workspace’s plan.curl "https://techart.tools/api/v1/workspaces/$WS/assets" \ -H "Authorization: Bearer tau_xxxxxxxxxxxx_…"
Errors use a consistent JSON body. Validation errors list each failing field in `details`.
{
"error": {
"code": "bad_request",
"message": "Invalid request body.",
"details": [
{
"path": "sizeBytes",
"message": "Too small"
}
]
}
}400bad_requestThe request body, query or path parameters failed validation.401unauthenticatedNo credentials, or the ID token / API key is invalid or expired.402quota_exceeded | feature_unavailableA plan limit was reached or the feature is not in the plan. `details` has `plan` plus `resource`, `limit`, `used`, `over` (already above the limit, e.g. after a downgrade) or `feature`.403forbiddenAuthenticated, but the role or API key scope does not allow this.404not_foundThe workspace or resource does not exist, or you are not a member.409conflictThe request conflicts with the current state (e.g. upload already completed).422invalid_referencesA document references assets that are missing, not ready or in another workspace.503not_configuredA backing service (storage, worker) is not configured.Workspaces you are not a member of return 404 rather than 403, so ids can’t be probed.
List endpoints that can grow large take limit and cursor. Pass the previous response’s nextCursor to get the next page; it is null on the last page.
Uploads are three steps: start, PUT the bytes directly to object storage using the presigned URL, then complete. Files of 100 MB or more use multipart: request part URLs, upload parts in parallel, and pass every part’s ETag to complete.
# 1. Start the upload
curl -X POST "https://techart.tools/api/v1/workspaces/$WS/uploads" \
-H "Authorization: Bearer $TAU_TOKEN" -H "Content-Type: application/json" \
-d '{"filename":"hero.glb","sizeBytes":'$(stat -c%s hero.glb)'}' > init.json
# 2. PUT the bytes straight to storage (mode = "single")
curl -X PUT "$(jq -r .uploadUrl init.json)" \
-H "content-type: $(jq -r '.headers["content-type"]' init.json)" \
--data-binary @hero.glb
# 3. Complete
curl -X POST "https://techart.tools/api/v1/workspaces/$WS/uploads/$(jq -r .asset.id init.json)/complete" \
-H "Authorization: Bearer $TAU_TOKEN" -H "Content-Type: application/json" -d '{}'A scene (kind: "scene", a .scene JSON file) is a model plus the shaders, parameters and textures on its materials, saved as references to other assets in the same workspace. Shader graphs (.shadergraph) and sketches (.shadersketch) reference their textures the same way. A reference is { assetId, version, follow }: follow: "latest" uses the newest version, "pinned" always uses version.
422 invalid_references (with details.problems) if one is missing.{
"format": "techart.scene",
"version": 1,
"model": {
"assetId": "a1",
"version": 3,
"follow": "latest"
},
"materials": [
{
"match": {
"name": "M_Body",
"index": 0
},
"shader": {
"assetId": "s7",
"version": 2,
"follow": "latest"
},
"parameters": {
"tint": [
1,
0.5,
0.2
]
},
"textures": {
"albedo": {
"assetId": "t4",
"version": 1,
"follow": "pinned"
},
"normal": {
"source": "model",
"slot": "normalMap"
}
}
},
{
"match": {
"name": "M_Glass",
"index": 1
},
"shader": null,
"parameters": {},
"textures": {
"map": {
"assetId": "t9",
"version": 1,
"follow": "latest"
}
}
}
],
"view": {
"environment": "courtyard",
"envRotation": 0,
"exposure": 1,
"camera": {
"position": [
3,
2,
4
],
"target": [
0,
0.5,
0
]
}
}
}Storage, maximum file size, members and API keys depend on the workspace’s plan. Limits are returned by GET /workspaces/{workspaceId} and GET /plans. Exceeding one returns 402 quota_exceeded.
Service health and the machine-readable API description.
/healthPublicokrequiredversionrequiredtimerequiredstoragerequiredcurl -X GET "https://techart.tools/api/v1/health"
/openapi.jsonPublicThe OpenAPI 3.1 description of this API. Import it into Postman, Insomnia or a client generator.
map
curl -X GET "https://techart.tools/api/v1/openapi.json"
The signed-in user and available plans.
/meID token onlyReturns the signed-in user and every workspace they belong to. On first call this also creates the user record and their personal workspace.
userrequireduidrequiredemailrequireddisplayNamerequiredphotoURLrequiredworkspacesrequiredidrequiredpattern ^[A-Za-z0-9_-]{1,128}$
namerequiredmin length 1 · max length 80
typerequiredOne of: "personal""team"
planrequiredOne of: "free""pro""studio"
iconrequiredWorkspace icon as an image data URL, or null for the default letter tile
max length 200000 · pattern ^data:image\/(png|jpeg|webp|gif);base64,[A-Za-z0-9+/=]+$
rolerequiredOne of: "viewer""editor""admin""owner"
lastWorkspaceIdrequiredstorageEnabledrequiredFalse when the server has no object storage configured; uploads and downloads are unavailable
emailEnabledrequiredTrue when the server emails invites; otherwise invite links must be shared manually
curl -X GET "https://techart.tools/api/v1/me" \ -H "Authorization: Bearer $TAU_TOKEN"
/plansPublicArray of objects:
idrequiredlabelrequiredlimitsrequiredfeaturesrequiredcurl -X GET "https://techart.tools/api/v1/plans"
/meID token onlydisplayNamemin length 1 · max length 80
lastWorkspaceIdpattern ^[A-Za-z0-9_-]{1,128}$
No content.
curl -X PATCH "https://techart.tools/api/v1/me" \
-H "Authorization: Bearer $TAU_TOKEN" \
-H "Content-Type: application/json" \
-d '{"displayName":"string","lastWorkspaceId":"abc123"}'Workspaces own all saved data. Every user has a personal workspace and can create team workspaces.
/workspacesID token onlyCreates a new team workspace with the caller as owner. Workspaces start on the Free plan; each person may create 1 free team workspace (besides their personal one), so another needs an existing one upgraded or deleted first (402 quota_exceeded).
namerequiredmin length 1 · max length 80
engineProfileOne of: "unity""unreal""godot""threejs"
Default: "unity"
idrequiredpattern ^[A-Za-z0-9_-]{1,128}$
namerequiredmin length 1 · max length 80
typerequiredOne of: "personal""team"
ownerUidrequiredplanrequiredOne of: "free""pro""studio"
engineProfilerequiredOne of: "unity""unreal""godot""threejs"
storageBucketrequiredR2 bucket that stores this workspace's objects
storageBytesUsedrequired≥ 0 · ≤ 9007199254740991
iconrequiredWorkspace icon as an image data URL, or null for the default letter tile
max length 200000 · pattern ^data:image\/(png|jpeg|webp|gif);base64,[A-Za-z0-9+/=]+$
createdAtrequiredISO-8601 timestamp
rolerequiredOne of: "viewer""editor""admin""owner"
memberCountrequired≥ -9007199254740991 · ≤ 9007199254740991
limitsrequiredstorageBytesrequiredmaxFileBytesrequiredworkerMinutesPerMonthrequiredmembersrequiredapiKeysrequiredfeaturesrequiredworkerMinutesUsedrequiredcurl -X POST "https://techart.tools/api/v1/workspaces" \
-H "Authorization: Bearer $TAU_TOKEN" \
-H "Content-Type: application/json" \
-d '{"name":"Hero character","engineProfile":"unity"}'/workspaces/{workspaceId}ID token onlyRole: ownerPermanently deletes a team workspace, all of its metadata and every stored object. Personal workspaces cannot be deleted. Owner only.
workspaceIdpathrequiredstring
No content.
curl -X DELETE "https://techart.tools/api/v1/workspaces/<workspaceId>" \ -H "Authorization: Bearer $TAU_TOKEN"
/workspaces/{workspaceId}ID token or API keyRole: viewerIncludes plan limits, features and current usage.
workspaceIdpathrequiredstring
idrequiredpattern ^[A-Za-z0-9_-]{1,128}$
namerequiredmin length 1 · max length 80
typerequiredOne of: "personal""team"
ownerUidrequiredplanrequiredOne of: "free""pro""studio"
engineProfilerequiredOne of: "unity""unreal""godot""threejs"
storageBucketrequiredR2 bucket that stores this workspace's objects
storageBytesUsedrequired≥ 0 · ≤ 9007199254740991
iconrequiredWorkspace icon as an image data URL, or null for the default letter tile
max length 200000 · pattern ^data:image\/(png|jpeg|webp|gif);base64,[A-Za-z0-9+/=]+$
createdAtrequiredISO-8601 timestamp
rolerequiredOne of: "viewer""editor""admin""owner"
memberCountrequired≥ -9007199254740991 · ≤ 9007199254740991
limitsrequiredstorageBytesrequiredmaxFileBytesrequiredworkerMinutesPerMonthrequiredmembersrequiredapiKeysrequiredfeaturesrequiredworkerMinutesUsedrequiredcurl -X GET "https://techart.tools/api/v1/workspaces/<workspaceId>" \ -H "Authorization: Bearer $TAU_TOKEN"
/workspacesID token onlyArray of objects:
idrequiredpattern ^[A-Za-z0-9_-]{1,128}$
namerequiredmin length 1 · max length 80
typerequiredOne of: "personal""team"
planrequiredOne of: "free""pro""studio"
iconrequiredWorkspace icon as an image data URL, or null for the default letter tile
max length 200000 · pattern ^data:image\/(png|jpeg|webp|gif);base64,[A-Za-z0-9+/=]+$
rolerequiredOne of: "viewer""editor""admin""owner"
curl -X GET "https://techart.tools/api/v1/workspaces" \ -H "Authorization: Bearer $TAU_TOKEN"
/workspaces/{workspaceId}ID token onlyRole: adminworkspaceIdpathrequiredstring
namemin length 1 · max length 80
engineProfileOne of: "unity""unreal""godot""threejs"
iconImage data URL, or null to reset to the default letter tile
max length 200000 · pattern ^data:image\/(png|jpeg|webp|gif);base64,[A-Za-z0-9+/=]+$
idrequiredpattern ^[A-Za-z0-9_-]{1,128}$
namerequiredmin length 1 · max length 80
typerequiredOne of: "personal""team"
ownerUidrequiredplanrequiredOne of: "free""pro""studio"
engineProfilerequiredOne of: "unity""unreal""godot""threejs"
storageBucketrequiredR2 bucket that stores this workspace's objects
storageBytesUsedrequired≥ 0 · ≤ 9007199254740991
iconrequiredWorkspace icon as an image data URL, or null for the default letter tile
max length 200000 · pattern ^data:image\/(png|jpeg|webp|gif);base64,[A-Za-z0-9+/=]+$
createdAtrequiredISO-8601 timestamp
rolerequiredOne of: "viewer""editor""admin""owner"
memberCountrequired≥ -9007199254740991 · ≤ 9007199254740991
limitsrequiredstorageBytesrequiredmaxFileBytesrequiredworkerMinutesPerMonthrequiredmembersrequiredapiKeysrequiredfeaturesrequiredworkerMinutesUsedrequiredcurl -X PATCH "https://techart.tools/api/v1/workspaces/<workspaceId>" \
-H "Authorization: Bearer $TAU_TOKEN" \
-H "Content-Type: application/json" \
-d '{"name":"Hero character","engineProfile":"unity","icon":"string"}'Membership, roles and email invites. Roles: viewer < editor < admin < owner.
/workspaces/{workspaceId}/membersID token or API keyRole: viewerworkspaceIdpathrequiredstring
Array of objects:
uidrequiredrolerequiredOne of: "viewer""editor""admin""owner"
emailrequireddisplayNamerequiredjoinedAtrequiredISO-8601 timestamp
curl -X GET "https://techart.tools/api/v1/workspaces/<workspaceId>/members" \ -H "Authorization: Bearer $TAU_TOKEN"
/workspaces/{workspaceId}/members/{uid}ID token onlyRole: viewerAdmins can remove editors and viewers; owners can remove anyone except the workspace creator. Any member can remove themselves (leave).
workspaceIdpathrequiredstring
uidpathrequiredstring
No content.
curl -X DELETE "https://techart.tools/api/v1/workspaces/<workspaceId>/members/<uid>" \ -H "Authorization: Bearer $TAU_TOKEN"
/workspaces/{workspaceId}/members/{uid}ID token onlyRole: adminAdmins can change roles between viewer and editor. Only owners can grant or revoke admin/owner. Granting owner does not remove the existing owner.
workspaceIdpathrequiredstring
uidpathrequiredstring
rolerequiredOne of: "viewer""editor""admin""owner"
uidrequiredrolerequiredOne of: "viewer""editor""admin""owner"
emailrequireddisplayNamerequiredjoinedAtrequiredISO-8601 timestamp
curl -X PATCH "https://techart.tools/api/v1/workspaces/<workspaceId>/members/<uid>" \
-H "Authorization: Bearer $TAU_TOKEN" \
-H "Content-Type: application/json" \
-d '{"role":"viewer"}'/invites/acceptID token onlyJoins the workspace referenced by the invite token. The signed-in email must match the invited email.
tokenrequiredmin length 10 · max length 400
idrequiredpattern ^[A-Za-z0-9_-]{1,128}$
namerequiredmin length 1 · max length 80
typerequiredOne of: "personal""team"
planrequiredOne of: "free""pro""studio"
iconrequiredWorkspace icon as an image data URL, or null for the default letter tile
max length 200000 · pattern ^data:image\/(png|jpeg|webp|gif);base64,[A-Za-z0-9+/=]+$
rolerequiredOne of: "viewer""editor""admin""owner"
curl -X POST "https://techart.tools/api/v1/invites/accept" \
-H "Authorization: Bearer $TAU_TOKEN" \
-H "Content-Type: application/json" \
-d '{"token":"string"}'/workspaces/{workspaceId}/invitesID token onlyRole: adminCreates an invite valid for 7 days and returns an accept link. When the server has email configured (Resend), the link is also emailed to the invitee and emailSent is true; otherwise share the link yourself. The invitee must sign in with the invited email address. Only owners can invite admins.
workspaceIdpathrequiredstring
emailrequiredpattern ^(?:[A-Za-z0-9_'+\-]+\.)*[A-Za-z0-9_'+\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\-]*\.)+[A-Za-z]{2,}$
roleOne of: "viewer""editor""admin"
Default: "editor"
idrequiredpattern ^[A-Za-z0-9_-]{1,128}$
emailrequiredpattern ^(?:[A-Za-z0-9_'+\-]+\.)*[A-Za-z0-9_'+\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\-]*\.)+[A-Za-z]{2,}$
rolerequiredOne of: "viewer""editor""admin"
expiresAtrequiredISO-8601 timestamp
createdByrequiredcreatedAtrequiredISO-8601 timestamp
acceptUrlrequiredSingle-use link; shown only once
emailSentrequiredTrue when the invite was emailed to the invitee
curl -X POST "https://techart.tools/api/v1/workspaces/<workspaceId>/invites" \
-H "Authorization: Bearer $TAU_TOKEN" \
-H "Content-Type: application/json" \
-d '{"email":"artist@example.com","role":"editor"}'/workspaces/{workspaceId}/invitesID token onlyRole: adminworkspaceIdpathrequiredstring
Array of objects:
idrequiredpattern ^[A-Za-z0-9_-]{1,128}$
emailrequiredpattern ^(?:[A-Za-z0-9_'+\-]+\.)*[A-Za-z0-9_'+\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\-]*\.)+[A-Za-z]{2,}$
rolerequiredOne of: "viewer""editor""admin"
expiresAtrequiredISO-8601 timestamp
createdByrequiredcreatedAtrequiredISO-8601 timestamp
curl -X GET "https://techart.tools/api/v1/workspaces/<workspaceId>/invites" \ -H "Authorization: Bearer $TAU_TOKEN"
/workspaces/{workspaceId}/invites/{inviteId}ID token onlyRole: adminworkspaceIdpathrequiredstring
inviteIdpathrequiredstring
No content.
curl -X DELETE "https://techart.tools/api/v1/workspaces/<workspaceId>/invites/<inviteId>" \ -H "Authorization: Bearer $TAU_TOKEN"
Organize assets into a folder tree.
/workspaces/{workspaceId}/foldersID token or API keyRole: editorworkspaceIdpathrequiredstring
namerequiredmin length 1 · max length 80
parentIdDefault: null
pattern ^[A-Za-z0-9_-]{1,128}$
idrequiredpattern ^[A-Za-z0-9_-]{1,128}$
namerequiredmin length 1 · max length 80
parentIdrequiredpattern ^[A-Za-z0-9_-]{1,128}$
createdAtrequiredISO-8601 timestamp
curl -X POST "https://techart.tools/api/v1/workspaces/<workspaceId>/folders" \
-H "Authorization: Bearer $TAU_TOKEN" \
-H "Content-Type: application/json" \
-d '{"name":"Hero character","parentId":"abc123"}'/workspaces/{workspaceId}/folders/{folderId}ID token or API keyRole: editorworkspaceIdpathrequiredstring
folderIdpathrequiredstring
No content.
curl -X DELETE "https://techart.tools/api/v1/workspaces/<workspaceId>/folders/<folderId>" \ -H "Authorization: Bearer $TAU_TOKEN"
/workspaces/{workspaceId}/foldersID token or API keyRole: viewerReturns every folder in the workspace as a flat list; build the tree from parentId.
workspaceIdpathrequiredstring
Array of objects:
idrequiredpattern ^[A-Za-z0-9_-]{1,128}$
namerequiredmin length 1 · max length 80
parentIdrequiredpattern ^[A-Za-z0-9_-]{1,128}$
createdAtrequiredISO-8601 timestamp
curl -X GET "https://techart.tools/api/v1/workspaces/<workspaceId>/folders" \ -H "Authorization: Bearer $TAU_TOKEN"
/workspaces/{workspaceId}/folders/{folderId}ID token or API keyRole: editorworkspaceIdpathrequiredstring
folderIdpathrequiredstring
namemin length 1 · max length 80
parentIdpattern ^[A-Za-z0-9_-]{1,128}$
idrequiredpattern ^[A-Za-z0-9_-]{1,128}$
namerequiredmin length 1 · max length 80
parentIdrequiredpattern ^[A-Za-z0-9_-]{1,128}$
createdAtrequiredISO-8601 timestamp
curl -X PATCH "https://techart.tools/api/v1/workspaces/<workspaceId>/folders/<folderId>" \
-H "Authorization: Bearer $TAU_TOKEN" \
-H "Content-Type: application/json" \
-d '{"name":"Hero character","parentId":"abc123"}'Files saved in a workspace (models, textures, shaders…) and their versions.
/workspaces/{workspaceId}/assets/{assetId}/thumbnailID token or API keyRole: editorReturns a presigned PUT URL for the current version’s thumbnail (max 2 MB). After uploading, PATCH the asset with hasThumbnail: true.
workspaceIdpathrequiredstring
assetIdpathrequiredstring
contentTypeOne of: "image/webp""image/png""image/jpeg"
Default: "image/webp"
sizeBytesrequired> 0 · ≤ 2097152
uploadUrlrequiredheadersrequiredcurl -X POST "https://techart.tools/api/v1/workspaces/<workspaceId>/assets/<assetId>/thumbnail" \
-H "Authorization: Bearer $TAU_TOKEN" \
-H "Content-Type: application/json" \
-d '{"contentType":"image/webp","sizeBytes":1048576}'/workspaces/{workspaceId}/assets/{assetId}ID token or API keyRole: editorDeletes the asset, all of its versions and derived files. Storage usage is released immediately.
workspaceIdpathrequiredstring
assetIdpathrequiredstring
No content.
curl -X DELETE "https://techart.tools/api/v1/workspaces/<workspaceId>/assets/<assetId>" \ -H "Authorization: Bearer $TAU_TOKEN"
/workspaces/{workspaceId}/assets/{assetId}ID token or API keyRole: viewerworkspaceIdpathrequiredstring
assetIdpathrequiredstring
idrequiredpattern ^[A-Za-z0-9_-]{1,128}$
namerequiredmin length 1 · max length 200
filenamerequiredkindrequiredOne of: "model""texture""animation""shader""hdri""scene""other"
formatrequiredcontentTyperequiredfolderIdrequiredpattern ^[A-Za-z0-9_-]{1,128}$
tagsrequiredmax 32 items
statusrequiredOne of: "pending""ready""failed"
sizeBytesrequired≥ 0 · ≤ 9007199254740991
contentHashrequiredversionrequired> 0 · ≤ 9007199254740991
hasThumbnailrequiredcommentCountrequiredUnresolved comments
≥ 0 · ≤ 9007199254740991
metarequiredtriCount≥ -9007199254740991 · ≤ 9007199254740991
vertCount≥ -9007199254740991 · ≤ 9007199254740991
meshCount≥ -9007199254740991 · ≤ 9007199254740991
materialCount≥ -9007199254740991 · ≤ 9007199254740991
boneCount≥ -9007199254740991 · ≤ 9007199254740991
clipCount≥ -9007199254740991 · ≤ 9007199254740991
width≥ -9007199254740991 · ≤ 9007199254740991
height≥ -9007199254740991 · ≤ 9007199254740991
channels≥ -9007199254740991 · ≤ 9007199254740991
bitDepth≥ -9007199254740991 · ≤ 9007199254740991
colorSpacemodelNamemax length 200
shaderCount≥ -9007199254740991 · ≤ 9007199254740991
textureCount≥ -9007199254740991 · ≤ 9007199254740991
modeOne of: "pbr""unlit"
parameterCount≥ -9007199254740991 · ≤ 9007199254740991
textureSlotsmax 64 items
refIdsAssets this document references (scenes, shader graphs, sketches); set by the server on upload
createdByrequiredcreatedAtrequiredISO-8601 timestamp
updatedAtrequiredISO-8601 timestamp
curl -X GET "https://techart.tools/api/v1/workspaces/<workspaceId>/assets/<assetId>" \ -H "Authorization: Bearer $TAU_TOKEN"
/workspaces/{workspaceId}/assets/{assetId}/bundleID token or API keyRole: viewerFor a scene, shader graph or sketch: the parsed document, plus a presigned URL for every asset it references, at the right version (the newest for follow: "latest", the given one for follow: "pinned"). For a scene that is the model and each material binding’s shader and library textures, so the Model Viewer opens a scene with this one request.
References to deleted assets or versions come back with missing: true. URLs are valid for 10 minutes. Other assets return no dependencies. version opens an older version of the document.
workspaceIdpathrequiredstring
assetIdpathrequiredstring
versionqueryinteger
assetrequiredidrequiredpattern ^[A-Za-z0-9_-]{1,128}$
namerequiredmin length 1 · max length 200
filenamerequiredkindrequiredOne of: "model""texture""animation""shader""hdri""scene""other"
formatrequiredcontentTyperequiredfolderIdrequiredpattern ^[A-Za-z0-9_-]{1,128}$
tagsrequiredmax 32 items
statusrequiredOne of: "pending""ready""failed"
sizeBytesrequired≥ 0 · ≤ 9007199254740991
contentHashrequiredversionrequired> 0 · ≤ 9007199254740991
hasThumbnailrequiredcommentCountrequiredUnresolved comments
≥ 0 · ≤ 9007199254740991
metarequiredtriCount≥ -9007199254740991 · ≤ 9007199254740991
vertCount≥ -9007199254740991 · ≤ 9007199254740991
meshCount≥ -9007199254740991 · ≤ 9007199254740991
materialCount≥ -9007199254740991 · ≤ 9007199254740991
boneCount≥ -9007199254740991 · ≤ 9007199254740991
clipCount≥ -9007199254740991 · ≤ 9007199254740991
width≥ -9007199254740991 · ≤ 9007199254740991
height≥ -9007199254740991 · ≤ 9007199254740991
channels≥ -9007199254740991 · ≤ 9007199254740991
bitDepth≥ -9007199254740991 · ≤ 9007199254740991
colorSpacemodelNamemax length 200
shaderCount≥ -9007199254740991 · ≤ 9007199254740991
textureCount≥ -9007199254740991 · ≤ 9007199254740991
modeOne of: "pbr""unlit"
parameterCount≥ -9007199254740991 · ≤ 9007199254740991
textureSlotsmax 64 items
refIdsAssets this document references (scenes, shader graphs, sketches); set by the server on upload
createdByrequiredcreatedAtrequiredISO-8601 timestamp
updatedAtrequiredISO-8601 timestamp
versionrequiredThe document version returned
> 0 · ≤ 9007199254740991
documentUrlrequireddocumentrequiredThe parsed JSON document (null for assets without references)
dependenciesrequiredrefrequiredassetIdrequiredpattern ^[A-Za-z0-9_-]{1,128}$
versionrequired> 0 · ≤ 9007199254740991
followrequiredOne of: "latest""pinned"
assetidrequiredpattern ^[A-Za-z0-9_-]{1,128}$
namerequiredmin length 1 · max length 200
kindrequiredOne of: "model""texture""animation""shader""hdri""scene""other"
filenamerequiredversionrequiredThe version `url` serves
> 0 · ≤ 9007199254740991
urlPresigned download URL for that version
missingThe asset or the pinned version no longer exists
expiresAtrequiredcurl -X GET "https://techart.tools/api/v1/workspaces/<workspaceId>/assets/<assetId>/bundle" \ -H "Authorization: Bearer $TAU_TOKEN"
/workspaces/{workspaceId}/assets/{assetId}/downloadID token or API keyRole: viewerReturns a presigned URL valid for 10 minutes. Pass redirect=true to receive a 302 redirect instead (handy for curl -L). variant=thumbnail returns the 256px WebP thumbnail.
workspaceIdpathrequiredstring
assetIdpathrequiredstring
variantqueryenum
versionqueryinteger
redirectqueryenum
urlrequiredexpiresAtrequiredcurl -X GET "https://techart.tools/api/v1/workspaces/<workspaceId>/assets/<assetId>/download" \ -H "Authorization: Bearer $TAU_TOKEN"
/workspaces/{workspaceId}/assets/{assetId}/used-byID token or API keyRole: viewerScenes, shader graphs and sketches whose latest version references this asset, most recently updated first (up to 50). Deleting the asset is still allowed; those documents then show it as missing.
workspaceIdpathrequiredstring
assetIdpathrequiredstring
assetsrequiredidrequiredpattern ^[A-Za-z0-9_-]{1,128}$
namerequiredmin length 1 · max length 200
kindrequiredOne of: "model""texture""animation""shader""hdri""scene""other"
filenamerequiredcurl -X GET "https://techart.tools/api/v1/workspaces/<workspaceId>/assets/<assetId>/used-by" \ -H "Authorization: Bearer $TAU_TOKEN"
/workspaces/{workspaceId}/assets/{assetId}/versionsID token or API keyRole: viewerworkspaceIdpathrequiredstring
assetIdpathrequiredstring
Array of objects:
versionrequiredfilenamerequiredsizeBytesrequiredcontentHashrequiredcreatedByrequiredcreatedAtrequiredcurl -X GET "https://techart.tools/api/v1/workspaces/<workspaceId>/assets/<assetId>/versions" \ -H "Authorization: Bearer $TAU_TOKEN"
/workspaces/{workspaceId}/assetsID token or API keyRole: viewerLists ready assets, newest first. Filter by kind and folderId (root for the top level). q does a case-insensitive name prefix search across all folders. Paginate with cursor (the nextCursor from the previous page).
workspaceIdpathrequiredstring
kindqueryenum
folderIdquerystring | "root"
qquerystring
limitqueryinteger
cursorquerystring
assetsrequiredidrequiredpattern ^[A-Za-z0-9_-]{1,128}$
namerequiredmin length 1 · max length 200
filenamerequiredkindrequiredOne of: "model""texture""animation""shader""hdri""scene""other"
formatrequiredcontentTyperequiredfolderIdrequiredpattern ^[A-Za-z0-9_-]{1,128}$
tagsrequiredmax 32 items
statusrequiredOne of: "pending""ready""failed"
sizeBytesrequired≥ 0 · ≤ 9007199254740991
contentHashrequiredversionrequired> 0 · ≤ 9007199254740991
hasThumbnailrequiredcommentCountrequiredUnresolved comments
≥ 0 · ≤ 9007199254740991
metarequiredtriCount≥ -9007199254740991 · ≤ 9007199254740991
vertCount≥ -9007199254740991 · ≤ 9007199254740991
meshCount≥ -9007199254740991 · ≤ 9007199254740991
materialCount≥ -9007199254740991 · ≤ 9007199254740991
boneCount≥ -9007199254740991 · ≤ 9007199254740991
clipCount≥ -9007199254740991 · ≤ 9007199254740991
width≥ -9007199254740991 · ≤ 9007199254740991
height≥ -9007199254740991 · ≤ 9007199254740991
channels≥ -9007199254740991 · ≤ 9007199254740991
bitDepth≥ -9007199254740991 · ≤ 9007199254740991
colorSpacemodelNamemax length 200
shaderCount≥ -9007199254740991 · ≤ 9007199254740991
textureCount≥ -9007199254740991 · ≤ 9007199254740991
modeOne of: "pbr""unlit"
parameterCount≥ -9007199254740991 · ≤ 9007199254740991
textureSlotsmax 64 items
refIdsAssets this document references (scenes, shader graphs, sketches); set by the server on upload
createdByrequiredcreatedAtrequiredISO-8601 timestamp
updatedAtrequiredISO-8601 timestamp
nextCursorrequiredcurl -X GET "https://techart.tools/api/v1/workspaces/<workspaceId>/assets" \ -H "Authorization: Bearer $TAU_TOKEN"
/workspaces/{workspaceId}/assets/{assetId}ID token or API keyRole: editorRename, retag, move to a folder, or update tool-computed metadata (e.g. triangle counts).
workspaceIdpathrequiredstring
assetIdpathrequiredstring
namemin length 1 · max length 200
tagsmax 32 items
folderIdpattern ^[A-Za-z0-9_-]{1,128}$
metatriCount≥ -9007199254740991 · ≤ 9007199254740991
vertCount≥ -9007199254740991 · ≤ 9007199254740991
meshCount≥ -9007199254740991 · ≤ 9007199254740991
materialCount≥ -9007199254740991 · ≤ 9007199254740991
boneCount≥ -9007199254740991 · ≤ 9007199254740991
clipCount≥ -9007199254740991 · ≤ 9007199254740991
width≥ -9007199254740991 · ≤ 9007199254740991
height≥ -9007199254740991 · ≤ 9007199254740991
channels≥ -9007199254740991 · ≤ 9007199254740991
bitDepth≥ -9007199254740991 · ≤ 9007199254740991
colorSpacemodelNamemax length 200
shaderCount≥ -9007199254740991 · ≤ 9007199254740991
textureCount≥ -9007199254740991 · ≤ 9007199254740991
modeOne of: "pbr""unlit"
parameterCount≥ -9007199254740991 · ≤ 9007199254740991
textureSlotsmax 64 items
hasThumbnailidrequiredpattern ^[A-Za-z0-9_-]{1,128}$
namerequiredmin length 1 · max length 200
filenamerequiredkindrequiredOne of: "model""texture""animation""shader""hdri""scene""other"
formatrequiredcontentTyperequiredfolderIdrequiredpattern ^[A-Za-z0-9_-]{1,128}$
tagsrequiredmax 32 items
statusrequiredOne of: "pending""ready""failed"
sizeBytesrequired≥ 0 · ≤ 9007199254740991
contentHashrequiredversionrequired> 0 · ≤ 9007199254740991
hasThumbnailrequiredcommentCountrequiredUnresolved comments
≥ 0 · ≤ 9007199254740991
metarequiredtriCount≥ -9007199254740991 · ≤ 9007199254740991
vertCount≥ -9007199254740991 · ≤ 9007199254740991
meshCount≥ -9007199254740991 · ≤ 9007199254740991
materialCount≥ -9007199254740991 · ≤ 9007199254740991
boneCount≥ -9007199254740991 · ≤ 9007199254740991
clipCount≥ -9007199254740991 · ≤ 9007199254740991
width≥ -9007199254740991 · ≤ 9007199254740991
height≥ -9007199254740991 · ≤ 9007199254740991
channels≥ -9007199254740991 · ≤ 9007199254740991
bitDepth≥ -9007199254740991 · ≤ 9007199254740991
colorSpacemodelNamemax length 200
shaderCount≥ -9007199254740991 · ≤ 9007199254740991
textureCount≥ -9007199254740991 · ≤ 9007199254740991
modeOne of: "pbr""unlit"
parameterCount≥ -9007199254740991 · ≤ 9007199254740991
textureSlotsmax 64 items
refIdsAssets this document references (scenes, shader graphs, sketches); set by the server on upload
createdByrequiredcreatedAtrequiredISO-8601 timestamp
updatedAtrequiredISO-8601 timestamp
curl -X PATCH "https://techart.tools/api/v1/workspaces/<workspaceId>/assets/<assetId>" \
-H "Authorization: Bearer $TAU_TOKEN" \
-H "Content-Type: application/json" \
-d '{}'Direct-to-storage uploads using presigned URLs, including multipart for large files.
/workspaces/{workspaceId}/uploads/{assetId}/abortID token or API keyRole: editorCancels the in-progress upload. A brand-new asset is deleted; an existing asset keeps its current version.
workspaceIdpathrequiredstring
assetIdpathrequiredstring
uploadIdNo content.
curl -X POST "https://techart.tools/api/v1/workspaces/<workspaceId>/uploads/<assetId>/abort" \
-H "Authorization: Bearer $TAU_TOKEN" \
-H "Content-Type: application/json" \
-d '{"uploadId":"abc123"}'/workspaces/{workspaceId}/uploads/{assetId}/completeID token or API keyRole: editorVerifies the uploaded object (size must match the declared sizeBytes), marks the asset ready and counts it against storage. For multipart uploads pass uploadId and every part’s ETag.
Documents that reference other assets (.scene, .shadergraph, .shadersketch) are read and checked: every referenced asset must be ready in this workspace, and pinned versions must exist. If not, the response is 422 with details.problems and the upload is cancelled (a new asset is removed; an existing one keeps its current version). On success the asset’s refIds lists the referenced assets.
workspaceIdpathrequiredstring
assetIdpathrequiredstring
uploadIdpartspartNumberrequired≥ 1 · ≤ 9007199254740991
etagrequiredmin length 1
idrequiredpattern ^[A-Za-z0-9_-]{1,128}$
namerequiredmin length 1 · max length 200
filenamerequiredkindrequiredOne of: "model""texture""animation""shader""hdri""scene""other"
formatrequiredcontentTyperequiredfolderIdrequiredpattern ^[A-Za-z0-9_-]{1,128}$
tagsrequiredmax 32 items
statusrequiredOne of: "pending""ready""failed"
sizeBytesrequired≥ 0 · ≤ 9007199254740991
contentHashrequiredversionrequired> 0 · ≤ 9007199254740991
hasThumbnailrequiredcommentCountrequiredUnresolved comments
≥ 0 · ≤ 9007199254740991
metarequiredtriCount≥ -9007199254740991 · ≤ 9007199254740991
vertCount≥ -9007199254740991 · ≤ 9007199254740991
meshCount≥ -9007199254740991 · ≤ 9007199254740991
materialCount≥ -9007199254740991 · ≤ 9007199254740991
boneCount≥ -9007199254740991 · ≤ 9007199254740991
clipCount≥ -9007199254740991 · ≤ 9007199254740991
width≥ -9007199254740991 · ≤ 9007199254740991
height≥ -9007199254740991 · ≤ 9007199254740991
channels≥ -9007199254740991 · ≤ 9007199254740991
bitDepth≥ -9007199254740991 · ≤ 9007199254740991
colorSpacemodelNamemax length 200
shaderCount≥ -9007199254740991 · ≤ 9007199254740991
textureCount≥ -9007199254740991 · ≤ 9007199254740991
modeOne of: "pbr""unlit"
parameterCount≥ -9007199254740991 · ≤ 9007199254740991
textureSlotsmax 64 items
refIdsAssets this document references (scenes, shader graphs, sketches); set by the server on upload
createdByrequiredcreatedAtrequiredISO-8601 timestamp
updatedAtrequiredISO-8601 timestamp
curl -X POST "https://techart.tools/api/v1/workspaces/<workspaceId>/uploads/<assetId>/complete" \
-H "Authorization: Bearer $TAU_TOKEN" \
-H "Content-Type: application/json" \
-d '{"uploadId":"abc123","parts":[{"partNumber":1,"etag":"string"}]}'/workspaces/{workspaceId}/uploadsID token or API keyRole: editorCreates a pending asset (or a new version of assetId) and returns where to upload the bytes. Files go directly to object storage; they never pass through this API.
mode: "single": PUT the file to uploadUrl with the returned headers.mode: "multipart": request part URLs from /parts, PUT each 64 MB part, keep each response's ETag.Then call /complete. Pending uploads that are never completed are deleted after 24 hours.
workspaceIdpathrequiredstring
filenamerequiredmin length 1 · max length 255
namemin length 1 · max length 200
sizeBytesrequired> 0 · ≤ 9007199254740991
contentTypemax length 120
contentHashHex SHA-256 of the file
pattern ^[a-f0-9]{64}$
kindOne of: "model""texture""animation""shader""hdri""scene""other"
folderIdpattern ^[A-Za-z0-9_-]{1,128}$
tagsmax 32 items
metatriCount≥ -9007199254740991 · ≤ 9007199254740991
vertCount≥ -9007199254740991 · ≤ 9007199254740991
meshCount≥ -9007199254740991 · ≤ 9007199254740991
materialCount≥ -9007199254740991 · ≤ 9007199254740991
boneCount≥ -9007199254740991 · ≤ 9007199254740991
clipCount≥ -9007199254740991 · ≤ 9007199254740991
width≥ -9007199254740991 · ≤ 9007199254740991
height≥ -9007199254740991 · ≤ 9007199254740991
channels≥ -9007199254740991 · ≤ 9007199254740991
bitDepth≥ -9007199254740991 · ≤ 9007199254740991
colorSpacemodelNamemax length 200
shaderCount≥ -9007199254740991 · ≤ 9007199254740991
textureCount≥ -9007199254740991 · ≤ 9007199254740991
modeOne of: "pbr""unlit"
parameterCount≥ -9007199254740991 · ≤ 9007199254740991
textureSlotsmax 64 items
assetIdUpload a new version of this asset instead of creating one
pattern ^[A-Za-z0-9_-]{1,128}$
Variant 1 · mode = "single"
moderequiredassetrequiredidrequiredpattern ^[A-Za-z0-9_-]{1,128}$
namerequiredmin length 1 · max length 200
filenamerequiredkindrequiredOne of: "model""texture""animation""shader""hdri""scene""other"
formatrequiredcontentTyperequiredfolderIdrequiredpattern ^[A-Za-z0-9_-]{1,128}$
tagsrequiredmax 32 items
statusrequiredOne of: "pending""ready""failed"
sizeBytesrequired≥ 0 · ≤ 9007199254740991
contentHashrequiredversionrequired> 0 · ≤ 9007199254740991
hasThumbnailrequiredcommentCountrequiredUnresolved comments
≥ 0 · ≤ 9007199254740991
metarequiredtriCount≥ -9007199254740991 · ≤ 9007199254740991
vertCount≥ -9007199254740991 · ≤ 9007199254740991
meshCount≥ -9007199254740991 · ≤ 9007199254740991
materialCount≥ -9007199254740991 · ≤ 9007199254740991
boneCount≥ -9007199254740991 · ≤ 9007199254740991
clipCount≥ -9007199254740991 · ≤ 9007199254740991
width≥ -9007199254740991 · ≤ 9007199254740991
height≥ -9007199254740991 · ≤ 9007199254740991
channels≥ -9007199254740991 · ≤ 9007199254740991
bitDepth≥ -9007199254740991 · ≤ 9007199254740991
colorSpacemodelNamemax length 200
shaderCount≥ -9007199254740991 · ≤ 9007199254740991
textureCount≥ -9007199254740991 · ≤ 9007199254740991
modeOne of: "pbr""unlit"
parameterCount≥ -9007199254740991 · ≤ 9007199254740991
textureSlotsmax 64 items
refIdsAssets this document references (scenes, shader graphs, sketches); set by the server on upload
createdByrequiredcreatedAtrequiredISO-8601 timestamp
updatedAtrequiredISO-8601 timestamp
uploadUrlrequiredPresigned PUT URL
headersrequiredHeaders that must be sent with the PUT
Variant 2 · mode = "multipart"
moderequiredassetrequiredidrequiredpattern ^[A-Za-z0-9_-]{1,128}$
namerequiredmin length 1 · max length 200
filenamerequiredkindrequiredOne of: "model""texture""animation""shader""hdri""scene""other"
formatrequiredcontentTyperequiredfolderIdrequiredpattern ^[A-Za-z0-9_-]{1,128}$
tagsrequiredmax 32 items
statusrequiredOne of: "pending""ready""failed"
sizeBytesrequired≥ 0 · ≤ 9007199254740991
contentHashrequiredversionrequired> 0 · ≤ 9007199254740991
hasThumbnailrequiredcommentCountrequiredUnresolved comments
≥ 0 · ≤ 9007199254740991
metarequiredtriCount≥ -9007199254740991 · ≤ 9007199254740991
vertCount≥ -9007199254740991 · ≤ 9007199254740991
meshCount≥ -9007199254740991 · ≤ 9007199254740991
materialCount≥ -9007199254740991 · ≤ 9007199254740991
boneCount≥ -9007199254740991 · ≤ 9007199254740991
clipCount≥ -9007199254740991 · ≤ 9007199254740991
width≥ -9007199254740991 · ≤ 9007199254740991
height≥ -9007199254740991 · ≤ 9007199254740991
channels≥ -9007199254740991 · ≤ 9007199254740991
bitDepth≥ -9007199254740991 · ≤ 9007199254740991
colorSpacemodelNamemax length 200
shaderCount≥ -9007199254740991 · ≤ 9007199254740991
textureCount≥ -9007199254740991 · ≤ 9007199254740991
modeOne of: "pbr""unlit"
parameterCount≥ -9007199254740991 · ≤ 9007199254740991
textureSlotsmax 64 items
refIdsAssets this document references (scenes, shader graphs, sketches); set by the server on upload
createdByrequiredcreatedAtrequiredISO-8601 timestamp
updatedAtrequiredISO-8601 timestamp
uploadIdrequiredpartSizerequired≥ -9007199254740991 · ≤ 9007199254740991
partCountrequired≥ -9007199254740991 · ≤ 9007199254740991
curl -X POST "https://techart.tools/api/v1/workspaces/<workspaceId>/uploads" \
-H "Authorization: Bearer $TAU_TOKEN" \
-H "Content-Type: application/json" \
-d '{"filename":"hero.glb","sizeBytes":1048576}'/workspaces/{workspaceId}/uploads/{assetId}/partsID token or API keyRole: editorReturns presigned PUT URLs for the requested part numbers (1-based). Request in batches of up to 1000.
workspaceIdpathrequiredstring
assetIdpathrequiredstring
uploadIdrequiredmin length 1
partNumbersrequiredmin 1 items · max 1000 items
urlsrequiredpartNumberrequired≥ -9007199254740991 · ≤ 9007199254740991
urlrequiredcurl -X POST "https://techart.tools/api/v1/workspaces/<workspaceId>/uploads/<assetId>/parts" \
-H "Authorization: Bearer $TAU_TOKEN" \
-H "Content-Type: application/json" \
-d '{"uploadId":"abc123","partNumbers":[1]}'Discussion on assets, optionally pinned to a point on a model or image.
/workspaces/{workspaceId}/assets/{assetId}/commentsID token onlyRole: viewerAny member can comment, including viewers.
workspaceIdpathrequiredstring
assetIdpathrequiredstring
bodyrequiredmin length 1 · max length 4000
anchorDefault: null
Variant 1
kindrequiredpositionrequiredmin 3 items · max 3 items
normalrequiredmin 3 items · max 3 items
camerarequiredpositionrequiredmin 3 items · max 3 items
targetrequiredmin 3 items · max 3 items
Variant 2
kindrequiredxrequired≥ 0 · ≤ 1
yrequired≥ 0 · ≤ 1
idrequiredpattern ^[A-Za-z0-9_-]{1,128}$
assetIdrequiredpattern ^[A-Za-z0-9_-]{1,128}$
bodyrequiredmin length 1 · max length 4000
anchorrequiredVariant 1
kindrequiredpositionrequiredmin 3 items · max 3 items
normalrequiredmin 3 items · max 3 items
camerarequiredpositionrequiredmin 3 items · max 3 items
targetrequiredmin 3 items · max 3 items
Variant 2
kindrequiredxrequired≥ 0 · ≤ 1
yrequired≥ 0 · ≤ 1
versionrequired> 0 · ≤ 9007199254740991
resolvedrequiredauthorIdrequiredauthorNamerequiredcreatedAtrequiredISO-8601 timestamp
editedAtrequiredcurl -X POST "https://techart.tools/api/v1/workspaces/<workspaceId>/assets/<assetId>/comments" \
-H "Authorization: Bearer $TAU_TOKEN" \
-H "Content-Type: application/json" \
-d '{"body":"string","anchor":{"kind":"3d","position":[],"normal":[],"camera":{"position":[],"target":[]}}}'/workspaces/{workspaceId}/assets/{assetId}/comments/{commentId}ID token onlyRole: viewerThe author or a workspace admin can delete a comment.
workspaceIdpathrequiredstring
assetIdpathrequiredstring
commentIdpathrequiredstring
No content.
curl -X DELETE "https://techart.tools/api/v1/workspaces/<workspaceId>/assets/<assetId>/comments/<commentId>" \ -H "Authorization: Bearer $TAU_TOKEN"
/workspaces/{workspaceId}/assets/{assetId}/commentsID token or API keyRole: viewerOldest first. Comments can be pinned to a point on a model (anchor.kind = "3d") or an image ("2d").
workspaceIdpathrequiredstring
assetIdpathrequiredstring
Array of objects:
idrequiredpattern ^[A-Za-z0-9_-]{1,128}$
assetIdrequiredpattern ^[A-Za-z0-9_-]{1,128}$
bodyrequiredmin length 1 · max length 4000
anchorrequiredVariant 1
kindrequiredpositionrequiredmin 3 items · max 3 items
normalrequiredmin 3 items · max 3 items
camerarequiredpositionrequiredmin 3 items · max 3 items
targetrequiredmin 3 items · max 3 items
Variant 2
kindrequiredxrequired≥ 0 · ≤ 1
yrequired≥ 0 · ≤ 1
versionrequired> 0 · ≤ 9007199254740991
resolvedrequiredauthorIdrequiredauthorNamerequiredcreatedAtrequiredISO-8601 timestamp
editedAtrequiredcurl -X GET "https://techart.tools/api/v1/workspaces/<workspaceId>/assets/<assetId>/comments" \ -H "Authorization: Bearer $TAU_TOKEN"
/workspaces/{workspaceId}/assets/{assetId}/comments/{commentId}ID token onlyRole: viewerOnly the author can change the text. The author or any editor can resolve and reopen.
workspaceIdpathrequiredstring
assetIdpathrequiredstring
commentIdpathrequiredstring
bodymin length 1 · max length 4000
resolvedidrequiredpattern ^[A-Za-z0-9_-]{1,128}$
assetIdrequiredpattern ^[A-Za-z0-9_-]{1,128}$
bodyrequiredmin length 1 · max length 4000
anchorrequiredVariant 1
kindrequiredpositionrequiredmin 3 items · max 3 items
normalrequiredmin 3 items · max 3 items
camerarequiredpositionrequiredmin 3 items · max 3 items
targetrequiredmin 3 items · max 3 items
Variant 2
kindrequiredxrequired≥ 0 · ≤ 1
yrequired≥ 0 · ≤ 1
versionrequired> 0 · ≤ 9007199254740991
resolvedrequiredauthorIdrequiredauthorNamerequiredcreatedAtrequiredISO-8601 timestamp
editedAtrequiredcurl -X PATCH "https://techart.tools/api/v1/workspaces/<workspaceId>/assets/<assetId>/comments/<commentId>" \
-H "Authorization: Bearer $TAU_TOKEN" \
-H "Content-Type: application/json" \
-d '{"body":"string","resolved":true}'Read-only links that open an asset without an account.
/workspaces/{workspaceId}/share-linksID token onlyRole: editorCreates a read-only link that opens an asset without an account: in the matching viewer, with a download button.
Anyone with the URL can open it until it expires or is revoked. version pins the current version; omit it to always serve the latest.
workspaceIdpathrequiredstring
assetIdrequiredpattern ^[A-Za-z0-9_-]{1,128}$
pinVersionDefault: false
expiresInDaysDefault: 7
≥ 1 · ≤ 365
idrequiredShort id for managing the link (not the secret token)
assetIdrequiredpattern ^[A-Za-z0-9_-]{1,128}$
versionrequired> 0 · ≤ 9007199254740991
urlrequiredPublic URL that opens the asset without an account
expiresAtrequiredviewCountrequired≥ 0 · ≤ 9007199254740991
lastViewedAtrequiredcreatedByrequiredcreatedAtrequiredISO-8601 timestamp
curl -X POST "https://techart.tools/api/v1/workspaces/<workspaceId>/share-links" \
-H "Authorization: Bearer $TAU_TOKEN" \
-H "Content-Type: application/json" \
-d '{"assetId":"abc123","pinVersion":false,"expiresInDays":1}'/share/{token}PublicPublic: no authentication. Returns the shared asset’s details and a short-lived download URL.
tokenpathrequiredstring
workspaceNamerequiredassetrequirednamerequiredmin length 1 · max length 200
filenamerequiredkindrequiredOne of: "model""texture""animation""shader""hdri""scene""other"
formatrequiredsizeBytesrequired≥ 0 · ≤ 9007199254740991
metarequiredtriCount≥ -9007199254740991 · ≤ 9007199254740991
vertCount≥ -9007199254740991 · ≤ 9007199254740991
meshCount≥ -9007199254740991 · ≤ 9007199254740991
materialCount≥ -9007199254740991 · ≤ 9007199254740991
boneCount≥ -9007199254740991 · ≤ 9007199254740991
clipCount≥ -9007199254740991 · ≤ 9007199254740991
width≥ -9007199254740991 · ≤ 9007199254740991
height≥ -9007199254740991 · ≤ 9007199254740991
channels≥ -9007199254740991 · ≤ 9007199254740991
bitDepth≥ -9007199254740991 · ≤ 9007199254740991
colorSpacemodelNamemax length 200
shaderCount≥ -9007199254740991 · ≤ 9007199254740991
textureCount≥ -9007199254740991 · ≤ 9007199254740991
modeOne of: "pbr""unlit"
parameterCount≥ -9007199254740991 · ≤ 9007199254740991
textureSlotsmax 64 items
versionrequired> 0 · ≤ 9007199254740991
downloadUrlrequiredPresigned URL, valid for a few minutes
embeddablerequiredWhether the workspace's plan allows embedding this link on other websites
thumbnailUrlrequiredexpiresAtrequiredcurl -X GET "https://techart.tools/api/v1/share/<token>"
/workspaces/{workspaceId}/share-linksID token onlyRole: editorShare links in the workspace, newest first; pass assetId for one asset’s links.
workspaceIdpathrequiredstring
assetIdquerystring
Array of objects:
idrequiredShort id for managing the link (not the secret token)
assetIdrequiredpattern ^[A-Za-z0-9_-]{1,128}$
versionrequired> 0 · ≤ 9007199254740991
urlrequiredPublic URL that opens the asset without an account
expiresAtrequiredviewCountrequired≥ 0 · ≤ 9007199254740991
lastViewedAtrequiredcreatedByrequiredcreatedAtrequiredISO-8601 timestamp
curl -X GET "https://techart.tools/api/v1/workspaces/<workspaceId>/share-links" \ -H "Authorization: Bearer $TAU_TOKEN"
/workspaces/{workspaceId}/share-links/{linkId}ID token onlyRole: editorworkspaceIdpathrequiredstring
linkIdpathrequiredstring
No content.
curl -X DELETE "https://techart.tools/api/v1/workspaces/<workspaceId>/share-links/<linkId>" \ -H "Authorization: Bearer $TAU_TOKEN"
The workspace audit log.
/workspaces/{workspaceId}/activityID token or API keyRole: viewerThe audit log: uploads, deletes, member and sharing changes, newest first. Page with before (the last entry’s createdAt). Entries are kept for a year.
workspaceIdpathrequiredstring
limitqueryinteger
beforequerystring (date-time)
typequeryenum
entriesrequiredidrequiredpattern ^[A-Za-z0-9_-]{1,128}$
typerequiredOne of: "asset.created""asset.version""asset.renamed""asset.moved""asset.deleted""folder.created""folder.renamed""folder.deleted""member.invited""member.joined""member.role""member.removed""invite.revoked""workspace.updated""apikey.created""apikey.revoked""share.created""share.revoked""comment.created""plan.changed"
actorIdrequiredUser uid, `apikey:<id>`, or `system`
actorNamerequiredtargetrequiredkindrequiredOne of: "asset""folder""member""invite""workspace""apikey""share""comment"
idrequirednamerequireddetailsrequiredcreatedAtrequiredISO-8601 timestamp
nextrequiredcurl -X GET "https://techart.tools/api/v1/workspaces/<workspaceId>/activity" \ -H "Authorization: Bearer $TAU_TOKEN"
Workspace-scoped keys for scripts, CI and DCC plugins.
/workspaces/{workspaceId}/api-keysID token onlyRole: adminCreates a workspace-scoped key for scripts and pipelines. The full key is returned only once; store it securely. read keys act as a viewer; write keys act as an editor. Keys cannot manage members, invites or other keys.
workspaceIdpathrequiredstring
namerequiredmin length 1 · max length 80
scopesDefault: ["read"]
min 1 items
idrequiredpattern ^[A-Za-z0-9_-]{1,128}$
namerequiredmin length 1 · max length 80
prefixrequiredFirst characters of the key, for identification
scopesrequiredcreatedByrequiredcreatedAtrequiredISO-8601 timestamp
lastUsedAtrequiredkeyrequiredThe secret key, shown once
curl -X POST "https://techart.tools/api/v1/workspaces/<workspaceId>/api-keys" \
-H "Authorization: Bearer $TAU_TOKEN" \
-H "Content-Type: application/json" \
-d '{"name":"Hero character","scopes":["read"]}'/workspaces/{workspaceId}/api-keysID token onlyRole: adminworkspaceIdpathrequiredstring
Array of objects:
idrequiredpattern ^[A-Za-z0-9_-]{1,128}$
namerequiredmin length 1 · max length 80
prefixrequiredFirst characters of the key, for identification
scopesrequiredcreatedByrequiredcreatedAtrequiredISO-8601 timestamp
lastUsedAtrequiredcurl -X GET "https://techart.tools/api/v1/workspaces/<workspaceId>/api-keys" \ -H "Authorization: Bearer $TAU_TOKEN"
/workspaces/{workspaceId}/api-keys/{keyId}ID token onlyRole: adminworkspaceIdpathrequiredstring
keyIdpathrequiredstring
No content.
curl -X DELETE "https://techart.tools/api/v1/workspaces/<workspaceId>/api-keys/<keyId>" \ -H "Authorization: Bearer $TAU_TOKEN"
Server-side conversions such as FBX export. Currently unavailable.
/workspaces/{workspaceId}/jobsID token or API keyRole: editorCurrently unavailable (returns 503) while server-side conversion is switched off.
Queues a conversion that cannot run in the browser, such as FBX export. The input must be a ready model asset in the workspace.
The result is saved as a new asset; poll GET /jobs/{jobId} until status is succeeded (then read outputAssetId) or failed.
Engine profiles set axis and unit conventions: unity (Y-up, meters), unreal (Z-up, centimeters), godot (Y-up, meters).
Worker time counts against the plan’s monthly worker minutes.
workspaceIdpathrequiredstring
typerequiredinputAssetIdrequiredpattern ^[A-Za-z0-9_-]{1,128}$
paramsrequiredtargetFormatrequiredOne of: "fbx""glb""gltf""obj"
engineProfilerequiredOne of: "unity""unreal""godot""threejs"
scaleDefault: 1
> 0
stripAnimationsDefault: false
idrequiredpattern ^[A-Za-z0-9_-]{1,128}$
typerequiredOne of: "convert-model"
statusrequiredOne of: "queued""running""succeeded""failed"
inputAssetIdrequiredpattern ^[A-Za-z0-9_-]{1,128}$
paramsrequiredtargetFormatrequiredOne of: "fbx""glb""gltf""obj"
engineProfilerequiredOne of: "unity""unreal""godot""threejs"
scalerequiredDefault: 1
> 0
stripAnimationsrequiredDefault: false
outputAssetIdrequiredpattern ^[A-Za-z0-9_-]{1,128}$
errorrequiredcreatedByrequiredcreatedAtrequiredISO-8601 timestamp
updatedAtrequiredISO-8601 timestamp
curl -X POST "https://techart.tools/api/v1/workspaces/<workspaceId>/jobs" \
-H "Authorization: Bearer $TAU_TOKEN" \
-H "Content-Type: application/json" \
-d '{"type":"convert-model","inputAssetId":"abc123","params":{"targetFormat":"fbx","engineProfile":"unity"}}'/workspaces/{workspaceId}/jobs/{jobId}ID token or API keyRole: viewerworkspaceIdpathrequiredstring
jobIdpathrequiredstring
idrequiredpattern ^[A-Za-z0-9_-]{1,128}$
typerequiredOne of: "convert-model"
statusrequiredOne of: "queued""running""succeeded""failed"
inputAssetIdrequiredpattern ^[A-Za-z0-9_-]{1,128}$
paramsrequiredtargetFormatrequiredOne of: "fbx""glb""gltf""obj"
engineProfilerequiredOne of: "unity""unreal""godot""threejs"
scalerequiredDefault: 1
> 0
stripAnimationsrequiredDefault: false
outputAssetIdrequiredpattern ^[A-Za-z0-9_-]{1,128}$
errorrequiredcreatedByrequiredcreatedAtrequiredISO-8601 timestamp
updatedAtrequiredISO-8601 timestamp
curl -X GET "https://techart.tools/api/v1/workspaces/<workspaceId>/jobs/<jobId>" \ -H "Authorization: Bearer $TAU_TOKEN"
/workspaces/{workspaceId}/jobsID token or API keyRole: viewerworkspaceIdpathrequiredstring
limitqueryinteger
Array of objects:
idrequiredpattern ^[A-Za-z0-9_-]{1,128}$
typerequiredOne of: "convert-model"
statusrequiredOne of: "queued""running""succeeded""failed"
inputAssetIdrequiredpattern ^[A-Za-z0-9_-]{1,128}$
paramsrequiredtargetFormatrequiredOne of: "fbx""glb""gltf""obj"
engineProfilerequiredOne of: "unity""unreal""godot""threejs"
scalerequiredDefault: 1
> 0
stripAnimationsrequiredDefault: false
outputAssetIdrequiredpattern ^[A-Za-z0-9_-]{1,128}$
errorrequiredcreatedByrequiredcreatedAtrequiredISO-8601 timestamp
updatedAtrequiredISO-8601 timestamp
curl -X GET "https://techart.tools/api/v1/workspaces/<workspaceId>/jobs" \ -H "Authorization: Bearer $TAU_TOKEN"
Plans and subscriptions (Stripe). Only owners can change the plan.
/workspaces/{workspaceId}/billing/portalID token onlyRole: ownerReturns a Stripe Billing Portal URL to change plan, update the card, see invoices or cancel.
workspaceIdpathrequiredstring
urlrequiredcurl -X POST "https://techart.tools/api/v1/workspaces/<workspaceId>/billing/portal" \ -H "Authorization: Bearer $TAU_TOKEN"
/workspaces/{workspaceId}/billing/checkoutID token onlyRole: ownerReturns a Stripe Checkout URL for the plan. The plan changes when Stripe confirms the payment (via the webhook).
workspaceIdpathrequiredstring
planrequiredOne of: "pro""studio"
urlrequiredcurl -X POST "https://techart.tools/api/v1/workspaces/<workspaceId>/billing/checkout" \
-H "Authorization: Bearer $TAU_TOKEN" \
-H "Content-Type: application/json" \
-d '{"plan":"pro"}'/workspaces/{workspaceId}/billingID token onlyRole: adminworkspaceIdpathrequiredstring
configuredrequiredplanrequiredOne of: "free""pro""studio"
statusrequiredOne of: "none""active""trialing""past_due""canceled""incomplete""unpaid"
currentPeriodEndrequiredcancelAtPeriodEndrequiredusagerequiredstorageBytesrequiredworkerMinutesrequiredmembersrequired≥ -9007199254740991 · ≤ 9007199254740991
apiKeysrequired≥ -9007199254740991 · ≤ 9007199254740991
curl -X GET "https://techart.tools/api/v1/workspaces/<workspaceId>/billing" \ -H "Authorization: Bearer $TAU_TOKEN"
/billing/plansPublicEvery plan with its limits, features and monthly price (from Stripe, cached for 10 minutes). Prices are null when billing is off or Stripe could not be reached.
configuredrequiredplansrequiredidrequiredOne of: "free""pro""studio"
labelrequiredlimitsrequiredstorageBytesrequired≥ 0 · ≤ 9007199254740991
maxFileBytesrequired> 0 · ≤ 9007199254740991
workerMinutesPerMonthrequired≥ 0
membersrequired> 0 · ≤ 9007199254740991
apiKeysrequired≥ 0 · ≤ 9007199254740991
featuresrequiredapiAccessrequiredserverConversionrequiredbatchPipelinesrequiredshareLinksrequiredembedsrequiredpricerequiredNull for Free, or when the price could not be loaded
amountrequiredMinor units, e.g. cents
≥ -9007199254740991 · ≤ 9007199254740991
currencyrequiredintervalrequiredOne of: "day""week""month""year"
intervalCountrequired≥ -9007199254740991 · ≤ 9007199254740991
curl -X GET "https://techart.tools/api/v1/billing/plans"
/billing/webhookPublicReceives Stripe events (signed with STRIPE_WEBHOOK_SECRET). Subscribe to checkout.session.completed and customer.subscription.*. Events only identify the subscription: its current state is always refetched from Stripe, so out-of-order and duplicate deliveries are harmless.
receivedrequiredcurl -X POST "https://techart.tools/api/v1/billing/webhook"