def get(slug, product: nil, timeout: nil)def get: (
String slug,
?product: (String | Symbol)?,
?timeout: seconds?
) -> project_resourceReads a single project. A UUID shaped slug is resolved as a uniqueId first and only then as a slug, which is why ids never need a product hint.
Slugs do need one. Because slugs are unique per product, a slug that exists in two products fails with 409 project.ambiguous_product and you must retry with product:. Projects outside a restricted key allowlist, and projects inside private products with no grant, come back as 404 rather than 403, so absence and denial look identical here.
Example
ruby
require "envless/sdk"
project = Envless.projects.get("api", product: "billing")
puts "#{project[:id]} #{project.dig(:product, :name)}"Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
slug | String | Yes | Project slug, or the project uniqueId. |
product: | String | Symbol | No | Product slug used to disambiguate a project slug that exists in more than one product. |
timeout: | Integer | Float | Rational | No | Seconds 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 including the product Hash the project belongs to.
Worth knowing
product:is matched against product slugs only. A product uniqueId there yields 404.- A missing project is 404
project.not_foundand an ambiguous slug is 409project.ambiguous_product. - A project sitting beyond the plan allowance fails with 402 and stays locked until the workspace upgrades.
Required scopes
projects:read
Underlying endpoint
GET /projects/{slug}
Request and response schema, every error code, and a live playground.
In TypeScript
envless.projects.get()
The same method in @goenvless/sdk, with the same request, retries and errors.