# Sinch Client

The *SinchClient* is the Sinch SDK entry point. It's used to configure the user’s and device’s capabilities, as well as to provide access to feature classes such as the *CallController*, *AudioController*, and *VideoController*.

## Create a *SinchClient*

```javascript
const sinchClient = Sinch.getSinchClientBuilder()
  .applicationKey("<application key>")
  .environmentHost("ocra.api.sinch.com")
  .userId("<user id>")
  .build();
```

- The *Application Key* is obtained from the [Sinch Developer Dashboard - Apps](https://dashboard.sinch.com/voice/apps).
- The *User ID* should uniquely identify the user.
- The term *Ocra* in the hostname `ocra.api.sinch.com` is the name of the Sinch API that SDK clients target.


## Start the Sinch client

Before starting, add a client listener (see
[SinchClientListener reference](https://download.sinch.com/js/latest/reference/interfaces/SinchClientListener.html)):

```javascript
sinchClient.addListener({
    onClientStarted: (client) => {
      // sinch client started successfully
    },
    onClientFailed: (client, error) => {
      // sinch client start failed
    },
    onCredentialsRequired: (client, registrationCallback) => {
      // registration required, get jwt token for user and register
    }
});

sinchClient.start();
```

### Authorizing the client / user

When `SinchClient` starts with a given user ID, you must provide an
authorization token (JWT) to register with Sinch. Implement
`SinchClientListener.onCredentialsRequired()` and supply a JWT signed with the
Application Secret.

The reference apps include a `JWT` helper showing how to create and sign the
token with the Application Secret.

See [Authentication & Authorization](/docs/in-app-calling/js/application-authentication) for
details.

Secrets in production
Do not embed the Application Secret in a production app.
Implement the required functionality on your backend and fetch a signed
registration token when required.

### Terminate the client

When you’re done, stop the client. If it’s listening for incoming events,
stop listening as well. After `terminate()` any object retrieved from the
client (`CallClient`, `AudioController`, etc.) is considered invalid.

Terminating the client:

```javascript
sinchClient.terminate();
```