Get started
Callx turns a push from your backend into a real phone call: the system incoming-call UI on iOS and Android, answer and decline from anywhere, and a call state your app can trust. This page explains the pieces; the next pages install them. Callx also provides native media integration, video surfaces, Android PiP and optional call UI. See the capabilities and screenshots.
Not sure which pages apply? Personalize your setup to get a checklist for your framework, platforms, UI, media and backend. Then follow your first real call.
The pieces of a call
| You provide | Callx provides |
|---|---|
| A backend that creates calls and sends an APNs VoIP push or an FCM data message | Receiving that push natively, deciding whether it may ring, reporting it to the OS |
| A media engine, or the LiveKit adapter | Starting and stopping media at the right moment, from any surface |
| Your call screens, or branding and controls for the optional UI components | A snapshot of the call, typed commands, replay, and optional overlay/mini-call UI |
| APNs and Firebase credentials, on your server | The incoming-call screen and notification on Android, CallKit on iOS |
Requirements
| Minimum | |
|---|---|
| iOS | 15.0, Xcode 26 or later, Swift 6 |
| Android | API 29 (Android 10), compile SDK 36 |
| Flutter | Flutter 3.41, Dart 3.11 |
| React Native | 0.76 (New Architecture or legacy), React 18 |
| Expo | SDK 57 with a development build (not Expo Go) |
iOS push delivery needs a physical device. Android emulators with Google Play services can receive FCM, though physical phones are still required for vendor and real-audio acceptance. The iOS Simulator cannot receive VoIP pushes and ends CallKit calls immediately; the Android emulator works for most flows.
Choose your path
Flutter
Add callx, call CallxPlugin.bootstrap from your Application and AppDelegate.
React Native CLI
Add @bear-block/callx, bootstrap from MainApplication and AppDelegate.
Then add audio: install the LiveKit adapter, or connect your own media. Want to look around first? Run the simulator, which needs no backend, no device and no credentials.
A complete first call, step by step
- Install and bootstrap Callx for your framework (the quick starts above).
- Register the push token:
callx.getPushToken()(TypeScript) orCallx.pushToken()(Dart) returns{type: 'voip' | 'fcm', token}. Send it to your backend. - Send an invitation from your backend: an APNs VoIP push or an FCM data message with a
callxpayload. Payload reference → - The phone rings natively, even if the app was killed.
- Answer. Callx tells your host to start media (the adapter does it for you), and your UI sees the call move from
incomingtoconnecting. - Media connects. The call becomes
active. - Hang up from either side. Both phones clean up, and a late push for the same call can never ring again.