/example/{workspaceSlug}/{productSlug}/{projectSlug}/{environmentSlug}/versions/{versionId}Returns the names and metadata of the variables in one published version, addressed by its label (v7) or its id. The feed never carries a value or ciphertext.
A browser is redirected to the readable page in the dashboard; Accept: text/plain or ?format=env returns the .env.example text; anything else gets the JSON envelope. Every success carries an ETag, Cache-Control: public with a short max-age, and Vary: Accept; send the ETag back as If-None-Match to get a 304.
No API key: the feed is public by design and rate limited to 600 requests a minute per client. On a verified custom domain the same feed answers without the workspace slug, for example https://vars.acme.com/example/{productSlug}/{projectSlug}/{environmentSlug}/versions/v7.
No authentication: this endpoint is public.
curl --request GET \
--url 'https://api.envless.cloud/example/<workspaceSlug>/<productSlug>/<projectSlug>/<environmentSlug>/versions/<versionId>'https://api.envless.cloud/example/{workspaceSlug}/{productSlug}/{projectSlug}/{environmentSlug}/versions/{versionId}Response headers
Path parameters
workspaceSlugstringrequiredWorkspace slug.
productSlugstringrequiredProduct slug. A private product never serves a feed.
projectSlugstringrequiredProject slug.
environmentSlugstringrequiredEnvironment slug. The environment must have its example link turned on.
versionIdstringrequiredA version label such as
v7, or a version id.
Query parameters
formatenum<string>Forces a rendering instead of reading
Accept:jsonfor the JSON envelope,envfor the.env.exampletext,htmlfor the browser redirect.Options:
"json","env","html"includeenum<string>documentadds the rendered.env.exampletext and theskippedcount to the JSON body.Options:
"document"downloadenum<string>1addsContent-Disposition: attachment; filename=".env.example"to theenvrendering.Options:
"1"
Responses
200OK
Read one published .env.example succeeded.
successbooleanrequiredcodeintegerrequiredThe HTTP status of this response, repeated in the body.
messagestringrequirederrornullrequireddataobjectrequiredVariable names and metadata of one environment, live or as published. Never a value and never ciphertext.
Show child attributesHide child attributes
formatstringrequiredgeneratedAtstringrequireddate-timeworkspaceobjectrequiredShow child attributesHide child attributes
slugstringrequired
productobjectrequiredShow child attributesHide child attributes
slugstringrequired
projectobjectrequiredShow child attributesHide child attributes
slugstringrequired
environmentobjectrequiredShow child attributesHide child attributes
slugstringrequired
sourceobjectrequiredShow child attributesHide child attributes
kindenum<string>requiredOptions:
"live","version"idstring | nullrequiredlabelstring | nullrequiredvariableCountintegerrequiredupdatedAtstring | nullrequireddate-timeselfstringrequireduri
valuesobjectrequiredShow child attributesHide child attributes
includedbooleanrequiredreasonstringrequired
truncatedbooleanrequiredTrue when the environment holds more variables than the feed lists.
variablesobject[]requiredShow child attributesHide child attributes
namestringrequiredvaluestringrequiredtypeenum<string>requiredOptions:
"string","number","boolean"visibilityenum<string>requiredOptions:
"server","client"requiredbooleanrequiredsecretbooleanrequired
linksobjectrequiredShow child attributesHide child attributes
selfstringrequireduricurrentstringrequiredurilateststringrequireduriversionsstringrequiredurienvstringrequiredurijsonstringrequireduri
documentstringThe rendered
.env.exampletext, only with?include=document.skippedintegerVariables left out of
document, only with?include=document.
_reqobjectShow child attributesHide child attributes
reqIdstringresTimeinteger | null
{
"success": true,
"code": 200,
"message": "OK",
"error": null,
"data": {
"format": "envless.env-example/v1",
"generatedAt": "2026-05-30T10:14:22.000Z",
"workspace": {
"slug": "<string>"
},
"product": {
"slug": "<string>"
},
"project": {
"slug": "<string>"
},
"environment": {
"slug": "<string>"
},
"source": {
"kind": "live",
"id": "<string>",
"label": "<string>",
"variableCount": 1,
"updatedAt": "2026-05-30T10:14:22.000Z",
"self": "https://example.com"
},
"values": {
"included": false,
"reason": "This feed serves key names and metadata only. No values, no ciphertext."
},
"truncated": true,
"variables": [
{
"name": "STRIPE_SECRET_KEY",
"value": "",
"type": "string",
"visibility": "server",
"required": true,
"secret": true
}
],
"links": {
"self": "https://example.com",
"current": "https://example.com",
"latest": "https://example.com",
"versions": "https://example.com",
"env": "https://example.com",
"json": "https://example.com"
},
"document": "<string>",
"skipped": 1
},
"_req": {
"reqId": "<string>",
"resTime": 1
}
}302Found
A browser, meaning an Accept header that prefers text/html or ?format=html, is redirected to the readable page in the dashboard.
304Not Modified
If-None-Match matched the current ETag, so there is no body.
Error envelope
Every failure below returns the same shape with success: false; branch on error.code, never on message.
successbooleanrequiredcodeintegerrequiredThe HTTP status of this response, repeated in the body.
messagestringrequirederrorobjectrequiredMachine-readable failure detail. Null on success.
Show child attributesHide child attributes
codeenum<string>requiredStable error code. Branch on this, never on
message.Options:
"auth.api_key_required","auth.api_key_not_found","auth.api_key_user_missing","auth.api_key_owner_not_member","auth.scope_missing","auth.scope_ceiling_exceeded","auth.key_project_restricted","auth.product_restricted","auth.permission_denied","auth.self_mutation_forbidden","auth.step_up_required","auth.step_up_fresh_required","auth.cli_token_not_accepted","auth.two_factor_required","auth.workspace_two_factor_required","auth.two_factor_invalid","auth.two_factor_replayed","auth.two_factor_locked","auth.two_factor_not_enabled","auth.two_factor_already_enabled","request.body_must_be_json","request.body_invalid","request.body_too_large","request.rate_limited","request.invalid_pagination","workspace.not_found","workspace.slug_conflict","workspace.limit_reached","workspace.delete_last","workspace.delete_too_early","workspace.delete_has_projects","domain.not_configured","domain.not_found","domain.invalid","domain.taken","domain.attempt_limit","product.not_found","product.slug_conflict","product.locked","project.not_found","project.ambiguous_product","project.slug_conflict","environment.not_found","environment.slug_conflict","environment.expose_disabled","environment.expose_private_product","variable.not_found","variable.name_conflict","variable.ciphertext_invalid","variable.baseline_drifted","version.not_found","member.not_found","member.already_exists","member.self_invite","member.self_mutation","member.owner_immutable","member.owner_cannot_leave","member.seat_limit","invite.already_pending","role.owner_not_assignable","role.limit_reached","role.immutable","role.in_use","invite.not_found","invite.expired","role.not_found","role.name_conflict","key.not_found","key.limit_reached","webhook.not_found","webhook.delivery_not_found","plan.limit_reached","plan.upgrade_required","request.not_found","request.method_not_allowed","request.conflict","auth.unauthorized","auth.forbidden","request.invalid","server.error"resourcestringThe resource or scope the failure relates to.
fieldstringThe request field that caused the failure.
dataobject | nullrequiredNull on most failures. A plan limit carries
{ limit, current }._reqobjectShow child attributesHide child attributes
reqIdstringresTimeinteger | null
{
"success": false,
"code": 402,
"message": "Something went wrong.",
"error": {
"code": "auth.api_key_required",
"resource": "<string>",
"field": "<string>"
},
"data": {},
"_req": {
"reqId": "<string>",
"resTime": 1
}
}402Payment Required
plan.upgrade_required - the version exists but is older than the workspace plan keeps readable; error.resource is version.
404Not Found
request.not_found - the URL does not resolve: an unknown workspace, product, project or environment, a private product, or an environment without an example link all answer this same 404, and so does a version that does not exist in this environment.
429Too Many Requests
request.rate_limited - the client sent more than 600 feed requests in a minute; retry after the Retry-After seconds (60).
500Internal Server Error
server.error - an unexpected error; retry with backoff.
503Service Unavailable
server.error - the API is in maintenance mode or is missing its configuration; retry with backoff.