Projects

Envless.projects.duplicate

Deep copy a project into the same product

def duplicate(slug, product: nil, timeout: nil)

Copies a project, every environment under it and every variable including the stored ciphertext, in one transaction. There is no request body and no target product: the copy always lands beside the source. Verbatim ciphertext means the copy decrypts with the same passphrase as the original.

The copy is named <name> (Copy) truncated to 50 characters, with a slug derived from that name and suffixed -2, -3 and so on until it is free inside the product, falling back to a random six character suffix after enough collisions. Read the returned slug rather than guessing it. The workspace project allowance is checked before any copying starts, so a 402 or 409 leaves nothing behind.

Example

ruby
require "envless/sdk"

copy = Envless.projects.duplicate("api", product: "billing")

puts copy[:slug]

Parameters

ParameterTypeRequiredDescription
slugStringYesSlug or uniqueId of the project to copy.
product:String | SymbolNoProduct slug used to disambiguate an ambiguous source project slug.
timeout:Integer | Float | RationalNoSeconds each attempt of this call may take, redirects and the response body included, before it raises Envless::NetworkError with timeout? set. Overrides the client's timeout for this call, and 0 turns the limit off.

Returns

project_resource for the new copy, carrying its generated name and slug.

Worth knowing

  • Needs both projects:write and variables:write. A key holding only one of them fails with 403 auth.scope_missing.
  • Project restricted keys are refused outright with 403 auth.key_project_restricted, because the new project could not be covered by the allowlist.
  • Version history is not copied, only the current state of each environment.

Required scopes

projects:write and variables:write

Underlying endpoint

POST /projects/{slug}/duplicate

Request and response schema, every error code, and a live playground.

In TypeScript

envless.projects.duplicate()

The same method in @goenvless/sdk, with the same request, retries and errors.