Bird kontra Prelude
Bird kontra Prelude — weryfikacja
Prelude opiera się na werdykcie ryzyka, na podstawie którego można rozgałęzić logikę — Bird nie ma odpowiednika tej funkcji. Poza tym oba API są na tyle podobne, że migracja sprowadza się głównie do zmiany nazw. Na tej stronie wyjaśniamy, który z tych dwóch faktów ma większe znaczenie dla tego, co budujesz.
W czym Prelude jest świetny.
Czym Bird się różni.
W czym Prelude jest świetny
Werdykt, na którym można rozgałęzić logikę. Wywołanie create przyjmuje sygnały IP, urządzenia i fingerprint, a w odpowiedzi zwraca werdykt routingu: success, retry, challenged, blocked lub shadow_blocked — z uzasadnieniem w przypadku odmowy. Wywołanie create w Bird zwraca samą weryfikację: nie ma werdyktu, obiektu sygnałów ani shadow block. Rejestracja uzależniona od tej decyzji musi ją podjąć, zanim wywoła Bird.
Kanały, których Bird nie obsługuje. Połączenie głosowe, RCS, Viber, Zalo i cicha autoryzacja sieciowa — w ponad 230 krajach. Obie platformy obsługują SMS, WhatsApp i Telegram, więc różnica dotyczy tych pięciu kanałów, a nie całego zestawu: numer, do którego Prelude dotarł przez Viber lub Zalo, tutaj wraca na SMS — to kwestia wskaźnika dostarczalności, którą warto zmierzyć w pilotażu, zamiast odkrywać przy pełnym wolumenie.
Treść wiadomości i fallback są pod Twoją kontrolą. Szablon ze zmiennymi, lokalizacja, własny sender ID i niestandardowy kod — wszystko ustawiane per żądanie. max_auto_fallbacks i force_challenge regulują eskalację per wywołanie. W Bird tekst kodu jest ustalony przez Bird, a fallback wynika z planu kanałów dla danego kraju; nadawcy są konfigurowane per kanał, a nie per żądanie, i tylko w przypadku e-maila można użyć własnego adresu.
Czym Bird się różni
Nieudana weryfikacja informuje o rodzaju błędu. Prelude łączy błędny kod i wyczerpanie prób w jeden status failure. Bird odpowiada powodem: incorrect_code, expired lub attempts_exhausted, a obok zwraca attempts_remaining, dzięki czemu ekran może poinformować użytkownika, ile prób mu zostało — bez samodzielnego liczenia.
Zdarzenia dostarczenia to podpisana subskrypcja workspace'u. Prelude wysyła na callback_url ustawiany per weryfikacja. Endpointy Bird rejestruje się raz, każdy subskrybowany na wybrane typy zdarzeń, a każda dostawa jest podpisana zgodnie ze Standard Webhooks — URL nie trafia do body żądania, a odbiorca ma co zweryfikować.
Agent może przeprowadzić cały proces. Hostowany serwer MCP od Bird udostępnia agentowi trzy narzędzia weryfikacyjne w prawdziwym workspace: rozpoczęcie weryfikacji, sprawdzenie kodu i przejście do następnego kanału. Nie może rekonfigurować polityki stojącej za nimi — to celowe, nie przeoczenie.
Macierz porównawcza
Porównanie funkcja po funkcji.
Oba API mają zbliżoną strukturę, więc większość wierszy jest wyrównana, a różnice są niewielkie. Porównaj wiersz dotyczący bezpiecznych ponowień ze stroną Twilio Verify: w obu przypadkach wygrywa Bird, bo żadne z wywołań create nie dokumentuje klucza idempotencji. Warstwa ryzyka Prelude jest ustępstwem opisanym powyżej, a nie wierszem w tabeli, ponieważ Bird nie oferuje niczego porównywalnego.
| Capability | Bird | Prelude | Who wins? |
|---|---|---|---|
| Żądanie create | JSON na /v1/verify/verifications z kluczem bearer. Odbiorca to to.phone_number lub to.email, a ponowne wywołanie create dla aktywnego odbiorcy ponawia próbę zamiast tworzyć nową weryfikację. | JSON na endpoint weryfikacji v2 z kluczem bearer. Odbiorca to target.type i target.value, a ponowne wywołanie create dla aktywnego odbiorcy ponawia próbę w ten sam sposób. | |
| Bezpieczne ponowienia | Nagłówek Idempotency-Key w żądaniu create sprawia, że ponowienie jest bezpieczne. | Dokumentacja ich create nie opisuje klucza idempotencji ani własnego nagłówka, więc ponowienie po timeout-cie może wygenerować drugi kod. dispatch_id nim nie jest: Prelude definiuje go jako identyfikator dispatchu pochodzącego z front-endowego SDK, który pozwala ich warstwie antyfraudowej powiązać przechwycone sygnały z tą weryfikacją. | |
| Co mówi nieudana weryfikacja | success równa się false z powodem: incorrect_code, expired lub attempts_exhausted, a obok attempts_remaining. | Status failure obejmuje zarówno błędny kod, jak i wyczerpanie prób; expired_or_not_found to osobna wartość. Oba rodzaje niepowodzenia nie są rozróżniane. | |
| Kanały dostarczenia kodu | E-mail, SMS, WhatsApp i Telegram. Kanał głosowy jest oznaczony jako „Rolling out | Opublikowana lista kanałów obejmuje SMS, połączenie głosowe, RCS, WhatsApp, Telegram, Viber, Zalo i cichą autoryzację sieciową — w ponad 230 krajach, z automatycznym fallbackiem między nimi. | |
| Zdarzenia dostarczenia | Webhook workspace'u subskrybowany na wybrane typy zdarzeń weryfikacyjnych, takie jak verify.verification.verified i verify.attempt.delivered, podpisany zgodnie ze Standard Webhooks. | callback_url ustawiany per weryfikacja w żądaniu create, więc adres docelowy podąża za każdym wywołaniem. | |
| Kontrola fallbacku | Plan kanałów kraju ustala kolejność i jest realizowany automatycznie — timer dostarczenia per próba przesuwa do następnego kanału, gdy nie nadchodzi status dostarczenia. Wywołanie next-channel przesuwa pojedynczą weryfikację na żądanie. | max_auto_fallbacks i force_challenge regulują eskalację bezpośrednio w żądaniu create. | |
| Hostowany serwer MCP | Trzy narzędzia weryfikacyjne na hostowanym serwerze mcp.bird.com: rozpoczęcie weryfikacji, sprawdzenie kodu i przejście do następnego kanału. Konfiguracja nie jest wśród nich. | Prelude publikuje backendowe SDK dla Node.js, Python, Go, Kotlin/Java, Ruby, PHP i C# oraz frontendowe SDK dla Web, Android, iOS, React Native i Flutter — więc historia agentowa to biblioteka wywoływana przez Twoje własne środowisko uruchomieniowe. | |
| Długość kodu | options.code_length przy tworzeniu, w przeciwnym razie domyślna wartość workspace'a. | options.code_size przy tworzeniu. |
Ta sama weryfikacja
Rozpoczęcie jednej weryfikacji.
Struktury są na tyle podobne, że w większości sprowadza się to do zmiany nazw: target staje się to, a code_size staje się code_length. To, co nie ma odpowiednika w Bird, to obiekt signals, dispatch_id wśród elementów, które go zasilają, oraz brak verdict w odpowiedzi, na podstawie którego można rozgałęziać logikę. To, co pojawia się tylko po stronie Bird, to nagłówek Idempotency-Key.
Prelude
const signupId = crypto.randomUUID();
const response = await fetch("https://api.prelude.dev/v2/verification", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.PRELUDE_API_TOKEN}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
target: { type: "phone_number", value: "+15551234567" },
dispatch_id: signupId,
options: { code_size: 6 },
}),
});
const verification = await response.json();
console.log(verification.id, verification.status);
Bird
import { BirdClient } from "@messagebird/sdk";
const bird = new BirdClient({ apiKey: process.env.BIRD_API_KEY! });
const signupId = crypto.randomUUID();
const { data, error } = await bird.verify.verifications
.create(
{
to: { phone_number: "+15551234567" },
options: { code_length: 6 },
},
{ idempotencyKey: signupId },
)
.safe();
if (error) console.error(error.message);
else console.log(data.id, data.status);
Koszt migracji
Niski, chyba że korzystasz z warstwy oceny ryzyka.
Oba API opierają się na odbiorcy, a nie na identyfikatorze weryfikacji, więc wywołania przenoszą się niemal bez zmian: target.value staje się to.phone_number lub to.email, code_size staje się code_length, a callback_url przypisany do pojedynczej weryfikacji zostaje zastąpiony webhookiem workspace'a subskrybującym wybrane typy zdarzeń verify. dispatch_id nie ma swojego odpowiednika, ponieważ należy do warstwy oceny ryzyka, a nie do mechaniki wywołania create. Ponadto create w Bird przyjmuje nagłówek Idempotency-Key, którego Prelude nie dokumentuje.
Warstwa oceny ryzyka to część, która w ogóle nie jest zwykłym przeniesieniem. Jeśli rozgałęziasz logikę na podstawie verdict z Prelude, wysyłasz signals przy tworzeniu lub polegasz na shadow block, po stronie Bird nie ma niczego, do czego można przenieść tę logikę — decyzja musi zapaść przed wywołaniem. Najpierw oceń tę lukę, bo cała reszta to jedno popołudnie pracy.
Pytania, które ludzie faktycznie zadają
Czy Bird jest dobrą alternatywą dla Prelude?
Co się dzieje z signals i verdict z Prelude?
Czy tracę bezpieczne ponowne próby przy migracji?
Które kanały tracę?
Co dalej
Najlepiej zacząć od przewodnika migracji: mapuje API pole po polu.