Duplicate a workspace template into a project
Sample request
curl -X POST "https://api.abyssale.com/workspace-templates/$COMPANY_TEMPLATE_ID/use" \
-H "x-api-key: $ABYSSALE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"project_id": "d59adee9-4867-11f0-96f2-0a00d9eb8f78",
"name": "My Custom Template"
}'import abyssale from '@abyssale/sdk';
const companyTemplateId = 'YOUR_COMPANY_TEMPLATE_ID';
const { data, error } = await abyssale.duplicateWorkspaceTemplate(companyTemplateId, {
"project_id": "d59adee9-4867-11f0-96f2-0a00d9eb8f78",
"name": "My Custom Template"
});
if (error) console.error(error.id, error.message);
else console.log(data);from abyssale import Abyssale
company_template_id = "YOUR_COMPANY_TEMPLATE_ID"
with Abyssale() as client:
result = client.duplicate_workspace_template(company_template_id, {
"project_id": "d59adee9-4867-11f0-96f2-0a00d9eb8f78",
"name": "My Custom Template"
})
print(result)Example request body
{
"project_id": "d59adee9-4867-11f0-96f2-0a00d9eb8f78",
"name": "My Custom Template"
}Example 200 response
{
"duplication_request_id": "40c32a4e-4869-11f0-96f2-0a00d9eb8f78",
"version": "v2026-08-21"
}Example 400 error response
{
"id": "out_of_range",
"message": "formats[0].width: Must be greater than or equal to 1 and less than or equal to 5000.",
"errors": [
{
"path": "formats[0].width",
"code": "out_of_range",
"message": "Must be greater than or equal to 1 and less than or equal to 5000.",
"expected": {
"min": 1,
"max": 5000
},
"received": 99999999
}
]
}Copy a shared workspace template into one of your projects, creating an editable design instance. The duplication is asynchronous — use the returned duplication_request_id to poll for completion via GET /design-duplication-requests/{duplicateRequestId}.
Path parameters
companyTemplateId string (uuid) required
Unique identifier (UUID) of the workspace template to duplicate
Request body
project_id string (uuid) required
Target project ID where the template will be duplicated
name string
Optional custom name for the duplicated template Length 2–100 characters.
Response 200
Duplication request accepted and processing
duplication_request_id string (uuid) always
Unique identifier for tracking the duplication process
version string
The API version that produced this response, named by release date (vYYYY-MM-DD). Pattern ^v\d{4}-\d{2}-\d{2}$.
More about version
The API version that produced this response, named by release date (vYYYY-MM-DD). Stamped as a top-level field on JSON object bodies, success and error alike, so a client can always tell which contract answered. There is no version-selection parameter — a single version is maintained at a time.
Two kinds of body are not stamped. Array bodies (the listings) carry no envelope. And a body that already has a version key of its own is left alone — which in practice means Banner, whose version is the generated file's integer counter. So GET /banners/{bannerId} and the synchronous generate are the two responses that do not tell you which contract answered.
The value changes when a new version is released. Match the vYYYY-MM-DD shape rather than pinning today's literal, or your client breaks on the next release.
Errors
Every failure uses the shared error envelope — {id, message, errors?}. Branch on id, never on message. See Errors.
| Status | When |
|---|---|
400 | project_id is absent or not a UUID (missing_required / wrong_type), or name is outside 2-100 characters (out_of_range). Field detail is in errors[]. |
401 | Unauthorized — missing or invalid API key. |
404 | Workspace template not found (workspace_template_not_found), or the project_id does not exist in this workspace (project_not_found). |
429 | Too Many Requests. |
500 | Internal Server Error — an unexpected error occurred on our side. |
