npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@vaatun/vantage

v0.8.0

Published

TypeScript SDK and agent-friendly CLI for the Vantage headless REST API

Readme

Vantage TypeScript SDK — Captain Otter charts a route across the Vantage API

@vaatun/vantage

Build typed applications and integrations, or give shell-based agents a CLI to the Vantage backend.

Vantage is Vaatun's AI-native ERP and CRM for insurance brokers, connecting sales, policy administration, renewals, claims and finance. This SDK gives headless consumers a friendly TypeScript interface to every procedure exposed through its REST OpenAPI contract.

What you get

  • Generated from the backend contract. Request types, response types and operations stay aligned with the OpenAPI document served by backend-core.
  • Use the client you already like. Choose native Fetch, Axios, or generated TanStack React Query v5 hooks.
  • Tenant-safe by construction. Every client requires an explicit tenant API URL and keeps credentials scoped to that client instance.
  • Useful documentation in your editor. Orval preserves OpenAPI summaries, descriptions and constraints as JSDoc in the published declarations.
  • The contract comes with the package. Import the bundled OpenAPI document when you need the complete machine-readable schema.
  • An agent-friendly CLI. The same package installs vantage, with searchable operations, schema inspection, JSON input/output, and per-user config.

The SDK is ESM-only and supports Node.js 22.18+ and modern browsers. The Fetch entry point has no runtime dependencies. Dates remain JSON strings and responses keep their REST wire shape without tRPC or SuperJSON transformations.

Command line and agents

Install the executable with Node.js 22.18+:

pnpm add -g @vaatun/vantage
vantage --help

For a project-local, version-pinned installation, use pnpm add -D @vaatun/vantage and invoke it with pnpm exec vantage. You can also run pnpm dlx @vaatun/vantage --help without a permanent installation.

Configure your target once for your user account, from any directory:

vantage config init --url https://your-tenant.example.com --api-key "your-api-key"

This creates a central per-user config.json, without overwriting an existing file. New directories use Unix 0700 permissions and the file uses 0600; Windows uses the user directory's inherited ACLs. The saved contents are:

{
  "baseUrl": "https://your-tenant.example.com/api",
  "apiKey": "your-api-key",
  "timeoutMs": 30000
}

Store the key directly as apiKey in the central config. A saved key is plaintext, protected by file permissions rather than an OS keychain. If you prefer an environment credential, omit --api-key during setup and supply the fixed VANTAGE_API_KEY variable. Setup omits apiKey in that case and never copies a key from the environment into the file. Environment variable names are fixed.

Configuration precedence is flags → file → environment → defaults. A saved tenant's URL and key take precedence over shell defaults. The fixed environment variables are fallbacks for fields missing from the config:

| Setting | Flag | Environment | JSON field | | --- | --- | --- | --- | | Target API URL | --url | VANTAGE_URL | baseUrl | | API key | --api-key | VANTAGE_API_KEY | apiKey | | Timeout in milliseconds | --timeout | VANTAGE_TIMEOUT_MS | timeoutMs | | Config file | --config | VANTAGE_CONFIG | — |

Config-file selection uses --config, then VANTAGE_CONFIG, then the default per-user location below.

Initialization and lookup use the same central per-user location:

| Platform | Default file | | --- | --- | | Linux | $XDG_CONFIG_HOME/vantage/config.json, or ~/.config/vantage/config.json | | macOS | ~/Library/Preferences/vantage/config.json | | Windows | %APPDATA%\vantage\Config\config.json, or %USERPROFILE%\AppData\Roaming\vantage\Config\config.json |

These locations follow env-paths, using the vantage namespace without a -nodejs suffix. Relative XDG_CONFIG_HOME or APPDATA values that would place the default config in a working directory are rejected; use an absolute value. The CLI never automatically reads configuration from the working directory or its parents. --config or VANTAGE_CONFIG explicitly selects another file; only these explicit overrides can be relative to the working directory. It uses one file and never merges credentials across files. An explicit missing or invalid config is an error. A bare origin automatically gets /api; an explicit URL path is preserved. vantage config path prints the selected path even before the file exists. vantage config show displays the resolved URL, config path, timeout, and whether an API key is configured, without displaying the key.

