---
updatedAt: 2026-08-12T00:10:32.000Z
agentTools:
  projectIndex: https://docs.atono.io/llms.txt
---

# SDK configuration

Customize how the Atono SDK functions in your application.

In most cases, initializing the SDK with an environment key is all you need. The options on this page let you customize its behavior for specific requirements.

Some options are intended primarily for testing and may not be useful in production.

<br />

***

# Add configuration to the SDK

Pass configuration as the second argument to `Atono.fromEnvironmentKey()` using a JavaScript object:

```javascript
const atono = Atono.fromEnvironmentKey('<your-environment-key>', {
    // configuration options go here
});
```
```java
Atono.builder()
  // call builder functions to configure the SDK.
  .build("<your-environment-key>");
```

<br />

***

# Configuration options

<br />

## API

<br />

### `apiBaseUrl`

**Type**: `string`

Overrides the base URL for the Atono API. This can be used to point the SDK to a local replica of the Atono service for resilience.

**Default**: `https://api.atono.io`

```java
atonoBuilder.atonoBaseUrl("https://api.atono.io");
```

## Feature flags

<br />

### `featureFlags`

**Type**: `object`

Contains configuration options for the feature flags module.

<br />

### `featureFlags.autoSync`

**Type**: `boolean`

Controls whether the SDK regularly polls Atono for updated feature flag definitions.

When disabled, the SDK still attempts to retrieve an initial set of flag configurations and retries until successful. After retrieving the initial configuration, it doesn’t check for further updates.

**Default**: `true`

```java
// to disable autosync...
atonoBuilder.withPollingFeatureFlag(config -> config.disableAutoSync());

// to enable autoSync, set a sync interval (see below)
```

### `featureFlags.publishEvaluation`

**Type**: `boolean`

Controls whether the SDK publishes feature flag evaluation events to Atono. These events allow Atono to suggest slice values based on actual evaluations.

**Default**: `true`

```java
// to disable flag evaluation reporting...
atonoBuilder.disableFeatureFlagReporting();

// to enable flag evaluation reporting...
atonoBuilder.withFeatureFlagPublisher();
```

### `featureFlags.syncInterval`

**Type**: `number`

Sets how frequently, in milliseconds, the SDK polls Atono for updated feature flag definitions.

This option is ignored when `featureFlags.autoSync` is disabled.

**Default**: `5000` milliseconds (every 5 seconds)

```java
atonoBuilder.withPollingFeatureFlag(config -> config.syncIntervalMs(5000))
```

## HTTP client

<br />

### `httpClient`

**Type**: `object`

Contains configuration options for the HTTP client.

<br />

### `httpClient.timeout`

**Type**: `number`

Sets the number of milliseconds the SDK waits before timing out an HTTP request.

**Default**: `2000` milliseconds (2 seconds)

```java
atonoBuilder.apiClientTimeoutMs(2000);
```

## Location

Location configuration is only available in the Web SDK and the React SDK.

### `location`

**Type**: `object`

Contains configuration options for the location module. Location is used when evaluating feature flags with location-based slices.

<br />

### `location.implementation`

**Type**: `LocationService`

Sets the location service implementation.

The SDK provides the following implementations:

* `CachedIpBasedLocationService` — the default implementation. It uses the requester’s IP address to determine location through a third-party service. It can’t be selected through configuration.
* `NoopLocationService` — disables the location service. Feature flag evaluations continue to work, but location-based slices are ignored.

<br />

### `location.cacheLocationTtl`

**Type**: `number`

Sets how long, in milliseconds, cached location data remains valid when using `CachedIpBasedLocationService`.

**Default**: `undefined`, meaning cached location data doesn't expire.

<br />

### `location.ipOverride`

**Type**: `string`

Overrides the IP address used to retrieve location with a fixed IP address when using `CachedIpBasedLocationService`.

**Default**: `undefined` (no override)

<br />

## Logging

Logging configuration is available in the Web SDK, the React SDK and the NodeJS (server-side) SDK

<br />

### `log`

**Type**: `object`

Contains configuration options for the SDK logger.

<br />

### `log.implementation`

**Type**: `Logger`

Sets the logger implementation.

The SDK provides the following implementations:

* `ConsoleLogger` — the default implementation. It writes log events to the console.
* `NoopLogger` — doesn’t output log events, but still allows you to listen for structured log events.

<br />

### `log.level`

**Type**: `string`

Sets the minimum log level displayed by the SDK.

The following levels are available:

* `TRACE` — granular information about SDK processes
* `DEBUG` — low-level information about SDK processes
* `INFO` — high-level information about SDK processes
* `WARN` — problems the SDK can recover from but that may affect its behavior or result in lost metric data
* `ERROR` — errors that require manual intervention. The SDK has initialized and can continue operating from its internal state, but it may behave unexpectedly and metric data may be lost
* `FATAL` — errors that require manual intervention because the SDK couldn’t initialize

**Default**: `INFO`

The SDK throws an error during initialization if the value isn’t a valid log level.

<br />

### `log.onLogEvent`

**Type**: `function`

Provides a hook for listening to structured log events.

A log event listener receives a log entry and returns nothing. The log entry contains at least the following fields:

* `category` — the source of the log within the SDK
* `level` — the log level
* `message` — the log message
* `timestamp` — when the log was emitted

**Default**: `undefined`

The following example sends warnings and errors to a log collection service:

```javascript
const logThreshold = ['WARN', 'ERROR', 'FATAL'];

function eventListener(logEntry) {
    if (logThreshold.includes(logEntry.level)) {
        fetch('https://my-log-collection.service', {
            method: 'POST',
            body: JSON.stringify(logEntry)
        });
    }
}

const atono = Atono.fromEnvironmentKey('<your-environment-key>', {
    log: {
        onLogEvent: eventListener
    }
});
```