PropelAuth

Lightweight, dependency-free, in-memory fake of the PropelAuth Backend API over HTTP/JSON. Exercise backend user/org management with zero cost and zero side effects.

Default port: 4825

Quick start

import { PropelauthServer } from "./services/propelauth/src/server.js";

const server = new PropelauthServer(4825);
await server.start();
// ... run your app/tests ...
await server.stop();

Point the @propelauth/node SDK at it via PROPELAUTH_AUTH_URL=http://127.0.0.1:4825 and PROPELAUTH_API_KEY=parlel. All backend routes use Authorization: Bearer <api-key>:

const res = await fetch("http://127.0.0.1:4825/api/backend/v1/user/", {
  method: "POST",
  headers: { Authorization: "Bearer parlel", "Content-Type": "application/json" },
  body: JSON.stringify({ email: "pa@parlel.dev", first_name: "Pro", last_name: "Pel" }),
});
const { user_id } = await res.json();

Implemented operations

All /api/backend/v1 routes require Authorization: Bearer <api-key>. State is in-memory and ephemeral; ids are deterministic UUIDs.

Users

Orgs

Service & control endpoints (parlel extensions)

Access via MCP / preview URL

PropelAuth is an HTTP service, so in a sandbox it is exposed at its own Daytona preview URL (not via MCP parlel_execute). Use the preview URL from the Connect panel with the preview token header, and set PROPELAUTH_AUTH_URL to that host.

Surface coverage

This emulator faithfully replicates the API surface most application code and agents exercise. Anything below the supported lines is either an intentional design choice for a fast, zero-cost local emulator (✓ By design) or a candidate for a future release (⟳ Roadmap) — never a silent inaccuracy.

Legend: ✅ fully supported · ◐ accepted (stored, not strictly enforced) · ✓ by design · ⟳ on the roadmap.

FeatureStatus
Users create / get (by id & email & username) / query / update / delete✅ Supported
User email update / password update / clear password✅ Supported
User disable / enable / disable 2FA / logout all sessions✅ Supported
Batch fetch users by IDs / emails✅ Supported
Orgs create / get / query / update / delete✅ Supported
Org membership: add user / remove user / change role✅ Supported
Org SAML allow/disallow✅ Supported
Users in org (paginated)✅ Supported
Deterministic UUIDs✅ Supported
Correct error envelopes (400 field-arrays, 401 plain text, 404 null)✅ Supported
Frontend JWT / access-token validation, JWKS✓ By design — Any non-empty credential is accepted — no real secrets needed
Org memberships / roles / RBAC enforcement◐ Stored, not enforced
Magic links / invitations / email delivery✓ By design — Accepted, never delivered
API key validity enforcement✓ By design — Intentional for a local, zero-cost test emulator
End-user API keys (create / validate / delete)⟳ Roadmap
SAML / OIDC SSO connections⟳ Roadmap
Migrate user from external source⟳ Roadmap
Pending org invites⟳ Roadmap
<!-- parlel:testenv:start -->

Configuration — test.env

Copy these into your test.env (used by the bridge sidecar flow). Tokens are Parlel's seeded test credentials — any non-empty value is accepted by the emulator, so you rarely need to change them. Swap in real credentials only when pointing at the live service in prod.env.

PROPELAUTH_AUTH_URL=http://parlel-bridge:4825
PROPELAUTH_API_KEY=parlel
<!-- parlel:testenv:end -->