Example feeds

Read one published .env.example

Returns the names and metadata of the variables in one published version, addressed by its label (v7) or its id.

GET/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>'
Try itGEThttps://api.envless.cloud/example/{workspaceSlug}/{productSlug}/{projectSlug}/{environmentSlug}/versions/{versionId}

No authentication: this endpoint is public.

Path parameters
Query parameters

Path parameters

  • workspaceSlugstringrequired

    Workspace slug.

  • productSlugstringrequired

    Product slug. A private product never serves a feed.

  • projectSlugstringrequired

    Project slug.

  • environmentSlugstringrequired

    Environment slug. The environment must have its example link turned on.

  • versionIdstringrequired

    A version label such as v7, or a version id.

Query parameters

  • formatenum<string>

    Forces a rendering instead of reading Accept: json for the JSON envelope, env for the .env.example text, html for the browser redirect.

    Options: "json", "env", "html"

  • includeenum<string>

    document adds the rendered .env.example text and the skipped count to the JSON body.

    Options: "document"

  • downloadenum<string>

    1 adds Content-Disposition: attachment; filename=".env.example" to the env rendering.

    Options: "1"

Responses

200OK

Read one published .env.example succeeded.

  • successbooleanrequired
  • codeintegerrequired

    The HTTP status of this response, repeated in the body.

  • messagestringrequired
  • errornullrequired
  • dataobjectrequired

    Variable names and metadata of one environment, live or as published. Never a value and never ciphertext.

    Show child attributesHide child attributes
    • formatstringrequired
    • generatedAtstringrequireddate-time
    • workspaceobjectrequired
      Show child attributesHide child attributes
      • slugstringrequired
    • productobjectrequired
      Show child attributesHide child attributes
      • slugstringrequired
    • projectobjectrequired
      Show child attributesHide child attributes
      • slugstringrequired
    • environmentobjectrequired
      Show child attributesHide child attributes
      • slugstringrequired
    • sourceobjectrequired
      Show child attributesHide child attributes
      • kindenum<string>required

        Options: "live", "version"

      • idstring | nullrequired
      • labelstring | nullrequired
      • variableCountintegerrequired
      • updatedAtstring | nullrequireddate-time
      • selfstringrequireduri
    • valuesobjectrequired
      Show child attributesHide child attributes
      • includedbooleanrequired
      • reasonstringrequired
    • truncatedbooleanrequired

      True when the environment holds more variables than the feed lists.

    • variablesobject[]required
      Show child attributesHide child attributes
      • namestringrequired
      • valuestringrequired
      • typeenum<string>required

        Options: "string", "number", "boolean"

      • visibilityenum<string>required

        Options: "server", "client"

      • requiredbooleanrequired
      • secretbooleanrequired
    • linksobjectrequired
      Show child attributesHide child attributes
      • selfstringrequireduri
      • currentstringrequireduri
      • lateststringrequireduri
      • versionsstringrequireduri
      • envstringrequireduri
      • jsonstringrequireduri
    • documentstring

      The rendered .env.example text, only with ?include=document.

    • skippedinteger

      Variables left out of document, only with ?include=document.

  • _reqobject
    Show child attributesHide child attributes
    • reqIdstring
    • resTimeinteger | 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.

  • successbooleanrequired
  • codeintegerrequired

    The HTTP status of this response, repeated in the body.

  • messagestringrequired
  • errorobjectrequired

    Machine-readable failure detail. Null on success.

    Show child attributesHide child attributes
    • codeenum<string>required

      Stable 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"

    • resourcestring

      The resource or scope the failure relates to.

    • fieldstring

      The request field that caused the failure.

  • dataobject | nullrequired

    Null on most failures. A plan limit carries { limit, current }.

  • _reqobject
    Show child attributesHide child attributes
    • reqIdstring
    • resTimeinteger | 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.