Quickstart

Get up and running with SignalVault in under 5 minutes.

SignalVault works with any language or framework. Use our SDKs for a drop-in OpenAI wrapper, or call the REST API directly from any HTTP client — no SDK required.

1. Create an account and verify your email

Sign up for free, then open the verification email and click Confirm email address. The link has to be clicked, not merely opened, and expires after 24 hours — if yours has, the page offers to send a new one. You cannot reach the dashboard until the account is verified.

2. Create an app and generate an API key

After verifying, the dashboard prompts you to create your first app. The setup guide on the app page then lets you name a key, pick an environment, and generate it inline — you can also do this later from the app's Settings tab. Copy the key immediately; it is shown once and never again.

Keys are prefixed by environment: sk_live_ for production and sk_test_ for development and staging. Every plan can create keys in all three environments. The environment is taken from the key itself and decides which guardrail rules apply, so it cannot be overridden by a request header or body.

To rotate a key, generate a new one first, update your environment variables, then delete the old key — both stay valid until you delete the old one. An app can hold up to 10 active keys at once.

Call SignalVault from your backend only. The API sends no CORS headers, and a key in browser or mobile code is a key you have published.

3. Send requests

Pick whichever approach fits your stack:

Option A: Proxy (recommended)

The fastest way to get started — no new packages required. Just point your existing OpenAI (or Anthropic) client at SignalVault's proxy by changing the baseURL:

import OpenAI from 'openai';

const client = new OpenAI({
  apiKey: process.env.OPENAI_API_KEY,
  baseURL: 'https://api.signalvault.io/proxy/openai/v1',
  defaultHeaders: {
    'X-SignalVault-Key': 'sk_live_...',
  },
});

const response = await client.chat.completions.create({
  model: 'gpt-4o-mini',
  messages: [{ role: 'user', content: 'Hello!' }],
});
import Anthropic from '@anthropic-ai/sdk';

const client = new Anthropic({
  apiKey: process.env.ANTHROPIC_API_KEY,
  baseURL: 'https://api.signalvault.io/proxy/anthropic',
  defaultHeaders: {
    'X-SignalVault-Key': 'sk_live_...',
  },
});

const message = await client.messages.create({
  model: 'claude-sonnet-5',
  max_tokens: 1024,
  messages: [{ role: 'user', content: 'Hello!' }],
});

Every request is automatically logged, scanned, and governed — your application code stays unchanged. See the Proxy docs for supported providers and advanced options.

Option B: SDK (Node.js / Python)

Our SDKs wrap the OpenAI and Anthropic clients and send audit events for every request. They raise on a blocked prompt, so your application does not have to read the decision itself:

npm install @signalvaultio/node openai
import { SignalVaultClient } from '@signalvaultio/node';

const client = new SignalVaultClient({
  apiKey: 'sk_live_...',
  openaiApiKey: process.env.OPENAI_API_KEY,
  baseUrl: 'https://api.signalvault.io',
});

const response = await client.chat.completions.create({
  model: 'gpt-4o-mini',
  messages: [{ role: 'user', content: 'Hello!' }],
});

See the Node.js SDK or Python SDK docs for full details.

Option C: REST API

Send events directly to POST /v1/events from any language or HTTP client:

REQUEST_ID=$(uuidgen)

# 1. Before calling your provider — returns the guardrail decision.
curl -X POST https://api.signalvault.io/v1/events \
  -H "Authorization: Bearer $SIGNALVAULT_API_KEY" \
  -H "Content-Type: application/json" \
  -d "{
    \"type\": \"ai.request\",
    \"request_id\": \"$REQUEST_ID\",
    \"provider\": \"openai\",
    \"model\": \"gpt-4o-mini\",
    \"payload\": {\"messages\": [{\"role\": \"user\", \"content\": \"Hello!\"}]}
  }"

# {"event_id":"...","decision":"allow","violations":[],"redactions":[]}

# 2. After it responds — records the output, tokens and cost.
curl -X POST https://api.signalvault.io/v1/events \
  -H "Authorization: Bearer $SIGNALVAULT_API_KEY" \
  -H "Content-Type: application/json" \
  -d "{
    \"type\": \"ai.response\",
    \"request_id\": \"$REQUEST_ID\",
    \"payload\": {
      \"output\": \"Hi there!\",
      \"usage\": {\"prompt_tokens\": 10, \"completion_tokens\": 8}
    }
  }"

Works from Go, Rust, Java, Ruby, PHP — anything that can make an HTTP request.

On this path your code enforces the decision. The response to an ai.request carries decision, and a blocked prompt still answers 200 — so check for "block" and stop before calling your provider. Post the event, ignore the body, and you have an audit log with no enforcement behind it. The SDKs and the proxy do this for you; the REST API hands you the decision instead.

See the API Reference for the full field list, every status code, and the two different 429 bodies.

That's it. Open your app in the dashboard and the request appears on the Requests page within a second or two, with its decision, tokens and cost. If you are checking whether a rule fired, read the decision rather than the status code: the events API answers 200 even for a blocked prompt, while the proxy answers 400.

What to expect on your first requests

A new app starts with PII and secret detection set to warn, and an 8 000-token limit set to block. A prompt containing an email address is therefore recorded as a violation and still goes through — that is the default, not a misconfiguration. See Guardrail rules to change it, and Plans & billing for what happens when the trial ends.