Use a Workspace Template
"Using" a workspace template means duplicating it into a project: the copy becomes a regular design — with all the template's formats, layers and settings — that you can generate from like any other. The original template is untouched and can be instantiated any number of times. Typical uses: workspace provisioning, onboarding a client with a standard set of designs, stamping out campaign starting points.
How it works
The flow is asynchronous — the copy is built in the background. Two calls do the work (steps 3 and 4); the others are lookups you may already have done.
GET /workspace-templatesList your workspace templates and keep the id of the one to instantiate. Filter with category_id or type if the workspace is large.
GET /projectsThe copy must land in a project — that is what makes it a design. Keep the project's id.
POST /workspace-templates/{companyTemplateId}/useSend the project_id (and an optional name). The response carries only a duplication_request_id — the design does not exist yet.
GET /design-duplication-requests/{duplicateRequestId}Repeat until status is COMPLETED; each entry of designs then carries the new design's target_design_id. ERROR means the duplication failed.
GET /designs/{designId}The copy is a regular design: fetch its formats and elements, generate from it, or find it in its project's listing.
Duplicate workspace template
This operation is asynchronous — the response contains only a duplication_request_id. Use this ID to track progress with the polling endpoint below.
Where to find companyTemplateId
Get your companyTemplateId from GET /workspace-templates, or from the Workspace Templates section in the Abyssale dashboard.
Sample duplicate request
curl -X POST \
-H "x-api-key: {YOUR-API-KEY}" \
-H "Content-Type: application/json" \
-d '{"project_id": "9d1f2b7c-5a44-4c3e-9f21-0b8e6d4a1c73", "name": "Holiday campaign"}' \
https://api.abyssale.com/workspace-templates/{companyTemplateId}/useimport abyssale from '@abyssale/sdk';
// Set ABYSSALE_API_KEY env var before running
const { data, error } = await abyssale.duplicateWorkspaceTemplate('{companyTemplateId}', {
project_id: '9d1f2b7c-5a44-4c3e-9f21-0b8e6d4a1c73',
name: 'Holiday campaign',
});
if (error) throw new Error(error.message);
// Polls until the duplication reaches COMPLETED or ERROR — check which
const result = await abyssale.waitForDuplicationRequest(data.duplication_request_id);
if (result.status === 'ERROR') throw new Error('Duplication failed');
console.log(result.designs.map((d) => d.target_design_id));from abyssale import Abyssale
# Set ABYSSALE_API_KEY env var before running
client = Abyssale()
request = client.duplicate_workspace_template("{companyTemplateId}", {
"project_id": "9d1f2b7c-5a44-4c3e-9f21-0b8e6d4a1c73",
"name": "Holiday campaign",
})
# Polls until the duplication reaches COMPLETED or ERROR — check which
result = client.wait_for_duplication_request(request.duplication_request_id)
if result.status == "ERROR":
raise RuntimeError("Duplication failed")
print([d.target_design_id for d in result.designs])Duplicate path parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
companyTemplateId | string (uuid) | Yes | Unique identifier of the workspace template to duplicate. |
Request body
| Field | Type | Required | Description |
|---|---|---|---|
project_id | string (uuid) | Yes | Target project where the template will be duplicated. |
name | string | No | Custom name for the duplicated design. Between 2 and 100 characters. Defaults to the template name if omitted. |
Duplicate response
| Field | Type | Description |
|---|---|---|
duplication_request_id | string (uuid) | Unique identifier for tracking the duplication process. Pass this to the polling endpoint. |
Duplicate response example
{
"duplication_request_id": "40c32a4e-4869-11f0-96f2-0a00d9eb8f78"
}Get duplication request status
Requests expire after 7 days
Duplication requests are available for 7 days after creation.
Sample status request
curl -H "x-api-key: {YOUR-API-KEY}" \
https://api.abyssale.com/design-duplication-requests/{duplicateRequestId}// One check. To wait for the result, use waitForDuplicationRequest instead
const { data, error } = await abyssale.getDuplicationRequest('{duplicateRequestId}');
if (error) console.error(error);
else console.log(data.status);# One check. To wait for the result, use wait_for_duplication_request instead
status = client.get_duplication_request("{duplicateRequestId}")
print(status.status)Status path parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
duplicateRequestId | string (uuid) | Yes | Unique identifier of the duplication request returned by the duplicate endpoint. |
Status response
| Field | Type | Description |
|---|---|---|
request_id | string (uuid) | Unique identifier of this duplication request. |
status | string | Current status of the duplication. See status values below. |
created_at_ts | integer | Unix timestamp when the request was created. |
completed_at_ts | integer | null | Unix timestamp when duplication completed, or null if still in progress. |
errored_at_ts | integer | null | Unix timestamp when duplication failed, or null if not failed. |
target_project | object | The project the template was duplicated into (id, name, created_at_ts). |
designs | array | List of duplicated designs. Each item contains original_design_id, target_design_id, and target_design_name. Empty until duplication completes. |
Status values:
| Status | Meaning |
|---|---|
INIT | Request received, not yet started. |
IN_PROGRESS | Duplication is running. |
COMPLETED | Duplication finished successfully. designs is populated. |
ERROR | Duplication failed. Check errored_at_ts. |
Status response example
{
"request_id": "40c32a4e-4869-11f0-96f2-0a00d9eb8f78",
"status": "COMPLETED",
"created_at_ts": 1749827734,
"completed_at_ts": 1749827736,
"errored_at_ts": null,
"target_project": {
"id": "d59adee9-4867-11f0-96f2-0a00d9eb8f78",
"name": "HTML5 Tests",
"created_at_ts": 1749827125
},
"designs": [
{
"original_design_id": "0c967bd0-4137-4690-ad70-249aa021c68b",
"target_design_id": "afb1a61a-6c50-4bc3-a49b-3381822d4e81",
"target_design_name": "Holiday Campaign Template"
}
]
}Errors
| Status | id | When |
|---|---|---|
404 | workspace_template_not_found | The companyTemplateId doesn't name a workspace template in your workspace. |
404 | project_not_found | The project_id doesn't name one of your projects. |
404 | duplication_request_not_found | Unknown duplicateRequestId (polling endpoint). |
410 | duplication_request_gone | The request is older than the 7-day retention. Stop polling — it will never resolve. |
Related
- Workspace Templates — list templates and categories
- Designs vs Workspace Templates — the model behind the split
- Projects — list destination projects
- Design Details — read the duplicated design
- Node.js SDK · Python SDK — every method, config, retries and the polling helpers
