CLI tool
samuelthomas2774/nxapi avatar
samuelthomas2774/nxapi

nxapi: the Nintendo Switch app APIs as a library, a CLI and a desktop app

Nintendo Switch Online/Parental Controls app APIs. Show your Nintendo Switch presence in Discord, get friend notifications on desktop, and download and access SplatNet 2, NookLink, SplatNet 3 and Parental Controls data. Mirror of https://gitlab.fancy.org.uk/samuel/nxapi.git.

632 stars52 forksTypeScriptAGPL-3.0

At a glance

What is it?
nxapi reverses the Nintendo Switch Online and Parental Controls app APIs into a TypeScript library with a command line tool and an Electron app, so your Switch presence can sit in Discord, your friends' presence can raise a desktop notification, and your SplatNet and NookLink data can be downloaded rather than scraped from a website.
Who is it for?
nxapi fits a developer who wants the Nintendo Switch app APIs as a typed module rather than a pile of scraped HTML, since the package exports separate entry points for the Nintendo Account, Coral, Moon, SplatNet 2, NookLink and SplatNet 3, and it fits a self-hoster who wants to run the presence proxy for a group rather than depend on someone else's instance.
Can I use it commercially?
Yes, with strict conditions. AGPL-3.0 is a network copyleft licence: if people use a modified version over a network, for example as a hosted service, you must offer them its source code under the same licence.
Is it still maintained?
Yes. The repository last received commits 44 days ago.
What is it written in?
Mainly TypeScript, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on October 22, 2026, and from our analysis. They are not legal advice.

Editorial analysis

Three interfaces over one reverse engineered API

nxapi is a JavaScript library, command line tool and Electron app for accessing the Nintendo Switch Online and Nintendo Switch Parental Controls app APIs. The surfaces exist side by side rather than one at a time, and the feature list leads with the command line and Electron app interfaces. Underneath sits an interactive Nintendo Account login for both the Switch Online app and the Parental Controls app, and an automated login to the Nintendo Switch Online app API that by default uses the nxapi-znca-api service, though a custom server can be used instead. From there the tool gets Nintendo Switch account information, the friends list and game-specific services. The last point in the overview is the one a library user needs to know: the API library and types are exported for use in other software, but the app and commands properly cache access tokens and try to handle requests in a way that appears to be Nintendo's own apps, and if you use nxapi as a library you have to handle that yourself.

Presence in Discord, and what it can and cannot show

The Discord integration shows your Nintendo Switch presence as a rich presence activity, and there are three distinct ways to source that presence. You can fetch it using a secondary account, you can fetch it from a custom URL, and you can show your account's friend code, or a custom friend code. The overview is explicit about one gap: using the authenticated user's own presence is not supported, as that is no longer available from the API, with a link to the issue tracking it. All titles are supported, and since August 2025 all titles can show their full name next to your name in Discord without any extra configuration, and there is additional presence information for Splatoon 3. Friend presence notifications are a separate feature, and the Electron app can show notifications for friend presences with multiple users selected.

The library entry points, one per service

The package manifest makes the shape of the library unusually clear, because each service is its own export path. The root export resolves to the main index, and there are named exports for nintendo-account, coral, moon, splatnet2, nooklink and splatnet3. The two unnamed ones in the list are the interesting ones for anyone reading the code, since coral and moon are the internal names for the Switch Online and Parental Controls applications respectively. The project is written in TypeScript and built to ES modules, with the type of the package set to module and the main entry pointing at the compiled index. The published file list is also deliberate, with dist included but the dist/app and dist/bundle directories excluded, alongside resources/cli, resources/common and bin, which keeps the desktop app out of the library tarball while still shipping the command line.

The Electron app, and the CLI bundled inside it

The Electron app can be downloaded from the releases page and does four things. It logs you in to a Nintendo Account for both the Switch Online app and the Parental Controls app, opening the Nintendo Account login page in the app exactly as signing into Nintendo's own apps does, with the authorisation page able to be opened in a browser by holding Shift while pressing add account, and the accounts shared with the command line interface. It shares presence to Discord, including from a custom presence URL or a friend's presence. It shows notifications for friend presences, with multiple users selectable. And it opens game-specific services in the app itself, which matters for NookLink specifically, since that does not work in web browsers as it requires custom JavaScript APIs. The app includes the nxapi command line at dist/bundle/cli-bundle.js, and on macOS and Linux the paths to it are these.

bash
Nintendo\ Switch\ Online.app/Contents/bin/nxapi

# Linux, installed via dpkg
# This is linked as /usr/bin/nxapi
/opt/Nintendo\ Switch\ Online/bin/nxapi

On Windows, Node.js must be installed separately, and the two shells reach the same bundle differently.

powershell
# PowerShell
node $env:LOCALAPPDATA\Programs\nxapi-app\resources\app\dist\bundle\cli-bundle.js ...

# Command Prompt
node %localappdata%\Programs\nxapi-app\resources\app\dist\bundle\cli-bundle.js ...

The proxy server, and why you might want your own

