Skip to content
Docs
Marketing

Brevo

Let hires prepare email campaigns in Brevo, check lists and statistics, send campaigns once a person approves, and send one-to-one emails.

Explore 9 actions and their permissionsExact inputs, sign-in scopes, access limits and approval rules.

With Brevo, a hire can:

  • list your contact lists and how many subscribers each has,
  • look up contacts, without seeing who they are (see below),
  • list campaigns and read one: subject, sender, lists, what it says, and its statistics once sent,
  • prepare a campaign as a draft, and change a draft,
  • send a campaign now, or schedule it, once a person approves,
  • send one email to one person (a receipt, a follow-up, an answer).

Contacts stay private

Hires see a contact's address masked, like j***@acme.com, with their lists, whether they're blocklisted and when they were added. Never their name, phone number or other attributes. A hire can look someone up by their full address only.

1. Make an API key in Brevo

Straight there: app.brevo.com/settings/keys/api.

  1. In Brevo, open your name in the top corner, then SMTP & API → API keys, and click Generate a new API key. Name it Roster.
  2. Copy the key.
  3. Check that the address campaigns should come from is a verified sender, under Senders, Domains & Dedicated IPs.

2. Connect it in Roster

  1. Open Integrations → Tools → Add a tool, search for Brevo and choose it.
  2. API key: paste it.
  3. Sender name and Sender address: your business's name and the verified sender.
  4. Click Connect.

Roster checks the key when you click Connect. If what you paste doesn't look like a key (an API key starts with xkeysib-), the form says so straight away. Once it's accepted, the connection shows Connected as your Brevo company name. If it's refused, Roster says what to fix (a mistyped key, a missing permission) and saves nothing.

3. Give hires access

On the hire's Tools tab, click Give access on Brevo:

  • Read only: lists, contacts, campaigns and statistics.
  • Read and write: also prepare and change drafts, send or schedule campaigns (always with approval), and send one-to-one emails.
  • Lists: list names or IDs it may use, for contacts and campaigns. Leave it empty for every list.
  • Who it may email one to one: domains or full addresses. Anyone else is refused. Leave it empty for anyone.

What asks first

Sending or scheduling a campaign always waits for a person's approval, who sees the subject, the lists and the campaign's version; if the campaign changes after that, Roster won't send it. A one-to-one email asks only when it's the first email to someone outside your team. If your workspace asks hires to say they're an AI assistant, a first email opens with that line.

If something goes wrong

  • "Key not found" or "unauthorized": the API key was deleted or copied wrongly.
  • "Sender is invalid": the sender address isn't verified in Brevo.
  • Too many requests: Brevo allows only a few campaign and contact calls an hour on some plans; Roster waits and tries again.

Tools and permissions reference

This reference is built from the same definitions Roster uses to connect Brevo and give hires access. It updates with each release.

Authentication and requested permissions

The account or app you connect sets the outer limit. Each hire's access can narrow it further. Connecting a tool gives it to no hire until you give access on that hire's Tools tab.

API key or access token

In Brevo: your name → SMTP & API → API keys → Generate a new API key.

No fixed permission list is declared for this connection. Review the sign-in consent screen, the account's roles, and the service's own documentation before connecting.

Connection fields

Brevo connection fields
FieldWhat to provide
API key
token
Required · sealed secret
In Brevo: your name → SMTP & API → API keys → Generate a new API key.
Sender name
fromName
Required
Your business's name, as people see it on campaigns and emails.
Sender address
fromEmail
Required
A sender you've added and verified in Brevo (Senders, Domains & Dedicated IPs).

Per-hire limits

Read-only hires receive only actions that read. Read-and-write access also allows actions that change things, where the connection itself permits them. An empty resource allowlist usually means everything the connected account can reach; each field below explains its meaning.

Brevo per-hire limits
FieldWhat to provide
Lists
lists
Optional
List names or IDs it may read and write to, one per line. Leave empty for every list.
Who it may email one to one
recipients
Optional
Email domains or full addresses it may send a single (transactional) email to. Leave empty for anyone (a first email to someone outside your team asks a person first).

Actions

9 actions: 4 only read and 5 change something. A read action may still need approval when your workspace or hire is set to ask. A locked approval requirement always applies.

9 of 9 actions. Open an action for its arguments and full input schema.

list_listsRead only

Brevo lists this hire may use, with how many subscribers each has.

Approval: Uses your workspace and hire approval settings.

This action takes no arguments.

Full input schema (JSON)
{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "type": "object",
  "properties": {}
}
list_subscribersRead only

Subscribers of a list, or anyone matching words such as an address: each with a masked address (j***@acme.com), status, lists and when they joined. Never names or other personal details.

Approval: Uses your workspace and hire approval settings.