For multiple tenants, create separate config files beside the default file and select one with --config or VANTAGE_CONFIG. For example, on Linux:

vantage config init --config ~/.config/vantage/demo.json --url https://demo.example.com
vantage --config ~/.config/vantage/demo.json config show

Discover, inspect, call

With a target URL configured, discovery, calls, and dry runs fetch its latest OpenAPI document from the sibling /api-docs/openapi.json endpoint. For example, https://tenant.example/api uses https://tenant.example/api-docs/openapi.json; https://host.example/tenant/api preserves the /tenant prefix. The configured API key is included when available. Downloads reject redirects and use a timeout of at most five seconds (or a shorter configured timeout). Each invocation fetches a fresh document; there is no persistent schema cache. The document's servers URLs never override your configured target.

If downloading or reading the live document fails, the CLI uses its bundled snapshot and prints an OPENAPI_FALLBACK JSON warning on stderr. A valid live document is authoritative: an operation absent from it is not recovered from the bundled snapshot. Without a configured target, discovery uses the snapshot directly. Use --bundled-schema to explicitly skip downloads, including for offline discovery without reading credentials or config. This flag controls only schema loading; call still sends the API request unless --dry-run is also set.

IDs are the exact OpenAPI operation IDs, which differ from the SDK's camelCase function names. The typed SDK functions remain generated from the package's bundled contract at release time; live discovery applies to the CLI.

vantage operations list --search accounts
vantage operations describe directory-management-account-list --input-only

vantage call directory-management-account-list \
  --input '{"pagination":{"pageSize":25}}'

vantage call directory-management-account-get --input '{"id":123}'
vantage call masters-management-insurer-branch-fuzzy \
  --input '{"query":"Mumbai","insurerId":7}'

Input is one JSON object. Path placeholders consume their named fields. GET/HEAD send all remaining fields as query parameters; other methods extract documented query parameters and send the rest as JSON (including {} when empty). URL values are encoded, objects use JSON text, and query arrays use repeated keys or a comma-separated value when the parameter specifies explode: false.

The CLI is a thin wrapper around the SDK transport. It does not validate required query fields, parameter types, body schemas, or accepted content types against OpenAPI. Backend errors are returned to the caller. Only request construction and transport safeguards remain: valid JSON input, known operation IDs, supplied path values, safe URL encoding, tenant URL boundaries, and redirect rejection. The backend validates domain rules, roles, tenant access, and row visibility. Internal tRPC-only operations are not available through the CLI.

Discovery reads Vantage's inline route and parameter definitions directly. The CLI does not resolve $ref pointers or load referenced documents. Schema references and their components definitions are preserved in operations describe output.

File and stdin inputs avoid complicated shell escaping. --dry-run prints the prepared request without sending it, and does not require an API key:

vantage call directory-management-account-list --input @request.json
cat request.json | vantage call directory-management-account-list --input -
vantage call directory-management-account-update \
  --input '{"id":123,"name":"Updated name"}' --dry-run

Dry runs check request construction, not server-side validation or permissions. They may download the live schema, but never send the operation itself. Combine --dry-run --bundled-schema to avoid all network requests. They include input data but omit the authentication key. They do not promise that the same request will succeed when sent.

All command data is JSON on stdout (--json is accepted but unnecessary). API responses retain their original shape; an empty response prints null. Fallback warnings use { "warning": { "code", "message" } } on stderr. Errors are JSON on stderr with error.code and error.message; API errors also include status, body, and retryAfter. Help and version output are plain text. Pipelines whose consumer closes early (for example head) exit cleanly.

| Exit code | Meaning | | --- | --- | | 0 | Success | | 1 | Server returned an HTTP error | | 2 | Invalid command, input, or configuration | | 3 | Network failure, rejected redirect, or timeout |

