> ## Documentation Index
> Fetch the complete documentation index at: https://launchdarkly-preview.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Erlang SDK reference

> This topic documents how to get started with the Erlang SDK, and links to reference information on all of the supported features.

> For the complete documentation index, see [llms.txt](/llms.txt). For the full documentation snapshot, see [llms-full.txt](/llms-full.txt).

<Note title="Recent major versions">
  **Version 3 of the Erlang SDK requires Gun 2.x**. To learn more about upgrading, read [Erlang (server-side) SDK 2.x to 3.0 migration guide](/sdk/server-side/erlang/migration-2-to-3).
</Note>

## Overview

This topic documents how to get started with the Erlang SDK, and links to reference information on all of the supported features.

<Note title="SDK quick links">
  LaunchDarkly's SDKs are open source. In addition to this reference guide, we provide source, API reference documentation, and sample applications:
</Note>

| Resource | Location |
| - | - |
| SDK API documentation | [SDK API docs](https://hexdocs.pm/launchdarkly_server_sdk/) |
| Supported SDK Versions | [Erlang server SDK](../concepts/supported-versions#erlang-server-sdk) |
| GitHub repository | [erlang-server-sdk](https://github.com/launchdarkly/erlang-server-sdk/) |
| Sample applications | [Erlang](https://github.com/launchdarkly/hello-erlang/) ,  [Elixir](https://github.com/launchdarkly/hello-elixir) ,  [Phoenix](https://github.com/launchdarkly/hello-phoenix) |
| Published module | [Hex](https://hex.pm/packages/launchdarkly_server_sdk) |

## Get started

Follow the steps below to get started using the LaunchDarkly SDK in your Erlang application.

First, download the dependency using [Rebar](https://www.rebar3.org/):

<CodeGroup>
  ```erlang title="Erlang" theme={null}
      {deps, [
        {ldclient, "3.0.0", {pkg, launchdarkly_server_sdk}}
      ]}.
  ```
</CodeGroup>

Then, add it to your `app.src` file:

<CodeGroup>
  ```erlang title="Erlang" theme={null}
      {applications,
        [kernel,
        stdlib,
        ldclient
      ]},
  ```
</CodeGroup>

If you use Elixir, you can download the dependency using [Mix](https://elixir-lang.org/getting-started/mix-otp/introduction-to-mix.html):

<CodeGroup>
  ```erlang title="Elixir" theme={null}
      defp deps do
        [
          {:ldclient, "~> 3.0.0", hex: :launchdarkly_server_sdk}
        ]
      end
  ```
</CodeGroup>

<Note title="The Erlang SDK uses an SDK key">
  The Erlang SDK uses an SDK key. Keys are specific to each project and environment. They are available from **Project settings**, on the **Environments** list. To learn more about key types, read [Keys](/sdk/concepts/client-side-server-side#keys).
</Note>

### Initialize the client

After you install the SDK dependency, create an instance of the client. Specify your SDK key here to authorize your application to connect to a particular environment within LaunchDarkly.

<Tip title="Use a single instance">
  The Erlang SDK supports starting multiple instances, but most use cases only need a single instance. Consider using multiple instances only if you need to simultaneously access more than one environment. Do not start an instance every time you need to make a variation or other SDK call.
</Tip>

Here is an example:

<CodeGroup>
  ```erlang title="Erlang" theme={null}
      % This starts an instance with the default options
      ldclient:start_instance("YOUR_SDK_KEY")

      % You can also start a named instance
      ldclient:start_instance("YOUR_SDK_KEY", your_instance)
  ```
</CodeGroup>

To learn more about the specific configuration options available for this SDK, read [`ldclient_config`](https://hexdocs.pm/launchdarkly_server_sdk/ldclient_config.html).

### Evaluate a context

Next, check which flag variation a specific context should receive:

<CodeGroup>
  ```erlang title="Erlang SDK v2.0+" theme={null}
      Flag = ldclient:variation(<<"example-flag-key">>, #{key => <<"example-context-key">>}, false)
  ```

  ```erlang title="Erlang SDK v1.x" theme={null}
      Flag = ldclient:variation(<<"example-flag-key">>, #{key => <<"example-user-key">>}, false)
  ```
</CodeGroup>

## Transport Layer Security (TLS)

The SDK includes configuration options that allow you to set custom TLS options. If you don't set these options, then the SDK will use the Erlang/OTP defaults. The default TLS connection settings in Erlang/OTP do not validate the identity or authenticity of certificates.

If your application has existing TLS options, then you can pass them to the SDK:

<CodeGroup>
  ```erlang title="Erlang" theme={null}
        ldclient:start_instance(SdkKey, #{
        http_options => #{
            tls_options => YourOptions
        }}),
  ```
</CodeGroup>

The SDK also provides helper methods to create TLS options. We recommend ensuring that the SDK is using a Certificate Authorities (CA) store that is regularly updated for production environments.

Here is a list of helper methods:

* `ldclient_config:tls_basic_options()`: This helper provides a basic TLS configuration suitable for development. It tries to use a CA store in the default location for many linux distributions (`/etc/ssl/certs/ca-certificates.crt`). If it can't find the store, then it will use the store from the `certifi` package.
* `ldclient_config:tls_basic_linux_options()`: This helper provides a basic TLS configuration for linux. It uses the CA store located at `/etc/ssl/certs/ca-certificates.crt`.
* `ldclient_config:tls_ca_certfile_options(CaStorePath)`: This helper provides a basic TLS configuration with the CA store you specify.
* `ldclient_config:tls_basic_certifi_options()`: This helper provides a basic TLS configuration that uses the `certifi` store. Because this store is from a dependency of the package, it is not maintained or updated by OS releases.
* `ldclient_config:with_tls_revocation(TlsOptions)`: This helper extends a TLS configuration with certificate revocation. Revocation is not included in the basic configuration because the Erlang/OTP does not cache revocation results. Enabling this feature incurs additional requests per request the SDK makes.

## Shut down the client

Shut down the client when your application terminates. To learn more, read [Shutting down](/sdk/features/shutdown#erlang).

## Supported features

This SDK supports the following features:

* [Anonymous contexts and users](/sdk/features/anonymous#erlang)
* [Configuration](/sdk/features/config#erlang), including
  * [Application metadata configuration](/sdk/features/app-config#erlang)
  * [Service endpoint configuration](/sdk/features/service-endpoint-configuration/server-side#erlang)
* [Context configuration](/sdk/features/context-config/server-side#erlang)
* [Evaluating flags](/sdk/features/evaluating#erlang)
* [Flag evaluation reasons](/sdk/features/evaluation-reasons/server-side#erlang)
* [Getting all flags](/sdk/features/all-flags#erlang)
* [Identifying and changing contexts](/sdk/features/identify#erlang)
* [Offline mode](/sdk/features/offline-mode#erlang)
* [Private attributes](/sdk/features/private-attributes/server-side#erlang)
* [Reading flags from a file](/sdk/features/flags-from-files#erlang)
* [Relay Proxy configuration](/sdk/features/relay-proxy-configuration)
  * [Using proxy mode](/sdk/features/relay-proxy-configuration/proxy-mode#erlang)
  * [Using daemon mode](/sdk/features/relay-proxy-configuration/daemon-mode#erlang)
* [Sending custom events](/sdk/features/events#erlang)
* [Shutting down](/sdk/features/shutdown#erlang)
* [Storing data](/sdk/features/storing-data#erlang)
* [Test data sources](/sdk/features/test-data-sources#erlang)
