Brevo API: praktičan vodič za programere

Vodič za Brevo API: autentifikacija, ažuriranje kontakata, webhookovi, ograničenja i bezbedna ponavljanja.

Brevo API

Koji je kratak odgovor?

Koristite https://api.brevo.com/v3/ sa zaglavljem api-key. Za sinhronizaciju kontakata izaberite stabilan ID izvora, deklarisane atribute i određenu listu, uz očuvanje odjava. Proverite rezultat i zaglavlja ograničenja, ograničite pokušaje posle 429, a webhookove tretirajte kao proverene signale koji zahtevaju uklanjanje duplikata i usklađivanje.

Saznajte više
Na ovoj stranici

Uvoz kontakta može vratiti 201, a ipak biti pogrešan: izgubljen je ID izvora, izabrana je pogrešna lista ili zanemarena ranija odjava. To su odluke o podacima, ne HTTP detalji.

Vodič prvo prikazuje radni Brevo poziv, a zatim kontrole za malu ponovljivu sinhronizaciju.

Šta Brevo API pokriva

Sve živi pod jednim hostom i jednom putanjom verzije. Programerska dokumentacija grupiše tu površinu u četiri proizvodne oblasti:

  • Poruke: transakcioni imejl, SMS i WhatsApp, uključujući grupna slanja, zakazivanje i aktivnost poruka.
  • Marketinška platforma: kontakti, liste, segmenti i imejl kampanje.
  • eCommerce: proizvodi, porudžbine i praćenje događaja kupaca.
  • Conversations: čet vidžet i programsko upravljanje razgovorima.

Te oblasti dele jedan nalog, jednu bazu kontakata i jedan API ključ. To je praktično i povremeno opasno: skripta napisana prema zamišljenoj test verziji podataka razgovara sa istim kontaktima kojima šaljete kampanje.

Transakciono naspram marketinškog

Ove dve porodice se dovoljno razlikuju u ponašanju da je njihovo mešanje najčešća greška u projektovanju.

TransakcionoMarketinško
Osnovna krajnja tačkaPOST /v3/smtp/emailPOST /v3/emailCampaigns
AdresiranjeEksplicitni primaoci u zahtevulistIds ili segmentIds
OkidačVaša aplikacija, u realnom vremenuZakazano ili poslato na zahtev
Tipičan oblik obimaNeprekidno, jedna po jedna porukaU naletima, jedno veliko slanje
Odnos prema ograničenjimaVrlo visok, 1.000 zahteva u sekundi na opštem nivouNizak, krajnje tačke kampanja spadaju pod opšte ograničenje

Ako još odlučujete da li je Brevo uopšte prava platforma, pregled platforme pokriva tu temu.

Autentifikacija i upravljanje ključevima

Brevo koristi običan API ključ u prilagođenom zaglavlju. Zaglavlje se zove api-key, ne Authorization, i nema prefiks Bearer. Na tome se saplete skoro svako ko je prvo koristio neki drugi API za poruke.

OAuth može da koristi Bearer token za podržane operacije; običan API ključ i dalje šaljite u zaglavlju api-key.

Terminal window
curl https://api.brevo.com/v3/account \
-H "api-key: $BREVO_API_KEY"

Ključevi se generišu u aplikaciji Brevo, u podešavanjima naloga, u odeljku SMTP and API, na kartici API keys. Dajte svakom ključu opisno ime vezano za sistem koji ga koristi. Vrednost ključa prikazuje se tačno jednom prilikom generisanja, pa ako je izgubite, generišete novi umesto da vraćate stari.

Nekoliko praktičnih pravila:

  • Izdajte poseban ključ po okruženju i po servisu. Povlačenje kompromitovanog ključa nikada ne bi smelo da obori tri nepovezana sistema.
  • Standardni API ključevi važe za ceo nalog. Tretirajte svaki ključ kao pun pristup kontaktima, slanju i CRM podacima.
  • Brevo podržava i OAuth 2.0 za aplikacije koje deluju u ime drugih Brevo naloga, što je opisano uz tok sa ključevima u dokumentu authentication schemes.
  • MCP server koji koriste AI asistenti uzima poseban token i zaista koristi bearer zaglavlje. Taj token se generiše na istom ekranu sa API ključevima, ali nije zamenljiv sa REST ključem.

Osnovni URL, verzionisanje i vaš prvi upis

