Skip to main content
Phrase Strings Over-the-Air (OTA) lets you update translations in live applications without submitting a new app version to an app store or redeploying to your server. Once your app integrates our OTA SDK, it fetches translations from the Phrase CDN at runtime. When you publish a new release, users see updated strings as soon as the app has fetched them. OTA currently integrates with iOS, Android, React Native, Flutter, i18next, and Rails.

Core concepts

OTA is built around two resources: distributions and releases.

Distributions

A distribution defines which Phrase Strings projects, locales, and platforms are bundled for OTA delivery. Each distribution has its own credentials — a distribution ID and an environment secret — that the SDK uses to authenticate against the Phrase CDN. Multiple distributions are possible, but the recommended setup is one distribution per project. When a distribution targets both iOS and Android, string placeholders between the two formats are automatically converted. A distribution can optionally be restricted to only serve reviewed translations — keys that have not passed review are omitted from releases published under that distribution.
Distribution settings only take effect on releases published after the change. If you update a distribution (e.g. its fallback languages or reviewed-only setting), publish a new release for connected SDKs to pick it up.

Language fallbacks

A distribution offers three independent fallback options, applied when a requested translation is unavailable or doesn’t exist:
  • Use language fallback — serve the fallback languages configured in the project’s language settings instead of the requested language.
  • Fallback languages exclude regions (recommended) — if a requested regional language isn’t found, the region is dropped and the base language is served instead (e.g. de-DEde).
  • Fallback languages use the default locale (recommended) — if the requested language isn’t found at all, the project’s default locale is served instead (e.g. en-AUen-US).
Fallbacks do not apply to linked keys.

Releases

A release is a point-in-time snapshot of the translations in a distribution. Publishing a release exports the current project state and makes it available to any device or instance running an SDK configured with that distribution’s credentials. Releases support semantic version constraints: you can target a release to a range of app versions (e.g. >= 2.0.0 < 3.0.0), so users on older versions are not served translations that reference keys added in a newer release.

Environments

Every distribution has two environment secrets: development and production. The SDK receives releases for whichever environment its secret belongs to. A newly created release is available to the development environment immediately. It reaches the production environment only once you publish it (using the API endpoint, or Publish in the dashboard).
In practice: point debug and QA builds at the development secret to preview a release before it ships, and point store/production builds at the production secret so end users only see releases you have explicitly published.

Release triggers

Release triggers automate release publishing on a cron schedule. Configure a trigger on a distribution to create and publish new releases automatically at a set frequency, without manual intervention.

Resilience

OTA SDKs are designed so that a slow network or an unavailable OTA service never breaks your app. When the SDK cannot reach the Phrase CDN, it resolves translations through a layered fallback chain:
  1. On-device cache — the last release successfully fetched is stored locally. As long as a device has fetched at least one release, it continues to display those translations indefinitely, regardless of connectivity.
  2. Bundled translations — if the device has never successfully fetched a release (e.g. on first launch with no network), the SDK falls back to the translation files shipped inside the app binary.
Because the bundled translations are the final safety net, keep them up to date with every app release. A device that has never been online will always see the bundled strings, so stale bundles lead to stale copy for those users.

Usage limits

OTA usage is subject to limits based on the number of requests and Monthly Active Users (MAU). The exact allowances depend on your Phrase subscription — see the pricing page for your plan’s details.

Data sent with each request

Each SDK request to the Phrase CDN includes: the device identifier, app version, cached translation file timestamp, SDK version, requested locale, file format, client type, distribution ID, and environment secret. No other device or user data is transmitted.

Reports

Each distribution provides usage reports, refreshed twice a day, covering:
  • Active users
  • Overall requests
  • Requests per language
  • Requests per platform
  • Device languages not covered by the distribution
Reports are accessible from the Over the air page in the Phrase Strings dashboard.

Supported SDKs

iOS

PhraseSDK for Swift and Objective-C apps. Supports SPM, CocoaPods, and Carthage.

Android

Kotlin and Java SDK with Jetpack Compose and Android Views support.

Flutter

Cross-platform SDK for iOS, Android, and desktop.

React Native

SDK for React Native apps on iOS and Android.

i18next

JavaScript plugin for React, Vue, Angular, Node.js, React Native, and any i18next-based app.

Ruby on Rails

Ruby gem that replaces the Rails i18n backend with Phrase OTA.

Network requirements

The SDKs communicate with the following domains. Add them to your allowlist if your network restricts outbound connections:

API reference

Manage distributions and releases programmatically.

Distributions

Create and manage OTA distributions.

Releases

Publish translation snapshots to connected SDKs.

Release Triggers

Automate release publishing.