nemi / developers / v1
Sign in with
Nemi.
OAuth 2.1 and OpenID Connect for the account people already use for their files, photos and documents. Then one REST API for exactly the parts they agree to.
Your app to Nemi
Your app sends the person to Nemi
GET https://nemilab.com/oauth/authorize ?client_id=nemi_app_8Fq2... &redirect_uri=https://acme.app/callback &scope=openid profile docs.read &state=k9Xw... &nonce=Q2ra... &code_challenge=E9Mel... (S256)
02One API, every app in the account.
Base nemilab.com/api/v1, a bearer token, JSON in and out. Each path answers only for the scopes the person granted, inside their own role.
api reference03Secure by default, not by configuration.
The careful choices are made on the server, so an app cannot get them wrong. Every token is checked again on every call: a suspended app stops on the next request.
security notes04Every platform, the same few lines.
Official SDKs do PKCE, token storage and refresh. Or skip them: it is standard OAuth and OpenID Connect, and any library that speaks it works.
import { NemiAuth } from "@guuslab/nemi";
import { NemiProvider, SignInWithNemiButton, useNemi } from "@guuslab/nemi/react";
const auth = new NemiAuth({ clientId: "nemi_app_..." });
export function App() {
return (
<NemiProvider auth={auth} scopes={["openid", "profile", "gallery.read"]}>
<Home />
</NemiProvider>
);
}
function Home() {
const { user, client } = useNemi();
if (!user) return <SignInWithNemiButton />;
return <p>Hi {user.name}</p>;
}05Packages.
Building with an AI agent? The docs download as Markdown with an AGENTS.md and llms.txt, ready for Claude Code, Cursor or Codex.
open the docs