Projects
Manage 3D projects and configurations. Project types include configurator, viewer, cpq, ar-preview, and embedded.
List All Projects
const response = await fetch(BASE_URL + '/projects', {
headers: { 'Authorization': 'Bearer ' + accessToken }
});
const data = await response.json();
// {
// "success": true,
// "projects": [
// {
// "id": "proj_123",
// "name": "Modern Office Design",
// "type": "configurator",
// "thumbnail": "https://...",
// "createdAt": "2026-02-25T10:00:00Z",
// "updatedAt": "2026-03-01T14:30:00Z"
// }
// ]
// }Create Project
const response = await fetch(BASE_URL + '/projects', {
method: 'POST',
headers: {
'Authorization': 'Bearer ' + accessToken,
'Content-Type': 'application/json'
},
body: JSON.stringify({
name: 'New Product Configuration',
type: 'configurator' // 'configurator' | 'viewer' | 'cpq' | 'ar-preview' | 'embedded'
})
});
const data = await response.json();
// { "success": true, "project": { ... } }Get Project
Large projects may return an optimized payload variant to stay within edge gateway limits. Always handle both full and compressed response shapes.
const response = await fetch(BASE_URL + '/projects/proj_123', {
headers: { 'Authorization': 'Bearer ' + accessToken }
});
const data = await response.json();
// Variant A (full / normalized scene)
// data.project.sceneData
// Variant B (optimized)
// data.project.data.sceneDataCompressed + data.project.data.sceneDataEncoding
// OR data.project.data.sceneData + data.project.data.models + data.project.data.cameraLarge-Project Response Variants
The API may return one of these variants for GET /projects/:id:
- • project.sceneData (fully expanded scene)
- • project.data.sceneDataCompressed + sceneDataEncoding=gzip-base64
- • project.data.sceneData with project.data.models and project.data.camera
Update Project
const response = await fetch(BASE_URL + '/projects/proj_123', {
method: 'PUT',
headers: {
'Authorization': 'Bearer ' + accessToken,
'Content-Type': 'application/json'
},
body: JSON.stringify({
name: 'Updated Project Name',
data: { settings: { autoRotate: true } }
})
});Duplicate Project
Creates an independent copy by deep-cloning the project's entire sceneData — all 3D models (with nested groups and parts), every option block and variant (hotspots, scenery, materials, …), the full pricing structure (price groups, 1D/2D tables, unique-price blocks, variables, and all SKU maps), the complete form, animations, conditional logic, and project settings. Asset-library models, materials, and textures are reused by reference (no extra storage cost). Per-project uploaded models, the AR USDZ file, and the thumbnail are copied to the new project's storage path and their stored paths rewritten so the copy is independent of the source. Share settings, WooCommerce / Shopify product links, and saved configurations are not carried over.
Plan gate: requires Pro or Enterprise. Starter callers receive 403.
const response = await fetch(BASE_URL + '/projects/proj_123/clone', {
method: 'POST',
headers: {
'Authorization': 'Bearer ' + accessToken,
'Content-Type': 'application/json'
},
body: JSON.stringify({
name: 'My Configurator Copy' // optional — defaults to "{source name} Copy"
})
});
const data = await response.json();
// {
// "success": true,
// "project": { "id": "proj_new", "name": "My Configurator Copy", "type": "configurator", ... },
// "warnings": { "failedModelCopies": [...], "message": "..." } // present only on partial failure
// }Delete Project
const response = await fetch(BASE_URL + '/projects/proj_123', {
method: 'DELETE',
headers: { 'Authorization': 'Bearer ' + accessToken }
});