App Store keywords: 100 bytes or 100 characters?
Updated · GLabs325
The App Store Connect Keywords field is limited to 100… bytes or characters, depending on which Apple page you read. For an English list it's the same thing. For French, Japanese or Thai, it isn't.
What Apple says (and what people observe)
It sounds like a simple question. Apple's own pages don't agree, though:
- The App Store Connect reference describes the Keywords field as: "You can provide up to 100 bytes of content." Bytes.
- The Creating Your Product Page page talks about 100 characters.
- On the developer forums, in 2022, an Apple team member tested Thai keywords through the API: 100 characters went through, 106 were rejected. And 100 Thai characters weigh far more than 100 bytes.
So the reference documentation says bytes, and at least one observation shows characters being counted. Until Apple settles it, you have to pick a rule.
Why the difference matters
In UTF-8, unaccented Latin letters take one byte, an accented letter two, a Japanese or Thai character three.
| Keyword | Characters | Bytes |
|---|---|---|
| shopping | 8 | 8 |
| épicerie | 8 | 9 |
| supermarché | 11 | 12 |
| Einkaufsliste | 13 | 13 |
| 買い物リスト | 6 | 18 |
| รายการ | 6 | 18 |
For English, the question never comes up. For French or Spanish, the gap is a few bytes across a full list. For Japanese or Thai, the same field holds three times less text if you count bytes. That's where the choice of rule has real consequences.
Counting it yourself
In a terminal, on your fastlane file ($(cat …) drops the trailing newline):
printf '%s' "$(cat fastlane/metadata/fr-FR/keywords.txt)" | wc -c # bytes
printf '%s' "$(cat fastlane/metadata/fr-FR/keywords.txt)" | wc -m # characters
wc -m counts characters according to your terminal's locale; with a non-UTF-8 locale it returns the same number as wc -c. In Dart:
import 'dart:convert';
final keywords = 'courses,épicerie,liste,famille,partagée';
print(utf8.encode(keywords).length); // 41 bytes
print(keywords.runes.length); // 39 characters
The rule we apply
Count bytes. It's what the reference documentation says, and it's the strictest option: a field that fits in 100 bytes necessarily fits in 100 characters, so it will never be rejected. LocalePilot applies it on its App Store listing screen, which shows for example "94 / 100 bytes" as you type.
The cost is real for Japanese, Chinese, Korean or Thai: you may be leaving room unused. If those markets matter to you, try a longer list in App Store Connect: it rejects an over-long field immediately, so you'll know what goes through today.
What doesn't depend on the unit
- Commas, no spaces around them. Every space after a comma costs a byte for nothing.
- No repeats of your name and subtitle. Most ASO guides advise against repeating in keywords what those two fields already say.
- One file per language. With fastlane, each localization has its own
fastlane/metadata/<locale>/keywords.txt. Translating the English list word for word rarely gives you the terms people actually type: start from search in the target language.
Frequently asked questions
How many bytes is an accented letter?
Two in UTF-8 (é, è, à, ç…). A Japanese, Chinese or Thai character takes three.
Should I put spaces after commas?
No: separate keywords with commas and no spaces, every space costs room.
Where is the keywords file with fastlane?
In fastlane/metadata/<locale>/keywords.txt, one file per language.