Skip to main content

SDK Reference

@kyqu/client v0.2.0

Zero-dependency JavaScript/TypeScript client for the Kyqu auth platform.

Installation

npm install @kyqu/client

Exports

import { KyquClient, KyquError } from "@kyqu/client";

KyquError

class KyquError extends Error {
name: "KyquError";
status: number; // HTTP status code
data: Record<string, any>; // Full response body
}

KyquClient

Constructor

new KyquClient(options: KyquClientOptions)

KyquClientOptions

PropertyTypeRequiredDescription
baseUrlstringYesRoot URL of Kyqu API
projectIdstringYesProject UUID from dashboard
publicKeystringYesPublic key (pk_...) from dashboard

Methods (32 total)

getFields()

Returns custom field definitions for building dynamic signup forms.

Returns: Promise<KyquFieldDef[]>

signup(input)

Registers a new user. Custom field values as top-level keys.

Input: { email: string, password: string, name?: string, [key: string]: any } Returns: Promise<KyquSignupResult>

login(input)

Authenticates a user. Include totpCode or backupCode for 2FA.

Input: { email: string, password: string, totpCode?: string, backupCode?: string } Returns: Promise<KyquLoginResult> Throws: KyquError with message: "TOTP_REQUIRED" (status 403) when 2FA is enabled and no code supplied.

logout(token)

Revokes the given bearer token.

Returns: Promise<{ ok: boolean }>

getUser(token)

Returns the user associated with the session token.

Returns: Promise<KyquUser>

updateMetadata(token, metadata)

Update custom metadata fields for the authenticated user.

Input: token (bearer), metadata key-value object Returns: Promise<{ user: KyquUser }>

requestEmailVerification(email)

Sends verification email.

Returns: Promise<{ ok: boolean }>

confirmEmailVerification(token)

Confirms verification token.

Returns: Promise<{ user: KyquUser }>

requestPasswordReset(email)

Initiates password reset.

Returns: Promise<{ ok: boolean }>

confirmPasswordReset(input)

Confirms reset with token and new password.

Input: { token: string, password: string } Returns: Promise<{ user: KyquUser, session: KyquSession }>

changePassword(token, input)

Changes password for the authenticated user.

Input: token (bearer), { currentPassword: string, newPassword: string } Returns: Promise<{ ok: boolean }> Note: Revokes all other active sessions on success.

deleteAccount(token, input)

Permanently deletes the authenticated user's account. Requires password confirmation for security.

Input: token (bearer), { password: string } Returns: Promise<{ ok: boolean }> Note: Revokes all sessions. Irreversible.

requestMagicLink(email)

Sends magic sign-in link.

Returns: Promise<{ ok: boolean }>

confirmMagicLink(token)

Confirms magic link token via API (POST). Returns session directly.

Returns: Promise<{ user: KyquUser, session: KyquSession }>

exchangeSessionCode(sessionCode)

Exchanges ?session_code=… from a browser magic-link redirect for a bearer session.

Returns: Promise<{ user: KyquUser, session: KyquSession }>

enrollTotp(token)

Starts TOTP enrollment.

Returns: Promise<KyquTotpEnrollResult> (contains enrollmentUrl: string)

confirmTotp(token, code)

Confirms TOTP enrollment with code from authenticator app.

Returns: Promise<KyquTotpConfirmResult> (contains backupCodes: string[])

disableTotp(token, code)

Disables TOTP after verifying one last code.

Returns: Promise<{ ok: boolean }>

listSessions(token)

Lists all active sessions for the user. Each entry indicates whether it's the current session.

Returns: Promise<KyquSessionInfo[]>

revokeSession(token, sessionId)

Revokes a specific session by ID. Useful for "sign out from other devices."

Returns: Promise<{ ok: boolean }>

OAuth / Social Login

getOAuthAuthorizeUrl(provider, redirectUrl = "")

Returns the provider's authorization URL for browser redirect (synchronous, no network call).

Input: provider: "google" | "github", optional redirect URL Returns: string

getOAuthUser(token)

Get user linked to an OAuth identity.

Returns: Promise<{ provider, providerId }>

Passkeys / WebAuthn

getPasskeyRegistrationOptions(token)

Get WebAuthn PublicKeyCredentialCreationOptions for registering a new passkey.

Returns: Promise<CreationOptions>

registerPasskey(token, credential, name = "")

Store a new WebAuthn credential after browser creates it.

Input: credential (from navigator.credentials.create), optional name Returns: Promise<{ passkey }>

getPasskeyAuthenticationOptions(userId = null)

Get WebAuthn assertion options for authenticating with a passkey.

Returns: Promise<AssertionOptions>

authenticateWithPasskey(assertion)

Authenticate with a WebAuthn assertion. Returns session directly.

Input: assertion (from navigator.credentials.get) Returns: Promise<{ user: KyquUser, session: KyquSession }>

listPasskeys(token)

List registered passkey credentials.

Returns: Promise<{ passkeys: KyquPasskeyInfo[] }>

