Packages
WhatsApp Web API client for Elixir. Full-featured port of Baileys with end-to-end Signal Protocol encryption, multi-device support, groups, communities, media, newsletters, and native BEAM fault tolerance.
Current section
Files
Jump to
Current section
Files
user_docs/getting-started/first-connection.md
# First Connection
You will finish this page with a live BaileysEx connection that can pair by QR code or phone pairing code.
## Before you begin
- BaileysEx compiles successfully in your project
- You chose an auth-state directory
- Your machine can reach `web.whatsapp.com`
- You have your phone nearby for pairing
## Steps
### 1. Load or create auth state
Load the saved auth state and the matching file-backed Signal store options before every connection attempt.
```elixir
alias BaileysEx.Auth.FilePersistence
auth_path = "tmp/baileys_auth"
{:ok, persisted_auth} = FilePersistence.use_multi_file_auth_state(auth_path)
```
If the directory is empty, `use_multi_file_auth_state/1` returns a fresh state for a new pairing flow and the `connect/2` options needed to persist Signal keys in the same directory.
### 2. Start the connection with a real transport
Use `BaileysEx.connect/2` with `BaileysEx.Connection.Transport.MintWebSocket`.
```elixir
alias BaileysEx.Connection.Transport.MintWebSocket
parent = self()
{:ok, connection} =
BaileysEx.connect(
persisted_auth.state,
Keyword.merge(persisted_auth.connect_opts, [
transport: {MintWebSocket, []},
on_qr: fn qr -> IO.puts("Scan QR: #{qr}") end,
on_connection: fn update -> send(parent, {:connection_update, update}) end
])
)
```
The `:on_qr` callback gives you QR data for a new login. The `:on_connection` callback tells you when the socket opens or closes.
### 3. Persist updated credentials before pairing
Save credentials whenever the connection emits a `:creds_update` event.
```elixir
unsubscribe =
BaileysEx.subscribe_raw(connection, fn events ->
if Map.has_key?(events, :creds_update) do
{:ok, latest_auth_state} = BaileysEx.auth_state(connection)
:ok = persisted_auth.save_creds.(latest_auth_state)
end
end)
```
Attach this subscriber before you scan the QR or request a phone pairing code. Pair success emits the first credential update immediately.
### 4. Pair the session
For QR pairing, scan the QR from WhatsApp on your phone.
For phone pairing, request a code after the connection starts:
```elixir
{:ok, code} = BaileysEx.request_pairing_code(connection, "15551234567")
IO.puts("Enter this code in WhatsApp: #{code}")
```
Use only digits for the phone number. Do not include `+` or spaces.
## Check that it worked
Wait for a connection update like this:
```elixir
receive do
{:connection_update, %{connection: :open}} -> :ok
end
```
You should also see new credential data written to your auth directory after pairing succeeds.
---
**Next steps:**
- [Send Your First Message](sending-your-first-message.md) — send a real text message through the paired connection
- [Authentication and Persistence](../guides/authentication-and-persistence.md) — wire auth saving and custom key storage cleanly