curl --request GET \
--url https://web-api.dev.soxai.site/api/deep-link/resolve \
--header 'Authorization: Bearer <token>'import requests
url = "https://web-api.dev.soxai.site/api/deep-link/resolve"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://web-api.dev.soxai.site/api/deep-link/resolve', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"type": "group_invite",
"groupId": "b7d1f0c9a2e4d6f8b0c1",
"code": "Yk3nQ1pR8sA",
"groupName": "Shibata family",
"alreadyJoined": false
}{
"error": "http-error",
"error_msg": "Invalid authentication credentials. <reason>"
}{
"error": "forbidden",
"error_msg": "Not enough permission"
}{
"error": "not-found",
"error_msg": "token not found"
}{
"error": "unprocessable-entity",
"error_msg": "body.<field>: <validation message>"
}{
"error": "rate-limited",
"error_msg": "Rate limit exceeded. Retry after <n> seconds."
}{
"error": "internal-server-error",
"error_msg": "Failed to fetch data: <error_message>"
}Resolve a group-invite deep link
A request authenticated with a Sandbox soxai-api-key is answered 403 This endpoint is not available in the sandbox., because it is internal or operational, outside the Sandbox surface. It is published here because the Sandbox runs the same build; use it in Production. See Sandbox.
Group-invite token resolution for mobile routing. Never consumes the token.
A link carries type=group_invite in its query string, so an app that sees
that type comes straight here and does not fall back to prefill-email. This
endpoint stays group-invite only: a login-prefill token 404s, which is what
lets a link issued before type existed be recognised by elimination.
Login-prefill still exchanges its token at GET /api/deep-link/prefill-email.
Parameters
token(query, required) - the token from the deep link’s query string.
Response
200{"type": "group_invite", ...}with the invite’s payload: the group it names and the code. The token is not consumed, so the same link resolves again.alreadyJoinedanswers for the signed-in caller (SOX-92):truewhen that user is already an active member of the invited group, so the app can open the group instead of walking them through a join that would silently no-op. It isnull- notfalse- for an anonymous call, since a link opened before login has no user to answer about; resolve again after sign-in rather than readingnullas “needs to join”.
Errors
| Status | Condition |
|---|---|
| 404 | The token is unknown, expired, or is a login-prefill token rather than a group invite |
Authorization
- Scheme:
Authorization: Bearer <idToken>orsoxai-api-key: <api key>. - Authentication is optional. The app resolves the link before the recipient signs in,
and the token itself is the credential; a credential that is missing, stale or
unusable is not an error, it only leaves
alreadyJoinedatnull. - Resolving does not consume the token and does not join the group;
POST /api/groups/joindoes both and does require a signed-in caller.
curl --request GET \
--url https://web-api.dev.soxai.site/api/deep-link/resolve \
--header 'Authorization: Bearer <token>'import requests
url = "https://web-api.dev.soxai.site/api/deep-link/resolve"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://web-api.dev.soxai.site/api/deep-link/resolve', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"type": "group_invite",
"groupId": "b7d1f0c9a2e4d6f8b0c1",
"code": "Yk3nQ1pR8sA",
"groupName": "Shibata family",
"alreadyJoined": false
}{
"error": "http-error",
"error_msg": "Invalid authentication credentials. <reason>"
}{
"error": "forbidden",
"error_msg": "Not enough permission"
}{
"error": "not-found",
"error_msg": "token not found"
}{
"error": "unprocessable-entity",
"error_msg": "body.<field>: <validation message>"
}{
"error": "rate-limited",
"error_msg": "Rate limit exceeded. Retry after <n> seconds."
}{
"error": "internal-server-error",
"error_msg": "Failed to fetch data: <error_message>"
}Authorizations
Response
The invite payload: the group it names and the code. The token is not consumed, so the same link resolves again. alreadyJoined answers for the signed-in caller and is null for an anonymous one.