Glossary/Implementation artifacts
Apple Team ID
Definition
An Apple Team ID is the ten-character alphanumeric identifier Apple assigns to a developer account, used to namespace that account's App IDs, certificates, and entitlements.
You need it because the apple-app-site-association file identifies your app as <prefix>.<bundle-id>, and the prefix is usually — but not always — the Team ID. That "usually" is the whole reason this term deserves a page: when the two differ, the AASA file is syntactically perfect, iOS accepts it, and Universal Links never fire.
Where the Team ID appears
It is ten characters, uppercase letters and digits, e.g. A1B2C3D4E5. Every Apple developer account has exactly one, and it never changes.
| Where | Label | Notes |
|---|---|---|
| developer.apple.com → Membership details | Team ID | The authoritative source |
| Xcode → Signing & Capabilities | Team (name), with the ID in the provisioning profile | Shows the team name, not the ID |
| Identifiers → your App ID | App ID Prefix | This is the value the AASA file needs — not necessarily the Team ID |
| App Store Connect → Users and Access → Integrations | Issuer ID / Team ID | Used by the App Store Connect API |
| A built binary's entitlements | application-identifier | Printed as TEAMID.com.example.shop |
| Keychain access groups | $(AppIdentifierPrefix) | Xcode expands this at build time |
The most reliable read is from a build you actually shipped, because it reflects what was signed rather than what a page says:
# Prints application-identifier as PREFIX.bundle.id
codesign -d --entitlements :- /path/to/Shop.app
# Or from the provisioning profile
security cms -D -i embedded.mobileprovision | \
plutil -extract Entitlements.application-identifier raw -
# The team the binary was signed by
codesign -dv --verbose=4 /path/to/Shop.app 2>&1 | grep TeamIdentifierTeam ID vs App ID Prefix
Apple unified the two in 2013: App IDs created since then use the Team ID as their prefix. App IDs created before that, or migrated between accounts during a company acquisition or an account merge, kept their original prefix. Those App IDs still work, still build, still ship — and their AASA entry is not the value on your Membership page.
| Team ID | App ID Prefix | |
|---|---|---|
| What it identifies | The developer account | The namespace of one App ID |
| Shape | 10 characters | 10 characters — visually identical |
| Per account | Exactly one | Usually one, but legacy App IDs differ |
| Found in | Membership details | Identifiers → the App ID's detail row |
| Used by | App Store Connect API, keychain sharing, notarisation | The AASA file, application-identifier, App Group naming |
| Changes over time | Never | Never, including after account migration |
This is the failure that survives every other check
A wrong prefix produces a file that is valid JSON, passes every online validator, is served with the right headers and no redirect, and does absolutely nothing. iOS looks for its own App ID in appIDs, does not find it, and treats the domain as not associated. Copy the App ID Prefix from the Identifiers list; do not assume it equals the Team ID.
How it is used in the AASA file
The appIDs array holds fully qualified App IDs: the prefix, a dot, then the bundle identifier. Several apps can share one entry, which is how a main app, an enterprise build and an App Clip live in the same file.
{
"applinks": {
"details": [
{
"appIDs": [
"A1B2C3D4E5.com.example.shop",
"A1B2C3D4E5.com.example.shop.enterprise",
"9Z8Y7X6W5V.com.example.shop.legacy"
],
"components": [
{ "/": "/products/*", "comment": "Product pages" }
]
}
]
},
"appclips": {
"apps": ["A1B2C3D4E5.com.example.shop.Clip"]
}
}The third entry uses a different prefix on purpose: an App ID inherited from an acquired account. Both are correct at the same time, and this is exactly the case that breaks when someone "tidies up" the file by making all the prefixes match.
- The prefix is case-sensitive and always uppercase.
- There is no separator other than a single dot between prefix and bundle ID.
- A wildcard App ID such as
A1B2C3D4E5.com.example.*cannot be used here — Associated Domains requires an explicit App ID. - The same prefix is what appears in
webcredentialsandappclips, which is why one wrong prefix breaks password AutoFill and App Clips along with Universal Links.
Verifying before you deploy
Two checks, one on each side, catch every prefix mismatch before it reaches a user.
# 1. What the app claims to be
codesign -d --entitlements :- Shop.app 2>/dev/null | \
grep -A1 application-identifier
# 2. What the domain authorises, as Apple's CDN serves it
curl -sS https://app-site-association.cdn-apple.com/a/v1/example.com | \
python3 -m json.tool | grep -i appidThe string from the first command must appear verbatim in the output of the second. If it does not, nothing else about the setup matters yet. If it does and links still fall through, the problem has moved on to path matching or hosting — see universal-links-not-opening-app.
AASA generator
Paste your App ID Prefix and bundle identifier and it builds the appIDs entry for you in the modern components format, so the string in the file matches the string in the binary exactly. It can also fetch a live domain's file so you can compare it against your build's application-identifier.
Frequently asked questions
- Where do I find my Apple Team ID?
- Sign in at developer.apple.com, open Account, and read the Team ID field under Membership details. It is ten uppercase alphanumeric characters. You can also read it from a signed build by running codesign -dv --verbose=4 against the .app bundle and looking at the TeamIdentifier line, which reflects what was actually signed rather than what an account page shows.
- Is the Team ID the same as the App ID Prefix?
- Usually, but not always. Apple unified them in 2013, so App IDs created since then use the Team ID as their prefix. App IDs created earlier, or migrated between developer accounts, keep their original prefix. Because the apple-app-site-association file needs the App ID Prefix specifically, copy it from the Identifiers list rather than assuming it matches your Team ID.
- Can the Team ID change?
- No. A Team ID is permanent for the life of the developer account, and an App ID Prefix is permanent for the life of the App ID, including through account migrations. If you moved an app between accounts, the App ID keeps its original prefix, which is why one AASA file legitimately contains entries with two different prefixes.
- Why do Universal Links fail even though my AASA file is valid?
- The most common cause is a prefix that is well formed but wrong — the Team ID where a legacy App ID Prefix was needed, or the prefix of a different account. iOS looks for its own App ID string in the appIDs array, does not find it, and treats the domain as unassociated. The file passes every syntax validator because nothing about it is malformed.
- Can several apps share one AASA entry?
- Yes. The appIDs array takes multiple fully qualified App IDs, so a production app, an enterprise build and apps from different accounts can share one set of path components. This is preferable to duplicating the details block, because components are evaluated in order across the whole file and duplicated blocks make shadowing rules much harder to reason about.
Related terms
- Apple App Site Association (AASA) — The apple-app-site-association file is a JSON document hosted at a domain's /.well-known/ path that tells iOS which app is allowed to handle which URLs on that domain.
- Bundle Identifier — A bundle identifier is the reverse-DNS string, such as com.example.shop, that uniquely identifies an iOS app to the operating system and the App Store.
- Associated Domain — An Associated Domain is an entry in an iOS app's com.apple.developer.associated-domains entitlement that declares a domain the app is bound to for a named service, such as Universal Links or shared web credentials.
- Universal Links not opening the app — A Universal Link fails to open its app when iOS has no valid association for the domain, when the tapped URL does not match the association's path rules, or when the tap did not originate in a context where iOS honours Universal Links at all.