> ## Documentation Index
> Fetch the complete documentation index at: https://prefect-bd373955-pytest-markdown.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Set and get variables

> Prefect variables are dynamically-named, mutable string values.

Variables enable you to store and reuse non-sensitive bits of data, such as configuration information.

Variables are:

* named, mutable values of any JSON type
* scoped to a Prefect server instance or a single workspace in Prefect Cloud
* meant for values with infrequent writes and frequent reads (but you can create or
  modify variables at any time)
* cacheable for quicker retrieval
* most commonly loaded during flow runtime (but you can load them in other contexts to pass
  configuration information to Prefect configuration files, such as deployment steps)

<Warning>
  **Variables are not Encrypted**

  We do not recommend using variables to store sensitive information. Instead, use
  [Secret blocks](https://docs.prefect.io/develop/blocks/#prefect-built-in-blocks) to store and access
  sensitive information.
</Warning>

## Manage variables

Create, read, edit, and delete variables through the Prefect UI, API, and CLI.
Names must adhere to these traditional variable naming conventions:

* Have no more than 255 characters
* Only contain lowercase alphanumeric characters (\[a-z], \[0-9]) or underscores (\_). Spaces are not allowed.
* Be unique

Values must have less than or equal to 5000 characters.

Optionally, you can add tags to the variable.

### Through the Prefect UI

View all the variables in your Prefect server instance or Prefect Cloud workspace
in the **Variables** page of the Prefect UI. Both the name and value of all variables
are visible to anyone with access to the server or workspace.

To create a new variable:

1. Select the **+** button next to the header of the **Variables** page.
2. Enter the name and value of the variable.

![variables-ui](https://mintlify.s3-us-west-1.amazonaws.com/prefect-bd373955-pytest-markdown/3.0rc/img/ui/variables-ui.png)

### Through the REST API

You can create and delete variables through the REST API. You can also set and get variables through the API
with either the variable name or ID.

See the [REST reference](https://app.prefect.cloud/api/docs#tag/Variables) for more information.

### Through the CLI

* `prefect variable set` creates or updates a variable.
* `prefect variable get` retrieves a variable's value.
* `prefect variable unset` deletes a variable.
* `prefect variable ls` lists all variables.
* `prefect variable inspect` shows a variable's details.
*

## Accessing variables

In addition to the UI and API, you can reference variables in code and in certain Prefect configuration files.

### In Python code

You can interact with variables through the Python SDK using the `get`, `set`, and `unset` methods.

Outside of a `flow` or `task`, these methods are always invoked asynchronously.

#### In an asynchronous context:

```python
from prefect import flow
from prefect.variables import Variable

@flow
async def my_async_flow():
    # set a variable
    answer = await Variable.set(name="the_answer", value="42")
    print(answer) # 42
    
    # get a variable
    answer = await Variable.get("the_answer")
    print(answer) # 42
    
    # overwrite an existing variable
    answer = await Variable.set(name="the_answer", value="43", overwrite=True)
    print(answer) # 43
    
    # unset a variable
    await Variable.unset("the_answer")
    
    # get a variable that doesn't exist
    answer = await Variable.get("not_the_answer")
    print(answer) # None
    
    # get a variable that doesn't exist with a default
    answer = await Variable.get("not_the_answer", default="42")
    print(answer) # 42
```

While inside a `flow` or `task`, variables should be invoked synchronously or asynchronously
depending on whether the current context is synchronous or asynchronous.

#### In a synchronous context:

```python
from prefect import flow
from prefect.variables import Variable

@flow
def my_sync_flow():
    # set a variable
    answer = Variable.set(name="the_answer", value="42")
    print(answer) # 42
    
    # get a variable
    answer = Variable.get("the_answer")
    print(answer) # 42
    
    # overwrite an existing variable
    answer = Variable.set(name="the_answer", value="43", overwrite=True)
    print(answer) # 43
    
    # unset a variable
    Variable.unset("the_answer")
    
    # get a variable that doesn't exist
    answer = Variable.get("not_the_answer")
    print(answer) # None
    
    # get a variable that doesn't exist with a default
    answer = Variable.get("not_the_answer", default="42")
    print(answer) # 42
```

### In `prefect.yaml` deployment steps

In `.yaml` files, variables are denoted by quotes and double curly brackets, such as:
`"{{ prefect.variables.my_variable }}"`. Use variables to templatize deployment steps by
referencing them in the `prefect.yaml` file that creates the deployments.

For example, you can pass in a variable to specify a branch for a git repo in a deployment `pull` step:

```
pull:
- prefect.deployments.steps.git_clone:
    repository: https://github.com/PrefectHQ/hello-projects.git
    branch: "{{ prefect.variables.deployment_branch }}"
```

The `deployment_branch` variable is evaluated at runtime for the deployed flow,
allowing changes to variables used in a pull action without updating a deployment directly.
