Per key. Never per key per language.

Unlimited languages and unlimited seats on every plan, including the trial. The only number that changes is how many unique strings your product has.

Trial

Enough to wire a real app up and see it work.

$0/ month

500 keys

  • 1 project
  • 500 keys
  • Unlimited languages
  • No card required
Start the trial

Pro

Most bought

A product and the services behind it.

$49/ month

10,000 keys

  • 10,000 keys
  • 10 projects
  • Unlimited languages and seats
  • CLI and GitHub Action
  • AI translation with token validation
Choose Pro

Scale

A platform, or an agency running many.

$149/ month

50,000 keys

  • 50,000 keys
  • Unlimited projects
  • Unlimited languages and seats
  • CLI and GitHub Action
  • Priority support
Choose Scale

The questions worth answering

What exactly is a key?
One translatable string, identified by where it is used rather than by its text — `auth.errors.invalid_password`, for example. It counts once no matter how many languages it has, and a key used in ten components is still one key.
Does adding a language cost anything?
No. That is the whole point. Adding Polish to a 2,000-key project costs the same as not adding it, which is the only way the decision to support a language is a product decision rather than a budget one.
What happens when I delete strings from my code?
The next push archives them and your key count goes down. Archived keys keep their translations in case the code comes back, but you are not billed for strings you have already removed.
What if a push would take me over the limit?
The push is refused in full and nothing changes, with the CLI telling you how many keys it wanted to add and what the ceiling is. We do not accept the keys and invoice you afterwards.
Are machine translations included?
Yes, with validation: a translation that drops or renames an interpolation token is rejected rather than stored. Machine output is marked as unreviewed and stays out of published dictionaries until somebody includes it deliberately.
Can I leave?
Run `synclocale pull` and every dictionary is written into your repository as plain JSON. There is nothing to export because it is already yours.