Linked accounts
A link connects two accounts in one project for quick switching. Once confirmed, it works in both directions. Balances, warehouse items, game accounts, and operation history remain separate.
List links
accountLinks
Returns confirmed, pending, and revoked relationships for the current user together with the available quota.
The response also includes accountLinkQuota:
| Field | Type | Description |
|---|---|---|
isUnlimited | Boolean! | Whether the overall limit is disabled |
baseLimit | Int | Project base limit, or null in unlimited mode |
effectiveLimit | Int | Effective limit including VIP, or null in unlimited mode |
used | Int! | Number of PENDING and CONFIRMED links |
remaining | Int | Number of links still available, or null in unlimited mode |
pendingUsed | Int! | Number of requests awaiting confirmation |
pendingLimit | Int! | Separate cap for pending requests |
canCreate | Boolean! | Whether both the overall quota and pending cap allow another request |
Unlimited mode removes only the overall quota. pendingLimit remains active for both sides of a relationship.
{
"documentId": "accountLinks",
"variables": {}
}
{
"data": {
"accountLinks": [
{
"id": "17",
"targetId": "2002",
"status": "CONFIRMED",
"createdAt": "2026-07-23T10:30:00+00:00",
"confirmationExpiresAt": null
}
],
"accountLinkQuota": {
"isUnlimited": false,
"baseLimit": 5,
"effectiveLimit": 9,
"used": 3,
"remaining": 6,
"pendingUsed": 1,
"pendingLimit": 10,
"canCreate": true
}
}
}
Request a link
requestAccountLink
Sends a four-digit code to the target account's email. The code expires after 30 minutes.
For a REVOKED relationship, the same operation starts linking again: the relationship returns to PENDING, and a new code is sent. The previous code is no longer valid.
| Field | Type | Required | Description |
|---|---|---|---|
login | String! | Yes | Target email address or phone number |
password | String! | Yes | Target account password |
pin | String | No | Current account PIN when protection is enabled |
{
"documentId": "requestAccountLink",
"variables": {
"password": "password123",
"pin": "1234"
}
}
{
"data": {
"requestAccountLink": {
"message": "Confirmation code sent"
}
}
}
Possible domain errors include INVALID_CREDENTIALS, CANNOT_LINK_SELF, ACCOUNT_LINK_ALREADY_EXISTS, ACCOUNT_LINK_LIMIT_REACHED, ACCOUNT_LINK_PENDING_LIMIT_REACHED, ACCOUNT_BANNED, NOTIFICATION_FAILED, ACCOUNT_LINKS_DISABLED, and TOO_MANY_ATTEMPTS.
Confirm a link
confirmAccountLink
| Field | Type | Required | Description |
|---|---|---|---|
targetAccountId | ID! | Yes | Target account ID |
code | String! | Yes | Four-digit confirmation code |
{
"documentId": "confirmAccountLink",
"variables": {
"targetAccountId": "2002",
"code": "4827"
}
}
{
"data": {
"confirmAccountLink": {
"message": "Account linked"
}
}
}
An invalid or expired code returns INVALID_CODE.
Disconnect a link
revokeAccountLink
Disconnects a pending or confirmed relationship for both participants without deleting either account.
{
"documentId": "revokeAccountLink",
"variables": {
"targetAccountId": "2002",
"pin": "1234"
}
}
{
"data": {
"revokeAccountLink": {
"message": "Account disconnected"
}
}
}
Switch accounts
switchAccountLink
Creates a session for the confirmed linked account. The client must replace its current session token with the returned sessionId.
{
"documentId": "switchAccountLink",
"variables": {
"targetAccountId": "2002"
}
}
{
"data": {
"switchAccountLink": {
"sessionId": "new-session-token",
"sessionEnd": "2026-08-22T10:30:00+00:00",
"message": "Switched to linked account",
"user": {
"id": "2002",
}
}
}
}