nxapi includes a Nintendo Switch Online app API proxy server and a presence server, and the reason it exists is stated in the feature list: this allows a single account to fetch presence for multiple users. The data will be cached for a short time to reduce the number of requests to Nintendo's server, and the proxy automatically handles authentication when given a Nintendo Account session token, which makes it much easier to access the API from a browser, in scripts or in other software. The compose file shows the deployment shape. There is a znc-proxy service running the http-server command, and a presence-server service that takes the splatnet3 and splatnet3-fest-votes options. The comments explain the split: the znc-proxy and presence-splatnet3-proxy services exist so that the presence-server service can be scaled without sending additional requests to Nintendo servers, and those proxy services should not be scaled because they handle the requests to Nintendo. A presence server also needs a saved session token per user, and the compose file says to obtain one with a token auth command, and to drop the splatnet3 option for users who do not have access to SplatNet 3.

The data you can pull out, including the boring parts

The download features are what separate this from a presence display. You can download all personal SplatNet 2 and SplatNet 3 data, including battle and Salmon Run results, download island newspapers from and send messages and reactions using NookLink, and download all Nintendo Switch Parental Controls usage records. The Parental Controls records are the part that gets overlooked, and they are the reason the tool needs the Parental Controls app API at all. The Docker image also reveals how the container is put together, with a build stage on node:20 that installs dependencies and compiles the TypeScript with npx tsc, and a runtime stage that installs production dependencies only, copies the built dist across, symlinks the CLI into the local bin directory, sets a data path and a production environment variable, and declares a volume for the data directory.

Membership, bans, and the interval that matters

The overview answers the questions people actually ask. You do not need a Nintendo Switch Online membership, because the only requirement is that your Nintendo Account is linked to a Network Service Account, meaning you have linked it to a Switch console at some point, and it does not matter whether it is still linked to one. You do need an online membership, with a free trial acceptable, for game-specific services, and the split is specific: SplatNet 2 can be used without an active membership, but NookLink and Smash World both require one just to open them. For Parental Controls data you do not need a linked console, but you do need to use Nintendo's own app to add a console, since that is not supported in nxapi and the Parental Controls API is useless without it. On bans, the console question is a flat no. The account question is extremely unlikely, and the reasoning is quantitative: other projects have used the same reverse engineered APIs for a long time with no bans, and the monitoring commands in nxapi update every minute, only slightly more often than the five minute default of splatnet2statink.

The Linux sandbox problem, and the project state

There is a specific failure mode worth knowing before you install, and it has a documented workaround. The Electron app, Discord, or both, may be sandboxed depending on how they are installed. The dpkg and AppImage nxapi packages are not sandboxed, and the official dpkg Discord package and tar release are not sandboxed either. The snap packages of nxapi and Discord are sandboxed and cannot support Discord Rich Presence. The Flatpak Discord package is sandboxed, but it can be used by linking the IPC socket outside of the app directory. So on Linux, your choice of package format determines whether the headline feature works at all. The project is on a 1.6 line, with v1.6.1 from 2023-03-01, v1.6.0 from 2022-12-20 and v1.5.0 from 2022-10-28, and the last push to the repository was on 2026-09-09, so there is recent work on a code base whose last tagged release is from three years earlier. The licence is AGPL-3.0-or-later, and the repository describes itself as a mirror of the GitLab origin.

Editorial conclusion

nxapi fits a developer who wants the Nintendo Switch app APIs as a typed module rather than a pile of scraped HTML, since the package exports separate entry points for the Nintendo Account, Coral, Moon, SplatNet 2, NookLink and SplatNet 3, and it fits a self-hoster who wants to run the presence proxy for a group rather than depend on someone else's instance. It does not fit anyone who needs an officially supported API, because every endpoint here is reverse engineered and the project ships a proxy server rather than a vendor agreement, and it does not fit a Windows user who wants a zero-setup install, since the project states that Node.js must be installed separately on Windows. Before you point this at your account, read the ban questions at the end of the overview, set the interval on your monitoring commands deliberately rather than leaving the default, and decide whether you want the hosted default proxy or your own server, since the default routes your session token through someone else's infrastructure.

Frequently asked questions

What is nxapi and what can it do?

nxapi is a JavaScript library, command line tool and Electron app for the Nintendo Switch Online and Nintendo Switch Parental Controls app APIs. It shows your Switch presence on Discord, raises notifications for friend presences, and downloads personal SplatNet 2, SplatNet 3, NookLink and Parental Controls data.

Do I need a Nintendo Switch Online membership to use nxapi?

No. The only requirement is that your Nintendo Account is linked to a Network Service Account, meaning you have linked it to a console at some point. An active membership is needed for game-specific services, with SplatNet 2 usable without one but NookLink and Smash World requiring one.

Will using nxapi get my account or console banned?

The overview says a console ban will not happen, and an account ban is extremely unlikely, because other projects have used the same reverse engineered APIs for a long time with no bans, and nxapi's monitoring commands update only slightly more often than the five minute default of splatnet2statink.

Why does Discord rich presence not work on Linux?

The Electron app, Discord, or both, may be sandboxed depending on how they are installed. The snap packages of nxapi and Discord are sandboxed and cannot support rich presence, while the dpkg and AppImage nxapi packages are not sandboxed. The Flatpak Discord package can be used by linking the IPC socket outside the app directory.

Official sources

  1. Issues
  2. License: AGPL-3.0
  3. README
  4. Releases
  5. samuelthomas2774/nxapi on GitHub
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/samuelthomas2774-nxapi.svg)](https://hysenlabs.com/projects/samuelthomas2774-nxapi)