Docs

Concepts, API, caching, and SDKs. Sign up to first feature in under five minutes.

Core concepts

How FeatureToggle models features, environments, and resolution.

Hierarchy

Loading diagram…
EntityWhat it is
OrganizationTeam workspace. Members are org-scoped.
ProjectA set of features and up to three environments.
EnvironmentA deployment target: development, staging, or production.
FeatureDefined at project level with a default value. Activation is per-environment.
OverrideAn optional per-environment value that differs from the project default (usesDefault: false).
API keyRead-only credential scoped to one environment.

Environments

Each project has up to three fixed roles:

RoleWhen availableKey prefixAPI scope
developmentSeeded on project createft_test_Loopback only (localhost, 127.0.0.1, ::1)
stagingAdd staging in the project sidebar (optional, once)ft_live_Any deployed origin
productionAdd production in the project sidebar (optional, once)ft_live_Any deployed origin
  • development is permanent. You cannot rename or delete it.
  • staging and production are optional add-ons (at most one each); require a paid plan to add.
  • Both staging and production are production-tier from an API perspective; the names are organizational.

Test keys return 403 from origins that are not loopback:

  • .local hostnames (e.g. myapp.local)
  • Private LAN IPs (RFC1918): 10.x.x.x, 172.16.x.x-172.31.x.x, 192.168.x.x

On the free plan, RFC1918 origins are always blocked. Phone-on-WiFi or homelab testing needs a paid plan plus an ft_live_ key in staging or production.

Features

Types

TypeDefault for new featuresExample value
booleanfalse (disabled)true / false
stringempty string"dark"
number042
jsonempty object{ "limit": 100 }

Key rules

  • Unique per project (case-sensitive).
  • Immutable after create. Choose a stable name client code will use forever.
  • Format: starts with a letter; then letters, digits, _, or -; 1-64 characters.

Project default vs environment activation

Features are defined at project level with a defaultValue. Activation (whether the feature is on) is set per environment. Per-environment value overrides are optional (usesDefault: false).

Loading diagram…

Two levels in the dashboard:

  1. Feature definitions: define keys, types, and default values, and deprecate features you are retiring.
  2. Environment → Features: use the switch to activate, the edit icon to change the value, and the menu for Turn off, Use default, or Clear.

Resolution

For each environment, FeatureToggle computes an effective value and effective enabled state:

  • Off when there is no FeatureValue row or enabled: false.
  • On when FeatureValue.enabled === true.
  • When on and usesDefault: true, value is the live project defaultValue.
  • When on and usesDefault: false, value is the stored override.

value and enabled are independent for all types (including boolean).

Public API behavior:

  • Only enabled features are returned.
  • Disabled features are omitted from bulk reads and return 404 on single-feature lookup.
  • The SDK caches only enabled features. isEnabled('missing') returns false; getValue('missing') returns undefined.

Feature lifecycle

Features are never individually deleted. Remove features by deleting the parent project (cascades everything).

StateDashboardPublic API / SDK
EnabledNormalReturned when enabled
DisabledShown (optional hide filter)Excluded / 404
DeprecatedDeprecated badge; overrides read-onlyReturned when enabled, with "deprecated": true

Disable and deprecate are independent controls. A feature can be disabled, deprecated, or both.

Deprecation

Mark a feature deprecated (Deprecate on Feature definitions) when you are migrating away but still need it to resolve during rollout.

  • Optional Replacement feature (inFavorOf) points to another feature in the same project.
  • Enabled deprecated features are included in default API responses.
  • Pass deprecated=false on GET /v1/features to exclude them.
  • The SDK logs a one-time warning per deprecated key when accessed; includes the replacement when set.

Example API payload:

{
  "key": "old-checkout",
  "type": "boolean",
  "value": true,
  "enabled": true,
  "deprecated": true,
  "inFavorOf": "new-checkout"
}

API keys

PropertyDetail
ScopeOne environment in one project
AccessRead-only access to all enabled features for that environment
StorageOnly a hash is stored server-side; plaintext shown once at creation
Prefixft_test_ (development) or ft_live_ (staging/production)
RevocationSets inactive; SDK clears cache on 401

Create keys in Environment → API keys (Create key). Multiple Active keys per environment are allowed.

Version and freshness

Each environment has a monotonic version number that increments when feature data affecting that environment changes. The public API exposes this as an ETag on bulk reads.

When you toggle a feature:

  1. The environment version bumps.
  2. Connected SDKs receive an SSE features-changed event.
  3. The SDK refreshes and picks up new values.

Details: Caching and syncs

What the client app cannot do via API

The public feature API is read-only. There is no HTTP API to:

  • Create, update, or delete features
  • Manage projects, environments, or keys
  • Access Billing or organization profile

All management happens in the dashboard.