/** @return ProjectResource */
public function duplicate(
string $slug,
?string $product = null,
int|float|null $timeout = null,
): arrayCopies 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
use Envless\Envless;
$envless = new Envless();
$copy = $envless->projects->duplicate('api', product: 'billing');
echo $copy['slug'], PHP_EOL;Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
$slug | string | Yes | Slug or uniqueId of the project to copy. |
$product | string | No | Product slug used to disambiguate an ambiguous source project slug. |
$timeout | int|float | No | Seconds each attempt of this call may take, the response body included, before it throws Envless\Exception\NetworkException with isTimeout() true. Overrides the client's timeout for this call, and 0 turns the limit off. |
Returns
ProjectResource 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.