Osnovni URL je https://api.brevo.com/v3/. Verzija je u putanji, a ne u zaglavlju, i v3 je aktuelna generacija. Svaka putanja u ovom vodiču data je u odnosu na tu osnovu.

Za prvi upis kontakta koristite probnu adresu koju kontrolišete, važeći ID liste i stabilan ID izvora. Prvo u Brevu napravite atribut FNAME. Sa pravim ključem primer upisuje direktno:

Terminal window
curl -X POST https://api.brevo.com/v3/contacts \
-H "api-key: $BREVO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"email": "[email protected]",
"ext_id": "test-source-contact-1",
"attributes": { "FNAME": "Dev" },
"listIds": [42],
"updateEnabled": true,
"getId": true
}'

Zamenite 42 ID-jem probne liste. Ponovo pročitajte kontakt i proverite ID, ime, listu i blokade. Sam 2xx ne dokazuje očekivani ishod.

Krajnje tačke koje ćete zaista koristiti

Kontakti

POST /v3/contacts pravi kontakt. Telo prima email, deklarisane attributes, listIds i ext_id kao stabilan ključ izvora. updateEnabled: true ažurira postojeći kontakt, a getId: true traži konačni ID. Brevo dokumentuje polja. Koristite isti ext_id svaki put i čuvajte vezu između ID-ja izvora i Breva.

Pre upisa odredite koji sistem upravlja kojim atributom i koja lista dobija kontakte sa saglasnošću. Navedite listIds izričito. Nikad ne postavljajte emailBlacklisted: false u običnom upsertu. Brevo upozorava da promena adrese blokiranog kontakta uklanja blokadu. Rešavajte je zasebno. Pre dodavanja na marketinšku listu proverite blokade i odjave. Između čitanja i upisa ostaje kratak period; strogi zahtevi traže poslednju proveru pre slanja.

Čitanja idu kroz GET /v3/contacts, koji straničari uz limit (podrazumevano 50, najviše 1000) i offset, i podržava modifiedSince i createdSince u UTC vremenu. Inkrementalne sinhronizacije treba da se oslone na modifiedSince umesto da prolaze kroz celu listu. Imajte u vidu da parametar filter podržava samo operator jednakosti, pa sve izražajnije spada u segment.

Za masovno učitavanje, POST /v3/contacts/import prihvata fileUrl, fileBody ili jsonBody, cilja listIds i radi asinhrono, vraćajući processId. Brevo dokumentuje maksimum od 10 MB za telo i preporučuje da ostanete oko 8 MB, jer parsiranje uvećava sadržaj. Prosledite notifyUrl da biste saznali ishod umesto da anketirate status.

Transakcioni imejl

POST /v3/smtp/email je radni konj. Osim sender, to, subject i htmlContent, vredi znati sledeća polja:

  • templateId sa params, koji zamenjuje ugrađeni sadržaj šablonom platforme Brevo i njegovim zamenama promenljivih. Parametri pojedinačne verzije ograničeni su na 100 KB, a kumulativni na 1000 KB.
  • messageVersions, koji šalje personalizovane varijante u jednom pozivu, sa najviše 99 primalaca po verziji.
  • tags mogu pomoći da povežete događaje isporuke sa tokom aplikacije koji ih je izazvao.
  • scheduledAt uz batchId, za buduća slanja koja ćete možda želeti da otkažete kao grupu.
  • headers, u obliku Title-Case, za prilagođena SMTP zaglavlja.

Jedan zahtev prihvata najviše 2.000 primalaca. Za razliku između ove krajnje tačke i slanja kampanja, vodič za transakcioni imejl daje pogled iz ugla strategije poruka.

Imejl kampanje

POST /v3/emailCampaigns zahteva name i sender, plus tačno jedan izvor sadržaja: htmlContent (najmanje 10 znakova, ispod 1 MB), htmlUrl ili templateId. Publika ide u recipients kao listIds ili segmentIds, a scheduledAt koristi UTC format YYYY-MM-DDTHH:mm:ss.SSSZ. Prateće rute pokrivaju trenutno slanje, slanje testa, izmenu statusa i preuzimanje izveštaja o kampanji.

Kompanije, poslovi i objekti

CRM u platformi Brevo ima dve putanje za upis koje se preklapaju, i ispravan izbor je bitan.

CRM rute su POST /v3/companies, PATCH /v3/companies/{id}, DELETE /v3/companies/{id} i istovetan skup za poslove. One su sinhrone. PATCH vraća 204 čim je izmena primenjena.

