PassPort app launch & app-entry¶
When a user opens your registered application, PassPort decides where it should land based on that user’s account state — a not-yet-set-up account can be routed to an onboarding screen, an active account straight into the app. This page covers declaring your app’s launch surface at registration and resolving the entry point at runtime.
All paths are under the public gateway at https://api.flexgalaxy.ai.
Declare your launch surface when you register¶
Register (or update) a service with POST /developer/v1/services. The service
manifest’s surfaces.app_launch describes how your app is opened. Paths are
relative — the platform resolves them against your app origin.
{
"surfaces": {
"app_launch": {
"allowed_redirect_paths": ["/", "/auth/callback"],
"launch_path": "/",
"required_action": "open",
"resource_frn_pattern": "frn:…:app/${account_id}",
"onboarding_entry_url": "/welcome"
}
}
}
allowed_redirect_paths— the permitted post-sign-in return paths. Your app’s homepage is derived from the first entry that is not a/passport/…callback.launch_path/required_action/resource_frn_pattern— the launch target and the authorization action + resource pattern checked when the app opens.onboarding_entry_url(optional) — a distinct entry for accounts that are not yet active (see below). Omit it and every account opens at the homepage.
A newly registered service is reviewed and approved before it becomes launchable; until then app-entry resolution will not find an active application for it.
Resolve the entry point at runtime¶
On Open, call:
POST /passport/v1/app-entry/resolve
{ "appId": "<application id>", "accountId": "<account uuid>" }
Both fields are required. Note that the PassPort surface is camelCase, unlike the snake_case organization and account APIs.
accountId is not taken on trust: PassPort verifies that the account holds an
active installation of the application, that your token was issued in that
account’s organization realm, and that you are an assigned workforce member of
that account, before it resolves anything.
The response tells you where to send the authenticated principal, keyed off that account’s lifecycle state:
{
"appId": "<application id>",
"accountId": "<account uuid>",
"entryKind": "ONBOARDING",
"deepLink": "/welcome?account_id=<account uuid>",
"lifecycleStatus": "PLACEHOLDER",
"displayName": "…"
}
Account lifecycle status |
|
Where |
|---|---|---|
|
|
the app’s |
|
|
the app homepage / launch path |
no lifecycle record (an ordinary, non-onboarded account) |
|
the app homepage / launch path |
|
— |
|
deepLink always carries the resolved account as an account_id query
parameter, appended with & when the configured URL already has a query string.
lifecycleStatus is omitted for an account with no lifecycle record.
This is a signed-in (workforce / session) call — drive it from your app’s
authenticated front end. An AK/SK service credential is rejected with 401.
Look up an application’s public metadata with:
GET /passport/v1/applications/{appId}
See also¶
Account lifecycle status — the status values that drive this routing
CLI reference —
fgai passport app-entry-resolve,fgai developer create