Deeplinkly

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.

Every place the Team ID shows up, and what it is called there.
WhereLabelNotes
developer.apple.com → Membership detailsTeam IDThe authoritative source
Xcode → Signing & CapabilitiesTeam (name), with the ID in the provisioning profileShows the team name, not the ID
Identifiers → your App IDApp ID PrefixThis is the value the AASA file needs — not necessarily the Team ID
App Store Connect → Users and Access → IntegrationsIssuer ID / Team IDUsed by the App Store Connect API
A built binary's entitlementsapplication-identifierPrinted 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:

Read the App ID from a build
# 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 TeamIdentifier

Team 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.

The two identifiers, and where each one is required.
Team IDApp ID Prefix
What it identifiesThe developer accountThe namespace of one App ID
Shape10 characters10 characters — visually identical
Per accountExactly oneUsually one, but legacy App IDs differ
Found inMembership detailsIdentifiers → the App ID's detail row
Used byApp Store Connect API, keychain sharing, notarisationThe AASA file, application-identifier, App Group naming
Changes over timeNeverNever, 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.

/.well-known/apple-app-site-association
{
  "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 webcredentials and appclips, 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.

Compare the two sides
# 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 appid

The 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.

Open the aasa generator

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 IdentifierA 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 DomainAn 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 appA 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.