API za objekte je putanja za masovni rad: POST /v3/objects/{object_type}/batch/upsert prima do 1000 zapisa i 1 MB po zahtevu, do 500 atributa po zapisu i do 10 povezanih zapisa po tipu objekta po zapisu. Vraća 202 sa poljem processId, što znači prihvaćeno, a ne primenjeno.

Terminal window
curl -X POST https://api.brevo.com/v3/objects/company/batch/upsert \
-H "api-key: $BREVO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"records": [
{
"identifiers": { "id": 12345 },
"attributes": { "domain": "acme.example", "industry": "retail" }
}
]
}'

Vodič kroz Brevo CRM pokriva model objekata iz ugla operatera.

Zvanični SDK-ovi

Brevo održava klijente u GitHub organizaciji getbrevo:

JezikRepozitorijum
Node.jsgithub.com/getbrevo/brevo-node
Pythongithub.com/getbrevo/brevo-python
PHPgithub.com/getbrevo/brevo-php
Javagithub.com/getbrevo/brevo-java
C#github.com/getbrevo/brevo-csharp
Gogithub.com/getbrevo/brevo-go
Rubygithub.com/getbrevo/brevo-ruby

Node klijent se instalira kao @getbrevo/brevo:

Terminal window
npm install @getbrevo/brevo
import { BrevoClient } from "@getbrevo/brevo";
// Reconcile uncertain send outcomes before retrying.
const brevo = new BrevoClient({ apiKey: process.env.BREVO_API_KEY, maxRetries: 0 });
const result = await brevo.transactionalEmails.sendTransacEmail({
subject: "Order confirmed",
htmlContent: "<html><body><p>Thanks for your order.</p></body></html>",
sender: { name: "Acme", email: "[email protected]" },
to: [{ email: "[email protected]", name: "Customer" }],
tags: ["order-confirmation"],
});
console.log("Message ID:", result.messageId);

Python klijent se instalira sa pip install brevo-python. Ako ne želite da nosite zavisnost od SDK-a zbog dve krajnje tačke, sirova HTTP površina je dovoljno mala da je pozovete direktno, što vas ujedno štiti od stalnih izmena verzija SDK-a:

Python klijent se instalira sa pip install brevo-python. Za nekoliko krajnjih tačaka možete direktno pozvati HTTP:

import os
import requests
BASE = "https://api.brevo.com/v3"
HEADERS = {"api-key": os.environ["BREVO_API_KEY"]}
def upsert_consented_contact(source_id, email, first_name, list_id, consent):
if not consent:
raise ValueError("No marketing consent in the source")
if not source_id or not isinstance(list_id, int):
raise ValueError("Stable source ID and numeric list ID required")
# Configure FNAME in Brevo before using this explicit field mapping.
response = requests.post(
f"{BASE}/contacts",
headers=HEADERS,
json={
"email": email,
"ext_id": source_id,
"attributes": {"FNAME": first_name},
"listIds": [list_id],
"updateEnabled": True,
"getId": True,
},
timeout=30,
)
response.raise_for_status()
return response.json().get("id") if response.content else None

Uspešno ažuriranje može vratiti prazan odgovor 204. None tada znači da za ID morate ponovo pročitati kontakt.

Primer pretpostavlja da je pozivalac već proverio saglasnost i blokade u Brevu. Ne traži uklanjanje blokade. Sa pravim ključem piše u nalog; prvo ga ispitajte simulacijom. Sukobi identifikatora mogu dati različite 4xx kodove. Pročitajte odgovor i uskladite ID-jeve, ne očekujte uvek 409.

Webhookovi

Webhookovi su način da saznate šta se dogodilo posle slanja. POST /v3/webhooks kreira jedan, sa url, events, type i opciono channel (email ili sms), batched, prilagođenim headers i objektom auth.

Postoje tri tipa webhookova sa različitim rečnicima događaja:

  • Transakcioni: sent, request, delivered, hardBounce, softBounce, blocked, spam, invalid, deferred, click, opened, uniqueOpened, unsubscribed.
  • Marketinški: spam, opened, click, hardBounce, softBounce, unsubscribed, listAddition, delivered, contactUpdated, contactDeleted.
  • Dolazni: inboundEmailProcessed i reply, koji dodatno zahtevaju domain.
Terminal window
curl -X POST https://api.brevo.com/v3/webhooks \
-H "api-key: $BREVO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"url": "https://yourapp.example/hooks/brevo",
"type": "transactional",
"events": ["delivered", "hardBounce", "spam", "unsubscribed"],
"description": "Deliverability signals"
}'

