# Flutter

Once you've started receiving data from a [device](https://app.gitbook.com/s/eJJpVMsUARUJq9lYmL6t/streaming-api/core-concepts#device) into your app, you can start sending this data to Terra's websocket server.

{% hint style="info" %}

#### Prerequisite

Before following the steps below, make sure you've followed the guide to [stream data from a wearable device to your app](https://docs.tryterra.co/streaming-api/connect-wearable-to-sdk/flutter)
{% endhint %}

## Streaming to Terra's Server

You'll have previously set up a local stream using `startRealtimeToApp`. To send data to Terra's server instead, use `startRealtimeToServer` with a **streaming token**:

```dart
import 'package:terra_flutter_rt/terra_flutter_rt.dart';
import 'package:terra_flutter_rt/types.dart';

Future<void> startServerStreaming() async {
  // 1. Get the Terra user ID
  final userId = await TerraFlutterRt.getUserId();
  if (userId == null) return;

  // 2. Get a streaming token from your backend
  final token = await fetchStreamingTokenFromBackend(userId);

  // 3. Start streaming to Terra's server
  await TerraFlutterRt.startRealtimeToServer(
    Connection.ble,
    [DataType.heartRate, DataType.steps],
    token,
  );
}
```

{% hint style="info" %}
**Flutter has separate functions** for local vs server streaming:

* `startRealtimeToApp` — streams to a local callback only (no server)
* `startRealtimeToServer` — streams to Terra's websocket server only (no local callback)

To receive data both locally and on your server, call `startRealtimeToApp` for the local callback and have your backend consume from the [Terra websocket](https://docs.tryterra.co/streaming-api/terra-greater-than-your-backend).
{% endhint %}

Your backend should generate the streaming token by calling:

{% openapi src="<https://raw.githubusercontent.com/tryterra/openapi/refs/heads/master/rt.yml>" path="/auth/user" method="post" %}
<https://raw.githubusercontent.com/tryterra/openapi/refs/heads/master/rt.yml>
{% endopenapi %}
