2022-10-06 09:15:30 +00:00
---
title: "Runtime Config"
description: "Nuxt provides a runtime config API to expose configuration within your application."
---
2021-11-10 12:40:02 +00:00
# Runtime Config
2022-07-21 09:08:37 +00:00
Nuxt provides a runtime config API to expose configuration within your application and server routes, with the ability to update it at runtime by setting environment variables.
2021-11-10 12:40:02 +00:00
2022-08-13 07:27:04 +00:00
## Exposing Runtime Config
2021-11-10 12:40:02 +00:00
2022-11-16 10:04:28 +00:00
To expose config and environment variables to the rest of your app, you will need to define runtime configuration in your `nuxt.config` file, using the [`runtimeConfig` option ](/docs/guide/directory-structure/nuxt.config#runtimeconfig ).
2021-11-10 12:40:02 +00:00
**Example:**
```ts [nuxt.config.ts]
export default defineNuxtConfig({
2022-04-12 08:12:33 +00:00
runtimeConfig: {
2022-04-12 10:04:15 +00:00
// The private keys which are only available within server-side
apiSecret: '123',
// Keys within public, will be also exposed to the client-side
2022-04-12 08:12:33 +00:00
public: {
2022-04-12 10:04:15 +00:00
apiBase: '/api'
2022-04-12 08:12:33 +00:00
}
2022-04-12 10:04:15 +00:00
}
2021-11-10 12:40:02 +00:00
})
```
2022-04-12 10:04:15 +00:00
When adding `apiBase` to the `runtimeConfig.public` , Nuxt adds it to each page payload. We can universally access `apiBase` in both server and browser.
```js
const runtimeConfig = useRuntimeConfig()
console.log(runtimeConfig.apiSecret)
console.log(runtimeConfig.public.apiBase)
```
2021-11-10 12:40:02 +00:00
2022-10-13 06:51:04 +00:00
::alert{type=info}
When using Options API the public runtime config is available via `this.$config.public` .
2022-10-13 08:47:24 +00:00
::
2022-10-13 06:51:04 +00:00
2022-10-24 08:43:26 +00:00
### Serialization
Your runtime config will be serialized before being passed to Nitro. This means that anything that cannot be serialized and then deserialized (such as functions, Sets, Maps, and so on), should not be set in your `nuxt.config` .
Instead of passing non-serializable objects or functions into your application from your `nuxt.config` , you can place this code in a Nuxt or Nitro plugin or middleware.
2021-11-10 12:40:02 +00:00
### Environment Variables
2021-11-21 12:31:44 +00:00
The most common way to provide configuration is by using [Environment Variables ](https://medium.com/chingu/an-introduction-to-environment-variables-and-how-to-use-them-f602f66d15fa ).
2022-04-29 18:09:12 +00:00
2023-02-01 11:53:04 +00:00
::alert{type=warning}
Nuxi CLI has built-in support for reading your `.env` file in development, build and generate. But when you run your built server, **your `.env` file will not be read** .
2021-11-10 12:40:02 +00:00
2023-02-01 11:53:04 +00:00
:ReadMore{link="/docs/guide/directory-structure/env"}
::
2021-11-10 12:40:02 +00:00
2023-02-01 11:53:04 +00:00
Runtime config values are automatically replaced by matching environment variables at runtime. There are two key requirements.
2022-07-21 09:08:37 +00:00
2023-02-01 11:53:04 +00:00
1. Your desired variables must be defined in your `nuxt.config` . This ensures that arbitrary environment variables are not exposed to your application code.
2022-07-21 09:08:37 +00:00
2023-02-01 11:53:04 +00:00
1. Only a specially-named environment variable can override a runtime config property. That is, an uppercase environment variable starting with `NUXT_` which uses `_` to separate keys and case changes.
2022-04-29 18:09:12 +00:00
2023-02-01 11:53:04 +00:00
#### Example
2021-11-10 12:40:02 +00:00
```sh [.env]
2022-04-12 10:04:15 +00:00
NUXT_API_SECRET=api_secret_token
2022-04-25 09:29:26 +00:00
NUXT_PUBLIC_API_BASE=https://nuxtjs.org
2021-11-10 12:40:02 +00:00
```
```ts [nuxt.config.ts]
export default defineNuxtConfig({
2022-04-12 08:12:33 +00:00
runtimeConfig: {
2022-07-13 17:03:02 +00:00
apiSecret: '', // can be overridden by NUXT_API_SECRET environment variable
2022-04-12 08:12:33 +00:00
public: {
2022-07-13 17:03:02 +00:00
apiBase: '', // can be overridden by NUXT_PUBLIC_API_BASE environment variable
2022-04-12 08:12:33 +00:00
}
2021-11-10 12:40:02 +00:00
},
})
```
2022-08-13 07:27:04 +00:00
## Accessing Runtime Config
2021-11-10 12:40:02 +00:00
2022-08-13 07:27:04 +00:00
### Vue App
2021-11-10 12:40:02 +00:00
Within the Vue part of your Nuxt app, you will need to call `useRuntimeConfig()` to access the runtime config.
2022-04-12 10:04:15 +00:00
**Note:** Behavior is different between the client-side and server-side:
2021-11-10 12:40:02 +00:00
2022-04-12 10:04:15 +00:00
- On the client-side, only keys in `public` are available, and the object is both writable and reactive.
The entire runtime config is available on the server-side, but it is read-only to avoid context sharing.
2021-11-10 12:40:02 +00:00
```vue
2023-07-18 10:31:45 +00:00
< script setup lang = "ts" >
2021-11-10 12:40:02 +00:00
const config = useRuntimeConfig()
2022-04-12 10:04:15 +00:00
console.log('Runtime config:', config)
2023-08-07 22:03:40 +00:00
if (import.meta.server) {
2022-04-12 10:04:15 +00:00
console.log('API secret:', config.apiSecret)
}
2021-11-10 12:40:02 +00:00
< / script >
2023-07-18 10:31:45 +00:00
< template >
< div >
< div > Check developer console!< / div >
< / div >
< / template >
2021-11-10 12:40:02 +00:00
```
2022-04-12 10:04:15 +00:00
**🛑 Security note:** Be careful not to expose runtime config keys to the client-side by either rendering them or passing them to `useState` .
2021-11-10 12:40:02 +00:00
2021-11-15 13:13:00 +00:00
::alert{icon=👉}
2021-11-21 12:31:44 +00:00
**`useRuntimeConfig` only works during `setup` or `Lifecycle Hooks` **.
2021-11-15 13:13:00 +00:00
::
2022-01-25 12:04:22 +00:00
### Plugins
2022-04-12 08:12:33 +00:00
If you want to use the runtime config within any (custom) plugin, you can use `useRuntimeConfig()` inside of your `defineNuxtPlugin` function.
2022-01-25 12:04:22 +00:00
2022-04-12 10:04:15 +00:00
For Example:
2022-01-25 12:19:40 +00:00
2022-01-25 12:04:22 +00:00
```ts
export default defineNuxtPlugin((nuxtApp) => {
2022-04-07 21:16:42 +00:00
const config = useRuntimeConfig()
2022-04-12 10:04:15 +00:00
console.log('API base URL:', config.public.apiBase)
2022-01-25 12:04:22 +00:00
});
```
2022-04-12 10:04:15 +00:00
### Server Routes
2021-11-10 12:40:02 +00:00
2022-04-12 10:04:15 +00:00
You can access runtime config within the server routes as well using `useRuntimeConfig` .
2021-11-10 12:40:02 +00:00
```ts
export default async () => {
const result = await $fetch('https://my.api.com/test', {
headers: {
2022-04-12 10:04:15 +00:00
Authorization: `Bearer ${useRuntimeConfig().apiSecret}`
2021-11-10 12:40:02 +00:00
}
})
return result
}
```
2022-04-12 10:04:15 +00:00
### Manually Typing Runtime Config
2022-07-01 10:01:14 +00:00
Nuxt tries to automatically generate a typescript interface from provided runtime config using [unjs/untyped ](https://github.com/unjs/untyped ).
2021-11-10 12:40:02 +00:00
2022-04-12 10:04:15 +00:00
It is also possible to type your runtime config manually:
2021-11-10 12:40:02 +00:00
```ts [index.d.ts]
2023-02-13 22:42:04 +00:00
declare module 'nuxt/schema' {
2022-04-12 10:04:15 +00:00
interface RuntimeConfig {
apiSecret: string
2023-07-29 18:14:08 +00:00
}
interface PublicRuntimeConfig {
apiBase: string
2021-11-10 12:40:02 +00:00
}
}
// It is always important to ensure you import/export something when augmenting a type
export {}
```