Za promene kontakata registrujte marketinški webhook sa contactUpdated. Brevo događaj u podacima zove contact_updated. Primaoca potvrdite bearer tokenom auth ili svojim zaglavljima prema bezbednosnom vodiču. Tajnu proverite pre obrade i ne beležite je.

Sačuvajte ključ za uklanjanje duplikata od tipa događaja, ID-ja kontakta i vremenske oznake tokom perioda ponovne isporuke. Sama oznaka nije jedinstvena. Događaji se mogu ponoviti ili stići mimo redosleda. Posle događaja ponovo pročitajte kontakt i uskladite ga s pouzdanim izvorom. Odredite prozor reprodukcije, nakon oporavka odbacite stare događaje i redovno radite inkrementalnu proveru. Webhook signalizira promenu, sam ne pravi dvosmernu sinhronizaciju. Vodič za konektore opisuje izbor.

Ograničenja broja zahteva i obrada grešaka

Ograničenja broja zahteva u platformi Brevo postavljaju se po krajnjoj tački i po nivou plana, a raspon između krajnjih tačaka je ogroman.

Krajnja tačkaGeneral (svaki plan)Advanced (Professional i Enterprise)
POST /v3/smtp/email1.000 RPS2.000 RPS
POST /v3/transactionalSMS/send150 RPS200 RPS
/v3/contacts/...10 RPS, 36.000 RPH20 RPS, 72.000 RPH
POST /v3/events10 RPS, 36.000 RPH20 RPS, 72.000 RPH
GET /v3/smtp/emails2 RPS, 7.200 RPH3 RPS, 10.800 RPH
Krajnje tačke bez sopstvenog ograničenja100 RPH200 RPH

Brevo dokumentuje x-sib-ratelimit-limit, x-sib-ratelimit-remaining i x-sib-ratelimit-reset na ograničenim tačkama. Čitajte ih i posle uspeha. Pri 429 čekajte reset, pa ponavljajte samo u granicama broja pokušaja i vremena. Reset je trajanje u jedinici vremenskog prozora, obično u sekundama, ne Unix vreme.

async function callBrevo(path, init) {
for (let attempt = 0; attempt < 3; attempt++) {
const response = await fetch(`https://api.brevo.com/v3${path}`, {
...init,
headers: { "api-key": process.env.BREVO_API_KEY, ...init.headers },
});
if (response.status !== 429 || attempt === 2) return response;
const raw = Number(response.headers.get("x-sib-ratelimit-reset"));
const seconds = Number.isFinite(raw) && raw > 0 ? raw : 2 ** attempt;
const delayMs = (seconds + 2 ** attempt) * 1000;
if (delayMs > 60_000) return response;
await new Promise(resolve => setTimeout(resolve, delayMs));
}
}

Ako potrebno čekanje prelazi 60 sekundi, funkcija vraća 429. Sledeći pokušaj zakažite kasnije.

Pomoćna funkcija služi samo zahtevima čije ste ponavljanje proverili kao bezbedno. Posle nejasne greške slanja prvo uskladite ID poruke. Beležite status i zaglavlja, ne API ključ ili kontakt podatke.

Ne ponavljajte 4xx naslepo. Referenca za pravljenje kontakta navodi 400 i 425; sukob ne mora biti 409. Posle 5xx pri upisu proverite da li je promena već sprovedena.

Koji je status vraćen?

  1. 429

    Sačekajte u granici

    Koristite vreme reseta i stanite posle nekoliko pokušaja.

  2. 5xx posle upisa

    Proverite rezultat

    Server je možda upisao pre greške.

  3. 400

    Ispravite zahtev

    Često je neispravan.

  4. Sukob identifikatora

    Pročitajte i uskladite ID-jeve

    API ne garantuje određeni kod.

Testiranje bez slanja pošte

Dodajte zaglavlje X-Sib-Sandbox sa vrednošću drop u transakciono slanje. Brevo proverava ispravnost zahteva, vraća 201 sa poljem messageId, ne isporučuje ništa i ne upisuje zapis u imejl dnevnik.

Terminal window
curl -X POST https://api.brevo.com/v3/smtp/email \
-H "api-key: $BREVO_API_KEY" \
-H "X-Sib-Sandbox: drop" \
-H "Content-Type: application/json" \
-d '{ "sender": { "email": "[email protected]" }, "to": [{ "email": "[email protected]" }], "subject": "Sandbox", "htmlContent": "<p>hi</p>" }'