deletePasskey(token, credentialId)

Delete a passkey credential by ID.

Returns: Promise<{ ok: boolean }>

OIDC / ID Token

getIdToken(token)

Issue an RS256-signed OIDC ID token.

Returns: Promise<{ idToken: string }>

getOidcDiscovery()

Fetch the OpenID Connect Discovery document.

Returns: Promise<OidcDiscovery>

getJwks()

Fetch the JSON Web Key Set.

Returns: Promise<{ keys: JsonWebKey[] }>

Event Logs

getLogs(token, filters = {})

Query auth event logs.

Input: filters: { limit?, offset?, event? } Returns: Promise<{ logs: KyquLogEntry[], total: number }>

Auto-Refresh Session

withAutoRefresh(session, options = {})

Wraps a session token with automatic refresh before expiry.

Input: session: { token, expiresAt }, options: { marginSeconds?, onRefresh?, onError?, storage? } Returns: ManagedSession

The ManagedSession class provides:

class ManagedSession {
getToken(): string; // Returns current valid token
getSession(): KyquSession; // Returns current session info
destroy(): void; // Stop refresh timer and clear
}

Usage:

const managed = kyqu.withAutoRefresh(session, {
storage: localStorage, // Persists/restores across page reloads
marginSeconds: 60, // Refresh 60s before expiry
onRefresh: (newSession) => {},// Called when token refreshes
onError: (err) => {} // Called when refresh fails
});

const token = managed.getToken(); // Always fresh

Types

interface KyquUser {
id: string;
projectId: string;
email: string;
name: string;
status: string;
emailVerifiedAt: string | null;
passwordResetRequired: boolean;
totpEnabled: boolean;
lockedUntil: string | null;
metadata: Record<string, any>;
createdAt: string;
}

interface KyquSession {
token: string;
expiresAt: string;
}

interface KyquSignupResult {
user: KyquUser;
session: KyquSession | null; // null when email verification required
verificationRequired: boolean;
verificationQueued: { expiresAt: string } | null;
}

interface KyquLoginResult {
user: KyquUser;
session: KyquSession;
}

interface KyquTotpEnrollResult {
enrollmentUrl: string; // otpauth:// URI
}

interface KyquTotpConfirmResult {
ok: boolean;
backupCodes: string[]; // 8 one-time codes
}

interface KyquFieldDef {
id: string;
name: string;
label: string;
fieldType: "text" | "number" | "boolean" | "date";
required: boolean;
defaultValue: string | null;
sortOrder: number;
}

interface KyquSessionInfo {
id: string;
isCurrent: boolean;
ipAddress: string | null;
userAgent: string | null;
createdAt: string;
expiresAt: string;
}

interface KyquPasskeyInfo {
id: string;
name: string;
createdAt: string;
lastUsedAt: string | null;
}

interface KyquLogEntry {
id: string;
event: string;
ipAddress: string | null;
userAgent: string | null;
metadata: Record<string, any>;
createdAt: string;
}

interface OidcDiscovery {
issuer: string;
authorization_endpoint: string;
token_endpoint: string;
jwks_uri: string;
id_token_signing_alg_values_supported: string[];
subject_types_supported: string[];
claims_supported: string[];
}

interface KyquClientOptions {
baseUrl: string;
projectId: string;
publicKey: string;
}

React Hooks (@kyqu/client/react)

import { KyquProvider, useKyqu, useKyquUser, useKyquSession, useKyquLoading } from "@kyqu/client/react";

KyquProvider

Wraps your app with auth state context. Restores session from storage on mount.

<KyquProvider client={kyquClient}>
<App />
</KyquProvider>

Props:

PropTypeRequiredDescription
clientKyquClientYesInitialized KyquClient instance
storageStorageNoCustom storage (defaults to localStorage)
storageKeystringNoKey for session storage (default "kyqu_session")

useKyqu()

Returns the full auth context.

const { client, session, user, loading, login, signup, logout, applySession } = useKyqu();
ReturnTypeDescription
clientKyquClientThe client instance
sessionKyquSession | nullCurrent session or null
userKyquUser | nullCurrent user or null
loadingbooleanTrue while restoring session on mount
login(input) => PromiseLogs in and stores session
signup(input) => PromiseSigns up and optionally stores session
logout() => PromiseLogs out and clears session
applySession(result) => voidManually apply a login/signup result

useKyquUser()

Shorthand for useKyqu().user.

Returns: KyquUser | null

useKyquSession()

Shorthand for useKyqu().session.

Returns: KyquSession | null

useKyquLoading()

Shorthand for useKyqu().loading.

Returns: boolean

Package Metadata

FieldValue
Name@kyqu/client
Version0.2.0
LicenseMIT
Runtime depsNone
Module formatESM (src/index.js) + CJS (dist/index.cjs)
TypeScriptDeclarations in src/index.d.ts
React entrysrc/react.js (@kyqu/client/react)
Test runnernode:test