Complete Workflow
1
Upload a 3D Model
Create the Model Record
POST https://api.glossi.app/api/v1/modelsHeader
Value
{
"models": [
{
"name": "My Product",
"fileName": "product.glb",
"fileType": "glb"
}
]
}curl -X POST https://api.glossi.app/api/v1/models \
-H "X-API-Key: glsi_xxxxxxxxxx_xxxxx" \
-H "Content-Type: application/json" \
-d '{
"models": [
{
"name": "My Product",
"fileName": "product.glb",
"fileType": "glb"
}
]
}'{
"models": [
{
"modelId": "abc123-uuid",
"name": "My Product",
"uploadUrl": "https://s3.amazonaws.com/...",
"uploadKey": "workspaces/.../model.glb"
}
]
}Upload the File to S3
PUT <uploadUrl from previous response>Header
Value
curl -X PUT "<uploadUrl>" \
-H "Content-Type: model/gltf-binary" \
--data-binary @/path/to/your/model.glbConfirm the Upload
POST https://api.glossi.app/api/v1/models/{modelId}/confirmHeader
Value
{
"fileType": "glb"
}curl -X POST https://api.glossi.app/api/v1/models/abc123-uuid/confirm \
-H "X-API-Key: glsi_xxxxxxxxxx_xxxxx" \
-H "Content-Type: application/json" \
-d '{"fileType": "glb"}'{
"modelId": "abc123-uuid",
"name": "My Product",
"status": "PENDING",
"filePath": "workspaces/.../model.glb"
}2
Wait for Model Processing (Important!)
POST https://api.glossi.app/api/v1/models/statusHeader
Value
{
"modelIds": ["abc123-uuid"]
}curl -X POST https://api.glossi.app/api/v1/models/status \
-H "X-API-Key: glsi_xxxxxxxxxx_xxxxx" \
-H "Content-Type: application/json" \
-d '{"modelIds": ["abc123-uuid"]}'{
"models": [
{
"modelId": "abc123-uuid",
"name": "My Product",
"status": "READY",
"ready": true
}
],
"allReady": true,
"notFound": []
}# Simple polling loop
while true; do
RESPONSE=$(curl -s -X POST https://api.glossi.app/api/v1/models/status \
-H "X-API-Key: $API_KEY" \
-H "Content-Type: application/json" \
-d '{"modelIds": ["abc123-uuid"]}')
ALL_READY=$(echo $RESPONSE | jq -r '.allReady')
if [ "$ALL_READY" = "true" ]; then
echo "Model ready! Proceeding to create project..."
break
fi
echo "Model still processing..."
sleep 5
done3
Finding Available Templates
GET https://api.glossi.app/api/v1/templatesHeader
Value
curl https://api.glossi.app/api/v1/templates \
-H "X-API-Key: glsi_xxxxxxxxxx_xxxxx"{
"templates": [
{
"templateId": "abc123-template",
"name": "Studio Light",
"description": "Clean studio lighting setup"
},
{
"templateId": "def456-template",
"name": "Outdoor Scene",
"description": "Natural outdoor lighting"
}
]
}# Only public templates
curl "https://api.glossi.app/api/v1/templates?internal=false" \
-H "X-API-Key: glsi_xxxxxxxxxx_xxxxx"
# Only your workspace templates
curl "https://api.glossi.app/api/v1/templates?public=false" \
-H "X-API-Key: glsi_xxxxxxxxxx_xxxxx"4
Create a Project
POST https://api.glossi.app/api/v1/projectsHeader
Value
{
"name": "Product Photoshoot",
"modelIds": ["abc123-uuid"],
"templateId": "your-template-uuid"
}curl -X POST https://api.glossi.app/api/v1/projects \
-H "X-API-Key: glsi_xxxxxxxxxx_xxxxx" \
-H "Content-Type: application/json" \
-d '{
"name": "Product Photoshoot",
"modelIds": ["abc123-uuid"],
"templateId": "template-uuid"
}'{
"projects": [
{
"projectId": "project-uuid",
"name": "Product Photoshoot",
"status": "PENDING",
"modelIds": ["abc123-uuid"],
"templateId": "template-uuid"
}
]
}{
"modelIds": ["model-1-uuid", "model-2-uuid", "model-3-uuid"],
"templateId": "template-uuid",
"createPerModel": true
}5
Start a Render
POST https://api.glossi.app/api/v1/rendersHeader
Value
{
"projectIds": ["project-uuid"],
"settings": {
"renderBookmarks": true,
"renderShots": true,
"renderVariants": true,
"imageQuality": 1,
"videoQuality": 1
}
}{
"jobs": [
{
"jobId": "job-uuid",
"status": "QUEUED",
"projectId": "project-uuid"
}
],
"totalProjects": 1
}{
"projectIds": ["project-1", "project-2", "project-3"],
"settings": {
"renderBookmarks": true,
"imageQuality": 1
}
}Render Settings Explained
Setting
Default
Options
curl -X POST https://api.glossi.app/api/v1/renders \
-H "X-API-Key: glsi_xxxxxxxxxx_xxxxx" \
-H "Content-Type: application/json" \
-d '{
"projectIds": ["project-uuid"],
"settings": {
"renderBookmarks": true,
"renderShots": false,
"imageQuality": 2
}
}'6
Check Render Status
GET https://api.glossi.app/api/v1/renders/{jobId}Header
Value
curl https://api.glossi.app/api/v1/renders/job-uuid \
-H "X-API-Key: glsi_xxxxxxxxxx_xxxxx"{
"jobId": "job-uuid",
"status": "RENDERING",
"projectId": "project-uuid"
}{
"jobId": "job-uuid",
"status": "COMPLETED",
"projectId": "project-uuid",
"renders": [
{
"id": "render-uuid-1",
"name": "Front View - Default",
"filePath": "workspaces/.../render.png",
"fileType": "PNG",
"isVideo": false
},
{
"id": "render-uuid-2",
"name": "360 Spin - Default",
"filePath": "workspaces/.../video.mp4",
"fileType": "MP4",
"isVideo": true
}
]
}Job Statuses
Status
Meaning
Retrying Failed Renders
POST https://api.glossi.app/api/v1/renders/{jobId}/retryHeader
Value
curl -X POST https://api.glossi.app/api/v1/renders/job-uuid/retry \
-H "X-API-Key: glsi_xxxxxxxxxx_xxxxx"{
"jobId": "job-uuid",
"status": "QUEUED",
"projectId": "project-uuid",
"batchId": "new-batch-uuid"
}7
Set Up Webhooks (Optional)
Available Events
Event
Description
Configure Your Webhook
PUT https://api.glossi.app/api/v1/webhooks{
"url": "https://your-app.com/webhooks/glossi",
"events": [
"model.processed",
"model.failed",
"project.created",
"job.complete",
"job.failed",
"render.complete",
"render.failed"
],
"enabled": true
}{
"id": "webhook-uuid",
"url": "https://your-app.com/webhooks/glossi",
"secret": "your-webhook-secret",
"events": ["model.processed", "job.complete", "render.complete", ...],
"enabled": true
}Webhook Payloads
Verify Webhook Signatures
const crypto = require("crypto")
function verifyWebhook(payload, signature, secret) {
const expected = crypto.createHmac("sha256", secret).update(JSON.stringify(payload)).digest("hex")
return crypto.timingSafeEqual(Buffer.from(signature), Buffer.from(expected))
}Was this helpful?