Shvatite šta ovo dokazuje, a šta ne. Sandbox režim proverava samo format zahteva. On ne govori ništa o autentifikaciji pošiljaoca, iscrtavanju šablona ili isporučivosti. Držite poseban Brevo nalog za integraciono testiranje svega što dodiruje kontakte ili CRM podatke, jer sandbox režim pokriva slanje, a ne ostatak API-ja.

Proverite pre sinhronizacije kontakata

  • Izaberite stabilan ID izvora za ext_id i sačuvajte vraćeni Brevo ID.
  • Proverite atribute pre upisa. Brevo može zanemariti nepoznata ili pogrešno tipizirana polja; ponovo pročitajte probni kontakt.
  • Koristite određenu listu i pouzdan dokaz saglasnosti. Preskočite blokirane i odjavljene.
  • Posebno brojite prihvaćene, primenjene, preskočene i neuspele zapise. Kod 202 za grupe ili objekte prvo znači samo prihvatanje.
  • Marketinške webhookove koristite kao signale i zatim uskladite stanje. Potvrdite, uklonite duplikate i ograničite reprodukciju.
  • Pratite zaglavlja ograničenja i stanite posle nekoliko pokušaja.

Tajo sinhronizuje trgovinske podatke sa Brevom. Ako taj sloj gradite sami, vodič za Brevo konektore poredi putanje i greške.

Često Postavljana Pitanja

Koji je osnovni URL platforme Brevo API?

Svi REST pozivi idu na https://api.brevo.com/v3/. Verzija je deo putanje, a v3 je aktuelna generacija, pa je krajnja tačka za transakciono slanje puna putanja https://api.brevo.com/v3/smtp/email.

Kako se autentifikujete na Brevo API?

Ključ šaljete u HTTP zaglavlju pod nazivom api-key. Brevo ne koristi zaglavlje Authorization niti Bearer za standardne API ključeve. Ključevi se generišu u podešavanjima naloga, u odeljku SMTP and API, na kartici API keys, a vrednost se prikazuje samo jednom.

Kolika su ograničenja broja zahteva na Brevo API-ju?

Ograničenja se određuju po krajnjoj tački i po nivou ograničenja broja zahteva. Na opštem nivou (General), koji dobija svaki plan, krajnja tačka za transakciono slanje dozvoljava 1.000 zahteva u sekundi, krajnje tačke za kontakte 10 u sekundi, a krajnje tačke bez sopstvenog ograničenja ograničene su na 100 zahteva na sat. Planovi Professional i Enterprise mogu da koriste napredni nivo (Advanced), a Enterprise i prošireni nivo (Extended). Prekoračenje vraća status 429.

Da li Brevo ima zvanične SDK-ove?

Da. Brevo objavljuje klijente za Node.js, Python, PHP, Javu, C#, Go i Ruby u GitHub organizaciji getbrevo. Node paket je @getbrevo/brevo na npm-u, a Python paket je brevo-python na PyPI-ju.

Kako da testiram Brevo API bez slanja pravih poruka?

Dodajte zaglavlje X-Sib-Sandbox sa vrednošću drop u transakciono slanje. Brevo proverava ispravnost zahteva, vraća 201 sa poljem messageId, ne šalje ništa i ne upisuje zapis u imejl dnevnik. Proverava se samo format zahteva, ne i isporučivost.

Koje webhook događaje Brevo podržava?

Transakcijski webhookovi obuhvataju dostavu, odbijanja i odjave. Marketinški uključuju contactUpdated i contactDeleted. Za dolazne događaje Brevo dokumentuje inboundEmailProcessed.

Kako ažuriranje kontakta štiti raniju odjavu?

Koristite stabilan ID izvora i deklarisane atribute. U običnom ažuriranju ne postavljajte emailBlacklisted na false. Pre dodavanja na marketinšku listu proverite kontakt i izvor saglasnosti.

Da li webhook sam omogućava dvosmernu sinhronizaciju?

Ne. Potvrdite primaoca, uklonite dvostruke isporuke i uskladite propuštene ili neuređene događaje sa pouzdanim izvorom. Webhook javlja promenu, ali ne dokazuje da su sistemi saglasni.

Zatražite rani pristup

Unesite ime i poslovnu adresu e-pošte. Poslaćemo vam vezu za potvrdu zahteva za pristup Taju.

Preuzmite Brevo