Arguments for list_subscribers
ArgumentTypeDetails
listOptionalstringthe list's name or ID
searchOptionalstringan address or words to look for
limitOptionalintegerSee input schema below.Default: 20
Full input schema (JSON)
{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "type": "object",
  "properties": {
    "list": {
      "description": "the list's name or ID",
      "type": "string",
      "maxLength": 200
    },
    "search": {
      "description": "an address or words to look for",
      "type": "string",
      "maxLength": 200
    },
    "limit": {
      "default": 20,
      "type": "integer",
      "minimum": 1,
      "maximum": 50
    }
  }
}
list_campaignsRead only

Brevo campaigns, newest first: status (draft, scheduled, sending, paused, sent, cancelled), lists and when.

Approval: Uses your workspace and hire approval settings.

Arguments for list_campaigns
ArgumentTypeDetails
statusOptional"draft" | "scheduled" | "sending" | "paused" | "sent" | "cancelled"See input schema below.
limitOptionalintegerSee input schema below.Default: 20
Full input schema (JSON)
{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "type": "object",
  "properties": {
    "status": {
      "type": "string",
      "enum": [
        "draft",
        "scheduled",
        "sending",
        "paused",
        "sent",
        "cancelled"
      ]
    },
    "limit": {
      "default": 20,
      "type": "integer",
      "minimum": 1,
      "maximum": 50
    }
  }
}
get_campaignRead only

One Brevo campaign: subject, sender, lists, what it says, its report once sent, and its version (needed to send or schedule it).

Approval: Uses your workspace and hire approval settings.

Arguments for get_campaign
ArgumentTypeDetails
campaignRequiredstringthe campaign's ID
Full input schema (JSON)
{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "type": "object",
  "properties": {
    "campaign": {
      "type": "string",
      "minLength": 1,
      "maxLength": 64,
      "description": "the campaign's ID"
    }
  },
  "required": [
    "campaign"
  ]
}
create_draftRead and write

Prepare a campaign as a draft in Brevo for a person to check: subject, lists and content. Nobody receives anything. It goes out in the business's name: write as the business, never sign with a person's name or say you're one.

Approval: Uses your workspace and hire approval settings.

Arguments for create_draft
ArgumentTypeDetails
nameRequiredstringan internal name for the campaign
subjectRequiredstringSee input schema below.
listsRequiredstring[]the lists (names or IDs) it goes to
bodyRequiredstringthe email's content
formatOptional"text" | "html"text: plain text, paragraphs on blank lines; html: your HTMLDefault: "text"
preview_textOptionalstringthe line inboxes show after the subject
Full input schema (JSON)
{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200,
      "description": "an internal name for the campaign"
    },
    "subject": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    },
    "lists": {
      "minItems": 1,
      "maxItems": 20,
      "type": "array",
      "items": {
        "type": "string",
        "minLength": 1,
        "maxLength": 200
      },
      "description": "the lists (names or IDs) it goes to"
    },
    "body": {
      "type": "string",
      "minLength": 1,
      "maxLength": 100000,
      "description": "the email's content"
    },
    "format": {
      "default": "text",
      "description": "text: plain text, paragraphs on blank lines; html: your HTML",
      "type": "string",
      "enum": [
        "text",
        "html"
      ]
    },
    "preview_text": {
      "description": "the line inboxes show after the subject",
      "type": "string",
      "maxLength": 200
    }
  },
  "required": [
    "name",
    "subject",
    "lists",
    "body"
  ]
}
update_draftRead and write

Change a draft Brevo campaign: its name, subject, lists, preview text or content. Only drafts can change; nobody receives anything.

Approval: Uses your workspace and hire approval settings.

Arguments for update_draft
ArgumentTypeDetails
campaignRequiredstringthe campaign's ID
nameOptionalstringan internal name for the campaign
subjectOptionalstringSee input schema below.
listsOptionalstring[]the lists (names or IDs) it goes to
bodyOptionalstringthe email's content
formatOptional"text" | "html"the body's format, with body (default text)
preview_textOptionalstringthe line inboxes show after the subject
Full input schema (JSON)
{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "type": "object",
  "properties": {
    "campaign": {
      "type": "string",
      "minLength": 1,
      "maxLength": 64,
      "description": "the campaign's ID"
    },
    "name": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200,
      "description": "an internal name for the campaign"
    },
    "subject": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    },
    "lists": {
      "minItems": 1,
      "maxItems": 20,
      "type": "array",
      "items": {
        "type": "string",
        "minLength": 1,
        "maxLength": 200
      },
      "description": "the lists (names or IDs) it goes to"
    },
    "body": {
      "type": "string",
      "minLength": 1,
      "maxLength": 100000,
      "description": "the email's content"
    },
    "format": {
      "description": "the body's format, with body (default text)",
      "type": "string",
      "enum": [
        "text",
        "html"
      ]
    },
    "preview_text": {
      "description": "the line inboxes show after the subject",
      "type": "string",
      "maxLength": 200
    }
  },
  "required": [
    "campaign"
  ]
}
send_campaignRead and write

