{"id":14070452,"url":"https://github.com/XboxReplay/xboxlive-api","last_synced_at":"2025-07-30T07:33:25.489Z","repository":{"id":34080022,"uuid":"168234578","full_name":"XboxReplay/xboxlive-api","owner":"XboxReplay","description":"Simple Xbox Live API wrapper.","archived":false,"fork":false,"pushed_at":"2023-04-30T08:36:15.000Z","size":158,"stargazers_count":38,"open_issues_count":3,"forks_count":6,"subscribers_count":4,"default_branch":"master","last_synced_at":"2024-07-20T14:21:24.489Z","etag":null,"topics":["nodejs","typescript","xboxlive"],"latest_commit_sha":null,"homepage":"https://www.xboxreplay.net/","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/XboxReplay.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2019-01-29T21:48:03.000Z","updated_at":"2024-05-05T12:06:55.000Z","dependencies_parsed_at":"2024-06-19T22:51:38.949Z","dependency_job_id":"08f31570-072c-4916-a04e-374e3a02d6e3","html_url":"https://github.com/XboxReplay/xboxlive-api","commit_stats":null,"previous_names":[],"tags_count":8,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/XboxReplay%2Fxboxlive-api","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/XboxReplay%2Fxboxlive-api/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/XboxReplay%2Fxboxlive-api/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/XboxReplay%2Fxboxlive-api/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/XboxReplay","download_url":"https://codeload.github.com/XboxReplay/xboxlive-api/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":215155197,"owners_count":15836926,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["nodejs","typescript","xboxlive"],"created_at":"2024-08-13T07:07:46.450Z","updated_at":"2024-08-13T07:17:06.921Z","avatar_url":"https://github.com/XboxReplay.png","language":"TypeScript","funding_links":[],"categories":["TypeScript"],"sub_categories":[],"readme":"# Xbox Live - API\n\nSimple Xbox Live API wrapper.\n\n### Warning\nThis module **MUST** be used server side only to prevent [CORS](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) issues and credentials leak.\n\n### Installation\n```shell\n$ npm install @xboxreplay/xboxlive-api\n```\n\n### Example usage\n\n```javascript\nimport XboxLiveAPI from '@xboxreplay/xboxlive-api';\n\nXboxLiveAPI.getPlayerSettings('Zeny IC', {\n    userHash: 'YOUR_OWN_USER_HASH',\n    XSTSToken: 'YOUR_OWN_XSTS_TOKEN'\n}, ['UniqueModernGamertag', 'GameDisplayPicRaw', 'Gamerscore', 'Location'])\n    .then(console.info)\n    .catch(console.error);\n```\n\n**Sample response:**\n\n```javascript\n[\n    {\n        \"id\": \"UniqueModernGamertag\",\n        \"value\": \"Zeny IC\"\n    },\n    {\n        \"id\": \"GameDisplayPicRaw\",\n        \"value\": \"http://images-eds.xboxlive.com/image?url=wHwbXKif8cus8csoZ03RWwcxuUQ9WVT6xh5XaeeZD02wEfGZeuD.XMoGFVYkwHDq4Ch7pcu9E3UwDqy.fzrTaviUvY1c8gvrWRzLTqFKUVap_Nvh0.Em2IsAWtHcMFeVpY2boMYiy03w887.tSGAT62Na2z3k33eMWnP12mY2x0-\u0026format=png\"\n    }\n    {\n        \"id\": \"Gamerscore\",\n        \"value\": \"5610\"\n    },\n    {\n        \"id\": \"Location\",\n        \"value\": \"Paris, France\"\n    }\n]\n```\n\n### How to generate a Xbox Live authorization?\nThe fastest way to generate a valid authorization is to use our [XboxLive-Auth](https://github.com/XboxReplay/xboxlive-auth) module which returns an **userHash** and a **XSTSToken** for a specified account.\n\n### Available methods\n**getPlayerXUID** - Returns targeted player's XUID:\n\n```javascript\ngetPlayerXUID(\n    gamertagOrXUID: string;\n    authorization: {\n        userHash: string;\n        XSTSToken: string;\n    };\n): Promise\u003cstring\u003e\n```\n\n**getPlayerSettings** - Returns targeted player's settings:\n\n```javascript\ngetPlayerSettings(\n    gamertagOrXUID: string;\n    authorization: {\n        userHash: string;\n        XSTSToken: string;\n    };\n    settings?: [\n        | 'GameDisplayPicRaw'\n        | 'Gamerscore'\n        | 'Gamertag'\n        | 'AccountTier'\n        | 'XboxOneRep'\n        | 'PreferredColor'\n        | 'RealName'\n        | 'Bio'\n        | 'Location'\n        | 'ModernGamertag'\n        | 'ModernGamertagSuffix'\n        | 'UniqueModernGamertag'\n        | 'RealNameOverride'\n        | 'TenureLevel'\n        | 'Watermarks'\n        | 'IsQuarantined'\n        | 'DisplayedLinkedAccounts'\n    ];\n): Promise\u003c{\n    id: | 'GameDisplayPicRaw'\n        | 'Gamerscore'\n        | 'Gamertag'\n        | 'AccountTier'\n        | 'XboxOneRep'\n        | 'PreferredColor'\n        | 'RealName'\n        | 'Bio'\n        | 'Location'\n        | 'ModernGamertag'\n        | 'ModernGamertagSuffix'\n        | 'UniqueModernGamertag'\n        | 'RealNameOverride'\n        | 'TenureLevel'\n        | 'Watermarks'\n        | 'IsQuarantined'\n        | 'DisplayedLinkedAccounts';\n    value: string;\n}[]\u003e\n```\n\n**getPlayerScreenshots** - Returns targeted player's screenshots:\u003cbr\u003e\n\u003csub\u003e**Warning:** Recent games *(since mid-2019)* will not be returned, please use **getPlayerScreenshotsFromActivityHistory** instead (if required).\u003c/sub\u003e\n\n```javascript\ngetPlayerScreenshots(\n    gamertagOrXUID: string;\n    authorization: {\n        userHash: string;\n        XSTSToken: string;\n    };\n    qs: {\n        maxItems?: number; // Default: 25\n        continuationToken?: string\n    };\n): Promise\u003c{\n    screenshots: {\n        screenshotId: string;\n    \tresolutionHeight: number;\n    \tresolutionWidth: number;\n    \tstate: string;\n    \tdatePublished: string;\n    \tdateTaken: string;\n    \tlastModified: string;\n    \tuserCaption: string;\n    \ttype: 'UserGenerated' | 'AutoGenerated';\n    \tscid: string;\n    \ttitleId: number;\n    \trating: number;\n    \tratingCount: number;\n    \tviews: number;\n    \ttitleData: string;\n    \tsystemProperties: string;\n    \tsavedByUser: boolean;\n    \tachievementId: string;\n    \tgreatestMomentId: string | null;\n    \tthumbnails: {\n            uri: string;\n            fileSize: 0;\n            thumbnailType: 'Small' | 'Large';\n        }[];\n    \tscreenshotUris: {\n            uri: string;\n            fileSize: number;\n            uriType: 'Download';\n            expiration: string;\n        }[];\n    \txuid: string;\n    \tscreenshotName: string;\n    \ttitleName: string;\n    \tscreenshotLocale: string;\n    \tscreenshotContentAttributes: string;\n    \tdeviceType: string;\n    }[];\n    pagingInfo: {\n        continuationToken: string | null\n    };\n}\u003e\n```\n\n**getPlayerScreenshotsFromMediaHub** - Returns targeted player's screenshots:\u003cbr\u003e\n\u003csub\u003e**Warning:** Recent games *(since mid-2019)* will not be returned, please use **getPlayerScreenshotsFromActivityHistory** instead (if required).\u003c/sub\u003e\n\n```javascript\ngetPlayerScreenshotsFromMediaHub(\n    gamertagOrXUID: string;\n    authorization: {\n        userHash: string;\n        XSTSToken: string;\n    };\n    payload: {\n        max?: number; // Default: 100\n        skip?: number; // Default: 0\n        query?: string; // Example: titleId eq 175227487 and contentId eq 773a413e-5a95-48c2-98c4-5c919f67cfee\n        continuationToken?: string;\n    };\n): Promise\u003c{\n    continuationToken?: string;\n    values: {\n        captureDate: string;\n        contentId: string;\n        contentLocators: Array\u003c\n            | { fileSize: number; locatorType: 'Download'; uri: string }\n            | { locatorType: 'Thumbnail_Small'; uri: string }\n            | { locatorType: 'Thumbnail_Large'; uri: string }\n            | { fileSize: number; locatorType: 'Download_HDR'; uri: string }\n        \u003e;\n        CreationType: 'UserGenerated' | 'AutoGenerated';\n        localId: string;\n        ownerXuid: number;\n        resolutionHeight: number;\n        resolutionWidth: number;\n        sandboxId: 'RETAIL';\n        sharedTo: any[];\n        titleId: number;\n        titleName: string;\n        dateUploaded: string;\n        uploadLanguage: string;\n        uploadRegion: string;\n        uploadTitleId: number;\n        uploadDeviceType: string;\n        commentCount: number;\n        likeCount: number;\n        shareCount: number;\n        viewCount: number;\n        contentState: string;\n        enforcementState: string;\n        safetyThreshold: string;\n        sessions: any[];\n        tournaments: any[];\n    }[];\n}\u003e\n```\n\n**getPlayerScreenshotsFromActivityHistory** - Returns targeted player's screenshots from its activity history:\u003cbr\u003e\n\u003csub\u003e**Warning:** Returned items count may not respect the specified `numItems` parameter.\u003c/sub\u003e\n\n```javascript\ngetPlayerScreenshotsFromActivityHistory(\n    gamertagOrXUID: string;\n    authorization: {\n        userHash: string;\n        XSTSToken: string;\n    };\n    qs: {\n        numItems?: number;\n        contToken?: string;\n        pollingToken?: string;\n        startDate?: string;\n    };\n): Promise\u003c{\n    numItems: number;\n    activityItems: {\n        screenshotId: string;\n        screenshotThumbnail: string;\n        screenshotScid: string;\n        screenshotName: string;\n        screenshotUri: string;\n        viewCount: number;\n        gameMediaContentLocators: [\n            {\n                Expiration: string;\n                FileSize: number;\n                LocatorType: 'Download';\n                Uri: string;\n            },\n            {\n                Expiration: string;\n                FileSize: number;\n                LocatorType: 'Thumbnail_Small';\n                Uri: string;\n            },\n            {\n                Expiration: string;\n                FileSize: number;\n                LocatorType: 'Thumbnail_Large';\n                Uri: string;\n            }\n        ];\n        contentImageUri: string;\n        contentTitle: string;\n        platform: string;\n        titleId: string;\n        uploadTitleId: string;\n        activity: {\n            screenshotThumbLarge: null;\n            screenshotThumbSmall: null;\n            screenshotType: null;\n            savedByUser: boolean;\n            screenshotScid: string;\n            screenshotId: string;\n            numShares: number;\n            numLikes: number;\n            numComments: number;\n            ugcCaption: string | null;\n            authorType: string;\n            activityItemType: 'Screenshot';\n            userXuid: string;\n            date: string;\n            contentType: 'Game';\n            titleId: string;\n            platform: string;\n            sandboxid: string;\n            userKey: string | null;\n            scid: string;\n        };\n        userImageUriMd: string;\n        userImageUriXs: string;\n        description: string;\n        date: string;\n        hasUgc: boolean;\n        activityItemType: 'Screenshot';\n        contentType: 'Game';\n        shortDescription: string;\n        itemText: string;\n        itemImage: string;\n        shareRoot: string;\n        feedItemId: string;\n        itemRoot: string;\n        hasLiked: boolean;\n        authorInfo: {\n            name: string;\n            secondName: string;\n            imageUrl: string;\n            authorType: string;\n            id: string;\n        };\n        gamertag: string;\n        realName: string;\n        displayName: string;\n        userImageUri: string;\n        userXuid: string;\n    }[];\n    pollingToken: string;\n    pollingIntervalSeconds: string | null;\n    contToken: string;\n}\u003e\n```\n\n**getPlayerGameClips** - Returns targeted player's clips:\u003cbr\u003e\n\u003csub\u003e**Warning:** Recent games *(since mid-2019)* will not be returned, please use **getPlayerGameClipsFromActivityHistory** instead (if required).\u003c/sub\u003e\n\n```javascript\ngetPlayerGameClips(\n    gamertagOrXUID: string;\n    authorization: {\n        userHash: string,\n        XSTSToken: string\n    },\n    qs: {\n        maxItems?: number = 25\n        continuationToken?: string\n    }\n): Promise\u003c{\n    gameClips: {\n        gameClipId: string;\n        state: string;\n        datePublished: string;\n        dateRecorded: string;\n        lastModified: string;\n        userCaption: string;\n        type: 'UserGenerated' | 'AutoGenerated';\n        durationInSeconds: number;\n        scid: string;\n        titleId: number;\n        rating: number;\n        ratingCount: number;\n        views: number;\n        titleData: string;\n        systemProperties: string;\n        savedByUser: boolean;\n        achievementId: string;\n        greatestMomentId: string | null;\n        thumbnails: {\n            uri: string;\n            fileSize: 0;\n            thumbnailType: 'Small' | 'Large';\n        }[];\n    \tgameClipUris: {\n            uri: string;\n            fileSize: number;\n            uriType: 'Download';\n            expiration: string;\n        }[];\n        xuid: string;\n        clipName: string;\n        titleName: string;\n        gameClipLocale: string;\n        clipContentAttributes: string;\n        deviceType: string;\n        commentCount: number;\n        likeCount: number;\n        shareCount: number;\n        partialViews: number;\n    }[];\n    pagingInfo: {\n        continuationToken: string | null\n    };\n}\u003e\n```\n\n**getPlayerGameClipsFromMediaHub** - Returns targeted player's clips:\u003cbr\u003e\n\u003csub\u003e**Warning:** Recent games *(since mid-2019)* will not be returned, please use **getPlayerGameClipsFromActivityHistory** instead (if required).\u003c/sub\u003e\n\n```javascript\ngetPlayerGameClipsFromMediaHub(\n    gamertagOrXUID: string;\n    authorization: {\n        userHash: string;\n        XSTSToken: string;\n    };\n    payload: {\n        max?: number; // Default: 100\n        skip?: number; // Default: 0\n        query?: string; // Example: titleId eq 175227487 and contentId eq 773a413e-5a95-48c2-98c4-5c919f67cfee\n        continuationToken?: string;\n    };\n): Promise\u003c{\n    continuationToken?: string;\n    values: {\n        contentId: string;\n        contentLocators: Array\u003c\n            | {\n                    expiration: string;\n                    fileSize: number;\n                    locatorType: 'Download';\n                    uri: string;\n            }\n            | { locatorType: 'Thumbnail_Small'; uri: string }\n            | { locatorType: 'Thumbnail_Large'; uri: string }\n        \u003e;\n        contentSegments: Array\u003c{\n            segmentId: number;\n            creationType: 'UserGenerated' | 'AutoGenerated';\n            creatorChannelId: string | null;\n            creatorXuid: number;\n            recordDate: string;\n            durationInSeconds: number;\n            offset: number;\n            secondaryTitleId: string | null;\n            titleId: number;\n        }\u003e;\n        creationType: 'UserGenerated' | 'AutoGenerated';\n        durationInSeconds: number;\n        frameRate: number;\n        greatestMomentId: string;\n        localId: string;\n        ownerXuid: number;\n        resolutionHeight: number;\n        resolutionWidth: number;\n        sandboxId: 'RETAIL';\n        sharedTo: any[];\n        titleData: string;\n        titleId: number;\n        titleName: string;\n        uploadDate: string;\n        uploadLanguage: string;\n        uploadRegion: string;\n        uploadTitleId: number;\n        uploadDeviceType: string;\n        userCaption: string;\n        commentCount: number;\n        likeCount: number;\n        shareCount: number;\n        viewCount: number;\n        contentState: string;\n        enforcementState: string;\n        safetyThreshold: string;\n        sessions: any[];\n        tournaments: any[];\n    }[];\n}\u003e\n```\n\n**getPlayerGameClipsFromActivityHistory** - Returns targeted player's clips from its activity history:\u003cbr\u003e\n\u003csub\u003e**Warning:** Returned items count may not respect the specified `numItems` parameter.\u003c/sub\u003e\n\n```javascript\ngetPlayerGameClipsFromActivityHistory(\n    gamertagOrXUID: string;\n    authorization: {\n        userHash: string;\n        XSTSToken: string;\n    };\n    qs: {\n        numItems?: number;\n        contToken?: string;\n        pollingToken?: string;\n        startDate?: string;\n    };\n): Promise\u003c{\n    numItems: number;\n    activityItems: {\n        clipId: string;\n        clipThumbnail: string;\n        downloadUri: string;\n        clipName: string;\n        clipCaption: string;\n        clipScid: string;\n        dateRecorded: string;\n        viewCount: number;\n        gameMediaContentLocators: [\n            {\n                Expiration: string;\n                FileSize: number;\n                LocatorType: 'Download';\n                Uri: string;\n            },\n            {\n                Expiration: string;\n                FileSize: number;\n                LocatorType: 'Thumbnail_Small';\n                Uri: string;\n            },\n            {\n                Expiration: string;\n                FileSize: number;\n                LocatorType: 'Thumbnail_Large';\n                Uri: string;\n            }\n        ];\n        contentImageUri: string;\n        contentTitle: string;\n        platform: string;\n        titleId: string;\n        uploadTitleId: string;\n        activity: {\n            dateRecorded: string;\n            numShares: number;\n            numLikes: number;\n            numComments: number;\n            ugcCaption: string | null;\n            authorType: string;\n            clipId: string;\n            clipName: string | null;\n            activityItemType: 'GameDVR';\n            clipScid: string;\n            userXuid: string;\n            clipImage: string | null;\n            clipType: string | null;\n            clipCaption: string | null;\n            savedByUser: boolean;\n            date: string;\n            sharedSourceUser: number;\n            contentType: 'Game';\n            titleId: string;\n            platform: string;\n            sandboxid: string;\n            userKey: string | null;\n            scid: string;\n        };\n        userImageUriMd: string;\n        userImageUriXs: string;\n        description: string;\n        date: string;\n        hasUgc: boolean;\n        activityItemType: 'GameDVR';\n        contentType: 'Game';\n        shortDescription: string;\n        itemText: string;\n        itemImage: string;\n        shareRoot: string;\n        feedItemId: string;\n        itemRoot: string;\n        hasLiked: boolean;\n        authorInfo: {\n            name: string;\n            secondName: string;\n            imageUrl: string;\n            authorType: string;\n            id: string;\n        };\n        gamertag: string;\n        realName: string;\n        displayName: string;\n        userImageUri: string;\n        userXuid: string;\n    }[];\n    pollingToken: string;\n    pollingIntervalSeconds: string | null;\n    contToken: string;\n}\u003e\n```\n\n**getPlayerActivityHistory** - Returns targeted player's activity history:\u003cbr\u003e\n\u003csub\u003e**Warning:** Returned items count may not respect the specified `numItems` parameter.\u003c/sub\u003e\n\n```javascript\ngetPlayerActivityHistory(\n    gamertagOrXUID: string;\n    authorization: {\n        userHash: string;\n        XSTSToken: string;\n    };\n    qs?: {\n        numItems?: number;\n        contToken?: string;\n        pollingToken?: string;\n        activityTypes?: 'GameDVR' | 'Screenshot' | 'Achievement' | 'Played';\n        excludeTypes?: 'GameDVR' | 'Screenshot' | 'Achievement' | 'Played';\n        contentTypes?: 'Game' | 'App';\n        startDate?: string;\n        includeSelf?: boolean;\n    };\n): Promise\u003c{\n    numItems: number;\n    activityItems: any[];\n    pollingToken: string;\n    pollingIntervalSeconds: string | null;\n    contToken: string;\n}\u003e\n```\n\n**call** - Generic method to call the API with a custom configuration:\n```javascript\ncall(\n    config: {\n        url: string;\n        method: GET | PUT | POST | PATCH | DELETE,\n        ... // Please refer to https://github.com/axios/axios#request-config for further information\n    };\n    authorization: {\n        userHash: string;\n        XSTSToken: string;\n    };\n    XBLContractVersion?: number; // Default: 2\n): Promise\u003cany\u003e\n```\n\n### Should I use XUIDs instead of Gamertags?\nSome of exposed methods resolve player's XUID thanks to the specified gamertag which requires an additional request to be made internally (`getPlayerXUID`). If a valid XUID is used instead (during pagination for instance), this may speed up your request.\n\n### Where can I find additional Xbox Live API URIs?\nPlease refer to https://docs.microsoft.com/en-us/windows/uwp/xbox-live/xbox-live-rest/uri/atoc-xboxlivews-reference-uris.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FXboxReplay%2Fxboxlive-api","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FXboxReplay%2Fxboxlive-api","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FXboxReplay%2Fxboxlive-api/lists"}