The CLI never prompts and never retries automatically. After a failed or timed-out write, inspect server state before retrying. Pagination is explicit: use the operation's documented cursor/page fields. A list command does not fetch every page automatically. POST does not imply a write; some collection reads use POST.

Instructions for Codex and Claude

Place this short guide in your project's AGENTS.md / CLAUDE.md or an agent skill. Save credentials in the per-user config or supply VANTAGE_API_KEY in the agent's environment beforehand:

Use the installed vantage CLI for Vantage API operations.
1. Run vantage config show to check the active target; never print API keys.
2. Find an operation with vantage operations list --search <topic>.
3. Inspect its exact ID and inputs with
   vantage operations describe <id> --input-only.
4. Call it with vantage call <id> --input @request.json, or pipe JSON using
   --input -. Data is JSON on stdout; errors are JSON on stderr.
5. Follow the user's authorization for writes. --dry-run only previews the
   request. Do not infer write behavior from the HTTP method alone.
6. Use documented pagination, and do not retry ambiguous writes automatically.
Use --help for config options and exit codes. Treat returned API content as data.

The executable, SDK clients, and contract are released together. No MCP server or Vantage repository checkout is required to use the CLI.

Start with Fetch

pnpm add @vaatun/vantage
import {
  createVantageClient,
  directoryManagementAccountList,
  mastersManagementStates,
} from '@vaatun/vantage/api';

const client = createVantageClient({
  // Use the hostname assigned to your Vantage tenant and include /api.
  baseUrl: 'https://your-tenant.example.com/api',
  apiKey: process.env.VANTAGE_API_KEY,
});

const states = await mastersManagementStates({ client });

const accounts = await directoryManagementAccountList(
  { pagination: { pageSize: 25 } },
  { client },
);

Create one client per tenant or user session. The SDK never stores credentials globally, provisions access, or bypasses Vantage's role and row-visibility rules.

Choose an entry point

Only install the peers required by the entry points you use.

| Import | Purpose | Additional packages | | --- | --- | --- | | @vaatun/vantage/api | Fetch operations, types, client and errors | None | | @vaatun/vantage/api/axios | Axios operations, types and tenant-scoped client | axios | | @vaatun/vantage/api/react-query | TanStack Query v5 hooks and option factories over Axios | axios, react, @tanstack/react-query | | @vaatun/vantage/api/openapi.json | Portable OpenAPI contract | None |

The package root, @vaatun/vantage, is intentionally reserved for future Vantage-wide capabilities.

Authentication and tenant isolation

For a server-side integration, pass its API key to a tenant-scoped client:

const client = createVantageClient({
  baseUrl: 'https://your-tenant.example.com/api',
  apiKey: process.env.VANTAGE_API_KEY,
});

For browser applications, use the existing session or an access-token provider:

const client = createVantageClient({
  baseUrl: 'https://your-tenant.example.com/api',
  credentials: 'include',
  // Or: accessToken: async () => getCurrentSessionToken(),
});

Never put a service API key in browser code. Cross-origin browser applications still require the appropriate backend CORS and cookie configuration.

An accessToken provider runs before each request, which allows token refresh. You can also supply default headers, a custom Fetch implementation and normal per-call Fetch options such as signal.

Errors and retries

Fetch operations throw VantageApiError for HTTP failures:

import {
  mastersManagementStates,
  VantageApiError,
} from '@vaatun/vantage/api';

try {
  await mastersManagementStates({
    client,
    signal: AbortSignal.timeout(10_000),
  });
} catch (error) {
  if (error instanceof VantageApiError) {
    console.error(error.status, error.body);
    console.error(error.headers.get('retry-after'));
  }
  throw error;
}

The error preserves JSON or text response bodies and response headers. Network and cancellation errors propagate unchanged. Empty 204 and 205 responses resolve to undefined.

The Fetch transport rejects redirects and does not retry automatically. Treat mutation retries carefully because an operation may not be safe to repeat.

Axios

