Whatever you do in the panel, kodla da yapabilirsiniz.

One package, five surfaces, twelve entry points. Write logs, send email/SMS/push, manage your Radio project and chat inbox, put live chat in your mobile app, all under the same contract.

npm install signalbird
5surfaces
12entry points
109methods, same names everywhere
0dependencies

Five surfaces

Enter through the door that matches your job

All five surfaces share ONE key: your domain's. The distinction is not the surface but the key type, the secret key stays on your server and can do everything; the public key ships to the browser and only touches the visitor's own data.

Logs and events

Telsiz

Writes a message from your application into a channel. Who gets notified, on which channel and at what hours lives in the panel, changing the rule needs no release.

Anahtar
sb_secret_live_… / sb_public_live_…
Where it runs
Server and browser
metot
7
E-posta · SMS · Push

Messaging

Sends transactional and commercial messages; manages contacts, lists and campaigns, reads message states and verifies webhook signatures.

Anahtar
sb_secret_live_…
Where it runs
Server only
metot
20
Proje · Gelen kutusu · Uygulama

Management

Everything you do by clicking in the panel: open a Radio project and channel, read the event stream, work the chat inbox, manage apps and devices.

Anahtar
sb_secret_live_…
Where it runs
Server only
metot
45
End-user chat + push

Uygulama

For your customer's users: live chat and push device registration. Write your own interface or embed the ready-made widget.

Anahtar
sb_public_live_…
Where it runs
Web, iOS, Android
metot
17
Sell Signalbird inside your own product

Partner

For contracted platforms: you open the customer account, add its domain, collect the payment and enable the modules. You embed the panel screen in your own page, not a copy of it, the same screen. It is NOT a super admin: your key only sees the accounts you opened.

Anahtar
sb_secret_live_…
Where it runs
server only
metot
20
No code

Ready-made widget

Put live chat on your site with a single script tag. Color, position and greeting are set in the panel.

File
signalbird.io/sdk/v1/signalbird.js
Anahtar
sb_public_live_…

The Management surface is not an admin interface. A key belongs to a single team and touches only that team's records; user, billing and subscription operations are not in the SDK.

One key

One line in your .env file.

SIGNALBIRD_DOMAIN_KEY=sb_secret_live_…
sb_secret_live_…

Secret key

Lives on your server and does everything. It is shown once in the panel; if you lose it, create a new one. No URL to configure, the production base is built into the package.

sb_public_live_…

Public key

Embedded in the browser and mobile apps. It only touches the visitor's own data and only works from domains you allow.

MAIL_MAILER=signalbird

On Laravel, your existing Mailable classes send through Signalbird without any changes. Add a channel to config/logging.php and your Log::error() lines land in Radio too.

Code samples

Pick your language, copy it

Every call here genuinely exists in the package. Method names are identical across languages; only the naming convention changes.

Node.js / TypeScript
import { signalbird } from 'signalbird'

// SIGNALBIRD_DOMAIN_KEY ortam değişkeninden okunur

// Kritik kanal - kime gideceği, sessiz saatte ne olacağı,
// kaç kez uyaracağı PANELDE durur. Kod yalnız olayı bildirir.
await signalbird().critical('critical', 'ödeme servisi yanıt vermiyor', {
  service: 'iyzico',
  attempt: 3,
})

// Rutin kayıt - panelde görünür, bildirim göndermez
await signalbird().info('info', 'ahmet@x.com yeni hesap oluşturdu')

// Yakalanmamış hatalar tek satırla bağlanır
signalbird().captureUncaught('critical')

Node.js / TypeScript: Open →

In five minutes

From install to the first call

Add your domain, get its key

Panel → Domains → add and verify via TXT → Keys → New key. The secret key is shown once and goes into .env; the public key is embedded in the browser. Lose it and you simply create another, there is no limit.

Paketi kurun

One package carries every surface. It brings no dependencies, it will not fight your project's HTTP client version.

Call it

It does not throw: if Radio is unreachable your payment flow keeps working. The result is always an ok/status/code envelope.

Manage the rule from the panel

Channel settings, working hours, alert recipients and chat appearance live in the panel. Your code only reports the event.

Dil matrisi

What exists in which language

They ship from the same tag and carry the same version. There is no separate SDK repository and no per-language versioning.

Dil / platformTelsizMessagingManagementUygulamaKurulum
Node.js / TypeScript✓✓✓✓npm install signalbird
Tarayıcı (düz JS)✓··✓npm install signalbird
React / Next.js✓✓✓✓npm install signalbird
Vue 3✓··✓npm install signalbird
Angular✓··✓npm install signalbird
React Native / Expo✓··✓npm install signalbird
PHP / Laravel✓✓✓·composer require pariette/signalbird
Python✓✓✓·pip install signalbird
Go✓✓✓·go get github.com/Pariette-Inc/signalbird.sdk/v2
.NET / ASP.NET Core✓✓✓·dotnet add package Signalbird.Sdk
Swift (iOS)✓··✓https://github.com/Pariette-Inc/signalbird.sdk
Kotlin (Android)✓··✓implementation("io.signalbird:signalbird-sdk:2.10.1")

Design decisions

Why it is written this way

Zero dependencies

fetch on Node, cURL in PHP, urllib in Python, the standard library in Go, HttpClient in .NET. An SDK dictating an HTTP client version is the most common source of version conflicts.

Parity across languages

A method added to one language and not another breaks the build. The method set of all five surfaces is identical in every language.

Silent failure

Shipping a log or drawing a chat bubble is not your application's real job. If Signalbird is unreachable, your payment flow keeps running.

No automatic retry

Sending the same message twice costs more than not sending it at all, and ringing a critical alarm twice is no better. The decision to retry is yours.

One key, one domain

A key belongs to a domain: penyu.io's key cannot reach submitcms.com's data. What you embed in code is not the key but the channel's name, rotate the key and your code stays the same.

Public and secret keys are separate

Only the public key reaches browsers and mobile apps; its safety comes from constraint rather than secrecy, allowed origins, allowed channels, only its own data.

Error codes

Silent failure, explicit code

The default behaviour is not to throw. The result envelope returns ok:false and a machine-readable code; during development you can turn exceptions on with throwOnError.

INVALID_KEYKey missing, wrong, or project inactive
WRONG_KEY_TYPEKey from the wrong family, caught at construction time
SECRET_KEY_IN_BROWSERA secret key was used from a browser
ORIGIN_NOT_ALLOWEDThis domain is not registered on the key
API_KEY_SCOPEThe key lacks the required scope (e.g. radio:write)
MODULE_DISABLEDYour package does not include this module
LIMIT_REACHEDYour monthly limit is used up
VALIDATION_ERROR422, the body failed validation
VISITOR_INVALIDThe visitor secret is invalid; the local identity is cleared and a new session opens
NETWORK_ERRORThe network was unreachable (status 0)
TIMEOUTTimed out (status 0)