Reading the Exported JSON
Last updated Aug 15, 2026
Reading the Exported JSON
After you finish Export my data on the Privacy page and download the file, you get a file named swaymoon-passport-export.json. This article explains how to read the fields in it. The set of fields is whatever was actually in the file when you downloaded it. An empty array or null means there was no matching record at that time.
Open the file with a text editor or a JSON viewer. Do not send the full export file to an untrusted third party.
Top-level structure
The export file is a JSON object. Common top-level keys:
| Field | Meaning |
|---|---|
accountId | Your Swaymoon Account internal identifier (string). Third-party apps usually do not receive this value directly; they use their own user identifier (sub). |
exportedAt | Time the export was generated (UTC, ISO-8601, for example 2026-08-06T02:15:30.123Z). |
profile | Profile record (nickname, bio, region, and so on). |
identifiers | Linked sign-in identifiers (email, phone number, username, third-party sign-in, and so on). |
hasPassword | Whether a password is set (boolean). true means password sign-in is available; the password itself is not included. |
authorizedApps | Third-party apps that have been authorized through Swaymoon Account. |
sessions | Summaries of sign-in sessions still on record at that time. |
consentHistory | Consent-ledger records (registration terms, third-party authorization, and so on). |
profile: profile record
| Field | Meaning |
|---|---|
nickname | Display nickname |
bio | Bio |
region | Country or region |
birthday | Birthday (date string; may be null if not filled in) |
gender | Gender code (may be null if not filled in) |
username | Username (if set) |
avatarPath | Path identifier of the avatar in storage; not a full URL you can open directly |
Unfilled items may be null or an empty string.
identifiers: sign-in identifiers
An array. Each item is roughly:
{ "type": "EMAIL", "value": "you@example.com", "primary": true }
| Field | Meaning |
|---|---|
type | Identifier type. Common values: EMAIL (email), PHONE (phone number), USERNAME (username), GOOGLE, GITHUB |
value | The concrete value of that identifier (email address, phone number, and so on) |
primary | Whether it is the primary identifier. The primary identifier affects default identity display at sign-in, and whether Hide My Email and similar capabilities can be chosen during authorization |
One account can link multiple identifiers; usually only one is primary.
authorizedApps: authorized apps
An array. Each item corresponds to one (or one historical) third-party authorization record:
| Field | Meaning |
|---|---|
clientId | The app’s client ID |
clientName | App display name (the name at registration) |
firstGrantedAt | Time of first authorization (timestamp string) |
relayAlias | If Hide My Email was chosen at authorization, this is the local part of the alias (without @privaterelay.swaymoon.com); null if unused |
revokedAt | If authorization has been revoked, the revoke time; null while still active |
How to manage these authorizations in the product: see Authorized Apps. A non-empty revokedAt only means Swaymoon Account has revoked on its side; it does not mean the third party has deleted data it already obtained.
sessions: sign-in sessions
An array. Each item is a session summary (does not include the full session token):
| Field | Meaning |
|---|---|
createdAt | Session creation time |
userAgent | Browser / client User-Agent recorded at that time |
remoteAddr | Approximate network address recorded at that time (for security audit; not necessarily equal to your current public IP) |
You can end sessions you no longer need on the security-related pages in Swaymoon Account. An export is only a snapshot. Sessions created after you download it do not appear in the old file.
consentHistory: consent ledger
An array of consent-related actions you took for terms or third-party sharing, so you can check when, to whom, and for what purpose you agreed to processing:
| Field | Meaning |
|---|---|
purpose | Purpose code. Common examples: terms_of_service (accepting the Terms of Use, and so on), third_party_sign_in (signing in to a third party with Swaymoon Account) |
recipient | Recipient: Swaymoon itself, or a third party’s clientId |
dataCategories | Summary of data categories involved (comma-separated string, for example account or account_identifier,profile) |
crossBorder | Whether it is marked as cross-border related (boolean) |
action | Action type. Commonly GRANTED (granted) or REVOKED (revoked) |
recordedAt | Time recorded in the ledger |
The ledger is for transparency and compliance records. It does not mean a third party still holds a valid access token. Whether a token still works also depends on whether authorization has been revoked, whether the token has expired, and similar factors.
Reading example
Below is a fictional, de-identified structural sketch (values differ from a real export):
{
"accountId": "acc_xxxxxxxx",
"exportedAt": "2026-08-06T02:15:30.123Z",
"profile": {
"nickname": "小月",
"bio": "你好",
"region": "CN",
"birthday": "1990-01-01",
"gender": "unspecified",
"username": "xiaoyue",
"avatarPath": "avatars/acc_xxxxxxxx/…"
},
"identifiers": [
{ "type": "EMAIL", "value": "you@example.com", "primary": true },
{ "type": "USERNAME", "value": "xiaoyue", "primary": false }
],
"hasPassword": true,
"authorizedApps": [
{
"clientId": "app_demo",
"clientName": "示例应用",
"firstGrantedAt": "2026-07-01T10:00:00Z",
"relayAlias": "abc123",
"revokedAt": null
}
],
"sessions": [
{
"createdAt": "2026-08-05T12:00:00Z",
"userAgent": "Mozilla/5.0 …",
"remoteAddr": "203.0.113.10"
}
],
"consentHistory": [
{
"purpose": "terms_of_service",
"recipient": "摇月 Swaymoon",
"dataCategories": "account",
"crossBorder": false,
"action": "GRANTED",
"recordedAt": "2026-06-01T08:00:00Z"
}
]
}
Security advice
- The export file contains information that can identify you. Store it encrypted locally or in a safe place, and delete it when you are done.
- When you ask support for help, you usually only need to describe the issue and a time range. Do not attach the full JSON on your own.
- An export is a snapshot of one moment. Later authorizations, revokes, or profile edits are not written back into a file you already downloaded. Export again when you need the latest contents.
For the steps to run an export, see Export Data and Delete Account.