Send a draft Brevo campaign now to everyone on its lists. It's public and can't be taken back, so it waits for a person's approval: Roster asks in the thread with the subject, lists and version, and sends exactly that version, once, when they approve. It goes out in the business's name: write as the business, never sign with a person's name or say you're one.

Approval: Always asks for approval.

Arguments for send_campaign
ArgumentTypeDetails
campaignRequiredstringthe campaign's ID
subjectRequiredstringits subject, exactly as get_campaign shows it
listsRequiredstring[]the lists it goes to, as get_campaign shows them
versionRequiredstringits version, from get_campaign
Full input schema (JSON)
{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "type": "object",
  "properties": {
    "campaign": {
      "type": "string",
      "minLength": 1,
      "maxLength": 64,
      "description": "the campaign's ID"
    },
    "subject": {
      "type": "string",
      "maxLength": 300,
      "description": "its subject, exactly as get_campaign shows it"
    },
    "lists": {
      "minItems": 1,
      "maxItems": 20,
      "type": "array",
      "items": {
        "type": "string",
        "minLength": 1,
        "maxLength": 200
      },
      "description": "the lists it goes to, as get_campaign shows them"
    },
    "version": {
      "type": "string",
      "pattern": "^[0-9a-f]{10}$",
      "description": "its version, from get_campaign"
    }
  },
  "required": [
    "campaign",
    "subject",
    "lists",
    "version"
  ]
}
schedule_campaignRead and write

Schedule a draft Brevo campaign to go out at a time. It's public, so it waits for a person's approval, as send_campaign does. It goes out in the business's name: write as the business, never sign with a person's name or say you're one.

Approval: Always asks for approval.

Arguments for schedule_campaign
ArgumentTypeDetails
campaignRequiredstringthe campaign's ID
subjectRequiredstringits subject, exactly as get_campaign shows it
listsRequiredstring[]the lists it goes to, as get_campaign shows them
versionRequiredstringits version, from get_campaign
atRequiredstringwhen, ISO 8601 with a time zone, e.g. 2026-11-10T09:00:00+04:00
Full input schema (JSON)
{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "type": "object",
  "properties": {
    "campaign": {
      "type": "string",
      "minLength": 1,
      "maxLength": 64,
      "description": "the campaign's ID"
    },
    "subject": {
      "type": "string",
      "maxLength": 300,
      "description": "its subject, exactly as get_campaign shows it"
    },
    "lists": {
      "minItems": 1,
      "maxItems": 20,
      "type": "array",
      "items": {
        "type": "string",
        "minLength": 1,
        "maxLength": 200
      },
      "description": "the lists it goes to, as get_campaign shows them"
    },
    "version": {
      "type": "string",
      "pattern": "^[0-9a-f]{10}$",
      "description": "its version, from get_campaign"
    },
    "at": {
      "type": "string",
      "format": "date-time",
      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
      "description": "when, ISO 8601 with a time zone, e.g. 2026-11-10T09:00:00+04:00"
    }
  },
  "required": [
    "campaign",
    "subject",
    "lists",
    "version",
    "at"
  ]
}
send_emailRead and write

Send one email to one person through Brevo (a receipt, a follow-up, an answer), from example. For a newsletter to a list, draft a campaign instead. A first email to someone outside your team waits for a person's approval. It goes out in the business's name: write as the business, never sign with a person's name or say you're one.

Approval: when it writes to someone outside your team for the first time.

Arguments for send_email
ArgumentTypeDetails
toRequiredstringSee input schema below.
subjectRequiredstringSee input schema below.
textRequiredstringplain text, paragraphs on blank lines
Full input schema (JSON)
{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "type": "object",
  "properties": {
    "to": {
      "type": "string",
      "format": "email",
      "pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
    },
    "subject": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    },
    "text": {
      "type": "string",
      "minLength": 1,
      "maxLength": 20000,
      "description": "plain text, paragraphs on blank lines"
    }
  },
  "required": [
    "to",
    "subject",
    "text"
  ]
}

Watches and incoming events

  • No built-in watch is declared. Give a hire a scheduled responsibility if it should check this service regularly.
  • No incoming webhook handler is declared for this integration.

Limits and troubleshooting

  • Permission errors: check both the connected account's rights and the hire's resource and read/write limits.
  • Expired or revoked access: reconnect or replace the key on the connection.
  • Rate limits and unavailable services can interrupt work. The hire's timecard records the outcome.
  • The action schema describes accepted inputs. It does not grant additional access or bypass approvals.

Service documentation · Integration source reference

On this page