Create your first app

Install the Brevo CLI and create your first app
View as Markdown

Every Brevo App starts with the Brevo CLI (@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.

Install the CLI

$npm install -g @getbrevo/cli

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

Sign in

$brevo login

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

Create an app

$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.

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:

FieldDescription
appIdAssigned by Brevo when the app is created; don’t edit
appNameDisplay name of your app
versionRead-only; tracks the app-store API version, updated automatically on each upload
logoUriOptional URL to your app’s logo
distribution_typeAlways 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.
  • UI app: the opposite shape, an empty auth: {} and a populated ui_app block instead. See 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