> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://developers.brevo.com/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://developers.brevo.com/_mcp/server.

# Create your first app

Every Brevo App starts with the [Brevo CLI](/docs/cli-reference) (`@getbrevo/cli`).

**Works with Claude Code.** Every step below can be driven straight from Claude Code. Run `brevo skill:cli install` once to add the [Brevo CLI skill](/docs/cli-reference#claude-code-skill).

## Install the CLI

#### npm

```bash
npm install -g @getbrevo/cli
```

#### yarn

```bash
yarn global add @getbrevo/cli
```

#### Homebrew

```bash
brew install getbrevo/tap/brevo
```

**Requirements:** Node.js >= 20.15.0 (Homebrew installs Node automatically as a dependency).

## Sign in

```bash
brevo login
```

Opens `oauth-cli.brevo.com` in your browser. After signing in, credentials are saved to `~/.brevo/credentials.json`.

## Create an app

```bash
brevo app init
```

Guided setup: authenticate, create an app, and optionally scaffold starter code, in one flow. No flags; it prompts for app name, logo URL, distribution type, app type, OAuth callback URL, output directory, and whether to scaffold the Test OAuth App feature.

For scripted or automated flows, use `brevo app create` with flags instead. See the [CLI reference](/docs/cli-reference#brevo-app-create).

## Your app's configuration

`brevo app init` (or `brevo app create`) writes an `app-config.json` file to your project. This file *is* your app. It's the single source of truth: edit it, then run `brevo app upload` to push the change to Brevo. `brevo app upload` always fetches the server's current state first and shows you a diff before pushing anything.

A few top-level fields are shared by every app, regardless of type:

| Field               | Description                                                                       |
| ------------------- | --------------------------------------------------------------------------------- |
| `appId`             | Assigned by Brevo when the app is created; don't edit                             |
| `appName`           | Display name of your app                                                          |
| `version`           | Read-only; tracks the app-store API version, updated automatically on each upload |
| `logoUri`           | Optional URL to your app's logo                                                   |
| `distribution_type` | Always `private` for now; immutable after creation                                |

**Private apps only, for now.** A private app can only be authorized or installed by users within your own Brevo organization. It can't be distributed to external users or listed anywhere. Support for public apps, which you'll be able to distribute to Brevo's end users generally, is planned for a future release.

What the rest of the file looks like depends on the app type you chose when creating it:

* **OAuth app**: a populated `auth` block (`auth.scopes`, `auth.redirectUris`) and no `ui_app` key at all. This is what lets your app authenticate on a user's behalf. See [Authentication & scopes](/docs/oauth).
* **UI app**: the opposite shape, an empty `auth: {}` and a populated `ui_app` block instead. See [Action links](/docs/apps-action-links) for a full example.

The presence of the `ui_app` key is what tells Brevo which kind of app this is. Never populate both `auth` and `ui_app` in the same file.

## Next steps

#### [Authentication & scopes](/docs/oauth)

How OAuth apps authorize on behalf of a user, and the scopes they can request.

#### [CLI reference](/docs/cli-reference)

Every `brevo` command and flag.