---
sidebar_position: 1
title: SDKs Overview
description: Firetell SDKs — client libraries for integrating with the Firetell platform.
---

# SDKs Overview

Firetell provides official client libraries and SDKs to simplify integration, handle WebRTC calling, and manage WebSocket communication within your applications.

Using our SDKs ensures that best practices—such as automatic reconnects, authentication timeouts, and media track management—are handled for you out of the box.

---

## Available SDKs

### JavaScript / TypeScript SDK

The `@firetell/firetell-client-sdk` library is compatible with browser environments (using ES Modules or loaded via a CDN script tag) for building WebRTC-based calling applications, and Node.js environments (using CommonJS) for receiving real-time events via WebSocket connection. It enables you to integrate real-time voice, video, and event features directly into your applications.

- **Package:** [`@firetell/firetell-client-sdk`](https://www.npmjs.com/package/@firetell/firetell-client-sdk)
- **Status:** Active / Stable
- **Interactive Live Demo:** [https://developers.firetell.com/firetell-client-sdk/example/](https://developers.firetell.com/firetell-client-sdk/example/)
- **Guides:** [Installation & Setup](/docs/sdks/javascript/installation) • [Client Authentication](/docs/sdks/javascript/authentication) • [Quickstart Guide](/docs/sdks/javascript/quickstart) • [API Reference](/docs/sdks/javascript/api-reference)

---

### Flutter SDK

The `firetell_flutter_sdk` package enables native iOS and Android apps to make and receive VoIP calls using WebRTC, with full support for push notifications (FCM & APNs), CallKit (iOS), and ConnectionService (Android).

- **Package:** [`firetell_flutter_sdk`](https://pub.dev/packages/firetell_flutter_sdk)
- **Status:** Active / Stable
- **Guides:** [Installation & Setup](/docs/sdks/flutter/installation) • [Quickstart Guide](/docs/sdks/flutter/quickstart) • [VoIP Push Notifications](/docs/sdks/flutter/voip-push) • [API Reference](/docs/sdks/flutter/api-reference)

---

## Handling Concurrent Incoming Calls

When multiple incoming calls arrive simultaneously or an incoming call arrives while an agent is currently on an active call, Firetell supports two standard frontend integration patterns:

### Pattern A: Call Waiting & Hold (Multi-Call Management)

Allow the agent to receive call waiting notifications, put the current call on hold, and answer the new incoming call:

import Tabs from '@theme/Tabs';
import TabItem from '@theme/TabItem';

<Tabs>
<TabItem value="ts" label="JavaScript / TypeScript" default>

```typescript
let activeCall: Call | null = null;

client.events.on("call.offer", async (incomingCall: Call) => {
  if (activeCall && activeCall.active) {
    // 1. Show Call Waiting notification on UI
    console.log(
      `Call Waiting from ${incomingCall.from} (${incomingCall.from_name})`,
    );

    // 2. When Agent clicks "Hold & Answer":
    await activeCall.hold();
    await incomingCall.accept();
    activeCall = incomingCall;
  } else {
    // Single call flow
    activeCall = incomingCall;
  }
});
```

</TabItem>
<TabItem value="dart" label="Flutter / Dart">

```dart
Call? activeCall;

client.onCallOffer.listen((incomingCall) async {
  if (activeCall != null && activeCall!.active) {
    // 1. Show Call Waiting notification on UI
    print('Call Waiting from ${incomingCall.from} (${incomingCall.fromName})');

    // 2. When Agent taps "Hold & Answer":
    await activeCall!.onhold();
    await incomingCall.accept();
    activeCall = incomingCall;
  } else {
    activeCall = incomingCall;
  }
});
```

</TabItem>
</Tabs>

### Pattern B: Auto-Reject / Busy (Single-Call Policy)

If your call center policy restricts agents to one call at a time:

<Tabs>
<TabItem value="ts" label="JavaScript / TypeScript" default>

```typescript
client.events.on("call.offer", async (incomingCall: Call) => {
  if (client.activeCalls.size > 1) {
    // Auto-reject 2nd call with Busy status (SIP 486 Busy)
    // The backend Call Flow will immediately execute the fallback branch (Voicemail/Reroute)
    await incomingCall.reject();
  }
});
```

</TabItem>
<TabItem value="dart" label="Flutter / Dart">

```dart
client.onCallOffer.listen((incomingCall) async {
  if (client.activeCalls.length > 1) {
    // Auto-reject 2nd call with Busy status (SIP 486 Busy)
    // The backend Call Flow will immediately execute the fallback branch
    await incomingCall.reject();
  }
});
```

</TabItem>
</Tabs>

---

## Planned SDKs

We are actively developing SDKs for additional languages and mobile frameworks to help you build native apps:

| Platform / Language | Status     | Package Name                | Target Environment |
| :------------------ | :--------- | :-------------------------- | :----------------- |
| **React Native**    | 🔜 Planned | `firetell-react-native-sdk` | iOS & Android      |

If you need an SDK for another language, please reach out to us at [developers@firetell.com](mailto:developers@firetell.com).
