AASA
Configure Apple App Site Association, Universal Links, App Clips, Passkeys, and Handoff via the OrbitKit API.
The Apple App Site Association (AASA) configuration controls Universal Links, App Clips, Passkeys, and Handoff for your app. OrbitKit generates the apple-app-site-association JSON file and serves it at the correct .well-known path.
See Apple’s documentation on Supporting associated domains and the apple-app-site-association file format.
Endpoints
| Method | Path | Description |
|---|---|---|
| GET | /api/apps/:appId/aasa |
Get AASA configuration |
| PUT | /api/apps/:appId/aasa |
Save AASA configuration |
Get AASA configuration
GET /api/apps/:appId/aasa
Response
{
"universalLinks": {
"appIDs": ["A1B2C3D4E5.com.example.weatherapp"],
"paths": [
{
"pattern": "/products/*",
"exclude": false,
"comment": "Product pages"
},
{
"pattern": "/admin/*",
"exclude": true,
"comment": "Exclude admin routes"
}
]
},
"appClips": {
"appIDs": ["A1B2C3D4E5.com.example.weatherapp.Clip"]
},
"webCredentials": {
"appIDs": ["A1B2C3D4E5.com.example.weatherapp"]
},
"activityContinuation": {
"appIDs": ["A1B2C3D4E5.com.example.weatherapp"]
},
"updatedAt": 1712345678000
}
Returns 404 NOT_FOUND if no AASA configuration exists.
Save AASA configuration
PUT /api/apps/:appId/aasa
Saves the AASA configuration. The API validates:
- App ID format — must be
TEAMID.bundleid(e.g.,A1B2C3D4E5.com.example.app) - Path patterns — must start with
/
Set any section to null to disable it.
Request body
| Field | Type | Required | Description |
|---|---|---|---|
universalLinks |
object or null | No | Universal Links config |
universalLinks.appIDs |
string[] | Yes (if section present) | 1–10 App IDs |
universalLinks.paths |
array | No | URL path patterns (max 50) |
universalLinks.paths[].pattern |
string | Yes | Path pattern (e.g., /products/*) |
universalLinks.paths[].exclude |
boolean | No | Exclude this pattern (default: false) |
universalLinks.paths[].comment |
string | No | Description (max 200) |
appClips |
object or null | No | App Clips config |
appClips.appIDs |
string[] | Yes (if section present) | 1–5 App Clip IDs |
webCredentials |
object or null | No | Passkeys config |
webCredentials.appIDs |
string[] | Yes (if section present) | 1–10 App IDs |
activityContinuation |
object or null | No | Handoff config |
activityContinuation.appIDs |
string[] | Yes (if section present) | 1–10 App IDs |
Full example
curl -X PUT https://api.orbitkit.io/api/apps/-NtestApp123/aasa \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"universalLinks": {
"appIDs": ["A1B2C3D4E5.com.example.weatherapp"],
"paths": [
{"pattern": "/products/*", "exclude": false, "comment": "Product pages"}
]
},
"webCredentials": {
"appIDs": ["A1B2C3D4E5.com.example.weatherapp"]
},
"appClips": null,
"activityContinuation": null
}'
struct AASAConfig: Codable {
var universalLinks: UniversalLinks?
var appClips: AppClips?
var webCredentials: WebCredentials?
var activityContinuation: ActivityContinuation?
struct UniversalLinks: Codable {
let appIDs: [String]
var paths: [PathRule]?
struct PathRule: Codable {
let pattern: String
var exclude: Bool = false
var comment: String?
}
}
struct AppClips: Codable { let appIDs: [String] }
struct WebCredentials: Codable { let appIDs: [String] }
struct ActivityContinuation: Codable { let appIDs: [String] }
}
let config = AASAConfig(
universalLinks: .init(
appIDs: ["A1B2C3D4E5.com.example.weatherapp"],
paths: [.init(pattern: "/products/*", comment: "Product pages")]
),
webCredentials: .init(appIDs: ["A1B2C3D4E5.com.example.weatherapp"])
)
var request = URLRequest(url: URL(string: "https://api.orbitkit.io/api/apps/\(appId)/aasa")!)
request.httpMethod = "PUT"
request.setValue("Bearer \(token)", forHTTPHeaderField: "Authorization")
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
request.httpBody = try JSONEncoder().encode(config)
const res = await fetch(`https://api.orbitkit.io/api/apps/${appId}/aasa`, {
method: "PUT",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
universalLinks: {
appIDs: ["A1B2C3D4E5.com.example.weatherapp"],
paths: [{ pattern: "/products/*", exclude: false, comment: "Product pages" }],
},
webCredentials: { appIDs: ["A1B2C3D4E5.com.example.weatherapp"] },
appClips: null,
activityContinuation: null,
}),
});
const saved = await res.json();
Response
Returns the saved AASA configuration object (same shape as GET response).
Errors
| Code | Status | When |
|---|---|---|
VALIDATION_FAILED |
400 | Invalid App ID format or path pattern |