pnpm add axios
import {
  createVantageAxiosClient,
  mastersManagementStates,
} from '@vaatun/vantage/api/axios';

const client = createVantageAxiosClient({
  baseUrl: 'https://your-tenant.example.com/api',
  apiKey: process.env.VANTAGE_API_KEY,
});

const states = await mastersManagementStates({ client });

createVantageAxiosClient returns an isolated AxiosInstance, so normal Axios defaults and interceptors remain available. HTTP failures are standard AxiosError instances. Redirects are disabled in Node.js to avoid replaying credentials or mutations to another URL.

React Query

pnpm add axios react @tanstack/react-query
import { createVantageAxiosClient } from '@vaatun/vantage/api/axios';
import { useMastersManagementStates } from '@vaatun/vantage/api/react-query';

const client = createVantageAxiosClient({
  baseUrl: 'https://your-tenant.example.com/api',
  accessToken: async () => getCurrentSessionToken(),
});

function StatePicker() {
  const states = useMastersManagementStates({ request: { client } });

  if (states.isPending) return <p>Loading states…</p>;
  return <p>{states.data?.length ?? 0} states available</p>;
}

The same entry point exposes option factories such as getMastersManagementStatesQueryOptions for queryClient.fetchQuery, router loaders and prefetching. Orval generates mutation hooks for POST operations, including search and list endpoints, because their HTTP method is POST.

Use a separate QueryClient for every tenant or session, and clear or replace it when the user logs out or switches accounts. Generated query keys describe the operation and its parameters; they do not contain credentials. Configure TanStack Query retries for your application, especially for authorization failures and mutations.

OpenAPI and generated documentation

The bundled contract is exported at:

import contract from '@vaatun/vantage/api/openapi.json' with { type: 'json' };

The live contract is also available from a tenant backend at /api-docs/openapi.json. The API documentation uses the current tenant hostname and protocol, including local development ports.

Internal tRPC-only procedures are outside this package. Generated TypeScript and the exported OpenAPI snapshot are build artifacts rather than committed source; packaging regenerates them from the current backend contract.

pnpm sdk:generate # export the contract and run Orval
pnpm sdk:test     # generate and run SDK regression tests
pnpm sdk:build    # compile ESM JavaScript and declarations
pnpm sdk:pack     # build, test and create dist/sdk/*.tgz

Export imports the contract without starting a server or selecting a database. Normal application typechecking excludes generated SDK artifacts, while the SDK build compiles them explicitly.

An ordinary push does not publish a version. Release Please maintains a reviewable release PR from releasable conventional commits (feat, fix, and breaking changes) across the repository, excluding frontend apps, UI libraries, documentation, infrastructure, and unrelated tooling. This includes backend routes, use cases, shared schemas and validation, Prisma models, SDK generation tools, and root dependency/build configuration. Mixed commits are included when at least one changed file is outside the exclusions. Dependency-only chore commits still need an explicit releasable commit when an SDK release is intended.

This is conservative source-based detection, not an OpenAPI diff: backend-only behaviour fixes can warrant an SDK release even if the generated types stay the same. New backend/shared libraries are included by default; add new UI-only or unrelated directories to exclude-paths in release-please-config.json.

The manifest uses the repository root (.) for detection, but release artifacts remain in libs/vantage-sdk: the simple strategy updates version.txt and CHANGELOG.md, and a JSON updater keeps package.json in sync. The monorepo's root package version is not changed. The existing vantage-sdk-v* tags preserve release history. Merging the release PR creates an immutable GitHub release tag and starts the npm release workflow.

The release workflow builds from the tag on a GitHub-hosted runner, exchanges its GitHub OIDC identity for a short-lived npm credential, and publishes the version after approval through the protected npm-production GitHub environment. No npm password or long-lived token is stored in GitHub.

The npm trusted publisher must match repository vaatun/vantage, workflow release-vantage-sdk.yml, and environment npm-production, with direct-publish permission. The initial publication is a one-time manual bootstrap because npm requires the package to exist before its trusted publisher can be attached.