Apply a sandbox version back onto the production pipe it was cloned from with the deployRepoVersion mutation, and follow the operation until it finishes.
BETA - This API is currently in beta testing. If you encounter issues or have feedback, contact our support team.
Before You Begin
🔗 Use the GraphQL Playground to execute the queries in this guide.
➡️ New to GraphQL? Learn how to navigate the Playground with our Playground Basics Guide.
Prerequisites
- Authentication: Use a Service Account token (Personal Access Tokens are deprecated).
- Permissions: Your token must have
Admin(manage) permission on the production pipe. Administering the sandbox clone is not enough. - Version ID: The ID of the sandbox version to deploy. You get it from Open a Pipe Sandbox Version as
repoVersion.id. - A snapshot on both sides: both the production pipe and the sandbox clone need an uploaded snapshot, since the deploy compares the two checkpoints to work out what changed. See Create a pipe snapshot.
Step 1: Deploy the Sandbox
A deploy takes the structure you edited on the sandbox clone and applies it to the production pipe: phases, fields, automations and the rest of the versioned structure.
You pass only the version. The version already identifies both pipes, so the two checkpoints are resolved from it rather than supplied by you: the latest uploaded snapshot of each side.
mutation {
deployRepoVersion(input: {
repoVersionId: 77
}) {
operation {
id
kind
status
error
createdAt
}
}
}
Input Explanation:
repoVersionId(required): The ID of the sandbox version to deploy.
Sample Response:
The deploy is asynchronous, so the mutation records the operation and returns immediately:
{
"data": {
"deployRepoVersion": {
"operation": {
"id": "912",
"kind": "DEPLOY",
"status": "PENDING",
"error": null,
"createdAt": "2026-06-25T14:12:44Z"
}
}
}
}
Step 2: Follow the Operation Until It Finishes
The returned operation is the record of the deploy, and its status is where progress lives. Read it back from the production pipe's operations list:
query {
pipe(id: 123) {
operations(kind: [DEPLOY]) {
id
status
error
createdAt
updatedAt
}
}
}
status tells you where the deploy is:
PENDING: recorded, the work has not started.RUNNING: applying the sandbox structure to the production pipe.SUCCEEDED: the production pipe now carries the sandbox's structure.FAILED: the deploy did not complete, anderrorexplains why.
See Read a Pipe's Snapshots and Operations for the full field reference.
Response Fields
operation.id: The deploy operation's ID.operation.kind: AlwaysDEPLOYfor this mutation.operation.status: State of the deploy. It isPENDINGin the mutation's own response, since the work is queued rather than done.operation.error: Why the deploy failed.nullunlessstatusisFAILED. Reading it requiresAdmin(manage) permission on the pipe.operation.sourceSnapshot: Alwaysnullfor a deploy. The field resolves within the operation's target pipe, and a deploy's source snapshot belongs to the sandbox clone instead.
Key Notes
- The production pipe is the authorization target: permission is checked on the pipe being changed, not on the sandbox. A token that administers only the clone receives a
PERMISSION_DENIEDerror. - One structural operation per pipe at a time: if a restore or another deploy is already in flight for either the production pipe or its sandbox, the request is refused with a
DEPLOY_IN_PROGRESSerror. Checkoperations(status: [PENDING, RUNNING])first, or retry once the in-flight operation finishes. - A version deploys once: a version that has already been deployed is refused with a
REPO_VERSION_ALREADY_PUBLISHEDerror. Open a fresh sandbox instead. - Both sides need a checkpoint: if either the production pipe or the sandbox clone has no uploaded snapshot, the request is refused with an
INVALID_INPUTerror namingrepoVersionId. The same error covers a version whose sandbox pipe no longer exists. - Snapshots are blocked while a deploy is in flight:
createRepoSnapshoton the pipe is refused for as long as the deploy isPENDINGorRUNNING, since the structure is being rewritten underneath it. - What the deploy applies is fixed when the mutation is accepted: the two checkpoints are resolved once, at that moment. A snapshot uploaded afterwards does not change what the deploy applies.
- Version not found: an invalid or non-existent
repoVersionIdreturns aRECORD_NOT_FOUNDerror. - Gradual rollout: this operation is being rolled out behind the same feature flag as the sandbox itself and may not yet be available for every organization. When the flag is off, the mutation is absent from the schema and the request fails with an error naming
deployRepoVersion.

