Start an environment transfer job. An environment transfer copies dashboards, datasets and the resources they depend on from one Luzmo environment to another: you export them into an artifact in one environment, and import that artifact into another.
Only an Organization Owner can start a transfer, and only after Luzmo has enabled environment transfer for the organization. Otherwise the call returns 403 . Contact your customer success manager to enable it.
Every transfer runs as a job. This call returns the job right away, with status running . Retrieve the job with its id until status is done or error .
An organization can run one transfer at a time: an export, an import plan or an import apply. While one is running, a new one returns 400 with the message There is already an environment transfer in progress for this organization. Wait until the running job is finished, then try again.
Export
Set type to export and select the resources to export in resources . The resources they depend on are exported too. When the job is done, its result holds a download_url for the artifact and expires_at , the time the link stops working: 7 days after the export.
The selection is checked when the export job runs, not when you create it. The job ends with status error when an ID in ids or collection_id is not a valid ID, when tag or collection_id is set on a resource type other than dashboards and datasets, when modified_since is not a valid time, or when the selection matches no resource at all.
Import
An import runs in two steps: you plan it, then you apply the reviewed plan.
Upload the artifact to get an upload_id , as shown below.
Plan the import: set type to import and mode to plan . The plan writes nothing. When the job is done, result.plan lists what the import would create, update, leave unchanged, what needs your input, and what is blocked. result.plan_hash identifies this plan.
If result.connections holds a connection with status needs_input , map it onto a connection in this environment with connection_mapping , and plan again. A new mapping or conflict_strategy gives a new plan and a new plan_hash . A mapping is not remembered, so send it again with every later import too.
Apply the import: set mode to apply , and pass the same artifact, conflict_strategy and connection_mapping as the reviewed plan, and its plan_hash . The apply writes the resources the plan creates or updates in one transaction: if writing any of them fails, none of them is written. Resources the plan leaves unchanged or blocks are not written, and that does not fail the apply.
An artifact never holds users, groups or who a resource is shared with, so an import does not recreate any sharing. A resource the import creates gets the same access as one you create yourself: you, the user who applies the import, own it with full rights. Resources that belong to the organization, such as themes, belong to your organization. A resource the import updates keeps its owner and the users and groups it is shared with. After an import, share the new dashboards and datasets with the users and groups of this environment, for example with Associate Dashboard and Associate Dataset .
An import reads the artifact from either upload_id or artifact_url . Set exactly one of them: a request with both, or with neither, returns 400 .
To get an upload_id , send the artifact file to the upload endpoint of the environment you import into, with the create action and properties.type set to environment-transfer-artifact . Set LUZMO_API_HOST to the API host of that environment: https://api.luzmo.com (EU), https://api.us.luzmo.com (US), or your VPC-specific API host.
curl $LUZMO_API_HOST/0.1.0/upload \
-F version=0.1.0 \
-F action=create \
-F key=$LUZMO_API_KEY \
-F token=$LUZMO_API_TOKEN \
-F properties.type=environment-transfer-artifact \
-F file=@environment-transfer.luzmo The response is { "upload_id": "<upload ID>" } . Use the same upload_id for every plan and for the apply. Uploading does not start a transfer, so it can run while another transfer is in progress.
The same access rules apply to the upload: only an Organization Owner of an organization with environment transfer enabled can upload, otherwise the upload returns 403 . An upload can be used by your organization only, and expires after 7 days. A file that is not an environment transfer artifact, or is larger than 200 MB, returns 400 . Creating an import with an upload_id that is unknown, expired or of another organization returns 404 with the message Environment transfer upload not found or expired. Upload the artifact again.
npm install @luzmo/nodejs-sdk{
"id": "6f1c2a4e-8d3b-4f7a-9c21-3b5e7d9a1f04",
"type": "export",
"name": "Sales dashboards",
"status": "running",
"result": null,
"error": null,
"created_at": "2026-10-30T10:14:52.000Z",
"created_by": {
"id": "9c3e5a7b-1d2f-4e6a-8b0c-4d6f8a0b2c35",
"name": "Alex Smith",
"email": "alex@example.com"
}
}