Create Environment Transfer

LLM-friendly URL
POST
https://api.luzmo.com/0.1.0/environmenttransfer
API call form
Examples

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.

  1. Upload the artifact to get an upload_id , as shown below.

  2. 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.

  3. 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.

  4. 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.

bash
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.

Request parametersResponse schema
id UUID

ID of the job. Use it to retrieve the job .

type STRING

Whether the job is an export or an import.

mode STRING

Whether the import plans or applies. Only present for an import.

name STRING

The name you gave the export, or null for an import.

status STRING

Status of the job:

  • running : the job is waiting to start or in progress. result is null .

  • done : the job finished. result holds its outcome.

  • error : the job failed. error holds a message you can show to the user.

result OBJECT
Schema
download_url URI
expires_at DATETIME
summary OBJECT
not_exported ARRAY[OBJECT]
error STRING

A message you can show to the user when status is error , otherwise null . It is always This environment transfer failed unexpectedly. : the job does not return the internal cause of the failure. A failed import apply writes nothing.

created_at DATETIME

When the job was created, as an ISO 8601 timestamp.

created_by OBJECT

The user who created the job, or null when that user no longer exists.

id UUID
name STRING
email STRING
Can be executed by:
Organization Owner
Can be associated to:
Did this page help you?
Yes No
Language
Shell
Node
Java
.NET
Python
PHP
Install
npm install @luzmo/nodejs-sdk
Example Response
200
400
500
{
  "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"
  }
}